157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers/*
257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Copyright (C) 2012 The Android Open Source Project
357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Licensed under the Apache License, Version 2.0 (the "License");
557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * you may not use this file except in compliance with the License.
657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * You may obtain a copy of the License at
757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *      http://www.apache.org/licenses/LICENSE-2.0
957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
1057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Unless required by applicable law or agreed to in writing, software
1157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * distributed under the License is distributed on an "AS IS" BASIS,
1257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * See the License for the specific language governing permissions and
1457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * limitations under the License.
1557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */
1657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
17848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers#include "entrypoints/interpreter/interpreter_entrypoints.h"
1898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang#include "entrypoints/jni/jni_entrypoints.h"
197655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "entrypoints/portable/portable_entrypoints.h"
20d889178ec78930538d9d6a66c3df9ee9afaffbb4Mathieu Chartier#include "entrypoints/quick/quick_alloc_entrypoints.h"
21166db04e259ca51838c311891598664deeed85adIan Rogers#include "entrypoints/quick/quick_entrypoints.h"
227655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "entrypoints/entrypoint_utils.h"
237655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "entrypoints/math_entrypoints.h"
2457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2557b86d47b66322693a070185fadfb43cb9c12eabIan Rogersnamespace art {
2657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
27848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers// Interpreter entrypoints.
28848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void artInterpreterToInterpreterBridge(Thread* self, MethodHelper& mh,
29e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers                                                  const DexFile::CodeItem* code_item,
30e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers                                                  ShadowFrame* shadow_frame, JValue* result);
3108bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirleaextern "C" void artInterpreterToCompiledCodeBridge(Thread* self, MethodHelper& mh,
32e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers                                                   const DexFile::CodeItem* code_item,
33e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers                                                   ShadowFrame* shadow_frame, JValue* result);
34848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers
35848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers// Portable entrypoints.
36ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromextern "C" void art_portable_resolution_trampoline(mirror::ArtMethod*);
37ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromextern "C" void art_portable_to_interpreter_bridge(mirror::ArtMethod*);
38848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers
3957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Cast entrypoints.
402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint32_t artIsAssignableFromCode(const mirror::Class* klass,
412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                            const mirror::Class* ref_class);
42848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_check_cast(void*, void*);
4357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
4457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// DexCache entrypoints.
45848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void* art_quick_initialize_static_storage(uint32_t, void*);
46848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void* art_quick_initialize_type(uint32_t, void*);
47848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void* art_quick_initialize_type_and_verify_access(uint32_t, void*);
48848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void* art_quick_resolve_string(void*, uint32_t);
4957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
5057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Field entrypoints.
51848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int art_quick_set32_instance(uint32_t, void*, int32_t);
52848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int art_quick_set32_static(uint32_t, int32_t);
53848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int art_quick_set64_instance(uint32_t, void*, int64_t);
54848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int art_quick_set64_static(uint32_t, int64_t);
55848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int art_quick_set_obj_instance(uint32_t, void*, void*);
56848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int art_quick_set_obj_static(uint32_t, void*);
57848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int32_t art_quick_get32_instance(uint32_t, void*);
58848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int32_t art_quick_get32_static(uint32_t);
59848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int64_t art_quick_get64_instance(uint32_t, void*);
60848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" int64_t art_quick_get64_static(uint32_t);
61848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void* art_quick_get_obj_instance(uint32_t, void*);
62848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void* art_quick_get_obj_static(uint32_t);
6357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
64a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers// Array entrypoints.
65a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogersextern "C" void art_quick_aput_obj_with_null_and_bound_check(void*, uint32_t, void*);
66a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogersextern "C" void art_quick_aput_obj_with_bound_check(void*, uint32_t, void*);
67a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogersextern "C" void art_quick_aput_obj(void*, uint32_t, void*);
68848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_handle_fill_data(void*, void*);
6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
7057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Lock entrypoints.
71848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_lock_object(void*);
72848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_unlock_object(void*);
7357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
7457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Math entrypoints.
7557b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern int32_t CmpgDouble(double a, double b);
7657b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern int32_t CmplDouble(double a, double b);
7757b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern int32_t CmpgFloat(float a, float b);
7857b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern int32_t CmplFloat(float a, float b);
7957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
8057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Math conversions.
8157b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int32_t __aeabi_f2iz(float op1);        // FLOAT_TO_INT
8257b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int32_t __aeabi_d2iz(double op1);       // DOUBLE_TO_INT
8357b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" float __aeabi_l2f(int64_t op1);         // LONG_TO_FLOAT
8457b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" double __aeabi_l2d(int64_t op1);        // LONG_TO_DOUBLE
8557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
8657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Single-precision FP arithmetics.
8757b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" float fmodf(float a, float b);          // REM_FLOAT[_2ADDR]
8857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
8957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Double-precision FP arithmetics.
9057b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" double fmod(double a, double b);         // REM_DOUBLE[_2ADDR]
9157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
9257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Integer arithmetics.
93a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughesextern "C" int __aeabi_idivmod(int32_t, int32_t);  // [DIV|REM]_INT[_2ADDR|_LIT8|_LIT16]
9457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
9557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Long long arithmetics - REM_LONG[_2ADDR] and DIV_LONG[_2ADDR]
96a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughesextern "C" int64_t __aeabi_ldivmod(int64_t, int64_t);
978dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" int64_t art_quick_mul_long(int64_t, int64_t);
988dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" uint64_t art_quick_shl_long(uint64_t, uint32_t);
998dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" uint64_t art_quick_shr_long(uint64_t, uint32_t);
1008dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" uint64_t art_quick_ushr_long(uint64_t, uint32_t);
10157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
10257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Intrinsic entrypoints.
1038dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" int32_t art_quick_indexof(void*, uint32_t, uint32_t, uint32_t);
1048dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" int32_t art_quick_string_compareto(void*, void*);
10557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
10657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Invoke entrypoints.
10788474b416eb257078e590bf9bc7957cee604a186Jeff Haoextern "C" void art_quick_imt_conflict_trampoline(mirror::ArtMethod*);
108ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromextern "C" void art_quick_resolution_trampoline(mirror::ArtMethod*);
109ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromextern "C" void art_quick_to_interpreter_bridge(mirror::ArtMethod*);
1108dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" void art_quick_invoke_direct_trampoline_with_access_check(uint32_t, void*);
1118dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" void art_quick_invoke_interface_trampoline_with_access_check(uint32_t, void*);
1128dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" void art_quick_invoke_static_trampoline_with_access_check(uint32_t, void*);
1138dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" void art_quick_invoke_super_trampoline_with_access_check(uint32_t, void*);
1148dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" void art_quick_invoke_virtual_trampoline_with_access_check(uint32_t, void*);
11557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
11657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Thread entrypoints.
1178dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienextern "C" void art_quick_test_suspend();
11857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
11957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Throw entrypoints.
120848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_deliver_exception(void*);
121848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_throw_array_bounds(int32_t index, int32_t limit);
122848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_throw_div_zero();
123848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_throw_no_such_method(int32_t method_idx);
124848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_throw_null_pointer_exception();
125848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern "C" void art_quick_throw_stack_overflow(void*);
126848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers
1272da882315a61072664f7ce3c212307342e907207Andreas Gampe// Generic JNI downcall
1282da882315a61072664f7ce3c212307342e907207Andreas Gampeextern "C" void art_quick_generic_jni_trampoline(mirror::ArtMethod*);
1292da882315a61072664f7ce3c212307342e907207Andreas Gampe
130848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersvoid InitEntryPoints(InterpreterEntryPoints* ipoints, JniEntryPoints* jpoints,
131848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers                     PortableEntryPoints* ppoints, QuickEntryPoints* qpoints) {
132848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // Interpreter
133848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  ipoints->pInterpreterToInterpreterBridge = artInterpreterToInterpreterBridge;
13408bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea  ipoints->pInterpreterToCompiledCodeBridge = artInterpreterToCompiledCodeBridge;
135848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers
136848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // JNI
137848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  jpoints->pDlsymLookup = art_jni_dlsym_lookup_stub;
138848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers
139848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  // Portable
140848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  ppoints->pPortableResolutionTrampoline = art_portable_resolution_trampoline;
141848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  ppoints->pPortableToInterpreterBridge = art_portable_to_interpreter_bridge;
142848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers
14357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Alloc
1443b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi  ResetQuickAllocEntryPoints(qpoints);
14557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
14657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Cast
147848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pInstanceofNonTrivial = artIsAssignableFromCode;
148848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pCheckCast = art_quick_check_cast;
14957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
15057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // DexCache
151848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pInitializeStaticStorage = art_quick_initialize_static_storage;
152848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pInitializeTypeAndVerifyAccess = art_quick_initialize_type_and_verify_access;
153848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pInitializeType = art_quick_initialize_type;
154848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pResolveString = art_quick_resolve_string;
15557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
15657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Field
157848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pSet32Instance = art_quick_set32_instance;
158848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pSet32Static = art_quick_set32_static;
159848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pSet64Instance = art_quick_set64_instance;
160848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pSet64Static = art_quick_set64_static;
161848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pSetObjInstance = art_quick_set_obj_instance;
162848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pSetObjStatic = art_quick_set_obj_static;
163848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pGet32Instance = art_quick_get32_instance;
164848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pGet64Instance = art_quick_get64_instance;
165848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pGetObjInstance = art_quick_get_obj_instance;
166848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pGet32Static = art_quick_get32_static;
167848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pGet64Static = art_quick_get64_static;
168848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pGetObjStatic = art_quick_get_obj_static;
16957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
170a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers  // Array
171a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers  qpoints->pAputObjectWithNullAndBoundCheck = art_quick_aput_obj_with_null_and_bound_check;
172a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers  qpoints->pAputObjectWithBoundCheck = art_quick_aput_obj_with_bound_check;
173a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers  qpoints->pAputObject = art_quick_aput_obj;
174848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pHandleFillArrayData = art_quick_handle_fill_data;
17557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
17657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // JNI
1777655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pJniMethodStart = JniMethodStart;
1787655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pJniMethodStartSynchronized = JniMethodStartSynchronized;
1797655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pJniMethodEnd = JniMethodEnd;
1807655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pJniMethodEndSynchronized = JniMethodEndSynchronized;
1817655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pJniMethodEndWithReference = JniMethodEndWithReference;
1827655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pJniMethodEndWithReferenceSynchronized = JniMethodEndWithReferenceSynchronized;
1832da882315a61072664f7ce3c212307342e907207Andreas Gampe  qpoints->pQuickGenericJniTrampoline = art_quick_generic_jni_trampoline;
18457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
18557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Locks
186848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pLockObject = art_quick_lock_object;
187848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pUnlockObject = art_quick_unlock_object;
18857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
18957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Math
1907655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pCmpgDouble = CmpgDouble;
1917655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pCmpgFloat = CmpgFloat;
1927655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pCmplDouble = CmplDouble;
1937655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pCmplFloat = CmplFloat;
1947655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pFmod = fmod;
1957655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pL2d = __aeabi_l2d;
1967655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pFmodf = fmodf;
1977655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pL2f = __aeabi_l2f;
1987655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pD2iz = __aeabi_d2iz;
1997655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pF2iz = __aeabi_f2iz;
2007655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pIdivmod = __aeabi_idivmod;
2017655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pD2l = art_d2l;
2027655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pF2l = art_f2l;
2037655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pLdiv = __aeabi_ldivmod;
204a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers  qpoints->pLmod = __aeabi_ldivmod;  // result returned in r2:r3
2057655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pLmul = art_quick_mul_long;
2067655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pShlLong = art_quick_shl_long;
2077655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pShrLong = art_quick_shr_long;
2087655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pUshrLong = art_quick_ushr_long;
20957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
21057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Intrinsics
2117655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pIndexOf = art_quick_indexof;
2127655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pStringCompareTo = art_quick_string_compareto;
2137655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pMemcpy = memcpy;
21457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
21557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Invocation
21688474b416eb257078e590bf9bc7957cee604a186Jeff Hao  qpoints->pQuickImtConflictTrampoline = art_quick_imt_conflict_trampoline;
217848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pQuickResolutionTrampoline = art_quick_resolution_trampoline;
218848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pQuickToInterpreterBridge = art_quick_to_interpreter_bridge;
2197655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pInvokeDirectTrampolineWithAccessCheck = art_quick_invoke_direct_trampoline_with_access_check;
2207655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pInvokeInterfaceTrampolineWithAccessCheck = art_quick_invoke_interface_trampoline_with_access_check;
2217655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pInvokeStaticTrampolineWithAccessCheck = art_quick_invoke_static_trampoline_with_access_check;
2227655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pInvokeSuperTrampolineWithAccessCheck = art_quick_invoke_super_trampoline_with_access_check;
2237655f29fabc0a12765de828914a18314382e5a35Ian Rogers  qpoints->pInvokeVirtualTrampolineWithAccessCheck = art_quick_invoke_virtual_trampoline_with_access_check;
22457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
22557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Thread
226848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pTestSuspend = art_quick_test_suspend;
22757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
22857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Throws
229848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pDeliverException = art_quick_deliver_exception;
230848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pThrowArrayBounds = art_quick_throw_array_bounds;
231848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pThrowDivZero = art_quick_throw_div_zero;
232848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pThrowNoSuchMethod = art_quick_throw_no_such_method;
233848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pThrowNullPointer = art_quick_throw_null_pointer_exception;
234848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers  qpoints->pThrowStackOverflow = art_quick_throw_stack_overflow;
23557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers};
23657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
23757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}  // namespace art
238