1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This file was generated automatically by gen-mterp.py for 'armv5te'. 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * --> DO NOT EDIT <-- 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/header.S */ 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 23c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ARMv5 definitions and declarations. 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectARM EABI general notes: 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0-r3 hold first 4 args to a method; they are not preserved across method calls 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr4-r8 are available for general use 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr9 is given special treatment in some situations, but not for us 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr10 (sl) seems to be generally available 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr11 (fp) is used by gcc (unless -fomit-frame-pointer is set) 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr12 (ip) is scratch -- not preserved across method calls 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr13 (sp) should be managed carefully in case a signal arrives 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr14 (lr) must be preserved 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr15 (pc) can be tinkered with directly 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0 holds returns of <= 4 bytes 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0-r1 hold returns of 8 bytes, low word in r0 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenCallee must save/restore r4+ (except r12) if it modifies them. If VFP 45a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenis present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved, 46a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddens0-s15 (d0-d7, q0-a3) do not need to be. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectStack is "full descending". Only the arguments that don't fit in the first 4 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectregisters are placed on the stack. "sp" points at the first stacked argument 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project(i.e. the 5th arg). 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectVFP: single-precision results in s0, double-precision results in d0. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectIn the EABI, "sp" must be 64-bit aligned on entry to a function, and any 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project64-bit quantities (long long, double) must be 64-bit aligned. 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMterp and ARM notes: 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe following registers have fixed assignments: 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project reg nick purpose 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project r4 rPC interpreted program counter, used for fetching instructions 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project r5 rFP interpreted frame pointer, used for accessing locals and args 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project r6 rGLUE MterpGlue pointer 671da12167d913efde56ec3b40491524b051679f2cAndy McFadden r7 rINST first 16-bit code unit of current instruction 681da12167d913efde56ec3b40491524b051679f2cAndy McFadden r8 rIBASE interpreted instruction base pointer, used for computed goto 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMacros are provided for common operations. Each macro MUST emit only 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectone instruction to make instruction-counting easier. They MUST NOT alter 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectunspecified registers or condition codes. 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/ 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* single-purpose registers, given names for clarity */ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rPC r4 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rFP r5 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rGLUE r6 791da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rINST r7 801da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rIBASE r8 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* save/restore the PC and/or FP from the glue struct */ 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_PC_FROM_GLUE() ldr rPC, [rGLUE, #offGlue_pc] 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_PC_TO_GLUE() str rPC, [rGLUE, #offGlue_pc] 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_FP_FROM_GLUE() ldr rFP, [rGLUE, #offGlue_fp] 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_FP_TO_GLUE() str rFP, [rGLUE, #offGlue_fp] 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_PC_FP_FROM_GLUE() ldmia rGLUE, {rPC, rFP} 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_PC_FP_TO_GLUE() stmia rGLUE, {rPC, rFP} 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "export" the PC to the stack frame, f/b/o future exception objects. Must 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be done *before* something calls dvmThrowException. 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e. 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc) 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It's okay to do this more than once. 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define EXPORT_PC() \ 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)] 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a frame pointer, find the stack save area. 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "((StackSaveArea*)(_fp) -1)". 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVEAREA_FROM_FP(_reg, _fpreg) \ 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub _reg, _fpreg, #sizeofStackSaveArea 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from rPC into rINST. Does not advance rPC. 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_INST() ldrh rINST, [rPC] 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from the specified offset. Advances rPC 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to point to the next instruction. "_count" is in 16-bit code units. 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Because of the limited size of immediate constants on ARM, this is only 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * suitable for small forward movements (i.e. don't try to implement "goto" 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with this). 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This must come AFTER anything that can throw an exception, or the 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception catch may miss. (This also implies that it must come after 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EXPORT_PC().) 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #(_count*2)]! 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 130642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * The operation performed here is similar to FETCH_ADVANCE_INST, except the 131642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * src and dest registers are parameterized (not hard-wired to rPC and rINST). 132642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng */ 133642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \ 134642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh _dreg, [_sreg, #(_count*2)]! 135642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng 136642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng/* 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from an offset specified by _reg. Updates 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rPC to point to the next instruction. "_reg" must specify the distance 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in bytes, *not* 16-bit code units, and may be a signed value. 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We want to write "ldrh rINST, [rPC, _reg, lsl #2]!", but some of the 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bits that hold the shift distance are used for the half/byte/sign flags. 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In some cases we can pre-double _reg for free, so we require a byte offset 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * here. 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_ADVANCE_INST_RB(_reg) ldrh rINST, [rPC, _reg]! 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch a half-word code unit from an offset past the current PC. The 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "_count" value is in 16-bit code units. Does not advance rPC. 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "_S" variant works the same but treats the value as signed. 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH(_reg, _count) ldrh _reg, [rPC, #(_count*2)] 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #(_count*2)] 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch one byte from an offset past the current PC. Pass in the same 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "_count" as you would for FETCH, and an additional 0/1 indicating which 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * byte of the halfword you want (lo/hi). 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #(_count*2+_byte)] 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Put the instruction's opcode field into the specified register. 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_INST_OPCODE(_reg) and _reg, rINST, #255 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 170642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * Put the prefetched instruction's opcode field into the specified register. 171642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng */ 172642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng#define GET_PREFETCHED_OPCODE(_oreg, _ireg) and _oreg, _ireg, #255 173642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng 174642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng/* 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Begin executing the opcode in _reg. Because this only jumps within the 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork. 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_OPCODE(_reg) add pc, rIBASE, _reg, lsl #6 179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFEQ(_reg) addeq pc, rIBASE, _reg, lsl #6 180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFNE(_reg) addne pc, rIBASE, _reg, lsl #6 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the 32-bit value from a Dalvik register. 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_VREG(_reg, _vreg) ldr _reg, [rFP, _vreg, lsl #2] 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_VREG(_reg, _vreg) str _reg, [rFP, _vreg, lsl #2] 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GET_JIT_PROF_TABLE(_reg) ldr _reg,[rGLUE,#offGlue_pJitProfTable] 190d726991ba52466cde88e37aba4de2395b62477faBill Buzbee#define GET_JIT_THRESHOLD(_reg) ldr _reg,[rGLUE,#offGlue_jitThreshold] 191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert a virtual register index into an address. 195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */ 196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define VREG_INDEX_TO_ADDR(_reg, _vreg) \ 197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden add _reg, rFP, _vreg, lsl #2 198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden 199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is a #include, not a %include, because we want the C pre-processor 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to expand the macros into assembler assignment statements. 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "../common/asm-constants.h" 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2057b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#if defined(WITH_JIT) 2067b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#include "../common/jit-config.h" 2077b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#endif 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/platform.S */ 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * CPU-version-specific defines 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "LDR PC,xxx", which is not allowed pre-ARMv5. Essentially a 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one-way branch. 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP. Does not modify LR. 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro LDR_PC source 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr pc, \source 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "MOV LR,PC / LDR PC,xxx", which is not allowed pre-ARMv5. 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Jump to subroutine. 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP and LR. 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro LDR_PC_LR source 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov lr, pc 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr pc, \source 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "LDMFD SP!, {...regs...,PC}". 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP and LR. 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro LDMFD_PC regs 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {\regs,pc} 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 246c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* 247c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Macro for data memory barrier; not meaningful pre-ARMv6K. 248c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 2490890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden.macro SMP_DMB 250c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.endm 251c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/entry.S */ 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point. 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't have formal stack frames, so gdb scans upward in the code 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to find the start of the function (a label with the %function type), 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and then looks at the next few instructions to figure out what 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * got pushed onto the stack. From this it figures out how to restore 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the registers, including PC, for the previous stack frame. If gdb 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sees a non-function label, it stops scanning, so either we need to 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have nothing but assembler-local labels between the entry point and 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the break, or we need to fake it out. 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When this is defined, we add some stuff to make gdb less confused. 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ASSIST_DEBUGGER 1 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .text 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .align 2 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmMterpStdRun 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmMterpStdRun, %function 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 MterpGlue* glue 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This function returns a boolean "changeInterp" value. The return comes 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * via a call to dvmMterpStdBail(). 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun: 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY1 \ 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .save {r4-r10,fp,lr}; \ 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4-r10,fp,lr} @ save 9 regs 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY2 \ 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .pad #4; \ 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #4 @ align 64 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnstart 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY1 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY2 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* save stack pointer, add magic word for debuggerd */ 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str sp, [r0, #offGlue_bailPtr] @ save SP for eventual return 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* set up "named" registers, figure out entry point */ 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov rGLUE, r0 @ set rGLUE 31551ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee ldr r1, [r0, #offGlue_entryPoint] @ enum is 4 bytes in aapcs-EABI 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOAD_PC_FP_FROM_GLUE() @ load rPC and rFP from "glue" 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adr rIBASE, dvmAsmInstructionStart @ set rIBASE 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #kInterpEntryInstr @ usual case? 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .Lnot_instr @ no, handle it 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 321ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 322d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng.LentryInstr: 3237a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 324ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Entry is always a possible trace start */ 325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 326ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_INST() 3277a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r1, #0 @ prepare the value for the new state 3287a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng str r1, [r10, #offThread_inJitCodeCache] @ back to the interp land 3297a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng cmp r0,#0 @ is profiling disabled? 3307a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#if !defined(WITH_SELF_VERIFICATION) 3317a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng bne common_updateProfile @ profiling is enabled 3327a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#else 3337a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng ldr r2, [r10, #offThread_shadowSpace] @ to find out the jit exit state 3347a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng beq 1f @ profiling is disabled 3357a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng ldr r3, [r2, #offShadowSpace_jitExitState] @ jit exit state 3367a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng cmp r3, #kSVSTraceSelect @ hot trace following? 3377a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng moveq r2,#kJitTSelectRequestHot @ ask for trace selection 3387a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng beq common_selectTrace @ go build the trace 3397a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng cmp r3, #kSVSNoProfile @ don't profile the next instruction? 3407a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng beq 1f @ intrepret the next instruction 3417a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng b common_updateProfile @ collect profiles 3427a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#endif 3437a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng1: 344ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 345ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) 346ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* start executing the instruction at rPC */ 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST() @ load rINST from rPC 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 351ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_instr: 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #kInterpEntryReturn @ were we returning from a method? 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_returnFromMethod 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_return: 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #kInterpEntryThrow @ were we throwing an exception? 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 361ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 362ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.Lnot_throw: 363d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10,[rGLUE, #offGlue_jitResumeNPC] 364d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r2,[rGLUE, #offGlue_jitResumeDPC] 365ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r1, #kInterpEntryResume @ resuming after Jit single-step? 366ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne .Lbad_arg 367ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp rPC,r2 368d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng bne .LentryInstr @ must have branched, don't resume 369d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#if defined(WITH_SELF_VERIFICATION) 370d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng @ glue->entryPoint will be set in dvmSelfVerificationSaveState 371d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunStart @ re-enter the translation after the 372d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng @ single-stepped instruction 373d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng @noreturn 374d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#endif 375ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1, #kInterpEntryInstr 37651ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee str r1, [rGLUE, #offGlue_entryPoint] 377d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng bx r10 @ re-enter the translation 378ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 379ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lbad_arg: 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strBadEntryPoint 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r1 holds value of entryPoint 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAbort 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnend 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmMterpStdBail 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmMterpStdBail, %function 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry. 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper. The 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun. 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pushed some registers on the stack in dvmMterpStdRun, then saved 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SP and LR. Here we restore SP, restore the registers, and then restore 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LR to PC. 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 MterpGlue* glue 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 bool changeInterp 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail: 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr sp, [r0, #offGlue_bailPtr] @ sp<- saved SP 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r1 @ return the changeInterp value 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #4 @ un-align 64 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LDMFD_PC "r4-r10,fp" @ restore 9 regs and return 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references. 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrBadEntryPoint: 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrBadEntryPoint 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmAsmInstructionStart 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmAsmInstructionStart, %function 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .text 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */ 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOP.S */ 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance to next instr, load rINST 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute it 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* insert fake function header to help gdb find the stack frame */ 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dalvik_inst, %function 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_inst: 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnstart 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY1 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY2 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnend 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */ 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */ 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for move, move-object, long-to-int */ 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB */ 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B from 15:12 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A from 11:8 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[B] 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[A]<- r2 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute next instruction 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */ 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */ 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move/from16, move-object/from16 */ 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBBBB */ 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[BBBB] 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[AA]<- r2 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */ 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */ 474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move/16, move-object/16 */ 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAAAA, vBBBB */ 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- AAAA 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[BBBB] 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[AAAA]<- r2 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */ 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE.S */ 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-wide vA, vB */ 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[A] 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- fp[B] 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r2, {r0-r1} @ fp[A]<- r0/r1 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */ 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_FROM16.S */ 505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-wide/from16 vAA, vBBBB */ 506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 1) @ r3<- BBBB 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB] 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[AA] 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB] 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r2, {r0-r1} @ fp[AA]<- r0/r1 515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */ 520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_16.S */ 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-wide/16 vAAAA, vBBBB */ 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 2) @ r3<- BBBB 524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 1) @ r2<- AAAA 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB] 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[AAAA] 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB] 528445194bc141dc67e2f678aa1bbd5e59ca66254e5Andy McFadden FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r2, {r0-r1} @ fp[AAAA]<- r0/r1 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */ 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT.S */ 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */ 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for move, move-object, long-to-int */ 539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB */ 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B from 15:12 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A from 11:8 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[B] 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[A]<- r2 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute next instruction 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */ 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */ 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */ 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move/from16, move-object/from16 */ 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBBBB */ 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[BBBB] 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[AA]<- r2 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */ 569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_16.S */ 570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */ 571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move/16, move-object/16 */ 572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAAAA, vBBBB */ 573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB 574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- AAAA 575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[BBBB] 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[AAAA]<- r2 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */ 585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */ 586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move-result, move-result-object */ 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA */ 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_retval] @ r0<- glue->retval.i 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[AA]<- r0 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */ 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_WIDE.S */ 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-result-wide vAA */ 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rGLUE, #offGlue_retval @ r3<- &glue->retval 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[AA] 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- retval.j 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r2, {r0-r1} @ fp[AA]<- r0/r1 607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */ 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */ 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */ 614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move-result, move-result-object */ 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA */ 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_retval] @ r0<- glue->retval.i 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[AA]<- r0 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */ 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_EXCEPTION.S */ 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-exception vAA */ 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offThread_exception] @ r3<- dvmGetException bypass 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 @ r1<- 0 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r3, r2) @ fp[AA]<- exception obj 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offThread_exception] @ dvmClearException bypass 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */ 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_VOID.S */ 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_returnFromMethod 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */ 648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */ 649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a 32-bit value. Copies the return value into the "glue" 651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * structure, then jumps to the return handler. 652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: return, return-object 654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA */ 656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vAA 658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA 659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_returnFromMethod 660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */ 664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_WIDE.S */ 665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a 64-bit value. Copies the return value into the "glue" 667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * structure, then jumps to the return handler. 668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* return-wide vAA */ 670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[AA] 672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rGLUE, #offGlue_retval @ r3<- &glue->retval 673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1 <- vAA/vAA+1 674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ retval<- r0/r1 675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_returnFromMethod 676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */ 680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_OBJECT.S */ 681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */ 682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a 32-bit value. Copies the return value into the "glue" 684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * structure, then jumps to the return handler. 685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: return, return-object 687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA */ 689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vAA 691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA 692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_returnFromMethod 693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_4: /* 0x12 */ 698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_4.S */ 699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/4 vA, #+B */ 700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsl #16 @ r1<- Bxxx0000 701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asr #28 @ r1<- sssssssB (sign-extended) 704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r0) @ fp[A]<- r1 707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute next instruction 708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */ 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_16.S */ 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/16 vAA, #+BBBB */ 714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r0, 1) @ r0<- ssssBBBB (sign-extended) 715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r3) @ vAA<- r0 718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */ 724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST.S */ 725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const vAA, #+BBBBbbbb */ 726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (low) 728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (high) 729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r3) @ vAA<- r0 733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */ 738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_HIGH16.S */ 739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/high16 vAA, #+BBBB0000 */ 740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- 0000BBBB (zero-extended) 741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsl #16 @ r0<- BBBB0000 743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r3) @ vAA<- r0 745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */ 751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_16.S */ 752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const-wide/16 vAA, #+BBBB */ 753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r0, 1) @ r0<- ssssBBBB (sign-extended) 754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0, asr #31 @ r1<- ssssssss 756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[AA] 758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ vAA<- r0/r1 760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */ 765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_32.S */ 766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const-wide/32 vAA, #+BBBBbbbb */ 767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- 0000bbbb (low) 768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r2, 2) @ r2<- ssssBBBB (high) 770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb 772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[AA] 773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0, asr #31 @ r1<- ssssssss 774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ vAA<- r0/r1 776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */ 781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE.S */ 782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const-wide vAA, #+HHHHhhhhBBBBbbbb */ 783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (low) 784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (low middle) 785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 3) @ r2<- hhhh (high middle) 786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word) 787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 4) @ r3<- HHHH (high) 788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word) 790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(5) @ advance rPC, load rINST 791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */ 799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_HIGH16.S */ 800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const-wide/high16 vAA, #+BBBB000000000000 */ 801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- 0000BBBB (zero-extended) 802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #0 @ r0<- 00000000 804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsl #16 @ r1<- BBBB0000 805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[AA] 807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ vAA<- r0/r1 809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */ 814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING.S */ 815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/string vAA, String@BBBB */ 816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- glue->methodClassDex 818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResStrings] @ r2<- dvmDex->pResStrings 820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- pResStrings[BBBB] 821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ not yet resolved? 822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CONST_STRING_resolve 823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */ 831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING_JUMBO.S */ 832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/string vAA, String@BBBBBBBB */ 833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (low) 834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (high) 835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- glue->methodClassDex 836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResStrings] @ r2<- dvmDex->pResStrings 838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb 839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- pResStrings[BBBB] 840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CONST_STRING_JUMBO_resolve 842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */ 850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_CLASS.S */ 851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/class vAA, Class@BBBB */ 852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- glue->methodClassDex 854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResClasses] @ r2<- dvmDex->pResClasses 856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- pResClasses[BBBB] 857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ not yet resolved? 858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CONST_CLASS_resolve 859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */ 867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_ENTER.S */ 868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Synchronize on an object. 870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* monitor-enter vAA */ 872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- vAA (object) 874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null object? 87699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project EXPORT_PC() @ need for precise GC, MONITOR_TRACKING 877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null object, throw an exception 878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmLockObject @ call(self, obj) 880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION /* implies WITH_MONITOR_TRACKING */ 881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offThread_exception] @ check for exception 883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_exceptionThrown @ exception raised, bail out 885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */ 892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_EXIT.S */ 893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlock an object. 895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Exceptions that occur when unlocking a monitor need to appear as 897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if they happened at the following instruction. See the Dalvik 898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction spec. 899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* monitor-exit vAA */ 901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ before fetch: export the PC 903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- vAA (object) 904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null object? 9056bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee beq 1f @ yes 906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmUnlockObject @ r0<- success for unlock(self, obj) 908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ before throw: advance rPC, load rINST 9106bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee beq common_exceptionThrown @ yes, exception is pending 911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9136bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee1: 9146bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee FETCH_ADVANCE_INST(1) @ advance before throw 9156bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee b common_errNullObject 916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */ 920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CHECK_CAST.S */ 921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check to see if a cast from one class to another is allowed. 923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* check-cast vAA, class@BBBB */ 925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 1) @ r2<- BBBB 927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r3) @ r9<- object 928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_methodClassDex] @ r0<- pDvmDex 929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ is object null? 930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offDvmDex_pResClasses] @ r0<- pDvmDex->pResClasses 931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CHECK_CAST_okay @ null obj, cast always succeeds 932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, r2, lsl #2] @ r1<- resolved class 933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz 934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ have we resolved this before? 935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CHECK_CAST_resolve @ not resolved, do it now 936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved: 937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, r1 @ same class (trivial success)? 938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_CHECK_CAST_fullcheck @ no, do full check 939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay: 940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */ 947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INSTANCE_OF.S */ 948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check to see if an object reference is an instance of a class. 950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Most common situation is a non-null object, being compared against 952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an already-resolved class. 953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* instance-of vA, vB, class@CCCC */ 955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB (object) 958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 @ r9<- A 959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is object null? 960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- pDvmDex 961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INSTANCE_OF_store @ null obj, not an instance, store r0 962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 1) @ r3<- CCCC 963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResClasses] @ r2<- pDvmDex->pResClasses 964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r2, r3, lsl #2] @ r1<- resolved class 965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offObject_clazz] @ r0<- obj->clazz 966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ have we resolved this before? 967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INSTANCE_OF_resolve @ not resolved, do it now 968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class 969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, r1 @ same class (trivial success)? 970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INSTANCE_OF_trivial @ yes, trivial finish 971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_INSTANCE_OF_fullcheck @ no, do full check 972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */ 976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ARRAY_LENGTH.S */ 977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the length of an array. 979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- vB (object ref) 983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is object null? 985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yup, fail 986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- array length 988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r3, r2) @ vB<- length 990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */ 995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_INSTANCE.S */ 996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new instance of a class. 998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* new-instance vAA, class@BBBB */ 1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved class 1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ req'd for init, resolve, alloc 1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_NEW_INSTANCE_resolve @ no, resolve it now 1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved: @ r0=class 1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r1, [r0, #offClassObject_status] @ r1<- ClassStatus enum 1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #CLASS_INITIALIZED @ has class been initialized? 1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_NEW_INSTANCE_needinit @ no, init class now 1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized: @ r0=class 1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #ALLOC_DONT_TRACK @ flags for alloc call 1013b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden bl dvmAllocObject @ r0<- new object 1014b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden b .LOP_NEW_INSTANCE_finish @ continue 1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */ 1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_ARRAY.S */ 1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate an array of objects, specified with the array class 1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and a count. 1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The verifier guarantees that this is an array class, so we don't 1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check for it here. 1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* new-array vA, vB, class@CCCC */ 1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 1) @ r2<- CCCC 1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r0) @ r1<- vB (array length) 1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ check length 1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r2, lsl #2] @ r0<- resolved class 1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_errNegativeArraySize @ negative length, bail 1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ req'd for resolve, alloc 1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_NEW_ARRAY_finish @ resolved, continue 1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_NEW_ARRAY_resolve @ do resolve now 1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */ 1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */ 1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new array with elements filled from registers. 1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: filled-new-array, filled-new-array/range 1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ need for resolve and alloc 1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved class 1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, rINST, lsr #8 @ r10<- AA or BA 1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_FILLED_NEW_ARRAY_continue @ yes, continue on 1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- call(clazz, ref) 1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_FILLED_NEW_ARRAY_continue 1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */ 1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */ 1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */ 1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new array with elements filled from registers. 1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: filled-new-array, filled-new-array/range 1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ need for resolve and alloc 1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved class 1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, rINST, lsr #8 @ r10<- AA or BA 1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_FILLED_NEW_ARRAY_RANGE_continue @ yes, continue on 1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- call(clazz, ref) 1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_FILLED_NEW_ARRAY_RANGE_continue 1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */ 1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILL_ARRAY_DATA.S */ 1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fill-array-data vAA, +BBBBBBBB */ 1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (lo) 1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (hi) 1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb 1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vAA (array object) 1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.) 1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC(); 1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInterpHandleFillArrayData@ fill the array with predefined data 1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ 0 means an exception is thrown 1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ has exception 1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */ 1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_THROW.S */ 1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception object in the current thread. 1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* throw vAA */ 1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- vAA (exception object) 1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 11278ba2708ea118381f2df5ca55b9bad2ae4c050504Andy McFadden EXPORT_PC() @ exception handler can throw 1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null object? 1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, throw an NPE instead 1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ bypass dvmSetException, just store it 1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offThread_exception] @ thread->exception<- obj 1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */ 1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO.S */ 1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unconditional branch, 8-bit offset. 1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The branch distance is a signed code-unit offset, which we need to 1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * double to get a byte offset. 1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* goto +AA */ 1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsl #16 @ r0<- AAxx0000 1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asr #24 @ r9<- ssssssAA (sign-extended) 1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r9, lsl #1 @ r9<- byte offset 1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */ 1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_16.S */ 1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unconditional branch, 16-bit offset. 1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The branch distance is a signed code-unit offset, which we need to 1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * double to get a byte offset. 1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* goto/16 +AAAA */ 1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r0, 1) @ r0<- ssssAAAA (sign-extended) 1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asl #1 @ r9<- byte offset, check sign 1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1183ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */ 1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_32.S */ 1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unconditional branch, 32-bit offset. 1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The branch distance is a signed code-unit offset, which we need to 1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * double to get a byte offset. 1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlike most opcodes, this one is allowed to branch to itself, so 1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * our "backward branch" test must be "<=0" instead of "<0". The ORRS 1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction doesn't affect the V flag, so we need to clear it 1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * explicitly. 1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* goto/32 +AAAAAAAA */ 1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- aaaa (lo) 1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- AAAA (hi) 1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp ip, ip @ (clear V flag during stall) 1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs r0, r0, r1, lsl #16 @ r0<- AAAAaaaa, check sign 1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r0, asl #1 @ r9<- byte offset 1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ble common_backwardBranch @ backward branch, do periodic checks 1211ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1212ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1215ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */ 1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */ 1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a packed-switch or sparse-switch instruction. In both cases 1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * we decode it and hand it off to a helper function. 1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't really expect backward branches in a switch statement, but 1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * they're perfectly legal, so we check for them here. 1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: packed-switch, sparse-switch 1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, +BBBB */ 1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (lo) 1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (hi) 1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vAA 1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2 1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInterpHandlePackedSwitch @ r0<- code-unit branch offset 1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asl #1 @ r9<- branch byte offset, check sign 1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_backwardBranch @ (want to use BLE but V is unknown) 1248ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1249ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1254ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */ 1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPARSE_SWITCH.S */ 1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */ 1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a packed-switch or sparse-switch instruction. In both cases 1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * we decode it and hand it off to a helper function. 1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't really expect backward branches in a switch statement, but 1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * they're perfectly legal, so we check for them here. 1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: packed-switch, sparse-switch 1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, +BBBB */ 1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (lo) 1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (hi) 1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vAA 1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2 1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInterpHandleSparseSwitch @ r0<- code-unit branch offset 1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asl #1 @ r9<- branch byte offset, check sign 1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_backwardBranch @ (want to use BLE but V is unknown) 1286ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1287ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1289ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1290ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1293ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1295ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1297ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */ 1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */ 1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two floating-point values. Puts 0, 1, or -1 into the 1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destination register based on the results of the comparison. 1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on what value we'd like to return when one of the operands is NaN. 1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The operation we're implementing is: 1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if (x == y) 1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return 0; 1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else if (x < y) 1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return -1; 1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else if (x > y) 1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return 1; 1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else 1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return {-1,1}; // one or both operands was NaN 1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The straightforward implementation requires 3 calls to functions 1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that return a result in r0. We can do it with two calls if our 1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EABI library supports __aeabi_cfcmple (only one if we want to check 1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for NaN directly): 1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check x <= y 1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if <, return -1 1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if ==, return 0 1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check y <= x 1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if <, return 1 1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return {-1,1} 1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: cmpl-float, cmpg-float 1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r2) @ r9<- vBB 1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r10, r3) @ r10<- vCC 1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ copy to arg registers 1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cfcmple @ cmp <=: C clear if <, Z set if eq 1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMPL_FLOAT_gt_or_nan @ C set and Z clear, disambiguate 1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvncc r1, #0 @ (less than) r1<- -1 1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ (equal) r1<- 0, trumps less than 1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish: 1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */ 1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_FLOAT.S */ 1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */ 1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two floating-point values. Puts 0, 1, or -1 into the 1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destination register based on the results of the comparison. 1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on what value we'd like to return when one of the operands is NaN. 1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The operation we're implementing is: 1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if (x == y) 1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return 0; 1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else if (x < y) 1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return -1; 1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else if (x > y) 1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return 1; 1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else 1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return {-1,1}; // one or both operands was NaN 1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The straightforward implementation requires 3 calls to functions 1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that return a result in r0. We can do it with two calls if our 1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EABI library supports __aeabi_cfcmple (only one if we want to check 1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for NaN directly): 1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check x <= y 1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if <, return -1 1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if ==, return 0 1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check y <= x 1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if <, return 1 1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return {-1,1} 1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: cmpl-float, cmpg-float 1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r2) @ r9<- vBB 1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r10, r3) @ r10<- vCC 1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ copy to arg registers 1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cfcmple @ cmp <=: C clear if <, Z set if eq 1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMPG_FLOAT_gt_or_nan @ C set and Z clear, disambiguate 1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvncc r1, #0 @ (less than) r1<- -1 1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ (equal) r1<- 0, trumps less than 1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish: 1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */ 1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */ 1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two floating-point values. Puts 0, 1, or -1 into the 1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destination register based on the results of the comparison. 1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on what value we'd like to return when one of the operands is NaN. 1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See OP_CMPL_FLOAT for an explanation. 1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: cmpl-double, cmpg-double 1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r0, #255 @ r9<- BB 1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, r0, lsr #8 @ r10<- CC 1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[BB] 1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, rFP, r10, lsl #2 @ r10<- &fp[CC] 1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vBB/vBB+1 1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r10, {r2-r3} @ r2/r3<- vCC/vCC+1 1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cdcmple @ cmp <=: C clear if <, Z set if eq 1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMPL_DOUBLE_gt_or_nan @ C set and Z clear, disambiguate 1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvncc r1, #0 @ (less than) r1<- -1 1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ (equal) r1<- 0, trumps less than 1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish: 1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */ 1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_DOUBLE.S */ 1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */ 1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two floating-point values. Puts 0, 1, or -1 into the 1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destination register based on the results of the comparison. 1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on what value we'd like to return when one of the operands is NaN. 1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See OP_CMPL_FLOAT for an explanation. 1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: cmpl-double, cmpg-double 1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r0, #255 @ r9<- BB 1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, r0, lsr #8 @ r10<- CC 1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[BB] 1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, rFP, r10, lsl #2 @ r10<- &fp[CC] 1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vBB/vBB+1 1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r10, {r2-r3} @ r2/r3<- vCC/vCC+1 1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cdcmple @ cmp <=: C clear if <, Z set if eq 1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMPG_DOUBLE_gt_or_nan @ C set and Z clear, disambiguate 1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvncc r1, #0 @ (less than) r1<- -1 1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ (equal) r1<- 0, trumps less than 1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish: 1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */ 1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMP_LONG.S */ 1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two 64-bit values. Puts 0, 1, or -1 into the destination 1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * register based on the results of the comparison. 1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We load the full values with LDM, but in practice many values could 1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be resolved by only looking at the high word. This could be made 1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * faster or slower by splitting the LDM into a pair of LDRs. 1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If we just wanted to set condition flags, we could do this: 1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * subs ip, r0, r2 1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sbcs ip, r1, r3 1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * subeqs ip, r0, r2 1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific 1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * integer value, which we can do with 2 conditional mov/mvn instructions 1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (set 1, set -1; if they're equal we already have 0 in ip), giving 1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * us a constant 5-cycle path plus a branch at the end to the 1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction epilogue code. The multi-compare approach below needs 1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch 1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the worst case (the 64-bit values are equal). 1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* cmp-long vAA, vBB, vCC */ 1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare (vBB+1, vCC+1) 1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blt .LOP_CMP_LONG_less @ signed compare on high part 1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bgt .LOP_CMP_LONG_greater 1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r1, r0, r2 @ r1<- r0 - r2 1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMP_LONG_greater @ unsigned compare on low part 1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_CMP_LONG_less 1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMP_LONG_finish @ equal; r1 already holds 0 1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */ 1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQ.S */ 1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ branch to 1 if comparison failed 1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1543ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1544ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1545ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1546ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1547ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1548ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1549ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1552ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */ 1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NE.S */ 1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ branch to 1 if comparison failed 1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1579ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1580ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1581ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1582ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1583ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1584ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1585ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1588ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */ 1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LT.S */ 1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bge 1f @ branch to 1 if comparison failed 1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1616ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1617ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1618ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1619ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1620ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1621ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1624ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */ 1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GE.S */ 1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blt 1f @ branch to 1 if comparison failed 1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1651ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1652ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1653ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1654ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1655ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1656ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1657ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1660ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */ 1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GT.S */ 1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ble 1f @ branch to 1 if comparison failed 1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1687ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1688ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1689ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1690ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1691ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1692ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1693ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1696ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */ 1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LE.S */ 1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bgt 1f @ branch to 1 if comparison failed 1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1724ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1725ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1726ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1727ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1728ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1729ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1732ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */ 1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQZ.S */ 1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ branch to 1 if comparison failed 1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1756ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1757ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1758ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1759ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1760ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1761ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1764ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1765ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1766ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1767ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1768ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */ 1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NEZ.S */ 1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ branch to 1 if comparison failed 1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1792ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1793ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1794ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1795ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1796ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1797ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1800ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1801ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1802ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1803ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1804ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */ 1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LTZ.S */ 1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bge 1f @ branch to 1 if comparison failed 1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1828ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1829ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1830ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1831ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1832ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1833ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1836ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1837ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1838ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1839ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1840ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */ 1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GEZ.S */ 1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blt 1f @ branch to 1 if comparison failed 1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1864ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1865ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1866ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1867ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1868ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1869ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1870ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1871ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1872ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1873ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1876ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */ 1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GTZ.S */ 1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ble 1f @ branch to 1 if comparison failed 1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1900ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1901ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1902ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1903ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1904ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1905ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1906ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1907ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1908ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1909ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1912ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */ 1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LEZ.S */ 1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bgt 1f @ branch to 1 if comparison failed 1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1936ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1937ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1938ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1939ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1940ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1941ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1944ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1945ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1946ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1947ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1948ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */ 1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3E.S */ 1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */ 1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3F.S */ 1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */ 1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_40.S */ 1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */ 1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_41.S */ 1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */ 1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_42.S */ 1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */ 1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_43.S */ 1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */ 2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width 2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */ 2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_WIDE.S */ 2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 64 bits. vAA <- vBB[vCC]. 2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD. 2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* aget-wide vAA, vBB, vCC */ 2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width 2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_AGET_WIDE_finish @ okay, continue below 2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errArrayIndex @ index >= length, bail 2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ May want to swap the order of these two branches depending on how the 2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ branch prediction (if any) handles conditional forward branches vs. 2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ unconditional forward branches. 2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */ 2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_OBJECT.S */ 2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width 2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */ 2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BOOLEAN.S */ 2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */ 2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BYTE.S */ 2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrsb r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */ 2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_CHAR.S */ 2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */ 2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_SHORT.S */ 2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrsh r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */ 2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width 2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */ 2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_WIDE.S */ 2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 64 bits. vBB[vCC] <- vAA. 2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Arrays of long/double are 64-bit aligned, so it's okay to use STRD. 2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* aput-wide vAA, vBB, vCC */ 2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width 2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_APUT_WIDE_finish @ okay, continue below 2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errArrayIndex @ index >= length, bail 2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ May want to swap the order of these two branches depending on how the 2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ branch prediction (if any) handles conditional forward branches vs. 2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ unconditional forward branches. 2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */ 2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_OBJECT.S */ 2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Store an object into an array. vBB[vCC] <- vAA. 2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 2289d82097f6b409c5cd48568e54eb701604c3cceb18buzbee GET_VREG(rINST, r2) @ rINST<- vBB (array object) 2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vCC (requested index) 2291d82097f6b409c5cd48568e54eb701604c3cceb18buzbee cmp rINST, #0 @ null array object? 2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r9) @ r9<- vAA 2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2294d82097f6b409c5cd48568e54eb701604c3cceb18buzbee ldr r3, [rINST, #offArrayObject_length] @ r3<- arrayObj->length 2295d82097f6b409c5cd48568e54eb701604c3cceb18buzbee add r10, rINST, r0, lsl #2 @ r10<- arrayObj + index*width 2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, r3 @ compare unsigned index, length 2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_APUT_OBJECT_finish @ we're okay, continue on 2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errArrayIndex @ index >= length, bail 2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */ 2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BOOLEAN.S */ 2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strb r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */ 2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BYTE.S */ 2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strb r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */ 2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_CHAR.S */ 2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strh r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */ 2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_SHORT.S */ 2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strh r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */ 2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_finish @ no, already resolved 2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_finish 2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */ 2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE.S */ 2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Wide 32-bit instance field get. 2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* iget-wide vA, vB, field@CCCC */ 2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields 2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_WIDE_finish @ no, already resolved 2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_WIDE_finish 2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */ 2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT.S */ 2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_OBJECT_finish @ no, already resolved 2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_OBJECT_finish 2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */ 2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BOOLEAN.S */ 2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" } 2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_BOOLEAN_finish @ no, already resolved 2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_BOOLEAN_finish 2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */ 2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BYTE.S */ 2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" } 2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_BYTE_finish @ no, already resolved 2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_BYTE_finish 2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */ 2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_CHAR.S */ 2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" } 2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_CHAR_finish @ no, already resolved 2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_CHAR_finish 2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */ 2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_SHORT.S */ 2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" } 2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_SHORT_finish @ no, already resolved 2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_SHORT_finish 2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */ 2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2630919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: iput, iput-boolean, iput-byte, iput-char, iput-short 2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_finish @ no, already resolved 2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_finish @ yes, finish up 2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */ 2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE.S */ 2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* iput-wide vA, vB, field@CCCC */ 2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields 2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_WIDE_finish @ no, already resolved 2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_WIDE_finish @ yes, finish up 2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */ 2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT.S */ 2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2675919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * 32-bit instance field put. 2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2677919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: iput-object, iput-object-volatile 2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_OBJECT_finish @ no, already resolved 2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_OBJECT_finish @ yes, finish up 2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */ 2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BOOLEAN.S */ 2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" } 2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2705919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: iput, iput-boolean, iput-byte, iput-char, iput-short 2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_BOOLEAN_finish @ no, already resolved 2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_BOOLEAN_finish @ yes, finish up 2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */ 2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BYTE.S */ 2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" } 2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2734919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: iput, iput-boolean, iput-byte, iput-char, iput-short 2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_BYTE_finish @ no, already resolved 2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_BYTE_finish @ yes, finish up 2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */ 2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_CHAR.S */ 2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" } 2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2763919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: iput, iput-boolean, iput-byte, iput-char, iput-short 2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_CHAR_finish @ no, already resolved 2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_CHAR_finish @ yes, finish up 2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */ 2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_SHORT.S */ 2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" } 2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2792919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: iput, iput-boolean, iput-byte, iput-char, iput-short 2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_SHORT_finish @ no, already resolved 2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_SHORT_finish @ yes, finish up 2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */ 2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_resolve @ yes, do resolve 2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish: @ field ptr in r0 2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 28300890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */ 2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_WIDE.S */ 2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64-bit SGET handler. 2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* sget-wide vAA, field@BBBB */ 2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_WIDE_resolve @ yes, do resolve 2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish: 2852861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r9, rINST, lsr #8 @ r9<- AA 2853861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .if 0 2854861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r0, r0, #offStaticField_value @ r0<- pointer to data 28556e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field 2856861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 2857861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned) 2858861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 2859861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2861861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */ 2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_OBJECT.S */ 2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_OBJECT_resolve @ yes, do resolve 2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish: @ field ptr in r0 2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 28840890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */ 2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BOOLEAN.S */ 2896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_BOOLEAN_resolve @ yes, do resolve 2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish: @ field ptr in r0 2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 29110890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */ 2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BYTE.S */ 2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_BYTE_resolve @ yes, do resolve 2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish: @ field ptr in r0 2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 29380890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */ 2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_CHAR.S */ 2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_CHAR_resolve @ yes, do resolve 2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish: @ field ptr in r0 2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 29650890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */ 2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_SHORT.S */ 2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_SHORT_resolve @ yes, do resolve 2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish: @ field ptr in r0 2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 29920890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */ 3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3007919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: sput, sput-boolean, sput-byte, sput-char, sput-short 3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_resolve @ yes, do resolve 3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish: @ field ptr in r0 3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 30210890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */ 3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_WIDE.S */ 3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64-bit SPUT handler. 3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* sput-wide vAA, field@BBBB */ 3033861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r0, [rGLUE, #offGlue_methodClassDex] @ r0<- DvmDex 3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3035861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields 3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 3037861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r2, [r0, r1, lsl #2] @ r2<- resolved StaticField ptr 3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 3039861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden cmp r2, #0 @ is resolved entry null? 3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_WIDE_resolve @ yes, do resolve 3041861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9 3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3043861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 3044861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GET_INST_OPCODE(r10) @ extract opcode from rINST 3045861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .if 0 3046861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r2, r2, #offStaticField_value @ r2<- pointer to data 30476e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 3048861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 3049861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden strd r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1 3050861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 3051861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GOTO_OPCODE(r10) @ jump to next instruction 3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */ 3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_OBJECT.S */ 3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3058919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * 32-bit SPUT handler for objects 3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3060919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: sput-object, sput-object-volatile 3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3068919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee bne .LOP_SPUT_OBJECT_finish @ no, continue 3069b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee ldr r9, [rGLUE, #offGlue_method] @ r9<- current method 3070919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee EXPORT_PC() @ resolve() could throw, so export now 3071d82097f6b409c5cd48568e54eb701604c3cceb18buzbee ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz 3072919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee bl dvmResolveStaticField @ r0<- resolved StaticField ptr 3073919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r0, #0 @ success? 3074919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee bne .LOP_SPUT_OBJECT_finish @ yes, finish 3075919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee b common_exceptionThrown @ no, handle exception 3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */ 3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BOOLEAN.S */ 3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3086919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: sput, sput-boolean, sput-byte, sput-char, sput-short 3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_BOOLEAN_resolve @ yes, do resolve 3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish: @ field ptr in r0 3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 31000890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */ 3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BYTE.S */ 3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3113919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: sput, sput-boolean, sput-byte, sput-char, sput-short 3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_BYTE_resolve @ yes, do resolve 3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish: @ field ptr in r0 3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 31270890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */ 3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_CHAR.S */ 3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3140919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: sput, sput-boolean, sput-byte, sput-char, sput-short 3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_CHAR_resolve @ yes, do resolve 3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish: @ field ptr in r0 3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 31540890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */ 3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_SHORT.S */ 3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3167919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: sput, sput-boolean, sput-byte, sput-char, sput-short 3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_SHORT_resolve @ yes, do resolve 3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish: @ field ptr in r0 3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 31810890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */ 3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */ 3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a virtual method call. 3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-virtual, invoke-virtual/range 3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved baseMethod 3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_VIRTUAL_continue @ yes, continue on 3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_VIRTUAL @ resolver method type 3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_VIRTUAL_continue @ no, continue 3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */ 3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */ 3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a "super" method call. 3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-super, invoke-super/range 3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr 3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved baseMethod 3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ null "this"? 3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [rGLUE, #offGlue_method] @ r9<- current method 3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [r9, #offMethod_clazz] @ r9<- method->clazz 3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_SUPER_continue @ resolved, continue on 3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_INVOKE_SUPER_resolve @ do resolve now 3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */ 3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */ 3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a direct method call. 3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (We could defer the "is 'this' pointer null" test to the common 3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method invocation code, and use a flag to indicate that static 3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * calls don't count. If we do this as part of copying the arguments 3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out we could avoiding loading the first arg twice.) 3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-direct, invoke-direct/range 3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved methodToCall 3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr 3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INVOKE_DIRECT_resolve @ not resolved, do it now 3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish: 3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ null "this" ref? 3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodNoRange @ no, continue on 3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errNullObject @ yes, throw exception 3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */ 3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */ 3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a static method call. 3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-static, invoke-static/range 3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved methodToCall 3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodNoRange @ yes, continue on 3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_STATIC @ resolver method type 3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodNoRange @ no, continue 3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */ 3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */ 3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an interface method call. 3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-interface, invoke-interface/range 3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 2) @ r2<- FEDC or CCCC 3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- C (or stays CCCC) 3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- first arg ("this") 3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- methodClassDex 3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null obj? 3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- method 3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, fail 3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offObject_clazz] @ r0<- thisPtr->clazz 3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex) 3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 3330de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro b common_invokeMethodNoRange @ jump to common handler 3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */ 3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_73.S */ 3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */ 3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */ 3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */ 3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a virtual method call. 3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-virtual, invoke-virtual/range 3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved baseMethod 3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_VIRTUAL_RANGE_continue @ yes, continue on 3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_VIRTUAL @ resolver method type 3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_VIRTUAL_RANGE_continue @ no, continue 3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */ 3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */ 3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */ 3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a "super" method call. 3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-super, invoke-super/range 3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr 3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved baseMethod 3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ null "this"? 3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [rGLUE, #offGlue_method] @ r9<- current method 3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [r9, #offMethod_clazz] @ r9<- method->clazz 3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_SUPER_RANGE_continue @ resolved, continue on 3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_INVOKE_SUPER_RANGE_resolve @ do resolve now 3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */ 3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */ 3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */ 3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a direct method call. 3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (We could defer the "is 'this' pointer null" test to the common 3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method invocation code, and use a flag to indicate that static 3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * calls don't count. If we do this as part of copying the arguments 3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out we could avoiding loading the first arg twice.) 3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-direct, invoke-direct/range 3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved methodToCall 3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr 3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INVOKE_DIRECT_RANGE_resolve @ not resolved, do it now 3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish: 3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ null "this" ref? 3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodRange @ no, continue on 3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errNullObject @ yes, throw exception 3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */ 3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */ 3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */ 3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a static method call. 3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-static, invoke-static/range 3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved methodToCall 3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodRange @ yes, continue on 3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_STATIC @ resolver method type 3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodRange @ no, continue 3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */ 3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */ 3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */ 3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an interface method call. 3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-interface, invoke-interface/range 3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 2) @ r2<- FEDC or CCCC 3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- C (or stays CCCC) 3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- first arg ("this") 3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- methodClassDex 3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null obj? 3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- method 3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, fail 3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offObject_clazz] @ r0<- thisPtr->clazz 3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex) 3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 3493de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro b common_invokeMethodRange @ jump to common handler 3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */ 3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_79.S */ 3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */ 3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_7A.S */ 3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */ 3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_INT.S */ 3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, #0 @ r0<- op, r0-r3 changed 3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */ 3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_INT.S */ 3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r0, r0 @ r0<- op, r0-r3 changed 3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */ 3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_LONG.S */ 3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsbs r0, r0, #0 @ optional op; may set condition codes 3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed 3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */ 3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_LONG.S */ 3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r0, r0 @ optional op; may set condition codes 3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, r1 @ r0/r1<- op, r2-r3 changed 3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */ 3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_FLOAT.S */ 3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed 3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */ 3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_DOUBLE.S */ 3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed 3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */ 3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_LONG.S */ 3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */ 3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0", where 3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 64-bit quantity in r0/r1. 3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: int-to-long, int-to-double, float-to-long, float-to-double 3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0, asr #31 @ r0<- op, r0-r3 changed 3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */ 3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_FLOAT.S */ 3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_i2f @ r0<- op, r0-r3 changed 3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */ 3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_DOUBLE.S */ 3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */ 3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0", where 3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 64-bit quantity in r0/r1. 3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: int-to-long, int-to-double, float-to-long, float-to-double 3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_i2d @ r0<- op, r0-r3 changed 3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */ 3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_INT.S */ 3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */ 3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */ 3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for move, move-object, long-to-int */ 3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB */ 3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B from 15:12 3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A from 11:8 3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[B] 3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[A]<- r2 3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute next instruction 3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */ 3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_FLOAT.S */ 3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */ 3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64bit-to-32bit unary operation. Provide an "instr" line 3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0/r1", where 3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 32-bit quantity in r0. 3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: long-to-float, double-to-int, double-to-float 3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (This would work for long-to-int, but that instruction is actually 3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an exact match for OP_MOVE.) 3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1 3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_l2f @ r0<- op, r0-r3 changed 3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */ 3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_DOUBLE.S */ 3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_l2d @ r0/r1<- op, r2-r3 changed 3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */ 3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_INT.S */ 3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */ 3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_f2iz @ r0<- op, r0-r3 changed 3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unop.S" {"instr":"bl f2i_doconv"} 3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break 3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to an int in r0. 3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification. The 3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2i_doconv: 3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, lr} 3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0x4f000000 @ (float)maxint 3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r4, r0 3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpge @ is arg >= maxint? 3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r0, #0x80000000 @ return maxint (7fffffff) 3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmnefd sp!, {r4, pc} 3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0xcf000000 @ (float)minint 3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmple @ is arg <= minint? 3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0x80000000 @ return minint (80000000) 3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmnefd sp!, {r4, pc} 3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r4 3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpeq @ is arg == self? 3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmeqfd sp!, {r4, pc} @ return zero for NaN 3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_f2iz @ convert float to int 3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, pc} 3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */ 3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_LONG.S */ 3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWider.S" {"instr":"bl __aeabi_f2lz"} 3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */ 3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0", where 3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 64-bit quantity in r0/r1. 3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: int-to-long, int-to-double, float-to-long, float-to-double 3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl f2l_doconv @ r0<- op, r0-r3 changed 3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */ 3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */ 3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */ 3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0", where 3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 64-bit quantity in r0/r1. 3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: int-to-long, int-to-double, float-to-long, float-to-double 3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_f2d @ r0<- op, r0-r3 changed 3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */ 3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_INT.S */ 3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */ 3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */ 3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64bit-to-32bit unary operation. Provide an "instr" line 3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0/r1", where 3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 32-bit quantity in r0. 3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: long-to-float, double-to-int, double-to-float 3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (This would work for long-to-int, but that instruction is actually 3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an exact match for OP_MOVE.) 3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1 3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2iz @ r0<- op, r0-r3 changed 3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopNarrower.S" {"instr":"bl d2i_doconv"} 3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break 3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to an int in r0. 3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification. The 3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2i_doconv: 3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, r5, lr} @ save regs 39985162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0x80000000 @ maxint, as a double (low word) 39995162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, r2, asr #9 @ 0xffc00000 4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #4 @ align for EABI 40015162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mvn r3, #0xbe000000 @ maxint, as a double (high word) 40025162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden sub r3, r3, #0x00200000 @ 0x41dfffff 40035162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r4, r0 @ save a copy of r0 4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r5, r1 @ and r1 4005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpge @ is arg >= maxint? 4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 40075162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mvnne r0, #0x80000000 @ return maxint (0x7fffffff) 4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 40125162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0xc1000000 @ minint, as a double (high word) 40135162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, r3, #0x00e00000 @ 0xc1e00000 40145162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ minint, as a double (low word) 4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmple @ is arg <= minint? 4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0x80000000 @ return minint (80000000) 4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r4 @ compare against self 4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r5 4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpeq @ is arg == self? 4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ return zero for NaN 4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2iz @ convert double to int 4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #4 4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, r5, pc} 4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */ 4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_LONG.S */ 4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWide.S" {"instr":"bl __aeabi_d2lz"} 4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 4046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 4047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl d2l_doconv @ r0/r1<- op, r2-r3 changed 4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */ 4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */ 4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */ 4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64bit-to-32bit unary operation. Provide an "instr" line 4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0/r1", where 4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 32-bit quantity in r0. 4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: long-to-float, double-to-int, double-to-float 4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (This would work for long-to-int, but that instruction is actually 4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an exact match for OP_MOVE.) 4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1 4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2f @ r0<- op, r0-r3 changed 4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */ 4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_BYTE.S */ 4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl #24 @ optional op; may set condition codes 4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr #24 @ r0<- op, r0-r3 changed 4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */ 4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_CHAR.S */ 4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl #16 @ optional op; may set condition codes 4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr #16 @ r0<- op, r0-r3 changed 4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */ 4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_SHORT.S */ 4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl #16 @ optional op; may set condition codes 4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr #16 @ r0<- op, r0-r3 changed 4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */ 4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT.S */ 4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1 @ r0<- op, r0-r3 changed 4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */ 4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT.S */ 4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r0, r0, r1 @ r0<- op, r0-r3 changed 4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */ 4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT.S */ 4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul r0, r1, r0 @ r0<- op, r0-r3 changed 4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */ 4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT.S */ 4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idiv @ r0<- op, r0-r3 changed 4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */ 4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT.S */ 4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */ 4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idivmod @ r1<- op, r0-r3 changed 4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */ 4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT.S */ 4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r1 @ r0<- op, r0-r3 changed 4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */ 4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT.S */ 4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1 @ r0<- op, r0-r3 changed 4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */ 4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT.S */ 4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r1 @ r0<- op, r0-r3 changed 4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */ 4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT.S */ 4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */ 4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT.S */ 4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */ 4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT.S */ 4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */ 4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG.S */ 4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adds r0, r0, r2 @ optional op; may set condition codes 4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adc r1, r1, r3 @ result<- op, r0-r3 changed 4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */ 4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG.S */ 4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r0, r0, r2 @ optional op; may set condition codes 4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sbc r1, r1, r3 @ result<- op, r0-r3 changed 4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */ 4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG.S */ 4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Signed 64-bit integer multiply. 4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Consider WXxYZ (r1r0 x r3r2) with a long multiply: 4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WX 4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * x YZ 4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * -------- 4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ZW ZX 4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * YW YX 4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The low word of the result holds ZX, the high word holds 4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because 4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it doesn't fit in the low 64 bits. 4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlike most ARM math operations, multiply instructions have 4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * restrictions on using the same register more than once (Rd and Rm 4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * cannot be the same). 4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* mul-long vAA, vBB, vCC */ 4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul ip, r2, r1 @ ip<- ZxW 4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project umull r9, r10, r2, r0 @ r9/r10 <- ZxX 4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mla r2, r0, r3, ip @ r2<- YxX + (ZxW) 4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX)) 4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, rFP, r0, lsl #2 @ r0<- &fp[AA] 4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_MUL_LONG_finish 4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */ 4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG.S */ 4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ldivmod @ result<- op, r0-r3 changed 4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */ 4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG.S */ 4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */ 4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ldivmod @ result<- op, r0-r3 changed 4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3 4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */ 4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG.S */ 4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r2 @ optional op; may set condition codes 4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, r3 @ result<- op, r0-r3 changed 4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */ 4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG.S */ 4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r2 @ optional op; may set condition codes 4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r1, r3 @ result<- op, r0-r3 changed 4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */ 4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG.S */ 4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r2 @ optional op; may set condition codes 4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r1, r1, r3 @ result<- op, r0-r3 changed 4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */ 4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG.S */ 4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift. This is different from the generic 32/64-bit 4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * binary operations because vAA/vBB are 64-bit but vCC (the shift 4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distance) is 32-bit. Also, Dalvik requires us to mask off the low 4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6 bits of the shift distance. 4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shl-long vAA, vBB, vCC */ 4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r0, #255 @ r3<- BB 4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr #8 @ r0<- CC 4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BB] 4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vCC 4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r2<- r2 & 0x3f 4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asl r2 @ r1<- r1 << r2 5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2)) 5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32) 5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_SHL_LONG_finish 5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */ 5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG.S */ 5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift. This is different from the generic 32/64-bit 5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * binary operations because vAA/vBB are 64-bit but vCC (the shift 5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distance) is 32-bit. Also, Dalvik requires us to mask off the low 5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6 bits of the shift distance. 5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shr-long vAA, vBB, vCC */ 5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r0, #255 @ r3<- BB 5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr #8 @ r0<- CC 5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BB] 5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vCC 5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r0<- r0 & 0x3f 5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r2 @ r0<- r2 >> r2 5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32) 5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_SHR_LONG_finish 5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */ 5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG.S */ 5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift. This is different from the generic 32/64-bit 5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * binary operations because vAA/vBB are 64-bit but vCC (the shift 5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distance) is 32-bit. Also, Dalvik requires us to mask off the low 5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6 bits of the shift distance. 5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* ushr-long vAA, vBB, vCC */ 5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r0, #255 @ r3<- BB 5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr #8 @ r0<- CC 5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BB] 5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vCC 5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r0<- r0 & 0x3f 5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r2 @ r0<- r2 >> r2 5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32) 5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_USHR_LONG_finish 5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */ 5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT.S */ 5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fadd @ r0<- op, r0-r3 changed 5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */ 5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT.S */ 5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fsub @ r0<- op, r0-r3 changed 5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */ 5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT.S */ 5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fmul @ r0<- op, r0-r3 changed 5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */ 5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT.S */ 5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fdiv @ r0<- op, r0-r3 changed 5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */ 5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT.S */ 5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */ 5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl fmodf @ r0<- op, r0-r3 changed 5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */ 5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE.S */ 5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dadd @ result<- op, r0-r3 changed 5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */ 5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE.S */ 5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dsub @ result<- op, r0-r3 changed 5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */ 5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE.S */ 5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dmul @ result<- op, r0-r3 changed 5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */ 5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE.S */ 5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ddiv @ result<- op, r0-r3 changed 5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */ 5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE.S */ 5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */ 5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl fmod @ result<- op, r0-r3 changed 5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */ 5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_2ADDR.S */ 5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5517a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1 @ r0<- op, r0-r3 changed 5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */ 5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT_2ADDR.S */ 5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5556a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r0, r0, r1 @ r0<- op, r0-r3 changed 5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */ 5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_2ADDR.S */ 5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5596a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul r0, r1, r0 @ r0<- op, r0-r3 changed 5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */ 5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_2ADDR.S */ 5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5635a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idiv @ r0<- op, r0-r3 changed 5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */ 5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_2ADDR.S */ 5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */ 5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5675a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idivmod @ r1<- op, r0-r3 changed 5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */ 5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_2ADDR.S */ 5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5714a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r1 @ r0<- op, r0-r3 changed 5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */ 5732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_2ADDR.S */ 5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5753a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1 @ r0<- op, r0-r3 changed 5762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */ 5771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_2ADDR.S */ 5772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5792a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r1 @ r0<- op, r0-r3 changed 5801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */ 5810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_2ADDR.S */ 5811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5831a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 5839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 5840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */ 5849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_2ADDR.S */ 5850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5870a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */ 5888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_2ADDR.S */ 5889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5909a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */ 5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG_2ADDR.S */ 5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adds r0, r0, r2 @ optional op; may set condition codes 5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adc r1, r1, r3 @ result<- op, r0-r3 changed 5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */ 5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG_2ADDR.S */ 5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r0, r0, r2 @ optional op; may set condition codes 5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sbc r1, r1, r3 @ result<- op, r0-r3 changed 6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */ 6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG_2ADDR.S */ 6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Signed 64-bit integer multiply, "/2addr" version. 6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See OP_MUL_LONG for an explanation. 6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We get a little tight on registers, so to avoid looking up &fp[A] 6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * again we stuff it into rINST. 6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* mul-long/2addr vA, vB */ 6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A] 6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1 6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul ip, r2, r1 @ ip<- ZxW 6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project umull r9, r10, r2, r0 @ r9/r10 <- ZxX 6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mla r2, r0, r3, ip @ r2<- YxX + (ZxW) 6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST @ r0<- &fp[A] (free up rINST) 6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX)) 6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10 6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */ 6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG_2ADDR.S */ 6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ldivmod @ result<- op, r0-r3 changed 6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */ 6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG_2ADDR.S */ 6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */ 6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ldivmod @ result<- op, r0-r3 changed 6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3 6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */ 6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG_2ADDR.S */ 6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r2 @ optional op; may set condition codes 6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, r3 @ result<- op, r0-r3 changed 6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */ 6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG_2ADDR.S */ 6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r2 @ optional op; may set condition codes 6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r1, r3 @ result<- op, r0-r3 changed 6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */ 6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG_2ADDR.S */ 6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r2 @ optional op; may set condition codes 6235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r1, r1, r3 @ result<- op, r0-r3 changed 6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */ 6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG_2ADDR.S */ 6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32-bit shift distance. 6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shl-long/2addr vA, vB */ 6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vB 6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r2<- r2 & 0x3f 6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asl r2 @ r1<- r1 << r2 6260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 6261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2)) 6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32) 6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r2 @ r0<- r0 << r2 6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_SHL_LONG_2ADDR_finish 6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */ 6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG_2ADDR.S */ 6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 6274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32-bit shift distance. 6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shr-long/2addr vA, vB */ 6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vB 6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r2<- r2 & 0x3f 6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r2 @ r0<- r2 >> r2 6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32) 6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asr r2 @ r1<- r1 >> r2 6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_SHR_LONG_2ADDR_finish 6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */ 6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG_2ADDR.S */ 6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32-bit shift distance. 6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* ushr-long/2addr vA, vB */ 6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vB 6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r2<- r2 & 0x3f 6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r2 @ r0<- r2 >> r2 6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 6313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32) 6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr r2 @ r1<- r1 >>> r2 6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_USHR_LONG_2ADDR_finish 6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */ 6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */ 6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6344a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fadd @ r0<- op, r0-r3 changed 6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */ 6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */ 6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6383a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fsub @ r0<- op, r0-r3 changed 6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */ 6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */ 6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6422a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fmul @ r0<- op, r0-r3 changed 6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */ 6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */ 6441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6461a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fdiv @ r0<- op, r0-r3 changed 6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */ 6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT_2ADDR.S */ 6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */ 6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6501a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl fmodf @ r0<- op, r0-r3 changed 6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */ 6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */ 6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dadd @ result<- op, r0-r3 changed 6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */ 6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */ 6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dsub @ result<- op, r0-r3 changed 6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */ 6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */ 6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dmul @ result<- op, r0-r3 changed 6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */ 6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */ 6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ddiv @ result<- op, r0-r3 changed 6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */ 6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */ 6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */ 6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl fmod @ result<- op, r0-r3 changed 6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */ 6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT16.S */ 6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1 @ r0<- op, r0-r3 changed 6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */ 6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT.S */ 6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */ 6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, r1 @ r0<- op, r0-r3 changed 6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */ 6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT16.S */ 6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul r0, r1, r0 @ r0<- op, r0-r3 changed 6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */ 6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT16.S */ 6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idiv @ r0<- op, r0-r3 changed 6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */ 6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT16.S */ 6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */ 6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idivmod @ r1<- op, r0-r3 changed 6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */ 6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT16.S */ 6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r1 @ r0<- op, r0-r3 changed 6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */ 6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT16.S */ 6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1 @ r0<- op, r0-r3 changed 6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */ 6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT16.S */ 6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r1 @ r0<- op, r0-r3 changed 7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */ 7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT8.S */ 7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1 @ r0<- op, r0-r3 changed 7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */ 7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT_LIT8.S */ 7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, r1 @ r0<- op, r0-r3 changed 7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */ 7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT8.S */ 7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul r0, r1, r0 @ r0<- op, r0-r3 changed 7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */ 7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT8.S */ 7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idiv @ r0<- op, r0-r3 changed 7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */ 7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT8.S */ 7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */ 7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idivmod @ r1<- op, r0-r3 changed 7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */ 7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT8.S */ 7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r1 @ r0<- op, r0-r3 changed 7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */ 7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT8.S */ 7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1 @ r0<- op, r0-r3 changed 7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */ 7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT8.S */ 7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r1 @ r0<- op, r0-r3 changed 7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */ 7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_LIT8.S */ 7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */ 7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_LIT8.S */ 7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */ 7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_LIT8.S */ 7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 7426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 7427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7435c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_VOLATILE: /* 0xe3 */ 7436c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET_VOLATILE.S */ 7437c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET.S */ 7438c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7439c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit instance field get. 7440c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7441c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 7442c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7443c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vA, vB, field@CCCC */ 7444c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 7445c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 7446c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 7447c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 7448c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 7449c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 7450c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7451c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IGET_VOLATILE_finish @ no, already resolved 7452c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7453c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw 7454c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 7455c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 7456c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 7457c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IGET_VOLATILE_finish 7458c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown 7459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7463c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_VOLATILE: /* 0xe4 */ 7464c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT_VOLATILE.S */ 7465c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT.S */ 7466c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7467c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit instance field put. 7468c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7469919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: iput, iput-boolean, iput-byte, iput-char, iput-short 7470c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7471c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vA, vB, field@CCCC */ 7472c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 7473c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 7474c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 7475c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 7476c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 7477c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 7478c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7479c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IPUT_VOLATILE_finish @ no, already resolved 7480c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7481c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw 7482c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 7483c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 7484c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 7485c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IPUT_VOLATILE_finish @ yes, finish up 7486c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown 7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7491c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_VOLATILE: /* 0xe5 */ 7492c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET_VOLATILE.S */ 7493c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET.S */ 7494c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7495c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit SGET handler. 7496c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7497c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 7498c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7499c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vAA, field@BBBB */ 7500c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 7501c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 7502c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 7503c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 7504c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7505c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq .LOP_SGET_VOLATILE_resolve @ yes, do resolve 7506c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_VOLATILE_finish: @ field ptr in r0 7507c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r1, [r0, #offStaticField_value] @ r1<- field value 75080890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ acquiring load 7509c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- AA 7510c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7511c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden SET_VREG(r1, r2) @ fp[AA]<- r1 7512c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 7513c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 7514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7518c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_VOLATILE: /* 0xe6 */ 7519c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT_VOLATILE.S */ 7520c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT.S */ 7521c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7522c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit SPUT handler. 7523c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7524919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: sput, sput-boolean, sput-byte, sput-char, sput-short 7525c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7526c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vAA, field@BBBB */ 7527c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 7528c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 7529c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 7530c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 7531c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7532c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq .LOP_SPUT_VOLATILE_resolve @ yes, do resolve 7533c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_VOLATILE_finish: @ field ptr in r0 7534c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- AA 7535c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7536c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r1, r2) @ r1<- fp[AA] 7537c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 75380890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ releasing store 7539c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden str r1, [r0, #offStaticField_value] @ field<- vAA 7540c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7545c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */ 7546c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */ 7547c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET.S */ 7548c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7549c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit instance field get. 7550c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7551c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 7552c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7553c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vA, vB, field@CCCC */ 7554c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 7555c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 7556c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 7557c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 7558c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 7559c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 7560c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7561c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IGET_OBJECT_VOLATILE_finish @ no, already resolved 7562c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7563c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw 7564c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 7565c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 7566c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 7567c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IGET_OBJECT_VOLATILE_finish 7568c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown 7569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 75735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */ 75745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */ 75755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE.S */ 75765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 75775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Wide 32-bit instance field get. 75785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 75795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* iget-wide vA, vB, field@CCCC */ 75805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 75815387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 75825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 75835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields 75845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 75855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 75865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ is resolved entry null? 75875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_IGET_WIDE_VOLATILE_finish @ no, already resolved 75885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 75895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden EXPORT_PC() @ resolve() could throw 75905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 75915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 75925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 75935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_IGET_WIDE_VOLATILE_finish 75945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden b common_exceptionThrown 7595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 75995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */ 76005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */ 76015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE.S */ 76025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* iput-wide vA, vB, field@CCCC */ 76035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 76045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 76055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 76065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields 76075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 76085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 76095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ is resolved entry null? 76105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_IPUT_WIDE_VOLATILE_finish @ no, already resolved 76115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 76125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden EXPORT_PC() @ resolve() could throw 76135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 76145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 76155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ success? 76165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_IPUT_WIDE_VOLATILE_finish @ yes, finish up 76175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden b common_exceptionThrown 7618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 76225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */ 76235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */ 76245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE.S */ 76255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 76265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * 64-bit SGET handler. 76275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 76285387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* sget-wide vAA, field@BBBB */ 76295387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 76305387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 76315387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 76325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 76335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ is resolved entry null? 76345387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden beq .LOP_SGET_WIDE_VOLATILE_resolve @ yes, do resolve 76355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_finish: 7636861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r9, rINST, lsr #8 @ r9<- AA 7637861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .if 1 7638861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r0, r0, #offStaticField_value @ r0<- pointer to data 76396e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field 7640861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 7641861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned) 7642861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 7643861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 76445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7645861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 76465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 76475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 7648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 76525387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */ 76535387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */ 76545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE.S */ 76555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 76565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * 64-bit SPUT handler. 76575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 76585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* sput-wide vAA, field@BBBB */ 7659861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r0, [rGLUE, #offGlue_methodClassDex] @ r0<- DvmDex 76605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 7661861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields 76625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden mov r9, rINST, lsr #8 @ r9<- AA 7663861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r2, [r0, r1, lsl #2] @ r2<- resolved StaticField ptr 76645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 7665861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden cmp r2, #0 @ is resolved entry null? 76665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden beq .LOP_SPUT_WIDE_VOLATILE_resolve @ yes, do resolve 7667861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9 76685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7669861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 7670861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GET_INST_OPCODE(r10) @ extract opcode from rINST 7671861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .if 1 7672861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r2, r2, #offStaticField_value @ r2<- pointer to data 76736e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 7674861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 7675861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden strd r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1 7676861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 7677861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GOTO_OPCODE(r10) @ jump to next instruction 7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 768296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */ 768396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: armv5te/OP_BREAKPOINT.S */ 7684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 7685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 7686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 76903a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */ 76913a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */ 76923a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden /* 76933a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * Handle a throw-verification-error instruction. This throws an 76943a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * exception for an error discovered during verification. The 76953a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * exception is indicated by AA, with some detail provided by BBBB. 76963a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden */ 76973a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden /* op AA, ref@BBBB */ 7698b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 76993a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden FETCH(r2, 1) @ r2<- BBBB 7700b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden EXPORT_PC() @ export the PC 77013a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden mov r1, rINST, lsr #8 @ r1<- AA 77023a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden bl dvmThrowVerificationError @ always throws 77033a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden b common_exceptionThrown @ handle exception 7704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */ 7708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_EXECUTE_INLINE.S */ 7709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Execute a "native inline" instruction. 7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7712b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * We need to call an InlineOp4Func: 7713b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult) 7714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7715b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * The first four args are in r0-r3, pointer to return value storage 7716b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * is on the stack. The function's return value is a flag that tells 7717b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * us if an exception was thrown. 7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */ 7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 1) @ r10<- BBBB 7721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rGLUE, #offGlue_retval @ r1<- &glue->retval 7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ can throw 7723b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden sub sp, sp, #8 @ make room for arg, +64 bit align 7724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 7725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [sp] @ push &glue->retval 7726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl .LOP_EXECUTE_INLINE_continue @ make call; will return after 7727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #8 @ pop stack 7728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ test boolean result of inline 7729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ returned false, handle exception 7730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 7731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7736b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */ 7737b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */ 7738b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden /* 7739b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * Execute a "native inline" instruction, using "/range" semantics. 7740b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * Same idea as execute-inline, but we get the args differently. 7741b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * 7742b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * We need to call an InlineOp4Func: 7743b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult) 7744b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * 7745b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * The first four args are in r0-r3, pointer to return value storage 7746b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * is on the stack. The function's return value is a flag that tells 7747b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * us if an exception was thrown. 7748b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden */ 7749b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */ 7750b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden FETCH(r10, 1) @ r10<- BBBB 7751b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden add r1, rGLUE, #offGlue_retval @ r1<- &glue->retval 7752b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden EXPORT_PC() @ can throw 7753b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden sub sp, sp, #8 @ make room for arg, +64 bit align 7754b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden mov r0, rINST, lsr #8 @ r0<- AA 7755b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden str r1, [sp] @ push &glue->retval 7756b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden bl .LOP_EXECUTE_INLINE_RANGE_continue @ make call; will return after 7757b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden add sp, sp, #8 @ pop stack 7758b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden cmp r0, #0 @ test boolean result of inline 7759b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden beq common_exceptionThrown @ returned false, handle exception 7760b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 7761b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 7762b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GOTO_OPCODE(ip) @ jump to next instruction 7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */ 7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_EMPTY.S */ 7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * invoke-direct-empty is a no-op in a "standard" interpreter. 7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST 7772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 7773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute it 7774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */ 7778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_F1.S */ 7779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 7780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 7781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */ 7786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */ 7787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* For: iget-quick, iget-object-quick */ 7788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, offset@CCCC */ 7789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- object we're operating on 7791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field byte offset 7792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1] @ r0<- obj.field (always 32 bits) 7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */ 7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE_QUICK.S */ 7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* iget-wide-quick vA, vB, offset@CCCC */ 7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- object we're operating on 7809b48a4d53bc3349b5c99f8b87a396e7374e2d335cDave Butcher FETCH(ip, 1) @ ip<- field byte offset 7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7813b48a4d53bc3349b5c99f8b87a396e7374e2d335cDave Butcher ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned) 7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r2, lsl #2 @ r3<- &fp[A] 7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ fp[A]<- r0/r1 7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */ 7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT_QUICK.S */ 7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */ 7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* For: iget-quick, iget-object-quick */ 7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, offset@CCCC */ 7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- object we're operating on 7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field byte offset 7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1] @ r0<- obj.field (always 32 bits) 7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */ 7845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */ 7846919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee /* For: iput-quick */ 7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, offset@CCCC */ 7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- fp[B], the object pointer 7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field byte offset 7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- fp[A] 7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r3, r1] @ obj.field (always 32 bits)<- r0 7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */ 7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE_QUICK.S */ 7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* iput-wide-quick vA, vB, offset@CCCC */ 7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A(+) 7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[B], the object pointer 7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r0, lsl #2 @ r3<- &fp[A] 7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ check object for null 7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- fp[A] 7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 1) @ r3<- field byte offset 7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strd r0, [r2, r3] @ obj.field (64 bits, aligned)<- r0/r1 7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */ 7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */ 7884919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee /* For: iput-object-quick */ 7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, offset@CCCC */ 7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- fp[B], the object pointer 7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field byte offset 7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- fp[A] 7894919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base 7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r3, r1] @ obj.field (always 32 bits)<- r0 7897919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r0, #0 7898d82097f6b409c5cd48568e54eb701604c3cceb18buzbee strneb r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head 7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */ 7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */ 7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an optimized virtual method call. 7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range 7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 2) @ r3<- FEDC or CCCC 7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r3, #15 @ r3<- C (or stays CCCC) 7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vC ("this" ptr) 7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ is "this" null? 7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offObject_clazz] @ r2<- thisPtr->clazz 7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_vtable] @ r2<- thisPtr->clazz->vtable 7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ invoke must export 7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r3<- vtable[BBBB] 7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodNoRange @ continue on 7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */ 7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */ 7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */ 7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an optimized virtual method call. 7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range 7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 2) @ r3<- FEDC or CCCC 7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r3, #15 @ r3<- C (or stays CCCC) 7943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vC ("this" ptr) 7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ is "this" null? 7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offObject_clazz] @ r2<- thisPtr->clazz 7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_vtable] @ r2<- thisPtr->clazz->vtable 7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ invoke must export 7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r3<- vtable[BBBB] 7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodRange @ continue on 7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */ 7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */ 7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an optimized "super" method call. 7960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: [opt] invoke-super-quick, invoke-super-quick/range 7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offMethod_clazz] @ r2<- method->clazz 7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_super] @ r2<- method->clazz->super 7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r10) @ r3<- "this" 7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_vtable] @ r2<- ...clazz->super->vtable 7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ null "this" ref? 7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- super->vtable[BBBB] 7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ "this" is null, throw exception 7979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodNoRange @ continue on 7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */ 7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */ 7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */ 7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an optimized "super" method call. 7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: [opt] invoke-super-quick, invoke-super-quick/range 7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offMethod_clazz] @ r2<- method->clazz 8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_super] @ r2<- method->clazz->super 8002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r10) @ r3<- "this" 8003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_vtable] @ r2<- ...clazz->super->vtable 8004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ null "this" ref? 8005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- super->vtable[BBBB] 8006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ "this" is null, throw exception 8007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodRange @ continue on 8008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 8011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8012c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */ 8013c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */ 8014919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee/* File: armv5te/OP_IPUT_OBJECT.S */ 8015c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 8016919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * 32-bit instance field put. 8017c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 8018919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: iput-object, iput-object-volatile 8019c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 8020c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vA, vB, field@CCCC */ 8021c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 8022c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 8023c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 8024c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 8025c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 8026c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 8027c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 8028c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IPUT_OBJECT_VOLATILE_finish @ no, already resolved 8029c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 8030c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw 8031c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 8032c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 8033c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 8034c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IPUT_OBJECT_VOLATILE_finish @ yes, finish up 8035c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown 8036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 8039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8040c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */ 8041c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */ 8042c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET.S */ 8043c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 8044c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit SGET handler. 8045c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 8046c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 8047c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 8048c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vAA, field@BBBB */ 8049c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 8050c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 8051c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 8052c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 8053c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 8054c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq .LOP_SGET_OBJECT_VOLATILE_resolve @ yes, do resolve 8055c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0 8056c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r1, [r0, #offStaticField_value] @ r1<- field value 80570890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ acquiring load 8058c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- AA 8059c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8060c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden SET_VREG(r1, r2) @ fp[AA]<- r1 8061c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 8062c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 8063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 8066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8067c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */ 8068c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */ 8069919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee/* File: armv5te/OP_SPUT_OBJECT.S */ 8070c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 8071919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * 32-bit SPUT handler for objects 8072c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 8073919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee * for: sput-object, sput-object-volatile 8074c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 8075c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vAA, field@BBBB */ 8076c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 8077c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 8078c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 8079c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 8080c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 8081919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee bne .LOP_SPUT_OBJECT_VOLATILE_finish @ no, continue 8082b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee ldr r9, [rGLUE, #offGlue_method] @ r9<- current method 8083919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee EXPORT_PC() @ resolve() could throw, so export now 8084d82097f6b409c5cd48568e54eb701604c3cceb18buzbee ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz 8085919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee bl dvmResolveStaticField @ r0<- resolved StaticField ptr 8086919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r0, #0 @ success? 8087919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee bne .LOP_SPUT_OBJECT_VOLATILE_finish @ yes, finish 8088919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee b common_exceptionThrown @ no, handle exception 8089919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee 8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */ 8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FF.S */ 8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .size dvmAsmInstructionStart, .-dvmAsmInstructionStart 8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmAsmInstructionEnd 8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd: 8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sister implementations 8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmAsmSisterStart 8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmAsmSisterStart, %function 8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .text 8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 4 8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart: 8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */ 8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the String has not yet been resolved. 8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB (String ref) 8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9: target register 8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve: 8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offMethod_clazz] @ r0<- method->clazz 8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveString @ r0<- String reference 8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yup, handle the exception 8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */ 8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the String has not yet been resolved. 8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBBBBBB (String ref) 8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9: target register 8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve: 8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offMethod_clazz] @ r0<- method->clazz 8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveString @ r0<- String reference 8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yup, handle the exception 8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */ 8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the Class has not yet been resolved. 8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB (Class ref) 8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9: target register 8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve: 8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #1 @ r2<- true 8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offMethod_clazz] @ r0<- method->clazz 8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- Class reference 8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yup, handle the exception 8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */ 8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Trivial test failed, need to perform full check. This is common. 8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds obj->clazz 8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds class resolved from BBBB 8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck: 8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInstanceofNonTrivial @ r0<- boolean result 8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_CHECK_CAST_okay @ no, success 8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ A cast has failed. We need to throw a ClassCastException with the 8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ class of the object that failed to be cast. 8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ about to throw 8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r9, #offObject_clazz] @ r3<- obj->clazz 8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, .LstrClassCastExceptionPtr 8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r3, #offClassObject_descriptor] @ r1<- obj->clazz->descriptor 8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowExceptionWithClassMessage 8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolution required. This is the least-likely path. 8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r2 holds BBBB 8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve: 8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r2 @ r1<- BBBB 8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- resolved ClassObject ptr 8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0 @ r1<- class resolved from BBB 8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz 8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CHECK_CAST_resolved @ pick up where we left off 8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastExceptionPtr: 8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrClassCastException 8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */ 8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Trivial test failed, need to perform full check. This is common. 8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds obj->clazz 8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds class resolved from BBBB 8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds A 8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck: 8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInstanceofNonTrivial @ r0<- boolean result 8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to OP_INSTANCE_OF_store 8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds boolean result 8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds A 8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store: 8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Trivial test succeeded, save and bail. 8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds A 8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial: 8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #1 @ indicate success 8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper 8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolution required. This is the least-likely path. 8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r3 holds BBBB 8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds A 8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve: 8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r3 @ r1<- BBBB 8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #1 @ r2<- true 8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offMethod_clazz] @ r0<- method->clazz 8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- resolved ClassObject ptr 8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 8267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0 @ r1<- class resolved from BBB 8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB (object) 8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offObject_clazz] @ r0<- obj->clazz 8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_INSTANCE_OF_resolved @ pick up where we left off 8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */ 8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 32 @ minimize cache lines 8277b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden.LOP_NEW_INSTANCE_finish: @ r0=new object 8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle the exception 8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r3) @ vAA<- r0 8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class initialization required. 8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds class object 8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit: 8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r0 @ save r0 8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInitClass @ initialize class 8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ check boolean result 8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ restore r0 8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_NEW_INSTANCE_initialized @ success, continue 8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ failed, deal with init exception 8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolution required. This is the least-likely path. 8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds BBBB 8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve: 8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- resolved ClassObject ptr 8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_NEW_INSTANCE_resolved @ no, continue 8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationErrorPtr: 8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrInstantiationError 8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */ 8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolve class. (This is an uncommon case.) 8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds array length 8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r2 holds class ref CCCC 8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve: 8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r1 @ r9<- length (save) 8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r2 @ r1<- CCCC 8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- call(clazz, ref) 8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r9 @ r1<- length (restore) 8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to OP_NEW_ARRAY_finish 8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Finish allocation. 8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds class 8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds array length 8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish: 8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #ALLOC_DONT_TRACK @ don't track in local refs table 8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAllocArrayByClass @ r0<- call(clazz, length, flags) 8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle the exception 8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ vA<- r0 8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */ 8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds array class 8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 holds AA or BA 8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue: 8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor 8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #ALLOC_DONT_TRACK @ r2<- alloc flags 8365919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldrb rINST, [r3, #1] @ rINST<- descriptor[1] 8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- AA (length) 8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10, lsr #4 @ r1<- B (length) 8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8371919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp rINST, #'I' @ array of ints? 8372919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmpne rINST, #'L' @ array of objects? 8373919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmpne rINST, #'[' @ array of arrays? 8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r1 @ save length in r9 8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_FILLED_NEW_ARRAY_notimpl @ no, not handled yet 8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAllocArrayByClass @ r0<- call(arClass, length, flags) 8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null return? 8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ alloc failed, handle exception 8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- FEDC or CCCC 8381919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee str r0, [rGLUE, #offGlue_retval] @ retval.l <- new array 8382919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee str rINST, [rGLUE, #offGlue_retval+4] @ retval.h <- type 8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, #offArrayObject_contents @ r0<- newArray->contents 8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ length--, check for neg 8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST 8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi 2f @ was zero, bail 8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ copy values from registers into the array 8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA 8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r1, lsl #2 @ r2<- &fp[CCCC] 8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: ldr r3, [r2], #4 @ r3<- *r2++ 8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #4 @ length was initially 5? 8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r10, #15 @ r2<- A 8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ <= 4 args, branch 8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vA 8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r9, r9, #1 @ count-- 8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0, #16] @ contents[4] = vA 8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and r2, r1, #15 @ r2<- F/E/D/C 8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vF/vE/vD/vC 8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr #4 @ r1<- next reg in low 4 8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: 8414919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r0, [rGLUE, #offGlue_retval] @ r0<- object 8415919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r1, [rGLUE, #offGlue_retval+4] @ r1<- type 8416919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base 8417919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_INST_OPCODE(ip) @ ip<- opcode from rINST 8418919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r1, #'I' @ Is int array? 8419d82097f6b409c5cd48568e54eb701604c3cceb18buzbee strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head 8420919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GOTO_OPCODE(ip) @ execute it 8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception indicating that we have not implemented this 8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mode of filled-new-array. 8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl: 8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, .L_strInternalError 8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, .L_strFilledNewArrayNotImpl 8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) @ define in one or the other, not both 8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl: 8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrFilledNewArrayNotImpl 8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError: 8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrInternalError 8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */ 8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds array class 8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 holds AA or BA 8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue: 8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor 8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #ALLOC_DONT_TRACK @ r2<- alloc flags 8449919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldrb rINST, [r3, #1] @ rINST<- descriptor[1] 8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- AA (length) 8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10, lsr #4 @ r1<- B (length) 8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8455919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp rINST, #'I' @ array of ints? 8456919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmpne rINST, #'L' @ array of objects? 8457919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmpne rINST, #'[' @ array of arrays? 8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r1 @ save length in r9 8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_FILLED_NEW_ARRAY_RANGE_notimpl @ no, not handled yet 8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAllocArrayByClass @ r0<- call(arClass, length, flags) 8461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null return? 8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ alloc failed, handle exception 8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- FEDC or CCCC 8465919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee str r0, [rGLUE, #offGlue_retval] @ retval.l <- new array 8466919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee str rINST, [rGLUE, #offGlue_retval+4] @ retval.h <- type 8467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, #offArrayObject_contents @ r0<- newArray->contents 8468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ length--, check for neg 8469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST 8470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi 2f @ was zero, bail 8471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ copy values from registers into the array 8473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA 8474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 8475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r1, lsl #2 @ r2<- &fp[CCCC] 8476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: ldr r3, [r2], #4 @ r3<- *r2++ 8477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 8478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 8479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 8480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 8481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 8482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #4 @ length was initially 5? 8483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r10, #15 @ r2<- A 8484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ <= 4 args, branch 8485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vA 8486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r9, r9, #1 @ count-- 8487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0, #16] @ contents[4] = vA 8488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and r2, r1, #15 @ r2<- F/E/D/C 8489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vF/vE/vD/vC 8490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr #4 @ r1<- next reg in low 4 8491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 8492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 8493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 8494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 8495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: 8498919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r0, [rGLUE, #offGlue_retval] @ r0<- object 8499919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r1, [rGLUE, #offGlue_retval+4] @ r1<- type 8500919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base 8501919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_INST_OPCODE(ip) @ ip<- opcode from rINST 8502919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r1, #'I' @ Is int array? 8503d82097f6b409c5cd48568e54eb701604c3cceb18buzbee strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head 8504919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GOTO_OPCODE(ip) @ execute it 8505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception indicating that we have not implemented this 8508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mode of filled-new-array. 8509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl: 8511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, .L_strInternalError 8512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, .L_strFilledNewArrayNotImpl 8513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 8514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 8515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) @ define in one or the other, not both 8517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl: 8518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrFilledNewArrayNotImpl 8519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError: 8520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrInternalError 8521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */ 8524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Test for NaN with a second comparison. EABI forbids testing bit 8526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ patterns, and we can't represent 0x7fc00000 in immediate form, so 8527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ make the library call. 8528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_gt_or_nan: 8529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r9 @ reverse order 8530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r10 8531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cfcmple @ r0<- Z set if eq, C clear if < 8532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bleq common_abort 8533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movcc r1, #1 @ (greater than) r1<- 1 8534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_CMPL_FLOAT_finish 8535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, #0 @ r1<- 1 or -1 for NaN 8536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMPL_FLOAT_finish 8537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 /* "clasic" form */ 8540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 8541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 8542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 8543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r2) @ r9<- vBB 8544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r10, r3) @ r10<- vCC 8545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpeq @ r0<- (vBB == vCC) 8548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ equal? 8549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r1, #0 @ yes, result is 0 8550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne OP_CMPL_FLOAT_finish 8551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmplt @ r0<- (vBB < vCC) 8554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ less than? 8555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b OP_CMPL_FLOAT_continue 8556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break 8557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_continue: 8559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r1, #0 @ yes, result is -1 8560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne OP_CMPL_FLOAT_finish 8561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpgt @ r0<- (vBB > vCC) 8564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ greater than? 8565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq OP_CMPL_FLOAT_nan @ no, must be NaN 8566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ yes, result is 1 8567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to _finish 8568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_finish: 8570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 8571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 8573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is expected to be uncommon, so we double-branch (once to here, 8578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * again back to _finish). 8579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_nan: 8581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, #0 @ r1<- 1 or -1 for NaN 8582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b OP_CMPL_FLOAT_finish 8583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 8585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */ 8587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Test for NaN with a second comparison. EABI forbids testing bit 8589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ patterns, and we can't represent 0x7fc00000 in immediate form, so 8590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ make the library call. 8591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_gt_or_nan: 8592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r9 @ reverse order 8593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r10 8594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cfcmple @ r0<- Z set if eq, C clear if < 8595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bleq common_abort 8596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movcc r1, #1 @ (greater than) r1<- 1 8597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_CMPG_FLOAT_finish 8598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ r1<- 1 or -1 for NaN 8599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMPG_FLOAT_finish 8600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 /* "clasic" form */ 8603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 8604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 8605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 8606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r2) @ r9<- vBB 8607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r10, r3) @ r10<- vCC 8608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpeq @ r0<- (vBB == vCC) 8611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ equal? 8612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r1, #0 @ yes, result is 0 8613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne OP_CMPG_FLOAT_finish 8614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmplt @ r0<- (vBB < vCC) 8617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ less than? 8618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b OP_CMPG_FLOAT_continue 8619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break 8620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_continue: 8622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r1, #0 @ yes, result is -1 8623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne OP_CMPG_FLOAT_finish 8624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpgt @ r0<- (vBB > vCC) 8627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ greater than? 8628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq OP_CMPG_FLOAT_nan @ no, must be NaN 8629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ yes, result is 1 8630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to _finish 8631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_finish: 8633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 8634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 8636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is expected to be uncommon, so we double-branch (once to here, 8641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * again back to _finish). 8642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_nan: 8644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ r1<- 1 or -1 for NaN 8645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b OP_CMPG_FLOAT_finish 8646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 8648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */ 8650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Test for NaN with a second comparison. EABI forbids testing bit 8652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ patterns, and we can't represent 0x7fc00000 in immediate form, so 8653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ make the library call. 8654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_gt_or_nan: 8655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r10, {r0-r1} @ reverse order 8656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r2-r3} 8657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cdcmple @ r0<- Z set if eq, C clear if < 8658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bleq common_abort 8659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movcc r1, #1 @ (greater than) r1<- 1 8660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_CMPL_DOUBLE_finish 8661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, #0 @ r1<- 1 or -1 for NaN 8662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMPL_DOUBLE_finish 8663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */ 8665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Test for NaN with a second comparison. EABI forbids testing bit 8667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ patterns, and we can't represent 0x7fc00000 in immediate form, so 8668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ make the library call. 8669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_gt_or_nan: 8670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r10, {r0-r1} @ reverse order 8671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r2-r3} 8672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cdcmple @ r0<- Z set if eq, C clear if < 8673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bleq common_abort 8674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movcc r1, #1 @ (greater than) r1<- 1 8675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_CMPG_DOUBLE_finish 8676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ r1<- 1 or -1 for NaN 8677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMPG_DOUBLE_finish 8678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */ 8680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_less: 8682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, #0 @ r1<- -1 8683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Want to cond code the next mov so we can avoid branch, but don't see it; 8684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ instead, we just replicate the tail end. 8685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 8687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_greater: 8691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ r1<- 1 8692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to _finish 8693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish: 8695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 8697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */ 8701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish: 8703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrd r2, [r0, #offArrayObject_contents] @ r2/r3<- vBB[vCC] 8705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 8706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3 8708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */ 8711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish: 8713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1 8715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strd r2, [r0, #offArrayObject_contents] @ r2/r3<- vBB[vCC] 8717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */ 8720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 8722d82097f6b409c5cd48568e54eb701604c3cceb18buzbee * rINST = vBB (arrayObj) 8723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 = vAA (obj) 8724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = offset into array (vBB + vCC * width) 8725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_finish: 8727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ storing null reference? 8728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_APUT_OBJECT_skip_check @ yes, skip type checks 8729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz 8730d82097f6b409c5cd48568e54eb701604c3cceb18buzbee ldr r1, [rINST, #offObject_clazz] @ r1<- arrayObj->clazz 8731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmCanPutArrayElement @ test object type vs. array type 8732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ okay? 8733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errArrayStore @ no 8734d82097f6b409c5cd48568e54eb701604c3cceb18buzbee mov r1, rINST @ r1<- arrayObj 8735919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8736919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r2, [rGLUE, #offGlue_cardTable] @ get biased CT base 8737919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee add r10, #offArrayObject_contents @ r0<- pointer to slot 8738919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_INST_OPCODE(ip) @ extract opcode from rINST 8739919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee str r9, [r10] @ vBB[vCC]<- vAA 8740d82097f6b409c5cd48568e54eb701604c3cceb18buzbee strb r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head 8741919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GOTO_OPCODE(ip) @ jump to next instruction 8742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check: 8743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA 8746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET */ 8749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish: 8756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak0 8757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 87610890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */ 8770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish: 8777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8780c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden .if 0 8781861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r0, r9, r3 @ r0<- address of field 87826e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field 8783861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 8784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok) 8785861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 8786861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8788861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden and r2, r2, #15 @ r2<- A 8789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r2, lsl #2 @ r3<- &fp[A] 8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ fp[A]<- r0/r1 8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_OBJECT */ 8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish: 8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak0 8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 88070890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */ 8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish: 8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak1 8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 88280890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */ 8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish: 8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak2 8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 88490890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */ 8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish: 8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak3 8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 88700890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */ 8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish: 8886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak4 8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 88910890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */ 8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish: 8907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak0 8908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 8909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 8911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 8913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 89160890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 8918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */ 8921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish: 8928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r3<- &fp[A] 8933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- fp[A] 8936861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GET_INST_OPCODE(r10) @ extract opcode from rINST 8937c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden .if 0 8938861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r2, r9, r3 @ r2<- target address 89396e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 8940861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 8941861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1 8942861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 8943861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GOTO_OPCODE(r10) @ jump to next instruction 8944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_OBJECT */ 8946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_finish: 8953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak0 8954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 8955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 8957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 8959919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base 8960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 89630890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 8964d82097f6b409c5cd48568e54eb701604c3cceb18buzbee str r0, [r9, r3] @ obj.field (32 bits)<- r0 8965919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r0, #0 @ stored a null reference? 8966919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not 8967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */ 8970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish: 8977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak1 8978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 8979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 8981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 8983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 89860890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 8987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 8988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */ 8991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish: 8998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak2 8999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 9000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 9002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 9003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 9004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 9005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 90070890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 9008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 9009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */ 9012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 9015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 9016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 9017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish: 9019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak3 9020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 9021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 9023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 9024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 9025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 9026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 90280890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 9029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 9030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */ 9033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 9036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 9037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 9038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish: 9040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak4 9041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 9042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 9044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 9045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 9046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 9047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 90490890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 9050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 9051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */ 9054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve: 9060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_finish @ yes, finish 9066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */ 9069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9073861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * 9074861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * Returns StaticField pointer in r0. 9075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_resolve: 9077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_WIDE_finish @ yes, finish 9083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */ 9086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve: 9092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_OBJECT_finish @ yes, finish 9098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */ 9101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_resolve: 9107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_BOOLEAN_finish @ yes, finish 9113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */ 9116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve: 9122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_BYTE_finish @ yes, finish 9128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */ 9131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve: 9137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_CHAR_finish @ yes, finish 9143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */ 9146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve: 9152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_SHORT_finish @ yes, finish 9158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */ 9161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve: 9167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_finish @ yes, finish 9173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */ 9176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9: &fp[AA] 9181861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * 9182861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * Returns StaticField pointer in r2. 9183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_resolve: 9185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9190861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r2, r0 @ copy to r2 9191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_WIDE_finish @ yes, finish 9192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */ 9195b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee.LOP_SPUT_OBJECT_finish: @ field ptr in r0 9196919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee mov r2, rINST, lsr #8 @ r2<- AA 9197919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9198919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_VREG(r1, r2) @ r1<- fp[AA] 9199919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base 9200b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee ldr r9, [r0, #offField_clazz] @ r9<- field->clazz 9201919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_INST_OPCODE(ip) @ extract opcode from rINST 9202919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee @ no-op @ releasing store 9203b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee str r1, [r0, #offStaticField_value] @ field<- vAA 9204919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r1, #0 @ stored a null object? 9205d82097f6b409c5cd48568e54eb701604c3cceb18buzbee strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head 9206919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GOTO_OPCODE(ip) @ jump to next instruction 9207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */ 9209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve: 9215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_BOOLEAN_finish @ yes, finish 9221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */ 9224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve: 9230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_BYTE_finish @ yes, finish 9236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */ 9239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve: 9245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_CHAR_finish @ yes, finish 9251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */ 9254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve: 9260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_SHORT_finish @ yes, finish 9266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */ 9269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At this point: 9272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = C or CCCC (index of first arg, which is the "this" ptr) 9274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue: 9276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r10) @ r1<- "this" ptr 9277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offMethod_methodIndex] @ r2<- baseMethod->methodIndex 9278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is "this" null? 9279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 9280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offObject_clazz] @ r1<- thisPtr->clazz 9281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offClassObject_vtable] @ r3<- thisPtr->clazz->vtable 9282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r2, lsl #2] @ r3<- vtable[methodIndex] 9283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodNoRange @ continue on 9284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */ 9286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At this point: 9289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 = method->clazz 9291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue: 9293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r9, #offClassObject_super] @ r1<- method->clazz->super 9294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offMethod_methodIndex] @ r2<- baseMethod->methodIndex 9295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offClassObject_vtableCount] @ r3<- super->vtableCount 9296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 9297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (methodIndex, vtableCount) 9298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs .LOP_INVOKE_SUPER_nsm @ method not present in superclass 9299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offClassObject_vtable] @ r1<- ...clazz->super->vtable 9300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r1, r2, lsl #2] @ r3<- vtable[methodIndex] 9301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodNoRange @ continue on 9302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve: 9304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- method->clazz 9305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_VIRTUAL @ resolver method type 9306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 9307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 9308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_SUPER_continue @ no, continue 9309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 9310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw a NoSuchMethodError with the method name as the message. 9313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm: 9316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offMethod_name] @ r1<- method name 9317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errNoSuchMethod 9318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */ 9320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 9323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 = reference (BBBB or CCCC) 9324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = "this" register 9325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve: 9327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 9328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 9329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_DIRECT @ resolver method type 9330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 9331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 9332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr (reload) 9333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_DIRECT_finish @ no, continue 9334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 9335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */ 9337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At this point: 9340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = C or CCCC (index of first arg, which is the "this" ptr) 9342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue: 9344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r10) @ r1<- "this" ptr 9345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offMethod_methodIndex] @ r2<- baseMethod->methodIndex 9346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is "this" null? 9347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 9348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offObject_clazz] @ r1<- thisPtr->clazz 9349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offClassObject_vtable] @ r3<- thisPtr->clazz->vtable 9350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r2, lsl #2] @ r3<- vtable[methodIndex] 9351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodRange @ continue on 9352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */ 9354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At this point: 9357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 = method->clazz 9359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue: 9361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r9, #offClassObject_super] @ r1<- method->clazz->super 9362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offMethod_methodIndex] @ r2<- baseMethod->methodIndex 9363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offClassObject_vtableCount] @ r3<- super->vtableCount 9364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 9365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (methodIndex, vtableCount) 9366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs .LOP_INVOKE_SUPER_RANGE_nsm @ method not present in superclass 9367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offClassObject_vtable] @ r1<- ...clazz->super->vtable 9368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r1, r2, lsl #2] @ r3<- vtable[methodIndex] 9369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodRange @ continue on 9370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve: 9372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- method->clazz 9373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_VIRTUAL @ resolver method type 9374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 9375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 9376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_SUPER_RANGE_continue @ no, continue 9377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 9378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw a NoSuchMethodError with the method name as the message. 9381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm: 9384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offMethod_name] @ r1<- method name 9385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errNoSuchMethod 9386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */ 9388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 9391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 = reference (BBBB or CCCC) 9392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = "this" register 9393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve: 9395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 9396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 9397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_DIRECT @ resolver method type 9398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 9399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 9400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr (reload) 9401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_DIRECT_RANGE_finish @ no, continue 9402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 9403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */ 9405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 9406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to a long in r0/r1. 9407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification. The 9409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 9410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 9411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2l_doconv: 9413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, lr} 9414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0x5f000000 @ (float)maxlong 9415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r4, r0 9416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpge @ is arg >= maxlong? 9417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 9418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r0, #0 @ return maxlong (7fffffff) 9419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r1, #0x80000000 9420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmnefd sp!, {r4, pc} 9421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0xdf000000 @ (float)minlong 9424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmple @ is arg <= minlong? 9425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 9426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0 @ return minlong (80000000) 9427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r1, #0x80000000 9428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmnefd sp!, {r4, pc} 9429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r4 9432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpeq @ is arg == self? 9433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 9434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ return zero for NaN 9435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmeqfd sp!, {r4, pc} 9436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_f2lz @ convert float to long 9439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, pc} 9440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */ 9442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 9443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to a long in r0/r1. 9444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification. The 9446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 9447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 9448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2l_doconv: 9450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, r5, lr} @ save regs 94515162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0x43000000 @ maxlong, as a double (high word) 94525162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, #0x00e00000 @ 0x43e00000 94535162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ maxlong, as a double (low word) 9454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #4 @ align for EABI 94555162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r4, r0 @ save a copy of r0 9456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r5, r1 @ and r1 9457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpge @ is arg >= maxlong? 9458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 9459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r0, #0 @ return maxlong (7fffffffffffffff) 9460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r1, #0x80000000 9461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 9462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 94655162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0xc3000000 @ minlong, as a double (high word) 94665162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, #0x00e00000 @ 0xc3e00000 94675162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ minlong, as a double (low word) 9468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmple @ is arg <= minlong? 9469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 9470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0 @ return minlong (8000000000000000) 9471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r1, #0x80000000 9472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 9473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 9476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r4 @ compare against self 9477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r5 9478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpeq @ is arg == self? 9479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 9480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ return zero for NaN 9481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f 9482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 9485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2lz @ convert double to long 9486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 9488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #4 9489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, r5, pc} 9490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */ 9492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_finish: 9494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10 9496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */ 9499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish: 9501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r2 @ r0<- r0 << r2 9502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */ 9507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish: 9509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asr r2 @ r1<- r1 >> r2 9510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */ 9515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish: 9517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr r2 @ r1<- r1 >>> r2 9518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */ 9523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish: 9525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */ 9530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish: 9532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */ 9537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish: 9539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9543c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IGET_VOLATILE */ 9544c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9545c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9546c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Currently: 9547c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r0 holds resolved field 9548c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r9 holds object 9549c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9550c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IGET_VOLATILE_finish: 9551c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden @bl common_squeak0 9552c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r9, #0 @ check object for null 9553c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9554c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq common_errNullObject @ object was null 9555c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 95560890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ acquiring load 9557c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 9558c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9559c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden and r2, r2, #15 @ r2<- A 9560c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 9561c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden SET_VREG(r0, r2) @ fp[A]<- r0 9562c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 9563c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9564c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IPUT_VOLATILE */ 9565c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9566c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9567c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Currently: 9568c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r0 holds resolved field 9569c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r9 holds object 9570c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9571c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IPUT_VOLATILE_finish: 9572c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden @bl common_squeak0 9573c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r1, rINST, lsr #8 @ r1<- A+ 9574c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9575c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden and r1, r1, #15 @ r1<- A 9576c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r9, #0 @ check object for null 9577c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r0, r1) @ r0<- fp[A] 9578c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq common_errNullObject @ object was null 9579c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9580c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 95810890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ releasing store 9582c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 9583c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 9584c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9585c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SGET_VOLATILE */ 9586c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9587c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9588c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Continuation if the field has not yet been resolved. 9589c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r1: BBBB field ref 9590c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9591c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_VOLATILE_resolve: 9592c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9593c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 9594c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9595c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9596c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 9597c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_SGET_VOLATILE_finish @ yes, finish 9598c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown @ no, handle exception 9599c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9600c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SPUT_VOLATILE */ 9601c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9602c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9603c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Continuation if the field has not yet been resolved. 9604c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r1: BBBB field ref 9605c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9606c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_VOLATILE_resolve: 9607c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9608c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 9609c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9610c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9611c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 9612c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_SPUT_VOLATILE_finish @ yes, finish 9613c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown @ no, handle exception 9614c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9615c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IGET_OBJECT_VOLATILE */ 9616c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9617c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9618c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Currently: 9619c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r0 holds resolved field 9620c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r9 holds object 9621c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9622c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IGET_OBJECT_VOLATILE_finish: 9623c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden @bl common_squeak0 9624c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r9, #0 @ check object for null 9625c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9626c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq common_errNullObject @ object was null 9627c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 96280890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ acquiring load 9629c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 9630c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9631c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden and r2, r2, #15 @ r2<- A 9632c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 9633c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden SET_VREG(r0, r2) @ fp[A]<- r0 9634c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 9635c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 96365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IGET_WIDE_VOLATILE */ 96375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 96395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Currently: 96405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r0 holds resolved field 96415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r9 holds object 96425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 96435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IGET_WIDE_VOLATILE_finish: 96445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r9, #0 @ check object for null 96455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 96465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden beq common_errNullObject @ object was null 9647c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden .if 1 9648861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r0, r9, r3 @ r0<- address of field 96496e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field 9650861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 96515387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok) 9652861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 9653861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 96545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9655861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden and r2, r2, #15 @ r2<- A 96565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden add r3, rFP, r2, lsl #2 @ r3<- &fp[A] 96575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 96585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden stmia r3, {r0-r1} @ fp[A]<- r0/r1 96595387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 96605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IPUT_WIDE_VOLATILE */ 96625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 96645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Currently: 96655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r0 holds resolved field 96665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r9 holds object 96675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 96685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IPUT_WIDE_VOLATILE_finish: 96695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 96705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r9, #0 @ check object for null 96715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden and r2, r2, #15 @ r2<- A 96725387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 96735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden add r2, rFP, r2, lsl #2 @ r3<- &fp[A] 96745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden beq common_errNullObject @ object was null 96755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 96765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldmia r2, {r0-r1} @ r0/r1<- fp[A] 9677861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GET_INST_OPCODE(r10) @ extract opcode from rINST 9678c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden .if 1 9679861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r2, r9, r3 @ r2<- target address 96806e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 9681861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 9682861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1 9683861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 9684861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GOTO_OPCODE(r10) @ jump to next instruction 96855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SGET_WIDE_VOLATILE */ 96875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 96895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Continuation if the field has not yet been resolved. 96905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r1: BBBB field ref 9691861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * 9692861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * Returns StaticField pointer in r0. 96935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 96945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_resolve: 96955387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 96965387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 96975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 96985387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 96995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ success? 97005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_SGET_WIDE_VOLATILE_finish @ yes, finish 97015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden b common_exceptionThrown @ no, handle exception 97025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 97035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SPUT_WIDE_VOLATILE */ 97045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 97055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 97065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Continuation if the field has not yet been resolved. 97075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r1: BBBB field ref 97085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r9: &fp[AA] 9709861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * 9710861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * Returns StaticField pointer in r2. 97115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 97125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SPUT_WIDE_VOLATILE_resolve: 97135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 97145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 97155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 97165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 97175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ success? 9718861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r2, r0 @ copy to r2 97195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_SPUT_WIDE_VOLATILE_finish @ yes, finish 97205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden b common_exceptionThrown @ no, handle exception 97215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 9722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */ 9723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Extract args, call function. 9726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = #of args (0-4) 9727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = call index 9728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * lr = return addr, above [DO NOT bl out of here w/o preserving LR] 9729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Other ideas: 9731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * - Use a jump table from the main piece to jump directly into the 9732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * AND/LDR pairs. Costs a data load, saves a branch. 9733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * - Have five separate pieces that do the loading, so we can work the 9734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * interleave a little better. Increases code size. 9735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue: 9737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, #4 @ r0<- 4-r0 9738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r9, 2) @ r9<- FEDC 9739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add pc, pc, r0, lsl #3 @ computed goto, 2 instrs each 9740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort @ (skipped due to ARM prefetch) 9741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4: and ip, r9, #0xf000 @ isolate F 9742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rFP, ip, lsr #10] @ r3<- vF (shift right 12, left 2) 9743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3: and ip, r9, #0x0f00 @ isolate E 9744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rFP, ip, lsr #6] @ r2<- vE 9745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: and ip, r9, #0x00f0 @ isolate D 9746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [rFP, ip, lsr #2] @ r1<- vD 9747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and ip, r9, #0x000f @ isolate C 9748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rFP, ip, lsl #2] @ r0<- vC 9749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: 9750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, .LOP_EXECUTE_INLINE_table @ table of InlineOperation 9751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LDR_PC "[r9, r10, lsl #4]" @ sizeof=16, "func" is first entry 9752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ (not reached) 9753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_table: 9755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word gDvmInlineOpsTable 9756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9757b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* continuation for OP_EXECUTE_INLINE_RANGE */ 9758b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden 9759b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden /* 9760b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * Extract args, call function. 9761b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * r0 = #of args (0-4) 9762b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * r10 = call index 9763b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * lr = return addr, above [DO NOT bl out of here w/o preserving LR] 9764b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden */ 9765b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_continue: 9766b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden rsb r0, r0, #4 @ r0<- 4-r0 9767b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden FETCH(r9, 2) @ r9<- CCCC 9768b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden add pc, pc, r0, lsl #3 @ computed goto, 2 instrs each 9769b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden bl common_abort @ (skipped due to ARM prefetch) 9770b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden4: add ip, r9, #3 @ base+3 9771b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_VREG(r3, ip) @ r3<- vBase[3] 9772b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden3: add ip, r9, #2 @ base+2 9773b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_VREG(r2, ip) @ r2<- vBase[2] 9774b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden2: add ip, r9, #1 @ base+1 9775b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_VREG(r1, ip) @ r1<- vBase[1] 9776b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden1: add ip, r9, #0 @ (nop) 9777b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_VREG(r0, ip) @ r0<- vBase[0] 9778b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden0: 9779b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden ldr r9, .LOP_EXECUTE_INLINE_RANGE_table @ table of InlineOperation 9780b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden LDR_PC "[r9, r10, lsl #4]" @ sizeof=16, "func" is first entry 9781b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden @ (not reached) 9782b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden 9783b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_table: 9784b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden .word gDvmInlineOpsTable 9785b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden 9786c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IPUT_OBJECT_VOLATILE */ 9787c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9788c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9789c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Currently: 9790c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r0 holds resolved field 9791c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r9 holds object 9792c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9793c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IPUT_OBJECT_VOLATILE_finish: 9794c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden @bl common_squeak0 9795c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r1, rINST, lsr #8 @ r1<- A+ 9796c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9797c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden and r1, r1, #15 @ r1<- A 9798c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r9, #0 @ check object for null 9799c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r0, r1) @ r0<- fp[A] 9800919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base 9801c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq common_errNullObject @ object was null 9802c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9803c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 98040890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ releasing store 9805d82097f6b409c5cd48568e54eb701604c3cceb18buzbee str r0, [r9, r3] @ obj.field (32 bits)<- r0 9806919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r0, #0 @ stored a null reference? 9807919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not 9808c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 9809c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9810c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SGET_OBJECT_VOLATILE */ 9811c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9812c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9813c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Continuation if the field has not yet been resolved. 9814c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r1: BBBB field ref 9815c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9816c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_OBJECT_VOLATILE_resolve: 9817c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9818c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 9819c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9820c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9821c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 9822c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_SGET_OBJECT_VOLATILE_finish @ yes, finish 9823c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown @ no, handle exception 9824c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9825c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SPUT_OBJECT_VOLATILE */ 9826b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0 9827919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee mov r2, rINST, lsr #8 @ r2<- AA 9828919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9829919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_VREG(r1, r2) @ r1<- fp[AA] 9830919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldr r2, [rGLUE, #offGlue_cardTable] @ r2<- card table base 9831b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee ldr r9, [r0, #offField_clazz] @ r9<- field->clazz 9832919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_INST_OPCODE(ip) @ extract opcode from rINST 9833919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee SMP_DMB @ releasing store 9834b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee str r1, [r0, #offStaticField_value] @ field<- vAA 9835919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r1, #0 @ stored a null object? 9836d82097f6b409c5cd48568e54eb701604c3cceb18buzbee strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head 9837919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GOTO_OPCODE(ip) @ jump to next instruction 9838c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .size dvmAsmSisterStart, .-dvmAsmSisterStart 9840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmAsmSisterEnd 9841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd: 9842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/footer.S */ 9844ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 9846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 9847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common subroutines and data 9848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 9849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9851ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9852ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .text 9854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .align 2 9855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9856ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 985797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION) 985897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao .global dvmJitToInterpPunt 985997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpPunt: 9860d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 986197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSPunt @ r2<- interpreter entry point 9862d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng mov r3, #0 9863d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9864d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 986597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 986697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao .global dvmJitToInterpSingleStep 986797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpSingleStep: 9868d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str lr,[rGLUE,#offGlue_jitResumeNPC] 9869d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r1,[rGLUE,#offGlue_jitResumeDPC] 987097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSSingleStep @ r2<- interpreter entry point 9871d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 987297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 98737a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng .global dvmJitToInterpNoChainNoProfile 98747a2697d327936e20ef5484f7819e2e4bf91c891fBen ChengdvmJitToInterpNoChainNoProfile: 98757a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 98767a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r0,rPC @ pass our target PC 98777a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r2,#kSVSNoProfile @ r2<- interpreter entry point 98787a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r3, #0 @ 0 means !inJitCodeCache 98797a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng str r3, [r10, #offThread_inJitCodeCache] @ back to the interp land 98807a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng b jitSVShadowRunEnd @ doesn't return 98817a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng 988240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpTraceSelectNoChain 988340094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain: 9884d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 988540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r0,rPC @ pass our target PC 98867a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r2,#kSVSTraceSelect @ r2<- interpreter entry point 98877a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r3, #0 @ 0 means !inJitCodeCache 9888d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9889d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 989040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng 989140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpTraceSelect 989240094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect: 9893d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 98949a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr r0,[lr, #-1] @ pass our target PC 989597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSTraceSelect @ r2<- interpreter entry point 98967a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r3, #0 @ 0 means !inJitCodeCache 9897d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9898d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 989997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 990040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpBackwardBranch 990140094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpBackwardBranch: 9902d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 99039a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr r0,[lr, #-1] @ pass our target PC 990497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSBackwardBranch @ r2<- interpreter entry point 99057a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r3, #0 @ 0 means !inJitCodeCache 9906d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9907d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 990897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 990997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao .global dvmJitToInterpNormal 991097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNormal: 9911d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 99129a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr r0,[lr, #-1] @ pass our target PC 991397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSNormal @ r2<- interpreter entry point 99147a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r3, #0 @ 0 means !inJitCodeCache 9915d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9916d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 991797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 991897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao .global dvmJitToInterpNoChain 991997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNoChain: 9920d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 992197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r0,rPC @ pass our target PC 992297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSNoChain @ r2<- interpreter entry point 99237a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r3, #0 @ 0 means !inJitCodeCache 9924d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9925d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 992697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else 9927ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 9928ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter when the compiler is 9929ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * having issues translating/executing a Dalvik instruction. We have to skip 9930ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the code cache lookup otherwise it is possible to indefinitely bouce 9931ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * between the interpreter and the code cache if the instruction that fails 9932ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * to be compiled happens to be at a trace start. 9933ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 9934ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmJitToInterpPunt 9935ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpPunt: 99367a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 9937ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rPC, r0 9938978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING) 9939ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,lr 9940ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmBumpPunt; 9941ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 9942ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng EXPORT_PC() 99437a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r0, #0 99447a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9945ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng adrl rIBASE, dvmAsmInstructionStart 9946ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_INST() 9947ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 9948ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) 9949ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9950ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 9951ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return to the interpreter to handle a single instruction. 9952ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * On entry: 9953ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * r0 <= PC 9954ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * r1 <= PC of resume instruction 9955ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * lr <= resume point in translation 9956ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 9957ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmJitToInterpSingleStep 9958ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpSingleStep: 9959d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str lr,[rGLUE,#offGlue_jitResumeNPC] 9960d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r1,[rGLUE,#offGlue_jitResumeDPC] 9961ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,#kInterpEntryInstr 9962ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ enum is 4 byte in aapcs-EABI 9963ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r1, [rGLUE, #offGlue_entryPoint] 9964ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rPC,r0 9965ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng EXPORT_PC() 99667a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 9967ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng adrl rIBASE, dvmAsmInstructionStart 9968ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r2,#kJitSingleStep @ Ask for single step and then revert 9969ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r2,[rGLUE,#offGlue_jitState] 9970ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,#1 @ set changeInterp to bail to debug interp 9971ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_gotoBail 9972ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 997340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/* 997440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * Return from the translation cache and immediately request 997540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * a translation for the exit target. Commonly used for callees. 997640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */ 997740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpTraceSelectNoChain 997840094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain: 9979978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING) 998040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng bl dvmBumpNoChain 998140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng#endif 998240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 998340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r0,rPC 998440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng bl dvmJitGetCodeAddr @ Is there a translation? 998540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 998640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r1, rPC @ arg1 of translation may need this 998740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov lr, #0 @ in case target is HANDLER_INTERPRET 99887a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng cmp r0,#0 @ !0 means translation exists 998940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng bxne r0 @ continue native execution if so 99907a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng b 2f @ branch over to use the interpreter 9991ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9992ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 9993ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache and immediately request 9994ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a translation for the exit target. Commonly used following 9995ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * invokes. 9996ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 999740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpTraceSelect 999840094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect: 99999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr rPC,[lr, #-1] @ get our target PC 100007a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 100019a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee add rINST,lr,#-5 @ save start of chain branch 10002bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee add rINST, #-4 @ .. which is 9 bytes back 10003ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,rPC 100047a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng bl dvmJitGetCodeAddr @ Is there a translation? 100057a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 10006ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10007ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng beq 2f 10008ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,rINST 10009ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitChain @ r0<- dvmJitChain(codeAddr,chainAddr) 100109a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r1, rPC @ arg1 of translation may need this 100119a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov lr, #0 @ in case target is HANDLER_INTERPRET 1001246cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee cmp r0,#0 @ successful chain? 1001346cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee bxne r0 @ continue native execution 1001446cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee b toInterpreter @ didn't chain - resume with interpreter 10015ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10016ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* No translation, so request one if profiling isn't disabled*/ 10017ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng2: 100181da12167d913efde56ec3b40491524b051679f2cAndy McFadden adrl rIBASE, dvmAsmInstructionStart 10019ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 10020ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_INST() 10021ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0, #0 1002240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng movne r2,#kJitTSelectRequestHot @ ask for trace selection 10023ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_selectTrace 10024ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 10025ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) 10026ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10027ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10028ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter. 10029ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The return was done with a BLX from thumb mode, and 10030ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the following 32-bit word contains the target rPC value. 10031ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Note that lr (r14) will have its low-order bit set to denote 10032ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * its thumb-mode origin. 10033ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 10034ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * We'll need to stash our lr origin away, recover the new 10035ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * target and then check to see if there is a translation available 10036ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for our new target. If so, we do a translation chain and 10037ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * go back to native execution. Otherwise, it's back to the 10038ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * interpreter (after treating this entry as a potential 10039ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace start). 10040ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 10041ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmJitToInterpNormal 10042ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNormal: 100439a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr rPC,[lr, #-1] @ get our target PC 100447a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 100459a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee add rINST,lr,#-5 @ save start of chain branch 10046bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee add rINST,#-4 @ .. which is 9 bytes back 10047978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING) 10048ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmBumpNormal 10049ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10050ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,rPC 10051ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitGetCodeAddr @ Is there a translation? 100527a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 10053ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1005446cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee beq toInterpreter @ go if not, otherwise do chain 10055ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,rINST 10056ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitChain @ r0<- dvmJitChain(codeAddr,chainAddr) 100579a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r1, rPC @ arg1 of translation may need this 100589a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov lr, #0 @ in case target is HANDLER_INTERPRET 1005946cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee cmp r0,#0 @ successful chain? 1006046cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee bxne r0 @ continue native execution 1006146cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee b toInterpreter @ didn't chain - resume with interpreter 10062ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10063ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10064ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter to do method invocation. 10065ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Check if translation exists for the callee, but don't chain to it. 10066ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 100677a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng .global dvmJitToInterpNoChainNoProfile 100687a2697d327936e20ef5484f7819e2e4bf91c891fBen ChengdvmJitToInterpNoChainNoProfile: 100697a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#if defined(WITH_JIT_TUNING) 100707a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng bl dvmBumpNoChain 100717a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#endif 100727a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 100737a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r0,rPC 100747a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng bl dvmJitGetCodeAddr @ Is there a translation? 100757a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 100767a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov r1, rPC @ arg1 of translation may need this 100777a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng mov lr, #0 @ in case target is HANDLER_INTERPRET 100787a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng cmp r0,#0 100797a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng bxne r0 @ continue native execution if so 100807a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng EXPORT_PC() 100817a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng adrl rIBASE, dvmAsmInstructionStart 100827a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng FETCH_INST() 100837a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 100847a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng GOTO_OPCODE(ip) @ jump to next instruction 100857a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng 100867a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng/* 100877a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng * Return from the translation cache to the interpreter to do method invocation. 100887a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng * Check if translation exists for the callee, but don't chain to it. 100897a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng */ 10090ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmJitToInterpNoChain 10091ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNoChain: 10092978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING) 10093ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmBumpNoChain 10094ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 100957a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 10096ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,rPC 10097ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitGetCodeAddr @ Is there a translation? 100987a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 100999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r1, rPC @ arg1 of translation may need this 101009a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov lr, #0 @ in case target is HANDLER_INTERPRET 10101ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10102ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxne r0 @ continue native execution if so 1010397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 10104ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * No translation, restore interpreter regs and start interpreting. 10107ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * rGLUE & rFP were preserved in the translated code, and rPC has 10108ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * already been restored by the time we get here. We'll need to set 10109ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * up rIBASE & rINST, and load the address of the JitTable into r0. 10110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 1011146cd5b63c29d3284a9ff3e0d0711fb136f409313Bill BuzbeetoInterpreter: 10112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng EXPORT_PC() 10113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng adrl rIBASE, dvmAsmInstructionStart 10114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_INST() 10115ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 10116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ NOTE: intended fallthrough 101177a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng 10118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Common code to update potential trace start counter, and initiate 10120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a trace-build if appropriate. On entry, rPC should point to the 10121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * next instruction to execute, and rINST should be already loaded with 10122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the next opcode word, and r0 holds a pointer to the jit profile 10123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * table (pJitProfTable). 10124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 10125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_testUpdateProfile: 10126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 10128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE_IFEQ(ip) @ if not profiling, fallthrough otherwise */ 10129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10130ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_updateProfile: 10131ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng eor r3,rPC,rPC,lsr #12 @ cheap, but fast hash function 101327b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng lsl r3,r3,#(32 - JIT_PROF_SIZE_LOG_2) @ shift out excess bits 101337b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng ldrb r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter 10134ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 10135ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng subs r1,r1,#1 @ decrement counter 101367b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng strb r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it 10137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE_IFNE(ip) @ if not threshold, fallthrough otherwise */ 10138ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10140ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Here, we switch to the debug interpreter to request 10141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace selection. First, though, check to see if there 10142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * is already a native translation in place (and, if so, 10143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * jump to it now). 10144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 10145d726991ba52466cde88e37aba4de2395b62477faBill Buzbee GET_JIT_THRESHOLD(r1) 101467a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 101477b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng strb r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter 10148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng EXPORT_PC() 10149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,rPC 10150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitGetCodeAddr @ r0<- dvmJitGetCodeAddr(rPC) 101517a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 101527a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r1, rPC @ arg1 of translation may need this 101537a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov lr, #0 @ in case target is HANDLER_INTERPRET 10154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1015597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION) 10156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxne r0 @ jump to the translation 1015740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r2,#kJitTSelectRequest @ ask for trace selection 1015840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng @ fall-through to common_selectTrace 1015997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else 1016040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng moveq r2,#kJitTSelectRequest @ ask for trace selection 101619a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee beq common_selectTrace 101629a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee /* 101639a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * At this point, we have a target translation. However, if 101649a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * that translation is actually the interpret-only pseudo-translation 101659a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * we want to treat it the same as no translation. 101669a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee */ 10167d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng mov r10, r0 @ save target 101689a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee bl dvmCompilerGetInterpretTemplate 10169d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng cmp r0, r10 @ special case? 10170d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng bne jitSVShadowRunStart @ set up self verification shadow space 101714934b377d9cf5df6f80da7caab4f2178c6cec307Ben Cheng @ Need to clear the inJitCodeCache flag 101724934b377d9cf5df6f80da7caab4f2178c6cec307Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ r10 <- glue->self 101734934b377d9cf5df6f80da7caab4f2178c6cec307Ben Cheng mov r3, #0 @ 0 means not in the JIT code cache 101744934b377d9cf5df6f80da7caab4f2178c6cec307Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ back to the interp land 101759a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee GET_INST_OPCODE(ip) 101769a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee GOTO_OPCODE(ip) 101779a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee /* no return */ 1017897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 101799a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee 1018040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/* 1018140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * On entry: 1018240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot 1018340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */ 10184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_selectTrace: 10185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r2,[rGLUE,#offGlue_jitState] 101869c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng mov r2,#kInterpEntryInstr @ normal entry reason 101879c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng str r2,[rGLUE,#offGlue_entryPoint] 10188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,#1 @ set changeInterp 10189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_gotoBail 10190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1019197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION) 1019297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/* 1019397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Save PC and registers to shadow memory for self verification mode 1019497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping to native translation. 10195d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * On entry: 10196d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * rPC, rFP, rGLUE: the values that they should contain 10197d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * r10: the address of the target translation. 1019897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */ 10199d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunStart: 1020097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r0,rPC @ r0<- program counter 1020197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r1,rFP @ r1<- frame pointer 1020297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,rGLUE @ r2<- InterpState pointer 102039a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r3,r10 @ r3<- target translation 1020497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao bl dvmSelfVerificationSaveState @ save registers to shadow space 10205ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space 10206ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng add rGLUE,r0,#offShadowSpace_interpState @ rGLUE<- rGLUE in shadow space 10207ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng bx r10 @ jump to the translation 1020897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 1020997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/* 1021097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Restore PC, registers, and interpState to original values 1021197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping back to the interpreter. 1021297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */ 10213d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunEnd: 1021497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r1,rFP @ pass ending fp 1021597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao bl dvmSelfVerificationRestoreState @ restore pc and fp values 10216ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr rPC,[r0,#offShadowSpace_startPC] @ restore PC 10217ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr rFP,[r0,#offShadowSpace_fp] @ restore FP 10218ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr rGLUE,[r0,#offShadowSpace_glue] @ restore InterpState 10219ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr r1,[r0,#offShadowSpace_svState] @ get self verification state 1022097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao cmp r1,#0 @ check for punt condition 1022197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao beq 1f 1022297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kJitSelfVerification @ ask for self verification 1022397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao str r2,[rGLUE,#offGlue_jitState] 1022430f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng mov r2,#kInterpEntryInstr @ normal entry reason 1022530f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng str r2,[rGLUE,#offGlue_entryPoint] 1022697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r1,#1 @ set changeInterp 1022797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao b common_gotoBail 1022897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 1022997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao1: @ exit to interpreter without check 1023097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao EXPORT_PC() 1023197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao adrl rIBASE, dvmAsmInstructionStart 1023297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao FETCH_INST() 1023397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao GET_INST_OPCODE(ip) 1023497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao GOTO_OPCODE(ip) 1023597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 1023697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 10237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backward branch is taken. 10241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10242c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * TODO: we could avoid a branch by just setting r0 and falling through 10243c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * into the common_periodicChecks code, and having a test on r0 at the 10244c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * end determine if we should return to the caller or update & branch to 10245c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * the next instr. 10246c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 is PC adjustment *in bytes* 10249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch: 10251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #kInterpEntryInstr 10252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_periodicChecks 10253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 10254ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 10255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 10256ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 10258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 10259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) 10260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 10261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 10262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Need to see if the thread needs to be suspended or debugger/profiler 10269c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * activity has begun. If so, we suspend the thread or side-exit to 10270c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * the debug interpreter as appropriate. 10271c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10272c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * The common case is no activity on any of these, so we want to figure 10273c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * that out quickly. If something is up, we can then sort out what. 10274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10275c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * We want to be fast if the VM was built without debugger or profiler 10276c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * support, but we also need to recognize that the system is usually 10277c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * shipped with both of these enabled. 10278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: reduce this so we're just checking a single location. 10280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10282c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * r0 is reentry type, e.g. kInterpEntryInstr (for debugger/profiling) 10283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 is trampoline PC adjustment *in bytes* 10284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks: 10286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_pSelfSuspendCount] @ r3<- &suspendCount 10287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [rGLUE, #offGlue_pDebuggerActive] @ r1<- &debuggerActive 10289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_pActiveProfilers] @ r2<- &activeProfilers 10290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10291c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr ip, [r3] @ ip<- suspendCount (int) 10292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10293c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden cmp r1, #0 @ debugger enabled? 10294c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldrneb r1, [r1] @ yes, r1<- debuggerActive (boolean) 10295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2] @ r2<- activeProfilers (int) 10296c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden orrne ip, ip, r1 @ ip<- suspendCount | debuggerActive 10297c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden orrs ip, ip, r2 @ ip<- suspend|debugger|profiler; set Z 10298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10299c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden bxeq lr @ all zero, return 10300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10301c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden /* 10302c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * One or more interesting events have happened. Figure out what. 10303c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10304c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * If debugging or profiling are compiled in, we need to disambiguate. 10305c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10306c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * r0 still holds the reentry type. 10307c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden */ 10308c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr ip, [r3] @ ip<- suspendCount (int) 10309c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden cmp ip, #0 @ want suspend? 10310c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden beq 1f @ no, must be debugger/profiler 10311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10312c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden stmfd sp!, {r0, lr} @ preserve r0 and lr 10313964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT) 10314964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee /* 10315964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee * Refresh the Jit's cached copy of profile table pointer. This pointer 10316964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee * doubles as the Jit's on/off switch. 10317964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee */ 10318d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r3, [rGLUE, #offGlue_ppJitProfTable] @ r3<-&gDvmJit.pJitProfTable 10319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 10320d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r3, [r3] @ r3 <- pJitProfTable 1032199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project EXPORT_PC() @ need for precise GC 10322964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee str r3, [rGLUE, #offGlue_pJitProfTable] @ refresh Jit's on/off switch 10323964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#else 10324964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 10325964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee EXPORT_PC() @ need for precise GC 10326964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif 10327c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden bl dvmCheckSuspendPending @ do full check, suspend if necessary 10328c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldmfd sp!, {r0, lr} @ restore r0 and lr 10329c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden 10330c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden /* 10331c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * Reload the debugger/profiler enable flags. We're checking to see 10332c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * if either of these got set while we were suspended. 10333c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10334c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * We can't really avoid the #ifdefs here, because the fields don't 10335c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * exist when the feature is disabled. 10336c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden */ 10337c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr r1, [rGLUE, #offGlue_pDebuggerActive] @ r1<- &debuggerActive 10338c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden cmp r1, #0 @ debugger enabled? 10339c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldrneb r1, [r1] @ yes, r1<- debuggerActive (boolean) 10340c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr r2, [rGLUE, #offGlue_pActiveProfilers] @ r2<- &activeProfilers 10341c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr r2, [r2] @ r2<- activeProfilers (int) 10342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10343c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden orrs r1, r1, r2 10344c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden beq 2f 10345c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden 10346c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden1: @ debugger/profiler enabled, bail out; glue->entryPoint was set above 10347c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden str r0, [rGLUE, #offGlue_entryPoint] @ store r0, need for debug/prof 10348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add rPC, rPC, r9 @ update rPC 10349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ "want switch" = true 10350c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden b common_gotoBail @ side exit 10351c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden 10352c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden2: 10353c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden bx lr @ nothing to do, return 10354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The equivalent of "goto bail", this calls through the "bail handler". 10358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * State registers will be saved to the "glue" area before bailing. 10360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 is "bool changeInterp", indicating if we want to switch to the 10363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * other interpreter or just bail all the way out 10364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail: 10366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_FP_TO_GLUE() @ export state to "glue" 10367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rGLUE @ r0<- glue ptr 10368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b dvmMterpStdBail @ call(glue, changeInterp) 10369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @add r1, r1, #1 @ using (boolean+1) 10371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @add r0, rGLUE, #offGlue_jmpBuf @ r0<- &glue->jmpBuf 10372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl _longjmp @ does not return 10373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_abort 10374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation with range. 10378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 is "Method* methodToCall", the method we're trying to call 10381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodRange: 10383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewRange: 10384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ prepare to copy args to "outs" area of current frame 10385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r2, rINST, lsr #8 @ r2<- AA (arg count) -- test for zero 10386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r10, rFP) @ r10<- stack save area 10387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LinvokeArgsDone @ if no args, skip the rest 10388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- CCCC 10389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=methodToCall, r1=CCCC, r2=count, r10=outs 10391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ (very few methods have > 10 args; could unroll for common cases) 10392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r1, lsl #2 @ r3<- &fp[CCCC] 10393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r10, r10, r2, lsl #2 @ r10<- "outs" area, for call args 10394642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r9, [r0, #offMethod_registersSize] @ r9<- methodToCall->regsSize 10395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: ldr r1, [r3], #4 @ val = *fp++ 10396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r2, r2, #1 @ count-- 10397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r10], #4 @ *outs++ = val 10398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1b @ ...while count != 0 10399642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r3, [r0, #offMethod_outsSize] @ r3<- methodToCall->outsSize 10400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LinvokeArgsDone 10401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation without range. 10404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 is "Method* methodToCall", the method we're trying to call 10407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodNoRange: 10409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewNoRange: 10410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ prepare to copy args to "outs" area of current frame 10411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r2, rINST, lsr #12 @ r2<- B (arg count) -- test for zero 10412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r10, rFP) @ r10<- stack save area 10413642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng FETCH(r1, 2) @ r1<- GFED (load here to hide latency) 10414642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r9, [r0, #offMethod_registersSize] @ r9<- methodToCall->regsSize 10415642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r3, [r0, #offMethod_outsSize] @ r3<- methodToCall->outsSize 10416642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng beq .LinvokeArgsDone 10417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10418642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng @ r0=methodToCall, r1=GFED, r3=outSize, r2=count, r9=regSize, r10=outs 10419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNonRange: 10420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r2, r2, #5 @ r2<- 5-r2 10421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add pc, pc, r2, lsl #4 @ computed goto, 4 instrs each 10422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort @ (skipped due to ARM prefetch) 10423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project5: and ip, rINST, #0x0f00 @ isolate A 10424642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsr #6] @ r2<- vA (shift right 8, left 2) 10425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10426642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vA 10427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4: and ip, r1, #0xf000 @ isolate G 10428642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsr #10] @ r2<- vG (shift right 12, left 2) 10429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10430642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vG 10431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3: and ip, r1, #0x0f00 @ isolate F 10432642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsr #6] @ r2<- vF 10433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10434642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vF 10435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: and ip, r1, #0x00f0 @ isolate E 10436642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsr #2] @ r2<- vE 10437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10438642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vE 10439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and ip, r1, #0x000f @ isolate D 10440642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsl #2] @ r2<- vD 10441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10442642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vD 10443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: @ fall through to .LinvokeArgsDone 10444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10445642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng.LinvokeArgsDone: @ r0=methodToCall, r3=outSize, r9=regSize 10446642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [r0, #offMethod_insns] @ r2<- method->insns 10447642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr rINST, [r0, #offMethod_clazz] @ rINST<- method->clazz 10448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ find space for the new stack frame, check for overflow 10449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r1, rFP) @ r1<- stack save area 10450642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng sub r1, r1, r9, lsl #2 @ r1<- newFp (old savearea - regsSize) 10451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r10, r1) @ r10<- newSaveArea 10452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@ bl common_dumpRegs 10453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [rGLUE, #offGlue_interpStackEnd] @ r9<- interpStackEnd 10454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r3, r10, r3, lsl #2 @ r3<- bottom (newsave - outsSize) 10455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, r9 @ bottom < interpStackEnd? 10456642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags 104577a44e4ee0782d24b4c6090be1f0a3c66f971f2c1Andy McFadden blo .LstackOverflow @ yes, this frame will overflow stack 10458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ set up newSaveArea 10460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB 10461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(ip, rFP) @ ip<- stack save area 10462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str ip, [r10, #offStackSaveArea_prevSave] 10463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rFP, [r10, #offStackSaveArea_prevFrame] 10465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rPC, [r10, #offStackSaveArea_savedPc] 10466ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 10467ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r9, #0 10468ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r9, [r10, #offStackSaveArea_returnAddr] 10469ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r10, #offStackSaveArea_method] 10471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project tst r3, #ACC_NATIVE 10472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LinvokeNative 10473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0-r3} 10476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_printNewline 10477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rFP 10478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmDumpFp 10480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0-r3} 10481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0-r3} 10482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r1 10483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 10484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmDumpFp 10485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_printNewline 10486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0-r3} 10487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10489642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r9, [r2] @ r9 <- load INST from new PC 10490642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex 10491642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng mov rPC, r2 @ publish new rPC 10492642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rGLUE, #offGlue_self] @ r2<- glue->self 10493642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng 10494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Update "glue" values for the new method 10495642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng @ r0=methodToCall, r1=newFp, r2=self, r3=newMethodClass, r9=newINST 10496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [rGLUE, #offGlue_method] @ glue->method = methodToCall 10497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ... 10498ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 10499ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 10500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov rFP, r1 @ fp = newFp 10501642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng GET_PREFETCHED_OPCODE(ip, r9) @ extract prefetched opcode from r9 10502642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng mov rINST, r9 @ publish new rINST 10503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r2, #offThread_curFrame] @ self->curFrame = newFp 10504ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10505ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 10506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10507ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 10508ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rFP, r1 @ fp = newFp 10509ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_PREFETCHED_OPCODE(ip, r9) @ extract prefetched opcode from r9 10510ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rINST, r9 @ publish new rINST 10511ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r1, [r2, #offThread_curFrame] @ self->curFrame = newFp 10512ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 10513ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNative: 10516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Prep for the native call 10517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=methodToCall, r1=newFp, r10=newSaveArea 10518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_self] @ r3<- glue->self 10519d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden ldr r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->... 10520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r3, #offThread_curFrame] @ self->curFrame = newFp 10521d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden str r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top 10522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r3 @ r9<- glue->self (preserve) 10523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r0 @ r2<- methodToCall 10525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r1 @ r0<- newFp (points to args) 10526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rGLUE, #offGlue_retval @ r1<- &retval 10527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER 10529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* insert fake function header to help gdb find the stack frame */ 10530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .Lskip 10531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dalvik_mterp, %function 10532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_mterp: 10533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnstart 10534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY1 10535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY2 10536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lskip: 10537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @mov lr, pc @ set return addr 10540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ldr pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc 10541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LDR_PC_LR "[r2, #offMethod_nativeFunc]" 10542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10543964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT) 10544964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r3, [rGLUE, #offGlue_ppJitProfTable] @ Refresh Jit's on/off status 10545964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif 10546964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee 10547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ native return; r9=self, r10=newSaveArea 10548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ equivalent to dvmPopJniLocals 10549d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden ldr r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top 10550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r9, #offThread_exception] @ check for exception 10551964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT) 10552964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r3, [r3] @ r3 <- gDvmJit.pProfTable 10553964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif 10554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rFP, [r9, #offThread_curFrame] @ self->curFrame = fp 10555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null? 10556d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden str r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top 10557964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT) 10558964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee str r3, [rGLUE, #offGlue_pJitProfTable] @ refresh cached on/off switch 10559964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif 10560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_exceptionThrown @ no, handle exception 10561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 10563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 105666ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow: @ r0=methodToCall 105676ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden mov r1, r0 @ r1<- methodToCall 10568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- self 10569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmHandleStackOverflow 10570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER 10572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnend 10573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation, calling through "glue code". 10578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: now that we have range and non-range invoke handlers, this 10580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * needs to be split into two. Maybe just create entry points 10581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that set r9 and jump here? 10582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 is "Method* methodToCall", the method we're trying to call 10585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 is "bool methodCallRange", indicating if this is a /range variant 10586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 10588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeOld: 10589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #8 @ space for args + pad 10590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(ip, 2) @ ip<- FEDC or CCCC 10591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r0 @ A2<- methodToCall 10592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rGLUE @ A0<- glue 10593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_FP_TO_GLUE() @ export state to "glue" 10594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r9 @ A1<- methodCallRange 10595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ A3<- AA 10596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str ip, [sp, #0] @ A4<- ip 10597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterp_invokeMethod @ call the C invokeMethod 10598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #8 @ remove arg area 10599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_resumeAfterGlueCall @ continue to next instruction 10600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 10601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction. 10606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return. 10608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod: 10610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnNew: 10611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #kInterpEntryReturn 10612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #0 10613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_periodicChecks 10614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r0, rFP) @ r0<- saveArea (old) 10616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame 10617642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc 10618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)] 10619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r2<- method we're returning to 10620642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r3, [rGLUE, #offGlue_self] @ r3<- glue->self 10621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ is this a break frame? 10622642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrne r10, [r2, #offMethod_clazz] @ r10<- method->clazz 10623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 @ "want switch" = false 10624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_gotoBail @ break frame, bail out completely 10625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10626642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST 10627642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method 10628642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r1, [r10, #offClassObject_pDvmDex] @ r1<- method->clazz->pDvmDex 10629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rFP, [r3, #offThread_curFrame] @ self->curFrame = fp 10630ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 106317a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr 10632ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rPC, r9 @ publish new rPC 10633ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r1, [rGLUE, #offGlue_methodClassDex] 106347a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r10, [r3, #offThread_inJitCodeCache] @ may return to JIT'ed land 106357a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng cmp r10, #0 @ caller is compiled code 106367a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng blxne r10 10637ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 10638ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 10639ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 10640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10641642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng mov rPC, r9 @ publish new rPC 10642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [rGLUE, #offGlue_methodClassDex] 10643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10644ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return handling, calls through "glue code". 10648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 10650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnOld: 10651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_FP_TO_GLUE() @ export state 10652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rGLUE @ arg to function 10653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterp_returnFromMethod 10654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_resumeAfterGlueCall 10655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 10656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception. Handle it. 10660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling 10662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction 10663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be. 10664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return. 10666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10667ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmMterpCommonExceptionThrown 10668ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmMterpCommonExceptionThrown: 10669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown: 10670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionNew: 10671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #kInterpEntryThrow 10672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #0 10673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_periodicChecks 10674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r10, [rGLUE, #offGlue_self] @ r10<- glue->self 10676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [r10, #offThread_exception] @ r9<- self->exception 10677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- self 10678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- exception 10679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAddTrackedAlloc @ don't let the exception be GCed 10680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, #0 @ r3<- NULL 10681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r10, #offThread_exception] @ self->exception = NULL 10682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* set up args and a local for "&fp" */ 10684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* (str sp, [sp, #-4]! would be perfect here, but is discouraged) */ 10685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rFP, [sp, #-4]! @ *--sp = fp 10686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov ip, sp @ ip<- &fp 10687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, #0 @ r3<- false 10688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str ip, [sp, #-4]! @ *--sp = &fp 10689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [rGLUE, #offGlue_method] @ r1<- glue->method 10690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r10 @ r0<- self 10691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offMethod_insns] @ r1<- method->insns 10692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r9 @ r2<- exception 10693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r1, rPC, r1 @ r1<- pc - method->insns 10694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asr #1 @ r1<- offset in code units 10695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* call, r0 gets catchRelPc (a code-unit offset) */ 10697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmFindCatchBlock @ call(self, relPc, exc, scan?, &fp) 10698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fix earlier stack overflow if necessary; may trash rFP */ 10700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r1, [r10, #offThread_stackOverflowed] 10701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ did we overflow earlier? 10702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ no, skip ahead 10703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov rFP, r0 @ save relPc result in rFP 10704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r10 @ r0<- self 107054fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden mov r1, r9 @ r1<- exception 10706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmCleanupStackOverflow @ call(self) 10707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rFP @ restore result 10708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 10709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* update frame pointer and check result from dvmFindCatchBlock */ 10711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr rFP, [sp, #4] @ retrieve the updated rFP 10712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is catchRelPc < 0? 10713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #8 @ restore stack 10714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi .LnotCaughtLocally 10715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* adjust locals to match self->curFrame and updated PC */ 10717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r1, rFP) @ r1<- new save area 10718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offStackSaveArea_method] @ r1<- new method 10719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [rGLUE, #offGlue_method] @ glue->method = new method 10720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r1, #offMethod_clazz] @ r2<- method->clazz 10721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offMethod_insns] @ r3<- method->insns 10722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex 10723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add rPC, r3, r0, asl #1 @ rPC<- method->insns + catchRelPc 10724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r2, [rGLUE, #offGlue_methodClassDex] @ glue->pDvmDex = meth... 10725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* release the tracked alloc on the exception */ 10727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- exception 10728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- self 10729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmReleaseTrackedAlloc @ release the exception 10730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* restore the exception if the handler wants it */ 10732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST() @ load rINST from rPC 10733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp ip, #OP_MOVE_EXCEPTION @ is it "move-exception"? 10735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project streq r9, [r10, #offThread_exception] @ yes, restore the exception 10736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LnotCaughtLocally: @ r9=exception, r10=self 10739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fix stack overflow if necessary */ 10740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r1, [r10, #offThread_stackOverflowed] 10741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ did we overflow earlier? 10742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, r10 @ if yes: r0<- self 107434fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden movne r1, r9 @ if yes: r1<- exception 10744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blne dvmCleanupStackOverflow @ if yes: call(self) 10745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ may want to show "not caught locally" debug messages here 10747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if DVM_SHOW_EXCEPTION >= 2 10748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* call __android_log_print(prio, tag, format, ...) */ 10749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* "Exception %s from %s:%d not caught locally" */ 10750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ dvmLineNumFromPC(method, pc - method->insns) 10751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] 10752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offMethod_insns] 10753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r1, rPC, r1 10754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project asr r1, r1, #1 10755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmLineNumFromPC 10756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [sp, #-4]! 10757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ dvmGetMethodSourceFile(method) 10758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] 10759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmGetMethodSourceFile 10760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [sp, #-4]! 10761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ exception->clazz->descriptor 10762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r9, #offObject_clazz] 10763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offClassObject_descriptor] 10764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ 10765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, strExceptionNotCaughtLocally 10766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, strLogTag 10767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #3 @ LOG_DEBUG 10768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __android_log_print 10769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r9, [r10, #offThread_exception] @ restore exception 10771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- exception 10772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- self 10773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmReleaseTrackedAlloc @ release the exception 10774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 @ "want switch" = false 10775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_gotoBail @ bail out 10776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Exception handling, calls through "glue code". 10780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 10782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionOld: 10783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_FP_TO_GLUE() @ export state 10784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rGLUE @ arg to function 10785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterp_exceptionThrown 10786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_resumeAfterGlueCall 10787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 10788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated 10792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values and start executing at the next instruction. 10793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_resumeAfterGlueCall: 10795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOAD_PC_FP_FROM_GLUE() @ pull rPC and rFP out of glue 10796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST() @ load rINST from rPC 10797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array index. 10802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex: 10804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strArrayIndexException 10806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value. 10812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore: 10814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strArrayStoreException 10816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero. 10822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero: 10824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strArithmeticException 10826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, strDivideByZero 10827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size. 10832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize: 10834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strNegativeArraySizeException 10836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invocation of a non-existent method. 10842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod: 10844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strNoSuchMethodError 10846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We encountered a null object when we weren't expecting one. We 10852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * export the PC, throw a NullPointerException, and goto the exception 10853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * processing code. 10854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject: 10856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strNullPointerException 10858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For debugging, cause an immediate fault. The source address will 10864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be in lr (use a bl instruction to jump here). 10865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort: 10867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr pc, .LdeadFood 10868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LdeadFood: 10869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word 0xdeadf00d 10870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out a "we were here", preserving all registers. (The attempt 10873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to save ip won't work, but we need to save an even number of 10874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers for EABI 64-bit stack alignment.) 10875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .macro SQUEAK num 10877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_squeak\num: 10878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strSqueak 10880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #\num 10881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endm 10885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 0 10887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 1 10888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 2 10889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 3 10890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 4 10891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 5 10892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out the number in r0, preserving registers. 10895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNum: 10897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0 10899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strSqueak 10900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a newline, preserving registers. 10906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNewline: 10908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strNewline 10910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 32-bit quantity in r0 as a hex value, preserving registers. 10916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printHex: 10918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0 10920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strPrintHex 10921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 64-bit quantity in r0-r1, preserving registers. 10927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printLong: 10929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r1 10931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r0 10932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strPrintLong 10933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print full method info. Pass the Method* in r0. Preserves regs. 10939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printMethod: 10941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterpPrintMethod 10943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Call a C helper function that dumps regs and possibly some 10948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * additional info. Requires the C function to be compiled in. 10949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 10951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_dumpRegs: 10952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterpDumpArmRegs 10954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 10957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10958d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#if 0 10959d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden/* 10960d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Experiment on VFP mode. 10961d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * 10962d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * uint32_t setFPSCR(uint32_t val, uint32_t mask) 10963d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * 10964d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Updates the bits specified by "mask", setting them to the values in "val". 10965d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden */ 10966d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddensetFPSCR: 10967d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden and r0, r0, r1 @ make sure no stray bits are set 10968d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden fmrx r2, fpscr @ get VFP reg 10969d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden mvn r1, r1 @ bit-invert mask 10970d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden and r2, r2, r1 @ clear masked bits 10971d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden orr r2, r2, r0 @ set specified bits 10972d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden fmxr fpscr, r2 @ set VFP reg 10973d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden mov r0, r2 @ return new value 10974d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden bx lr 10975d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden 10976d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden .align 2 10977d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden .global dvmConfigureFP 10978d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden .type dvmConfigureFP, %function 10979d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddendvmConfigureFP: 10980d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden stmfd sp!, {ip, lr} 10981d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden /* 0x03000000 sets DN/FZ */ 10982d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden /* 0x00009f00 clears the six exception enable flags */ 10983d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden bl common_squeak0 10984d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden mov r0, #0x03000000 @ r0<- 0x03000000 10985d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden add r1, r0, #0x9f00 @ r1<- 0x03009f00 10986d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden bl setFPSCR 10987d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden ldmfd sp!, {ip, pc} 10988d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#endif 10989d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden 10990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references, must be close to the code that uses them. 10993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .align 2 10995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArithmeticException: 10996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrArithmeticException 10997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayIndexException: 10998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrArrayIndexException 10999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayStoreException: 11000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrArrayStoreException 11001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrDivideByZero: 11002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrDivideByZero 11003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNegativeArraySizeException: 11004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrNegativeArraySizeException 11005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNoSuchMethodError: 11006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrNoSuchMethodError 11007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNullPointerException: 11008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrNullPointerException 11009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrLogTag: 11011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrLogTag 11012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrExceptionNotCaughtLocally: 11013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrExceptionNotCaughtLocally 11014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNewline: 11016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrNewline 11017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrSqueak: 11018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrSqueak 11019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintHex: 11020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrPrintHex 11021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintLong: 11022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrPrintLong 11023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 11025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Zero-terminated ASCII string data. 11026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On ARM we have two choices: do like gcc does, and LDR from a .word 11028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the address, or use an ADR pseudo-op to get the address 11029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * directly. ADR saves 4 bytes and an indirection, but it's using a 11030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PC-relative addressing mode and hence has a limited range, which 11031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * makes it not work well with mergeable string sections. 11032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 11033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .section .rodata.str1.4,"aMS",%progbits,1 11034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint: 11036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Bad entry point %d\n" 11037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException: 11038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArithmeticException;" 11039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException: 11040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArrayIndexOutOfBoundsException;" 11041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException: 11042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArrayStoreException;" 11043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException: 11044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ClassCastException;" 11045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero: 11046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "divide by zero" 11047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl: 11048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "filled-new-array only implemented for objects and 'int'" 11049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError: 11050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/InternalError;" 11051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError: 11052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/InstantiationError;" 11053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException: 11054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NegativeArraySizeException;" 11055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError: 11056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NoSuchMethodError;" 11057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException: 11058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NullPointerException;" 11059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrLogTag: 11061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "mterp" 11062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrExceptionNotCaughtLocally: 11063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Exception %s from %s:%d not caught locally\n" 11064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNewline: 11066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "\n" 11067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrSqueak: 11068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "<%d>" 11069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintHex: 11070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "<0x%x>" 11071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintLong: 11072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "<%lld>" 11073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11074