InterpAsm-armv5te.S revision 0890e5bf0b2a502ca1030e9773fabc16ef1b5981
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: 3237a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben 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() 3277a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r1, #0 @ prepare the value for the new state 3287a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r1, [r10, #offThread_inJitCodeCache] @ back to the interp land 329ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 330ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 331ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 332ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) 333ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* start executing the instruction at rPC */ 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST() @ load rINST from rPC 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 338ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_instr: 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #kInterpEntryReturn @ were we returning from a method? 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_returnFromMethod 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_return: 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #kInterpEntryThrow @ were we throwing an exception? 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 348ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 349ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.Lnot_throw: 350d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10,[rGLUE, #offGlue_jitResumeNPC] 351d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r2,[rGLUE, #offGlue_jitResumeDPC] 352ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r1, #kInterpEntryResume @ resuming after Jit single-step? 353ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne .Lbad_arg 354ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp rPC,r2 355d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng bne .LentryInstr @ must have branched, don't resume 356d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#if defined(WITH_SELF_VERIFICATION) 357d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng @ glue->entryPoint will be set in dvmSelfVerificationSaveState 358d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunStart @ re-enter the translation after the 359d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng @ single-stepped instruction 360d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng @noreturn 361d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#endif 362ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1, #kInterpEntryInstr 36351ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee str r1, [rGLUE, #offGlue_entryPoint] 364d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng bx r10 @ re-enter the translation 365ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 366ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lbad_arg: 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strBadEntryPoint 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r1 holds value of entryPoint 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAbort 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnend 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmMterpStdBail 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmMterpStdBail, %function 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry. 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper. The 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun. 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pushed some registers on the stack in dvmMterpStdRun, then saved 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SP and LR. Here we restore SP, restore the registers, and then restore 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LR to PC. 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 MterpGlue* glue 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 bool changeInterp 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail: 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr sp, [r0, #offGlue_bailPtr] @ sp<- saved SP 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r1 @ return the changeInterp value 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #4 @ un-align 64 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LDMFD_PC "r4-r10,fp" @ restore 9 regs and return 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references. 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrBadEntryPoint: 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrBadEntryPoint 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmAsmInstructionStart 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmAsmInstructionStart, %function 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .text 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */ 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOP.S */ 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance to next instr, load rINST 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute it 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* insert fake function header to help gdb find the stack frame */ 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dalvik_inst, %function 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_inst: 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnstart 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY1 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY2 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnend 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */ 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */ 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for move, move-object, long-to-int */ 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB */ 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B from 15:12 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A from 11:8 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[B] 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[A]<- r2 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute next instruction 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */ 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */ 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move/from16, move-object/from16 */ 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBBBB */ 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[BBBB] 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[AA]<- r2 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */ 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */ 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move/16, move-object/16 */ 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAAAA, vBBBB */ 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- AAAA 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[BBBB] 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[AAAA]<- r2 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */ 474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE.S */ 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-wide vA, vB */ 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[A] 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- fp[B] 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r2, {r0-r1} @ fp[A]<- r0/r1 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */ 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_FROM16.S */ 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-wide/from16 vAA, vBBBB */ 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 1) @ r3<- BBBB 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB] 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[AA] 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB] 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r2, {r0-r1} @ fp[AA]<- r0/r1 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */ 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_16.S */ 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-wide/16 vAAAA, vBBBB */ 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 2) @ r3<- BBBB 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 1) @ r2<- AAAA 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB] 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[AAAA] 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB] 515445194bc141dc67e2f678aa1bbd5e59ca66254e5Andy McFadden FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r2, {r0-r1} @ fp[AAAA]<- r0/r1 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */ 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT.S */ 524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */ 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for move, move-object, long-to-int */ 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB */ 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B from 15:12 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A from 11:8 529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[B] 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[A]<- r2 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute next instruction 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */ 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */ 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */ 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move/from16, move-object/from16 */ 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBBBB */ 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[BBBB] 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[AA]<- r2 550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */ 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_16.S */ 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */ 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move/16, move-object/16 */ 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAAAA, vBBBB */ 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- AAAA 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[BBBB] 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[AAAA]<- r2 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */ 572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */ 573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move-result, move-result-object */ 574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA */ 575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_retval] @ r0<- glue->retval.i 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[AA]<- r0 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 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_WIDE: /* 0x0b */ 585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_WIDE.S */ 586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-result-wide vAA */ 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rGLUE, #offGlue_retval @ r3<- &glue->retval 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[AA] 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- retval.j 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r2, {r0-r1} @ fp[AA]<- r0/r1 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */ 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */ 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */ 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for: move-result, move-result-object */ 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA */ 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_retval] @ r0<- glue->retval.i 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[AA]<- r0 608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */ 614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_EXCEPTION.S */ 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* move-exception vAA */ 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offThread_exception] @ r3<- dvmGetException bypass 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 @ r1<- 0 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r3, r2) @ fp[AA]<- exception obj 622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offThread_exception] @ dvmClearException bypass 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */ 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_VOID.S */ 630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_returnFromMethod 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */ 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */ 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a 32-bit value. Copies the return value into the "glue" 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * structure, then jumps to the return handler. 639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: return, return-object 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA */ 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vAA 645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA 646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_returnFromMethod 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */ 651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_WIDE.S */ 652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a 64-bit value. Copies the return value into the "glue" 654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * structure, then jumps to the return handler. 655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* return-wide vAA */ 657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[AA] 659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rGLUE, #offGlue_retval @ r3<- &glue->retval 660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1 <- vAA/vAA+1 661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ retval<- r0/r1 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_returnFromMethod 663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */ 667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_OBJECT.S */ 668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */ 669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a 32-bit value. Copies the return value into the "glue" 671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * structure, then jumps to the return handler. 672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: return, return-object 674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA */ 676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vAA 678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA 679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_returnFromMethod 680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_4: /* 0x12 */ 685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_4.S */ 686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/4 vA, #+B */ 687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsl #16 @ r1<- Bxxx0000 688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asr #28 @ r1<- sssssssB (sign-extended) 691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r0) @ fp[A]<- r1 694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute next instruction 695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */ 699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_16.S */ 700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/16 vAA, #+BBBB */ 701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r0, 1) @ r0<- ssssBBBB (sign-extended) 702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r3) @ vAA<- r0 705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */ 711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST.S */ 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const vAA, #+BBBBbbbb */ 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (low) 715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (high) 716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r3) @ vAA<- r0 720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */ 725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_HIGH16.S */ 726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/high16 vAA, #+BBBB0000 */ 727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- 0000BBBB (zero-extended) 728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsl #16 @ r0<- BBBB0000 730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r3) @ vAA<- r0 732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 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_WIDE_16: /* 0x16 */ 738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_16.S */ 739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const-wide/16 vAA, #+BBBB */ 740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r0, 1) @ r0<- ssssBBBB (sign-extended) 741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0, asr #31 @ r1<- ssssssss 743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[AA] 745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ vAA<- r0/r1 747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */ 752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_32.S */ 753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const-wide/32 vAA, #+BBBBbbbb */ 754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- 0000bbbb (low) 755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r2, 2) @ r2<- ssssBBBB (high) 757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb 759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[AA] 760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0, asr #31 @ r1<- ssssssss 761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ vAA<- r0/r1 763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */ 768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE.S */ 769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const-wide vAA, #+HHHHhhhhBBBBbbbb */ 770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (low) 771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (low middle) 772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 3) @ r2<- hhhh (high middle) 773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word) 774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 4) @ r3<- HHHH (high) 775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word) 777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(5) @ advance rPC, load rINST 778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */ 786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_HIGH16.S */ 787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const-wide/high16 vAA, #+BBBB000000000000 */ 788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- 0000BBBB (zero-extended) 789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #0 @ r0<- 00000000 791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsl #16 @ r1<- BBBB0000 792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[AA] 794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ vAA<- r0/r1 796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */ 801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING.S */ 802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/string vAA, String@BBBB */ 803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- glue->methodClassDex 805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResStrings] @ r2<- dvmDex->pResStrings 807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- pResStrings[BBBB] 808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ not yet resolved? 809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CONST_STRING_resolve 810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */ 818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING_JUMBO.S */ 819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/string vAA, String@BBBBBBBB */ 820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (low) 821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (high) 822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- glue->methodClassDex 823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResStrings] @ r2<- dvmDex->pResStrings 825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb 826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- pResStrings[BBBB] 827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CONST_STRING_JUMBO_resolve 829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */ 837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_CLASS.S */ 838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* const/class vAA, Class@BBBB */ 839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- glue->methodClassDex 841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResClasses] @ r2<- dvmDex->pResClasses 843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- pResClasses[BBBB] 844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ not yet resolved? 845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CONST_CLASS_resolve 846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */ 854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_ENTER.S */ 855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Synchronize on an object. 857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* monitor-enter vAA */ 859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- vAA (object) 861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null object? 86399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project EXPORT_PC() @ need for precise GC, MONITOR_TRACKING 864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null object, throw an exception 865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmLockObject @ call(self, obj) 867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION /* implies WITH_MONITOR_TRACKING */ 868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offThread_exception] @ check for exception 870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_exceptionThrown @ exception raised, bail out 872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */ 879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_EXIT.S */ 880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlock an object. 882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Exceptions that occur when unlocking a monitor need to appear as 884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if they happened at the following instruction. See the Dalvik 885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction spec. 886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* monitor-exit vAA */ 888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ before fetch: export the PC 890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- vAA (object) 891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null object? 8926bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee beq 1f @ yes 893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmUnlockObject @ r0<- success for unlock(self, obj) 895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ before throw: advance rPC, load rINST 8976bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee beq common_exceptionThrown @ yes, exception is pending 898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9006bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee1: 9016bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee FETCH_ADVANCE_INST(1) @ advance before throw 9026bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee b common_errNullObject 903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */ 907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CHECK_CAST.S */ 908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check to see if a cast from one class to another is allowed. 910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* check-cast vAA, class@BBBB */ 912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 1) @ r2<- BBBB 914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r3) @ r9<- object 915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_methodClassDex] @ r0<- pDvmDex 916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ is object null? 917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offDvmDex_pResClasses] @ r0<- pDvmDex->pResClasses 918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CHECK_CAST_okay @ null obj, cast always succeeds 919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, r2, lsl #2] @ r1<- resolved class 920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz 921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ have we resolved this before? 922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_CHECK_CAST_resolve @ not resolved, do it now 923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved: 924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, r1 @ same class (trivial success)? 925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_CHECK_CAST_fullcheck @ no, do full check 926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay: 927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */ 934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INSTANCE_OF.S */ 935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check to see if an object reference is an instance of a class. 937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Most common situation is a non-null object, being compared against 939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an already-resolved class. 940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* instance-of vA, vB, class@CCCC */ 942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB (object) 945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 @ r9<- A 946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is object null? 947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- pDvmDex 948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INSTANCE_OF_store @ null obj, not an instance, store r0 949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 1) @ r3<- CCCC 950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResClasses] @ r2<- pDvmDex->pResClasses 951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r2, r3, lsl #2] @ r1<- resolved class 952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offObject_clazz] @ r0<- obj->clazz 953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ have we resolved this before? 954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INSTANCE_OF_resolve @ not resolved, do it now 955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class 956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, r1 @ same class (trivial success)? 957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INSTANCE_OF_trivial @ yes, trivial finish 958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_INSTANCE_OF_fullcheck @ no, do full check 959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */ 963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ARRAY_LENGTH.S */ 964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the length of an array. 966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- vB (object ref) 970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is object null? 972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yup, fail 973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- array length 975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r3, r2) @ vB<- length 977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */ 982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_INSTANCE.S */ 983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new instance of a class. 985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* new-instance vAA, class@BBBB */ 987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved class 991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ req'd for init, resolve, alloc 992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_NEW_INSTANCE_resolve @ no, resolve it now 994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved: @ r0=class 995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r1, [r0, #offClassObject_status] @ r1<- ClassStatus enum 996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #CLASS_INITIALIZED @ has class been initialized? 997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_NEW_INSTANCE_needinit @ no, init class now 998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized: @ r0=class 999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #ALLOC_DONT_TRACK @ flags for alloc call 1000b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden bl dvmAllocObject @ r0<- new object 1001b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden b .LOP_NEW_INSTANCE_finish @ continue 1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */ 1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_ARRAY.S */ 1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate an array of objects, specified with the array class 1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and a count. 1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The verifier guarantees that this is an array class, so we don't 1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check for it here. 1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* new-array vA, vB, class@CCCC */ 1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 1) @ r2<- CCCC 1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r0) @ r1<- vB (array length) 1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ check length 1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r2, lsl #2] @ r0<- resolved class 1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_errNegativeArraySize @ negative length, bail 1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ req'd for resolve, alloc 1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_NEW_ARRAY_finish @ resolved, continue 1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_NEW_ARRAY_resolve @ do resolve now 1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */ 1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */ 1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new array with elements filled from registers. 1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: filled-new-array, filled-new-array/range 1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ need for resolve and alloc 1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved class 1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, rINST, lsr #8 @ r10<- AA or BA 1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_FILLED_NEW_ARRAY_continue @ yes, continue on 1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- call(clazz, ref) 1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_FILLED_NEW_ARRAY_continue 1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */ 1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */ 1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */ 1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new array with elements filled from registers. 1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: filled-new-array, filled-new-array/range 1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ need for resolve and alloc 1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved class 1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, rINST, lsr #8 @ r10<- AA or BA 1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_FILLED_NEW_ARRAY_RANGE_continue @ yes, continue on 1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- call(clazz, ref) 1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_FILLED_NEW_ARRAY_RANGE_continue 1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */ 1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILL_ARRAY_DATA.S */ 1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fill-array-data vAA, +BBBBBBBB */ 1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (lo) 1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (hi) 1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb 1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vAA (array object) 1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.) 1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC(); 1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInterpHandleFillArrayData@ fill the array with predefined data 1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ 0 means an exception is thrown 1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ has exception 1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */ 1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_THROW.S */ 1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception object in the current thread. 1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* throw vAA */ 1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- vAA (exception object) 1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 11148ba2708ea118381f2df5ca55b9bad2ae4c050504Andy McFadden EXPORT_PC() @ exception handler can throw 1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null object? 1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, throw an NPE instead 1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ bypass dvmSetException, just store it 1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offThread_exception] @ thread->exception<- obj 1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */ 1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO.S */ 1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unconditional branch, 8-bit offset. 1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The branch distance is a signed code-unit offset, which we need to 1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * double to get a byte offset. 1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* goto +AA */ 1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsl #16 @ r0<- AAxx0000 1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asr #24 @ r9<- ssssssAA (sign-extended) 1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r9, lsl #1 @ r9<- byte offset 1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1136ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1140ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1145ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1146ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1147ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */ 1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_16.S */ 1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unconditional branch, 16-bit offset. 1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The branch distance is a signed code-unit offset, which we need to 1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * double to get a byte offset. 1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* goto/16 +AAAA */ 1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r0, 1) @ r0<- ssssAAAA (sign-extended) 1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asl #1 @ r9<- byte offset, check sign 1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */ 1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_32.S */ 1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unconditional branch, 32-bit offset. 1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The branch distance is a signed code-unit offset, which we need to 1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * double to get a byte offset. 1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlike most opcodes, this one is allowed to branch to itself, so 1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * our "backward branch" test must be "<=0" instead of "<0". The ORRS 1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction doesn't affect the V flag, so we need to clear it 1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * explicitly. 1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* goto/32 +AAAAAAAA */ 1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- aaaa (lo) 1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- AAAA (hi) 1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp ip, ip @ (clear V flag during stall) 1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs r0, r0, r1, lsl #16 @ r0<- AAAAaaaa, check sign 1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r0, asl #1 @ r9<- byte offset 1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ble common_backwardBranch @ backward branch, do periodic checks 1198ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1199ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1209ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */ 1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */ 1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a packed-switch or sparse-switch instruction. In both cases 1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * we decode it and hand it off to a helper function. 1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't really expect backward branches in a switch statement, but 1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * they're perfectly legal, so we check for them here. 1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: packed-switch, sparse-switch 1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, +BBBB */ 1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (lo) 1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (hi) 1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vAA 1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2 1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInterpHandlePackedSwitch @ r0<- code-unit branch offset 1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asl #1 @ r9<- branch byte offset, check sign 1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_backwardBranch @ (want to use BLE but V is unknown) 1235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1241ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1246ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */ 1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPARSE_SWITCH.S */ 1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */ 1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a packed-switch or sparse-switch instruction. In both cases 1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * we decode it and hand it off to a helper function. 1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't really expect backward branches in a switch statement, but 1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * they're perfectly legal, so we check for them here. 1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: packed-switch, sparse-switch 1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, +BBBB */ 1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (lo) 1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (hi) 1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vAA 1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2 1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInterpHandleSparseSwitch @ r0<- code-unit branch offset 1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asl #1 @ r9<- branch byte offset, check sign 1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_backwardBranch @ (want to use BLE but V is unknown) 1273ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1274ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1276ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1277ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1280ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1281ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1282ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1283ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1284ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */ 1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */ 1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two floating-point values. Puts 0, 1, or -1 into the 1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destination register based on the results of the comparison. 1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on what value we'd like to return when one of the operands is NaN. 1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The operation we're implementing is: 1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if (x == y) 1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return 0; 1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else if (x < y) 1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return -1; 1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else if (x > y) 1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return 1; 1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else 1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return {-1,1}; // one or both operands was NaN 1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The straightforward implementation requires 3 calls to functions 1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that return a result in r0. We can do it with two calls if our 1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EABI library supports __aeabi_cfcmple (only one if we want to check 1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for NaN directly): 1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check x <= y 1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if <, return -1 1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if ==, return 0 1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check y <= x 1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if <, return 1 1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return {-1,1} 1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: cmpl-float, cmpg-float 1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r2) @ r9<- vBB 1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r10, r3) @ r10<- vCC 1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ copy to arg registers 1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cfcmple @ cmp <=: C clear if <, Z set if eq 1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMPL_FLOAT_gt_or_nan @ C set and Z clear, disambiguate 1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvncc r1, #0 @ (less than) r1<- -1 1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ (equal) r1<- 0, trumps less than 1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish: 1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */ 1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_FLOAT.S */ 1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */ 1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two floating-point values. Puts 0, 1, or -1 into the 1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destination register based on the results of the comparison. 1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on what value we'd like to return when one of the operands is NaN. 1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The operation we're implementing is: 1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if (x == y) 1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return 0; 1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else if (x < y) 1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return -1; 1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else if (x > y) 1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return 1; 1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * else 1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return {-1,1}; // one or both operands was NaN 1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The straightforward implementation requires 3 calls to functions 1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that return a result in r0. We can do it with two calls if our 1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EABI library supports __aeabi_cfcmple (only one if we want to check 1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for NaN directly): 1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check x <= y 1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if <, return -1 1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if ==, return 0 1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check y <= x 1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if <, return 1 1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return {-1,1} 1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: cmpl-float, cmpg-float 1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r2) @ r9<- vBB 1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r10, r3) @ r10<- vCC 1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ copy to arg registers 1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cfcmple @ cmp <=: C clear if <, Z set if eq 1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMPG_FLOAT_gt_or_nan @ C set and Z clear, disambiguate 1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvncc r1, #0 @ (less than) r1<- -1 1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ (equal) r1<- 0, trumps less than 1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish: 1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */ 1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */ 1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two floating-point values. Puts 0, 1, or -1 into the 1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destination register based on the results of the comparison. 1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on what value we'd like to return when one of the operands is NaN. 1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See OP_CMPL_FLOAT for an explanation. 1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: cmpl-double, cmpg-double 1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r0, #255 @ r9<- BB 1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, r0, lsr #8 @ r10<- CC 1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[BB] 1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, rFP, r10, lsl #2 @ r10<- &fp[CC] 1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vBB/vBB+1 1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r10, {r2-r3} @ r2/r3<- vCC/vCC+1 1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cdcmple @ cmp <=: C clear if <, Z set if eq 1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMPL_DOUBLE_gt_or_nan @ C set and Z clear, disambiguate 1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvncc r1, #0 @ (less than) r1<- -1 1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ (equal) r1<- 0, trumps less than 1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish: 1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */ 1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_DOUBLE.S */ 1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */ 1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two floating-point values. Puts 0, 1, or -1 into the 1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destination register based on the results of the comparison. 1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on what value we'd like to return when one of the operands is NaN. 1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See OP_CMPL_FLOAT for an explanation. 1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: cmpl-double, cmpg-double 1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r0, #255 @ r9<- BB 1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, r0, lsr #8 @ r10<- CC 1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[BB] 1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, rFP, r10, lsl #2 @ r10<- &fp[CC] 1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vBB/vBB+1 1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r10, {r2-r3} @ r2/r3<- vCC/vCC+1 1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cdcmple @ cmp <=: C clear if <, Z set if eq 1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMPG_DOUBLE_gt_or_nan @ C set and Z clear, disambiguate 1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvncc r1, #0 @ (less than) r1<- -1 1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ (equal) r1<- 0, trumps less than 1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish: 1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */ 1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMP_LONG.S */ 1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare two 64-bit values. Puts 0, 1, or -1 into the destination 1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * register based on the results of the comparison. 1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We load the full values with LDM, but in practice many values could 1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be resolved by only looking at the high word. This could be made 1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * faster or slower by splitting the LDM into a pair of LDRs. 1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If we just wanted to set condition flags, we could do this: 1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * subs ip, r0, r2 1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sbcs ip, r1, r3 1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * subeqs ip, r0, r2 1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific 1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * integer value, which we can do with 2 conditional mov/mvn instructions 1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (set 1, set -1; if they're equal we already have 0 in ip), giving 1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * us a constant 5-cycle path plus a branch at the end to the 1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction epilogue code. The multi-compare approach below needs 1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch 1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the worst case (the 64-bit values are equal). 1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* cmp-long vAA, vBB, vCC */ 1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare (vBB+1, vCC+1) 1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blt .LOP_CMP_LONG_less @ signed compare on high part 1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bgt .LOP_CMP_LONG_greater 1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r1, r0, r2 @ r1<- r0 - r2 1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bhi .LOP_CMP_LONG_greater @ unsigned compare on low part 1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_CMP_LONG_less 1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMP_LONG_finish @ equal; r1 already holds 0 1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */ 1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQ.S */ 1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ branch to 1 if comparison failed 1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1530ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1531ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1532ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1533ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1534ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1535ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1536ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1539ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */ 1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NE.S */ 1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ branch to 1 if comparison failed 1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1566ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1567ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1568ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1569ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1570ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1571ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1572ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1575ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */ 1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LT.S */ 1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bge 1f @ branch to 1 if comparison failed 1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1602ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1603ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1604ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1605ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1606ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1607ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1608ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1611ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */ 1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GE.S */ 1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blt 1f @ branch to 1 if comparison failed 1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1638ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1639ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1640ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1641ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1642ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1643ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1644ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1647ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */ 1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GT.S */ 1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ble 1f @ branch to 1 if comparison failed 1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1675ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1676ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1677ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1678ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1679ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1680ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1683ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */ 1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LE.S */ 1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */ 1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vA, vB, +CCCC */ 1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A+ 1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r1) @ r3<- vB 1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vA 1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (vA, vB) 1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bgt 1f @ branch to 1 if comparison failed 1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ yes, do periodic checks 1710ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1712ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1713ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1714ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_testUpdateProfile 1715ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1716ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1719ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */ 1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQZ.S */ 1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ branch to 1 if comparison failed 1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1743ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1744ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1745ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1746ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1747ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1748ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1751ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1752ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1753ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1754ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1755ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */ 1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NEZ.S */ 1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ branch to 1 if comparison failed 1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1779ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1780ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1781ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1782ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1783ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1784ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1787ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1788ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1789ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1790ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1791ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */ 1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LTZ.S */ 1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bge 1f @ branch to 1 if comparison failed 1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1815ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1816ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1817ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1818ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1819ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1820ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1823ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1824ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1825ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1826ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1827ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */ 1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GEZ.S */ 1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blt 1f @ branch to 1 if comparison failed 1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1851ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1852ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1853ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1854ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1855ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1856ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1857ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1858ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1859ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1860ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1863ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */ 1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GTZ.S */ 1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ble 1f @ branch to 1 if comparison failed 1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1887ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1888ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1889ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1890ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1891ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1892ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1893ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1894ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1895ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1896ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1899ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */ 1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LEZ.S */ 1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */ 1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fragment that specifies the *reverse* comparison to perform, e.g. 1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for "if-le" you would use "gt". 1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if-cmp vAA, +BBBB */ 1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vAA 1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #4 @ r0<- BYTE branch dist for not-taken 1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ compare (vA, 0) 1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bgt 1f @ branch to 1 if comparison failed 1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r9, 1) @ r9<- branch offset, in code units 1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r9, asl #1 @ convert to bytes, check sign 1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 1923ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 1924ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 1925ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 1926ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1927ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1928ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 1931ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 1932ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 1933ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 1934ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 1935ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 1936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */ 1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3E.S */ 1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */ 1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3F.S */ 1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */ 1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_40.S */ 1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */ 1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_41.S */ 1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */ 1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_42.S */ 1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */ 1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_43.S */ 1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */ 1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width 2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */ 2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_WIDE.S */ 2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 64 bits. vAA <- vBB[vCC]. 2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD. 2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* aget-wide vAA, vBB, vCC */ 2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width 2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_AGET_WIDE_finish @ okay, continue below 2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errArrayIndex @ index >= length, bail 2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ May want to swap the order of these two branches depending on how the 2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ branch prediction (if any) handles conditional forward branches vs. 2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ unconditional forward branches. 2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */ 2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_OBJECT.S */ 2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width 2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */ 2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BOOLEAN.S */ 2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */ 2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BYTE.S */ 2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrsb r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */ 2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_CHAR.S */ 2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */ 2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_SHORT.S */ 2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */ 2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array get, 32 bits or less. vAA <- vBB[vCC]. 2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short 2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrsh r2, [r0, #offArrayObject_contents] @ r2<- vBB[vCC] 2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r9) @ vAA<- r2 2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */ 2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width 2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */ 2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_WIDE.S */ 2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 64 bits. vBB[vCC] <- vAA. 2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Arrays of long/double are 64-bit aligned, so it's okay to use STRD. 2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* aput-wide vAA, vBB, vCC */ 2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width 2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_APUT_WIDE_finish @ okay, continue below 2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errArrayIndex @ index >= length, bail 2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ May want to swap the order of these two branches depending on how the 2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ branch prediction (if any) handles conditional forward branches vs. 2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ unconditional forward branches. 2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */ 2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_OBJECT.S */ 2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Store an object into an array. vBB[vCC] <- vAA. 2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- vBB (array object) 2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vCC (requested index) 2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null array object? 2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r9) @ r9<- vAA 2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offArrayObject_length] @ r3<- arrayObj->length 2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, r1, r0, lsl #2 @ r10<- arrayObj + index*width 2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, r3 @ compare unsigned index, length 2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_APUT_OBJECT_finish @ we're okay, continue on 2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errArrayIndex @ index >= length, bail 2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */ 2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BOOLEAN.S */ 2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strb r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */ 2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BYTE.S */ 2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strb r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */ 2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_CHAR.S */ 2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strh r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */ 2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_SHORT.S */ 2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */ 2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array put, 32 bits or less. vBB[vCC] <- vAA. 2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r2, 1, 0) @ r2<- BB 2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_B(r3, 1, 1) @ r3<- CC 2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB (array object) 2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC (requested index) 2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null array object? 2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offArrayObject_length] @ r3<- arrayObj->length 2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, r3 @ compare unsigned index, length 2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs common_errArrayIndex @ index >= length, bail 2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r9) @ r2<- vAA 2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strh r2, [r0, #offArrayObject_contents] @ vBB[vCC]<- r2 2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */ 2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_finish @ no, already resolved 2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_finish 2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */ 2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE.S */ 2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Wide 32-bit instance field get. 2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* iget-wide vA, vB, field@CCCC */ 2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields 2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_WIDE_finish @ no, already resolved 2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_WIDE_finish 2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */ 2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT.S */ 2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_OBJECT_finish @ no, already resolved 2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_OBJECT_finish 2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */ 2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BOOLEAN.S */ 2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" } 2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_BOOLEAN_finish @ no, already resolved 2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_BOOLEAN_finish 2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */ 2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BYTE.S */ 2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" } 2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_BYTE_finish @ no, already resolved 2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_BYTE_finish 2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */ 2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_CHAR.S */ 2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" } 2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_CHAR_finish @ no, already resolved 2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_CHAR_finish 2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */ 2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_SHORT.S */ 2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" } 2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */ 2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field get. 2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_SHORT_finish @ no, already resolved 2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IGET_SHORT_finish 2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */ 2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_finish @ no, already resolved 2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_finish @ yes, finish up 2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */ 2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE.S */ 2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* iput-wide vA, vB, field@CCCC */ 2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields 2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_WIDE_finish @ no, already resolved 2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_WIDE_finish @ yes, finish up 2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */ 2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT.S */ 2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_OBJECT_finish @ no, already resolved 2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_OBJECT_finish @ yes, finish up 2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */ 2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BOOLEAN.S */ 2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" } 2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_BOOLEAN_finish @ no, already resolved 2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_BOOLEAN_finish @ yes, finish up 2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */ 2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BYTE.S */ 2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" } 2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_BYTE_finish @ no, already resolved 2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_BYTE_finish @ yes, finish up 2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */ 2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_CHAR.S */ 2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" } 2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_CHAR_finish @ no, already resolved 2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_CHAR_finish @ yes, finish up 2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */ 2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_SHORT.S */ 2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" } 2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */ 2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit instance field put. 2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, field@CCCC */ 2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref CCCC 2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_SHORT_finish @ no, already resolved 2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveInstField @ r0<- resolved InstField ptr 2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_IPUT_SHORT_finish @ yes, finish up 2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */ 2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_resolve @ yes, do resolve 2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish: @ field ptr in r0 2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 28190890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */ 2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_WIDE.S */ 2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64-bit SGET handler. 2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* sget-wide vAA, field@BBBB */ 2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_WIDE_resolve @ yes, do resolve 2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish: 2841861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r9, rINST, lsr #8 @ r9<- AA 2842861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .if 0 2843861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r0, r0, #offStaticField_value @ r0<- pointer to data 28446e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field 2845861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 2846861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned) 2847861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 2848861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2850861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */ 2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_OBJECT.S */ 2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_OBJECT_resolve @ yes, do resolve 2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish: @ field ptr in r0 2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 28730890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */ 2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BOOLEAN.S */ 2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_BOOLEAN_resolve @ yes, do resolve 2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish: @ field ptr in r0 2899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 29000890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */ 2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BYTE.S */ 2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_BYTE_resolve @ yes, do resolve 2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish: @ field ptr in r0 2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 29270890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */ 2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_CHAR.S */ 2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_CHAR_resolve @ yes, do resolve 2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish: @ field ptr in r0 2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 29540890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */ 2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_SHORT.S */ 2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */ 2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SGET handler. 2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SGET_SHORT_resolve @ yes, do resolve 2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish: @ field ptr in r0 2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offStaticField_value] @ r1<- field value 29810890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r2) @ fp[AA]<- r1 2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */ 2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short 2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_resolve @ yes, do resolve 3005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish: @ field ptr in r0 3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 30100890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */ 3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_WIDE.S */ 3018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64-bit SPUT handler. 3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* sput-wide vAA, field@BBBB */ 3022861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r0, [rGLUE, #offGlue_methodClassDex] @ r0<- DvmDex 3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3024861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields 3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 3026861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r2, [r0, r1, lsl #2] @ r2<- resolved StaticField ptr 3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 3028861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden cmp r2, #0 @ is resolved entry null? 3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_WIDE_resolve @ yes, do resolve 3030861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9 3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3032861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 3033861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GET_INST_OPCODE(r10) @ extract opcode from rINST 3034861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .if 0 3035861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r2, r2, #offStaticField_value @ r2<- pointer to data 30366e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 3037861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 3038861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden strd r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1 3039861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 3040861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GOTO_OPCODE(r10) @ jump to next instruction 3041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */ 3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_OBJECT.S */ 3046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short 3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_OBJECT_resolve @ yes, do resolve 3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_finish: @ field ptr in r0 3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 30640890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */ 3072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BOOLEAN.S */ 3073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short 3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_BOOLEAN_resolve @ yes, do resolve 3086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish: @ field ptr in r0 3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 30910890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */ 3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BYTE.S */ 3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short 3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_BYTE_resolve @ yes, do resolve 3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish: @ field ptr in r0 3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 31180890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */ 3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_CHAR.S */ 3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short 3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_CHAR_resolve @ yes, do resolve 3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish: @ field ptr in r0 3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 31450890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */ 3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_SHORT.S */ 3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */ 3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * General 32-bit SPUT handler. 3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short 3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, field@BBBB */ 3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field ref BBBB 3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is resolved entry null? 3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_SPUT_SHORT_resolve @ yes, do resolve 3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish: @ field ptr in r0 3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- AA 3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- fp[AA] 3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 31720890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r0, #offStaticField_value] @ field<- vAA 3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */ 3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */ 3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a virtual method call. 3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-virtual, invoke-virtual/range 3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved baseMethod 3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_VIRTUAL_continue @ yes, continue on 3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_VIRTUAL @ resolver method type 3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_VIRTUAL_continue @ no, continue 3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */ 3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */ 3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a "super" method call. 3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-super, invoke-super/range 3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr 3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved baseMethod 3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ null "this"? 3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [rGLUE, #offGlue_method] @ r9<- current method 3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [r9, #offMethod_clazz] @ r9<- method->clazz 3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_SUPER_continue @ resolved, continue on 3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_INVOKE_SUPER_resolve @ do resolve now 3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */ 3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */ 3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a direct method call. 3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (We could defer the "is 'this' pointer null" test to the common 3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method invocation code, and use a flag to indicate that static 3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * calls don't count. If we do this as part of copying the arguments 3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out we could avoiding loading the first arg twice.) 3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-direct, invoke-direct/range 3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved methodToCall 3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr 3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INVOKE_DIRECT_resolve @ not resolved, do it now 3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish: 3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ null "this" ref? 3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodNoRange @ no, continue on 3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errNullObject @ yes, throw exception 3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */ 3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */ 3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a static method call. 3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-static, invoke-static/range 3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved methodToCall 3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodNoRange @ yes, continue on 3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_STATIC @ resolver method type 3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodNoRange @ no, continue 3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */ 3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */ 3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an interface method call. 3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-interface, invoke-interface/range 3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 2) @ r2<- FEDC or CCCC 3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- C (or stays CCCC) 3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- first arg ("this") 3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- methodClassDex 3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null obj? 3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- method 3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, fail 3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offObject_clazz] @ r0<- thisPtr->clazz 3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex) 3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 3321de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro b common_invokeMethodNoRange @ jump to common handler 3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */ 3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_73.S */ 3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */ 3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */ 3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */ 3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a virtual method call. 3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-virtual, invoke-virtual/range 3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved baseMethod 3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_VIRTUAL_RANGE_continue @ yes, continue on 3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_VIRTUAL @ resolver method type 3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_VIRTUAL_RANGE_continue @ no, continue 3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */ 3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */ 3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */ 3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a "super" method call. 3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-super, invoke-super/range 3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr 3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved baseMethod 3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ null "this"? 3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [rGLUE, #offGlue_method] @ r9<- current method 3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [r9, #offMethod_clazz] @ r9<- method->clazz 3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_SUPER_RANGE_continue @ resolved, continue on 3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_INVOKE_SUPER_RANGE_resolve @ do resolve now 3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */ 3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */ 3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */ 3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a direct method call. 3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (We could defer the "is 'this' pointer null" test to the common 3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method invocation code, and use a flag to indicate that static 3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * calls don't count. If we do this as part of copying the arguments 3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out we could avoiding loading the first arg twice.) 3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-direct, invoke-direct/range 3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved methodToCall 3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr 3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_INVOKE_DIRECT_RANGE_resolve @ not resolved, do it now 3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish: 3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ null "this" ref? 3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodRange @ no, continue on 3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errNullObject @ yes, throw exception 3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */ 3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */ 3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */ 3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a static method call. 3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-static, invoke-static/range 3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- pDvmDex 3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResMethods] @ r3<- pDvmDex->pResMethods 3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved methodToCall 3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodRange @ yes, continue on 3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_STATIC @ resolver method type 3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_invokeMethodRange @ no, continue 3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */ 3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */ 3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */ 3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an interface method call. 3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: invoke-interface, invoke-interface/range 3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r2, 2) @ r2<- FEDC or CCCC 3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- C (or stays CCCC) 3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- first arg ("this") 3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- methodClassDex 3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null obj? 3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- method 3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, fail 3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offObject_clazz] @ r0<- thisPtr->clazz 3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex) 3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 3484de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro b common_invokeMethodRange @ jump to common handler 3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */ 3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_79.S */ 3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */ 3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_7A.S */ 3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */ 3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_INT.S */ 3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, #0 @ r0<- op, r0-r3 changed 3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */ 3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_INT.S */ 3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r0, r0 @ r0<- op, r0-r3 changed 3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */ 3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_LONG.S */ 3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsbs r0, r0, #0 @ optional op; may set condition codes 3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed 3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */ 3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_LONG.S */ 3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r0, r0 @ optional op; may set condition codes 3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, r1 @ r0/r1<- op, r2-r3 changed 3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */ 3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_FLOAT.S */ 3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed 3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */ 3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_DOUBLE.S */ 3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed 3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */ 3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_LONG.S */ 3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */ 3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0", where 3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 64-bit quantity in r0/r1. 3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: int-to-long, int-to-double, float-to-long, float-to-double 3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0, asr #31 @ r0<- op, r0-r3 changed 3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */ 3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_FLOAT.S */ 3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_i2f @ r0<- op, r0-r3 changed 3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */ 3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_DOUBLE.S */ 3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */ 3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0", where 3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 64-bit quantity in r0/r1. 3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: int-to-long, int-to-double, float-to-long, float-to-double 3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_i2d @ r0<- op, r0-r3 changed 3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */ 3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_INT.S */ 3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */ 3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */ 3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* for move, move-object, long-to-int */ 3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB */ 3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B from 15:12 3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A from 11:8 3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[B] 3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r2, r0) @ fp[A]<- r2 3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute next instruction 3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */ 3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_FLOAT.S */ 3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */ 3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64bit-to-32bit unary operation. Provide an "instr" line 3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0/r1", where 3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 32-bit quantity in r0. 3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: long-to-float, double-to-int, double-to-float 3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (This would work for long-to-int, but that instruction is actually 3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an exact match for OP_MOVE.) 3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1 3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_l2f @ r0<- op, r0-r3 changed 3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */ 3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_DOUBLE.S */ 3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_l2d @ r0/r1<- op, r2-r3 changed 3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */ 3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_INT.S */ 3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */ 3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_f2iz @ r0<- op, r0-r3 changed 3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unop.S" {"instr":"bl f2i_doconv"} 3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break 3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to an int in r0. 3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification. The 3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2i_doconv: 3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, lr} 3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0x4f000000 @ (float)maxint 3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r4, r0 3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpge @ is arg >= maxint? 3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r0, #0x80000000 @ return maxint (7fffffff) 3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmnefd sp!, {r4, pc} 3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0xcf000000 @ (float)minint 3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmple @ is arg <= minint? 3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0x80000000 @ return minint (80000000) 3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmnefd sp!, {r4, pc} 3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r4 3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpeq @ is arg == self? 3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmeqfd sp!, {r4, pc} @ return zero for NaN 3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_f2iz @ convert float to int 3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, pc} 3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */ 3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_LONG.S */ 3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWider.S" {"instr":"bl __aeabi_f2lz"} 3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */ 3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0", where 3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 64-bit quantity in r0/r1. 3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: int-to-long, int-to-double, float-to-long, float-to-double 3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl f2l_doconv @ r0<- op, r0-r3 changed 3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */ 3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */ 3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */ 3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0", where 3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 64-bit quantity in r0/r1. 3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: int-to-long, int-to-double, float-to-long, float-to-double 3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_f2d @ r0<- op, r0-r3 changed 3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */ 3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_INT.S */ 3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */ 3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */ 3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64bit-to-32bit unary operation. Provide an "instr" line 3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0/r1", where 3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 32-bit quantity in r0. 3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: long-to-float, double-to-int, double-to-float 3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (This would work for long-to-int, but that instruction is actually 3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an exact match for OP_MOVE.) 3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1 3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2iz @ r0<- op, r0-r3 changed 3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopNarrower.S" {"instr":"bl d2i_doconv"} 3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break 3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to an int in r0. 3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification. The 3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2i_doconv: 3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, r5, lr} @ save regs 39895162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0x80000000 @ maxint, as a double (low word) 39905162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, r2, asr #9 @ 0xffc00000 3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #4 @ align for EABI 39925162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mvn r3, #0xbe000000 @ maxint, as a double (high word) 39935162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden sub r3, r3, #0x00200000 @ 0x41dfffff 39945162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r4, r0 @ save a copy of r0 3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r5, r1 @ and r1 3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpge @ is arg >= maxint? 3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 39985162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mvnne r0, #0x80000000 @ return maxint (0x7fffffff) 3999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 40035162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0xc1000000 @ minint, as a double (high word) 40045162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, r3, #0x00e00000 @ 0xc1e00000 40055162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ minint, as a double (low word) 4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmple @ is arg <= minint? 4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0x80000000 @ return minint (80000000) 4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 4012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r4 @ compare against self 4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r5 4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpeq @ is arg == self? 4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ return zero for NaN 4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2iz @ convert double to int 4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #4 4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, r5, pc} 4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */ 4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_LONG.S */ 4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWide.S" {"instr":"bl __aeabi_d2lz"} 4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */ 4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit unary operation. Provide an "instr" line that 4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0/r1". 4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: neg-long, not-long, neg-double, long-to-double, double-to-long 4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 4046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 4047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vAA 4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl d2l_doconv @ r0/r1<- op, r2-r3 changed 4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA<- r0/r1 4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-13 instructions */ 4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */ 4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */ 4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */ 4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64bit-to-32bit unary operation. Provide an "instr" line 4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = op r0/r1", where 4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "result" is a 32-bit quantity in r0. 4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: long-to-float, double-to-int, double-to-float 4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (This would work for long-to-int, but that instruction is actually 4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an exact match for OP_MOVE.) 4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[B] 4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1 4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2f @ r0<- op, r0-r3 changed 4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-11 instructions */ 4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */ 4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_BYTE.S */ 4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl #24 @ optional op; may set condition codes 4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr #24 @ r0<- op, r0-r3 changed 4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */ 4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_CHAR.S */ 4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl #16 @ optional op; may set condition codes 4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr #16 @ r0<- op, r0-r3 changed 4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */ 4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_SHORT.S */ 4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */ 4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit unary operation. Provide an "instr" line that 4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = op r0". 4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. 4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int-to-byte, int-to-char, int-to-short 4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unop vA, vB */ 4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB 4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl #16 @ optional op; may set condition codes 4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr #16 @ r0<- op, r0-r3 changed 4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9-10 instructions */ 4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */ 4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT.S */ 4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1 @ r0<- op, r0-r3 changed 4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */ 4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT.S */ 4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r0, r0, r1 @ r0<- op, r0-r3 changed 4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */ 4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT.S */ 4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul r0, r1, r0 @ r0<- op, r0-r3 changed 4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */ 4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT.S */ 4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idiv @ r0<- op, r0-r3 changed 4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */ 4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT.S */ 4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */ 4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idivmod @ r1<- op, r0-r3 changed 4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */ 4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT.S */ 4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r1 @ r0<- op, r0-r3 changed 4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */ 4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT.S */ 4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1 @ r0<- op, r0-r3 changed 4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */ 4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT.S */ 4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r1 @ r0<- op, r0-r3 changed 4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */ 4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT.S */ 4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */ 4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT.S */ 4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */ 4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT.S */ 4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */ 4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG.S */ 4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adds r0, r0, r2 @ optional op; may set condition codes 4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adc r1, r1, r3 @ result<- op, r0-r3 changed 4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */ 4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG.S */ 4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r0, r0, r2 @ optional op; may set condition codes 4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sbc r1, r1, r3 @ result<- op, r0-r3 changed 4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */ 4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG.S */ 4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Signed 64-bit integer multiply. 4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Consider WXxYZ (r1r0 x r3r2) with a long multiply: 4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WX 4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * x YZ 4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * -------- 4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ZW ZX 4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * YW YX 4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The low word of the result holds ZX, the high word holds 4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because 4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it doesn't fit in the low 64 bits. 4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlike most ARM math operations, multiply instructions have 4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * restrictions on using the same register more than once (Rd and Rm 4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * cannot be the same). 4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* mul-long vAA, vBB, vCC */ 4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul ip, r2, r1 @ ip<- ZxW 4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project umull r9, r10, r2, r0 @ r9/r10 <- ZxX 4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mla r2, r0, r3, ip @ r2<- YxX + (ZxW) 4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- AA 4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX)) 4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, rFP, r0, lsl #2 @ r0<- &fp[AA] 4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_MUL_LONG_finish 4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */ 4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG.S */ 4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ldivmod @ result<- op, r0-r3 changed 4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */ 4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG.S */ 4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */ 4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ldivmod @ result<- op, r0-r3 changed 4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3 4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */ 4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG.S */ 4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r2 @ optional op; may set condition codes 4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, r3 @ result<- op, r0-r3 changed 4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */ 4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG.S */ 4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r2 @ optional op; may set condition codes 4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r1, r3 @ result<- op, r0-r3 changed 4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */ 4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG.S */ 4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r2 @ optional op; may set condition codes 4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r1, r1, r3 @ result<- op, r0-r3 changed 4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */ 4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG.S */ 4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift. This is different from the generic 32/64-bit 4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * binary operations because vAA/vBB are 64-bit but vCC (the shift 4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distance) is 32-bit. Also, Dalvik requires us to mask off the low 4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6 bits of the shift distance. 4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shl-long vAA, vBB, vCC */ 4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r0, #255 @ r3<- BB 4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr #8 @ r0<- CC 4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BB] 4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vCC 4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r2<- r2 & 0x3f 4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asl r2 @ r1<- r1 << r2 4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2)) 4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32) 4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_SHL_LONG_finish 4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */ 5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG.S */ 5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift. This is different from the generic 32/64-bit 5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * binary operations because vAA/vBB are 64-bit but vCC (the shift 5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distance) is 32-bit. Also, Dalvik requires us to mask off the low 5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6 bits of the shift distance. 5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shr-long vAA, vBB, vCC */ 5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r0, #255 @ r3<- BB 5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr #8 @ r0<- CC 5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BB] 5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vCC 5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r0<- r0 & 0x3f 5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r2 @ r0<- r2 >> r2 5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32) 5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_SHR_LONG_finish 5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */ 5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG.S */ 5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift. This is different from the generic 32/64-bit 5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * binary operations because vAA/vBB are 64-bit but vCC (the shift 5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distance) is 32-bit. Also, Dalvik requires us to mask off the low 5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6 bits of the shift distance. 5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* ushr-long vAA, vBB, vCC */ 5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r0, #255 @ r3<- BB 5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr #8 @ r0<- CC 5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[BB] 5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r0) @ r2<- vCC 5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r0<- r0 & 0x3f 5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r2 @ r0<- r2 >> r2 5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32) 5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_USHR_LONG_finish 5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */ 5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT.S */ 5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fadd @ r0<- op, r0-r3 changed 5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */ 5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT.S */ 5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fsub @ r0<- op, r0-r3 changed 5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */ 5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT.S */ 5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fmul @ r0<- op, r0-r3 changed 5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */ 5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT.S */ 5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fdiv @ r0<- op, r0-r3 changed 5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */ 5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT.S */ 5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */ 5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */ 5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit binary operation. Provide an "instr" line that 5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0 op r1". 5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. Note that we 5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *don't* check for (INT_MIN / -1) here, because the ARM math lib 5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handles it correctly. 5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mul-float, div-float, rem-float 5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vCC 5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl fmodf @ r0<- op, r0-r3 changed 5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 11-14 instructions */ 5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */ 5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE.S */ 5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dadd @ result<- op, r0-r3 changed 5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */ 5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE.S */ 5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dsub @ result<- op, r0-r3 changed 5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */ 5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE.S */ 5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dmul @ result<- op, r0-r3 changed 5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */ 5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE.S */ 5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ddiv @ result<- op, r0-r3 changed 5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */ 5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE.S */ 5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */ 5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */ 5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit binary operation. Provide an "instr" line that 5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specifies an instruction that performs "result = r0-r1 op r2-r3". 5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * xor-long, add-double, sub-double, mul-double, div-double, 5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double 5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop vAA, vBB, vCC */ 5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r2<- &fp[BB] 5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r3, lsl #2 @ r3<- &fp[CC] 5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl fmod @ result<- op, r0-r3 changed 5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 14-17 instructions */ 5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */ 5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_2ADDR.S */ 5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5508a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1 @ r0<- op, r0-r3 changed 5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */ 5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT_2ADDR.S */ 5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5547a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r0, r0, r1 @ r0<- op, r0-r3 changed 5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */ 5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_2ADDR.S */ 5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5587a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul r0, r1, r0 @ r0<- op, r0-r3 changed 5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */ 5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_2ADDR.S */ 5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5626a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idiv @ r0<- op, r0-r3 changed 5635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */ 5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_2ADDR.S */ 5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */ 5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5666a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idivmod @ r1<- op, r0-r3 changed 5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */ 5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_2ADDR.S */ 5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5705a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r1 @ r0<- op, r0-r3 changed 5714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */ 5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_2ADDR.S */ 5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5744a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1 @ r0<- op, r0-r3 changed 5753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */ 5762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_2ADDR.S */ 5763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5783a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 5791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r1 @ r0<- op, r0-r3 changed 5792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */ 5801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_2ADDR.S */ 5802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5822a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */ 5840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_2ADDR.S */ 5841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5861a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 5870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */ 5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_2ADDR.S */ 5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 5884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 5900a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */ 5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG_2ADDR.S */ 5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adds r0, r0, r2 @ optional op; may set condition codes 5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adc r1, r1, r3 @ result<- op, r0-r3 changed 5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */ 5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG_2ADDR.S */ 5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r0, r0, r2 @ optional op; may set condition codes 5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sbc r1, r1, r3 @ result<- op, r0-r3 changed 5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */ 6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG_2ADDR.S */ 6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Signed 64-bit integer multiply, "/2addr" version. 6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See OP_MUL_LONG for an explanation. 6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We get a little tight on registers, so to avoid looking up &fp[A] 6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * again we stuff it into rINST. 6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* mul-long/2addr vA, vB */ 6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A] 6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1 6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul ip, r2, r1 @ ip<- ZxW 6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project umull r9, r10, r2, r0 @ r9/r10 <- ZxX 6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mla r2, r0, r3, ip @ r2<- YxX + (ZxW) 6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST @ r0<- &fp[A] (free up rINST) 6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX)) 6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10 6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */ 6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG_2ADDR.S */ 6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ldivmod @ result<- op, r0-r3 changed 6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */ 6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG_2ADDR.S */ 6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */ 6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ldivmod @ result<- op, r0-r3 changed 6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3 6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */ 6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG_2ADDR.S */ 6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r2 @ optional op; may set condition codes 6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, r3 @ result<- op, r0-r3 changed 6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */ 6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG_2ADDR.S */ 6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r2 @ optional op; may set condition codes 6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r1, r3 @ result<- op, r0-r3 changed 6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */ 6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG_2ADDR.S */ 6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r2 @ optional op; may set condition codes 6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r1, r1, r3 @ result<- op, r0-r3 changed 6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */ 6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG_2ADDR.S */ 6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32-bit shift distance. 6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shl-long/2addr vA, vB */ 6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vB 6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r2<- r2 & 0x3f 6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asl r2 @ r1<- r1 << r2 6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2)) 6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32) 6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r2 @ r0<- r0 << r2 6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_SHL_LONG_2ADDR_finish 6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */ 6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG_2ADDR.S */ 6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32-bit shift distance. 6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* shr-long/2addr vA, vB */ 6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vB 6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r2<- r2 & 0x3f 6274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r2 @ r0<- r2 >> r2 6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32) 6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asr r2 @ r1<- r1 >> r2 6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_SHR_LONG_2ADDR_finish 6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */ 6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG_2ADDR.S */ 6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32-bit shift distance. 6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* ushr-long/2addr vA, vB */ 6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vB 6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #63 @ r2<- r2 & 0x3f 6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r2 @ r0<- r2 >> r2 6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r3, r2, #32 @ r3<- 32 - r2 6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs ip, r2, #32 @ ip<- r2 - 32 6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32) 6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr r2 @ r1<- r1 >>> r2 6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_USHR_LONG_2ADDR_finish 6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */ 6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */ 6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6335a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fadd @ r0<- op, r0-r3 changed 6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */ 6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */ 6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6374a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fsub @ r0<- op, r0-r3 changed 6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */ 6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */ 6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6413a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fmul @ r0<- op, r0-r3 changed 6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */ 6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */ 6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6452a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fdiv @ r0<- op, r0-r3 changed 6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */ 6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT_2ADDR.S */ 6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */ 6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */ 6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vB 6492a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden GET_VREG(r0, r9) @ r0<- vA 6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl fmodf @ r0<- op, r0-r3 changed 6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */ 6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */ 6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dadd @ result<- op, r0-r3 changed 6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */ 6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */ 6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dsub @ result<- op, r0-r3 changed 6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */ 6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */ 6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dmul @ result<- op, r0-r3 changed 6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */ 6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */ 6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_ddiv @ result<- op, r0-r3 changed 6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */ 6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */ 6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */ 6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */ 6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sub-double/2addr, mul-double/2addr, div-double/2addr, 6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-double/2addr 6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/2addr vA, vB */ 6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rFP, r1, lsl #2 @ r1<- &fp[B] 6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[A] 6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(1) @ advance rPC, load rINST 6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl fmod @ result<- op, r0-r3 changed 6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 12-15 instructions */ 6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */ 6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT16.S */ 6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1 @ r0<- op, r0-r3 changed 6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */ 6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT.S */ 6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */ 6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, r1 @ r0<- op, r0-r3 changed 6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */ 6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT16.S */ 6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul r0, r1, r0 @ r0<- op, r0-r3 changed 6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */ 6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT16.S */ 6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idiv @ r0<- op, r0-r3 changed 6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */ 6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT16.S */ 6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */ 6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idivmod @ r1<- op, r0-r3 changed 6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */ 6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT16.S */ 6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r1 @ r0<- op, r0-r3 changed 6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */ 6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT16.S */ 6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1 @ r0<- op, r0-r3 changed 6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */ 6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT16.S */ 6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */ 6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit16 vA, vB, #+CCCC */ 6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r1, 1) @ r1<- ssssCCCC (sign-extended) 6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- A+ 6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vB 6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r9, r9, #15 6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is second operand zero? 6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r1 @ r0<- op, r0-r3 changed 6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-13 instructions */ 7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */ 7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT8.S */ 7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, r1 @ r0<- op, r0-r3 changed 7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */ 7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT_LIT8.S */ 7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, r1 @ r0<- op, r0-r3 changed 7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */ 7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT8.S */ 7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mul r0, r1, r0 @ r0<- op, r0-r3 changed 7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */ 7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT8.S */ 7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idiv @ r0<- op, r0-r3 changed 7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */ 7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT8.S */ 7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */ 7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_idivmod @ r1<- op, r0-r3 changed 7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */ 7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT8.S */ 7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, r1 @ r0<- op, r0-r3 changed 7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */ 7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT8.S */ 7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1 @ r0<- op, r0-r3 changed 7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */ 7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT8.S */ 7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ optional op; may set condition codes 7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eor r0, r0, r1 @ r0<- op, r0-r3 changed 7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */ 7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_LIT8.S */ 7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 7341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 7342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */ 7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_LIT8.S */ 7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */ 7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_LIT8.S */ 7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */ 7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic 32-bit "lit8" binary operation. Provide an "instr" line 7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that specifies an instruction that performs "result = r0 op r1". 7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This could be an ARM instruction or a function call. (If the result 7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * comes back in a register other than r0, you can override "result".) 7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "chkzero" is set to 1, we perform a divide-by-zero check on 7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * vCC (r1). Useful for integer division and modulus. 7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * shl-int/lit8, shr-int/lit8, ushr-int/lit8 7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* binop/lit8 vAA, vBB, #+CC */ 7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_S(r3, 1) @ r3<- ssssCCBB (sign-extended for CC) 7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r3, #255 @ r2<- BB 7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- vBB 7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @cmp r1, #0 @ is second operand zero? 7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errDivideByZero 7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #31 @ optional op; may set condition codes 7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10-12 instructions */ 7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7426c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_VOLATILE: /* 0xe3 */ 7427c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET_VOLATILE.S */ 7428c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET.S */ 7429c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7430c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit instance field get. 7431c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7432c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 7433c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7434c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vA, vB, field@CCCC */ 7435c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 7436c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 7437c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 7438c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 7439c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 7440c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 7441c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7442c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IGET_VOLATILE_finish @ no, already resolved 7443c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7444c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw 7445c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 7446c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 7447c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 7448c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IGET_VOLATILE_finish 7449c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown 7450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7454c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_VOLATILE: /* 0xe4 */ 7455c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT_VOLATILE.S */ 7456c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT.S */ 7457c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7458c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit instance field put. 7459c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7460c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 7461c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7462c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vA, vB, field@CCCC */ 7463c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 7464c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 7465c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 7466c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 7467c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 7468c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 7469c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7470c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IPUT_VOLATILE_finish @ no, already resolved 7471c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7472c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw 7473c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 7474c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 7475c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 7476c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IPUT_VOLATILE_finish @ yes, finish up 7477c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown 7478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7482c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_VOLATILE: /* 0xe5 */ 7483c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET_VOLATILE.S */ 7484c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET.S */ 7485c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7486c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit SGET handler. 7487c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7488c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 7489c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7490c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vAA, field@BBBB */ 7491c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 7492c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 7493c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 7494c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 7495c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7496c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq .LOP_SGET_VOLATILE_resolve @ yes, do resolve 7497c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_VOLATILE_finish: @ field ptr in r0 7498c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r1, [r0, #offStaticField_value] @ r1<- field value 74990890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ acquiring load 7500c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- AA 7501c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7502c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden SET_VREG(r1, r2) @ fp[AA]<- r1 7503c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 7504c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 7505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7509c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_VOLATILE: /* 0xe6 */ 7510c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT_VOLATILE.S */ 7511c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT.S */ 7512c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7513c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit SPUT handler. 7514c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7515c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short 7516c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7517c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vAA, field@BBBB */ 7518c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 7519c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 7520c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 7521c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 7522c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7523c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq .LOP_SPUT_VOLATILE_resolve @ yes, do resolve 7524c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_VOLATILE_finish: @ field ptr in r0 7525c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- AA 7526c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7527c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r1, r2) @ r1<- fp[AA] 7528c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 75290890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ releasing store 7530c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden str r1, [r0, #offStaticField_value] @ field<- vAA 7531c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 7532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7536c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */ 7537c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */ 7538c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET.S */ 7539c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 7540c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit instance field get. 7541c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 7542c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 7543c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 7544c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vA, vB, field@CCCC */ 7545c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 7546c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 7547c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 7548c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 7549c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 7550c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 7551c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 7552c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IGET_OBJECT_VOLATILE_finish @ no, already resolved 7553c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7554c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw 7555c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 7556c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 7557c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 7558c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IGET_OBJECT_VOLATILE_finish 7559c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown 7560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 75645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */ 75655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */ 75665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE.S */ 75675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 75685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Wide 32-bit instance field get. 75695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 75705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* iget-wide vA, vB, field@CCCC */ 75715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 75725387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 75735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 75745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields 75755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 75765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 75775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ is resolved entry null? 75785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_IGET_WIDE_VOLATILE_finish @ no, already resolved 75795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 75805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden EXPORT_PC() @ resolve() could throw 75815387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 75825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 75835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 75845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_IGET_WIDE_VOLATILE_finish 75855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden b common_exceptionThrown 7586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 75905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */ 75915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */ 75925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE.S */ 75935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* iput-wide vA, vB, field@CCCC */ 75945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 75955387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 75965387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 75975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields 75985387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 75995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 76005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ is resolved entry null? 76015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_IPUT_WIDE_VOLATILE_finish @ no, already resolved 76025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 76035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden EXPORT_PC() @ resolve() could throw 76045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 76055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 76065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ success? 76075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_IPUT_WIDE_VOLATILE_finish @ yes, finish up 76085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden b common_exceptionThrown 7609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 76135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */ 76145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */ 76155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE.S */ 76165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 76175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * 64-bit SGET handler. 76185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 76195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* sget-wide vAA, field@BBBB */ 76205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 76215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 76225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 76235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 76245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ is resolved entry null? 76255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden beq .LOP_SGET_WIDE_VOLATILE_resolve @ yes, do resolve 76265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_finish: 7627861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r9, rINST, lsr #8 @ r9<- AA 7628861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .if 1 7629861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r0, r0, #offStaticField_value @ r0<- pointer to data 76306e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field 7631861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 7632861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned) 7633861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 7634861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 76355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7636861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 76375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 76385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 7639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 76435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */ 76445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */ 76455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE.S */ 76465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 76475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * 64-bit SPUT handler. 76485387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 76495387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* sput-wide vAA, field@BBBB */ 7650861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r0, [rGLUE, #offGlue_methodClassDex] @ r0<- DvmDex 76515387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 7652861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields 76535387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden mov r9, rINST, lsr #8 @ r9<- AA 7654861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldr r2, [r0, r1, lsl #2] @ r2<- resolved StaticField ptr 76555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 7656861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden cmp r2, #0 @ is resolved entry null? 76575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden beq .LOP_SPUT_WIDE_VOLATILE_resolve @ yes, do resolve 7658861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9 76595387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7660861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 7661861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GET_INST_OPCODE(r10) @ extract opcode from rINST 7662861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .if 1 7663861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r2, r2, #offStaticField_value @ r2<- pointer to data 76646e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 7665861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 7666861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden strd r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1 7667861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 7668861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GOTO_OPCODE(r10) @ jump to next instruction 7669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 767396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */ 767496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: armv5te/OP_BREAKPOINT.S */ 7675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 7676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 7677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 76813a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */ 76823a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */ 76833a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden /* 76843a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * Handle a throw-verification-error instruction. This throws an 76853a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * exception for an error discovered during verification. The 76863a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * exception is indicated by AA, with some detail provided by BBBB. 76873a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden */ 76883a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden /* op AA, ref@BBBB */ 7689b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 76903a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden FETCH(r2, 1) @ r2<- BBBB 7691b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden EXPORT_PC() @ export the PC 76923a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden mov r1, rINST, lsr #8 @ r1<- AA 76933a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden bl dvmThrowVerificationError @ always throws 76943a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden b common_exceptionThrown @ handle exception 7695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */ 7699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_EXECUTE_INLINE.S */ 7700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Execute a "native inline" instruction. 7702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7703b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * We need to call an InlineOp4Func: 7704b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult) 7705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7706b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * The first four args are in r0-r3, pointer to return value storage 7707b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * is on the stack. The function's return value is a flag that tells 7708b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * us if an exception was thrown. 7709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */ 7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 1) @ r10<- BBBB 7712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rGLUE, #offGlue_retval @ r1<- &glue->retval 7713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ can throw 7714b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden sub sp, sp, #8 @ make room for arg, +64 bit align 7715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 7716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [sp] @ push &glue->retval 7717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl .LOP_EXECUTE_INLINE_continue @ make call; will return after 7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #8 @ pop stack 7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ test boolean result of inline 7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ returned false, handle exception 7721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7727b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */ 7728b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */ 7729b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden /* 7730b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * Execute a "native inline" instruction, using "/range" semantics. 7731b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * Same idea as execute-inline, but we get the args differently. 7732b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * 7733b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * We need to call an InlineOp4Func: 7734b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult) 7735b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * 7736b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * The first four args are in r0-r3, pointer to return value storage 7737b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * is on the stack. The function's return value is a flag that tells 7738b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * us if an exception was thrown. 7739b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden */ 7740b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */ 7741b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden FETCH(r10, 1) @ r10<- BBBB 7742b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden add r1, rGLUE, #offGlue_retval @ r1<- &glue->retval 7743b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden EXPORT_PC() @ can throw 7744b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden sub sp, sp, #8 @ make room for arg, +64 bit align 7745b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden mov r0, rINST, lsr #8 @ r0<- AA 7746b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden str r1, [sp] @ push &glue->retval 7747b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden bl .LOP_EXECUTE_INLINE_RANGE_continue @ make call; will return after 7748b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden add sp, sp, #8 @ pop stack 7749b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden cmp r0, #0 @ test boolean result of inline 7750b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden beq common_exceptionThrown @ returned false, handle exception 7751b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 7752b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 7753b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GOTO_OPCODE(ip) @ jump to next instruction 7754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */ 7758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_EMPTY.S */ 7759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * invoke-direct-empty is a no-op in a "standard" interpreter. 7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST 7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute it 7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */ 7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_F1.S */ 7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 7771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 7772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */ 7777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */ 7778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* For: iget-quick, iget-object-quick */ 7779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, offset@CCCC */ 7780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- object we're operating on 7782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field byte offset 7783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1] @ r0<- obj.field (always 32 bits) 7787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 7791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */ 7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE_QUICK.S */ 7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* iget-wide-quick vA, vB, offset@CCCC */ 7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- object we're operating on 7800b48a4d53bc3349b5c99f8b87a396e7374e2d335cDave Butcher FETCH(ip, 1) @ ip<- field byte offset 7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7804b48a4d53bc3349b5c99f8b87a396e7374e2d335cDave Butcher ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned) 7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r2, lsl #2 @ r3<- &fp[A] 7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ fp[A]<- r0/r1 7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */ 7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT_QUICK.S */ 7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */ 7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* For: iget-quick, iget-object-quick */ 7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, offset@CCCC */ 7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- object we're operating on 7821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field byte offset 7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1] @ r0<- obj.field (always 32 bits) 7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */ 7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */ 7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* For: iput-quick, iput-object-quick */ 7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, offset@CCCC */ 7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- fp[B], the object pointer 7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field byte offset 7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- fp[A] 7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r3, r1] @ obj.field (always 32 bits)<- r0 7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */ 7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE_QUICK.S */ 7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* iput-wide-quick vA, vB, offset@CCCC */ 7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #8 @ r0<- A(+) 7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #12 @ r1<- B 7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r0, r0, #15 7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r1) @ r2<- fp[B], the object pointer 7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r0, lsl #2 @ r3<- &fp[A] 7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ check object for null 7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r3, {r0-r1} @ r0/r1<- fp[A] 7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 1) @ r3<- field byte offset 7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strd r0, [r2, r3] @ obj.field (64 bits, aligned)<- r0/r1 7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */ 7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */ 7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */ 7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* For: iput-quick, iput-object-quick */ 7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vA, vB, offset@CCCC */ 7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #12 @ r2<- B 7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- fp[B], the object pointer 7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- field byte offset 7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ check object for null 7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A(+) 7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 7884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r2) @ r0<- fp[A] 7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r3, r1] @ obj.field (always 32 bits)<- r0 7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */ 7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */ 7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an optimized virtual method call. 7898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range 7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 2) @ r3<- FEDC or CCCC 7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r3, #15 @ r3<- C (or stays CCCC) 7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vC ("this" ptr) 7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ is "this" null? 7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offObject_clazz] @ r2<- thisPtr->clazz 7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_vtable] @ r2<- thisPtr->clazz->vtable 7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ invoke must export 7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r3<- vtable[BBBB] 7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodNoRange @ continue on 7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */ 7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */ 7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */ 7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an optimized virtual method call. 7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range 7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r3, 2) @ r3<- FEDC or CCCC 7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r3, r3, #15 @ r3<- C (or stays CCCC) 7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r3) @ r2<- vC ("this" ptr) 7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ is "this" null? 7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offObject_clazz] @ r2<- thisPtr->clazz 7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_vtable] @ r2<- thisPtr->clazz->vtable 7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ invoke must export 7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r3<- vtable[BBBB] 7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodRange @ continue on 7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */ 7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */ 7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an optimized "super" method call. 7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: [opt] invoke-super-quick, invoke-super-quick/range 7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) 7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 7959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offMethod_clazz] @ r2<- method->clazz 7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_super] @ r2<- method->clazz->super 7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r10) @ r3<- "this" 7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_vtable] @ r2<- ...clazz->super->vtable 7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ null "this" ref? 7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- super->vtable[BBBB] 7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ "this" is null, throw exception 7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodNoRange @ continue on 7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */ 7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */ 7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */ 7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle an optimized "super" method call. 7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: [opt] invoke-super-quick, invoke-super-quick/range 7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 2) @ r10<- GFED or CCCC 7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) 7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r10, r10, #15 @ r10<- D (or stays CCCC) 7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offMethod_clazz] @ r2<- method->clazz 7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_super] @ r2<- method->clazz->super 7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r10) @ r3<- "this" 7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_vtable] @ r2<- ...clazz->super->vtable 7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #0 @ null "this" ref? 7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, r1, lsl #2] @ r0<- super->vtable[BBBB] 7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ "this" is null, throw exception 7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodRange @ continue on 7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8002c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */ 8003c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */ 8004c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT.S */ 8005c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 8006c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit instance field put. 8007c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 8008c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 8009c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 8010c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vA, vB, field@CCCC */ 8011c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r0, rINST, lsr #12 @ r0<- B 8012c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex 8013c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref CCCC 8014c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields 8015c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r9, r0) @ r9<- fp[B], the object pointer 8016c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr 8017c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 8018c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IPUT_OBJECT_VOLATILE_finish @ no, already resolved 8019c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 8020c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw 8021c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 8022c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveInstField @ r0<- resolved InstField ptr 8023c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 8024c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_IPUT_OBJECT_VOLATILE_finish @ yes, finish up 8025c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown 8026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 8029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8030c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */ 8031c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */ 8032c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET.S */ 8033c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 8034c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit SGET handler. 8035c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 8036c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 8037c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 8038c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vAA, field@BBBB */ 8039c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 8040c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 8041c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 8042c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 8043c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 8044c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq .LOP_SGET_OBJECT_VOLATILE_resolve @ yes, do resolve 8045c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0 8046c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r1, [r0, #offStaticField_value] @ r1<- field value 80470890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ acquiring load 8048c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- AA 8049c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8050c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden SET_VREG(r1, r2) @ fp[AA]<- r1 8051c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 8052c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 8053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 8056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8057c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */ 8058c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */ 8059c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT.S */ 8060c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 8061c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * General 32-bit SPUT handler. 8062c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * 8063c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short 8064c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 8065c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* op vAA, field@BBBB */ 8066c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex 8067c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH(r1, 1) @ r1<- field ref BBBB 8068c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields 8069c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr 8070c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ is resolved entry null? 8071c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq .LOP_SPUT_OBJECT_VOLATILE_resolve @ yes, do resolve 8072c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0 8073c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- AA 8074c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8075c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r1, r2) @ r1<- fp[AA] 8076c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 80770890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ releasing store 8078c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden str r1, [r0, #offStaticField_value] @ field<- vAA 8079c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 8080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */ 8083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */ 8085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FF.S */ 8086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */ 8087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort 8088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 64 8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .size dvmAsmInstructionStart, .-dvmAsmInstructionStart 8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmAsmInstructionEnd 8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd: 8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sister implementations 8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmAsmSisterStart 8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dvmAsmSisterStart, %function 8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .text 8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 4 8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart: 8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */ 8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the String has not yet been resolved. 8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB (String ref) 8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9: target register 8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve: 8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offMethod_clazz] @ r0<- method->clazz 8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveString @ r0<- String reference 8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yup, handle the exception 8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */ 8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the String has not yet been resolved. 8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBBBBBB (String ref) 8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9: target register 8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve: 8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offMethod_clazz] @ r0<- method->clazz 8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveString @ r0<- String reference 8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yup, handle the exception 8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */ 8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the Class has not yet been resolved. 8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB (Class ref) 8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9: target register 8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve: 8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #1 @ r2<- true 8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offMethod_clazz] @ r0<- method->clazz 8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- Class reference 8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yup, handle the exception 8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vAA<- r0 8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */ 8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Trivial test failed, need to perform full check. This is common. 8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds obj->clazz 8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds class resolved from BBBB 8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck: 8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInstanceofNonTrivial @ r0<- boolean result 8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_CHECK_CAST_okay @ no, success 8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ A cast has failed. We need to throw a ClassCastException with the 8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ class of the object that failed to be cast. 8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ about to throw 8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r9, #offObject_clazz] @ r3<- obj->clazz 8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, .LstrClassCastExceptionPtr 8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r3, #offClassObject_descriptor] @ r1<- obj->clazz->descriptor 8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowExceptionWithClassMessage 8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolution required. This is the least-likely path. 8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r2 holds BBBB 8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve: 8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r2 @ r1<- BBBB 8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- resolved ClassObject ptr 8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0 @ r1<- class resolved from BBB 8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz 8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CHECK_CAST_resolved @ pick up where we left off 8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastExceptionPtr: 8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrClassCastException 8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */ 8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Trivial test failed, need to perform full check. This is common. 8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds obj->clazz 8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds class resolved from BBBB 8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds A 8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck: 8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInstanceofNonTrivial @ r0<- boolean result 8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to OP_INSTANCE_OF_store 8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds boolean result 8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds A 8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store: 8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Trivial test succeeded, save and bail. 8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds A 8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial: 8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #1 @ indicate success 8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper 8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r9) @ vA<- r0 8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolution required. This is the least-likely path. 8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r3 holds BBBB 8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds A 8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve: 8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw 8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] @ r0<- glue->method 8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r3 @ r1<- BBBB 8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #1 @ r2<- true 8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offMethod_clazz] @ r0<- method->clazz 8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- resolved ClassObject ptr 8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0 @ r1<- class resolved from BBB 8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #12 @ r3<- B 8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vB (object) 8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r0, #offObject_clazz] @ r0<- obj->clazz 8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_INSTANCE_OF_resolved @ pick up where we left off 8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */ 8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .balign 32 @ minimize cache lines 8267b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden.LOP_NEW_INSTANCE_finish: @ r0=new object 8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle the exception 8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r3) @ vAA<- r0 8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class initialization required. 8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds class object 8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit: 8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r0 @ save r0 8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmInitClass @ initialize class 8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ check boolean result 8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ restore r0 8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_NEW_INSTANCE_initialized @ success, continue 8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ failed, deal with init exception 8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolution required. This is the least-likely path. 8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds BBBB 8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve: 8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- resolved ClassObject ptr 8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_NEW_INSTANCE_resolved @ no, continue 8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationErrorPtr: 8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrInstantiationError 8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */ 8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolve class. (This is an uncommon case.) 8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds array length 8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r2 holds class ref CCCC 8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve: 8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r1 @ r9<- length (save) 8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r2 @ r1<- CCCC 8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- call(clazz, ref) 8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r9 @ r1<- length (restore) 8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to OP_NEW_ARRAY_finish 8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Finish allocation. 8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds class 8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 holds array length 8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish: 8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #ALLOC_DONT_TRACK @ don't track in local refs table 8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAllocArrayByClass @ r0<- call(clazz, length, flags) 8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ failed? 8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle the exception 8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ vA<- r0 8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */ 8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds array class 8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 holds AA or BA 8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue: 8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor 8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #ALLOC_DONT_TRACK @ r2<- alloc flags 8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r3, [r3, #1] @ r3<- descriptor[1] 8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- AA (length) 8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10, lsr #4 @ r1<- B (length) 8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #'I' @ array of ints? 8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmpne r3, #'L' @ array of objects? 8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmpne r3, #'[' @ array of arrays? 8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r1 @ save length in r9 8365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_FILLED_NEW_ARRAY_notimpl @ no, not handled yet 8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAllocArrayByClass @ r0<- call(arClass, length, flags) 8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null return? 8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ alloc failed, handle exception 8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- FEDC or CCCC 8371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [rGLUE, #offGlue_retval] @ retval.l <- new array 8372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, #offArrayObject_contents @ r0<- newArray->contents 8373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ length--, check for neg 8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST 8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi 2f @ was zero, bail 8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ copy values from registers into the array 8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA 8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r1, lsl #2 @ r2<- &fp[CCCC] 8381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: ldr r3, [r2], #4 @ r3<- *r2++ 8382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #4 @ length was initially 5? 8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r10, #15 @ r2<- A 8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ <= 4 args, branch 8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vA 8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r9, r9, #1 @ count-- 8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0, #16] @ contents[4] = vA 8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and r2, r1, #15 @ r2<- F/E/D/C 8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vF/vE/vD/vC 8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr #4 @ r1<- next reg in low 4 8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: 8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute it 8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception indicating that we have not implemented this 8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mode of filled-new-array. 8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl: 8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, .L_strInternalError 8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, .L_strFilledNewArrayNotImpl 8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 8414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 8415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!0) @ define in one or the other, not both 8417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl: 8418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrFilledNewArrayNotImpl 8419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError: 8420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrInternalError 8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */ 8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds array class 8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 holds AA or BA 8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue: 8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor 8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #ALLOC_DONT_TRACK @ r2<- alloc flags 8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r3, [r3, #1] @ r3<- descriptor[1] 8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- AA (length) 8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10, lsr #4 @ r1<- B (length) 8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, #'I' @ array of ints? 8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmpne r3, #'L' @ array of objects? 8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmpne r3, #'[' @ array of arrays? 8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r1 @ save length in r9 8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_FILLED_NEW_ARRAY_RANGE_notimpl @ no, not handled yet 8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAllocArrayByClass @ r0<- call(arClass, length, flags) 8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null return? 8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ alloc failed, handle exception 8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- FEDC or CCCC 8449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [rGLUE, #offGlue_retval] @ retval.l <- new array 8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, #offArrayObject_contents @ r0<- newArray->contents 8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ length--, check for neg 8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST 8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi 2f @ was zero, bail 8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ copy values from registers into the array 8456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA 8457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 1 8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r1, lsl #2 @ r2<- &fp[CCCC] 8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: ldr r3, [r2], #4 @ r3<- *r2++ 8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 8461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 8465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #4 @ length was initially 5? 8466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r10, #15 @ r2<- A 8467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ <= 4 args, branch 8468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vA 8469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r9, r9, #1 @ count-- 8470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0, #16] @ contents[4] = vA 8471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and r2, r1, #15 @ r2<- F/E/D/C 8472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vF/vE/vD/vC 8473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr #4 @ r1<- next reg in low 4 8474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 8475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 8476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 8477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 8478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: 8481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ ip<- opcode from rINST 8482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ execute it 8483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception indicating that we have not implemented this 8486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mode of filled-new-array. 8487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl: 8489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, .L_strInternalError 8490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, .L_strFilledNewArrayNotImpl 8491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 8492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 8493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if (!1) @ define in one or the other, not both 8495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl: 8496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrFilledNewArrayNotImpl 8497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError: 8498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrInternalError 8499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 8500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */ 8502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Test for NaN with a second comparison. EABI forbids testing bit 8504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ patterns, and we can't represent 0x7fc00000 in immediate form, so 8505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ make the library call. 8506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_gt_or_nan: 8507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r9 @ reverse order 8508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r10 8509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cfcmple @ r0<- Z set if eq, C clear if < 8510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bleq common_abort 8511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movcc r1, #1 @ (greater than) r1<- 1 8512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_CMPL_FLOAT_finish 8513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, #0 @ r1<- 1 or -1 for NaN 8514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMPL_FLOAT_finish 8515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 /* "clasic" form */ 8518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 8519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 8520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 8521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r2) @ r9<- vBB 8522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r10, r3) @ r10<- vCC 8523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpeq @ r0<- (vBB == vCC) 8526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ equal? 8527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r1, #0 @ yes, result is 0 8528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne OP_CMPL_FLOAT_finish 8529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmplt @ r0<- (vBB < vCC) 8532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ less than? 8533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b OP_CMPL_FLOAT_continue 8534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break 8535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_continue: 8537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r1, #0 @ yes, result is -1 8538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne OP_CMPL_FLOAT_finish 8539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpgt @ r0<- (vBB > vCC) 8542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ greater than? 8543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq OP_CMPL_FLOAT_nan @ no, must be NaN 8544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ yes, result is 1 8545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to _finish 8546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_finish: 8548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 8549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 8551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is expected to be uncommon, so we double-branch (once to here, 8556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * again back to _finish). 8557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_nan: 8559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, #0 @ r1<- 1 or -1 for NaN 8560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b OP_CMPL_FLOAT_finish 8561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 8563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */ 8565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Test for NaN with a second comparison. EABI forbids testing bit 8567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ patterns, and we can't represent 0x7fc00000 in immediate form, so 8568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ make the library call. 8569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_gt_or_nan: 8570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r9 @ reverse order 8571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r10 8572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cfcmple @ r0<- Z set if eq, C clear if < 8573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bleq common_abort 8574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movcc r1, #1 @ (greater than) r1<- 1 8575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_CMPG_FLOAT_finish 8576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ r1<- 1 or -1 for NaN 8577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMPG_FLOAT_finish 8578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 /* "clasic" form */ 8581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 8582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 8583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 8584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r2) @ r9<- vBB 8585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r10, r3) @ r10<- vCC 8586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpeq @ r0<- (vBB == vCC) 8589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ equal? 8590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r1, #0 @ yes, result is 0 8591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne OP_CMPG_FLOAT_finish 8592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmplt @ r0<- (vBB < vCC) 8595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ less than? 8596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b OP_CMPG_FLOAT_continue 8597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break 8598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_continue: 8600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r1, #0 @ yes, result is -1 8601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne OP_CMPG_FLOAT_finish 8602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- vBB 8603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- vCC 8604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpgt @ r0<- (vBB > vCC) 8605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ greater than? 8606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq OP_CMPG_FLOAT_nan @ no, must be NaN 8607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ yes, result is 1 8608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to _finish 8609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_finish: 8611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 8612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r3) @ vAA<- r1 8614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is expected to be uncommon, so we double-branch (once to here, 8619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * again back to _finish). 8620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_nan: 8622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ r1<- 1 or -1 for NaN 8623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b OP_CMPG_FLOAT_finish 8624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 8626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */ 8628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Test for NaN with a second comparison. EABI forbids testing bit 8630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ patterns, and we can't represent 0x7fc00000 in immediate form, so 8631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ make the library call. 8632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_gt_or_nan: 8633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r10, {r0-r1} @ reverse order 8634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r2-r3} 8635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cdcmple @ r0<- Z set if eq, C clear if < 8636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bleq common_abort 8637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movcc r1, #1 @ (greater than) r1<- 1 8638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_CMPL_DOUBLE_finish 8639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, #0 @ r1<- 1 or -1 for NaN 8640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMPL_DOUBLE_finish 8641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */ 8643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Test for NaN with a second comparison. EABI forbids testing bit 8645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ patterns, and we can't represent 0x7fc00000 in immediate form, so 8646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ make the library call. 8647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_gt_or_nan: 8648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r10, {r0-r1} @ reverse order 8649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r2-r3} 8650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_cdcmple @ r0<- Z set if eq, C clear if < 8651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bleq common_abort 8652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movcc r1, #1 @ (greater than) r1<- 1 8653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .LOP_CMPG_DOUBLE_finish 8654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ r1<- 1 or -1 for NaN 8655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LOP_CMPG_DOUBLE_finish 8656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */ 8658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_less: 8660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvn r1, #0 @ r1<- -1 8661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Want to cond code the next mov so we can avoid branch, but don't see it; 8662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ instead, we just replicate the tail end. 8663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 8665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_greater: 8669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ r1<- 1 8670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ fall through to _finish 8671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish: 8673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r1, r9) @ vAA<- r1 8675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */ 8679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish: 8681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrd r2, [r0, #offArrayObject_contents] @ r2/r3<- vBB[vCC] 8683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] 8684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3 8686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */ 8689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish: 8691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1 8693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strd r2, [r0, #offArrayObject_contents] @ r2/r3<- vBB[vCC] 8695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */ 8698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 8700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 = vBB (arrayObj) 8701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 = vAA (obj) 8702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = offset into array (vBB + vCC * width) 8703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_finish: 8705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ storing null reference? 8706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LOP_APUT_OBJECT_skip_check @ yes, skip type checks 8707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz 8708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offObject_clazz] @ r1<- arrayObj->clazz 8709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmCanPutArrayElement @ test object type vs. array type 8710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ okay? 8711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errArrayStore @ no 8712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check: 8713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA 8716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET */ 8719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish: 8726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak0 8727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 87310890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */ 8740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish: 8747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8750c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden .if 0 8751861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r0, r9, r3 @ r0<- address of field 87526e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field 8753861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 8754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok) 8755861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 8756861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 8757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8758861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden and r2, r2, #15 @ r2<- A 8759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r2, lsl #2 @ r3<- &fp[A] 8760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r3, {r0-r1} @ fp[A]<- r0/r1 8762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_OBJECT */ 8765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish: 8772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak0 8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 87770890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */ 8786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish: 8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak1 8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 87980890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */ 8807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish: 8814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak2 8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 88190890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */ 8828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish: 8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak3 8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 88400890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */ 8849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish: 8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak4 8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 88610890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ acquiring load 8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_VREG(r0, r2) @ fp[A]<- r0 8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */ 8870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish: 8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak0 8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 88860890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */ 8891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish: 8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, rINST, lsr #8 @ r2<- A+ 8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r2, #15 @ r2<- A 8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r2, lsl #2 @ r3<- &fp[A] 8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmia r2, {r0-r1} @ r0/r1<- fp[A] 8906861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GET_INST_OPCODE(r10) @ extract opcode from rINST 8907c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden .if 0 8908861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r2, r9, r3 @ r2<- target address 89096e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 8910861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 8911861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1 8912861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 8913861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GOTO_OPCODE(r10) @ jump to next instruction 8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_OBJECT */ 8916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_finish: 8923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak0 8924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 8925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 8927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 8929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 89320890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 8933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 8934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */ 8937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish: 8944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak1 8945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 8946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 8948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 8950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 89530890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 8954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 8955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */ 8958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish: 8965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak2 8966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 8967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 8969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 8971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 89740890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 8975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 8976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */ 8979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 8981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 8982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 8983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 8984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish: 8986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak3 8987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 8988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 8989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 8990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 8991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 8992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 8993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 8994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 89950890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 8996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 8997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 8998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */ 9000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Currently: 9003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds resolved field 9004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 holds object 9005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish: 9007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_squeak4 9008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, rINST, lsr #8 @ r1<- A+ 9009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r1, r1, #15 @ r1<- A 9011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ check object for null 9012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r1) @ r0<- fp[A] 9013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ object was null 9014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 90160890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden @ no-op @ releasing store 9017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 9018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */ 9021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve: 9027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_finish @ yes, finish 9033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */ 9036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9040861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * 9041861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * Returns StaticField pointer in r0. 9042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_resolve: 9044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_WIDE_finish @ yes, finish 9050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */ 9053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve: 9059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_OBJECT_finish @ yes, finish 9065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */ 9068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_resolve: 9074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_BOOLEAN_finish @ yes, finish 9080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */ 9083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve: 9089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_BYTE_finish @ yes, finish 9095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */ 9098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve: 9104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_CHAR_finish @ yes, finish 9110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */ 9113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve: 9119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SGET_SHORT_finish @ yes, finish 9125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */ 9128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve: 9134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_finish @ yes, finish 9140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */ 9143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9: &fp[AA] 9148861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * 9149861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * Returns StaticField pointer in r2. 9150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_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? 9157861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r2, r0 @ copy to r2 9158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_WIDE_finish @ yes, finish 9159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */ 9162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_resolve: 9168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_OBJECT_finish @ yes, finish 9174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */ 9177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve: 9183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_BOOLEAN_finish @ yes, finish 9189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */ 9192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve: 9198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_BYTE_finish @ yes, finish 9204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */ 9207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve: 9213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_CHAR_finish @ yes, finish 9219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */ 9222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Continuation if the field has not yet been resolved. 9225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1: BBBB field ref 9226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve: 9228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ resolve() could throw, so export now 9230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ success? 9233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_SPUT_SHORT_finish @ yes, finish 9234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ no, handle exception 9235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */ 9237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At this point: 9240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = C or CCCC (index of first arg, which is the "this" ptr) 9242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue: 9244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r10) @ r1<- "this" ptr 9245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offMethod_methodIndex] @ r2<- baseMethod->methodIndex 9246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is "this" null? 9247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 9248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offObject_clazz] @ r1<- thisPtr->clazz 9249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offClassObject_vtable] @ r3<- thisPtr->clazz->vtable 9250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r2, lsl #2] @ r3<- vtable[methodIndex] 9251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodNoRange @ continue on 9252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */ 9254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At this point: 9257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 = method->clazz 9259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue: 9261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r9, #offClassObject_super] @ r1<- method->clazz->super 9262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offMethod_methodIndex] @ r2<- baseMethod->methodIndex 9263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offClassObject_vtableCount] @ r3<- super->vtableCount 9264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 9265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (methodIndex, vtableCount) 9266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs .LOP_INVOKE_SUPER_nsm @ method not present in superclass 9267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offClassObject_vtable] @ r1<- ...clazz->super->vtable 9268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r1, r2, lsl #2] @ r3<- vtable[methodIndex] 9269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodNoRange @ continue on 9270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve: 9272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- method->clazz 9273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_VIRTUAL @ resolver method type 9274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 9275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 9276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_SUPER_continue @ no, continue 9277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 9278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw a NoSuchMethodError with the method name as the message. 9281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm: 9284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offMethod_name] @ r1<- method name 9285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errNoSuchMethod 9286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */ 9288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 9291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 = reference (BBBB or CCCC) 9292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = "this" register 9293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve: 9295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 9296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 9297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_DIRECT @ resolver method type 9298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 9299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 9300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr (reload) 9301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_DIRECT_finish @ no, continue 9302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 9303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */ 9305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At this point: 9308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = C or CCCC (index of first arg, which is the "this" ptr) 9310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue: 9312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r10) @ r1<- "this" ptr 9313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offMethod_methodIndex] @ r2<- baseMethod->methodIndex 9314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ is "this" null? 9315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ null "this", throw exception 9316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offObject_clazz] @ r1<- thisPtr->clazz 9317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offClassObject_vtable] @ r3<- thisPtr->clazz->vtable 9318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r2, lsl #2] @ r3<- vtable[methodIndex] 9319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodRange @ continue on 9320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */ 9322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At this point: 9325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 = method->clazz 9327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue: 9329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r9, #offClassObject_super] @ r1<- method->clazz->super 9330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrh r2, [r0, #offMethod_methodIndex] @ r2<- baseMethod->methodIndex 9331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offClassObject_vtableCount] @ r3<- super->vtableCount 9332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ must export for invoke 9333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, r3 @ compare (methodIndex, vtableCount) 9334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcs .LOP_INVOKE_SUPER_RANGE_nsm @ method not present in superclass 9335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offClassObject_vtable] @ r1<- ...clazz->super->vtable 9336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r1, r2, lsl #2] @ r3<- vtable[methodIndex] 9337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_invokeMethodRange @ continue on 9338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve: 9340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- method->clazz 9341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_VIRTUAL @ resolver method type 9342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 9343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 9344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_SUPER_RANGE_continue @ no, continue 9345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 9346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw a NoSuchMethodError with the method name as the message. 9349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = resolved base method 9350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm: 9352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offMethod_name] @ r1<- method name 9353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errNoSuchMethod 9354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */ 9356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 9359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 = reference (BBBB or CCCC) 9360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = "this" register 9361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve: 9363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_method] @ r3<- glue->method 9364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 9365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #METHOD_DIRECT @ resolver method type 9366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveMethod @ r0<- call(clazz, ref, flags) 9367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 9368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r2, r10) @ r2<- "this" ptr (reload) 9369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LOP_INVOKE_DIRECT_RANGE_finish @ no, continue 9370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown @ yes, handle exception 9371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */ 9373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 9374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to a long in r0/r1. 9375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification. The 9377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 9378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 9379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2l_doconv: 9381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, lr} 9382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0x5f000000 @ (float)maxlong 9383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r4, r0 9384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpge @ is arg >= maxlong? 9385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 9386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r0, #0 @ return maxlong (7fffffff) 9387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r1, #0x80000000 9388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmnefd sp!, {r4, pc} 9389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0xdf000000 @ (float)minlong 9392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmple @ is arg <= minlong? 9393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 9394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0 @ return minlong (80000000) 9395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r1, #0x80000000 9396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmnefd sp!, {r4, pc} 9397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r4 9400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_fcmpeq @ is arg == self? 9401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 9402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ return zero for NaN 9403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmeqfd sp!, {r4, pc} 9404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_f2lz @ convert float to long 9407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, pc} 9408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */ 9410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 9411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to a long in r0/r1. 9412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification. The 9414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly 9415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer. The EABI convert function isn't doing this for us. 9416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2l_doconv: 9418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r4, r5, lr} @ save regs 94195162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0x43000000 @ maxlong, as a double (high word) 94205162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, #0x00e00000 @ 0x43e00000 94215162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ maxlong, as a double (low word) 9422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #4 @ align for EABI 94235162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r4, r0 @ save a copy of r0 9424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r5, r1 @ and r1 9425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpge @ is arg >= maxlong? 9426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 9427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r0, #0 @ return maxlong (7fffffffffffffff) 9428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mvnne r1, #0x80000000 9429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 9430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 94335162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r3, #0xc3000000 @ minlong, as a double (high word) 94345162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden add r3, #0x00e00000 @ 0xc3e00000 94355162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden mov r2, #0 @ minlong, as a double (low word) 9436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmple @ is arg <= minlong? 9437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ nonzero == yes 9438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, #0 @ return minlong (8000000000000000) 9439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r1, #0x80000000 9440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f 9441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 9444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r4 @ compare against self 9445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r5 9446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_dcmpeq @ is arg == self? 9447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ zero == no 9448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project moveq r1, #0 @ return zero for NaN 9449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f 9450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r4 @ recover arg 9452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r5 9453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __aeabi_d2lz @ convert double to long 9454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 9456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #4 9457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r4, r5, pc} 9458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */ 9460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_finish: 9462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10 9464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */ 9467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish: 9469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0, asl r2 @ r0<- r0 << r2 9470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */ 9475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish: 9477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asr r2 @ r1<- r1 >> r2 9478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */ 9483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish: 9485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr r2 @ r1<- r1 >>> r2 9486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */ 9491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish: 9493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */ 9498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish: 9500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */ 9505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish: 9507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 9508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 9509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 9510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9511c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IGET_VOLATILE */ 9512c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9513c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9514c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Currently: 9515c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r0 holds resolved field 9516c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r9 holds object 9517c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9518c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IGET_VOLATILE_finish: 9519c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden @bl common_squeak0 9520c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r9, #0 @ check object for null 9521c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9522c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq common_errNullObject @ object was null 9523c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 95240890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ acquiring load 9525c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 9526c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9527c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden and r2, r2, #15 @ r2<- A 9528c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 9529c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden SET_VREG(r0, r2) @ fp[A]<- r0 9530c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 9531c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9532c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IPUT_VOLATILE */ 9533c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9534c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9535c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Currently: 9536c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r0 holds resolved field 9537c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r9 holds object 9538c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9539c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IPUT_VOLATILE_finish: 9540c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden @bl common_squeak0 9541c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r1, rINST, lsr #8 @ r1<- A+ 9542c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9543c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden and r1, r1, #15 @ r1<- A 9544c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r9, #0 @ check object for null 9545c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r0, r1) @ r0<- fp[A] 9546c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq common_errNullObject @ object was null 9547c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9548c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 95490890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ releasing store 9550c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 9551c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 9552c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9553c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SGET_VOLATILE */ 9554c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9555c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9556c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Continuation if the field has not yet been resolved. 9557c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r1: BBBB field ref 9558c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9559c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_VOLATILE_resolve: 9560c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9561c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 9562c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9563c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9564c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 9565c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_SGET_VOLATILE_finish @ yes, finish 9566c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown @ no, handle exception 9567c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9568c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SPUT_VOLATILE */ 9569c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9570c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9571c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Continuation if the field has not yet been resolved. 9572c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r1: BBBB field ref 9573c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9574c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_VOLATILE_resolve: 9575c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9576c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 9577c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9578c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9579c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 9580c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_SPUT_VOLATILE_finish @ yes, finish 9581c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown @ no, handle exception 9582c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9583c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IGET_OBJECT_VOLATILE */ 9584c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9585c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9586c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Currently: 9587c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r0 holds resolved field 9588c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r9 holds object 9589c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9590c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IGET_OBJECT_VOLATILE_finish: 9591c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden @bl common_squeak0 9592c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r9, #0 @ check object for null 9593c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9594c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq common_errNullObject @ object was null 9595c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) 95960890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ acquiring load 9597c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 9598c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9599c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden and r2, r2, #15 @ r2<- A 9600c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 9601c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden SET_VREG(r0, r2) @ fp[A]<- r0 9602c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 9603c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 96045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IGET_WIDE_VOLATILE */ 96055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 96075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Currently: 96085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r0 holds resolved field 96095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r9 holds object 96105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 96115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IGET_WIDE_VOLATILE_finish: 96125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r9, #0 @ check object for null 96135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 96145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden beq common_errNullObject @ object was null 9615c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden .if 1 9616861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r0, r9, r3 @ r0<- address of field 96176e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field 9618861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 96195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok) 9620861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 9621861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 96225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9623861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden and r2, r2, #15 @ r2<- A 96245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden add r3, rFP, r2, lsl #2 @ r3<- &fp[A] 96255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 96265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden stmia r3, {r0-r1} @ fp[A]<- r0/r1 96275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 96285387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96295387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IPUT_WIDE_VOLATILE */ 96305387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96315387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 96325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Currently: 96335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r0 holds resolved field 96345387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r9 holds object 96355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 96365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IPUT_WIDE_VOLATILE_finish: 96375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden mov r2, rINST, lsr #8 @ r2<- A+ 96385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r9, #0 @ check object for null 96395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden and r2, r2, #15 @ r2<- A 96405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 96415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden add r2, rFP, r2, lsl #2 @ r3<- &fp[A] 96425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden beq common_errNullObject @ object was null 96435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 96445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldmia r2, {r0-r1} @ r0/r1<- fp[A] 9645861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GET_INST_OPCODE(r10) @ extract opcode from rINST 9646c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden .if 1 9647861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden add r2, r9, r3 @ r2<- target address 96486e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 9649861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .else 9650861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1 9651861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden .endif 9652861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden GOTO_OPCODE(r10) @ jump to next instruction 96535387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SGET_WIDE_VOLATILE */ 96555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 96575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Continuation if the field has not yet been resolved. 96585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r1: BBBB field ref 9659861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * 9660861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * Returns StaticField pointer in r0. 96615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 96625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_resolve: 96635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 96645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 96655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 96665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 96675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ success? 96685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_SGET_WIDE_VOLATILE_finish @ yes, finish 96695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden b common_exceptionThrown @ no, handle exception 96705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SPUT_WIDE_VOLATILE */ 96725387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 96735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden /* 96745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * Continuation if the field has not yet been resolved. 96755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r1: BBBB field ref 96765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden * r9: &fp[AA] 9677861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * 9678861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden * Returns StaticField pointer in r2. 96795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden */ 96805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SPUT_WIDE_VOLATILE_resolve: 96815387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 96825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 96835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 96845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 96855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden cmp r0, #0 @ success? 9686861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden mov r2, r0 @ copy to r2 96875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden bne .LOP_SPUT_WIDE_VOLATILE_finish @ yes, finish 96885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden b common_exceptionThrown @ no, handle exception 96895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden 9690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */ 9691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 9693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Extract args, call function. 9694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = #of args (0-4) 9695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = call index 9696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * lr = return addr, above [DO NOT bl out of here w/o preserving LR] 9697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Other ideas: 9699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * - Use a jump table from the main piece to jump directly into the 9700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * AND/LDR pairs. Costs a data load, saves a branch. 9701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * - Have five separate pieces that do the loading, so we can work the 9702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * interleave a little better. Increases code size. 9703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue: 9705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, #4 @ r0<- 4-r0 9706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r9, 2) @ r9<- FEDC 9707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add pc, pc, r0, lsl #3 @ computed goto, 2 instrs each 9708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort @ (skipped due to ARM prefetch) 9709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4: and ip, r9, #0xf000 @ isolate F 9710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rFP, ip, lsr #10] @ r3<- vF (shift right 12, left 2) 9711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3: and ip, r9, #0x0f00 @ isolate E 9712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rFP, ip, lsr #6] @ r2<- vE 9713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: and ip, r9, #0x00f0 @ isolate D 9714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [rFP, ip, lsr #2] @ r1<- vD 9715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and ip, r9, #0x000f @ isolate C 9716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rFP, ip, lsl #2] @ r0<- vC 9717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: 9718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, .LOP_EXECUTE_INLINE_table @ table of InlineOperation 9719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LDR_PC "[r9, r10, lsl #4]" @ sizeof=16, "func" is first entry 9720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ (not reached) 9721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_table: 9723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word gDvmInlineOpsTable 9724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9725b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* continuation for OP_EXECUTE_INLINE_RANGE */ 9726b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden 9727b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden /* 9728b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * Extract args, call function. 9729b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * r0 = #of args (0-4) 9730b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * r10 = call index 9731b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * lr = return addr, above [DO NOT bl out of here w/o preserving LR] 9732b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden */ 9733b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_continue: 9734b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden rsb r0, r0, #4 @ r0<- 4-r0 9735b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden FETCH(r9, 2) @ r9<- CCCC 9736b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden add pc, pc, r0, lsl #3 @ computed goto, 2 instrs each 9737b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden bl common_abort @ (skipped due to ARM prefetch) 9738b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden4: add ip, r9, #3 @ base+3 9739b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_VREG(r3, ip) @ r3<- vBase[3] 9740b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden3: add ip, r9, #2 @ base+2 9741b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_VREG(r2, ip) @ r2<- vBase[2] 9742b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden2: add ip, r9, #1 @ base+1 9743b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_VREG(r1, ip) @ r1<- vBase[1] 9744b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden1: add ip, r9, #0 @ (nop) 9745b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden GET_VREG(r0, ip) @ r0<- vBase[0] 9746b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden0: 9747b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden ldr r9, .LOP_EXECUTE_INLINE_RANGE_table @ table of InlineOperation 9748b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden LDR_PC "[r9, r10, lsl #4]" @ sizeof=16, "func" is first entry 9749b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden @ (not reached) 9750b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden 9751b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_table: 9752b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden .word gDvmInlineOpsTable 9753b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden 9754c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IPUT_OBJECT_VOLATILE */ 9755c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9756c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9757c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Currently: 9758c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r0 holds resolved field 9759c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r9 holds object 9760c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9761c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IPUT_OBJECT_VOLATILE_finish: 9762c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden @bl common_squeak0 9763c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden mov r1, rINST, lsr #8 @ r1<- A+ 9764c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field 9765c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden and r1, r1, #15 @ r1<- A 9766c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r9, #0 @ check object for null 9767c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_VREG(r0, r1) @ r0<- fp[A] 9768c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden beq common_errNullObject @ object was null 9769c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 9770c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GET_INST_OPCODE(ip) @ extract opcode from rINST 97710890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden SMP_DMB @ releasing store 9772c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 9773c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden GOTO_OPCODE(ip) @ jump to next instruction 9774c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9775c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SGET_OBJECT_VOLATILE */ 9776c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9777c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9778c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Continuation if the field has not yet been resolved. 9779c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r1: BBBB field ref 9780c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9781c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_OBJECT_VOLATILE_resolve: 9782c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9783c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 9784c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9785c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9786c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 9787c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_SGET_OBJECT_VOLATILE_finish @ yes, finish 9788c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown @ no, handle exception 9789c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9790c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SPUT_OBJECT_VOLATILE */ 9791c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9792c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden /* 9793c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Continuation if the field has not yet been resolved. 9794c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * r1: BBBB field ref 9795c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */ 9796c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_OBJECT_VOLATILE_resolve: 9797c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r2, [rGLUE, #offGlue_method] @ r2<- current method 9798c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden EXPORT_PC() @ resolve() could throw, so export now 9799c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz 9800c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bl dvmResolveStaticField @ r0<- resolved StaticField ptr 9801c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden cmp r0, #0 @ success? 9802c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden bne .LOP_SPUT_OBJECT_VOLATILE_finish @ yes, finish 9803c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden b common_exceptionThrown @ no, handle exception 9804c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden 9805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .size dvmAsmSisterStart, .-dvmAsmSisterStart 9806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .global dvmAsmSisterEnd 9807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd: 9808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/footer.S */ 9810ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 9812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 9813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common subroutines and data 9814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 9815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9817ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9818ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .text 9820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .align 2 9821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9822ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 982397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION) 982497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao .global dvmJitToInterpPunt 982597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpPunt: 9826d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 982797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSPunt @ r2<- interpreter entry point 9828d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng mov r3, #0 9829d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9830d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 983197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 983297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao .global dvmJitToInterpSingleStep 983397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpSingleStep: 9834d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str lr,[rGLUE,#offGlue_jitResumeNPC] 9835d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r1,[rGLUE,#offGlue_jitResumeDPC] 983697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSSingleStep @ r2<- interpreter entry point 9837d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 983897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 983940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpTraceSelectNoChain 984040094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain: 9841d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 984240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r0,rPC @ pass our target PC 984340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r2,#kSVSTraceSelectNoChain @ r2<- interpreter entry point 9844d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng mov r3, #0 9845d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9846d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 984740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng 984840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpTraceSelect 984940094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect: 9850d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 98519a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr r0,[lr, #-1] @ pass our target PC 985297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSTraceSelect @ r2<- interpreter entry point 9853d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng mov r3, #0 9854d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9855d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 985697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 985740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpBackwardBranch 985840094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpBackwardBranch: 9859d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 98609a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr r0,[lr, #-1] @ pass our target PC 986197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSBackwardBranch @ 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 dvmJitToInterpNormal 986797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNormal: 9868d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 98699a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr r0,[lr, #-1] @ pass our target PC 987097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSNormal @ r2<- interpreter entry point 9871d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng mov r3, #0 9872d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9873d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 987497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 987597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao .global dvmJitToInterpNoChain 987697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNoChain: 9877d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 987897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r0,rPC @ pass our target PC 987997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kSVSNoChain @ r2<- interpreter entry point 9880d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng mov r3, #0 9881d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9882d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng b jitSVShadowRunEnd @ doesn't return 988397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else 9884ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 9885ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter when the compiler is 9886ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * having issues translating/executing a Dalvik instruction. We have to skip 9887ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the code cache lookup otherwise it is possible to indefinitely bouce 9888ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * between the interpreter and the code cache if the instruction that fails 9889ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * to be compiled happens to be at a trace start. 9890ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 9891ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmJitToInterpPunt 9892ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpPunt: 98937a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 9894ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rPC, r0 9895978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING) 9896ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,lr 9897ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmBumpPunt; 9898ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 9899ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng EXPORT_PC() 99007a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r0, #0 99017a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ Back to the interp land 9902ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng adrl rIBASE, dvmAsmInstructionStart 9903ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_INST() 9904ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 9905ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) 9906ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9907ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 9908ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return to the interpreter to handle a single instruction. 9909ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * On entry: 9910ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * r0 <= PC 9911ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * r1 <= PC of resume instruction 9912ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * lr <= resume point in translation 9913ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 9914ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmJitToInterpSingleStep 9915ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpSingleStep: 9916d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str lr,[rGLUE,#offGlue_jitResumeNPC] 9917d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng str r1,[rGLUE,#offGlue_jitResumeDPC] 9918ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,#kInterpEntryInstr 9919ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ enum is 4 byte in aapcs-EABI 9920ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r1, [rGLUE, #offGlue_entryPoint] 9921ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rPC,r0 9922ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng EXPORT_PC() 99237a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 9924ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng adrl rIBASE, dvmAsmInstructionStart 9925ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r2,#kJitSingleStep @ Ask for single step and then revert 9926ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r2,[rGLUE,#offGlue_jitState] 9927ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,#1 @ set changeInterp to bail to debug interp 9928ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_gotoBail 9929ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 993040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/* 993140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * Return from the translation cache and immediately request 993240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * a translation for the exit target. Commonly used for callees. 993340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */ 993440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpTraceSelectNoChain 993540094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain: 9936978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING) 993740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng bl dvmBumpNoChain 993840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng#endif 993940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 994040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r0,rPC 994140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng bl dvmJitGetCodeAddr @ Is there a translation? 994240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 994340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r1, rPC @ arg1 of translation may need this 994440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov lr, #0 @ in case target is HANDLER_INTERPRET 994540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng cmp r0,#0 994640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng bxne r0 @ continue native execution if so 994740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng b 2f 9948ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9949ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 9950ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache and immediately request 9951ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a translation for the exit target. Commonly used following 9952ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * invokes. 9953ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 995440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng .global dvmJitToInterpTraceSelect 995540094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect: 99569a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr rPC,[lr, #-1] @ get our target PC 99577a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 99589a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee add rINST,lr,#-5 @ save start of chain branch 9959bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee add rINST, #-4 @ .. which is 9 bytes back 9960ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,rPC 99617a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng bl dvmJitGetCodeAddr @ Is there a translation? 99627a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 9963ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 9964ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng beq 2f 9965ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,rINST 9966ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitChain @ r0<- dvmJitChain(codeAddr,chainAddr) 99679a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r1, rPC @ arg1 of translation may need this 99689a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov lr, #0 @ in case target is HANDLER_INTERPRET 996946cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee cmp r0,#0 @ successful chain? 997046cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee bxne r0 @ continue native execution 997146cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee b toInterpreter @ didn't chain - resume with interpreter 9972ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9973ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* No translation, so request one if profiling isn't disabled*/ 9974ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng2: 99751da12167d913efde56ec3b40491524b051679f2cAndy McFadden adrl rIBASE, dvmAsmInstructionStart 9976ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 9977ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_INST() 9978ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0, #0 997940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng movne r2,#kJitTSelectRequestHot @ ask for trace selection 9980ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_selectTrace 9981ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 9982ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) 9983ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 9984ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 9985ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter. 9986ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The return was done with a BLX from thumb mode, and 9987ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the following 32-bit word contains the target rPC value. 9988ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Note that lr (r14) will have its low-order bit set to denote 9989ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * its thumb-mode origin. 9990ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 9991ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * We'll need to stash our lr origin away, recover the new 9992ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * target and then check to see if there is a translation available 9993ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for our new target. If so, we do a translation chain and 9994ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * go back to native execution. Otherwise, it's back to the 9995ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * interpreter (after treating this entry as a potential 9996ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace start). 9997ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 9998ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmJitToInterpNormal 9999ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNormal: 100009a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr rPC,[lr, #-1] @ get our target PC 100017a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 100029a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee add rINST,lr,#-5 @ save start of chain branch 10003bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee add rINST,#-4 @ .. which is 9 bytes back 10004978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING) 10005ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmBumpNormal 10006ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10007ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,rPC 10008ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitGetCodeAddr @ Is there a translation? 100097a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 10010ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1001146cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee beq toInterpreter @ go if not, otherwise do chain 10012ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,rINST 10013ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitChain @ r0<- dvmJitChain(codeAddr,chainAddr) 100149a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r1, rPC @ arg1 of translation may need this 100159a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov lr, #0 @ in case target is HANDLER_INTERPRET 1001646cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee cmp r0,#0 @ successful chain? 1001746cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee bxne r0 @ continue native execution 1001846cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee b toInterpreter @ didn't chain - resume with interpreter 10019ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10020ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10021ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter to do method invocation. 10022ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Check if translation exists for the callee, but don't chain to it. 10023ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 10024ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmJitToInterpNoChain 10025ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNoChain: 10026978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING) 10027ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmBumpNoChain 10028ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 100297a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 10030ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,rPC 10031ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitGetCodeAddr @ Is there a translation? 100327a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 100339a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r1, rPC @ arg1 of translation may need this 100349a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov lr, #0 @ in case target is HANDLER_INTERPRET 10035ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10036ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxne r0 @ continue native execution if so 1003797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 10038ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10039ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10040ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * No translation, restore interpreter regs and start interpreting. 10041ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * rGLUE & rFP were preserved in the translated code, and rPC has 10042ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * already been restored by the time we get here. We'll need to set 10043ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * up rIBASE & rINST, and load the address of the JitTable into r0. 10044ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 1004546cd5b63c29d3284a9ff3e0d0711fb136f409313Bill BuzbeetoInterpreter: 10046ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng EXPORT_PC() 10047ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng adrl rIBASE, dvmAsmInstructionStart 10048ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_INST() 10049ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 10050ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ NOTE: intended fallthrough 10051ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10052ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Common code to update potential trace start counter, and initiate 10053ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a trace-build if appropriate. On entry, rPC should point to the 10054ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * next instruction to execute, and rINST should be already loaded with 10055ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the next opcode word, and r0 holds a pointer to the jit profile 10056ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * table (pJitProfTable). 10057ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 10058ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_testUpdateProfile: 10059ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10060ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 10061ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE_IFEQ(ip) @ if not profiling, fallthrough otherwise */ 10062ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10063ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_updateProfile: 10064ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng eor r3,rPC,rPC,lsr #12 @ cheap, but fast hash function 100657b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng lsl r3,r3,#(32 - JIT_PROF_SIZE_LOG_2) @ shift out excess bits 100667b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng ldrb r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter 10067ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 10068ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng subs r1,r1,#1 @ decrement counter 100697b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng strb r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it 10070ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE_IFNE(ip) @ if not threshold, fallthrough otherwise */ 10071ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10072ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 10073ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Here, we switch to the debug interpreter to request 10074ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace selection. First, though, check to see if there 10075ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * is already a native translation in place (and, if so, 10076ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * jump to it now). 10077ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 10078d726991ba52466cde88e37aba4de2395b62477faBill Buzbee GET_JIT_THRESHOLD(r1) 100797a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self 100807b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng strb r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter 10081ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng EXPORT_PC() 10082ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,rPC 10083ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bl dvmJitGetCodeAddr @ r0<- dvmJitGetCodeAddr(rPC) 100847a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag 100857a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r1, rPC @ arg1 of translation may need this 100867a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov lr, #0 @ in case target is HANDLER_INTERPRET 10087ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 1008897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION) 10089ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxne r0 @ jump to the translation 1009040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng mov r2,#kJitTSelectRequest @ ask for trace selection 1009140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng @ fall-through to common_selectTrace 1009297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else 1009340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng moveq r2,#kJitTSelectRequest @ ask for trace selection 100949a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee beq common_selectTrace 100959a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee /* 100969a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * At this point, we have a target translation. However, if 100979a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * that translation is actually the interpret-only pseudo-translation 100989a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * we want to treat it the same as no translation. 100999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee */ 10100d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng mov r10, r0 @ save target 101019a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee bl dvmCompilerGetInterpretTemplate 10102d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng cmp r0, r10 @ special case? 10103d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng bne jitSVShadowRunStart @ set up self verification shadow space 101049a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee GET_INST_OPCODE(ip) 101059a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee GOTO_OPCODE(ip) 101069a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee /* no return */ 1010797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 101089a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee 1010940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/* 1011040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * On entry: 1011140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot 1011240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */ 10113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_selectTrace: 10114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r2,[rGLUE,#offGlue_jitState] 101159c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng mov r2,#kInterpEntryInstr @ normal entry reason 101169c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng str r2,[rGLUE,#offGlue_entryPoint] 10117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,#1 @ set changeInterp 10118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng b common_gotoBail 10119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1012097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION) 1012197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/* 1012297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Save PC and registers to shadow memory for self verification mode 1012397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping to native translation. 10124d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * On entry: 10125d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * rPC, rFP, rGLUE: the values that they should contain 10126d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * r10: the address of the target translation. 1012797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */ 10128d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunStart: 1012997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r0,rPC @ r0<- program counter 1013097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r1,rFP @ r1<- frame pointer 1013197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,rGLUE @ r2<- InterpState pointer 101329a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r3,r10 @ r3<- target translation 1013397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao bl dvmSelfVerificationSaveState @ save registers to shadow space 10134ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space 10135ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng add rGLUE,r0,#offShadowSpace_interpState @ rGLUE<- rGLUE in shadow space 10136ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng bx r10 @ jump to the translation 1013797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 1013897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/* 1013997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Restore PC, registers, and interpState to original values 1014097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping back to the interpreter. 1014197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */ 10142d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunEnd: 1014397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r1,rFP @ pass ending fp 1014497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao bl dvmSelfVerificationRestoreState @ restore pc and fp values 10145ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr rPC,[r0,#offShadowSpace_startPC] @ restore PC 10146ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr rFP,[r0,#offShadowSpace_fp] @ restore FP 10147ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr rGLUE,[r0,#offShadowSpace_glue] @ restore InterpState 10148ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng ldr r1,[r0,#offShadowSpace_svState] @ get self verification state 1014997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao cmp r1,#0 @ check for punt condition 1015097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao beq 1f 1015197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r2,#kJitSelfVerification @ ask for self verification 1015297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao str r2,[rGLUE,#offGlue_jitState] 1015330f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng mov r2,#kInterpEntryInstr @ normal entry reason 1015430f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng str r2,[rGLUE,#offGlue_entryPoint] 1015597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r1,#1 @ set changeInterp 1015697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao b common_gotoBail 1015797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 1015897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao1: @ exit to interpreter without check 1015997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao EXPORT_PC() 1016097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao adrl rIBASE, dvmAsmInstructionStart 1016197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao FETCH_INST() 1016297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao GET_INST_OPCODE(ip) 1016397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao GOTO_OPCODE(ip) 1016497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 1016597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 10166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 10168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backward branch is taken. 10170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10171c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * TODO: we could avoid a branch by just setting r0 and falling through 10172c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * into the common_periodicChecks code, and having a test on r0 at the 10173c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * end determine if we should return to the caller or update & branch to 10174c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * the next instr. 10175c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 is PC adjustment *in bytes* 10178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch: 10180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #kInterpEntryInstr 10181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_periodicChecks 10182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 10183ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 10184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 10185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10186ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 10187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) 10188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) 10189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 10190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 10191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Need to see if the thread needs to be suspended or debugger/profiler 10198c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * activity has begun. If so, we suspend the thread or side-exit to 10199c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * the debug interpreter as appropriate. 10200c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10201c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * The common case is no activity on any of these, so we want to figure 10202c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * that out quickly. If something is up, we can then sort out what. 10203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10204c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * We want to be fast if the VM was built without debugger or profiler 10205c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * support, but we also need to recognize that the system is usually 10206c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * shipped with both of these enabled. 10207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: reduce this so we're just checking a single location. 10209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10211c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * r0 is reentry type, e.g. kInterpEntryInstr (for debugger/profiling) 10212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 is trampoline PC adjustment *in bytes* 10213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks: 10215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_pSelfSuspendCount] @ r3<- &suspendCount 10216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) 10218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [rGLUE, #offGlue_pDebuggerActive] @ r1<- &debuggerActive 10219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER) 10221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rGLUE, #offGlue_pActiveProfilers] @ r2<- &activeProfilers 10222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10224c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr ip, [r3] @ ip<- suspendCount (int) 10225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10226c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#if defined(WITH_DEBUGGER) && defined(WITH_PROFILER) 10227c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden cmp r1, #0 @ debugger enabled? 10228c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldrneb r1, [r1] @ yes, r1<- debuggerActive (boolean) 10229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2] @ r2<- activeProfilers (int) 10230c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden orrne ip, ip, r1 @ ip<- suspendCount | debuggerActive 10231c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden orrs ip, ip, r2 @ ip<- suspend|debugger|profiler; set Z 10232c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#elif defined(WITH_DEBUGGER) 10233c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden cmp r1, #0 @ debugger enabled? 10234c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldrneb r1, [r1] @ yes, r1<- debuggerActive (boolean) 10235c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden orrsne ip, ip, r1 @ yes, ip<- suspend | debugger; set Z 10236c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden @ (if not enabled, Z was set by test for r1==0, which is what we want) 10237c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#elif defined (WITH_PROFILER) 10238c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr r2, [r2] @ r2<- activeProfilers (int) 10239c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden orrs ip, ip, r2 @ ip<- suspendCount | activeProfilers 10240c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#else 10241c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden cmp ip, #0 @ not ORing anything in; set Z 10242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10244c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden bxeq lr @ all zero, return 10245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10246c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden /* 10247c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * One or more interesting events have happened. Figure out what. 10248c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10249c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * If debugging or profiling are compiled in, we need to disambiguate. 10250c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10251c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * r0 still holds the reentry type. 10252c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden */ 10253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER) 10254c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr ip, [r3] @ ip<- suspendCount (int) 10255c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden cmp ip, #0 @ want suspend? 10256c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden beq 1f @ no, must be debugger/profiler 10257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10259c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden stmfd sp!, {r0, lr} @ preserve r0 and lr 10260964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT) 10261964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee /* 10262964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee * Refresh the Jit's cached copy of profile table pointer. This pointer 10263964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee * doubles as the Jit's on/off switch. 10264964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee */ 10265d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r3, [rGLUE, #offGlue_ppJitProfTable] @ r3<-&gDvmJit.pJitProfTable 10266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 10267d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng ldr r3, [r3] @ r3 <- pJitProfTable 1026899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project EXPORT_PC() @ need for precise GC 10269964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee str r3, [rGLUE, #offGlue_pJitProfTable] @ refresh Jit's on/off switch 10270964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#else 10271964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r0, [rGLUE, #offGlue_self] @ r0<- glue->self 10272964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee EXPORT_PC() @ need for precise GC 10273964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif 10274c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden bl dvmCheckSuspendPending @ do full check, suspend if necessary 10275c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldmfd sp!, {r0, lr} @ restore r0 and lr 10276c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden 10277c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER) 10278c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden 10279c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden /* 10280c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * Reload the debugger/profiler enable flags. We're checking to see 10281c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * if either of these got set while we were suspended. 10282c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * 10283c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * We can't really avoid the #ifdefs here, because the fields don't 10284c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * exist when the feature is disabled. 10285c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden */ 10286c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#if defined(WITH_DEBUGGER) 10287c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr r1, [rGLUE, #offGlue_pDebuggerActive] @ r1<- &debuggerActive 10288c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden cmp r1, #0 @ debugger enabled? 10289c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldrneb r1, [r1] @ yes, r1<- debuggerActive (boolean) 10290c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#else 10291c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden mov r1, #0 10292c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#endif 10293c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#if defined(WITH_PROFILER) 10294c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr r2, [rGLUE, #offGlue_pActiveProfilers] @ r2<- &activeProfilers 10295c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden ldr r2, [r2] @ r2<- activeProfilers (int) 10296c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#else 10297c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden mov r2, #0 10298c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#endif 10299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10300c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden orrs r1, r1, r2 10301c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden beq 2f 10302c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden 10303c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden1: @ debugger/profiler enabled, bail out; glue->entryPoint was set above 10304c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden str r0, [rGLUE, #offGlue_entryPoint] @ store r0, need for debug/prof 10305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add rPC, rPC, r9 @ update rPC 10306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #1 @ "want switch" = true 10307c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden b common_gotoBail @ side exit 10308c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden 10309c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#endif /*WITH_DEBUGGER || WITH_PROFILER*/ 10310c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden 10311c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden2: 10312c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden bx lr @ nothing to do, return 10313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The equivalent of "goto bail", this calls through the "bail handler". 10317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * State registers will be saved to the "glue" area before bailing. 10319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 is "bool changeInterp", indicating if we want to switch to the 10322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * other interpreter or just bail all the way out 10323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail: 10325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_FP_TO_GLUE() @ export state to "glue" 10326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rGLUE @ r0<- glue ptr 10327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b dvmMterpStdBail @ call(glue, changeInterp) 10328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @add r1, r1, #1 @ using (boolean+1) 10330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @add r0, rGLUE, #offGlue_jmpBuf @ r0<- &glue->jmpBuf 10331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl _longjmp @ does not return 10332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @bl common_abort 10333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation with range. 10337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 is "Method* methodToCall", the method we're trying to call 10340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodRange: 10342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewRange: 10343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ prepare to copy args to "outs" area of current frame 10344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r2, rINST, lsr #8 @ r2<- AA (arg count) -- test for zero 10345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r10, rFP) @ r10<- stack save area 10346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .LinvokeArgsDone @ if no args, skip the rest 10347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- CCCC 10348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=methodToCall, r1=CCCC, r2=count, r10=outs 10350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ (very few methods have > 10 args; could unroll for common cases) 10351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r3, rFP, r1, lsl #2 @ r3<- &fp[CCCC] 10352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r10, r10, r2, lsl #2 @ r10<- "outs" area, for call args 10353642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r9, [r0, #offMethod_registersSize] @ r9<- methodToCall->regsSize 10354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: ldr r1, [r3], #4 @ val = *fp++ 10355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r2, r2, #1 @ count-- 10356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r10], #4 @ *outs++ = val 10357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1b @ ...while count != 0 10358642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r3, [r0, #offMethod_outsSize] @ r3<- methodToCall->outsSize 10359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .LinvokeArgsDone 10360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation without range. 10363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 is "Method* methodToCall", the method we're trying to call 10366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodNoRange: 10368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewNoRange: 10369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ prepare to copy args to "outs" area of current frame 10370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r2, rINST, lsr #12 @ r2<- B (arg count) -- test for zero 10371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r10, rFP) @ r10<- stack save area 10372642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng FETCH(r1, 2) @ r1<- GFED (load here to hide latency) 10373642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r9, [r0, #offMethod_registersSize] @ r9<- methodToCall->regsSize 10374642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r3, [r0, #offMethod_outsSize] @ r3<- methodToCall->outsSize 10375642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng beq .LinvokeArgsDone 10376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10377642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng @ r0=methodToCall, r1=GFED, r3=outSize, r2=count, r9=regSize, r10=outs 10378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNonRange: 10379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r2, r2, #5 @ r2<- 5-r2 10380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add pc, pc, r2, lsl #4 @ computed goto, 4 instrs each 10381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort @ (skipped due to ARM prefetch) 10382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project5: and ip, rINST, #0x0f00 @ isolate A 10383642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsr #6] @ r2<- vA (shift right 8, left 2) 10384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10385642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vA 10386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4: and ip, r1, #0xf000 @ isolate G 10387642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsr #10] @ r2<- vG (shift right 12, left 2) 10388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10389642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vG 10390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3: and ip, r1, #0x0f00 @ isolate F 10391642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsr #6] @ r2<- vF 10392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10393642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vF 10394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: and ip, r1, #0x00f0 @ isolate E 10395642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsr #2] @ r2<- vE 10396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10397642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vE 10398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and ip, r1, #0x000f @ isolate D 10399642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rFP, ip, lsl #2] @ r2<- vD 10400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r0 @ nop 10401642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [r10, #-4]! @ *--outs = vD 10402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: @ fall through to .LinvokeArgsDone 10403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10404642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng.LinvokeArgsDone: @ r0=methodToCall, r3=outSize, r9=regSize 10405642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [r0, #offMethod_insns] @ r2<- method->insns 10406642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr rINST, [r0, #offMethod_clazz] @ rINST<- method->clazz 10407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ find space for the new stack frame, check for overflow 10408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r1, rFP) @ r1<- stack save area 10409642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng sub r1, r1, r9, lsl #2 @ r1<- newFp (old savearea - regsSize) 10410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r10, r1) @ r10<- newSaveArea 10411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@ bl common_dumpRegs 10412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [rGLUE, #offGlue_interpStackEnd] @ r9<- interpStackEnd 10413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r3, r10, r3, lsl #2 @ r3<- bottom (newsave - outsSize) 10414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r3, r9 @ bottom < interpStackEnd? 10415642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags 104167a44e4ee0782d24b4c6090be1f0a3c66f971f2c1Andy McFadden blo .LstackOverflow @ yes, this frame will overflow stack 10417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ set up newSaveArea 10419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB 10420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(ip, rFP) @ ip<- stack save area 10421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str ip, [r10, #offStackSaveArea_prevSave] 10422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rFP, [r10, #offStackSaveArea_prevFrame] 10424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rPC, [r10, #offStackSaveArea_savedPc] 10425ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 10426ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r9, #0 10427ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r9, [r10, #offStackSaveArea_returnAddr] 10428ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [r10, #offStackSaveArea_method] 10430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project tst r3, #ACC_NATIVE 10431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .LinvokeNative 10432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0-r3} 10435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_printNewline 10436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rFP 10437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmDumpFp 10439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0-r3} 10440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0-r3} 10441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r1 10442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 10443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmDumpFp 10444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_printNewline 10445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0-r3} 10446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10448642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrh r9, [r2] @ r9 <- load INST from new PC 10449642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex 10450642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng mov rPC, r2 @ publish new rPC 10451642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r2, [rGLUE, #offGlue_self] @ r2<- glue->self 10452642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng 10453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Update "glue" values for the new method 10454642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng @ r0=methodToCall, r1=newFp, r2=self, r3=newMethodClass, r9=newINST 10455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [rGLUE, #offGlue_method] @ glue->method = methodToCall 10456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ... 10457ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 10458ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 10459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov rFP, r1 @ fp = newFp 10460642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng GET_PREFETCHED_OPCODE(ip, r9) @ extract prefetched opcode from r9 10461642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng mov rINST, r9 @ publish new rINST 10462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r2, #offThread_curFrame] @ self->curFrame = newFp 10463ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10464ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 10465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10466ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 10467ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rFP, r1 @ fp = newFp 10468ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_PREFETCHED_OPCODE(ip, r9) @ extract prefetched opcode from r9 10469ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rINST, r9 @ publish new rINST 10470ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r1, [r2, #offThread_curFrame] @ self->curFrame = newFp 10471ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 10472ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNative: 10475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ Prep for the native call 10476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=methodToCall, r1=newFp, r10=newSaveArea 10477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rGLUE, #offGlue_self] @ r3<- glue->self 10478d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden ldr r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->... 10479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [r3, #offThread_curFrame] @ self->curFrame = newFp 10480d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden str r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top 10481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r3 @ r9<- glue->self (preserve) 10482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r0 @ r2<- methodToCall 10484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r1 @ r0<- newFp (points to args) 10485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r1, rGLUE, #offGlue_retval @ r1<- &retval 10486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER 10488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* insert fake function header to help gdb find the stack frame */ 10489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .Lskip 10490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .type dalvik_mterp, %function 10491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_mterp: 10492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnstart 10493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY1 10494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MTERP_ENTRY2 10495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lskip: 10496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @mov lr, pc @ set return addr 10499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ldr pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc 10500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LDR_PC_LR "[r2, #offMethod_nativeFunc]" 10501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10502964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT) 10503964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r3, [rGLUE, #offGlue_ppJitProfTable] @ Refresh Jit's on/off status 10504964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif 10505964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee 10506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ native return; r9=self, r10=newSaveArea 10507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ equivalent to dvmPopJniLocals 10508d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden ldr r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top 10509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r9, #offThread_exception] @ check for exception 10510964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT) 10511964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r3, [r3] @ r3 <- gDvmJit.pProfTable 10512964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif 10513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rFP, [r9, #offThread_curFrame] @ self->curFrame = fp 10514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null? 10515d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden str r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top 10516964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT) 10517964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee str r3, [rGLUE, #offGlue_pJitProfTable] @ refresh cached on/off switch 10518964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif 10519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne common_exceptionThrown @ no, handle exception 10520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 10522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 105256ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow: @ r0=methodToCall 105266ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden mov r1, r0 @ r1<- methodToCall 10527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_self] @ r0<- self 10528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmHandleStackOverflow 10529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER 10531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .fnend 10532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation, calling through "glue code". 10537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: now that we have range and non-range invoke handlers, this 10539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * needs to be split into two. Maybe just create entry points 10540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that set r9 and jump here? 10541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 10543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 is "Method* methodToCall", the method we're trying to call 10544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 is "bool methodCallRange", indicating if this is a /range variant 10545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 10547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeOld: 10548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub sp, sp, #8 @ space for args + pad 10549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(ip, 2) @ ip<- FEDC or CCCC 10550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r0 @ A2<- methodToCall 10551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rGLUE @ A0<- glue 10552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_FP_TO_GLUE() @ export state to "glue" 10553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r9 @ A1<- methodCallRange 10554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ A3<- AA 10555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str ip, [sp, #0] @ A4<- ip 10556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterp_invokeMethod @ call the C invokeMethod 10557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #8 @ remove arg area 10558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_resumeAfterGlueCall @ continue to next instruction 10559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 10560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction. 10565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return. 10567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod: 10569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnNew: 10570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #kInterpEntryReturn 10571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #0 10572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_periodicChecks 10573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r0, rFP) @ r0<- saveArea (old) 10575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame 10576642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc 10577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)] 10578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r2<- method we're returning to 10579642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r3, [rGLUE, #offGlue_self] @ r3<- glue->self 10580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r2, #0 @ is this a break frame? 10581642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldrne r10, [r2, #offMethod_clazz] @ r10<- method->clazz 10582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 @ "want switch" = false 10583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_gotoBail @ break frame, bail out completely 10584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10585642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST 10586642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng str r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method 10587642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng ldr r1, [r10, #offClassObject_pDvmDex] @ r1<- method->clazz->pDvmDex 10588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rFP, [r3, #offThread_curFrame] @ self->curFrame = fp 10589ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 105907a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr 10591ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 10592ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rPC, r9 @ publish new rPC 10593ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r1, [rGLUE, #offGlue_methodClassDex] 105947a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r10, [r3, #offThread_inJitCodeCache] @ may return to JIT'ed land 105957a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng cmp r10, #0 @ caller is compiled code 105967a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng blxne r10 10597ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 10598ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 10599ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 10600ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 10601ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 10602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10603642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng mov rPC, r9 @ publish new rPC 10604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [rGLUE, #offGlue_methodClassDex] 10605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10606ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 10607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return handling, calls through "glue code". 10610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 10612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnOld: 10613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_FP_TO_GLUE() @ export state 10614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rGLUE @ arg to function 10615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterp_returnFromMethod 10616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_resumeAfterGlueCall 10617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 10618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception. Handle it. 10622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling 10624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction 10625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be. 10626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return. 10628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10629ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmMterpCommonExceptionThrown 10630ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmMterpCommonExceptionThrown: 10631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown: 10632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionNew: 10633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #kInterpEntryThrow 10634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, #0 10635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_periodicChecks 10636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r10, [rGLUE, #offGlue_self] @ r10<- glue->self 10638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, [r10, #offThread_exception] @ r9<- self->exception 10639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- self 10640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- exception 10641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAddTrackedAlloc @ don't let the exception be GCed 10642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, #0 @ r3<- NULL 10643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r10, #offThread_exception] @ self->exception = NULL 10644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* set up args and a local for "&fp" */ 10646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* (str sp, [sp, #-4]! would be perfect here, but is discouraged) */ 10647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str rFP, [sp, #-4]! @ *--sp = fp 10648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov ip, sp @ ip<- &fp 10649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, #0 @ r3<- false 10650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str ip, [sp, #-4]! @ *--sp = &fp 10651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [rGLUE, #offGlue_method] @ r1<- glue->method 10652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r10 @ r0<- self 10653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offMethod_insns] @ r1<- method->insns 10654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r9 @ r2<- exception 10655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r1, rPC, r1 @ r1<- pc - method->insns 10656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, asr #1 @ r1<- offset in code units 10657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* call, r0 gets catchRelPc (a code-unit offset) */ 10659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmFindCatchBlock @ call(self, relPc, exc, scan?, &fp) 10660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fix earlier stack overflow if necessary; may trash rFP */ 10662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r1, [r10, #offThread_stackOverflowed] 10663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ did we overflow earlier? 10664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq 1f @ no, skip ahead 10665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov rFP, r0 @ save relPc result in rFP 10666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r10 @ r0<- self 106674fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden mov r1, r9 @ r1<- exception 10668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmCleanupStackOverflow @ call(self) 10669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rFP @ restore result 10670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: 10671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* update frame pointer and check result from dvmFindCatchBlock */ 10673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr rFP, [sp, #4] @ retrieve the updated rFP 10674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ is catchRelPc < 0? 10675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #8 @ restore stack 10676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi .LnotCaughtLocally 10677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* adjust locals to match self->curFrame and updated PC */ 10679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVEAREA_FROM_FP(r1, rFP) @ r1<- new save area 10680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offStackSaveArea_method] @ r1<- new method 10681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r1, [rGLUE, #offGlue_method] @ glue->method = new method 10682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r1, #offMethod_clazz] @ r2<- method->clazz 10683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offMethod_insns] @ r3<- method->insns 10684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex 10685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add rPC, r3, r0, asl #1 @ rPC<- method->insns + catchRelPc 10686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r2, [rGLUE, #offGlue_methodClassDex] @ glue->pDvmDex = meth... 10687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* release the tracked alloc on the exception */ 10689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- exception 10690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- self 10691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmReleaseTrackedAlloc @ release the exception 10692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* restore the exception if the handler wants it */ 10694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST() @ load rINST from rPC 10695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp ip, #OP_MOVE_EXCEPTION @ is it "move-exception"? 10697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project streq r9, [r10, #offThread_exception] @ yes, restore the exception 10698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LnotCaughtLocally: @ r9=exception, r10=self 10701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fix stack overflow if necessary */ 10702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldrb r1, [r10, #offThread_stackOverflowed] 10703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ did we overflow earlier? 10704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movne r0, r10 @ if yes: r0<- self 107054fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden movne r1, r9 @ if yes: r1<- exception 10706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project blne dvmCleanupStackOverflow @ if yes: call(self) 10707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ may want to show "not caught locally" debug messages here 10709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if DVM_SHOW_EXCEPTION >= 2 10710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* call __android_log_print(prio, tag, format, ...) */ 10711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* "Exception %s from %s:%d not caught locally" */ 10712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ dvmLineNumFromPC(method, pc - method->insns) 10713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] 10714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r0, #offMethod_insns] 10715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r1, rPC, r1 10716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project asr r1, r1, #1 10717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmLineNumFromPC 10718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [sp, #-4]! 10719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ dvmGetMethodSourceFile(method) 10720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rGLUE, #offGlue_method] 10721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmGetMethodSourceFile 10722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r0, [sp, #-4]! 10723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ exception->clazz->descriptor 10724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r9, #offObject_clazz] 10725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offClassObject_descriptor] 10726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ 10727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, strExceptionNotCaughtLocally 10728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, strLogTag 10729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, #3 @ LOG_DEBUG 10730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl __android_log_print 10731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 10732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r9, [r10, #offThread_exception] @ restore exception 10733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, r9 @ r0<- exception 10734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- self 10735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmReleaseTrackedAlloc @ release the exception 10736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 @ "want switch" = false 10737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_gotoBail @ bail out 10738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Exception handling, calls through "glue code". 10742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 10744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionOld: 10745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SAVE_PC_FP_TO_GLUE() @ export state 10746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rGLUE @ arg to function 10747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterp_exceptionThrown 10748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_resumeAfterGlueCall 10749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 10750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated 10754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values and start executing at the next instruction. 10755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_resumeAfterGlueCall: 10757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOAD_PC_FP_FROM_GLUE() @ pull rPC and rFP out of glue 10758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST() @ load rINST from rPC 10759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 10760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 10761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array index. 10764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex: 10766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strArrayIndexException 10768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value. 10774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore: 10776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strArrayStoreException 10778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero. 10784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero: 10786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strArithmeticException 10788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, strDivideByZero 10789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size. 10794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize: 10796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strNegativeArraySizeException 10798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invocation of a non-existent method. 10804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod: 10806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strNoSuchMethodError 10808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We encountered a null object when we weren't expecting one. We 10814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * export the PC, throw a NullPointerException, and goto the exception 10815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * processing code. 10816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject: 10818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() 10819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strNullPointerException 10820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #0 10821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmThrowException 10822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 10823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For debugging, cause an immediate fault. The source address will 10826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be in lr (use a bl instruction to jump here). 10827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort: 10829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr pc, .LdeadFood 10830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LdeadFood: 10831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word 0xdeadf00d 10832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out a "we were here", preserving all registers. (The attempt 10835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to save ip won't work, but we need to save an even number of 10836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers for EABI 64-bit stack alignment.) 10837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .macro SQUEAK num 10839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_squeak\num: 10840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strSqueak 10842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, #\num 10843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endm 10847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 0 10849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 1 10850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 2 10851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 3 10852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 4 10853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SQUEAK 5 10854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out the number in r0, preserving registers. 10857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNum: 10859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0 10861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strSqueak 10862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a newline, preserving registers. 10868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNewline: 10870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strNewline 10872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 10877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 32-bit quantity in r0 as a hex value, preserving registers. 10878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printHex: 10880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r0 10882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strPrintHex 10883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 64-bit quantity in r0-r1, preserving registers. 10889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printLong: 10891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r1 10893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, r0 10894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, strPrintLong 10895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl printf 10896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print full method info. Pass the Method* in r0. Preserves regs. 10901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printMethod: 10903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterpPrintMethod 10905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Call a C helper function that dumps regs and possibly some 10910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * additional info. Requires the C function to be compiled in. 10911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if 0 10913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_dumpRegs: 10914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stmfd sp!, {r0, r1, r2, r3, ip, lr} 10915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmMterpDumpArmRegs 10916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldmfd sp!, {r0, r1, r2, r3, ip, lr} 10917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bx lr 10918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 10919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10920d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#if 0 10921d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden/* 10922d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Experiment on VFP mode. 10923d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * 10924d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * uint32_t setFPSCR(uint32_t val, uint32_t mask) 10925d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * 10926d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Updates the bits specified by "mask", setting them to the values in "val". 10927d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden */ 10928d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddensetFPSCR: 10929d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden and r0, r0, r1 @ make sure no stray bits are set 10930d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden fmrx r2, fpscr @ get VFP reg 10931d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden mvn r1, r1 @ bit-invert mask 10932d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden and r2, r2, r1 @ clear masked bits 10933d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden orr r2, r2, r0 @ set specified bits 10934d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden fmxr fpscr, r2 @ set VFP reg 10935d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden mov r0, r2 @ return new value 10936d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden bx lr 10937d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden 10938d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden .align 2 10939d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden .global dvmConfigureFP 10940d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden .type dvmConfigureFP, %function 10941d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddendvmConfigureFP: 10942d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden stmfd sp!, {ip, lr} 10943d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden /* 0x03000000 sets DN/FZ */ 10944d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden /* 0x00009f00 clears the six exception enable flags */ 10945d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden bl common_squeak0 10946d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden mov r0, #0x03000000 @ r0<- 0x03000000 10947d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden add r1, r0, #0x9f00 @ r1<- 0x03009f00 10948d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden bl setFPSCR 10949d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden ldmfd sp!, {ip, pc} 10950d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#endif 10951d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden 10952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references, must be close to the code that uses them. 10955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .align 2 10957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArithmeticException: 10958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrArithmeticException 10959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayIndexException: 10960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrArrayIndexException 10961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayStoreException: 10962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrArrayStoreException 10963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrDivideByZero: 10964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrDivideByZero 10965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNegativeArraySizeException: 10966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrNegativeArraySizeException 10967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNoSuchMethodError: 10968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrNoSuchMethodError 10969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNullPointerException: 10970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrNullPointerException 10971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrLogTag: 10973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrLogTag 10974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrExceptionNotCaughtLocally: 10975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrExceptionNotCaughtLocally 10976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNewline: 10978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrNewline 10979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrSqueak: 10980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrSqueak 10981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintHex: 10982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrPrintHex 10983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintLong: 10984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrPrintLong 10985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 10987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Zero-terminated ASCII string data. 10988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On ARM we have two choices: do like gcc does, and LDR from a .word 10990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the address, or use an ADR pseudo-op to get the address 10991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * directly. ADR saves 4 bytes and an indirection, but it's using a 10992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PC-relative addressing mode and hence has a limited range, which 10993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * makes it not work well with mergeable string sections. 10994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .section .rodata.str1.4,"aMS",%progbits,1 10996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint: 10998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Bad entry point %d\n" 10999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException: 11000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArithmeticException;" 11001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException: 11002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArrayIndexOutOfBoundsException;" 11003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException: 11004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ArrayStoreException;" 11005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException: 11006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/ClassCastException;" 11007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero: 11008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "divide by zero" 11009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl: 11010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "filled-new-array only implemented for objects and 'int'" 11011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError: 11012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/InternalError;" 11013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError: 11014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/InstantiationError;" 11015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException: 11016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NegativeArraySizeException;" 11017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError: 11018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NoSuchMethodError;" 11019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException: 11020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Ljava/lang/NullPointerException;" 11021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrLogTag: 11023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "mterp" 11024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrExceptionNotCaughtLocally: 11025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "Exception %s from %s:%d not caught locally\n" 11026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNewline: 11028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "\n" 11029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrSqueak: 11030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "<%d>" 11031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintHex: 11032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "<0x%x>" 11033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintLong: 11034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .asciz "<%lld>" 11035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11036