1 /* 2 * Copyright (C) 2012 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 #include <math.h> 18 19 #include "entrypoints/jni/jni_entrypoints.h" 20 #include "entrypoints/quick/quick_alloc_entrypoints.h" 21 #include "entrypoints/quick/quick_default_externs.h" 22 #include "entrypoints/quick/quick_default_init_entrypoints.h" 23 #include "entrypoints/quick/quick_entrypoints.h" 24 #include "entrypoints/runtime_asm_entrypoints.h" 25 #include "interpreter/interpreter.h" 26 27 namespace art { 28 29 // Cast entrypoints. 30 extern "C" size_t art_quick_instance_of(mirror::Object* obj, mirror::Class* ref_class); 31 32 // Read barrier entrypoints. 33 // art_quick_read_barrier_mark_regX uses an non-standard calling 34 // convention: it expects its input in register X and returns its 35 // result in that same register, and saves and restores all 36 // caller-save registers. 37 extern "C" mirror::Object* art_quick_read_barrier_mark_reg00(mirror::Object*); 38 extern "C" mirror::Object* art_quick_read_barrier_mark_reg01(mirror::Object*); 39 extern "C" mirror::Object* art_quick_read_barrier_mark_reg02(mirror::Object*); 40 extern "C" mirror::Object* art_quick_read_barrier_mark_reg03(mirror::Object*); 41 extern "C" mirror::Object* art_quick_read_barrier_mark_reg05(mirror::Object*); 42 extern "C" mirror::Object* art_quick_read_barrier_mark_reg06(mirror::Object*); 43 extern "C" mirror::Object* art_quick_read_barrier_mark_reg07(mirror::Object*); 44 extern "C" mirror::Object* art_quick_read_barrier_slow(mirror::Object*, mirror::Object*, uint32_t); 45 extern "C" mirror::Object* art_quick_read_barrier_for_root_slow(GcRoot<mirror::Object>*); 46 47 void UpdateReadBarrierEntrypoints(QuickEntryPoints* qpoints, bool is_active) { 48 qpoints->pReadBarrierMarkReg00 = is_active ? art_quick_read_barrier_mark_reg00 : nullptr; 49 qpoints->pReadBarrierMarkReg01 = is_active ? art_quick_read_barrier_mark_reg01 : nullptr; 50 qpoints->pReadBarrierMarkReg02 = is_active ? art_quick_read_barrier_mark_reg02 : nullptr; 51 qpoints->pReadBarrierMarkReg03 = is_active ? art_quick_read_barrier_mark_reg03 : nullptr; 52 qpoints->pReadBarrierMarkReg05 = is_active ? art_quick_read_barrier_mark_reg05 : nullptr; 53 qpoints->pReadBarrierMarkReg06 = is_active ? art_quick_read_barrier_mark_reg06 : nullptr; 54 qpoints->pReadBarrierMarkReg07 = is_active ? art_quick_read_barrier_mark_reg07 : nullptr; 55 } 56 57 void InitEntryPoints(JniEntryPoints* jpoints, QuickEntryPoints* qpoints) { 58 DefaultInitEntryPoints(jpoints, qpoints); 59 60 // Cast 61 qpoints->pInstanceofNonTrivial = art_quick_instance_of; 62 qpoints->pCheckInstanceOf = art_quick_check_instance_of; 63 64 // More math. 65 qpoints->pCos = cos; 66 qpoints->pSin = sin; 67 qpoints->pAcos = acos; 68 qpoints->pAsin = asin; 69 qpoints->pAtan = atan; 70 qpoints->pAtan2 = atan2; 71 qpoints->pCbrt = cbrt; 72 qpoints->pCosh = cosh; 73 qpoints->pExp = exp; 74 qpoints->pExpm1 = expm1; 75 qpoints->pHypot = hypot; 76 qpoints->pLog = log; 77 qpoints->pLog10 = log10; 78 qpoints->pNextAfter = nextafter; 79 qpoints->pSinh = sinh; 80 qpoints->pTan = tan; 81 qpoints->pTanh = tanh; 82 83 // Math 84 qpoints->pD2l = art_quick_d2l; 85 qpoints->pF2l = art_quick_f2l; 86 qpoints->pLdiv = art_quick_ldiv; 87 qpoints->pLmod = art_quick_lmod; 88 qpoints->pLmul = art_quick_lmul; 89 qpoints->pShlLong = art_quick_lshl; 90 qpoints->pShrLong = art_quick_lshr; 91 qpoints->pUshrLong = art_quick_lushr; 92 93 // Intrinsics 94 // qpoints->pIndexOf = nullptr; // Not needed on x86 95 qpoints->pStringCompareTo = art_quick_string_compareto; 96 qpoints->pMemcpy = art_quick_memcpy; 97 98 // Read barrier. 99 qpoints->pReadBarrierJni = ReadBarrierJni; 100 UpdateReadBarrierEntrypoints(qpoints, /*is_active*/ false); 101 qpoints->pReadBarrierMarkReg04 = nullptr; // Cannot use register 4 (ESP) to pass arguments. 102 // x86 has only 8 core registers. 103 qpoints->pReadBarrierMarkReg08 = nullptr; 104 qpoints->pReadBarrierMarkReg09 = nullptr; 105 qpoints->pReadBarrierMarkReg10 = nullptr; 106 qpoints->pReadBarrierMarkReg11 = nullptr; 107 qpoints->pReadBarrierMarkReg12 = nullptr; 108 qpoints->pReadBarrierMarkReg13 = nullptr; 109 qpoints->pReadBarrierMarkReg14 = nullptr; 110 qpoints->pReadBarrierMarkReg15 = nullptr; 111 qpoints->pReadBarrierMarkReg16 = nullptr; 112 qpoints->pReadBarrierMarkReg17 = nullptr; 113 qpoints->pReadBarrierMarkReg18 = nullptr; 114 qpoints->pReadBarrierMarkReg19 = nullptr; 115 qpoints->pReadBarrierMarkReg20 = nullptr; 116 qpoints->pReadBarrierMarkReg21 = nullptr; 117 qpoints->pReadBarrierMarkReg22 = nullptr; 118 qpoints->pReadBarrierMarkReg23 = nullptr; 119 qpoints->pReadBarrierMarkReg24 = nullptr; 120 qpoints->pReadBarrierMarkReg25 = nullptr; 121 qpoints->pReadBarrierMarkReg26 = nullptr; 122 qpoints->pReadBarrierMarkReg27 = nullptr; 123 qpoints->pReadBarrierMarkReg28 = nullptr; 124 qpoints->pReadBarrierMarkReg29 = nullptr; 125 qpoints->pReadBarrierSlow = art_quick_read_barrier_slow; 126 qpoints->pReadBarrierForRootSlow = art_quick_read_barrier_for_root_slow; 127 }; 128 129 } // namespace art 130