/*
 * 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 "mirror/object.h"
#endif

ASM_DEFINE(MIRROR_OBJECT_CLASS_OFFSET,
           art::mirror::Object::ClassOffset().Int32Value())
ASM_DEFINE(MIRROR_OBJECT_HEADER_SIZE,
           sizeof(art::mirror::Object))
ASM_DEFINE(MIRROR_OBJECT_LOCK_WORD_OFFSET,
           art::mirror::Object::MonitorOffset().Int32Value())
ASM_DEFINE(GRAY_BYTE_OFFSET,
           art::mirror::Object::MonitorOffset().Int32Value() +
               art::LockWord::kReadBarrierStateShift / art::kBitsPerByte)
ASM_DEFINE(GRAY_BIT_POSITION,
           art::LockWord::kReadBarrierStateShift % art::kBitsPerByte)
ASM_DEFINE(READ_BARRIER_TEST_VALUE,
           static_cast<int8_t>(1 << (art::LockWord::kReadBarrierStateShift % art::kBitsPerByte)))
