1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef DALVIK_VM_COMPILER_CODEGEN_ARM_CALLOUT_HELPER_H_ 18 #define DALVIK_VM_COMPILER_CODEGEN_ARM_CALLOUT_HELPER_H_ 19 20 #include "Dalvik.h" 21 22 /* 23 * Declare/comment prototypes of all native callout functions invoked by the 24 * JIT'ed code here and use the LOAD_FUNC_ADDR macro to load the address into 25 * a register. In this way we have a centralized place to find out all native 26 * helper functions and we can grep for LOAD_FUNC_ADDR to find out all the 27 * callsites. 28 */ 29 30 /* Load a statically compiled function address as a constant */ 31 #define LOAD_FUNC_ADDR(cUnit, reg, addr) loadConstant(cUnit, reg, addr) 32 33 /* Conversions */ 34 extern "C" float __aeabi_i2f(int op1); // OP_INT_TO_FLOAT 35 extern "C" int __aeabi_f2iz(float op1); // OP_FLOAT_TO_INT 36 extern "C" float __aeabi_d2f(double op1); // OP_DOUBLE_TO_FLOAT 37 extern "C" double __aeabi_f2d(float op1); // OP_FLOAT_TO_DOUBLE 38 extern "C" double __aeabi_i2d(int op1); // OP_INT_TO_DOUBLE 39 extern "C" int __aeabi_d2iz(double op1); // OP_DOUBLE_TO_INT 40 extern "C" float __aeabi_l2f(long op1); // OP_LONG_TO_FLOAT 41 extern "C" double __aeabi_l2d(long op1); // OP_LONG_TO_DOUBLE 42 s8 dvmJitf2l(float op1); // OP_FLOAT_TO_LONG 43 s8 dvmJitd2l(double op1); // OP_DOUBLE_TO_LONG 44 45 /* Single-precision FP arithmetics */ 46 extern "C" float __aeabi_fadd(float a, float b); // OP_ADD_FLOAT[_2ADDR] 47 extern "C" float __aeabi_fsub(float a, float b); // OP_SUB_FLOAT[_2ADDR] 48 extern "C" float __aeabi_fdiv(float a, float b); // OP_DIV_FLOAT[_2ADDR] 49 extern "C" float __aeabi_fmul(float a, float b); // OP_MUL_FLOAT[_2ADDR] 50 extern "C" float fmodf(float a, float b); // OP_REM_FLOAT[_2ADDR] 51 52 /* Double-precision FP arithmetics */ 53 extern "C" double __aeabi_dadd(double a, double b); // OP_ADD_DOUBLE[_2ADDR] 54 extern "C" double __aeabi_dsub(double a, double b); // OP_SUB_DOUBLE[_2ADDR] 55 extern "C" double __aeabi_ddiv(double a, double b); // OP_DIV_DOUBLE[_2ADDR] 56 extern "C" double __aeabi_dmul(double a, double b); // OP_MUL_DOUBLE[_2ADDR] 57 extern "C" double fmod(double a, double b); // OP_REM_DOUBLE[_2ADDR] 58 59 /* Integer arithmetics */ 60 extern "C" int __aeabi_idivmod(int op1, int op2); // OP_REM_INT[_2ADDR|_LIT8|_LIT16] 61 extern "C" int __aeabi_idiv(int op1, int op2); // OP_DIV_INT[_2ADDR|_LIT8|_LIT16] 62 63 /* Long long arithmetics - OP_REM_LONG[_2ADDR] & OP_DIV_LONG[_2ADDR] */ 64 extern "C" long long __aeabi_ldivmod(long long op1, long long op2); 65 66 /* Originally declared in Sync.h */ 67 bool dvmUnlockObject(struct Thread* self, struct Object* obj); //OP_MONITOR_EXIT 68 69 /* Originally declared in oo/TypeCheck.h */ 70 bool dvmCanPutArrayElement(const ClassObject* elemClass, // OP_APUT_OBJECT 71 const ClassObject* arrayClass); 72 int dvmInstanceofNonTrivial(const ClassObject* instance, // OP_CHECK_CAST && 73 const ClassObject* clazz); // OP_INSTANCE_OF 74 75 /* Originally declared in oo/Array.h */ 76 ArrayObject* dvmAllocArrayByClass(ClassObject* arrayClass, // OP_NEW_ARRAY 77 size_t length, int allocFlags); 78 79 /* Originally declared in interp/InterpDefs.h */ 80 bool dvmInterpHandleFillArrayData(ArrayObject* arrayObject,// OP_FILL_ARRAY_DATA 81 const u2* arrayData); 82 83 /* Originally declared in compiler/codegen/arm/Assemble.c */ 84 const Method *dvmJitToPatchPredictedChain(const Method *method, 85 Thread *self, 86 PredictedChainingCell *cell, 87 const ClassObject *clazz); 88 89 /* 90 * Switch dispatch offset calculation for OP_PACKED_SWITCH & OP_SPARSE_SWITCH 91 * Used in CodegenDriver.c 92 * static s8 findPackedSwitchIndex(const u2* switchData, int testVal, int pc); 93 * static s8 findSparseSwitchIndex(const u2* switchData, int testVal, int pc); 94 */ 95 96 /* 97 * Resolve interface callsites - OP_INVOKE_INTERFACE & OP_INVOKE_INTERFACE_RANGE 98 * 99 * Originally declared in mterp/common/FindInterface.h and only comment it here 100 * due to the INLINE attribute. 101 * 102 * INLINE Method* dvmFindInterfaceMethodInCache(ClassObject* thisClass, 103 * u4 methodIdx, const Method* method, DvmDex* methodClassDex) 104 */ 105 106 /* Originally declared in alloc/Alloc.h */ 107 Object* dvmAllocObject(ClassObject* clazz, int flags); // OP_NEW_INSTANCE 108 109 /* 110 * Functions declared in gDvmInlineOpsTable[] are used for 111 * OP_EXECUTE_INLINE & OP_EXECUTE_INLINE_RANGE. 112 */ 113 extern "C" double sqrt(double x); // INLINE_MATH_SQRT 114 115 /* 116 * The following functions are invoked through the compiler templates (declared 117 * in compiler/template/armv5te/footer.S: 118 * 119 * __aeabi_cdcmple // CMPG_DOUBLE 120 * __aeabi_cfcmple // CMPG_FLOAT 121 * dvmLockObject // MONITOR_ENTER 122 */ 123 124 #endif // DALVIK_VM_COMPILER_CODEGEN_ARM_CALLOUT_HELPER_H_ 125