header.S revision 24bd4c50bb3ea13be4f049710967961f0546fb2c
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ARMv5 definitions and declarations. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectARM EABI general notes: 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0-r3 hold first 4 args to a method; they are not preserved across method calls 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr4-r8 are available for general use 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr9 is given special treatment in some situations, but not for us 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr10 (sl) seems to be generally available 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr11 (fp) is used by gcc (unless -fomit-frame-pointer is set) 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr12 (ip) is scratch -- not preserved across method calls 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr13 (sp) should be managed carefully in case a signal arrives 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr14 (lr) must be preserved 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr15 (pc) can be tinkered with directly 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0 holds returns of <= 4 bytes 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0-r1 hold returns of 8 bytes, low word in r0 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 37a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenCallee must save/restore r4+ (except r12) if it modifies them. If VFP 38a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenis present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved, 39a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddens0-s15 (d0-d7, q0-a3) do not need to be. 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectStack is "full descending". Only the arguments that don't fit in the first 4 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectregisters are placed on the stack. "sp" points at the first stacked argument 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project(i.e. the 5th arg). 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectVFP: single-precision results in s0, double-precision results in d0. 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectIn the EABI, "sp" must be 64-bit aligned on entry to a function, and any 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project64-bit quantities (long long, double) must be 64-bit aligned. 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMterp and ARM notes: 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe following registers have fixed assignments: 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project reg nick purpose 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project r4 rPC interpreted program counter, used for fetching instructions 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project r5 rFP interpreted frame pointer, used for accessing locals and args 599f601a917c8878204482c37aec7005054b6776fabuzbee r6 rSELF self (Thread) pointer 601da12167d913efde56ec3b40491524b051679f2cAndy McFadden r7 rINST first 16-bit code unit of current instruction 611da12167d913efde56ec3b40491524b051679f2cAndy McFadden r8 rIBASE interpreted instruction base pointer, used for computed goto 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMacros are provided for common operations. Each macro MUST emit only 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectone instruction to make instruction-counting easier. They MUST NOT alter 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectunspecified registers or condition codes. 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/ 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* single-purpose registers, given names for clarity */ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rPC r4 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rFP r5 719f601a917c8878204482c37aec7005054b6776fabuzbee#define rSELF r6 721da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rINST r7 731da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rIBASE r8 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 759f601a917c8878204482c37aec7005054b6776fabuzbee/* save/restore the PC and/or FP from the thread struct */ 769f601a917c8878204482c37aec7005054b6776fabuzbee#define LOAD_PC_FROM_SELF() ldr rPC, [rSELF, #offThread_pc] 779f601a917c8878204482c37aec7005054b6776fabuzbee#define SAVE_PC_TO_SELF() str rPC, [rSELF, #offThread_pc] 789f601a917c8878204482c37aec7005054b6776fabuzbee#define LOAD_FP_FROM_SELF() ldr rFP, [rSELF, #offThread_fp] 799f601a917c8878204482c37aec7005054b6776fabuzbee#define SAVE_FP_TO_SELF() str rFP, [rSELF, #offThread_fp] 809f601a917c8878204482c37aec7005054b6776fabuzbee#define LOAD_PC_FP_FROM_SELF() ldmia rSELF, {rPC, rFP} 819f601a917c8878204482c37aec7005054b6776fabuzbee#define SAVE_PC_FP_TO_SELF() stmia rSELF, {rPC, rFP} 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "export" the PC to the stack frame, f/b/o future exception objects. Must 8598f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee * be done *before* something throws. 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e. 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc) 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It's okay to do this more than once. 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define EXPORT_PC() \ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)] 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a frame pointer, find the stack save area. 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "((StackSaveArea*)(_fp) -1)". 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVEAREA_FROM_FP(_reg, _fpreg) \ 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub _reg, _fpreg, #sizeofStackSaveArea 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from rPC into rINST. Does not advance rPC. 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_INST() ldrh rINST, [rPC] 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from the specified offset. Advances rPC 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to point to the next instruction. "_count" is in 16-bit code units. 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Because of the limited size of immediate constants on ARM, this is only 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * suitable for small forward movements (i.e. don't try to implement "goto" 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with this). 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This must come AFTER anything that can throw an exception, or the 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception catch may miss. (This also implies that it must come after 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EXPORT_PC().) 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 12024bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #((_count)*2)]! 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 123642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * The operation performed here is similar to FETCH_ADVANCE_INST, except the 124642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * src and dest registers are parameterized (not hard-wired to rPC and rINST). 125642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng */ 126642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \ 12724bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden ldrh _dreg, [_sreg, #((_count)*2)]! 128642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng 129642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng/* 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from an offset specified by _reg. Updates 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rPC to point to the next instruction. "_reg" must specify the distance 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in bytes, *not* 16-bit code units, and may be a signed value. 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We want to write "ldrh rINST, [rPC, _reg, lsl #2]!", but some of the 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bits that hold the shift distance are used for the half/byte/sign flags. 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In some cases we can pre-double _reg for free, so we require a byte offset 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * here. 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_ADVANCE_INST_RB(_reg) ldrh rINST, [rPC, _reg]! 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch a half-word code unit from an offset past the current PC. The 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "_count" value is in 16-bit code units. Does not advance rPC. 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "_S" variant works the same but treats the value as signed. 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 14724bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden#define FETCH(_reg, _count) ldrh _reg, [rPC, #((_count)*2)] 14824bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #((_count)*2)] 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch one byte from an offset past the current PC. Pass in the same 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "_count" as you would for FETCH, and an additional 0/1 indicating which 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * byte of the halfword you want (lo/hi). 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 15524bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #((_count)*2+(_byte))] 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Put the instruction's opcode field into the specified register. 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_INST_OPCODE(_reg) and _reg, rINST, #255 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 163642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * Put the prefetched instruction's opcode field into the specified register. 164642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng */ 165642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng#define GET_PREFETCHED_OPCODE(_oreg, _ireg) and _oreg, _ireg, #255 166642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng 167642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng/* 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Begin executing the opcode in _reg. Because this only jumps within the 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork. 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_OPCODE(_reg) add pc, rIBASE, _reg, lsl #${handler_size_bits} 172ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFEQ(_reg) addeq pc, rIBASE, _reg, lsl #${handler_size_bits} 173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFNE(_reg) addne pc, rIBASE, _reg, lsl #${handler_size_bits} 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the 32-bit value from a Dalvik register. 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_VREG(_reg, _vreg) ldr _reg, [rFP, _vreg, lsl #2] 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_VREG(_reg, _vreg) str _reg, [rFP, _vreg, lsl #2] 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1829f601a917c8878204482c37aec7005054b6776fabuzbee#define GET_JIT_PROF_TABLE(_reg) ldr _reg,[rSELF,#offThread_pJitProfTable] 1839f601a917c8878204482c37aec7005054b6776fabuzbee#define GET_JIT_THRESHOLD(_reg) ldr _reg,[rSELF,#offThread_jitThreshold] 184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert a virtual register index into an address. 188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */ 189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define VREG_INDEX_TO_ADDR(_reg, _vreg) \ 190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden add _reg, rFP, _vreg, lsl #2 191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden 192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is a #include, not a %include, because we want the C pre-processor 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to expand the macros into assembler assignment statements. 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "../common/asm-constants.h" 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19894e79ebaa340e8ba3bb4d13f5e908fef6d9d5eedBen Cheng#if defined(WITH_JIT) 19994e79ebaa340e8ba3bb4d13f5e908fef6d9d5eedBen Cheng#include "../common/jit-config.h" 20094e79ebaa340e8ba3bb4d13f5e908fef6d9d5eedBen Cheng#endif 201