/*
 * Copyright (C) 2015 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.
 */

#ifndef ART_COMPILER_OPTIMIZING_INTRINSICS_LIST_H_
#define ART_COMPILER_OPTIMIZING_INTRINSICS_LIST_H_

// All intrinsics supported by the optimizing compiler. Format is name, then whether it is expected
// to be a HInvokeStaticOrDirect node (compared to HInvokeVirtual).

#define INTRINSICS_LIST(V) \
  V(DoubleDoubleToRawLongBits, kStatic) \
  V(DoubleLongBitsToDouble, kStatic) \
  V(FloatFloatToRawIntBits, kStatic) \
  V(FloatIntBitsToFloat, kStatic) \
  V(IntegerReverse, kStatic) \
  V(IntegerReverseBytes, kStatic) \
  V(LongReverse, kStatic) \
  V(LongReverseBytes, kStatic) \
  V(ShortReverseBytes, kStatic) \
  V(MathAbsDouble, kStatic) \
  V(MathAbsFloat, kStatic) \
  V(MathAbsLong, kStatic) \
  V(MathAbsInt, kStatic) \
  V(MathMinDoubleDouble, kStatic) \
  V(MathMinFloatFloat, kStatic) \
  V(MathMinLongLong, kStatic) \
  V(MathMinIntInt, kStatic) \
  V(MathMaxDoubleDouble, kStatic) \
  V(MathMaxFloatFloat, kStatic) \
  V(MathMaxLongLong, kStatic) \
  V(MathMaxIntInt, kStatic) \
  V(MathSqrt, kStatic) \
  V(MathCeil, kStatic) \
  V(MathFloor, kStatic) \
  V(MathRint, kStatic) \
  V(MathRoundDouble, kStatic) \
  V(MathRoundFloat, kStatic) \
  V(SystemArrayCopyChar, kStatic) \
  V(ThreadCurrentThread, kStatic) \
  V(MemoryPeekByte, kStatic) \
  V(MemoryPeekIntNative, kStatic) \
  V(MemoryPeekLongNative, kStatic) \
  V(MemoryPeekShortNative, kStatic) \
  V(MemoryPokeByte, kStatic) \
  V(MemoryPokeIntNative, kStatic) \
  V(MemoryPokeLongNative, kStatic) \
  V(MemoryPokeShortNative, kStatic) \
  V(StringCharAt, kDirect) \
  V(StringCompareTo, kDirect) \
  V(StringIsEmpty, kDirect) \
  V(StringIndexOf, kDirect) \
  V(StringIndexOfAfter, kDirect) \
  V(StringLength, kDirect) \
  V(UnsafeCASInt, kDirect) \
  V(UnsafeCASLong, kDirect) \
  V(UnsafeCASObject, kDirect) \
  V(UnsafeGet, kDirect) \
  V(UnsafeGetVolatile, kDirect) \
  V(UnsafeGetObject, kDirect) \
  V(UnsafeGetObjectVolatile, kDirect) \
  V(UnsafeGetLong, kDirect) \
  V(UnsafeGetLongVolatile, kDirect) \
  V(UnsafePut, kDirect) \
  V(UnsafePutOrdered, kDirect) \
  V(UnsafePutVolatile, kDirect) \
  V(UnsafePutObject, kDirect) \
  V(UnsafePutObjectOrdered, kDirect) \
  V(UnsafePutObjectVolatile, kDirect) \
  V(UnsafePutLong, kDirect) \
  V(UnsafePutLongOrdered, kDirect) \
  V(UnsafePutLongVolatile, kDirect) \
  V(ReferenceGetReferent, kDirect)

#endif  // ART_COMPILER_OPTIMIZING_INTRINSICS_LIST_H_
#undef ART_COMPILER_OPTIMIZING_INTRINSICS_LIST_H_   // #define is only for lint.
