/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#if ASM_DEFINE_INCLUDE_DEPENDENCIES
#include "lock_word.h"
#endif

ASM_DEFINE(LOCK_WORD_GC_STATE_MASK_SHIFTED,
           art::LockWord::kGCStateMaskShifted)
ASM_DEFINE(LOCK_WORD_GC_STATE_MASK_SHIFTED_TOGGLED,
           art::LockWord::kGCStateMaskShiftedToggled)
ASM_DEFINE(LOCK_WORD_GC_STATE_SHIFT,
           art::LockWord::kGCStateShift)
ASM_DEFINE(LOCK_WORD_GC_STATE_SIZE,
           art::LockWord::kGCStateSize)
ASM_DEFINE(LOCK_WORD_MARK_BIT_MASK_SHIFTED,
           art::LockWord::kMarkBitStateMaskShifted)
ASM_DEFINE(LOCK_WORD_MARK_BIT_SHIFT,
           art::LockWord::kMarkBitStateShift)
ASM_DEFINE(LOCK_WORD_READ_BARRIER_STATE_MASK,
           art::LockWord::kReadBarrierStateMaskShifted)
ASM_DEFINE(LOCK_WORD_READ_BARRIER_STATE_MASK_TOGGLED,
           art::LockWord::kReadBarrierStateMaskShiftedToggled)
ASM_DEFINE(LOCK_WORD_READ_BARRIER_STATE_SHIFT,
           art::LockWord::kReadBarrierStateShift)
ASM_DEFINE(LOCK_WORD_STATE_FORWARDING_ADDRESS,
           art::LockWord::kStateForwardingAddress)
ASM_DEFINE(LOCK_WORD_STATE_FORWARDING_ADDRESS_OVERFLOW,
           art::LockWord::kStateForwardingAddressOverflow)
ASM_DEFINE(LOCK_WORD_STATE_FORWARDING_ADDRESS_SHIFT,
           art::LockWord::kForwardingAddressShift)
ASM_DEFINE(LOCK_WORD_STATE_MASK_SHIFTED,
           art::LockWord::kStateMaskShifted)
ASM_DEFINE(LOCK_WORD_STATE_SHIFT,
           art::LockWord::kStateShift)
ASM_DEFINE(LOCK_WORD_THIN_LOCK_COUNT_MASK_SHIFTED,
           art::LockWord::kThinLockCountMaskShifted)
ASM_DEFINE(LOCK_WORD_THIN_LOCK_COUNT_ONE,
           art::LockWord::kThinLockCountOne)
ASM_DEFINE(LOCK_WORD_THIN_LOCK_COUNT_SHIFT,
           art::LockWord::kThinLockCountShift)
ASM_DEFINE(LOCK_WORD_THIN_LOCK_COUNT_SIZE,
           art::LockWord::kThinLockCountSize)
ASM_DEFINE(LOCK_WORD_THIN_LOCK_OWNER_MASK_SHIFTED,
           art::LockWord::kThinLockOwnerMaskShifted)
