/*
 * Copyright (C) 2014 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_RUNTIME_ENTRYPOINTS_QUICK_QUICK_ENTRYPOINTS_LIST_H_
#define ART_RUNTIME_ENTRYPOINTS_QUICK_QUICK_ENTRYPOINTS_LIST_H_

// All quick entrypoints. Format is name, return type, argument types.

#define QUICK_ENTRYPOINT_LIST(V) \
  V(AllocArray, void*, uint32_t, int32_t, mirror::ArtMethod*) \
  V(AllocArrayResolved, void*, mirror::Class*, int32_t, mirror::ArtMethod*) \
  V(AllocArrayWithAccessCheck, void*, uint32_t, int32_t, mirror::ArtMethod*) \
  V(AllocObject, void*, uint32_t, mirror::ArtMethod*) \
  V(AllocObjectResolved, void*, mirror::Class*, mirror::ArtMethod*) \
  V(AllocObjectInitialized, void*, mirror::Class*, mirror::ArtMethod*) \
  V(AllocObjectWithAccessCheck, void*, uint32_t, mirror::ArtMethod*) \
  V(CheckAndAllocArray, void*, uint32_t, int32_t, mirror::ArtMethod*) \
  V(CheckAndAllocArrayWithAccessCheck, void*, uint32_t, int32_t, mirror::ArtMethod*) \
  V(AllocStringFromBytes, void*, void*, int32_t, int32_t, int32_t) \
  V(AllocStringFromChars, void*, int32_t, int32_t, void*) \
  V(AllocStringFromString, void*, void*) \
\
  V(InstanceofNonTrivial, uint32_t, const mirror::Class*, const mirror::Class*) \
  V(CheckCast, void, const mirror::Class*, const mirror::Class*) \
\
  V(InitializeStaticStorage, void*, uint32_t) \
  V(InitializeTypeAndVerifyAccess, void*, uint32_t) \
  V(InitializeType, void*, uint32_t) \
  V(ResolveString, void*, uint32_t) \
\
  V(Set8Instance, int, uint32_t, void*, int8_t) \
  V(Set8Static, int, uint32_t, int8_t) \
  V(Set16Instance, int, uint32_t, void*, int16_t) \
  V(Set16Static, int, uint32_t, int16_t) \
  V(Set32Instance, int, uint32_t, void*, int32_t) \
  V(Set32Static, int, uint32_t, int32_t) \
  V(Set64Instance, int, uint32_t, void*, int64_t) \
  V(Set64Static, int, uint32_t, int64_t) \
  V(SetObjInstance, int, uint32_t, void*, void*) \
  V(SetObjStatic, int, uint32_t, void*) \
  V(GetByteInstance, int8_t, uint32_t, void*) \
  V(GetBooleanInstance, uint8_t, uint32_t, void*) \
  V(GetByteStatic, int8_t, uint32_t) \
  V(GetBooleanStatic, uint8_t, uint32_t) \
  V(GetShortInstance, int16_t, uint32_t, void*) \
  V(GetCharInstance, uint16_t, uint32_t, void*) \
  V(GetShortStatic, int16_t, uint32_t) \
  V(GetCharStatic, uint16_t, uint32_t) \
  V(Get32Instance, int32_t, uint32_t, void*) \
  V(Get32Static, int32_t, uint32_t) \
  V(Get64Instance, int64_t, uint32_t, void*) \
  V(Get64Static, int64_t, uint32_t) \
  V(GetObjInstance, void*, uint32_t, void*) \
  V(GetObjStatic, void*, uint32_t) \
\
  V(AputObjectWithNullAndBoundCheck, void, mirror::Array*, int32_t, mirror::Object*) \
  V(AputObjectWithBoundCheck, void, mirror::Array*, int32_t, mirror::Object*) \
  V(AputObject, void, mirror::Array*, int32_t, mirror::Object*) \
  V(HandleFillArrayData, void, void*, void*) \
\
  V(JniMethodStart, uint32_t, Thread*) \
  V(JniMethodStartSynchronized, uint32_t, jobject, Thread*) \
  V(JniMethodEnd, void, uint32_t, Thread*) \
  V(JniMethodEndSynchronized, void, uint32_t, jobject, Thread*) \
  V(JniMethodEndWithReference, mirror::Object*, jobject, uint32_t, Thread*) \
  V(JniMethodEndWithReferenceSynchronized, mirror::Object*, jobject, uint32_t, jobject, Thread*) \
  V(QuickGenericJniTrampoline, void, mirror::ArtMethod*) \
\
  V(LockObject, void, mirror::Object*) \
  V(UnlockObject, void, mirror::Object*) \
\
  V(CmpgDouble, int32_t, double, double) \
  V(CmpgFloat, int32_t, float, float) \
  V(CmplDouble, int32_t, double, double) \
  V(CmplFloat, int32_t, float, float) \
  V(Fmod, double, double, double) \
  V(L2d, double, int64_t) \
  V(Fmodf, float, float, float) \
  V(L2f, float, int64_t) \
  V(D2iz, int32_t, double) \
  V(F2iz, int32_t, float) \
  V(Idivmod, int32_t, int32_t, int32_t) \
  V(D2l, int64_t, double) \
  V(F2l, int64_t, float) \
  V(Ldiv, int64_t, int64_t, int64_t) \
  V(Lmod, int64_t, int64_t, int64_t) \
  V(Lmul, int64_t, int64_t, int64_t) \
  V(ShlLong, uint64_t, uint64_t, uint32_t) \
  V(ShrLong, uint64_t, uint64_t, uint32_t) \
  V(UshrLong, uint64_t, uint64_t, uint32_t) \
\
  V(IndexOf, int32_t, void*, uint32_t, uint32_t, uint32_t) \
  V(StringCompareTo, int32_t, void*, void*) \
  V(Memcpy, void*, void*, const void*, size_t) \
\
  V(QuickImtConflictTrampoline, void, mirror::ArtMethod*) \
  V(QuickResolutionTrampoline, void, mirror::ArtMethod*) \
  V(QuickToInterpreterBridge, void, mirror::ArtMethod*) \
  V(InvokeDirectTrampolineWithAccessCheck, void, uint32_t, void*) \
  V(InvokeInterfaceTrampolineWithAccessCheck, void, uint32_t, void*) \
  V(InvokeStaticTrampolineWithAccessCheck, void, uint32_t, void*) \
  V(InvokeSuperTrampolineWithAccessCheck, void, uint32_t, void*) \
  V(InvokeVirtualTrampolineWithAccessCheck, void, uint32_t, void*) \
\
  V(TestSuspend, void, void) \
\
  V(DeliverException, void, mirror::Object*) \
  V(ThrowArrayBounds, void, int32_t, int32_t) \
  V(ThrowDivZero, void, void) \
  V(ThrowNoSuchMethod, void, int32_t) \
  V(ThrowNullPointer, void, void) \
  V(ThrowStackOverflow, void, void*) \
  V(Deoptimize, void, void) \
\
  V(A64Load, int64_t, volatile const int64_t *) \
  V(A64Store, void, volatile int64_t *, int64_t) \
\
  V(NewEmptyString, void) \
  V(NewStringFromBytes_B, void) \
  V(NewStringFromBytes_BI, void) \
  V(NewStringFromBytes_BII, void) \
  V(NewStringFromBytes_BIII, void) \
  V(NewStringFromBytes_BIIString, void) \
  V(NewStringFromBytes_BString, void) \
  V(NewStringFromBytes_BIICharset, void) \
  V(NewStringFromBytes_BCharset, void) \
  V(NewStringFromChars_C, void) \
  V(NewStringFromChars_CII, void) \
  V(NewStringFromChars_IIC, void) \
  V(NewStringFromCodePoints, void) \
  V(NewStringFromString, void) \
  V(NewStringFromStringBuffer, void) \
  V(NewStringFromStringBuilder, void)

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