1/* 2 * This file was generated automatically by gen-mterp.py for 'arm'. 3 * 4 * --> DO NOT EDIT <-- 5 */ 6 7/* File: arm/header.S */ 8/* 9 * Copyright (C) 2016 The Android Open Source Project 10 * 11 * Licensed under the Apache License, Version 2.0 (the "License"); 12 * you may not use this file except in compliance with the License. 13 * You may obtain a copy of the License at 14 * 15 * http://www.apache.org/licenses/LICENSE-2.0 16 * 17 * Unless required by applicable law or agreed to in writing, software 18 * distributed under the License is distributed on an "AS IS" BASIS, 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20 * See the License for the specific language governing permissions and 21 * limitations under the License. 22 */ 23 24/* 25 Art assembly interpreter notes: 26 27 First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't 28 handle invoke, allows higher-level code to create frame & shadow frame. 29 30 Once that's working, support direct entry code & eliminate shadow frame (and 31 excess locals allocation. 32 33 Some (hopefully) temporary ugliness. We'll treat rFP as pointing to the 34 base of the vreg array within the shadow frame. Access the other fields, 35 dex_pc_, method_ and number_of_vregs_ via negative offsets. For now, we'll continue 36 the shadow frame mechanism of double-storing object references - via rFP & 37 number_of_vregs_. 38 39 */ 40 41/* 42ARM EABI general notes: 43 44r0-r3 hold first 4 args to a method; they are not preserved across method calls 45r4-r8 are available for general use 46r9 is given special treatment in some situations, but not for us 47r10 (sl) seems to be generally available 48r11 (fp) is used by gcc (unless -fomit-frame-pointer is set) 49r12 (ip) is scratch -- not preserved across method calls 50r13 (sp) should be managed carefully in case a signal arrives 51r14 (lr) must be preserved 52r15 (pc) can be tinkered with directly 53 54r0 holds returns of <= 4 bytes 55r0-r1 hold returns of 8 bytes, low word in r0 56 57Callee must save/restore r4+ (except r12) if it modifies them. If VFP 58is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved, 59s0-s15 (d0-d7, q0-a3) do not need to be. 60 61Stack is "full descending". Only the arguments that don't fit in the first 4 62registers are placed on the stack. "sp" points at the first stacked argument 63(i.e. the 5th arg). 64 65VFP: single-precision results in s0, double-precision results in d0. 66 67In the EABI, "sp" must be 64-bit aligned on entry to a function, and any 6864-bit quantities (long long, double) must be 64-bit aligned. 69*/ 70 71/* 72Mterp and ARM notes: 73 74The following registers have fixed assignments: 75 76 reg nick purpose 77 r4 rPC interpreted program counter, used for fetching instructions 78 r5 rFP interpreted frame pointer, used for accessing locals and args 79 r6 rSELF self (Thread) pointer 80 r7 rINST first 16-bit code unit of current instruction 81 r8 rIBASE interpreted instruction base pointer, used for computed goto 82 r10 rPROFILE branch profiling countdown 83 r11 rREFS base of object references in shadow frame (ideally, we'll get rid of this later). 84 85Macros are provided for common operations. Each macro MUST emit only 86one instruction to make instruction-counting easier. They MUST NOT alter 87unspecified registers or condition codes. 88*/ 89 90/* 91 * This is a #include, not a %include, because we want the C pre-processor 92 * to expand the macros into assembler assignment statements. 93 */ 94#include "asm_support.h" 95 96#define MTERP_PROFILE_BRANCHES 1 97#define MTERP_LOGGING 0 98 99/* During bringup, we'll use the shadow frame model instead of rFP */ 100/* single-purpose registers, given names for clarity */ 101#define rPC r4 102#define rFP r5 103#define rSELF r6 104#define rINST r7 105#define rIBASE r8 106#define rPROFILE r10 107#define rREFS r11 108 109/* 110 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So, 111 * to access other shadow frame fields, we need to use a backwards offset. Define those here. 112 */ 113#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET) 114#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET) 115#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET) 116#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET) 117#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET) 118#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET) 119#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET) 120#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET) 121#define OFF_FP_SHADOWFRAME OFF_FP(0) 122 123/* 124 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must 125 * be done *before* something throws. 126 * 127 * It's okay to do this more than once. 128 * 129 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped 130 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction 131 * offset into the code_items_[] array. For effiency, we will "export" the 132 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC 133 * to convert to a dex pc when needed. 134 */ 135.macro EXPORT_PC 136 str rPC, [rFP, #OFF_FP_DEX_PC_PTR] 137.endm 138 139.macro EXPORT_DEX_PC tmp 140 ldr \tmp, [rFP, #OFF_FP_CODE_ITEM] 141 str rPC, [rFP, #OFF_FP_DEX_PC_PTR] 142 add \tmp, #CODEITEM_INSNS_OFFSET 143 sub \tmp, rPC, \tmp 144 asr \tmp, #1 145 str \tmp, [rFP, #OFF_FP_DEX_PC] 146.endm 147 148/* 149 * Fetch the next instruction from rPC into rINST. Does not advance rPC. 150 */ 151.macro FETCH_INST 152 ldrh rINST, [rPC] 153.endm 154 155/* 156 * Fetch the next instruction from the specified offset. Advances rPC 157 * to point to the next instruction. "_count" is in 16-bit code units. 158 * 159 * Because of the limited size of immediate constants on ARM, this is only 160 * suitable for small forward movements (i.e. don't try to implement "goto" 161 * with this). 162 * 163 * This must come AFTER anything that can throw an exception, or the 164 * exception catch may miss. (This also implies that it must come after 165 * EXPORT_PC.) 166 */ 167.macro FETCH_ADVANCE_INST count 168 ldrh rINST, [rPC, #((\count)*2)]! 169.endm 170 171/* 172 * The operation performed here is similar to FETCH_ADVANCE_INST, except the 173 * src and dest registers are parameterized (not hard-wired to rPC and rINST). 174 */ 175.macro PREFETCH_ADVANCE_INST dreg, sreg, count 176 ldrh \dreg, [\sreg, #((\count)*2)]! 177.endm 178 179/* 180 * Similar to FETCH_ADVANCE_INST, but does not update rPC. Used to load 181 * rINST ahead of possible exception point. Be sure to manually advance rPC 182 * later. 183 */ 184.macro PREFETCH_INST count 185 ldrh rINST, [rPC, #((\count)*2)] 186.endm 187 188/* Advance rPC by some number of code units. */ 189.macro ADVANCE count 190 add rPC, #((\count)*2) 191.endm 192 193/* 194 * Fetch the next instruction from an offset specified by _reg. Updates 195 * rPC to point to the next instruction. "_reg" must specify the distance 196 * in bytes, *not* 16-bit code units, and may be a signed value. 197 * 198 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the 199 * bits that hold the shift distance are used for the half/byte/sign flags. 200 * In some cases we can pre-double _reg for free, so we require a byte offset 201 * here. 202 */ 203.macro FETCH_ADVANCE_INST_RB reg 204 ldrh rINST, [rPC, \reg]! 205.endm 206 207/* 208 * Fetch a half-word code unit from an offset past the current PC. The 209 * "_count" value is in 16-bit code units. Does not advance rPC. 210 * 211 * The "_S" variant works the same but treats the value as signed. 212 */ 213.macro FETCH reg, count 214 ldrh \reg, [rPC, #((\count)*2)] 215.endm 216 217.macro FETCH_S reg, count 218 ldrsh \reg, [rPC, #((\count)*2)] 219.endm 220 221/* 222 * Fetch one byte from an offset past the current PC. Pass in the same 223 * "_count" as you would for FETCH, and an additional 0/1 indicating which 224 * byte of the halfword you want (lo/hi). 225 */ 226.macro FETCH_B reg, count, byte 227 ldrb \reg, [rPC, #((\count)*2+(\byte))] 228.endm 229 230/* 231 * Put the instruction's opcode field into the specified register. 232 */ 233.macro GET_INST_OPCODE reg 234 and \reg, rINST, #255 235.endm 236 237/* 238 * Put the prefetched instruction's opcode field into the specified register. 239 */ 240.macro GET_PREFETCHED_OPCODE oreg, ireg 241 and \oreg, \ireg, #255 242.endm 243 244/* 245 * Begin executing the opcode in _reg. Because this only jumps within the 246 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork. 247 */ 248.macro GOTO_OPCODE reg 249 add pc, rIBASE, \reg, lsl #7 250.endm 251.macro GOTO_OPCODE_BASE base,reg 252 add pc, \base, \reg, lsl #7 253.endm 254 255/* 256 * Get/set the 32-bit value from a Dalvik register. 257 */ 258.macro GET_VREG reg, vreg 259 ldr \reg, [rFP, \vreg, lsl #2] 260.endm 261.macro SET_VREG reg, vreg 262 str \reg, [rFP, \vreg, lsl #2] 263 mov \reg, #0 264 str \reg, [rREFS, \vreg, lsl #2] 265.endm 266.macro SET_VREG_OBJECT reg, vreg, tmpreg 267 str \reg, [rFP, \vreg, lsl #2] 268 str \reg, [rREFS, \vreg, lsl #2] 269.endm 270.macro SET_VREG_SHADOW reg, vreg 271 str \reg, [rREFS, \vreg, lsl #2] 272.endm 273 274/* 275 * Clear the corresponding shadow regs for a vreg pair 276 */ 277.macro CLEAR_SHADOW_PAIR vreg, tmp1, tmp2 278 mov \tmp1, #0 279 add \tmp2, \vreg, #1 280 SET_VREG_SHADOW \tmp1, \vreg 281 SET_VREG_SHADOW \tmp1, \tmp2 282.endm 283 284/* 285 * Convert a virtual register index into an address. 286 */ 287.macro VREG_INDEX_TO_ADDR reg, vreg 288 add \reg, rFP, \vreg, lsl #2 /* WARNING/FIXME: handle shadow frame vreg zero if store */ 289.endm 290 291/* 292 * Refresh handler table. 293 */ 294.macro REFRESH_IBASE 295 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] 296.endm 297 298/* File: arm/entry.S */ 299/* 300 * Copyright (C) 2016 The Android Open Source Project 301 * 302 * Licensed under the Apache License, Version 2.0 (the "License"); 303 * you may not use this file except in compliance with the License. 304 * You may obtain a copy of the License at 305 * 306 * http://www.apache.org/licenses/LICENSE-2.0 307 * 308 * Unless required by applicable law or agreed to in writing, software 309 * distributed under the License is distributed on an "AS IS" BASIS, 310 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 311 * See the License for the specific language governing permissions and 312 * limitations under the License. 313 */ 314/* 315 * Interpreter entry point. 316 */ 317 318 .text 319 .align 2 320 .global ExecuteMterpImpl 321 .type ExecuteMterpImpl, %function 322 323/* 324 * On entry: 325 * r0 Thread* self/ 326 * r1 code_item 327 * r2 ShadowFrame 328 * r3 JValue* result_register 329 * 330 */ 331 332ExecuteMterpImpl: 333 .fnstart 334 .save {r3-r10,fp,lr} 335 stmfd sp!, {r3-r10,fp,lr} @ save 10 regs, (r3 just to align 64) 336 337 /* Remember the return register */ 338 str r3, [r2, #SHADOWFRAME_RESULT_REGISTER_OFFSET] 339 340 /* Remember the code_item */ 341 str r1, [r2, #SHADOWFRAME_CODE_ITEM_OFFSET] 342 343 /* set up "named" registers */ 344 mov rSELF, r0 345 ldr r0, [r2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET] 346 add rFP, r2, #SHADOWFRAME_VREGS_OFFSET @ point to vregs. 347 VREG_INDEX_TO_ADDR rREFS, r0 @ point to reference array in shadow frame 348 ldr r0, [r2, #SHADOWFRAME_DEX_PC_OFFSET] @ Get starting dex_pc. 349 add rPC, r1, #CODEITEM_INSNS_OFFSET @ Point to base of insns[] 350 add rPC, rPC, r0, lsl #1 @ Create direct pointer to 1st dex opcode 351 EXPORT_PC 352 353 /* Starting ibase */ 354 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] 355 356 /* Set up for backwards branches & osr profiling */ 357 ldr r0, [rFP, #OFF_FP_METHOD] 358 add r1, rFP, #OFF_FP_SHADOWFRAME 359 bl MterpSetUpHotnessCountdown 360 mov rPROFILE, r0 @ Starting hotness countdown to rPROFILE 361 362 /* start executing the instruction at rPC */ 363 FETCH_INST @ load rINST from rPC 364 GET_INST_OPCODE ip @ extract opcode from rINST 365 GOTO_OPCODE ip @ jump to next instruction 366 /* NOTE: no fallthrough */ 367 368 369 .global artMterpAsmInstructionStart 370 .type artMterpAsmInstructionStart, %function 371artMterpAsmInstructionStart = .L_op_nop 372 .text 373 374/* ------------------------------ */ 375 .balign 128 376.L_op_nop: /* 0x00 */ 377/* File: arm/op_nop.S */ 378 FETCH_ADVANCE_INST 1 @ advance to next instr, load rINST 379 GET_INST_OPCODE ip @ ip<- opcode from rINST 380 GOTO_OPCODE ip @ execute it 381 382/* ------------------------------ */ 383 .balign 128 384.L_op_move: /* 0x01 */ 385/* File: arm/op_move.S */ 386 /* for move, move-object, long-to-int */ 387 /* op vA, vB */ 388 mov r1, rINST, lsr #12 @ r1<- B from 15:12 389 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 390 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 391 GET_VREG r2, r1 @ r2<- fp[B] 392 GET_INST_OPCODE ip @ ip<- opcode from rINST 393 .if 0 394 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2 395 .else 396 SET_VREG r2, r0 @ fp[A]<- r2 397 .endif 398 GOTO_OPCODE ip @ execute next instruction 399 400/* ------------------------------ */ 401 .balign 128 402.L_op_move_from16: /* 0x02 */ 403/* File: arm/op_move_from16.S */ 404 /* for: move/from16, move-object/from16 */ 405 /* op vAA, vBBBB */ 406 FETCH r1, 1 @ r1<- BBBB 407 mov r0, rINST, lsr #8 @ r0<- AA 408 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 409 GET_VREG r2, r1 @ r2<- fp[BBBB] 410 GET_INST_OPCODE ip @ extract opcode from rINST 411 .if 0 412 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2 413 .else 414 SET_VREG r2, r0 @ fp[AA]<- r2 415 .endif 416 GOTO_OPCODE ip @ jump to next instruction 417 418/* ------------------------------ */ 419 .balign 128 420.L_op_move_16: /* 0x03 */ 421/* File: arm/op_move_16.S */ 422 /* for: move/16, move-object/16 */ 423 /* op vAAAA, vBBBB */ 424 FETCH r1, 2 @ r1<- BBBB 425 FETCH r0, 1 @ r0<- AAAA 426 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST 427 GET_VREG r2, r1 @ r2<- fp[BBBB] 428 GET_INST_OPCODE ip @ extract opcode from rINST 429 .if 0 430 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2 431 .else 432 SET_VREG r2, r0 @ fp[AAAA]<- r2 433 .endif 434 GOTO_OPCODE ip @ jump to next instruction 435 436/* ------------------------------ */ 437 .balign 128 438.L_op_move_wide: /* 0x04 */ 439/* File: arm/op_move_wide.S */ 440 /* move-wide vA, vB */ 441 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 442 mov r3, rINST, lsr #12 @ r3<- B 443 ubfx rINST, rINST, #8, #4 @ rINST<- A 444 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] 445 VREG_INDEX_TO_ADDR r2, rINST @ r2<- &fp[A] 446 ldmia r3, {r0-r1} @ r0/r1<- fp[B] 447 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs 448 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 449 GET_INST_OPCODE ip @ extract opcode from rINST 450 stmia r2, {r0-r1} @ fp[A]<- r0/r1 451 GOTO_OPCODE ip @ jump to next instruction 452 453/* ------------------------------ */ 454 .balign 128 455.L_op_move_wide_from16: /* 0x05 */ 456/* File: arm/op_move_wide_from16.S */ 457 /* move-wide/from16 vAA, vBBBB */ 458 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 459 FETCH r3, 1 @ r3<- BBBB 460 mov rINST, rINST, lsr #8 @ rINST<- AA 461 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BBBB] 462 VREG_INDEX_TO_ADDR r2, rINST @ r2<- &fp[AA] 463 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB] 464 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs 465 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 466 GET_INST_OPCODE ip @ extract opcode from rINST 467 stmia r2, {r0-r1} @ fp[AA]<- r0/r1 468 GOTO_OPCODE ip @ jump to next instruction 469 470/* ------------------------------ */ 471 .balign 128 472.L_op_move_wide_16: /* 0x06 */ 473/* File: arm/op_move_wide_16.S */ 474 /* move-wide/16 vAAAA, vBBBB */ 475 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 476 FETCH r3, 2 @ r3<- BBBB 477 FETCH r2, 1 @ r2<- AAAA 478 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BBBB] 479 VREG_INDEX_TO_ADDR lr, r2 @ r2<- &fp[AAAA] 480 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB] 481 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST 482 CLEAR_SHADOW_PAIR r2, r3, ip @ Zero out the shadow regs 483 stmia lr, {r0-r1} @ fp[AAAA]<- r0/r1 484 GET_INST_OPCODE ip @ extract opcode from rINST 485 GOTO_OPCODE ip @ jump to next instruction 486 487/* ------------------------------ */ 488 .balign 128 489.L_op_move_object: /* 0x07 */ 490/* File: arm/op_move_object.S */ 491/* File: arm/op_move.S */ 492 /* for move, move-object, long-to-int */ 493 /* op vA, vB */ 494 mov r1, rINST, lsr #12 @ r1<- B from 15:12 495 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 496 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 497 GET_VREG r2, r1 @ r2<- fp[B] 498 GET_INST_OPCODE ip @ ip<- opcode from rINST 499 .if 1 500 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2 501 .else 502 SET_VREG r2, r0 @ fp[A]<- r2 503 .endif 504 GOTO_OPCODE ip @ execute next instruction 505 506 507/* ------------------------------ */ 508 .balign 128 509.L_op_move_object_from16: /* 0x08 */ 510/* File: arm/op_move_object_from16.S */ 511/* File: arm/op_move_from16.S */ 512 /* for: move/from16, move-object/from16 */ 513 /* op vAA, vBBBB */ 514 FETCH r1, 1 @ r1<- BBBB 515 mov r0, rINST, lsr #8 @ r0<- AA 516 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 517 GET_VREG r2, r1 @ r2<- fp[BBBB] 518 GET_INST_OPCODE ip @ extract opcode from rINST 519 .if 1 520 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2 521 .else 522 SET_VREG r2, r0 @ fp[AA]<- r2 523 .endif 524 GOTO_OPCODE ip @ jump to next instruction 525 526 527/* ------------------------------ */ 528 .balign 128 529.L_op_move_object_16: /* 0x09 */ 530/* File: arm/op_move_object_16.S */ 531/* File: arm/op_move_16.S */ 532 /* for: move/16, move-object/16 */ 533 /* op vAAAA, vBBBB */ 534 FETCH r1, 2 @ r1<- BBBB 535 FETCH r0, 1 @ r0<- AAAA 536 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST 537 GET_VREG r2, r1 @ r2<- fp[BBBB] 538 GET_INST_OPCODE ip @ extract opcode from rINST 539 .if 1 540 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2 541 .else 542 SET_VREG r2, r0 @ fp[AAAA]<- r2 543 .endif 544 GOTO_OPCODE ip @ jump to next instruction 545 546 547/* ------------------------------ */ 548 .balign 128 549.L_op_move_result: /* 0x0a */ 550/* File: arm/op_move_result.S */ 551 /* for: move-result, move-result-object */ 552 /* op vAA */ 553 mov r2, rINST, lsr #8 @ r2<- AA 554 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 555 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType. 556 ldr r0, [r0] @ r0 <- result.i. 557 GET_INST_OPCODE ip @ extract opcode from rINST 558 .if 0 559 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0 560 .else 561 SET_VREG r0, r2 @ fp[AA]<- r0 562 .endif 563 GOTO_OPCODE ip @ jump to next instruction 564 565/* ------------------------------ */ 566 .balign 128 567.L_op_move_result_wide: /* 0x0b */ 568/* File: arm/op_move_result_wide.S */ 569 /* move-result-wide vAA */ 570 mov rINST, rINST, lsr #8 @ rINST<- AA 571 ldr r3, [rFP, #OFF_FP_RESULT_REGISTER] 572 VREG_INDEX_TO_ADDR r2, rINST @ r2<- &fp[AA] 573 ldmia r3, {r0-r1} @ r0/r1<- retval.j 574 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs 575 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 576 stmia r2, {r0-r1} @ fp[AA]<- r0/r1 577 GET_INST_OPCODE ip @ extract opcode from rINST 578 GOTO_OPCODE ip @ jump to next instruction 579 580/* ------------------------------ */ 581 .balign 128 582.L_op_move_result_object: /* 0x0c */ 583/* File: arm/op_move_result_object.S */ 584/* File: arm/op_move_result.S */ 585 /* for: move-result, move-result-object */ 586 /* op vAA */ 587 mov r2, rINST, lsr #8 @ r2<- AA 588 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 589 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType. 590 ldr r0, [r0] @ r0 <- result.i. 591 GET_INST_OPCODE ip @ extract opcode from rINST 592 .if 1 593 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0 594 .else 595 SET_VREG r0, r2 @ fp[AA]<- r0 596 .endif 597 GOTO_OPCODE ip @ jump to next instruction 598 599 600/* ------------------------------ */ 601 .balign 128 602.L_op_move_exception: /* 0x0d */ 603/* File: arm/op_move_exception.S */ 604 /* move-exception vAA */ 605 mov r2, rINST, lsr #8 @ r2<- AA 606 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 607 mov r1, #0 @ r1<- 0 608 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 609 SET_VREG_OBJECT r3, r2 @ fp[AA]<- exception obj 610 GET_INST_OPCODE ip @ extract opcode from rINST 611 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ clear exception 612 GOTO_OPCODE ip @ jump to next instruction 613 614/* ------------------------------ */ 615 .balign 128 616.L_op_return_void: /* 0x0e */ 617/* File: arm/op_return_void.S */ 618 .extern MterpThreadFenceForConstructor 619 bl MterpThreadFenceForConstructor 620 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET] 621 mov r0, rSELF 622 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 623 blne MterpSuspendCheck @ (self) 624 mov r0, #0 625 mov r1, #0 626 b MterpReturn 627 628/* ------------------------------ */ 629 .balign 128 630.L_op_return: /* 0x0f */ 631/* File: arm/op_return.S */ 632 /* 633 * Return a 32-bit value. 634 * 635 * for: return, return-object 636 */ 637 /* op vAA */ 638 .extern MterpThreadFenceForConstructor 639 bl MterpThreadFenceForConstructor 640 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET] 641 mov r0, rSELF 642 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 643 blne MterpSuspendCheck @ (self) 644 mov r2, rINST, lsr #8 @ r2<- AA 645 GET_VREG r0, r2 @ r0<- vAA 646 mov r1, #0 647 b MterpReturn 648 649/* ------------------------------ */ 650 .balign 128 651.L_op_return_wide: /* 0x10 */ 652/* File: arm/op_return_wide.S */ 653 /* 654 * Return a 64-bit value. 655 */ 656 /* return-wide vAA */ 657 .extern MterpThreadFenceForConstructor 658 bl MterpThreadFenceForConstructor 659 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET] 660 mov r0, rSELF 661 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 662 blne MterpSuspendCheck @ (self) 663 mov r2, rINST, lsr #8 @ r2<- AA 664 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[AA] 665 ldmia r2, {r0-r1} @ r0/r1 <- vAA/vAA+1 666 b MterpReturn 667 668/* ------------------------------ */ 669 .balign 128 670.L_op_return_object: /* 0x11 */ 671/* File: arm/op_return_object.S */ 672/* File: arm/op_return.S */ 673 /* 674 * Return a 32-bit value. 675 * 676 * for: return, return-object 677 */ 678 /* op vAA */ 679 .extern MterpThreadFenceForConstructor 680 bl MterpThreadFenceForConstructor 681 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET] 682 mov r0, rSELF 683 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 684 blne MterpSuspendCheck @ (self) 685 mov r2, rINST, lsr #8 @ r2<- AA 686 GET_VREG r0, r2 @ r0<- vAA 687 mov r1, #0 688 b MterpReturn 689 690 691/* ------------------------------ */ 692 .balign 128 693.L_op_const_4: /* 0x12 */ 694/* File: arm/op_const_4.S */ 695 /* const/4 vA, #+B */ 696 sbfx r1, rINST, #12, #4 @ r1<- sssssssB (sign-extended) 697 ubfx r0, rINST, #8, #4 @ r0<- A 698 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 699 GET_INST_OPCODE ip @ ip<- opcode from rINST 700 SET_VREG r1, r0 @ fp[A]<- r1 701 GOTO_OPCODE ip @ execute next instruction 702 703/* ------------------------------ */ 704 .balign 128 705.L_op_const_16: /* 0x13 */ 706/* File: arm/op_const_16.S */ 707 /* const/16 vAA, #+BBBB */ 708 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended) 709 mov r3, rINST, lsr #8 @ r3<- AA 710 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 711 SET_VREG r0, r3 @ vAA<- r0 712 GET_INST_OPCODE ip @ extract opcode from rINST 713 GOTO_OPCODE ip @ jump to next instruction 714 715/* ------------------------------ */ 716 .balign 128 717.L_op_const: /* 0x14 */ 718/* File: arm/op_const.S */ 719 /* const vAA, #+BBBBbbbb */ 720 mov r3, rINST, lsr #8 @ r3<- AA 721 FETCH r0, 1 @ r0<- bbbb (low) 722 FETCH r1, 2 @ r1<- BBBB (high) 723 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST 724 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 725 GET_INST_OPCODE ip @ extract opcode from rINST 726 SET_VREG r0, r3 @ vAA<- r0 727 GOTO_OPCODE ip @ jump to next instruction 728 729/* ------------------------------ */ 730 .balign 128 731.L_op_const_high16: /* 0x15 */ 732/* File: arm/op_const_high16.S */ 733 /* const/high16 vAA, #+BBBB0000 */ 734 FETCH r0, 1 @ r0<- 0000BBBB (zero-extended) 735 mov r3, rINST, lsr #8 @ r3<- AA 736 mov r0, r0, lsl #16 @ r0<- BBBB0000 737 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 738 SET_VREG r0, r3 @ vAA<- r0 739 GET_INST_OPCODE ip @ extract opcode from rINST 740 GOTO_OPCODE ip @ jump to next instruction 741 742/* ------------------------------ */ 743 .balign 128 744.L_op_const_wide_16: /* 0x16 */ 745/* File: arm/op_const_wide_16.S */ 746 /* const-wide/16 vAA, #+BBBB */ 747 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended) 748 mov r3, rINST, lsr #8 @ r3<- AA 749 mov r1, r0, asr #31 @ r1<- ssssssss 750 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 751 CLEAR_SHADOW_PAIR r3, r2, lr @ Zero out the shadow regs 752 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[AA] 753 GET_INST_OPCODE ip @ extract opcode from rINST 754 stmia r3, {r0-r1} @ vAA<- r0/r1 755 GOTO_OPCODE ip @ jump to next instruction 756 757/* ------------------------------ */ 758 .balign 128 759.L_op_const_wide_32: /* 0x17 */ 760/* File: arm/op_const_wide_32.S */ 761 /* const-wide/32 vAA, #+BBBBbbbb */ 762 FETCH r0, 1 @ r0<- 0000bbbb (low) 763 mov r3, rINST, lsr #8 @ r3<- AA 764 FETCH_S r2, 2 @ r2<- ssssBBBB (high) 765 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST 766 orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb 767 CLEAR_SHADOW_PAIR r3, r2, lr @ Zero out the shadow regs 768 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[AA] 769 mov r1, r0, asr #31 @ r1<- ssssssss 770 GET_INST_OPCODE ip @ extract opcode from rINST 771 stmia r3, {r0-r1} @ vAA<- r0/r1 772 GOTO_OPCODE ip @ jump to next instruction 773 774/* ------------------------------ */ 775 .balign 128 776.L_op_const_wide: /* 0x18 */ 777/* File: arm/op_const_wide.S */ 778 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */ 779 FETCH r0, 1 @ r0<- bbbb (low) 780 FETCH r1, 2 @ r1<- BBBB (low middle) 781 FETCH r2, 3 @ r2<- hhhh (high middle) 782 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word) 783 FETCH r3, 4 @ r3<- HHHH (high) 784 mov r9, rINST, lsr #8 @ r9<- AA 785 orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word) 786 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs 787 FETCH_ADVANCE_INST 5 @ advance rPC, load rINST 788 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA] 789 GET_INST_OPCODE ip @ extract opcode from rINST 790 stmia r9, {r0-r1} @ vAA<- r0/r1 791 GOTO_OPCODE ip @ jump to next instruction 792 793/* ------------------------------ */ 794 .balign 128 795.L_op_const_wide_high16: /* 0x19 */ 796/* File: arm/op_const_wide_high16.S */ 797 /* const-wide/high16 vAA, #+BBBB000000000000 */ 798 FETCH r1, 1 @ r1<- 0000BBBB (zero-extended) 799 mov r3, rINST, lsr #8 @ r3<- AA 800 mov r0, #0 @ r0<- 00000000 801 mov r1, r1, lsl #16 @ r1<- BBBB0000 802 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 803 CLEAR_SHADOW_PAIR r3, r0, r2 @ Zero shadow regs 804 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[AA] 805 GET_INST_OPCODE ip @ extract opcode from rINST 806 stmia r3, {r0-r1} @ vAA<- r0/r1 807 GOTO_OPCODE ip @ jump to next instruction 808 809/* ------------------------------ */ 810 .balign 128 811.L_op_const_string: /* 0x1a */ 812/* File: arm/op_const_string.S */ 813 /* const/string vAA, String@BBBB */ 814 EXPORT_PC 815 FETCH r0, 1 @ r0<- BBBB 816 mov r1, rINST, lsr #8 @ r1<- AA 817 add r2, rFP, #OFF_FP_SHADOWFRAME 818 mov r3, rSELF 819 bl MterpConstString @ (index, tgt_reg, shadow_frame, self) 820 PREFETCH_INST 2 @ load rINST 821 cmp r0, #0 @ fail? 822 bne MterpPossibleException @ let reference interpreter deal with it. 823 ADVANCE 2 @ advance rPC 824 GET_INST_OPCODE ip @ extract opcode from rINST 825 GOTO_OPCODE ip @ jump to next instruction 826 827/* ------------------------------ */ 828 .balign 128 829.L_op_const_string_jumbo: /* 0x1b */ 830/* File: arm/op_const_string_jumbo.S */ 831 /* const/string vAA, String@BBBBBBBB */ 832 EXPORT_PC 833 FETCH r0, 1 @ r0<- bbbb (low) 834 FETCH r2, 2 @ r2<- BBBB (high) 835 mov r1, rINST, lsr #8 @ r1<- AA 836 orr r0, r0, r2, lsl #16 @ r1<- BBBBbbbb 837 add r2, rFP, #OFF_FP_SHADOWFRAME 838 mov r3, rSELF 839 bl MterpConstString @ (index, tgt_reg, shadow_frame, self) 840 PREFETCH_INST 3 @ advance rPC 841 cmp r0, #0 @ fail? 842 bne MterpPossibleException @ let reference interpreter deal with it. 843 ADVANCE 3 @ advance rPC 844 GET_INST_OPCODE ip @ extract opcode from rINST 845 GOTO_OPCODE ip @ jump to next instruction 846 847/* ------------------------------ */ 848 .balign 128 849.L_op_const_class: /* 0x1c */ 850/* File: arm/op_const_class.S */ 851 /* const/class vAA, Class@BBBB */ 852 EXPORT_PC 853 FETCH r0, 1 @ r0<- BBBB 854 mov r1, rINST, lsr #8 @ r1<- AA 855 add r2, rFP, #OFF_FP_SHADOWFRAME 856 mov r3, rSELF 857 bl MterpConstClass @ (index, tgt_reg, shadow_frame, self) 858 PREFETCH_INST 2 859 cmp r0, #0 860 bne MterpPossibleException 861 ADVANCE 2 862 GET_INST_OPCODE ip @ extract opcode from rINST 863 GOTO_OPCODE ip @ jump to next instruction 864 865/* ------------------------------ */ 866 .balign 128 867.L_op_monitor_enter: /* 0x1d */ 868/* File: arm/op_monitor_enter.S */ 869 /* 870 * Synchronize on an object. 871 */ 872 /* monitor-enter vAA */ 873 EXPORT_PC 874 mov r2, rINST, lsr #8 @ r2<- AA 875 GET_VREG r0, r2 @ r0<- vAA (object) 876 mov r1, rSELF @ r1<- self 877 bl artLockObjectFromCode 878 cmp r0, #0 879 bne MterpException 880 FETCH_ADVANCE_INST 1 881 GET_INST_OPCODE ip @ extract opcode from rINST 882 GOTO_OPCODE ip @ jump to next instruction 883 884/* ------------------------------ */ 885 .balign 128 886.L_op_monitor_exit: /* 0x1e */ 887/* File: arm/op_monitor_exit.S */ 888 /* 889 * Unlock an object. 890 * 891 * Exceptions that occur when unlocking a monitor need to appear as 892 * if they happened at the following instruction. See the Dalvik 893 * instruction spec. 894 */ 895 /* monitor-exit vAA */ 896 EXPORT_PC 897 mov r2, rINST, lsr #8 @ r2<- AA 898 GET_VREG r0, r2 @ r0<- vAA (object) 899 mov r1, rSELF @ r0<- self 900 bl artUnlockObjectFromCode @ r0<- success for unlock(self, obj) 901 cmp r0, #0 @ failed? 902 bne MterpException 903 FETCH_ADVANCE_INST 1 @ before throw: advance rPC, load rINST 904 GET_INST_OPCODE ip @ extract opcode from rINST 905 GOTO_OPCODE ip @ jump to next instruction 906 907/* ------------------------------ */ 908 .balign 128 909.L_op_check_cast: /* 0x1f */ 910/* File: arm/op_check_cast.S */ 911 /* 912 * Check to see if a cast from one class to another is allowed. 913 */ 914 /* check-cast vAA, class@BBBB */ 915 EXPORT_PC 916 FETCH r0, 1 @ r0<- BBBB 917 mov r1, rINST, lsr #8 @ r1<- AA 918 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object 919 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method 920 mov r3, rSELF @ r3<- self 921 bl MterpCheckCast @ (index, &obj, method, self) 922 PREFETCH_INST 2 923 cmp r0, #0 924 bne MterpPossibleException 925 ADVANCE 2 926 GET_INST_OPCODE ip @ extract opcode from rINST 927 GOTO_OPCODE ip @ jump to next instruction 928 929/* ------------------------------ */ 930 .balign 128 931.L_op_instance_of: /* 0x20 */ 932/* File: arm/op_instance_of.S */ 933 /* 934 * Check to see if an object reference is an instance of a class. 935 * 936 * Most common situation is a non-null object, being compared against 937 * an already-resolved class. 938 */ 939 /* instance-of vA, vB, class@CCCC */ 940 EXPORT_PC 941 FETCH r0, 1 @ r0<- CCCC 942 mov r1, rINST, lsr #12 @ r1<- B 943 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object 944 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method 945 mov r3, rSELF @ r3<- self 946 bl MterpInstanceOf @ (index, &obj, method, self) 947 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET] 948 ubfx r9, rINST, #8, #4 @ r9<- A 949 PREFETCH_INST 2 950 cmp r1, #0 @ exception pending? 951 bne MterpException 952 ADVANCE 2 @ advance rPC 953 SET_VREG r0, r9 @ vA<- r0 954 GET_INST_OPCODE ip @ extract opcode from rINST 955 GOTO_OPCODE ip @ jump to next instruction 956 957/* ------------------------------ */ 958 .balign 128 959.L_op_array_length: /* 0x21 */ 960/* File: arm/op_array_length.S */ 961 /* 962 * Return the length of an array. 963 */ 964 mov r1, rINST, lsr #12 @ r1<- B 965 ubfx r2, rINST, #8, #4 @ r2<- A 966 GET_VREG r0, r1 @ r0<- vB (object ref) 967 cmp r0, #0 @ is object null? 968 beq common_errNullObject @ yup, fail 969 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 970 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- array length 971 GET_INST_OPCODE ip @ extract opcode from rINST 972 SET_VREG r3, r2 @ vB<- length 973 GOTO_OPCODE ip @ jump to next instruction 974 975/* ------------------------------ */ 976 .balign 128 977.L_op_new_instance: /* 0x22 */ 978/* File: arm/op_new_instance.S */ 979 /* 980 * Create a new instance of a class. 981 */ 982 /* new-instance vAA, class@BBBB */ 983 EXPORT_PC 984 add r0, rFP, #OFF_FP_SHADOWFRAME 985 mov r1, rSELF 986 mov r2, rINST 987 bl MterpNewInstance @ (shadow_frame, self, inst_data) 988 cmp r0, #0 989 beq MterpPossibleException 990 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 991 GET_INST_OPCODE ip @ extract opcode from rINST 992 GOTO_OPCODE ip @ jump to next instruction 993 994/* ------------------------------ */ 995 .balign 128 996.L_op_new_array: /* 0x23 */ 997/* File: arm/op_new_array.S */ 998 /* 999 * Allocate an array of objects, specified with the array class 1000 * and a count. 1001 * 1002 * The verifier guarantees that this is an array class, so we don't 1003 * check for it here. 1004 */ 1005 /* new-array vA, vB, class@CCCC */ 1006 EXPORT_PC 1007 add r0, rFP, #OFF_FP_SHADOWFRAME 1008 mov r1, rPC 1009 mov r2, rINST 1010 mov r3, rSELF 1011 bl MterpNewArray 1012 cmp r0, #0 1013 beq MterpPossibleException 1014 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1015 GET_INST_OPCODE ip @ extract opcode from rINST 1016 GOTO_OPCODE ip @ jump to next instruction 1017 1018/* ------------------------------ */ 1019 .balign 128 1020.L_op_filled_new_array: /* 0x24 */ 1021/* File: arm/op_filled_new_array.S */ 1022 /* 1023 * Create a new array with elements filled from registers. 1024 * 1025 * for: filled-new-array, filled-new-array/range 1026 */ 1027 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1028 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 1029 .extern MterpFilledNewArray 1030 EXPORT_PC 1031 add r0, rFP, #OFF_FP_SHADOWFRAME 1032 mov r1, rPC 1033 mov r2, rSELF 1034 bl MterpFilledNewArray 1035 cmp r0, #0 1036 beq MterpPossibleException 1037 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST 1038 GET_INST_OPCODE ip @ extract opcode from rINST 1039 GOTO_OPCODE ip @ jump to next instruction 1040 1041/* ------------------------------ */ 1042 .balign 128 1043.L_op_filled_new_array_range: /* 0x25 */ 1044/* File: arm/op_filled_new_array_range.S */ 1045/* File: arm/op_filled_new_array.S */ 1046 /* 1047 * Create a new array with elements filled from registers. 1048 * 1049 * for: filled-new-array, filled-new-array/range 1050 */ 1051 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1052 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 1053 .extern MterpFilledNewArrayRange 1054 EXPORT_PC 1055 add r0, rFP, #OFF_FP_SHADOWFRAME 1056 mov r1, rPC 1057 mov r2, rSELF 1058 bl MterpFilledNewArrayRange 1059 cmp r0, #0 1060 beq MterpPossibleException 1061 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST 1062 GET_INST_OPCODE ip @ extract opcode from rINST 1063 GOTO_OPCODE ip @ jump to next instruction 1064 1065 1066/* ------------------------------ */ 1067 .balign 128 1068.L_op_fill_array_data: /* 0x26 */ 1069/* File: arm/op_fill_array_data.S */ 1070 /* fill-array-data vAA, +BBBBBBBB */ 1071 EXPORT_PC 1072 FETCH r0, 1 @ r0<- bbbb (lo) 1073 FETCH r1, 2 @ r1<- BBBB (hi) 1074 mov r3, rINST, lsr #8 @ r3<- AA 1075 orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb 1076 GET_VREG r0, r3 @ r0<- vAA (array object) 1077 add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.) 1078 bl MterpFillArrayData @ (obj, payload) 1079 cmp r0, #0 @ 0 means an exception is thrown 1080 beq MterpPossibleException @ exception? 1081 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST 1082 GET_INST_OPCODE ip @ extract opcode from rINST 1083 GOTO_OPCODE ip @ jump to next instruction 1084 1085/* ------------------------------ */ 1086 .balign 128 1087.L_op_throw: /* 0x27 */ 1088/* File: arm/op_throw.S */ 1089 /* 1090 * Throw an exception object in the current thread. 1091 */ 1092 /* throw vAA */ 1093 EXPORT_PC 1094 mov r2, rINST, lsr #8 @ r2<- AA 1095 GET_VREG r1, r2 @ r1<- vAA (exception object) 1096 cmp r1, #0 @ null object? 1097 beq common_errNullObject @ yes, throw an NPE instead 1098 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ thread->exception<- obj 1099 b MterpException 1100 1101/* ------------------------------ */ 1102 .balign 128 1103.L_op_goto: /* 0x28 */ 1104/* File: arm/op_goto.S */ 1105 /* 1106 * Unconditional branch, 8-bit offset. 1107 * 1108 * The branch distance is a signed code-unit offset, which we need to 1109 * double to get a byte offset. 1110 */ 1111 /* goto +AA */ 1112 sbfx rINST, rINST, #8, #8 @ rINST<- ssssssAA (sign-extended) 1113 b MterpCommonTakenBranchNoFlags 1114 1115/* ------------------------------ */ 1116 .balign 128 1117.L_op_goto_16: /* 0x29 */ 1118/* File: arm/op_goto_16.S */ 1119 /* 1120 * Unconditional branch, 16-bit offset. 1121 * 1122 * The branch distance is a signed code-unit offset, which we need to 1123 * double to get a byte offset. 1124 */ 1125 /* goto/16 +AAAA */ 1126 FETCH_S rINST, 1 @ rINST<- ssssAAAA (sign-extended) 1127 b MterpCommonTakenBranchNoFlags 1128 1129/* ------------------------------ */ 1130 .balign 128 1131.L_op_goto_32: /* 0x2a */ 1132/* File: arm/op_goto_32.S */ 1133 /* 1134 * Unconditional branch, 32-bit offset. 1135 * 1136 * The branch distance is a signed code-unit offset, which we need to 1137 * double to get a byte offset. 1138 * 1139 * Unlike most opcodes, this one is allowed to branch to itself, so 1140 * our "backward branch" test must be "<=0" instead of "<0". Because 1141 * we need the V bit set, we'll use an adds to convert from Dalvik 1142 * offset to byte offset. 1143 */ 1144 /* goto/32 +AAAAAAAA */ 1145 FETCH r0, 1 @ r0<- aaaa (lo) 1146 FETCH r3, 2 @ r1<- AAAA (hi) 1147 orrs rINST, r0, r3, lsl #16 @ rINST<- AAAAaaaa 1148 b MterpCommonTakenBranch 1149 1150/* ------------------------------ */ 1151 .balign 128 1152.L_op_packed_switch: /* 0x2b */ 1153/* File: arm/op_packed_switch.S */ 1154 /* 1155 * Handle a packed-switch or sparse-switch instruction. In both cases 1156 * we decode it and hand it off to a helper function. 1157 * 1158 * We don't really expect backward branches in a switch statement, but 1159 * they're perfectly legal, so we check for them here. 1160 * 1161 * for: packed-switch, sparse-switch 1162 */ 1163 /* op vAA, +BBBB */ 1164 FETCH r0, 1 @ r0<- bbbb (lo) 1165 FETCH r1, 2 @ r1<- BBBB (hi) 1166 mov r3, rINST, lsr #8 @ r3<- AA 1167 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 1168 GET_VREG r1, r3 @ r1<- vAA 1169 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2 1170 bl MterpDoPackedSwitch @ r0<- code-unit branch offset 1171 movs rINST, r0 1172 b MterpCommonTakenBranch 1173 1174/* ------------------------------ */ 1175 .balign 128 1176.L_op_sparse_switch: /* 0x2c */ 1177/* File: arm/op_sparse_switch.S */ 1178/* File: arm/op_packed_switch.S */ 1179 /* 1180 * Handle a packed-switch or sparse-switch instruction. In both cases 1181 * we decode it and hand it off to a helper function. 1182 * 1183 * We don't really expect backward branches in a switch statement, but 1184 * they're perfectly legal, so we check for them here. 1185 * 1186 * for: packed-switch, sparse-switch 1187 */ 1188 /* op vAA, +BBBB */ 1189 FETCH r0, 1 @ r0<- bbbb (lo) 1190 FETCH r1, 2 @ r1<- BBBB (hi) 1191 mov r3, rINST, lsr #8 @ r3<- AA 1192 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 1193 GET_VREG r1, r3 @ r1<- vAA 1194 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2 1195 bl MterpDoSparseSwitch @ r0<- code-unit branch offset 1196 movs rINST, r0 1197 b MterpCommonTakenBranch 1198 1199 1200/* ------------------------------ */ 1201 .balign 128 1202.L_op_cmpl_float: /* 0x2d */ 1203/* File: arm/op_cmpl_float.S */ 1204 /* 1205 * Compare two floating-point values. Puts 0, 1, or -1 into the 1206 * destination register based on the results of the comparison. 1207 * 1208 * int compare(x, y) { 1209 * if (x == y) { 1210 * return 0; 1211 * } else if (x > y) { 1212 * return 1; 1213 * } else if (x < y) { 1214 * return -1; 1215 * } else { 1216 * return -1; 1217 * } 1218 * } 1219 */ 1220 /* op vAA, vBB, vCC */ 1221 FETCH r0, 1 @ r0<- CCBB 1222 mov r9, rINST, lsr #8 @ r9<- AA 1223 and r2, r0, #255 @ r2<- BB 1224 mov r3, r0, lsr #8 @ r3<- CC 1225 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 1226 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 1227 flds s0, [r2] @ s0<- vBB 1228 flds s1, [r3] @ s1<- vCC 1229 vcmpe.f32 s0, s1 @ compare (vBB, vCC) 1230 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1231 mvn r0, #0 @ r0<- -1 (default) 1232 GET_INST_OPCODE ip @ extract opcode from rINST 1233 fmstat @ export status flags 1234 movgt r0, #1 @ (greater than) r1<- 1 1235 moveq r0, #0 @ (equal) r1<- 0 1236 SET_VREG r0, r9 @ vAA<- r0 1237 GOTO_OPCODE ip @ jump to next instruction 1238 1239/* ------------------------------ */ 1240 .balign 128 1241.L_op_cmpg_float: /* 0x2e */ 1242/* File: arm/op_cmpg_float.S */ 1243 /* 1244 * Compare two floating-point values. Puts 0, 1, or -1 into the 1245 * destination register based on the results of the comparison. 1246 * 1247 * int compare(x, y) { 1248 * if (x == y) { 1249 * return 0; 1250 * } else if (x < y) { 1251 * return -1; 1252 * } else if (x > y) { 1253 * return 1; 1254 * } else { 1255 * return 1; 1256 * } 1257 * } 1258 */ 1259 /* op vAA, vBB, vCC */ 1260 FETCH r0, 1 @ r0<- CCBB 1261 mov r9, rINST, lsr #8 @ r9<- AA 1262 and r2, r0, #255 @ r2<- BB 1263 mov r3, r0, lsr #8 @ r3<- CC 1264 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 1265 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 1266 flds s0, [r2] @ s0<- vBB 1267 flds s1, [r3] @ s1<- vCC 1268 vcmpe.f32 s0, s1 @ compare (vBB, vCC) 1269 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1270 mov r0, #1 @ r0<- 1 (default) 1271 GET_INST_OPCODE ip @ extract opcode from rINST 1272 fmstat @ export status flags 1273 mvnmi r0, #0 @ (less than) r1<- -1 1274 moveq r0, #0 @ (equal) r1<- 0 1275 SET_VREG r0, r9 @ vAA<- r0 1276 GOTO_OPCODE ip @ jump to next instruction 1277 1278/* ------------------------------ */ 1279 .balign 128 1280.L_op_cmpl_double: /* 0x2f */ 1281/* File: arm/op_cmpl_double.S */ 1282 /* 1283 * Compare two floating-point values. Puts 0, 1, or -1 into the 1284 * destination register based on the results of the comparison. 1285 * 1286 * int compare(x, y) { 1287 * if (x == y) { 1288 * return 0; 1289 * } else if (x > y) { 1290 * return 1; 1291 * } else if (x < y) { 1292 * return -1; 1293 * } else { 1294 * return -1; 1295 * } 1296 * } 1297 */ 1298 /* op vAA, vBB, vCC */ 1299 FETCH r0, 1 @ r0<- CCBB 1300 mov r9, rINST, lsr #8 @ r9<- AA 1301 and r2, r0, #255 @ r2<- BB 1302 mov r3, r0, lsr #8 @ r3<- CC 1303 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 1304 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 1305 fldd d0, [r2] @ d0<- vBB 1306 fldd d1, [r3] @ d1<- vCC 1307 vcmpe.f64 d0, d1 @ compare (vBB, vCC) 1308 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1309 mvn r0, #0 @ r0<- -1 (default) 1310 GET_INST_OPCODE ip @ extract opcode from rINST 1311 fmstat @ export status flags 1312 movgt r0, #1 @ (greater than) r1<- 1 1313 moveq r0, #0 @ (equal) r1<- 0 1314 SET_VREG r0, r9 @ vAA<- r0 1315 GOTO_OPCODE ip @ jump to next instruction 1316 1317/* ------------------------------ */ 1318 .balign 128 1319.L_op_cmpg_double: /* 0x30 */ 1320/* File: arm/op_cmpg_double.S */ 1321 /* 1322 * Compare two floating-point values. Puts 0, 1, or -1 into the 1323 * destination register based on the results of the comparison. 1324 * 1325 * int compare(x, y) { 1326 * if (x == y) { 1327 * return 0; 1328 * } else if (x < y) { 1329 * return -1; 1330 * } else if (x > y) { 1331 * return 1; 1332 * } else { 1333 * return 1; 1334 * } 1335 * } 1336 */ 1337 /* op vAA, vBB, vCC */ 1338 FETCH r0, 1 @ r0<- CCBB 1339 mov r9, rINST, lsr #8 @ r9<- AA 1340 and r2, r0, #255 @ r2<- BB 1341 mov r3, r0, lsr #8 @ r3<- CC 1342 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 1343 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 1344 fldd d0, [r2] @ d0<- vBB 1345 fldd d1, [r3] @ d1<- vCC 1346 vcmpe.f64 d0, d1 @ compare (vBB, vCC) 1347 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1348 mov r0, #1 @ r0<- 1 (default) 1349 GET_INST_OPCODE ip @ extract opcode from rINST 1350 fmstat @ export status flags 1351 mvnmi r0, #0 @ (less than) r1<- -1 1352 moveq r0, #0 @ (equal) r1<- 0 1353 SET_VREG r0, r9 @ vAA<- r0 1354 GOTO_OPCODE ip @ jump to next instruction 1355 1356/* ------------------------------ */ 1357 .balign 128 1358.L_op_cmp_long: /* 0x31 */ 1359/* File: arm/op_cmp_long.S */ 1360 /* 1361 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination 1362 * register based on the results of the comparison. 1363 */ 1364 /* cmp-long vAA, vBB, vCC */ 1365 FETCH r0, 1 @ r0<- CCBB 1366 mov r9, rINST, lsr #8 @ r9<- AA 1367 and r2, r0, #255 @ r2<- BB 1368 mov r3, r0, lsr #8 @ r3<- CC 1369 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 1370 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 1371 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 1372 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 1373 cmp r0, r2 1374 sbcs ip, r1, r3 @ Sets correct CCs for checking LT (but not EQ/NE) 1375 mov ip, #0 1376 mvnlt ip, #0 @ -1 1377 cmpeq r0, r2 @ For correct EQ/NE, we may need to repeat the first CMP 1378 orrne ip, #1 1379 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1380 SET_VREG ip, r9 @ vAA<- ip 1381 GET_INST_OPCODE ip @ extract opcode from rINST 1382 GOTO_OPCODE ip @ jump to next instruction 1383 1384/* ------------------------------ */ 1385 .balign 128 1386.L_op_if_eq: /* 0x32 */ 1387/* File: arm/op_if_eq.S */ 1388/* File: arm/bincmp.S */ 1389 /* 1390 * Generic two-operand compare-and-branch operation. Provide a "condition" 1391 * fragment that specifies the comparison to perform. 1392 * 1393 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1394 */ 1395 /* if-cmp vA, vB, +CCCC */ 1396 mov r1, rINST, lsr #12 @ r1<- B 1397 ubfx r0, rINST, #8, #4 @ r0<- A 1398 GET_VREG r3, r1 @ r3<- vB 1399 GET_VREG r0, r0 @ r0<- vA 1400 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1401 cmp r0, r3 @ compare (vA, vB) 1402 beq MterpCommonTakenBranchNoFlags 1403 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1404 beq .L_check_not_taken_osr 1405 FETCH_ADVANCE_INST 2 1406 GET_INST_OPCODE ip @ extract opcode from rINST 1407 GOTO_OPCODE ip @ jump to next instruction 1408 1409 1410/* ------------------------------ */ 1411 .balign 128 1412.L_op_if_ne: /* 0x33 */ 1413/* File: arm/op_if_ne.S */ 1414/* File: arm/bincmp.S */ 1415 /* 1416 * Generic two-operand compare-and-branch operation. Provide a "condition" 1417 * fragment that specifies the comparison to perform. 1418 * 1419 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1420 */ 1421 /* if-cmp vA, vB, +CCCC */ 1422 mov r1, rINST, lsr #12 @ r1<- B 1423 ubfx r0, rINST, #8, #4 @ r0<- A 1424 GET_VREG r3, r1 @ r3<- vB 1425 GET_VREG r0, r0 @ r0<- vA 1426 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1427 cmp r0, r3 @ compare (vA, vB) 1428 bne MterpCommonTakenBranchNoFlags 1429 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1430 beq .L_check_not_taken_osr 1431 FETCH_ADVANCE_INST 2 1432 GET_INST_OPCODE ip @ extract opcode from rINST 1433 GOTO_OPCODE ip @ jump to next instruction 1434 1435 1436/* ------------------------------ */ 1437 .balign 128 1438.L_op_if_lt: /* 0x34 */ 1439/* File: arm/op_if_lt.S */ 1440/* File: arm/bincmp.S */ 1441 /* 1442 * Generic two-operand compare-and-branch operation. Provide a "condition" 1443 * fragment that specifies the comparison to perform. 1444 * 1445 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1446 */ 1447 /* if-cmp vA, vB, +CCCC */ 1448 mov r1, rINST, lsr #12 @ r1<- B 1449 ubfx r0, rINST, #8, #4 @ r0<- A 1450 GET_VREG r3, r1 @ r3<- vB 1451 GET_VREG r0, r0 @ r0<- vA 1452 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1453 cmp r0, r3 @ compare (vA, vB) 1454 blt MterpCommonTakenBranchNoFlags 1455 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1456 beq .L_check_not_taken_osr 1457 FETCH_ADVANCE_INST 2 1458 GET_INST_OPCODE ip @ extract opcode from rINST 1459 GOTO_OPCODE ip @ jump to next instruction 1460 1461 1462/* ------------------------------ */ 1463 .balign 128 1464.L_op_if_ge: /* 0x35 */ 1465/* File: arm/op_if_ge.S */ 1466/* File: arm/bincmp.S */ 1467 /* 1468 * Generic two-operand compare-and-branch operation. Provide a "condition" 1469 * fragment that specifies the comparison to perform. 1470 * 1471 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1472 */ 1473 /* if-cmp vA, vB, +CCCC */ 1474 mov r1, rINST, lsr #12 @ r1<- B 1475 ubfx r0, rINST, #8, #4 @ r0<- A 1476 GET_VREG r3, r1 @ r3<- vB 1477 GET_VREG r0, r0 @ r0<- vA 1478 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1479 cmp r0, r3 @ compare (vA, vB) 1480 bge MterpCommonTakenBranchNoFlags 1481 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1482 beq .L_check_not_taken_osr 1483 FETCH_ADVANCE_INST 2 1484 GET_INST_OPCODE ip @ extract opcode from rINST 1485 GOTO_OPCODE ip @ jump to next instruction 1486 1487 1488/* ------------------------------ */ 1489 .balign 128 1490.L_op_if_gt: /* 0x36 */ 1491/* File: arm/op_if_gt.S */ 1492/* File: arm/bincmp.S */ 1493 /* 1494 * Generic two-operand compare-and-branch operation. Provide a "condition" 1495 * fragment that specifies the comparison to perform. 1496 * 1497 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1498 */ 1499 /* if-cmp vA, vB, +CCCC */ 1500 mov r1, rINST, lsr #12 @ r1<- B 1501 ubfx r0, rINST, #8, #4 @ r0<- A 1502 GET_VREG r3, r1 @ r3<- vB 1503 GET_VREG r0, r0 @ r0<- vA 1504 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1505 cmp r0, r3 @ compare (vA, vB) 1506 bgt MterpCommonTakenBranchNoFlags 1507 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1508 beq .L_check_not_taken_osr 1509 FETCH_ADVANCE_INST 2 1510 GET_INST_OPCODE ip @ extract opcode from rINST 1511 GOTO_OPCODE ip @ jump to next instruction 1512 1513 1514/* ------------------------------ */ 1515 .balign 128 1516.L_op_if_le: /* 0x37 */ 1517/* File: arm/op_if_le.S */ 1518/* File: arm/bincmp.S */ 1519 /* 1520 * Generic two-operand compare-and-branch operation. Provide a "condition" 1521 * fragment that specifies the comparison to perform. 1522 * 1523 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1524 */ 1525 /* if-cmp vA, vB, +CCCC */ 1526 mov r1, rINST, lsr #12 @ r1<- B 1527 ubfx r0, rINST, #8, #4 @ r0<- A 1528 GET_VREG r3, r1 @ r3<- vB 1529 GET_VREG r0, r0 @ r0<- vA 1530 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1531 cmp r0, r3 @ compare (vA, vB) 1532 ble MterpCommonTakenBranchNoFlags 1533 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1534 beq .L_check_not_taken_osr 1535 FETCH_ADVANCE_INST 2 1536 GET_INST_OPCODE ip @ extract opcode from rINST 1537 GOTO_OPCODE ip @ jump to next instruction 1538 1539 1540/* ------------------------------ */ 1541 .balign 128 1542.L_op_if_eqz: /* 0x38 */ 1543/* File: arm/op_if_eqz.S */ 1544/* File: arm/zcmp.S */ 1545 /* 1546 * Generic one-operand compare-and-branch operation. Provide a "condition" 1547 * fragment that specifies the comparison to perform. 1548 * 1549 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1550 */ 1551 /* if-cmp vAA, +BBBB */ 1552 mov r0, rINST, lsr #8 @ r0<- AA 1553 GET_VREG r0, r0 @ r0<- vAA 1554 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1555 cmp r0, #0 @ compare (vA, 0) 1556 beq MterpCommonTakenBranchNoFlags 1557 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1558 beq .L_check_not_taken_osr 1559 FETCH_ADVANCE_INST 2 1560 GET_INST_OPCODE ip @ extract opcode from rINST 1561 GOTO_OPCODE ip @ jump to next instruction 1562 1563 1564/* ------------------------------ */ 1565 .balign 128 1566.L_op_if_nez: /* 0x39 */ 1567/* File: arm/op_if_nez.S */ 1568/* File: arm/zcmp.S */ 1569 /* 1570 * Generic one-operand compare-and-branch operation. Provide a "condition" 1571 * fragment that specifies the comparison to perform. 1572 * 1573 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1574 */ 1575 /* if-cmp vAA, +BBBB */ 1576 mov r0, rINST, lsr #8 @ r0<- AA 1577 GET_VREG r0, r0 @ r0<- vAA 1578 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1579 cmp r0, #0 @ compare (vA, 0) 1580 bne MterpCommonTakenBranchNoFlags 1581 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1582 beq .L_check_not_taken_osr 1583 FETCH_ADVANCE_INST 2 1584 GET_INST_OPCODE ip @ extract opcode from rINST 1585 GOTO_OPCODE ip @ jump to next instruction 1586 1587 1588/* ------------------------------ */ 1589 .balign 128 1590.L_op_if_ltz: /* 0x3a */ 1591/* File: arm/op_if_ltz.S */ 1592/* File: arm/zcmp.S */ 1593 /* 1594 * Generic one-operand compare-and-branch operation. Provide a "condition" 1595 * fragment that specifies the comparison to perform. 1596 * 1597 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1598 */ 1599 /* if-cmp vAA, +BBBB */ 1600 mov r0, rINST, lsr #8 @ r0<- AA 1601 GET_VREG r0, r0 @ r0<- vAA 1602 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1603 cmp r0, #0 @ compare (vA, 0) 1604 blt MterpCommonTakenBranchNoFlags 1605 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1606 beq .L_check_not_taken_osr 1607 FETCH_ADVANCE_INST 2 1608 GET_INST_OPCODE ip @ extract opcode from rINST 1609 GOTO_OPCODE ip @ jump to next instruction 1610 1611 1612/* ------------------------------ */ 1613 .balign 128 1614.L_op_if_gez: /* 0x3b */ 1615/* File: arm/op_if_gez.S */ 1616/* File: arm/zcmp.S */ 1617 /* 1618 * Generic one-operand compare-and-branch operation. Provide a "condition" 1619 * fragment that specifies the comparison to perform. 1620 * 1621 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1622 */ 1623 /* if-cmp vAA, +BBBB */ 1624 mov r0, rINST, lsr #8 @ r0<- AA 1625 GET_VREG r0, r0 @ r0<- vAA 1626 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1627 cmp r0, #0 @ compare (vA, 0) 1628 bge MterpCommonTakenBranchNoFlags 1629 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1630 beq .L_check_not_taken_osr 1631 FETCH_ADVANCE_INST 2 1632 GET_INST_OPCODE ip @ extract opcode from rINST 1633 GOTO_OPCODE ip @ jump to next instruction 1634 1635 1636/* ------------------------------ */ 1637 .balign 128 1638.L_op_if_gtz: /* 0x3c */ 1639/* File: arm/op_if_gtz.S */ 1640/* File: arm/zcmp.S */ 1641 /* 1642 * Generic one-operand compare-and-branch operation. Provide a "condition" 1643 * fragment that specifies the comparison to perform. 1644 * 1645 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1646 */ 1647 /* if-cmp vAA, +BBBB */ 1648 mov r0, rINST, lsr #8 @ r0<- AA 1649 GET_VREG r0, r0 @ r0<- vAA 1650 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1651 cmp r0, #0 @ compare (vA, 0) 1652 bgt MterpCommonTakenBranchNoFlags 1653 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1654 beq .L_check_not_taken_osr 1655 FETCH_ADVANCE_INST 2 1656 GET_INST_OPCODE ip @ extract opcode from rINST 1657 GOTO_OPCODE ip @ jump to next instruction 1658 1659 1660/* ------------------------------ */ 1661 .balign 128 1662.L_op_if_lez: /* 0x3d */ 1663/* File: arm/op_if_lez.S */ 1664/* File: arm/zcmp.S */ 1665 /* 1666 * Generic one-operand compare-and-branch operation. Provide a "condition" 1667 * fragment that specifies the comparison to perform. 1668 * 1669 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1670 */ 1671 /* if-cmp vAA, +BBBB */ 1672 mov r0, rINST, lsr #8 @ r0<- AA 1673 GET_VREG r0, r0 @ r0<- vAA 1674 FETCH_S rINST, 1 @ rINST<- branch offset, in code units 1675 cmp r0, #0 @ compare (vA, 0) 1676 ble MterpCommonTakenBranchNoFlags 1677 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 1678 beq .L_check_not_taken_osr 1679 FETCH_ADVANCE_INST 2 1680 GET_INST_OPCODE ip @ extract opcode from rINST 1681 GOTO_OPCODE ip @ jump to next instruction 1682 1683 1684/* ------------------------------ */ 1685 .balign 128 1686.L_op_unused_3e: /* 0x3e */ 1687/* File: arm/op_unused_3e.S */ 1688/* File: arm/unused.S */ 1689/* 1690 * Bail to reference interpreter to throw. 1691 */ 1692 b MterpFallback 1693 1694 1695/* ------------------------------ */ 1696 .balign 128 1697.L_op_unused_3f: /* 0x3f */ 1698/* File: arm/op_unused_3f.S */ 1699/* File: arm/unused.S */ 1700/* 1701 * Bail to reference interpreter to throw. 1702 */ 1703 b MterpFallback 1704 1705 1706/* ------------------------------ */ 1707 .balign 128 1708.L_op_unused_40: /* 0x40 */ 1709/* File: arm/op_unused_40.S */ 1710/* File: arm/unused.S */ 1711/* 1712 * Bail to reference interpreter to throw. 1713 */ 1714 b MterpFallback 1715 1716 1717/* ------------------------------ */ 1718 .balign 128 1719.L_op_unused_41: /* 0x41 */ 1720/* File: arm/op_unused_41.S */ 1721/* File: arm/unused.S */ 1722/* 1723 * Bail to reference interpreter to throw. 1724 */ 1725 b MterpFallback 1726 1727 1728/* ------------------------------ */ 1729 .balign 128 1730.L_op_unused_42: /* 0x42 */ 1731/* File: arm/op_unused_42.S */ 1732/* File: arm/unused.S */ 1733/* 1734 * Bail to reference interpreter to throw. 1735 */ 1736 b MterpFallback 1737 1738 1739/* ------------------------------ */ 1740 .balign 128 1741.L_op_unused_43: /* 0x43 */ 1742/* File: arm/op_unused_43.S */ 1743/* File: arm/unused.S */ 1744/* 1745 * Bail to reference interpreter to throw. 1746 */ 1747 b MterpFallback 1748 1749 1750/* ------------------------------ */ 1751 .balign 128 1752.L_op_aget: /* 0x44 */ 1753/* File: arm/op_aget.S */ 1754 /* 1755 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1756 * 1757 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1758 * instructions. We use a pair of FETCH_Bs instead. 1759 * 1760 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1761 * 1762 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1763 * If this changes, specialize. 1764 */ 1765 /* op vAA, vBB, vCC */ 1766 FETCH_B r2, 1, 0 @ r2<- BB 1767 mov r9, rINST, lsr #8 @ r9<- AA 1768 FETCH_B r3, 1, 1 @ r3<- CC 1769 GET_VREG r0, r2 @ r0<- vBB (array object) 1770 GET_VREG r1, r3 @ r1<- vCC (requested index) 1771 cmp r0, #0 @ null array object? 1772 beq common_errNullObject @ yes, bail 1773 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 1774 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width 1775 cmp r1, r3 @ compare unsigned index, length 1776 bcs common_errArrayIndex @ index >= length, bail 1777 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1778 ldr r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC] 1779 GET_INST_OPCODE ip @ extract opcode from rINST 1780 SET_VREG r2, r9 @ vAA<- r2 1781 GOTO_OPCODE ip @ jump to next instruction 1782 1783/* ------------------------------ */ 1784 .balign 128 1785.L_op_aget_wide: /* 0x45 */ 1786/* File: arm/op_aget_wide.S */ 1787 /* 1788 * Array get, 64 bits. vAA <- vBB[vCC]. 1789 * 1790 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD. 1791 */ 1792 /* aget-wide vAA, vBB, vCC */ 1793 FETCH r0, 1 @ r0<- CCBB 1794 mov r9, rINST, lsr #8 @ r9<- AA 1795 and r2, r0, #255 @ r2<- BB 1796 mov r3, r0, lsr #8 @ r3<- CC 1797 GET_VREG r0, r2 @ r0<- vBB (array object) 1798 GET_VREG r1, r3 @ r1<- vCC (requested index) 1799 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs 1800 cmp r0, #0 @ null array object? 1801 beq common_errNullObject @ yes, bail 1802 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 1803 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width 1804 cmp r1, r3 @ compare unsigned index, length 1805 bcs common_errArrayIndex @ index >= length, bail 1806 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1807 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC] 1808 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA] 1809 GET_INST_OPCODE ip @ extract opcode from rINST 1810 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3 1811 GOTO_OPCODE ip @ jump to next instruction 1812 1813/* ------------------------------ */ 1814 .balign 128 1815.L_op_aget_object: /* 0x46 */ 1816/* File: arm/op_aget_object.S */ 1817 /* 1818 * Array object get. vAA <- vBB[vCC]. 1819 * 1820 * for: aget-object 1821 */ 1822 /* op vAA, vBB, vCC */ 1823 FETCH_B r2, 1, 0 @ r2<- BB 1824 mov r9, rINST, lsr #8 @ r9<- AA 1825 FETCH_B r3, 1, 1 @ r3<- CC 1826 EXPORT_PC 1827 GET_VREG r0, r2 @ r0<- vBB (array object) 1828 GET_VREG r1, r3 @ r1<- vCC (requested index) 1829 bl artAGetObjectFromMterp @ (array, index) 1830 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET] 1831 PREFETCH_INST 2 1832 cmp r1, #0 1833 bne MterpException 1834 SET_VREG_OBJECT r0, r9 1835 ADVANCE 2 1836 GET_INST_OPCODE ip 1837 GOTO_OPCODE ip @ jump to next instruction 1838 1839/* ------------------------------ */ 1840 .balign 128 1841.L_op_aget_boolean: /* 0x47 */ 1842/* File: arm/op_aget_boolean.S */ 1843/* File: arm/op_aget.S */ 1844 /* 1845 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1846 * 1847 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1848 * instructions. We use a pair of FETCH_Bs instead. 1849 * 1850 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1851 * 1852 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1853 * If this changes, specialize. 1854 */ 1855 /* op vAA, vBB, vCC */ 1856 FETCH_B r2, 1, 0 @ r2<- BB 1857 mov r9, rINST, lsr #8 @ r9<- AA 1858 FETCH_B r3, 1, 1 @ r3<- CC 1859 GET_VREG r0, r2 @ r0<- vBB (array object) 1860 GET_VREG r1, r3 @ r1<- vCC (requested index) 1861 cmp r0, #0 @ null array object? 1862 beq common_errNullObject @ yes, bail 1863 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 1864 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 1865 cmp r1, r3 @ compare unsigned index, length 1866 bcs common_errArrayIndex @ index >= length, bail 1867 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1868 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC] 1869 GET_INST_OPCODE ip @ extract opcode from rINST 1870 SET_VREG r2, r9 @ vAA<- r2 1871 GOTO_OPCODE ip @ jump to next instruction 1872 1873 1874/* ------------------------------ */ 1875 .balign 128 1876.L_op_aget_byte: /* 0x48 */ 1877/* File: arm/op_aget_byte.S */ 1878/* File: arm/op_aget.S */ 1879 /* 1880 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1881 * 1882 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1883 * instructions. We use a pair of FETCH_Bs instead. 1884 * 1885 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1886 * 1887 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1888 * If this changes, specialize. 1889 */ 1890 /* op vAA, vBB, vCC */ 1891 FETCH_B r2, 1, 0 @ r2<- BB 1892 mov r9, rINST, lsr #8 @ r9<- AA 1893 FETCH_B r3, 1, 1 @ r3<- CC 1894 GET_VREG r0, r2 @ r0<- vBB (array object) 1895 GET_VREG r1, r3 @ r1<- vCC (requested index) 1896 cmp r0, #0 @ null array object? 1897 beq common_errNullObject @ yes, bail 1898 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 1899 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 1900 cmp r1, r3 @ compare unsigned index, length 1901 bcs common_errArrayIndex @ index >= length, bail 1902 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1903 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC] 1904 GET_INST_OPCODE ip @ extract opcode from rINST 1905 SET_VREG r2, r9 @ vAA<- r2 1906 GOTO_OPCODE ip @ jump to next instruction 1907 1908 1909/* ------------------------------ */ 1910 .balign 128 1911.L_op_aget_char: /* 0x49 */ 1912/* File: arm/op_aget_char.S */ 1913/* File: arm/op_aget.S */ 1914 /* 1915 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1916 * 1917 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1918 * instructions. We use a pair of FETCH_Bs instead. 1919 * 1920 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1921 * 1922 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1923 * If this changes, specialize. 1924 */ 1925 /* op vAA, vBB, vCC */ 1926 FETCH_B r2, 1, 0 @ r2<- BB 1927 mov r9, rINST, lsr #8 @ r9<- AA 1928 FETCH_B r3, 1, 1 @ r3<- CC 1929 GET_VREG r0, r2 @ r0<- vBB (array object) 1930 GET_VREG r1, r3 @ r1<- vCC (requested index) 1931 cmp r0, #0 @ null array object? 1932 beq common_errNullObject @ yes, bail 1933 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 1934 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 1935 cmp r1, r3 @ compare unsigned index, length 1936 bcs common_errArrayIndex @ index >= length, bail 1937 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1938 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC] 1939 GET_INST_OPCODE ip @ extract opcode from rINST 1940 SET_VREG r2, r9 @ vAA<- r2 1941 GOTO_OPCODE ip @ jump to next instruction 1942 1943 1944/* ------------------------------ */ 1945 .balign 128 1946.L_op_aget_short: /* 0x4a */ 1947/* File: arm/op_aget_short.S */ 1948/* File: arm/op_aget.S */ 1949 /* 1950 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1951 * 1952 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1953 * instructions. We use a pair of FETCH_Bs instead. 1954 * 1955 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1956 * 1957 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1958 * If this changes, specialize. 1959 */ 1960 /* op vAA, vBB, vCC */ 1961 FETCH_B r2, 1, 0 @ r2<- BB 1962 mov r9, rINST, lsr #8 @ r9<- AA 1963 FETCH_B r3, 1, 1 @ r3<- CC 1964 GET_VREG r0, r2 @ r0<- vBB (array object) 1965 GET_VREG r1, r3 @ r1<- vCC (requested index) 1966 cmp r0, #0 @ null array object? 1967 beq common_errNullObject @ yes, bail 1968 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 1969 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 1970 cmp r1, r3 @ compare unsigned index, length 1971 bcs common_errArrayIndex @ index >= length, bail 1972 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 1973 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC] 1974 GET_INST_OPCODE ip @ extract opcode from rINST 1975 SET_VREG r2, r9 @ vAA<- r2 1976 GOTO_OPCODE ip @ jump to next instruction 1977 1978 1979/* ------------------------------ */ 1980 .balign 128 1981.L_op_aput: /* 0x4b */ 1982/* File: arm/op_aput.S */ 1983 /* 1984 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1985 * 1986 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1987 * instructions. We use a pair of FETCH_Bs instead. 1988 * 1989 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 1990 * 1991 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 1992 * If this changes, specialize. 1993 */ 1994 /* op vAA, vBB, vCC */ 1995 FETCH_B r2, 1, 0 @ r2<- BB 1996 mov r9, rINST, lsr #8 @ r9<- AA 1997 FETCH_B r3, 1, 1 @ r3<- CC 1998 GET_VREG r0, r2 @ r0<- vBB (array object) 1999 GET_VREG r1, r3 @ r1<- vCC (requested index) 2000 cmp r0, #0 @ null array object? 2001 beq common_errNullObject @ yes, bail 2002 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 2003 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width 2004 cmp r1, r3 @ compare unsigned index, length 2005 bcs common_errArrayIndex @ index >= length, bail 2006 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2007 GET_VREG r2, r9 @ r2<- vAA 2008 GET_INST_OPCODE ip @ extract opcode from rINST 2009 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2 2010 GOTO_OPCODE ip @ jump to next instruction 2011 2012/* ------------------------------ */ 2013 .balign 128 2014.L_op_aput_wide: /* 0x4c */ 2015/* File: arm/op_aput_wide.S */ 2016 /* 2017 * Array put, 64 bits. vBB[vCC] <- vAA. 2018 * 2019 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD. 2020 */ 2021 /* aput-wide vAA, vBB, vCC */ 2022 FETCH r0, 1 @ r0<- CCBB 2023 mov r9, rINST, lsr #8 @ r9<- AA 2024 and r2, r0, #255 @ r2<- BB 2025 mov r3, r0, lsr #8 @ r3<- CC 2026 GET_VREG r0, r2 @ r0<- vBB (array object) 2027 GET_VREG r1, r3 @ r1<- vCC (requested index) 2028 cmp r0, #0 @ null array object? 2029 beq common_errNullObject @ yes, bail 2030 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 2031 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width 2032 cmp r1, r3 @ compare unsigned index, length 2033 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA] 2034 bcs common_errArrayIndex @ index >= length, bail 2035 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2036 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1 2037 GET_INST_OPCODE ip @ extract opcode from rINST 2038 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC] 2039 GOTO_OPCODE ip @ jump to next instruction 2040 2041/* ------------------------------ */ 2042 .balign 128 2043.L_op_aput_object: /* 0x4d */ 2044/* File: arm/op_aput_object.S */ 2045 /* 2046 * Store an object into an array. vBB[vCC] <- vAA. 2047 */ 2048 /* op vAA, vBB, vCC */ 2049 EXPORT_PC 2050 add r0, rFP, #OFF_FP_SHADOWFRAME 2051 mov r1, rPC 2052 mov r2, rINST 2053 bl MterpAputObject 2054 cmp r0, #0 2055 beq MterpPossibleException 2056 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2057 GET_INST_OPCODE ip @ extract opcode from rINST 2058 GOTO_OPCODE ip @ jump to next instruction 2059 2060/* ------------------------------ */ 2061 .balign 128 2062.L_op_aput_boolean: /* 0x4e */ 2063/* File: arm/op_aput_boolean.S */ 2064/* File: arm/op_aput.S */ 2065 /* 2066 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2067 * 2068 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2069 * instructions. We use a pair of FETCH_Bs instead. 2070 * 2071 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2072 * 2073 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 2074 * If this changes, specialize. 2075 */ 2076 /* op vAA, vBB, vCC */ 2077 FETCH_B r2, 1, 0 @ r2<- BB 2078 mov r9, rINST, lsr #8 @ r9<- AA 2079 FETCH_B r3, 1, 1 @ r3<- CC 2080 GET_VREG r0, r2 @ r0<- vBB (array object) 2081 GET_VREG r1, r3 @ r1<- vCC (requested index) 2082 cmp r0, #0 @ null array object? 2083 beq common_errNullObject @ yes, bail 2084 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 2085 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2086 cmp r1, r3 @ compare unsigned index, length 2087 bcs common_errArrayIndex @ index >= length, bail 2088 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2089 GET_VREG r2, r9 @ r2<- vAA 2090 GET_INST_OPCODE ip @ extract opcode from rINST 2091 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2 2092 GOTO_OPCODE ip @ jump to next instruction 2093 2094 2095/* ------------------------------ */ 2096 .balign 128 2097.L_op_aput_byte: /* 0x4f */ 2098/* File: arm/op_aput_byte.S */ 2099/* File: arm/op_aput.S */ 2100 /* 2101 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2102 * 2103 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2104 * instructions. We use a pair of FETCH_Bs instead. 2105 * 2106 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2107 * 2108 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 2109 * If this changes, specialize. 2110 */ 2111 /* op vAA, vBB, vCC */ 2112 FETCH_B r2, 1, 0 @ r2<- BB 2113 mov r9, rINST, lsr #8 @ r9<- AA 2114 FETCH_B r3, 1, 1 @ r3<- CC 2115 GET_VREG r0, r2 @ r0<- vBB (array object) 2116 GET_VREG r1, r3 @ r1<- vCC (requested index) 2117 cmp r0, #0 @ null array object? 2118 beq common_errNullObject @ yes, bail 2119 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 2120 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width 2121 cmp r1, r3 @ compare unsigned index, length 2122 bcs common_errArrayIndex @ index >= length, bail 2123 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2124 GET_VREG r2, r9 @ r2<- vAA 2125 GET_INST_OPCODE ip @ extract opcode from rINST 2126 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2 2127 GOTO_OPCODE ip @ jump to next instruction 2128 2129 2130/* ------------------------------ */ 2131 .balign 128 2132.L_op_aput_char: /* 0x50 */ 2133/* File: arm/op_aput_char.S */ 2134/* File: arm/op_aput.S */ 2135 /* 2136 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2137 * 2138 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2139 * instructions. We use a pair of FETCH_Bs instead. 2140 * 2141 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2142 * 2143 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 2144 * If this changes, specialize. 2145 */ 2146 /* op vAA, vBB, vCC */ 2147 FETCH_B r2, 1, 0 @ r2<- BB 2148 mov r9, rINST, lsr #8 @ r9<- AA 2149 FETCH_B r3, 1, 1 @ r3<- CC 2150 GET_VREG r0, r2 @ r0<- vBB (array object) 2151 GET_VREG r1, r3 @ r1<- vCC (requested index) 2152 cmp r0, #0 @ null array object? 2153 beq common_errNullObject @ yes, bail 2154 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 2155 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2156 cmp r1, r3 @ compare unsigned index, length 2157 bcs common_errArrayIndex @ index >= length, bail 2158 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2159 GET_VREG r2, r9 @ r2<- vAA 2160 GET_INST_OPCODE ip @ extract opcode from rINST 2161 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2 2162 GOTO_OPCODE ip @ jump to next instruction 2163 2164 2165/* ------------------------------ */ 2166 .balign 128 2167.L_op_aput_short: /* 0x51 */ 2168/* File: arm/op_aput_short.S */ 2169/* File: arm/op_aput.S */ 2170 /* 2171 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2172 * 2173 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2174 * instructions. We use a pair of FETCH_Bs instead. 2175 * 2176 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2177 * 2178 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 2179 * If this changes, specialize. 2180 */ 2181 /* op vAA, vBB, vCC */ 2182 FETCH_B r2, 1, 0 @ r2<- BB 2183 mov r9, rINST, lsr #8 @ r9<- AA 2184 FETCH_B r3, 1, 1 @ r3<- CC 2185 GET_VREG r0, r2 @ r0<- vBB (array object) 2186 GET_VREG r1, r3 @ r1<- vCC (requested index) 2187 cmp r0, #0 @ null array object? 2188 beq common_errNullObject @ yes, bail 2189 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length 2190 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width 2191 cmp r1, r3 @ compare unsigned index, length 2192 bcs common_errArrayIndex @ index >= length, bail 2193 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2194 GET_VREG r2, r9 @ r2<- vAA 2195 GET_INST_OPCODE ip @ extract opcode from rINST 2196 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2 2197 GOTO_OPCODE ip @ jump to next instruction 2198 2199 2200/* ------------------------------ */ 2201 .balign 128 2202.L_op_iget: /* 0x52 */ 2203/* File: arm/op_iget.S */ 2204 /* 2205 * General instance field get. 2206 * 2207 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2208 */ 2209 EXPORT_PC 2210 FETCH r0, 1 @ r0<- field ref CCCC 2211 mov r1, rINST, lsr #12 @ r1<- B 2212 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2213 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer 2214 mov r3, rSELF @ r3<- self 2215 bl artGet32InstanceFromCode 2216 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2217 ubfx r2, rINST, #8, #4 @ r2<- A 2218 PREFETCH_INST 2 2219 cmp r3, #0 2220 bne MterpPossibleException @ bail out 2221 .if 0 2222 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0 2223 .else 2224 SET_VREG r0, r2 @ fp[A]<- r0 2225 .endif 2226 ADVANCE 2 2227 GET_INST_OPCODE ip @ extract opcode from rINST 2228 GOTO_OPCODE ip @ jump to next instruction 2229 2230/* ------------------------------ */ 2231 .balign 128 2232.L_op_iget_wide: /* 0x53 */ 2233/* File: arm/op_iget_wide.S */ 2234 /* 2235 * 64-bit instance field get. 2236 * 2237 * for: iget-wide 2238 */ 2239 EXPORT_PC 2240 FETCH r0, 1 @ r0<- field ref CCCC 2241 mov r1, rINST, lsr #12 @ r1<- B 2242 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2243 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer 2244 mov r3, rSELF @ r3<- self 2245 bl artGet64InstanceFromCode 2246 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2247 ubfx r2, rINST, #8, #4 @ r2<- A 2248 PREFETCH_INST 2 2249 cmp r3, #0 2250 bne MterpException @ bail out 2251 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs 2252 VREG_INDEX_TO_ADDR r3, r2 @ r3<- &fp[A] 2253 stmia r3, {r0-r1} @ fp[A]<- r0/r1 2254 ADVANCE 2 2255 GET_INST_OPCODE ip @ extract opcode from rINST 2256 GOTO_OPCODE ip @ jump to next instruction 2257 2258/* ------------------------------ */ 2259 .balign 128 2260.L_op_iget_object: /* 0x54 */ 2261/* File: arm/op_iget_object.S */ 2262/* File: arm/op_iget.S */ 2263 /* 2264 * General instance field get. 2265 * 2266 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2267 */ 2268 EXPORT_PC 2269 FETCH r0, 1 @ r0<- field ref CCCC 2270 mov r1, rINST, lsr #12 @ r1<- B 2271 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2272 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer 2273 mov r3, rSELF @ r3<- self 2274 bl artGetObjInstanceFromCode 2275 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2276 ubfx r2, rINST, #8, #4 @ r2<- A 2277 PREFETCH_INST 2 2278 cmp r3, #0 2279 bne MterpPossibleException @ bail out 2280 .if 1 2281 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0 2282 .else 2283 SET_VREG r0, r2 @ fp[A]<- r0 2284 .endif 2285 ADVANCE 2 2286 GET_INST_OPCODE ip @ extract opcode from rINST 2287 GOTO_OPCODE ip @ jump to next instruction 2288 2289 2290/* ------------------------------ */ 2291 .balign 128 2292.L_op_iget_boolean: /* 0x55 */ 2293/* File: arm/op_iget_boolean.S */ 2294/* File: arm/op_iget.S */ 2295 /* 2296 * General instance field get. 2297 * 2298 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2299 */ 2300 EXPORT_PC 2301 FETCH r0, 1 @ r0<- field ref CCCC 2302 mov r1, rINST, lsr #12 @ r1<- B 2303 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2304 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer 2305 mov r3, rSELF @ r3<- self 2306 bl artGetBooleanInstanceFromCode 2307 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2308 ubfx r2, rINST, #8, #4 @ r2<- A 2309 PREFETCH_INST 2 2310 cmp r3, #0 2311 bne MterpPossibleException @ bail out 2312 .if 0 2313 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0 2314 .else 2315 SET_VREG r0, r2 @ fp[A]<- r0 2316 .endif 2317 ADVANCE 2 2318 GET_INST_OPCODE ip @ extract opcode from rINST 2319 GOTO_OPCODE ip @ jump to next instruction 2320 2321 2322/* ------------------------------ */ 2323 .balign 128 2324.L_op_iget_byte: /* 0x56 */ 2325/* File: arm/op_iget_byte.S */ 2326/* File: arm/op_iget.S */ 2327 /* 2328 * General instance field get. 2329 * 2330 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2331 */ 2332 EXPORT_PC 2333 FETCH r0, 1 @ r0<- field ref CCCC 2334 mov r1, rINST, lsr #12 @ r1<- B 2335 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2336 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer 2337 mov r3, rSELF @ r3<- self 2338 bl artGetByteInstanceFromCode 2339 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2340 ubfx r2, rINST, #8, #4 @ r2<- A 2341 PREFETCH_INST 2 2342 cmp r3, #0 2343 bne MterpPossibleException @ bail out 2344 .if 0 2345 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0 2346 .else 2347 SET_VREG r0, r2 @ fp[A]<- r0 2348 .endif 2349 ADVANCE 2 2350 GET_INST_OPCODE ip @ extract opcode from rINST 2351 GOTO_OPCODE ip @ jump to next instruction 2352 2353 2354/* ------------------------------ */ 2355 .balign 128 2356.L_op_iget_char: /* 0x57 */ 2357/* File: arm/op_iget_char.S */ 2358/* File: arm/op_iget.S */ 2359 /* 2360 * General instance field get. 2361 * 2362 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2363 */ 2364 EXPORT_PC 2365 FETCH r0, 1 @ r0<- field ref CCCC 2366 mov r1, rINST, lsr #12 @ r1<- B 2367 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2368 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer 2369 mov r3, rSELF @ r3<- self 2370 bl artGetCharInstanceFromCode 2371 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2372 ubfx r2, rINST, #8, #4 @ r2<- A 2373 PREFETCH_INST 2 2374 cmp r3, #0 2375 bne MterpPossibleException @ bail out 2376 .if 0 2377 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0 2378 .else 2379 SET_VREG r0, r2 @ fp[A]<- r0 2380 .endif 2381 ADVANCE 2 2382 GET_INST_OPCODE ip @ extract opcode from rINST 2383 GOTO_OPCODE ip @ jump to next instruction 2384 2385 2386/* ------------------------------ */ 2387 .balign 128 2388.L_op_iget_short: /* 0x58 */ 2389/* File: arm/op_iget_short.S */ 2390/* File: arm/op_iget.S */ 2391 /* 2392 * General instance field get. 2393 * 2394 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2395 */ 2396 EXPORT_PC 2397 FETCH r0, 1 @ r0<- field ref CCCC 2398 mov r1, rINST, lsr #12 @ r1<- B 2399 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2400 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer 2401 mov r3, rSELF @ r3<- self 2402 bl artGetShortInstanceFromCode 2403 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2404 ubfx r2, rINST, #8, #4 @ r2<- A 2405 PREFETCH_INST 2 2406 cmp r3, #0 2407 bne MterpPossibleException @ bail out 2408 .if 0 2409 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0 2410 .else 2411 SET_VREG r0, r2 @ fp[A]<- r0 2412 .endif 2413 ADVANCE 2 2414 GET_INST_OPCODE ip @ extract opcode from rINST 2415 GOTO_OPCODE ip @ jump to next instruction 2416 2417 2418/* ------------------------------ */ 2419 .balign 128 2420.L_op_iput: /* 0x59 */ 2421/* File: arm/op_iput.S */ 2422 /* 2423 * General 32-bit instance field put. 2424 * 2425 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2426 */ 2427 /* op vA, vB, field@CCCC */ 2428 .extern artSet32InstanceFromMterp 2429 EXPORT_PC 2430 FETCH r0, 1 @ r0<- field ref CCCC 2431 mov r1, rINST, lsr #12 @ r1<- B 2432 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2433 ubfx r2, rINST, #8, #4 @ r2<- A 2434 GET_VREG r2, r2 @ r2<- fp[A] 2435 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer 2436 PREFETCH_INST 2 2437 bl artSet32InstanceFromMterp 2438 cmp r0, #0 2439 bne MterpPossibleException 2440 ADVANCE 2 @ advance rPC 2441 GET_INST_OPCODE ip @ extract opcode from rINST 2442 GOTO_OPCODE ip @ jump to next instruction 2443 2444/* ------------------------------ */ 2445 .balign 128 2446.L_op_iput_wide: /* 0x5a */ 2447/* File: arm/op_iput_wide.S */ 2448 /* iput-wide vA, vB, field@CCCC */ 2449 .extern artSet64InstanceFromMterp 2450 EXPORT_PC 2451 FETCH r0, 1 @ r0<- field ref CCCC 2452 mov r1, rINST, lsr #12 @ r1<- B 2453 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2454 ubfx r2, rINST, #8, #4 @ r2<- A 2455 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[A] 2456 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer 2457 PREFETCH_INST 2 2458 bl artSet64InstanceFromMterp 2459 cmp r0, #0 2460 bne MterpPossibleException 2461 ADVANCE 2 @ advance rPC 2462 GET_INST_OPCODE ip @ extract opcode from rINST 2463 GOTO_OPCODE ip @ jump to next instruction 2464 2465/* ------------------------------ */ 2466 .balign 128 2467.L_op_iput_object: /* 0x5b */ 2468/* File: arm/op_iput_object.S */ 2469 EXPORT_PC 2470 add r0, rFP, #OFF_FP_SHADOWFRAME 2471 mov r1, rPC 2472 mov r2, rINST 2473 mov r3, rSELF 2474 bl MterpIputObject 2475 cmp r0, #0 2476 beq MterpException 2477 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2478 GET_INST_OPCODE ip @ extract opcode from rINST 2479 GOTO_OPCODE ip @ jump to next instruction 2480 2481/* ------------------------------ */ 2482 .balign 128 2483.L_op_iput_boolean: /* 0x5c */ 2484/* File: arm/op_iput_boolean.S */ 2485/* File: arm/op_iput.S */ 2486 /* 2487 * General 32-bit instance field put. 2488 * 2489 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2490 */ 2491 /* op vA, vB, field@CCCC */ 2492 .extern artSet8InstanceFromMterp 2493 EXPORT_PC 2494 FETCH r0, 1 @ r0<- field ref CCCC 2495 mov r1, rINST, lsr #12 @ r1<- B 2496 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2497 ubfx r2, rINST, #8, #4 @ r2<- A 2498 GET_VREG r2, r2 @ r2<- fp[A] 2499 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer 2500 PREFETCH_INST 2 2501 bl artSet8InstanceFromMterp 2502 cmp r0, #0 2503 bne MterpPossibleException 2504 ADVANCE 2 @ advance rPC 2505 GET_INST_OPCODE ip @ extract opcode from rINST 2506 GOTO_OPCODE ip @ jump to next instruction 2507 2508 2509/* ------------------------------ */ 2510 .balign 128 2511.L_op_iput_byte: /* 0x5d */ 2512/* File: arm/op_iput_byte.S */ 2513/* File: arm/op_iput.S */ 2514 /* 2515 * General 32-bit instance field put. 2516 * 2517 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2518 */ 2519 /* op vA, vB, field@CCCC */ 2520 .extern artSet8InstanceFromMterp 2521 EXPORT_PC 2522 FETCH r0, 1 @ r0<- field ref CCCC 2523 mov r1, rINST, lsr #12 @ r1<- B 2524 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2525 ubfx r2, rINST, #8, #4 @ r2<- A 2526 GET_VREG r2, r2 @ r2<- fp[A] 2527 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer 2528 PREFETCH_INST 2 2529 bl artSet8InstanceFromMterp 2530 cmp r0, #0 2531 bne MterpPossibleException 2532 ADVANCE 2 @ advance rPC 2533 GET_INST_OPCODE ip @ extract opcode from rINST 2534 GOTO_OPCODE ip @ jump to next instruction 2535 2536 2537/* ------------------------------ */ 2538 .balign 128 2539.L_op_iput_char: /* 0x5e */ 2540/* File: arm/op_iput_char.S */ 2541/* File: arm/op_iput.S */ 2542 /* 2543 * General 32-bit instance field put. 2544 * 2545 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2546 */ 2547 /* op vA, vB, field@CCCC */ 2548 .extern artSet16InstanceFromMterp 2549 EXPORT_PC 2550 FETCH r0, 1 @ r0<- field ref CCCC 2551 mov r1, rINST, lsr #12 @ r1<- B 2552 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2553 ubfx r2, rINST, #8, #4 @ r2<- A 2554 GET_VREG r2, r2 @ r2<- fp[A] 2555 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer 2556 PREFETCH_INST 2 2557 bl artSet16InstanceFromMterp 2558 cmp r0, #0 2559 bne MterpPossibleException 2560 ADVANCE 2 @ advance rPC 2561 GET_INST_OPCODE ip @ extract opcode from rINST 2562 GOTO_OPCODE ip @ jump to next instruction 2563 2564 2565/* ------------------------------ */ 2566 .balign 128 2567.L_op_iput_short: /* 0x5f */ 2568/* File: arm/op_iput_short.S */ 2569/* File: arm/op_iput.S */ 2570 /* 2571 * General 32-bit instance field put. 2572 * 2573 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2574 */ 2575 /* op vA, vB, field@CCCC */ 2576 .extern artSet16InstanceFromMterp 2577 EXPORT_PC 2578 FETCH r0, 1 @ r0<- field ref CCCC 2579 mov r1, rINST, lsr #12 @ r1<- B 2580 GET_VREG r1, r1 @ r1<- fp[B], the object pointer 2581 ubfx r2, rINST, #8, #4 @ r2<- A 2582 GET_VREG r2, r2 @ r2<- fp[A] 2583 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer 2584 PREFETCH_INST 2 2585 bl artSet16InstanceFromMterp 2586 cmp r0, #0 2587 bne MterpPossibleException 2588 ADVANCE 2 @ advance rPC 2589 GET_INST_OPCODE ip @ extract opcode from rINST 2590 GOTO_OPCODE ip @ jump to next instruction 2591 2592 2593/* ------------------------------ */ 2594 .balign 128 2595.L_op_sget: /* 0x60 */ 2596/* File: arm/op_sget.S */ 2597 /* 2598 * General SGET handler wrapper. 2599 * 2600 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2601 */ 2602 /* op vAA, field@BBBB */ 2603 2604 .extern artGet32StaticFromCode 2605 EXPORT_PC 2606 FETCH r0, 1 @ r0<- field ref BBBB 2607 ldr r1, [rFP, #OFF_FP_METHOD] 2608 mov r2, rSELF 2609 bl artGet32StaticFromCode 2610 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2611 mov r2, rINST, lsr #8 @ r2<- AA 2612 PREFETCH_INST 2 2613 cmp r3, #0 @ Fail to resolve? 2614 bne MterpException @ bail out 2615.if 0 2616 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0 2617.else 2618 SET_VREG r0, r2 @ fp[AA]<- r0 2619.endif 2620 ADVANCE 2 2621 GET_INST_OPCODE ip @ extract opcode from rINST 2622 GOTO_OPCODE ip 2623 2624/* ------------------------------ */ 2625 .balign 128 2626.L_op_sget_wide: /* 0x61 */ 2627/* File: arm/op_sget_wide.S */ 2628 /* 2629 * SGET_WIDE handler wrapper. 2630 * 2631 */ 2632 /* sget-wide vAA, field@BBBB */ 2633 2634 .extern artGet64StaticFromCode 2635 EXPORT_PC 2636 FETCH r0, 1 @ r0<- field ref BBBB 2637 ldr r1, [rFP, #OFF_FP_METHOD] 2638 mov r2, rSELF 2639 bl artGet64StaticFromCode 2640 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2641 mov r9, rINST, lsr #8 @ r9<- AA 2642 VREG_INDEX_TO_ADDR lr, r9 @ r9<- &fp[AA] 2643 cmp r3, #0 @ Fail to resolve? 2644 bne MterpException @ bail out 2645 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2646 CLEAR_SHADOW_PAIR r9, r2, ip @ Zero out the shadow regs 2647 stmia lr, {r0-r1} @ vAA/vAA+1<- r0/r1 2648 GET_INST_OPCODE ip @ extract opcode from rINST 2649 GOTO_OPCODE ip @ jump to next instruction 2650 2651/* ------------------------------ */ 2652 .balign 128 2653.L_op_sget_object: /* 0x62 */ 2654/* File: arm/op_sget_object.S */ 2655/* File: arm/op_sget.S */ 2656 /* 2657 * General SGET handler wrapper. 2658 * 2659 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2660 */ 2661 /* op vAA, field@BBBB */ 2662 2663 .extern artGetObjStaticFromCode 2664 EXPORT_PC 2665 FETCH r0, 1 @ r0<- field ref BBBB 2666 ldr r1, [rFP, #OFF_FP_METHOD] 2667 mov r2, rSELF 2668 bl artGetObjStaticFromCode 2669 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2670 mov r2, rINST, lsr #8 @ r2<- AA 2671 PREFETCH_INST 2 2672 cmp r3, #0 @ Fail to resolve? 2673 bne MterpException @ bail out 2674.if 1 2675 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0 2676.else 2677 SET_VREG r0, r2 @ fp[AA]<- r0 2678.endif 2679 ADVANCE 2 2680 GET_INST_OPCODE ip @ extract opcode from rINST 2681 GOTO_OPCODE ip 2682 2683 2684/* ------------------------------ */ 2685 .balign 128 2686.L_op_sget_boolean: /* 0x63 */ 2687/* File: arm/op_sget_boolean.S */ 2688/* File: arm/op_sget.S */ 2689 /* 2690 * General SGET handler wrapper. 2691 * 2692 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2693 */ 2694 /* op vAA, field@BBBB */ 2695 2696 .extern artGetBooleanStaticFromCode 2697 EXPORT_PC 2698 FETCH r0, 1 @ r0<- field ref BBBB 2699 ldr r1, [rFP, #OFF_FP_METHOD] 2700 mov r2, rSELF 2701 bl artGetBooleanStaticFromCode 2702 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2703 mov r2, rINST, lsr #8 @ r2<- AA 2704 PREFETCH_INST 2 2705 cmp r3, #0 @ Fail to resolve? 2706 bne MterpException @ bail out 2707.if 0 2708 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0 2709.else 2710 SET_VREG r0, r2 @ fp[AA]<- r0 2711.endif 2712 ADVANCE 2 2713 GET_INST_OPCODE ip @ extract opcode from rINST 2714 GOTO_OPCODE ip 2715 2716 2717/* ------------------------------ */ 2718 .balign 128 2719.L_op_sget_byte: /* 0x64 */ 2720/* File: arm/op_sget_byte.S */ 2721/* File: arm/op_sget.S */ 2722 /* 2723 * General SGET handler wrapper. 2724 * 2725 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2726 */ 2727 /* op vAA, field@BBBB */ 2728 2729 .extern artGetByteStaticFromCode 2730 EXPORT_PC 2731 FETCH r0, 1 @ r0<- field ref BBBB 2732 ldr r1, [rFP, #OFF_FP_METHOD] 2733 mov r2, rSELF 2734 bl artGetByteStaticFromCode 2735 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2736 mov r2, rINST, lsr #8 @ r2<- AA 2737 PREFETCH_INST 2 2738 cmp r3, #0 @ Fail to resolve? 2739 bne MterpException @ bail out 2740.if 0 2741 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0 2742.else 2743 SET_VREG r0, r2 @ fp[AA]<- r0 2744.endif 2745 ADVANCE 2 2746 GET_INST_OPCODE ip @ extract opcode from rINST 2747 GOTO_OPCODE ip 2748 2749 2750/* ------------------------------ */ 2751 .balign 128 2752.L_op_sget_char: /* 0x65 */ 2753/* File: arm/op_sget_char.S */ 2754/* File: arm/op_sget.S */ 2755 /* 2756 * General SGET handler wrapper. 2757 * 2758 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2759 */ 2760 /* op vAA, field@BBBB */ 2761 2762 .extern artGetCharStaticFromCode 2763 EXPORT_PC 2764 FETCH r0, 1 @ r0<- field ref BBBB 2765 ldr r1, [rFP, #OFF_FP_METHOD] 2766 mov r2, rSELF 2767 bl artGetCharStaticFromCode 2768 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2769 mov r2, rINST, lsr #8 @ r2<- AA 2770 PREFETCH_INST 2 2771 cmp r3, #0 @ Fail to resolve? 2772 bne MterpException @ bail out 2773.if 0 2774 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0 2775.else 2776 SET_VREG r0, r2 @ fp[AA]<- r0 2777.endif 2778 ADVANCE 2 2779 GET_INST_OPCODE ip @ extract opcode from rINST 2780 GOTO_OPCODE ip 2781 2782 2783/* ------------------------------ */ 2784 .balign 128 2785.L_op_sget_short: /* 0x66 */ 2786/* File: arm/op_sget_short.S */ 2787/* File: arm/op_sget.S */ 2788 /* 2789 * General SGET handler wrapper. 2790 * 2791 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2792 */ 2793 /* op vAA, field@BBBB */ 2794 2795 .extern artGetShortStaticFromCode 2796 EXPORT_PC 2797 FETCH r0, 1 @ r0<- field ref BBBB 2798 ldr r1, [rFP, #OFF_FP_METHOD] 2799 mov r2, rSELF 2800 bl artGetShortStaticFromCode 2801 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 2802 mov r2, rINST, lsr #8 @ r2<- AA 2803 PREFETCH_INST 2 2804 cmp r3, #0 @ Fail to resolve? 2805 bne MterpException @ bail out 2806.if 0 2807 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0 2808.else 2809 SET_VREG r0, r2 @ fp[AA]<- r0 2810.endif 2811 ADVANCE 2 2812 GET_INST_OPCODE ip @ extract opcode from rINST 2813 GOTO_OPCODE ip 2814 2815 2816/* ------------------------------ */ 2817 .balign 128 2818.L_op_sput: /* 0x67 */ 2819/* File: arm/op_sput.S */ 2820 /* 2821 * General SPUT handler wrapper. 2822 * 2823 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2824 */ 2825 /* op vAA, field@BBBB */ 2826 EXPORT_PC 2827 FETCH r0, 1 @ r0<- field ref BBBB 2828 mov r3, rINST, lsr #8 @ r3<- AA 2829 GET_VREG r1, r3 @ r1<= fp[AA] 2830 ldr r2, [rFP, #OFF_FP_METHOD] 2831 mov r3, rSELF 2832 PREFETCH_INST 2 @ Get next inst, but don't advance rPC 2833 bl artSet32StaticFromCode 2834 cmp r0, #0 @ 0 on success, -1 on failure 2835 bne MterpException 2836 ADVANCE 2 @ Past exception point - now advance rPC 2837 GET_INST_OPCODE ip @ extract opcode from rINST 2838 GOTO_OPCODE ip @ jump to next instruction 2839 2840/* ------------------------------ */ 2841 .balign 128 2842.L_op_sput_wide: /* 0x68 */ 2843/* File: arm/op_sput_wide.S */ 2844 /* 2845 * SPUT_WIDE handler wrapper. 2846 * 2847 */ 2848 /* sput-wide vAA, field@BBBB */ 2849 .extern artSet64IndirectStaticFromMterp 2850 EXPORT_PC 2851 FETCH r0, 1 @ r0<- field ref BBBB 2852 ldr r1, [rFP, #OFF_FP_METHOD] 2853 mov r2, rINST, lsr #8 @ r3<- AA 2854 VREG_INDEX_TO_ADDR r2, r2 2855 mov r3, rSELF 2856 PREFETCH_INST 2 @ Get next inst, but don't advance rPC 2857 bl artSet64IndirectStaticFromMterp 2858 cmp r0, #0 @ 0 on success, -1 on failure 2859 bne MterpException 2860 ADVANCE 2 @ Past exception point - now advance rPC 2861 GET_INST_OPCODE ip @ extract opcode from rINST 2862 GOTO_OPCODE ip @ jump to next instruction 2863 2864/* ------------------------------ */ 2865 .balign 128 2866.L_op_sput_object: /* 0x69 */ 2867/* File: arm/op_sput_object.S */ 2868 EXPORT_PC 2869 add r0, rFP, #OFF_FP_SHADOWFRAME 2870 mov r1, rPC 2871 mov r2, rINST 2872 mov r3, rSELF 2873 bl MterpSputObject 2874 cmp r0, #0 2875 beq MterpException 2876 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 2877 GET_INST_OPCODE ip @ extract opcode from rINST 2878 GOTO_OPCODE ip @ jump to next instruction 2879 2880/* ------------------------------ */ 2881 .balign 128 2882.L_op_sput_boolean: /* 0x6a */ 2883/* File: arm/op_sput_boolean.S */ 2884/* File: arm/op_sput.S */ 2885 /* 2886 * General SPUT handler wrapper. 2887 * 2888 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2889 */ 2890 /* op vAA, field@BBBB */ 2891 EXPORT_PC 2892 FETCH r0, 1 @ r0<- field ref BBBB 2893 mov r3, rINST, lsr #8 @ r3<- AA 2894 GET_VREG r1, r3 @ r1<= fp[AA] 2895 ldr r2, [rFP, #OFF_FP_METHOD] 2896 mov r3, rSELF 2897 PREFETCH_INST 2 @ Get next inst, but don't advance rPC 2898 bl artSet8StaticFromCode 2899 cmp r0, #0 @ 0 on success, -1 on failure 2900 bne MterpException 2901 ADVANCE 2 @ Past exception point - now advance rPC 2902 GET_INST_OPCODE ip @ extract opcode from rINST 2903 GOTO_OPCODE ip @ jump to next instruction 2904 2905 2906/* ------------------------------ */ 2907 .balign 128 2908.L_op_sput_byte: /* 0x6b */ 2909/* File: arm/op_sput_byte.S */ 2910/* File: arm/op_sput.S */ 2911 /* 2912 * General SPUT handler wrapper. 2913 * 2914 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2915 */ 2916 /* op vAA, field@BBBB */ 2917 EXPORT_PC 2918 FETCH r0, 1 @ r0<- field ref BBBB 2919 mov r3, rINST, lsr #8 @ r3<- AA 2920 GET_VREG r1, r3 @ r1<= fp[AA] 2921 ldr r2, [rFP, #OFF_FP_METHOD] 2922 mov r3, rSELF 2923 PREFETCH_INST 2 @ Get next inst, but don't advance rPC 2924 bl artSet8StaticFromCode 2925 cmp r0, #0 @ 0 on success, -1 on failure 2926 bne MterpException 2927 ADVANCE 2 @ Past exception point - now advance rPC 2928 GET_INST_OPCODE ip @ extract opcode from rINST 2929 GOTO_OPCODE ip @ jump to next instruction 2930 2931 2932/* ------------------------------ */ 2933 .balign 128 2934.L_op_sput_char: /* 0x6c */ 2935/* File: arm/op_sput_char.S */ 2936/* File: arm/op_sput.S */ 2937 /* 2938 * General SPUT handler wrapper. 2939 * 2940 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2941 */ 2942 /* op vAA, field@BBBB */ 2943 EXPORT_PC 2944 FETCH r0, 1 @ r0<- field ref BBBB 2945 mov r3, rINST, lsr #8 @ r3<- AA 2946 GET_VREG r1, r3 @ r1<= fp[AA] 2947 ldr r2, [rFP, #OFF_FP_METHOD] 2948 mov r3, rSELF 2949 PREFETCH_INST 2 @ Get next inst, but don't advance rPC 2950 bl artSet16StaticFromCode 2951 cmp r0, #0 @ 0 on success, -1 on failure 2952 bne MterpException 2953 ADVANCE 2 @ Past exception point - now advance rPC 2954 GET_INST_OPCODE ip @ extract opcode from rINST 2955 GOTO_OPCODE ip @ jump to next instruction 2956 2957 2958/* ------------------------------ */ 2959 .balign 128 2960.L_op_sput_short: /* 0x6d */ 2961/* File: arm/op_sput_short.S */ 2962/* File: arm/op_sput.S */ 2963 /* 2964 * General SPUT handler wrapper. 2965 * 2966 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2967 */ 2968 /* op vAA, field@BBBB */ 2969 EXPORT_PC 2970 FETCH r0, 1 @ r0<- field ref BBBB 2971 mov r3, rINST, lsr #8 @ r3<- AA 2972 GET_VREG r1, r3 @ r1<= fp[AA] 2973 ldr r2, [rFP, #OFF_FP_METHOD] 2974 mov r3, rSELF 2975 PREFETCH_INST 2 @ Get next inst, but don't advance rPC 2976 bl artSet16StaticFromCode 2977 cmp r0, #0 @ 0 on success, -1 on failure 2978 bne MterpException 2979 ADVANCE 2 @ Past exception point - now advance rPC 2980 GET_INST_OPCODE ip @ extract opcode from rINST 2981 GOTO_OPCODE ip @ jump to next instruction 2982 2983 2984/* ------------------------------ */ 2985 .balign 128 2986.L_op_invoke_virtual: /* 0x6e */ 2987/* File: arm/op_invoke_virtual.S */ 2988/* File: arm/invoke.S */ 2989 /* 2990 * Generic invoke handler wrapper. 2991 */ 2992 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2993 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2994 .extern MterpInvokeVirtual 2995 EXPORT_PC 2996 mov r0, rSELF 2997 add r1, rFP, #OFF_FP_SHADOWFRAME 2998 mov r2, rPC 2999 mov r3, rINST 3000 bl MterpInvokeVirtual 3001 cmp r0, #0 3002 beq MterpException 3003 FETCH_ADVANCE_INST 3 3004 bl MterpShouldSwitchInterpreters 3005 cmp r0, #0 3006 bne MterpFallback 3007 GET_INST_OPCODE ip 3008 GOTO_OPCODE ip 3009 3010 3011 /* 3012 * Handle a virtual method call. 3013 * 3014 * for: invoke-virtual, invoke-virtual/range 3015 */ 3016 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3017 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3018 3019/* ------------------------------ */ 3020 .balign 128 3021.L_op_invoke_super: /* 0x6f */ 3022/* File: arm/op_invoke_super.S */ 3023/* File: arm/invoke.S */ 3024 /* 3025 * Generic invoke handler wrapper. 3026 */ 3027 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3028 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3029 .extern MterpInvokeSuper 3030 EXPORT_PC 3031 mov r0, rSELF 3032 add r1, rFP, #OFF_FP_SHADOWFRAME 3033 mov r2, rPC 3034 mov r3, rINST 3035 bl MterpInvokeSuper 3036 cmp r0, #0 3037 beq MterpException 3038 FETCH_ADVANCE_INST 3 3039 bl MterpShouldSwitchInterpreters 3040 cmp r0, #0 3041 bne MterpFallback 3042 GET_INST_OPCODE ip 3043 GOTO_OPCODE ip 3044 3045 3046 /* 3047 * Handle a "super" method call. 3048 * 3049 * for: invoke-super, invoke-super/range 3050 */ 3051 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3052 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3053 3054/* ------------------------------ */ 3055 .balign 128 3056.L_op_invoke_direct: /* 0x70 */ 3057/* File: arm/op_invoke_direct.S */ 3058/* File: arm/invoke.S */ 3059 /* 3060 * Generic invoke handler wrapper. 3061 */ 3062 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3063 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3064 .extern MterpInvokeDirect 3065 EXPORT_PC 3066 mov r0, rSELF 3067 add r1, rFP, #OFF_FP_SHADOWFRAME 3068 mov r2, rPC 3069 mov r3, rINST 3070 bl MterpInvokeDirect 3071 cmp r0, #0 3072 beq MterpException 3073 FETCH_ADVANCE_INST 3 3074 bl MterpShouldSwitchInterpreters 3075 cmp r0, #0 3076 bne MterpFallback 3077 GET_INST_OPCODE ip 3078 GOTO_OPCODE ip 3079 3080 3081 3082/* ------------------------------ */ 3083 .balign 128 3084.L_op_invoke_static: /* 0x71 */ 3085/* File: arm/op_invoke_static.S */ 3086/* File: arm/invoke.S */ 3087 /* 3088 * Generic invoke handler wrapper. 3089 */ 3090 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3091 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3092 .extern MterpInvokeStatic 3093 EXPORT_PC 3094 mov r0, rSELF 3095 add r1, rFP, #OFF_FP_SHADOWFRAME 3096 mov r2, rPC 3097 mov r3, rINST 3098 bl MterpInvokeStatic 3099 cmp r0, #0 3100 beq MterpException 3101 FETCH_ADVANCE_INST 3 3102 bl MterpShouldSwitchInterpreters 3103 cmp r0, #0 3104 bne MterpFallback 3105 GET_INST_OPCODE ip 3106 GOTO_OPCODE ip 3107 3108 3109 3110 3111/* ------------------------------ */ 3112 .balign 128 3113.L_op_invoke_interface: /* 0x72 */ 3114/* File: arm/op_invoke_interface.S */ 3115/* File: arm/invoke.S */ 3116 /* 3117 * Generic invoke handler wrapper. 3118 */ 3119 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3120 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3121 .extern MterpInvokeInterface 3122 EXPORT_PC 3123 mov r0, rSELF 3124 add r1, rFP, #OFF_FP_SHADOWFRAME 3125 mov r2, rPC 3126 mov r3, rINST 3127 bl MterpInvokeInterface 3128 cmp r0, #0 3129 beq MterpException 3130 FETCH_ADVANCE_INST 3 3131 bl MterpShouldSwitchInterpreters 3132 cmp r0, #0 3133 bne MterpFallback 3134 GET_INST_OPCODE ip 3135 GOTO_OPCODE ip 3136 3137 3138 /* 3139 * Handle an interface method call. 3140 * 3141 * for: invoke-interface, invoke-interface/range 3142 */ 3143 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3144 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3145 3146/* ------------------------------ */ 3147 .balign 128 3148.L_op_return_void_no_barrier: /* 0x73 */ 3149/* File: arm/op_return_void_no_barrier.S */ 3150 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET] 3151 mov r0, rSELF 3152 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 3153 blne MterpSuspendCheck @ (self) 3154 mov r0, #0 3155 mov r1, #0 3156 b MterpReturn 3157 3158/* ------------------------------ */ 3159 .balign 128 3160.L_op_invoke_virtual_range: /* 0x74 */ 3161/* File: arm/op_invoke_virtual_range.S */ 3162/* File: arm/invoke.S */ 3163 /* 3164 * Generic invoke handler wrapper. 3165 */ 3166 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3167 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3168 .extern MterpInvokeVirtualRange 3169 EXPORT_PC 3170 mov r0, rSELF 3171 add r1, rFP, #OFF_FP_SHADOWFRAME 3172 mov r2, rPC 3173 mov r3, rINST 3174 bl MterpInvokeVirtualRange 3175 cmp r0, #0 3176 beq MterpException 3177 FETCH_ADVANCE_INST 3 3178 bl MterpShouldSwitchInterpreters 3179 cmp r0, #0 3180 bne MterpFallback 3181 GET_INST_OPCODE ip 3182 GOTO_OPCODE ip 3183 3184 3185 3186/* ------------------------------ */ 3187 .balign 128 3188.L_op_invoke_super_range: /* 0x75 */ 3189/* File: arm/op_invoke_super_range.S */ 3190/* File: arm/invoke.S */ 3191 /* 3192 * Generic invoke handler wrapper. 3193 */ 3194 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3195 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3196 .extern MterpInvokeSuperRange 3197 EXPORT_PC 3198 mov r0, rSELF 3199 add r1, rFP, #OFF_FP_SHADOWFRAME 3200 mov r2, rPC 3201 mov r3, rINST 3202 bl MterpInvokeSuperRange 3203 cmp r0, #0 3204 beq MterpException 3205 FETCH_ADVANCE_INST 3 3206 bl MterpShouldSwitchInterpreters 3207 cmp r0, #0 3208 bne MterpFallback 3209 GET_INST_OPCODE ip 3210 GOTO_OPCODE ip 3211 3212 3213 3214/* ------------------------------ */ 3215 .balign 128 3216.L_op_invoke_direct_range: /* 0x76 */ 3217/* File: arm/op_invoke_direct_range.S */ 3218/* File: arm/invoke.S */ 3219 /* 3220 * Generic invoke handler wrapper. 3221 */ 3222 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3223 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3224 .extern MterpInvokeDirectRange 3225 EXPORT_PC 3226 mov r0, rSELF 3227 add r1, rFP, #OFF_FP_SHADOWFRAME 3228 mov r2, rPC 3229 mov r3, rINST 3230 bl MterpInvokeDirectRange 3231 cmp r0, #0 3232 beq MterpException 3233 FETCH_ADVANCE_INST 3 3234 bl MterpShouldSwitchInterpreters 3235 cmp r0, #0 3236 bne MterpFallback 3237 GET_INST_OPCODE ip 3238 GOTO_OPCODE ip 3239 3240 3241 3242/* ------------------------------ */ 3243 .balign 128 3244.L_op_invoke_static_range: /* 0x77 */ 3245/* File: arm/op_invoke_static_range.S */ 3246/* File: arm/invoke.S */ 3247 /* 3248 * Generic invoke handler wrapper. 3249 */ 3250 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3251 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3252 .extern MterpInvokeStaticRange 3253 EXPORT_PC 3254 mov r0, rSELF 3255 add r1, rFP, #OFF_FP_SHADOWFRAME 3256 mov r2, rPC 3257 mov r3, rINST 3258 bl MterpInvokeStaticRange 3259 cmp r0, #0 3260 beq MterpException 3261 FETCH_ADVANCE_INST 3 3262 bl MterpShouldSwitchInterpreters 3263 cmp r0, #0 3264 bne MterpFallback 3265 GET_INST_OPCODE ip 3266 GOTO_OPCODE ip 3267 3268 3269 3270/* ------------------------------ */ 3271 .balign 128 3272.L_op_invoke_interface_range: /* 0x78 */ 3273/* File: arm/op_invoke_interface_range.S */ 3274/* File: arm/invoke.S */ 3275 /* 3276 * Generic invoke handler wrapper. 3277 */ 3278 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3279 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3280 .extern MterpInvokeInterfaceRange 3281 EXPORT_PC 3282 mov r0, rSELF 3283 add r1, rFP, #OFF_FP_SHADOWFRAME 3284 mov r2, rPC 3285 mov r3, rINST 3286 bl MterpInvokeInterfaceRange 3287 cmp r0, #0 3288 beq MterpException 3289 FETCH_ADVANCE_INST 3 3290 bl MterpShouldSwitchInterpreters 3291 cmp r0, #0 3292 bne MterpFallback 3293 GET_INST_OPCODE ip 3294 GOTO_OPCODE ip 3295 3296 3297 3298/* ------------------------------ */ 3299 .balign 128 3300.L_op_unused_79: /* 0x79 */ 3301/* File: arm/op_unused_79.S */ 3302/* File: arm/unused.S */ 3303/* 3304 * Bail to reference interpreter to throw. 3305 */ 3306 b MterpFallback 3307 3308 3309/* ------------------------------ */ 3310 .balign 128 3311.L_op_unused_7a: /* 0x7a */ 3312/* File: arm/op_unused_7a.S */ 3313/* File: arm/unused.S */ 3314/* 3315 * Bail to reference interpreter to throw. 3316 */ 3317 b MterpFallback 3318 3319 3320/* ------------------------------ */ 3321 .balign 128 3322.L_op_neg_int: /* 0x7b */ 3323/* File: arm/op_neg_int.S */ 3324/* File: arm/unop.S */ 3325 /* 3326 * Generic 32-bit unary operation. Provide an "instr" line that 3327 * specifies an instruction that performs "result = op r0". 3328 * This could be an ARM instruction or a function call. 3329 * 3330 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3331 * int-to-byte, int-to-char, int-to-short 3332 */ 3333 /* unop vA, vB */ 3334 mov r3, rINST, lsr #12 @ r3<- B 3335 ubfx r9, rINST, #8, #4 @ r9<- A 3336 GET_VREG r0, r3 @ r0<- vB 3337 @ optional op; may set condition codes 3338 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3339 rsb r0, r0, #0 @ r0<- op, r0-r3 changed 3340 GET_INST_OPCODE ip @ extract opcode from rINST 3341 SET_VREG r0, r9 @ vAA<- r0 3342 GOTO_OPCODE ip @ jump to next instruction 3343 /* 8-9 instructions */ 3344 3345 3346/* ------------------------------ */ 3347 .balign 128 3348.L_op_not_int: /* 0x7c */ 3349/* File: arm/op_not_int.S */ 3350/* File: arm/unop.S */ 3351 /* 3352 * Generic 32-bit unary operation. Provide an "instr" line that 3353 * specifies an instruction that performs "result = op r0". 3354 * This could be an ARM instruction or a function call. 3355 * 3356 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3357 * int-to-byte, int-to-char, int-to-short 3358 */ 3359 /* unop vA, vB */ 3360 mov r3, rINST, lsr #12 @ r3<- B 3361 ubfx r9, rINST, #8, #4 @ r9<- A 3362 GET_VREG r0, r3 @ r0<- vB 3363 @ optional op; may set condition codes 3364 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3365 mvn r0, r0 @ r0<- op, r0-r3 changed 3366 GET_INST_OPCODE ip @ extract opcode from rINST 3367 SET_VREG r0, r9 @ vAA<- r0 3368 GOTO_OPCODE ip @ jump to next instruction 3369 /* 8-9 instructions */ 3370 3371 3372/* ------------------------------ */ 3373 .balign 128 3374.L_op_neg_long: /* 0x7d */ 3375/* File: arm/op_neg_long.S */ 3376/* File: arm/unopWide.S */ 3377 /* 3378 * Generic 64-bit unary operation. Provide an "instr" line that 3379 * specifies an instruction that performs "result = op r0/r1". 3380 * This could be an ARM instruction or a function call. 3381 * 3382 * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3383 */ 3384 /* unop vA, vB */ 3385 mov r3, rINST, lsr #12 @ r3<- B 3386 ubfx rINST, rINST, #8, #4 @ rINST<- A 3387 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] 3388 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 3389 ldmia r3, {r0-r1} @ r0/r1<- vAA 3390 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 3391 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3392 rsbs r0, r0, #0 @ optional op; may set condition codes 3393 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed 3394 GET_INST_OPCODE ip @ extract opcode from rINST 3395 stmia r9, {r0-r1} @ vAA<- r0/r1 3396 GOTO_OPCODE ip @ jump to next instruction 3397 /* 10-11 instructions */ 3398 3399 3400/* ------------------------------ */ 3401 .balign 128 3402.L_op_not_long: /* 0x7e */ 3403/* File: arm/op_not_long.S */ 3404/* File: arm/unopWide.S */ 3405 /* 3406 * Generic 64-bit unary operation. Provide an "instr" line that 3407 * specifies an instruction that performs "result = op r0/r1". 3408 * This could be an ARM instruction or a function call. 3409 * 3410 * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3411 */ 3412 /* unop vA, vB */ 3413 mov r3, rINST, lsr #12 @ r3<- B 3414 ubfx rINST, rINST, #8, #4 @ rINST<- A 3415 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] 3416 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 3417 ldmia r3, {r0-r1} @ r0/r1<- vAA 3418 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 3419 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3420 mvn r0, r0 @ optional op; may set condition codes 3421 mvn r1, r1 @ r0/r1<- op, r2-r3 changed 3422 GET_INST_OPCODE ip @ extract opcode from rINST 3423 stmia r9, {r0-r1} @ vAA<- r0/r1 3424 GOTO_OPCODE ip @ jump to next instruction 3425 /* 10-11 instructions */ 3426 3427 3428/* ------------------------------ */ 3429 .balign 128 3430.L_op_neg_float: /* 0x7f */ 3431/* File: arm/op_neg_float.S */ 3432/* File: arm/unop.S */ 3433 /* 3434 * Generic 32-bit unary operation. Provide an "instr" line that 3435 * specifies an instruction that performs "result = op r0". 3436 * This could be an ARM instruction or a function call. 3437 * 3438 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3439 * int-to-byte, int-to-char, int-to-short 3440 */ 3441 /* unop vA, vB */ 3442 mov r3, rINST, lsr #12 @ r3<- B 3443 ubfx r9, rINST, #8, #4 @ r9<- A 3444 GET_VREG r0, r3 @ r0<- vB 3445 @ optional op; may set condition codes 3446 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3447 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed 3448 GET_INST_OPCODE ip @ extract opcode from rINST 3449 SET_VREG r0, r9 @ vAA<- r0 3450 GOTO_OPCODE ip @ jump to next instruction 3451 /* 8-9 instructions */ 3452 3453 3454/* ------------------------------ */ 3455 .balign 128 3456.L_op_neg_double: /* 0x80 */ 3457/* File: arm/op_neg_double.S */ 3458/* File: arm/unopWide.S */ 3459 /* 3460 * Generic 64-bit unary operation. Provide an "instr" line that 3461 * specifies an instruction that performs "result = op r0/r1". 3462 * This could be an ARM instruction or a function call. 3463 * 3464 * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3465 */ 3466 /* unop vA, vB */ 3467 mov r3, rINST, lsr #12 @ r3<- B 3468 ubfx rINST, rINST, #8, #4 @ rINST<- A 3469 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] 3470 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 3471 ldmia r3, {r0-r1} @ r0/r1<- vAA 3472 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 3473 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3474 @ optional op; may set condition codes 3475 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed 3476 GET_INST_OPCODE ip @ extract opcode from rINST 3477 stmia r9, {r0-r1} @ vAA<- r0/r1 3478 GOTO_OPCODE ip @ jump to next instruction 3479 /* 10-11 instructions */ 3480 3481 3482/* ------------------------------ */ 3483 .balign 128 3484.L_op_int_to_long: /* 0x81 */ 3485/* File: arm/op_int_to_long.S */ 3486/* File: arm/unopWider.S */ 3487 /* 3488 * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3489 * that specifies an instruction that performs "result = op r0", where 3490 * "result" is a 64-bit quantity in r0/r1. 3491 * 3492 * For: int-to-long, int-to-double, float-to-long, float-to-double 3493 */ 3494 /* unop vA, vB */ 3495 mov r3, rINST, lsr #12 @ r3<- B 3496 ubfx rINST, rINST, #8, #4 @ rINST<- A 3497 GET_VREG r0, r3 @ r0<- vB 3498 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 3499 @ optional op; may set condition codes 3500 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 3501 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3502 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed 3503 GET_INST_OPCODE ip @ extract opcode from rINST 3504 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3505 GOTO_OPCODE ip @ jump to next instruction 3506 /* 9-10 instructions */ 3507 3508 3509/* ------------------------------ */ 3510 .balign 128 3511.L_op_int_to_float: /* 0x82 */ 3512/* File: arm/op_int_to_float.S */ 3513/* File: arm/funop.S */ 3514 /* 3515 * Generic 32-bit unary floating-point operation. Provide an "instr" 3516 * line that specifies an instruction that performs "s1 = op s0". 3517 * 3518 * for: int-to-float, float-to-int 3519 */ 3520 /* unop vA, vB */ 3521 mov r3, rINST, lsr #12 @ r3<- B 3522 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 3523 flds s0, [r3] @ s0<- vB 3524 ubfx r9, rINST, #8, #4 @ r9<- A 3525 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3526 fsitos s1, s0 @ s1<- op 3527 GET_INST_OPCODE ip @ extract opcode from rINST 3528 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 3529 fsts s1, [r9] @ vA<- s1 3530 GOTO_OPCODE ip @ jump to next instruction 3531 3532 3533/* ------------------------------ */ 3534 .balign 128 3535.L_op_int_to_double: /* 0x83 */ 3536/* File: arm/op_int_to_double.S */ 3537/* File: arm/funopWider.S */ 3538 /* 3539 * Generic 32bit-to-64bit floating point unary operation. Provide an 3540 * "instr" line that specifies an instruction that performs "d0 = op s0". 3541 * 3542 * For: int-to-double, float-to-double 3543 */ 3544 /* unop vA, vB */ 3545 mov r3, rINST, lsr #12 @ r3<- B 3546 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 3547 flds s0, [r3] @ s0<- vB 3548 ubfx r9, rINST, #8, #4 @ r9<- A 3549 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3550 fsitod d0, s0 @ d0<- op 3551 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs 3552 GET_INST_OPCODE ip @ extract opcode from rINST 3553 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 3554 fstd d0, [r9] @ vA<- d0 3555 GOTO_OPCODE ip @ jump to next instruction 3556 3557 3558/* ------------------------------ */ 3559 .balign 128 3560.L_op_long_to_int: /* 0x84 */ 3561/* File: arm/op_long_to_int.S */ 3562/* we ignore the high word, making this equivalent to a 32-bit reg move */ 3563/* File: arm/op_move.S */ 3564 /* for move, move-object, long-to-int */ 3565 /* op vA, vB */ 3566 mov r1, rINST, lsr #12 @ r1<- B from 15:12 3567 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 3568 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3569 GET_VREG r2, r1 @ r2<- fp[B] 3570 GET_INST_OPCODE ip @ ip<- opcode from rINST 3571 .if 0 3572 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2 3573 .else 3574 SET_VREG r2, r0 @ fp[A]<- r2 3575 .endif 3576 GOTO_OPCODE ip @ execute next instruction 3577 3578 3579/* ------------------------------ */ 3580 .balign 128 3581.L_op_long_to_float: /* 0x85 */ 3582/* File: arm/op_long_to_float.S */ 3583/* File: arm/unopNarrower.S */ 3584 /* 3585 * Generic 64bit-to-32bit unary operation. Provide an "instr" line 3586 * that specifies an instruction that performs "result = op r0/r1", where 3587 * "result" is a 32-bit quantity in r0. 3588 * 3589 * For: long-to-float, double-to-int, double-to-float 3590 * 3591 * (This would work for long-to-int, but that instruction is actually 3592 * an exact match for op_move.) 3593 */ 3594 /* unop vA, vB */ 3595 mov r3, rINST, lsr #12 @ r3<- B 3596 ubfx r9, rINST, #8, #4 @ r9<- A 3597 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] 3598 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1 3599 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3600 @ optional op; may set condition codes 3601 bl __aeabi_l2f @ r0<- op, r0-r3 changed 3602 GET_INST_OPCODE ip @ extract opcode from rINST 3603 SET_VREG r0, r9 @ vA<- r0 3604 GOTO_OPCODE ip @ jump to next instruction 3605 /* 9-10 instructions */ 3606 3607 3608/* ------------------------------ */ 3609 .balign 128 3610.L_op_long_to_double: /* 0x86 */ 3611/* File: arm/op_long_to_double.S */ 3612 /* 3613 * Specialised 64-bit floating point operation. 3614 * 3615 * Note: The result will be returned in d2. 3616 * 3617 * For: long-to-double 3618 */ 3619 mov r3, rINST, lsr #12 @ r3<- B 3620 ubfx r9, rINST, #8, #4 @ r9<- A 3621 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] 3622 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A] 3623 vldr d0, [r3] @ d0<- vAA 3624 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3625 3626 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh) 3627 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl) 3628 vldr d3, constvalop_long_to_double 3629 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl 3630 3631 GET_INST_OPCODE ip @ extract opcode from rINST 3632 vstr.64 d2, [r9] @ vAA<- d2 3633 GOTO_OPCODE ip @ jump to next instruction 3634 3635 /* literal pool helper */ 3636constvalop_long_to_double: 3637 .8byte 0x41f0000000000000 3638 3639/* ------------------------------ */ 3640 .balign 128 3641.L_op_float_to_int: /* 0x87 */ 3642/* File: arm/op_float_to_int.S */ 3643/* File: arm/funop.S */ 3644 /* 3645 * Generic 32-bit unary floating-point operation. Provide an "instr" 3646 * line that specifies an instruction that performs "s1 = op s0". 3647 * 3648 * for: int-to-float, float-to-int 3649 */ 3650 /* unop vA, vB */ 3651 mov r3, rINST, lsr #12 @ r3<- B 3652 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 3653 flds s0, [r3] @ s0<- vB 3654 ubfx r9, rINST, #8, #4 @ r9<- A 3655 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3656 ftosizs s1, s0 @ s1<- op 3657 GET_INST_OPCODE ip @ extract opcode from rINST 3658 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 3659 fsts s1, [r9] @ vA<- s1 3660 GOTO_OPCODE ip @ jump to next instruction 3661 3662 3663/* ------------------------------ */ 3664 .balign 128 3665.L_op_float_to_long: /* 0x88 */ 3666/* File: arm/op_float_to_long.S */ 3667@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"} 3668/* File: arm/unopWider.S */ 3669 /* 3670 * Generic 32bit-to-64bit unary operation. Provide an "instr" line 3671 * that specifies an instruction that performs "result = op r0", where 3672 * "result" is a 64-bit quantity in r0/r1. 3673 * 3674 * For: int-to-long, int-to-double, float-to-long, float-to-double 3675 */ 3676 /* unop vA, vB */ 3677 mov r3, rINST, lsr #12 @ r3<- B 3678 ubfx rINST, rINST, #8, #4 @ rINST<- A 3679 GET_VREG r0, r3 @ r0<- vB 3680 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 3681 @ optional op; may set condition codes 3682 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 3683 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3684 bl f2l_doconv @ r0<- op, r0-r3 changed 3685 GET_INST_OPCODE ip @ extract opcode from rINST 3686 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1 3687 GOTO_OPCODE ip @ jump to next instruction 3688 /* 9-10 instructions */ 3689 3690 3691 3692/* ------------------------------ */ 3693 .balign 128 3694.L_op_float_to_double: /* 0x89 */ 3695/* File: arm/op_float_to_double.S */ 3696/* File: arm/funopWider.S */ 3697 /* 3698 * Generic 32bit-to-64bit floating point unary operation. Provide an 3699 * "instr" line that specifies an instruction that performs "d0 = op s0". 3700 * 3701 * For: int-to-double, float-to-double 3702 */ 3703 /* unop vA, vB */ 3704 mov r3, rINST, lsr #12 @ r3<- B 3705 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 3706 flds s0, [r3] @ s0<- vB 3707 ubfx r9, rINST, #8, #4 @ r9<- A 3708 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3709 vcvt.f64.f32 d0, s0 @ d0<- op 3710 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs 3711 GET_INST_OPCODE ip @ extract opcode from rINST 3712 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 3713 fstd d0, [r9] @ vA<- d0 3714 GOTO_OPCODE ip @ jump to next instruction 3715 3716 3717/* ------------------------------ */ 3718 .balign 128 3719.L_op_double_to_int: /* 0x8a */ 3720/* File: arm/op_double_to_int.S */ 3721/* File: arm/funopNarrower.S */ 3722 /* 3723 * Generic 64bit-to-32bit unary floating point operation. Provide an 3724 * "instr" line that specifies an instruction that performs "s0 = op d0". 3725 * 3726 * For: double-to-int, double-to-float 3727 */ 3728 /* unop vA, vB */ 3729 mov r3, rINST, lsr #12 @ r3<- B 3730 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 3731 fldd d0, [r3] @ d0<- vB 3732 ubfx r9, rINST, #8, #4 @ r9<- A 3733 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3734 ftosizd s0, d0 @ s0<- op 3735 GET_INST_OPCODE ip @ extract opcode from rINST 3736 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 3737 fsts s0, [r9] @ vA<- s0 3738 GOTO_OPCODE ip @ jump to next instruction 3739 3740 3741/* ------------------------------ */ 3742 .balign 128 3743.L_op_double_to_long: /* 0x8b */ 3744/* File: arm/op_double_to_long.S */ 3745@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"} 3746/* File: arm/unopWide.S */ 3747 /* 3748 * Generic 64-bit unary operation. Provide an "instr" line that 3749 * specifies an instruction that performs "result = op r0/r1". 3750 * This could be an ARM instruction or a function call. 3751 * 3752 * For: neg-long, not-long, neg-double, long-to-double, double-to-long 3753 */ 3754 /* unop vA, vB */ 3755 mov r3, rINST, lsr #12 @ r3<- B 3756 ubfx rINST, rINST, #8, #4 @ rINST<- A 3757 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] 3758 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 3759 ldmia r3, {r0-r1} @ r0/r1<- vAA 3760 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 3761 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3762 @ optional op; may set condition codes 3763 bl d2l_doconv @ r0/r1<- op, r2-r3 changed 3764 GET_INST_OPCODE ip @ extract opcode from rINST 3765 stmia r9, {r0-r1} @ vAA<- r0/r1 3766 GOTO_OPCODE ip @ jump to next instruction 3767 /* 10-11 instructions */ 3768 3769 3770 3771/* ------------------------------ */ 3772 .balign 128 3773.L_op_double_to_float: /* 0x8c */ 3774/* File: arm/op_double_to_float.S */ 3775/* File: arm/funopNarrower.S */ 3776 /* 3777 * Generic 64bit-to-32bit unary floating point operation. Provide an 3778 * "instr" line that specifies an instruction that performs "s0 = op d0". 3779 * 3780 * For: double-to-int, double-to-float 3781 */ 3782 /* unop vA, vB */ 3783 mov r3, rINST, lsr #12 @ r3<- B 3784 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 3785 fldd d0, [r3] @ d0<- vB 3786 ubfx r9, rINST, #8, #4 @ r9<- A 3787 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3788 vcvt.f32.f64 s0, d0 @ s0<- op 3789 GET_INST_OPCODE ip @ extract opcode from rINST 3790 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 3791 fsts s0, [r9] @ vA<- s0 3792 GOTO_OPCODE ip @ jump to next instruction 3793 3794 3795/* ------------------------------ */ 3796 .balign 128 3797.L_op_int_to_byte: /* 0x8d */ 3798/* File: arm/op_int_to_byte.S */ 3799/* File: arm/unop.S */ 3800 /* 3801 * Generic 32-bit unary operation. Provide an "instr" line that 3802 * specifies an instruction that performs "result = op r0". 3803 * This could be an ARM instruction or a function call. 3804 * 3805 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3806 * int-to-byte, int-to-char, int-to-short 3807 */ 3808 /* unop vA, vB */ 3809 mov r3, rINST, lsr #12 @ r3<- B 3810 ubfx r9, rINST, #8, #4 @ r9<- A 3811 GET_VREG r0, r3 @ r0<- vB 3812 @ optional op; may set condition codes 3813 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3814 sxtb r0, r0 @ r0<- op, r0-r3 changed 3815 GET_INST_OPCODE ip @ extract opcode from rINST 3816 SET_VREG r0, r9 @ vAA<- r0 3817 GOTO_OPCODE ip @ jump to next instruction 3818 /* 8-9 instructions */ 3819 3820 3821/* ------------------------------ */ 3822 .balign 128 3823.L_op_int_to_char: /* 0x8e */ 3824/* File: arm/op_int_to_char.S */ 3825/* File: arm/unop.S */ 3826 /* 3827 * Generic 32-bit unary operation. Provide an "instr" line that 3828 * specifies an instruction that performs "result = op r0". 3829 * This could be an ARM instruction or a function call. 3830 * 3831 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3832 * int-to-byte, int-to-char, int-to-short 3833 */ 3834 /* unop vA, vB */ 3835 mov r3, rINST, lsr #12 @ r3<- B 3836 ubfx r9, rINST, #8, #4 @ r9<- A 3837 GET_VREG r0, r3 @ r0<- vB 3838 @ optional op; may set condition codes 3839 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3840 uxth r0, r0 @ r0<- op, r0-r3 changed 3841 GET_INST_OPCODE ip @ extract opcode from rINST 3842 SET_VREG r0, r9 @ vAA<- r0 3843 GOTO_OPCODE ip @ jump to next instruction 3844 /* 8-9 instructions */ 3845 3846 3847/* ------------------------------ */ 3848 .balign 128 3849.L_op_int_to_short: /* 0x8f */ 3850/* File: arm/op_int_to_short.S */ 3851/* File: arm/unop.S */ 3852 /* 3853 * Generic 32-bit unary operation. Provide an "instr" line that 3854 * specifies an instruction that performs "result = op r0". 3855 * This could be an ARM instruction or a function call. 3856 * 3857 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3858 * int-to-byte, int-to-char, int-to-short 3859 */ 3860 /* unop vA, vB */ 3861 mov r3, rINST, lsr #12 @ r3<- B 3862 ubfx r9, rINST, #8, #4 @ r9<- A 3863 GET_VREG r0, r3 @ r0<- vB 3864 @ optional op; may set condition codes 3865 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 3866 sxth r0, r0 @ r0<- op, r0-r3 changed 3867 GET_INST_OPCODE ip @ extract opcode from rINST 3868 SET_VREG r0, r9 @ vAA<- r0 3869 GOTO_OPCODE ip @ jump to next instruction 3870 /* 8-9 instructions */ 3871 3872 3873/* ------------------------------ */ 3874 .balign 128 3875.L_op_add_int: /* 0x90 */ 3876/* File: arm/op_add_int.S */ 3877/* File: arm/binop.S */ 3878 /* 3879 * Generic 32-bit binary operation. Provide an "instr" line that 3880 * specifies an instruction that performs "result = r0 op r1". 3881 * This could be an ARM instruction or a function call. (If the result 3882 * comes back in a register other than r0, you can override "result".) 3883 * 3884 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3885 * vCC (r1). Useful for integer division and modulus. Note that we 3886 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3887 * handles it correctly. 3888 * 3889 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3890 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3891 * mul-float, div-float, rem-float 3892 */ 3893 /* binop vAA, vBB, vCC */ 3894 FETCH r0, 1 @ r0<- CCBB 3895 mov r9, rINST, lsr #8 @ r9<- AA 3896 mov r3, r0, lsr #8 @ r3<- CC 3897 and r2, r0, #255 @ r2<- BB 3898 GET_VREG r1, r3 @ r1<- vCC 3899 GET_VREG r0, r2 @ r0<- vBB 3900 .if 0 3901 cmp r1, #0 @ is second operand zero? 3902 beq common_errDivideByZero 3903 .endif 3904 3905 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 3906 @ optional op; may set condition codes 3907 add r0, r0, r1 @ r0<- op, r0-r3 changed 3908 GET_INST_OPCODE ip @ extract opcode from rINST 3909 SET_VREG r0, r9 @ vAA<- r0 3910 GOTO_OPCODE ip @ jump to next instruction 3911 /* 11-14 instructions */ 3912 3913 3914/* ------------------------------ */ 3915 .balign 128 3916.L_op_sub_int: /* 0x91 */ 3917/* File: arm/op_sub_int.S */ 3918/* File: arm/binop.S */ 3919 /* 3920 * Generic 32-bit binary operation. Provide an "instr" line that 3921 * specifies an instruction that performs "result = r0 op r1". 3922 * This could be an ARM instruction or a function call. (If the result 3923 * comes back in a register other than r0, you can override "result".) 3924 * 3925 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3926 * vCC (r1). Useful for integer division and modulus. Note that we 3927 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3928 * handles it correctly. 3929 * 3930 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3931 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3932 * mul-float, div-float, rem-float 3933 */ 3934 /* binop vAA, vBB, vCC */ 3935 FETCH r0, 1 @ r0<- CCBB 3936 mov r9, rINST, lsr #8 @ r9<- AA 3937 mov r3, r0, lsr #8 @ r3<- CC 3938 and r2, r0, #255 @ r2<- BB 3939 GET_VREG r1, r3 @ r1<- vCC 3940 GET_VREG r0, r2 @ r0<- vBB 3941 .if 0 3942 cmp r1, #0 @ is second operand zero? 3943 beq common_errDivideByZero 3944 .endif 3945 3946 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 3947 @ optional op; may set condition codes 3948 sub r0, r0, r1 @ r0<- op, r0-r3 changed 3949 GET_INST_OPCODE ip @ extract opcode from rINST 3950 SET_VREG r0, r9 @ vAA<- r0 3951 GOTO_OPCODE ip @ jump to next instruction 3952 /* 11-14 instructions */ 3953 3954 3955/* ------------------------------ */ 3956 .balign 128 3957.L_op_mul_int: /* 0x92 */ 3958/* File: arm/op_mul_int.S */ 3959/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 3960/* File: arm/binop.S */ 3961 /* 3962 * Generic 32-bit binary operation. Provide an "instr" line that 3963 * specifies an instruction that performs "result = r0 op r1". 3964 * This could be an ARM instruction or a function call. (If the result 3965 * comes back in a register other than r0, you can override "result".) 3966 * 3967 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3968 * vCC (r1). Useful for integer division and modulus. Note that we 3969 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3970 * handles it correctly. 3971 * 3972 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3973 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3974 * mul-float, div-float, rem-float 3975 */ 3976 /* binop vAA, vBB, vCC */ 3977 FETCH r0, 1 @ r0<- CCBB 3978 mov r9, rINST, lsr #8 @ r9<- AA 3979 mov r3, r0, lsr #8 @ r3<- CC 3980 and r2, r0, #255 @ r2<- BB 3981 GET_VREG r1, r3 @ r1<- vCC 3982 GET_VREG r0, r2 @ r0<- vBB 3983 .if 0 3984 cmp r1, #0 @ is second operand zero? 3985 beq common_errDivideByZero 3986 .endif 3987 3988 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 3989 @ optional op; may set condition codes 3990 mul r0, r1, r0 @ r0<- op, r0-r3 changed 3991 GET_INST_OPCODE ip @ extract opcode from rINST 3992 SET_VREG r0, r9 @ vAA<- r0 3993 GOTO_OPCODE ip @ jump to next instruction 3994 /* 11-14 instructions */ 3995 3996 3997/* ------------------------------ */ 3998 .balign 128 3999.L_op_div_int: /* 0x93 */ 4000/* File: arm/op_div_int.S */ 4001 /* 4002 * Specialized 32-bit binary operation 4003 * 4004 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper 4005 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for 4006 * ARMv7 CPUs that have hardware division support). 4007 * 4008 * div-int 4009 * 4010 */ 4011 FETCH r0, 1 @ r0<- CCBB 4012 mov r9, rINST, lsr #8 @ r9<- AA 4013 mov r3, r0, lsr #8 @ r3<- CC 4014 and r2, r0, #255 @ r2<- BB 4015 GET_VREG r1, r3 @ r1<- vCC 4016 GET_VREG r0, r2 @ r0<- vBB 4017 cmp r1, #0 @ is second operand zero? 4018 beq common_errDivideByZero 4019 4020 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4021#ifdef __ARM_ARCH_EXT_IDIV__ 4022 sdiv r0, r0, r1 @ r0<- op 4023#else 4024 bl __aeabi_idiv @ r0<- op, r0-r3 changed 4025#endif 4026 GET_INST_OPCODE ip @ extract opcode from rINST 4027 SET_VREG r0, r9 @ vAA<- r0 4028 GOTO_OPCODE ip @ jump to next instruction 4029 /* 11-14 instructions */ 4030 4031/* ------------------------------ */ 4032 .balign 128 4033.L_op_rem_int: /* 0x94 */ 4034/* File: arm/op_rem_int.S */ 4035 /* 4036 * Specialized 32-bit binary operation 4037 * 4038 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper 4039 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for 4040 * ARMv7 CPUs that have hardware division support). 4041 * 4042 * NOTE: idivmod returns quotient in r0 and remainder in r1 4043 * 4044 * rem-int 4045 * 4046 */ 4047 FETCH r0, 1 @ r0<- CCBB 4048 mov r9, rINST, lsr #8 @ r9<- AA 4049 mov r3, r0, lsr #8 @ r3<- CC 4050 and r2, r0, #255 @ r2<- BB 4051 GET_VREG r1, r3 @ r1<- vCC 4052 GET_VREG r0, r2 @ r0<- vBB 4053 cmp r1, #0 @ is second operand zero? 4054 beq common_errDivideByZero 4055 4056 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4057#ifdef __ARM_ARCH_EXT_IDIV__ 4058 sdiv r2, r0, r1 4059 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed 4060#else 4061 bl __aeabi_idivmod @ r1<- op, r0-r3 changed 4062#endif 4063 GET_INST_OPCODE ip @ extract opcode from rINST 4064 SET_VREG r1, r9 @ vAA<- r1 4065 GOTO_OPCODE ip @ jump to next instruction 4066 /* 11-14 instructions */ 4067 4068/* ------------------------------ */ 4069 .balign 128 4070.L_op_and_int: /* 0x95 */ 4071/* File: arm/op_and_int.S */ 4072/* File: arm/binop.S */ 4073 /* 4074 * Generic 32-bit binary operation. Provide an "instr" line that 4075 * specifies an instruction that performs "result = r0 op r1". 4076 * This could be an ARM instruction or a function call. (If the result 4077 * comes back in a register other than r0, you can override "result".) 4078 * 4079 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4080 * vCC (r1). Useful for integer division and modulus. Note that we 4081 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4082 * handles it correctly. 4083 * 4084 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4085 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4086 * mul-float, div-float, rem-float 4087 */ 4088 /* binop vAA, vBB, vCC */ 4089 FETCH r0, 1 @ r0<- CCBB 4090 mov r9, rINST, lsr #8 @ r9<- AA 4091 mov r3, r0, lsr #8 @ r3<- CC 4092 and r2, r0, #255 @ r2<- BB 4093 GET_VREG r1, r3 @ r1<- vCC 4094 GET_VREG r0, r2 @ r0<- vBB 4095 .if 0 4096 cmp r1, #0 @ is second operand zero? 4097 beq common_errDivideByZero 4098 .endif 4099 4100 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4101 @ optional op; may set condition codes 4102 and r0, r0, r1 @ r0<- op, r0-r3 changed 4103 GET_INST_OPCODE ip @ extract opcode from rINST 4104 SET_VREG r0, r9 @ vAA<- r0 4105 GOTO_OPCODE ip @ jump to next instruction 4106 /* 11-14 instructions */ 4107 4108 4109/* ------------------------------ */ 4110 .balign 128 4111.L_op_or_int: /* 0x96 */ 4112/* File: arm/op_or_int.S */ 4113/* File: arm/binop.S */ 4114 /* 4115 * Generic 32-bit binary operation. Provide an "instr" line that 4116 * specifies an instruction that performs "result = r0 op r1". 4117 * This could be an ARM instruction or a function call. (If the result 4118 * comes back in a register other than r0, you can override "result".) 4119 * 4120 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4121 * vCC (r1). Useful for integer division and modulus. Note that we 4122 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4123 * handles it correctly. 4124 * 4125 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4126 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4127 * mul-float, div-float, rem-float 4128 */ 4129 /* binop vAA, vBB, vCC */ 4130 FETCH r0, 1 @ r0<- CCBB 4131 mov r9, rINST, lsr #8 @ r9<- AA 4132 mov r3, r0, lsr #8 @ r3<- CC 4133 and r2, r0, #255 @ r2<- BB 4134 GET_VREG r1, r3 @ r1<- vCC 4135 GET_VREG r0, r2 @ r0<- vBB 4136 .if 0 4137 cmp r1, #0 @ is second operand zero? 4138 beq common_errDivideByZero 4139 .endif 4140 4141 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4142 @ optional op; may set condition codes 4143 orr r0, r0, r1 @ r0<- op, r0-r3 changed 4144 GET_INST_OPCODE ip @ extract opcode from rINST 4145 SET_VREG r0, r9 @ vAA<- r0 4146 GOTO_OPCODE ip @ jump to next instruction 4147 /* 11-14 instructions */ 4148 4149 4150/* ------------------------------ */ 4151 .balign 128 4152.L_op_xor_int: /* 0x97 */ 4153/* File: arm/op_xor_int.S */ 4154/* File: arm/binop.S */ 4155 /* 4156 * Generic 32-bit binary operation. Provide an "instr" line that 4157 * specifies an instruction that performs "result = r0 op r1". 4158 * This could be an ARM instruction or a function call. (If the result 4159 * comes back in a register other than r0, you can override "result".) 4160 * 4161 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4162 * vCC (r1). Useful for integer division and modulus. Note that we 4163 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4164 * handles it correctly. 4165 * 4166 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4167 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4168 * mul-float, div-float, rem-float 4169 */ 4170 /* binop vAA, vBB, vCC */ 4171 FETCH r0, 1 @ r0<- CCBB 4172 mov r9, rINST, lsr #8 @ r9<- AA 4173 mov r3, r0, lsr #8 @ r3<- CC 4174 and r2, r0, #255 @ r2<- BB 4175 GET_VREG r1, r3 @ r1<- vCC 4176 GET_VREG r0, r2 @ r0<- vBB 4177 .if 0 4178 cmp r1, #0 @ is second operand zero? 4179 beq common_errDivideByZero 4180 .endif 4181 4182 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4183 @ optional op; may set condition codes 4184 eor r0, r0, r1 @ r0<- op, r0-r3 changed 4185 GET_INST_OPCODE ip @ extract opcode from rINST 4186 SET_VREG r0, r9 @ vAA<- r0 4187 GOTO_OPCODE ip @ jump to next instruction 4188 /* 11-14 instructions */ 4189 4190 4191/* ------------------------------ */ 4192 .balign 128 4193.L_op_shl_int: /* 0x98 */ 4194/* File: arm/op_shl_int.S */ 4195/* File: arm/binop.S */ 4196 /* 4197 * Generic 32-bit binary operation. Provide an "instr" line that 4198 * specifies an instruction that performs "result = r0 op r1". 4199 * This could be an ARM instruction or a function call. (If the result 4200 * comes back in a register other than r0, you can override "result".) 4201 * 4202 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4203 * vCC (r1). Useful for integer division and modulus. Note that we 4204 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4205 * handles it correctly. 4206 * 4207 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4208 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4209 * mul-float, div-float, rem-float 4210 */ 4211 /* binop vAA, vBB, vCC */ 4212 FETCH r0, 1 @ r0<- CCBB 4213 mov r9, rINST, lsr #8 @ r9<- AA 4214 mov r3, r0, lsr #8 @ r3<- CC 4215 and r2, r0, #255 @ r2<- BB 4216 GET_VREG r1, r3 @ r1<- vCC 4217 GET_VREG r0, r2 @ r0<- vBB 4218 .if 0 4219 cmp r1, #0 @ is second operand zero? 4220 beq common_errDivideByZero 4221 .endif 4222 4223 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4224 and r1, r1, #31 @ optional op; may set condition codes 4225 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 4226 GET_INST_OPCODE ip @ extract opcode from rINST 4227 SET_VREG r0, r9 @ vAA<- r0 4228 GOTO_OPCODE ip @ jump to next instruction 4229 /* 11-14 instructions */ 4230 4231 4232/* ------------------------------ */ 4233 .balign 128 4234.L_op_shr_int: /* 0x99 */ 4235/* File: arm/op_shr_int.S */ 4236/* File: arm/binop.S */ 4237 /* 4238 * Generic 32-bit binary operation. Provide an "instr" line that 4239 * specifies an instruction that performs "result = r0 op r1". 4240 * This could be an ARM instruction or a function call. (If the result 4241 * comes back in a register other than r0, you can override "result".) 4242 * 4243 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4244 * vCC (r1). Useful for integer division and modulus. Note that we 4245 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4246 * handles it correctly. 4247 * 4248 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4249 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4250 * mul-float, div-float, rem-float 4251 */ 4252 /* binop vAA, vBB, vCC */ 4253 FETCH r0, 1 @ r0<- CCBB 4254 mov r9, rINST, lsr #8 @ r9<- AA 4255 mov r3, r0, lsr #8 @ r3<- CC 4256 and r2, r0, #255 @ r2<- BB 4257 GET_VREG r1, r3 @ r1<- vCC 4258 GET_VREG r0, r2 @ r0<- vBB 4259 .if 0 4260 cmp r1, #0 @ is second operand zero? 4261 beq common_errDivideByZero 4262 .endif 4263 4264 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4265 and r1, r1, #31 @ optional op; may set condition codes 4266 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 4267 GET_INST_OPCODE ip @ extract opcode from rINST 4268 SET_VREG r0, r9 @ vAA<- r0 4269 GOTO_OPCODE ip @ jump to next instruction 4270 /* 11-14 instructions */ 4271 4272 4273/* ------------------------------ */ 4274 .balign 128 4275.L_op_ushr_int: /* 0x9a */ 4276/* File: arm/op_ushr_int.S */ 4277/* File: arm/binop.S */ 4278 /* 4279 * Generic 32-bit binary operation. Provide an "instr" line that 4280 * specifies an instruction that performs "result = r0 op r1". 4281 * This could be an ARM instruction or a function call. (If the result 4282 * comes back in a register other than r0, you can override "result".) 4283 * 4284 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4285 * vCC (r1). Useful for integer division and modulus. Note that we 4286 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4287 * handles it correctly. 4288 * 4289 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4290 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4291 * mul-float, div-float, rem-float 4292 */ 4293 /* binop vAA, vBB, vCC */ 4294 FETCH r0, 1 @ r0<- CCBB 4295 mov r9, rINST, lsr #8 @ r9<- AA 4296 mov r3, r0, lsr #8 @ r3<- CC 4297 and r2, r0, #255 @ r2<- BB 4298 GET_VREG r1, r3 @ r1<- vCC 4299 GET_VREG r0, r2 @ r0<- vBB 4300 .if 0 4301 cmp r1, #0 @ is second operand zero? 4302 beq common_errDivideByZero 4303 .endif 4304 4305 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4306 and r1, r1, #31 @ optional op; may set condition codes 4307 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 4308 GET_INST_OPCODE ip @ extract opcode from rINST 4309 SET_VREG r0, r9 @ vAA<- r0 4310 GOTO_OPCODE ip @ jump to next instruction 4311 /* 11-14 instructions */ 4312 4313 4314/* ------------------------------ */ 4315 .balign 128 4316.L_op_add_long: /* 0x9b */ 4317/* File: arm/op_add_long.S */ 4318/* File: arm/binopWide.S */ 4319 /* 4320 * Generic 64-bit binary operation. Provide an "instr" line that 4321 * specifies an instruction that performs "result = r0-r1 op r2-r3". 4322 * This could be an ARM instruction or a function call. (If the result 4323 * comes back in a register other than r0, you can override "result".) 4324 * 4325 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4326 * vCC (r1). Useful for integer division and modulus. 4327 * 4328 * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4329 * xor-long, add-double, sub-double, mul-double, div-double, 4330 * rem-double 4331 * 4332 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4333 */ 4334 /* binop vAA, vBB, vCC */ 4335 FETCH r0, 1 @ r0<- CCBB 4336 mov rINST, rINST, lsr #8 @ rINST<- AA 4337 and r2, r0, #255 @ r2<- BB 4338 mov r3, r0, lsr #8 @ r3<- CC 4339 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA] 4340 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 4341 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 4342 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4343 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4344 .if 0 4345 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4346 beq common_errDivideByZero 4347 .endif 4348 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs 4349 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4350 adds r0, r0, r2 @ optional op; may set condition codes 4351 adc r1, r1, r3 @ result<- op, r0-r3 changed 4352 GET_INST_OPCODE ip @ extract opcode from rINST 4353 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4354 GOTO_OPCODE ip @ jump to next instruction 4355 /* 14-17 instructions */ 4356 4357 4358/* ------------------------------ */ 4359 .balign 128 4360.L_op_sub_long: /* 0x9c */ 4361/* File: arm/op_sub_long.S */ 4362/* File: arm/binopWide.S */ 4363 /* 4364 * Generic 64-bit binary operation. Provide an "instr" line that 4365 * specifies an instruction that performs "result = r0-r1 op r2-r3". 4366 * This could be an ARM instruction or a function call. (If the result 4367 * comes back in a register other than r0, you can override "result".) 4368 * 4369 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4370 * vCC (r1). Useful for integer division and modulus. 4371 * 4372 * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4373 * xor-long, add-double, sub-double, mul-double, div-double, 4374 * rem-double 4375 * 4376 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4377 */ 4378 /* binop vAA, vBB, vCC */ 4379 FETCH r0, 1 @ r0<- CCBB 4380 mov rINST, rINST, lsr #8 @ rINST<- AA 4381 and r2, r0, #255 @ r2<- BB 4382 mov r3, r0, lsr #8 @ r3<- CC 4383 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA] 4384 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 4385 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 4386 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4387 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4388 .if 0 4389 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4390 beq common_errDivideByZero 4391 .endif 4392 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs 4393 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4394 subs r0, r0, r2 @ optional op; may set condition codes 4395 sbc r1, r1, r3 @ result<- op, r0-r3 changed 4396 GET_INST_OPCODE ip @ extract opcode from rINST 4397 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4398 GOTO_OPCODE ip @ jump to next instruction 4399 /* 14-17 instructions */ 4400 4401 4402/* ------------------------------ */ 4403 .balign 128 4404.L_op_mul_long: /* 0x9d */ 4405/* File: arm/op_mul_long.S */ 4406 /* 4407 * Signed 64-bit integer multiply. 4408 * 4409 * Consider WXxYZ (r1r0 x r3r2) with a long multiply: 4410 * WX 4411 * x YZ 4412 * -------- 4413 * ZW ZX 4414 * YW YX 4415 * 4416 * The low word of the result holds ZX, the high word holds 4417 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because 4418 * it doesn't fit in the low 64 bits. 4419 * 4420 * Unlike most ARM math operations, multiply instructions have 4421 * restrictions on using the same register more than once (Rd and Rm 4422 * cannot be the same). 4423 */ 4424 /* mul-long vAA, vBB, vCC */ 4425 FETCH r0, 1 @ r0<- CCBB 4426 and r2, r0, #255 @ r2<- BB 4427 mov r3, r0, lsr #8 @ r3<- CC 4428 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 4429 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 4430 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4431 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4432 mul ip, r2, r1 @ ip<- ZxW 4433 umull r1, lr, r2, r0 @ r1/lr <- ZxX 4434 mla r2, r0, r3, ip @ r2<- YxX + (ZxW) 4435 mov r0, rINST, lsr #8 @ r0<- AA 4436 add r2, r2, lr @ r2<- lr + low(ZxW + (YxX)) 4437 VREG_INDEX_TO_ADDR r0, r0 @ r0<- &fp[AA] 4438 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4439 GET_INST_OPCODE ip @ extract opcode from rINST 4440 stmia r0, {r1-r2 } @ vAA/vAA+1<- r1/r2 4441 GOTO_OPCODE ip @ jump to next instruction 4442 4443/* ------------------------------ */ 4444 .balign 128 4445.L_op_div_long: /* 0x9e */ 4446/* File: arm/op_div_long.S */ 4447/* File: arm/binopWide.S */ 4448 /* 4449 * Generic 64-bit binary operation. Provide an "instr" line that 4450 * specifies an instruction that performs "result = r0-r1 op r2-r3". 4451 * This could be an ARM instruction or a function call. (If the result 4452 * comes back in a register other than r0, you can override "result".) 4453 * 4454 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4455 * vCC (r1). Useful for integer division and modulus. 4456 * 4457 * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4458 * xor-long, add-double, sub-double, mul-double, div-double, 4459 * rem-double 4460 * 4461 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4462 */ 4463 /* binop vAA, vBB, vCC */ 4464 FETCH r0, 1 @ r0<- CCBB 4465 mov rINST, rINST, lsr #8 @ rINST<- AA 4466 and r2, r0, #255 @ r2<- BB 4467 mov r3, r0, lsr #8 @ r3<- CC 4468 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA] 4469 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 4470 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 4471 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4472 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4473 .if 1 4474 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4475 beq common_errDivideByZero 4476 .endif 4477 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs 4478 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4479 @ optional op; may set condition codes 4480 bl __aeabi_ldivmod @ result<- op, r0-r3 changed 4481 GET_INST_OPCODE ip @ extract opcode from rINST 4482 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4483 GOTO_OPCODE ip @ jump to next instruction 4484 /* 14-17 instructions */ 4485 4486 4487/* ------------------------------ */ 4488 .balign 128 4489.L_op_rem_long: /* 0x9f */ 4490/* File: arm/op_rem_long.S */ 4491/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */ 4492/* File: arm/binopWide.S */ 4493 /* 4494 * Generic 64-bit binary operation. Provide an "instr" line that 4495 * specifies an instruction that performs "result = r0-r1 op r2-r3". 4496 * This could be an ARM instruction or a function call. (If the result 4497 * comes back in a register other than r0, you can override "result".) 4498 * 4499 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4500 * vCC (r1). Useful for integer division and modulus. 4501 * 4502 * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4503 * xor-long, add-double, sub-double, mul-double, div-double, 4504 * rem-double 4505 * 4506 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4507 */ 4508 /* binop vAA, vBB, vCC */ 4509 FETCH r0, 1 @ r0<- CCBB 4510 mov rINST, rINST, lsr #8 @ rINST<- AA 4511 and r2, r0, #255 @ r2<- BB 4512 mov r3, r0, lsr #8 @ r3<- CC 4513 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA] 4514 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 4515 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 4516 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4517 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4518 .if 1 4519 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4520 beq common_errDivideByZero 4521 .endif 4522 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs 4523 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4524 @ optional op; may set condition codes 4525 bl __aeabi_ldivmod @ result<- op, r0-r3 changed 4526 GET_INST_OPCODE ip @ extract opcode from rINST 4527 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3 4528 GOTO_OPCODE ip @ jump to next instruction 4529 /* 14-17 instructions */ 4530 4531 4532/* ------------------------------ */ 4533 .balign 128 4534.L_op_and_long: /* 0xa0 */ 4535/* File: arm/op_and_long.S */ 4536/* File: arm/binopWide.S */ 4537 /* 4538 * Generic 64-bit binary operation. Provide an "instr" line that 4539 * specifies an instruction that performs "result = r0-r1 op r2-r3". 4540 * This could be an ARM instruction or a function call. (If the result 4541 * comes back in a register other than r0, you can override "result".) 4542 * 4543 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4544 * vCC (r1). Useful for integer division and modulus. 4545 * 4546 * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4547 * xor-long, add-double, sub-double, mul-double, div-double, 4548 * rem-double 4549 * 4550 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4551 */ 4552 /* binop vAA, vBB, vCC */ 4553 FETCH r0, 1 @ r0<- CCBB 4554 mov rINST, rINST, lsr #8 @ rINST<- AA 4555 and r2, r0, #255 @ r2<- BB 4556 mov r3, r0, lsr #8 @ r3<- CC 4557 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA] 4558 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 4559 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 4560 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4561 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4562 .if 0 4563 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4564 beq common_errDivideByZero 4565 .endif 4566 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs 4567 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4568 and r0, r0, r2 @ optional op; may set condition codes 4569 and r1, r1, r3 @ result<- op, r0-r3 changed 4570 GET_INST_OPCODE ip @ extract opcode from rINST 4571 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4572 GOTO_OPCODE ip @ jump to next instruction 4573 /* 14-17 instructions */ 4574 4575 4576/* ------------------------------ */ 4577 .balign 128 4578.L_op_or_long: /* 0xa1 */ 4579/* File: arm/op_or_long.S */ 4580/* File: arm/binopWide.S */ 4581 /* 4582 * Generic 64-bit binary operation. Provide an "instr" line that 4583 * specifies an instruction that performs "result = r0-r1 op r2-r3". 4584 * This could be an ARM instruction or a function call. (If the result 4585 * comes back in a register other than r0, you can override "result".) 4586 * 4587 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4588 * vCC (r1). Useful for integer division and modulus. 4589 * 4590 * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4591 * xor-long, add-double, sub-double, mul-double, div-double, 4592 * rem-double 4593 * 4594 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4595 */ 4596 /* binop vAA, vBB, vCC */ 4597 FETCH r0, 1 @ r0<- CCBB 4598 mov rINST, rINST, lsr #8 @ rINST<- AA 4599 and r2, r0, #255 @ r2<- BB 4600 mov r3, r0, lsr #8 @ r3<- CC 4601 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA] 4602 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 4603 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 4604 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4605 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4606 .if 0 4607 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4608 beq common_errDivideByZero 4609 .endif 4610 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs 4611 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4612 orr r0, r0, r2 @ optional op; may set condition codes 4613 orr r1, r1, r3 @ result<- op, r0-r3 changed 4614 GET_INST_OPCODE ip @ extract opcode from rINST 4615 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4616 GOTO_OPCODE ip @ jump to next instruction 4617 /* 14-17 instructions */ 4618 4619 4620/* ------------------------------ */ 4621 .balign 128 4622.L_op_xor_long: /* 0xa2 */ 4623/* File: arm/op_xor_long.S */ 4624/* File: arm/binopWide.S */ 4625 /* 4626 * Generic 64-bit binary operation. Provide an "instr" line that 4627 * specifies an instruction that performs "result = r0-r1 op r2-r3". 4628 * This could be an ARM instruction or a function call. (If the result 4629 * comes back in a register other than r0, you can override "result".) 4630 * 4631 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4632 * vCC (r1). Useful for integer division and modulus. 4633 * 4634 * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 4635 * xor-long, add-double, sub-double, mul-double, div-double, 4636 * rem-double 4637 * 4638 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 4639 */ 4640 /* binop vAA, vBB, vCC */ 4641 FETCH r0, 1 @ r0<- CCBB 4642 mov rINST, rINST, lsr #8 @ rINST<- AA 4643 and r2, r0, #255 @ r2<- BB 4644 mov r3, r0, lsr #8 @ r3<- CC 4645 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA] 4646 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 4647 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 4648 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 4649 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 4650 .if 0 4651 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 4652 beq common_errDivideByZero 4653 .endif 4654 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs 4655 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4656 eor r0, r0, r2 @ optional op; may set condition codes 4657 eor r1, r1, r3 @ result<- op, r0-r3 changed 4658 GET_INST_OPCODE ip @ extract opcode from rINST 4659 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 4660 GOTO_OPCODE ip @ jump to next instruction 4661 /* 14-17 instructions */ 4662 4663 4664/* ------------------------------ */ 4665 .balign 128 4666.L_op_shl_long: /* 0xa3 */ 4667/* File: arm/op_shl_long.S */ 4668 /* 4669 * Long integer shift. This is different from the generic 32/64-bit 4670 * binary operations because vAA/vBB are 64-bit but vCC (the shift 4671 * distance) is 32-bit. Also, Dalvik requires us to mask off the low 4672 * 6 bits of the shift distance. 4673 */ 4674 /* shl-long vAA, vBB, vCC */ 4675 FETCH r0, 1 @ r0<- CCBB 4676 mov r9, rINST, lsr #8 @ r9<- AA 4677 and r3, r0, #255 @ r3<- BB 4678 mov r0, r0, lsr #8 @ r0<- CC 4679 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BB] 4680 GET_VREG r2, r0 @ r2<- vCC 4681 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 4682 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs 4683 and r2, r2, #63 @ r2<- r2 & 0x3f 4684 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA] 4685 mov r1, r1, asl r2 @ r1<- r1 << r2 4686 rsb r3, r2, #32 @ r3<- 32 - r2 4687 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2)) 4688 subs ip, r2, #32 @ ip<- r2 - 32 4689 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32) 4690 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4691 mov r0, r0, asl r2 @ r0<- r0 << r2 4692 GET_INST_OPCODE ip @ extract opcode from rINST 4693 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 4694 GOTO_OPCODE ip @ jump to next instruction 4695 4696/* ------------------------------ */ 4697 .balign 128 4698.L_op_shr_long: /* 0xa4 */ 4699/* File: arm/op_shr_long.S */ 4700 /* 4701 * Long integer shift. This is different from the generic 32/64-bit 4702 * binary operations because vAA/vBB are 64-bit but vCC (the shift 4703 * distance) is 32-bit. Also, Dalvik requires us to mask off the low 4704 * 6 bits of the shift distance. 4705 */ 4706 /* shr-long vAA, vBB, vCC */ 4707 FETCH r0, 1 @ r0<- CCBB 4708 mov r9, rINST, lsr #8 @ r9<- AA 4709 and r3, r0, #255 @ r3<- BB 4710 mov r0, r0, lsr #8 @ r0<- CC 4711 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BB] 4712 GET_VREG r2, r0 @ r2<- vCC 4713 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 4714 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs 4715 and r2, r2, #63 @ r0<- r0 & 0x3f 4716 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA] 4717 mov r0, r0, lsr r2 @ r0<- r2 >> r2 4718 rsb r3, r2, #32 @ r3<- 32 - r2 4719 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 4720 subs ip, r2, #32 @ ip<- r2 - 32 4721 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32) 4722 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4723 mov r1, r1, asr r2 @ r1<- r1 >> r2 4724 GET_INST_OPCODE ip @ extract opcode from rINST 4725 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 4726 GOTO_OPCODE ip @ jump to next instruction 4727 4728/* ------------------------------ */ 4729 .balign 128 4730.L_op_ushr_long: /* 0xa5 */ 4731/* File: arm/op_ushr_long.S */ 4732 /* 4733 * Long integer shift. This is different from the generic 32/64-bit 4734 * binary operations because vAA/vBB are 64-bit but vCC (the shift 4735 * distance) is 32-bit. Also, Dalvik requires us to mask off the low 4736 * 6 bits of the shift distance. 4737 */ 4738 /* ushr-long vAA, vBB, vCC */ 4739 FETCH r0, 1 @ r0<- CCBB 4740 mov r9, rINST, lsr #8 @ r9<- AA 4741 and r3, r0, #255 @ r3<- BB 4742 mov r0, r0, lsr #8 @ r0<- CC 4743 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BB] 4744 GET_VREG r2, r0 @ r2<- vCC 4745 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1 4746 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs 4747 and r2, r2, #63 @ r0<- r0 & 0x3f 4748 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA] 4749 mov r0, r0, lsr r2 @ r0<- r2 >> r2 4750 rsb r3, r2, #32 @ r3<- 32 - r2 4751 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 4752 subs ip, r2, #32 @ ip<- r2 - 32 4753 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32) 4754 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4755 mov r1, r1, lsr r2 @ r1<- r1 >>> r2 4756 GET_INST_OPCODE ip @ extract opcode from rINST 4757 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 4758 GOTO_OPCODE ip @ jump to next instruction 4759 4760/* ------------------------------ */ 4761 .balign 128 4762.L_op_add_float: /* 0xa6 */ 4763/* File: arm/op_add_float.S */ 4764/* File: arm/fbinop.S */ 4765 /* 4766 * Generic 32-bit floating-point operation. Provide an "instr" line that 4767 * specifies an instruction that performs "s2 = s0 op s1". Because we 4768 * use the "softfp" ABI, this must be an instruction, not a function call. 4769 * 4770 * For: add-float, sub-float, mul-float, div-float 4771 */ 4772 /* floatop vAA, vBB, vCC */ 4773 FETCH r0, 1 @ r0<- CCBB 4774 mov r9, rINST, lsr #8 @ r9<- AA 4775 mov r3, r0, lsr #8 @ r3<- CC 4776 and r2, r0, #255 @ r2<- BB 4777 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 4778 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 4779 flds s1, [r3] @ s1<- vCC 4780 flds s0, [r2] @ s0<- vBB 4781 4782 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4783 fadds s2, s0, s1 @ s2<- op 4784 GET_INST_OPCODE ip @ extract opcode from rINST 4785 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA 4786 fsts s2, [r9] @ vAA<- s2 4787 GOTO_OPCODE ip @ jump to next instruction 4788 4789 4790/* ------------------------------ */ 4791 .balign 128 4792.L_op_sub_float: /* 0xa7 */ 4793/* File: arm/op_sub_float.S */ 4794/* File: arm/fbinop.S */ 4795 /* 4796 * Generic 32-bit floating-point operation. Provide an "instr" line that 4797 * specifies an instruction that performs "s2 = s0 op s1". Because we 4798 * use the "softfp" ABI, this must be an instruction, not a function call. 4799 * 4800 * For: add-float, sub-float, mul-float, div-float 4801 */ 4802 /* floatop vAA, vBB, vCC */ 4803 FETCH r0, 1 @ r0<- CCBB 4804 mov r9, rINST, lsr #8 @ r9<- AA 4805 mov r3, r0, lsr #8 @ r3<- CC 4806 and r2, r0, #255 @ r2<- BB 4807 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 4808 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 4809 flds s1, [r3] @ s1<- vCC 4810 flds s0, [r2] @ s0<- vBB 4811 4812 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4813 fsubs s2, s0, s1 @ s2<- op 4814 GET_INST_OPCODE ip @ extract opcode from rINST 4815 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA 4816 fsts s2, [r9] @ vAA<- s2 4817 GOTO_OPCODE ip @ jump to next instruction 4818 4819 4820/* ------------------------------ */ 4821 .balign 128 4822.L_op_mul_float: /* 0xa8 */ 4823/* File: arm/op_mul_float.S */ 4824/* File: arm/fbinop.S */ 4825 /* 4826 * Generic 32-bit floating-point operation. Provide an "instr" line that 4827 * specifies an instruction that performs "s2 = s0 op s1". Because we 4828 * use the "softfp" ABI, this must be an instruction, not a function call. 4829 * 4830 * For: add-float, sub-float, mul-float, div-float 4831 */ 4832 /* floatop vAA, vBB, vCC */ 4833 FETCH r0, 1 @ r0<- CCBB 4834 mov r9, rINST, lsr #8 @ r9<- AA 4835 mov r3, r0, lsr #8 @ r3<- CC 4836 and r2, r0, #255 @ r2<- BB 4837 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 4838 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 4839 flds s1, [r3] @ s1<- vCC 4840 flds s0, [r2] @ s0<- vBB 4841 4842 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4843 fmuls s2, s0, s1 @ s2<- op 4844 GET_INST_OPCODE ip @ extract opcode from rINST 4845 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA 4846 fsts s2, [r9] @ vAA<- s2 4847 GOTO_OPCODE ip @ jump to next instruction 4848 4849 4850/* ------------------------------ */ 4851 .balign 128 4852.L_op_div_float: /* 0xa9 */ 4853/* File: arm/op_div_float.S */ 4854/* File: arm/fbinop.S */ 4855 /* 4856 * Generic 32-bit floating-point operation. Provide an "instr" line that 4857 * specifies an instruction that performs "s2 = s0 op s1". Because we 4858 * use the "softfp" ABI, this must be an instruction, not a function call. 4859 * 4860 * For: add-float, sub-float, mul-float, div-float 4861 */ 4862 /* floatop vAA, vBB, vCC */ 4863 FETCH r0, 1 @ r0<- CCBB 4864 mov r9, rINST, lsr #8 @ r9<- AA 4865 mov r3, r0, lsr #8 @ r3<- CC 4866 and r2, r0, #255 @ r2<- BB 4867 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 4868 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 4869 flds s1, [r3] @ s1<- vCC 4870 flds s0, [r2] @ s0<- vBB 4871 4872 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4873 fdivs s2, s0, s1 @ s2<- op 4874 GET_INST_OPCODE ip @ extract opcode from rINST 4875 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA 4876 fsts s2, [r9] @ vAA<- s2 4877 GOTO_OPCODE ip @ jump to next instruction 4878 4879 4880/* ------------------------------ */ 4881 .balign 128 4882.L_op_rem_float: /* 0xaa */ 4883/* File: arm/op_rem_float.S */ 4884/* EABI doesn't define a float remainder function, but libm does */ 4885/* File: arm/binop.S */ 4886 /* 4887 * Generic 32-bit binary operation. Provide an "instr" line that 4888 * specifies an instruction that performs "result = r0 op r1". 4889 * This could be an ARM instruction or a function call. (If the result 4890 * comes back in a register other than r0, you can override "result".) 4891 * 4892 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4893 * vCC (r1). Useful for integer division and modulus. Note that we 4894 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4895 * handles it correctly. 4896 * 4897 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4898 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4899 * mul-float, div-float, rem-float 4900 */ 4901 /* binop vAA, vBB, vCC */ 4902 FETCH r0, 1 @ r0<- CCBB 4903 mov r9, rINST, lsr #8 @ r9<- AA 4904 mov r3, r0, lsr #8 @ r3<- CC 4905 and r2, r0, #255 @ r2<- BB 4906 GET_VREG r1, r3 @ r1<- vCC 4907 GET_VREG r0, r2 @ r0<- vBB 4908 .if 0 4909 cmp r1, #0 @ is second operand zero? 4910 beq common_errDivideByZero 4911 .endif 4912 4913 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4914 @ optional op; may set condition codes 4915 bl fmodf @ r0<- op, r0-r3 changed 4916 GET_INST_OPCODE ip @ extract opcode from rINST 4917 SET_VREG r0, r9 @ vAA<- r0 4918 GOTO_OPCODE ip @ jump to next instruction 4919 /* 11-14 instructions */ 4920 4921 4922/* ------------------------------ */ 4923 .balign 128 4924.L_op_add_double: /* 0xab */ 4925/* File: arm/op_add_double.S */ 4926/* File: arm/fbinopWide.S */ 4927 /* 4928 * Generic 64-bit double-precision floating point binary operation. 4929 * Provide an "instr" line that specifies an instruction that performs 4930 * "d2 = d0 op d1". 4931 * 4932 * for: add-double, sub-double, mul-double, div-double 4933 */ 4934 /* doubleop vAA, vBB, vCC */ 4935 FETCH r0, 1 @ r0<- CCBB 4936 mov r9, rINST, lsr #8 @ r9<- AA 4937 mov r3, r0, lsr #8 @ r3<- CC 4938 and r2, r0, #255 @ r2<- BB 4939 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 4940 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 4941 fldd d1, [r3] @ d1<- vCC 4942 fldd d0, [r2] @ d0<- vBB 4943 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4944 faddd d2, d0, d1 @ s2<- op 4945 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs 4946 GET_INST_OPCODE ip @ extract opcode from rINST 4947 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA 4948 fstd d2, [r9] @ vAA<- d2 4949 GOTO_OPCODE ip @ jump to next instruction 4950 4951 4952/* ------------------------------ */ 4953 .balign 128 4954.L_op_sub_double: /* 0xac */ 4955/* File: arm/op_sub_double.S */ 4956/* File: arm/fbinopWide.S */ 4957 /* 4958 * Generic 64-bit double-precision floating point binary operation. 4959 * Provide an "instr" line that specifies an instruction that performs 4960 * "d2 = d0 op d1". 4961 * 4962 * for: add-double, sub-double, mul-double, div-double 4963 */ 4964 /* doubleop vAA, vBB, vCC */ 4965 FETCH r0, 1 @ r0<- CCBB 4966 mov r9, rINST, lsr #8 @ r9<- AA 4967 mov r3, r0, lsr #8 @ r3<- CC 4968 and r2, r0, #255 @ r2<- BB 4969 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 4970 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 4971 fldd d1, [r3] @ d1<- vCC 4972 fldd d0, [r2] @ d0<- vBB 4973 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 4974 fsubd d2, d0, d1 @ s2<- op 4975 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs 4976 GET_INST_OPCODE ip @ extract opcode from rINST 4977 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA 4978 fstd d2, [r9] @ vAA<- d2 4979 GOTO_OPCODE ip @ jump to next instruction 4980 4981 4982/* ------------------------------ */ 4983 .balign 128 4984.L_op_mul_double: /* 0xad */ 4985/* File: arm/op_mul_double.S */ 4986/* File: arm/fbinopWide.S */ 4987 /* 4988 * Generic 64-bit double-precision floating point binary operation. 4989 * Provide an "instr" line that specifies an instruction that performs 4990 * "d2 = d0 op d1". 4991 * 4992 * for: add-double, sub-double, mul-double, div-double 4993 */ 4994 /* doubleop vAA, vBB, vCC */ 4995 FETCH r0, 1 @ r0<- CCBB 4996 mov r9, rINST, lsr #8 @ r9<- AA 4997 mov r3, r0, lsr #8 @ r3<- CC 4998 and r2, r0, #255 @ r2<- BB 4999 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 5000 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 5001 fldd d1, [r3] @ d1<- vCC 5002 fldd d0, [r2] @ d0<- vBB 5003 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 5004 fmuld d2, d0, d1 @ s2<- op 5005 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs 5006 GET_INST_OPCODE ip @ extract opcode from rINST 5007 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA 5008 fstd d2, [r9] @ vAA<- d2 5009 GOTO_OPCODE ip @ jump to next instruction 5010 5011 5012/* ------------------------------ */ 5013 .balign 128 5014.L_op_div_double: /* 0xae */ 5015/* File: arm/op_div_double.S */ 5016/* File: arm/fbinopWide.S */ 5017 /* 5018 * Generic 64-bit double-precision floating point binary operation. 5019 * Provide an "instr" line that specifies an instruction that performs 5020 * "d2 = d0 op d1". 5021 * 5022 * for: add-double, sub-double, mul-double, div-double 5023 */ 5024 /* doubleop vAA, vBB, vCC */ 5025 FETCH r0, 1 @ r0<- CCBB 5026 mov r9, rINST, lsr #8 @ r9<- AA 5027 mov r3, r0, lsr #8 @ r3<- CC 5028 and r2, r0, #255 @ r2<- BB 5029 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC 5030 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB 5031 fldd d1, [r3] @ d1<- vCC 5032 fldd d0, [r2] @ d0<- vBB 5033 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 5034 fdivd d2, d0, d1 @ s2<- op 5035 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs 5036 GET_INST_OPCODE ip @ extract opcode from rINST 5037 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA 5038 fstd d2, [r9] @ vAA<- d2 5039 GOTO_OPCODE ip @ jump to next instruction 5040 5041 5042/* ------------------------------ */ 5043 .balign 128 5044.L_op_rem_double: /* 0xaf */ 5045/* File: arm/op_rem_double.S */ 5046/* EABI doesn't define a double remainder function, but libm does */ 5047/* File: arm/binopWide.S */ 5048 /* 5049 * Generic 64-bit binary operation. Provide an "instr" line that 5050 * specifies an instruction that performs "result = r0-r1 op r2-r3". 5051 * This could be an ARM instruction or a function call. (If the result 5052 * comes back in a register other than r0, you can override "result".) 5053 * 5054 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5055 * vCC (r1). Useful for integer division and modulus. 5056 * 5057 * for: add-long, sub-long, div-long, rem-long, and-long, or-long, 5058 * xor-long, add-double, sub-double, mul-double, div-double, 5059 * rem-double 5060 * 5061 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both. 5062 */ 5063 /* binop vAA, vBB, vCC */ 5064 FETCH r0, 1 @ r0<- CCBB 5065 mov rINST, rINST, lsr #8 @ rINST<- AA 5066 and r2, r0, #255 @ r2<- BB 5067 mov r3, r0, lsr #8 @ r3<- CC 5068 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA] 5069 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB] 5070 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC] 5071 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1 5072 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1 5073 .if 0 5074 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5075 beq common_errDivideByZero 5076 .endif 5077 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs 5078 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 5079 @ optional op; may set condition codes 5080 bl fmod @ result<- op, r0-r3 changed 5081 GET_INST_OPCODE ip @ extract opcode from rINST 5082 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5083 GOTO_OPCODE ip @ jump to next instruction 5084 /* 14-17 instructions */ 5085 5086 5087/* ------------------------------ */ 5088 .balign 128 5089.L_op_add_int_2addr: /* 0xb0 */ 5090/* File: arm/op_add_int_2addr.S */ 5091/* File: arm/binop2addr.S */ 5092 /* 5093 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5094 * that specifies an instruction that performs "result = r0 op r1". 5095 * This could be an ARM instruction or a function call. (If the result 5096 * comes back in a register other than r0, you can override "result".) 5097 * 5098 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5099 * vCC (r1). Useful for integer division and modulus. 5100 * 5101 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5102 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5103 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5104 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5105 */ 5106 /* binop/2addr vA, vB */ 5107 mov r3, rINST, lsr #12 @ r3<- B 5108 ubfx r9, rINST, #8, #4 @ r9<- A 5109 GET_VREG r1, r3 @ r1<- vB 5110 GET_VREG r0, r9 @ r0<- vA 5111 .if 0 5112 cmp r1, #0 @ is second operand zero? 5113 beq common_errDivideByZero 5114 .endif 5115 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5116 5117 @ optional op; may set condition codes 5118 add r0, r0, r1 @ r0<- op, r0-r3 changed 5119 GET_INST_OPCODE ip @ extract opcode from rINST 5120 SET_VREG r0, r9 @ vAA<- r0 5121 GOTO_OPCODE ip @ jump to next instruction 5122 /* 10-13 instructions */ 5123 5124 5125/* ------------------------------ */ 5126 .balign 128 5127.L_op_sub_int_2addr: /* 0xb1 */ 5128/* File: arm/op_sub_int_2addr.S */ 5129/* File: arm/binop2addr.S */ 5130 /* 5131 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5132 * that specifies an instruction that performs "result = r0 op r1". 5133 * This could be an ARM instruction or a function call. (If the result 5134 * comes back in a register other than r0, you can override "result".) 5135 * 5136 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5137 * vCC (r1). Useful for integer division and modulus. 5138 * 5139 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5140 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5141 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5142 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5143 */ 5144 /* binop/2addr vA, vB */ 5145 mov r3, rINST, lsr #12 @ r3<- B 5146 ubfx r9, rINST, #8, #4 @ r9<- A 5147 GET_VREG r1, r3 @ r1<- vB 5148 GET_VREG r0, r9 @ r0<- vA 5149 .if 0 5150 cmp r1, #0 @ is second operand zero? 5151 beq common_errDivideByZero 5152 .endif 5153 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5154 5155 @ optional op; may set condition codes 5156 sub r0, r0, r1 @ r0<- op, r0-r3 changed 5157 GET_INST_OPCODE ip @ extract opcode from rINST 5158 SET_VREG r0, r9 @ vAA<- r0 5159 GOTO_OPCODE ip @ jump to next instruction 5160 /* 10-13 instructions */ 5161 5162 5163/* ------------------------------ */ 5164 .balign 128 5165.L_op_mul_int_2addr: /* 0xb2 */ 5166/* File: arm/op_mul_int_2addr.S */ 5167/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 5168/* File: arm/binop2addr.S */ 5169 /* 5170 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5171 * that specifies an instruction that performs "result = r0 op r1". 5172 * This could be an ARM instruction or a function call. (If the result 5173 * comes back in a register other than r0, you can override "result".) 5174 * 5175 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5176 * vCC (r1). Useful for integer division and modulus. 5177 * 5178 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5179 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5180 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5181 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5182 */ 5183 /* binop/2addr vA, vB */ 5184 mov r3, rINST, lsr #12 @ r3<- B 5185 ubfx r9, rINST, #8, #4 @ r9<- A 5186 GET_VREG r1, r3 @ r1<- vB 5187 GET_VREG r0, r9 @ r0<- vA 5188 .if 0 5189 cmp r1, #0 @ is second operand zero? 5190 beq common_errDivideByZero 5191 .endif 5192 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5193 5194 @ optional op; may set condition codes 5195 mul r0, r1, r0 @ r0<- op, r0-r3 changed 5196 GET_INST_OPCODE ip @ extract opcode from rINST 5197 SET_VREG r0, r9 @ vAA<- r0 5198 GOTO_OPCODE ip @ jump to next instruction 5199 /* 10-13 instructions */ 5200 5201 5202/* ------------------------------ */ 5203 .balign 128 5204.L_op_div_int_2addr: /* 0xb3 */ 5205/* File: arm/op_div_int_2addr.S */ 5206 /* 5207 * Specialized 32-bit binary operation 5208 * 5209 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper 5210 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for 5211 * ARMv7 CPUs that have hardware division support). 5212 * 5213 * div-int/2addr 5214 * 5215 */ 5216 mov r3, rINST, lsr #12 @ r3<- B 5217 ubfx r9, rINST, #8, #4 @ r9<- A 5218 GET_VREG r1, r3 @ r1<- vB 5219 GET_VREG r0, r9 @ r0<- vA 5220 cmp r1, #0 @ is second operand zero? 5221 beq common_errDivideByZero 5222 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5223 5224#ifdef __ARM_ARCH_EXT_IDIV__ 5225 sdiv r0, r0, r1 @ r0<- op 5226#else 5227 bl __aeabi_idiv @ r0<- op, r0-r3 changed 5228#endif 5229 GET_INST_OPCODE ip @ extract opcode from rINST 5230 SET_VREG r0, r9 @ vAA<- r0 5231 GOTO_OPCODE ip @ jump to next instruction 5232 /* 10-13 instructions */ 5233 5234 5235/* ------------------------------ */ 5236 .balign 128 5237.L_op_rem_int_2addr: /* 0xb4 */ 5238/* File: arm/op_rem_int_2addr.S */ 5239 /* 5240 * Specialized 32-bit binary operation 5241 * 5242 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper 5243 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for 5244 * ARMv7 CPUs that have hardware division support). 5245 * 5246 * NOTE: idivmod returns quotient in r0 and remainder in r1 5247 * 5248 * rem-int/2addr 5249 * 5250 */ 5251 mov r3, rINST, lsr #12 @ r3<- B 5252 ubfx r9, rINST, #8, #4 @ r9<- A 5253 GET_VREG r1, r3 @ r1<- vB 5254 GET_VREG r0, r9 @ r0<- vA 5255 cmp r1, #0 @ is second operand zero? 5256 beq common_errDivideByZero 5257 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5258 5259#ifdef __ARM_ARCH_EXT_IDIV__ 5260 sdiv r2, r0, r1 5261 mls r1, r1, r2, r0 @ r1<- op 5262#else 5263 bl __aeabi_idivmod @ r1<- op, r0-r3 changed 5264#endif 5265 GET_INST_OPCODE ip @ extract opcode from rINST 5266 SET_VREG r1, r9 @ vAA<- r1 5267 GOTO_OPCODE ip @ jump to next instruction 5268 /* 10-13 instructions */ 5269 5270 5271/* ------------------------------ */ 5272 .balign 128 5273.L_op_and_int_2addr: /* 0xb5 */ 5274/* File: arm/op_and_int_2addr.S */ 5275/* File: arm/binop2addr.S */ 5276 /* 5277 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5278 * that specifies an instruction that performs "result = r0 op r1". 5279 * This could be an ARM instruction or a function call. (If the result 5280 * comes back in a register other than r0, you can override "result".) 5281 * 5282 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5283 * vCC (r1). Useful for integer division and modulus. 5284 * 5285 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5286 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5287 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5288 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5289 */ 5290 /* binop/2addr vA, vB */ 5291 mov r3, rINST, lsr #12 @ r3<- B 5292 ubfx r9, rINST, #8, #4 @ r9<- A 5293 GET_VREG r1, r3 @ r1<- vB 5294 GET_VREG r0, r9 @ r0<- vA 5295 .if 0 5296 cmp r1, #0 @ is second operand zero? 5297 beq common_errDivideByZero 5298 .endif 5299 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5300 5301 @ optional op; may set condition codes 5302 and r0, r0, r1 @ r0<- op, r0-r3 changed 5303 GET_INST_OPCODE ip @ extract opcode from rINST 5304 SET_VREG r0, r9 @ vAA<- r0 5305 GOTO_OPCODE ip @ jump to next instruction 5306 /* 10-13 instructions */ 5307 5308 5309/* ------------------------------ */ 5310 .balign 128 5311.L_op_or_int_2addr: /* 0xb6 */ 5312/* File: arm/op_or_int_2addr.S */ 5313/* File: arm/binop2addr.S */ 5314 /* 5315 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5316 * that specifies an instruction that performs "result = r0 op r1". 5317 * This could be an ARM instruction or a function call. (If the result 5318 * comes back in a register other than r0, you can override "result".) 5319 * 5320 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5321 * vCC (r1). Useful for integer division and modulus. 5322 * 5323 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5324 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5325 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5326 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5327 */ 5328 /* binop/2addr vA, vB */ 5329 mov r3, rINST, lsr #12 @ r3<- B 5330 ubfx r9, rINST, #8, #4 @ r9<- A 5331 GET_VREG r1, r3 @ r1<- vB 5332 GET_VREG r0, r9 @ r0<- vA 5333 .if 0 5334 cmp r1, #0 @ is second operand zero? 5335 beq common_errDivideByZero 5336 .endif 5337 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5338 5339 @ optional op; may set condition codes 5340 orr r0, r0, r1 @ r0<- op, r0-r3 changed 5341 GET_INST_OPCODE ip @ extract opcode from rINST 5342 SET_VREG r0, r9 @ vAA<- r0 5343 GOTO_OPCODE ip @ jump to next instruction 5344 /* 10-13 instructions */ 5345 5346 5347/* ------------------------------ */ 5348 .balign 128 5349.L_op_xor_int_2addr: /* 0xb7 */ 5350/* File: arm/op_xor_int_2addr.S */ 5351/* File: arm/binop2addr.S */ 5352 /* 5353 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5354 * that specifies an instruction that performs "result = r0 op r1". 5355 * This could be an ARM instruction or a function call. (If the result 5356 * comes back in a register other than r0, you can override "result".) 5357 * 5358 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5359 * vCC (r1). Useful for integer division and modulus. 5360 * 5361 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5362 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5363 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5364 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5365 */ 5366 /* binop/2addr vA, vB */ 5367 mov r3, rINST, lsr #12 @ r3<- B 5368 ubfx r9, rINST, #8, #4 @ r9<- A 5369 GET_VREG r1, r3 @ r1<- vB 5370 GET_VREG r0, r9 @ r0<- vA 5371 .if 0 5372 cmp r1, #0 @ is second operand zero? 5373 beq common_errDivideByZero 5374 .endif 5375 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5376 5377 @ optional op; may set condition codes 5378 eor r0, r0, r1 @ r0<- op, r0-r3 changed 5379 GET_INST_OPCODE ip @ extract opcode from rINST 5380 SET_VREG r0, r9 @ vAA<- r0 5381 GOTO_OPCODE ip @ jump to next instruction 5382 /* 10-13 instructions */ 5383 5384 5385/* ------------------------------ */ 5386 .balign 128 5387.L_op_shl_int_2addr: /* 0xb8 */ 5388/* File: arm/op_shl_int_2addr.S */ 5389/* File: arm/binop2addr.S */ 5390 /* 5391 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5392 * that specifies an instruction that performs "result = r0 op r1". 5393 * This could be an ARM instruction or a function call. (If the result 5394 * comes back in a register other than r0, you can override "result".) 5395 * 5396 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5397 * vCC (r1). Useful for integer division and modulus. 5398 * 5399 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5400 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5401 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5402 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5403 */ 5404 /* binop/2addr vA, vB */ 5405 mov r3, rINST, lsr #12 @ r3<- B 5406 ubfx r9, rINST, #8, #4 @ r9<- A 5407 GET_VREG r1, r3 @ r1<- vB 5408 GET_VREG r0, r9 @ r0<- vA 5409 .if 0 5410 cmp r1, #0 @ is second operand zero? 5411 beq common_errDivideByZero 5412 .endif 5413 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5414 5415 and r1, r1, #31 @ optional op; may set condition codes 5416 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 5417 GET_INST_OPCODE ip @ extract opcode from rINST 5418 SET_VREG r0, r9 @ vAA<- r0 5419 GOTO_OPCODE ip @ jump to next instruction 5420 /* 10-13 instructions */ 5421 5422 5423/* ------------------------------ */ 5424 .balign 128 5425.L_op_shr_int_2addr: /* 0xb9 */ 5426/* File: arm/op_shr_int_2addr.S */ 5427/* File: arm/binop2addr.S */ 5428 /* 5429 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5430 * that specifies an instruction that performs "result = r0 op r1". 5431 * This could be an ARM instruction or a function call. (If the result 5432 * comes back in a register other than r0, you can override "result".) 5433 * 5434 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5435 * vCC (r1). Useful for integer division and modulus. 5436 * 5437 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5438 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5439 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5440 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5441 */ 5442 /* binop/2addr vA, vB */ 5443 mov r3, rINST, lsr #12 @ r3<- B 5444 ubfx r9, rINST, #8, #4 @ r9<- A 5445 GET_VREG r1, r3 @ r1<- vB 5446 GET_VREG r0, r9 @ r0<- vA 5447 .if 0 5448 cmp r1, #0 @ is second operand zero? 5449 beq common_errDivideByZero 5450 .endif 5451 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5452 5453 and r1, r1, #31 @ optional op; may set condition codes 5454 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 5455 GET_INST_OPCODE ip @ extract opcode from rINST 5456 SET_VREG r0, r9 @ vAA<- r0 5457 GOTO_OPCODE ip @ jump to next instruction 5458 /* 10-13 instructions */ 5459 5460 5461/* ------------------------------ */ 5462 .balign 128 5463.L_op_ushr_int_2addr: /* 0xba */ 5464/* File: arm/op_ushr_int_2addr.S */ 5465/* File: arm/binop2addr.S */ 5466 /* 5467 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5468 * that specifies an instruction that performs "result = r0 op r1". 5469 * This could be an ARM instruction or a function call. (If the result 5470 * comes back in a register other than r0, you can override "result".) 5471 * 5472 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5473 * vCC (r1). Useful for integer division and modulus. 5474 * 5475 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5476 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5477 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5478 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5479 */ 5480 /* binop/2addr vA, vB */ 5481 mov r3, rINST, lsr #12 @ r3<- B 5482 ubfx r9, rINST, #8, #4 @ r9<- A 5483 GET_VREG r1, r3 @ r1<- vB 5484 GET_VREG r0, r9 @ r0<- vA 5485 .if 0 5486 cmp r1, #0 @ is second operand zero? 5487 beq common_errDivideByZero 5488 .endif 5489 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5490 5491 and r1, r1, #31 @ optional op; may set condition codes 5492 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 5493 GET_INST_OPCODE ip @ extract opcode from rINST 5494 SET_VREG r0, r9 @ vAA<- r0 5495 GOTO_OPCODE ip @ jump to next instruction 5496 /* 10-13 instructions */ 5497 5498 5499/* ------------------------------ */ 5500 .balign 128 5501.L_op_add_long_2addr: /* 0xbb */ 5502/* File: arm/op_add_long_2addr.S */ 5503/* File: arm/binopWide2addr.S */ 5504 /* 5505 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5506 * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5507 * This could be an ARM instruction or a function call. (If the result 5508 * comes back in a register other than r0, you can override "result".) 5509 * 5510 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5511 * vCC (r1). Useful for integer division and modulus. 5512 * 5513 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5514 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5515 * sub-double/2addr, mul-double/2addr, div-double/2addr, 5516 * rem-double/2addr 5517 */ 5518 /* binop/2addr vA, vB */ 5519 mov r1, rINST, lsr #12 @ r1<- B 5520 ubfx rINST, rINST, #8, #4 @ rINST<- A 5521 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 5522 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 5523 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5524 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5525 .if 0 5526 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5527 beq common_errDivideByZero 5528 .endif 5529 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 5530 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5531 adds r0, r0, r2 @ optional op; may set condition codes 5532 adc r1, r1, r3 @ result<- op, r0-r3 changed 5533 GET_INST_OPCODE ip @ extract opcode from rINST 5534 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5535 GOTO_OPCODE ip @ jump to next instruction 5536 /* 12-15 instructions */ 5537 5538 5539/* ------------------------------ */ 5540 .balign 128 5541.L_op_sub_long_2addr: /* 0xbc */ 5542/* File: arm/op_sub_long_2addr.S */ 5543/* File: arm/binopWide2addr.S */ 5544 /* 5545 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5546 * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5547 * This could be an ARM instruction or a function call. (If the result 5548 * comes back in a register other than r0, you can override "result".) 5549 * 5550 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5551 * vCC (r1). Useful for integer division and modulus. 5552 * 5553 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5554 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5555 * sub-double/2addr, mul-double/2addr, div-double/2addr, 5556 * rem-double/2addr 5557 */ 5558 /* binop/2addr vA, vB */ 5559 mov r1, rINST, lsr #12 @ r1<- B 5560 ubfx rINST, rINST, #8, #4 @ rINST<- A 5561 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 5562 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 5563 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5564 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5565 .if 0 5566 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5567 beq common_errDivideByZero 5568 .endif 5569 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 5570 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5571 subs r0, r0, r2 @ optional op; may set condition codes 5572 sbc r1, r1, r3 @ result<- op, r0-r3 changed 5573 GET_INST_OPCODE ip @ extract opcode from rINST 5574 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5575 GOTO_OPCODE ip @ jump to next instruction 5576 /* 12-15 instructions */ 5577 5578 5579/* ------------------------------ */ 5580 .balign 128 5581.L_op_mul_long_2addr: /* 0xbd */ 5582/* File: arm/op_mul_long_2addr.S */ 5583 /* 5584 * Signed 64-bit integer multiply, "/2addr" version. 5585 * 5586 * See op_mul_long for an explanation. 5587 * 5588 * We get a little tight on registers, so to avoid looking up &fp[A] 5589 * again we stuff it into rINST. 5590 */ 5591 /* mul-long/2addr vA, vB */ 5592 mov r1, rINST, lsr #12 @ r1<- B 5593 ubfx r9, rINST, #8, #4 @ r9<- A 5594 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 5595 VREG_INDEX_TO_ADDR rINST, r9 @ rINST<- &fp[A] 5596 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5597 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1 5598 mul ip, r2, r1 @ ip<- ZxW 5599 umull r1, lr, r2, r0 @ r1/lr <- ZxX 5600 mla r2, r0, r3, ip @ r2<- YxX + (ZxW) 5601 mov r0, rINST @ r0<- &fp[A] (free up rINST) 5602 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5603 add r2, r2, lr @ r2<- r2 + low(ZxW + (YxX)) 5604 GET_INST_OPCODE ip @ extract opcode from rINST 5605 stmia r0, {r1-r2} @ vAA/vAA+1<- r1/r2 5606 GOTO_OPCODE ip @ jump to next instruction 5607 5608/* ------------------------------ */ 5609 .balign 128 5610.L_op_div_long_2addr: /* 0xbe */ 5611/* File: arm/op_div_long_2addr.S */ 5612/* File: arm/binopWide2addr.S */ 5613 /* 5614 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5615 * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5616 * This could be an ARM instruction or a function call. (If the result 5617 * comes back in a register other than r0, you can override "result".) 5618 * 5619 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5620 * vCC (r1). Useful for integer division and modulus. 5621 * 5622 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5623 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5624 * sub-double/2addr, mul-double/2addr, div-double/2addr, 5625 * rem-double/2addr 5626 */ 5627 /* binop/2addr vA, vB */ 5628 mov r1, rINST, lsr #12 @ r1<- B 5629 ubfx rINST, rINST, #8, #4 @ rINST<- A 5630 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 5631 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 5632 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5633 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5634 .if 1 5635 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5636 beq common_errDivideByZero 5637 .endif 5638 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 5639 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5640 @ optional op; may set condition codes 5641 bl __aeabi_ldivmod @ result<- op, r0-r3 changed 5642 GET_INST_OPCODE ip @ extract opcode from rINST 5643 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5644 GOTO_OPCODE ip @ jump to next instruction 5645 /* 12-15 instructions */ 5646 5647 5648/* ------------------------------ */ 5649 .balign 128 5650.L_op_rem_long_2addr: /* 0xbf */ 5651/* File: arm/op_rem_long_2addr.S */ 5652/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */ 5653/* File: arm/binopWide2addr.S */ 5654 /* 5655 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5656 * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5657 * This could be an ARM instruction or a function call. (If the result 5658 * comes back in a register other than r0, you can override "result".) 5659 * 5660 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5661 * vCC (r1). Useful for integer division and modulus. 5662 * 5663 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5664 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5665 * sub-double/2addr, mul-double/2addr, div-double/2addr, 5666 * rem-double/2addr 5667 */ 5668 /* binop/2addr vA, vB */ 5669 mov r1, rINST, lsr #12 @ r1<- B 5670 ubfx rINST, rINST, #8, #4 @ rINST<- A 5671 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 5672 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 5673 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5674 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5675 .if 1 5676 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5677 beq common_errDivideByZero 5678 .endif 5679 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 5680 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5681 @ optional op; may set condition codes 5682 bl __aeabi_ldivmod @ result<- op, r0-r3 changed 5683 GET_INST_OPCODE ip @ extract opcode from rINST 5684 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3 5685 GOTO_OPCODE ip @ jump to next instruction 5686 /* 12-15 instructions */ 5687 5688 5689/* ------------------------------ */ 5690 .balign 128 5691.L_op_and_long_2addr: /* 0xc0 */ 5692/* File: arm/op_and_long_2addr.S */ 5693/* File: arm/binopWide2addr.S */ 5694 /* 5695 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5696 * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5697 * This could be an ARM instruction or a function call. (If the result 5698 * comes back in a register other than r0, you can override "result".) 5699 * 5700 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5701 * vCC (r1). Useful for integer division and modulus. 5702 * 5703 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5704 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5705 * sub-double/2addr, mul-double/2addr, div-double/2addr, 5706 * rem-double/2addr 5707 */ 5708 /* binop/2addr vA, vB */ 5709 mov r1, rINST, lsr #12 @ r1<- B 5710 ubfx rINST, rINST, #8, #4 @ rINST<- A 5711 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 5712 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 5713 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5714 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5715 .if 0 5716 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5717 beq common_errDivideByZero 5718 .endif 5719 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 5720 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5721 and r0, r0, r2 @ optional op; may set condition codes 5722 and r1, r1, r3 @ result<- op, r0-r3 changed 5723 GET_INST_OPCODE ip @ extract opcode from rINST 5724 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5725 GOTO_OPCODE ip @ jump to next instruction 5726 /* 12-15 instructions */ 5727 5728 5729/* ------------------------------ */ 5730 .balign 128 5731.L_op_or_long_2addr: /* 0xc1 */ 5732/* File: arm/op_or_long_2addr.S */ 5733/* File: arm/binopWide2addr.S */ 5734 /* 5735 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5736 * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5737 * This could be an ARM instruction or a function call. (If the result 5738 * comes back in a register other than r0, you can override "result".) 5739 * 5740 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5741 * vCC (r1). Useful for integer division and modulus. 5742 * 5743 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5744 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5745 * sub-double/2addr, mul-double/2addr, div-double/2addr, 5746 * rem-double/2addr 5747 */ 5748 /* binop/2addr vA, vB */ 5749 mov r1, rINST, lsr #12 @ r1<- B 5750 ubfx rINST, rINST, #8, #4 @ rINST<- A 5751 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 5752 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 5753 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5754 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5755 .if 0 5756 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5757 beq common_errDivideByZero 5758 .endif 5759 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 5760 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5761 orr r0, r0, r2 @ optional op; may set condition codes 5762 orr r1, r1, r3 @ result<- op, r0-r3 changed 5763 GET_INST_OPCODE ip @ extract opcode from rINST 5764 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5765 GOTO_OPCODE ip @ jump to next instruction 5766 /* 12-15 instructions */ 5767 5768 5769/* ------------------------------ */ 5770 .balign 128 5771.L_op_xor_long_2addr: /* 0xc2 */ 5772/* File: arm/op_xor_long_2addr.S */ 5773/* File: arm/binopWide2addr.S */ 5774 /* 5775 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5776 * that specifies an instruction that performs "result = r0-r1 op r2-r3". 5777 * This could be an ARM instruction or a function call. (If the result 5778 * comes back in a register other than r0, you can override "result".) 5779 * 5780 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5781 * vCC (r1). Useful for integer division and modulus. 5782 * 5783 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 5784 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 5785 * sub-double/2addr, mul-double/2addr, div-double/2addr, 5786 * rem-double/2addr 5787 */ 5788 /* binop/2addr vA, vB */ 5789 mov r1, rINST, lsr #12 @ r1<- B 5790 ubfx rINST, rINST, #8, #4 @ rINST<- A 5791 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 5792 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 5793 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 5794 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5795 .if 0 5796 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 5797 beq common_errDivideByZero 5798 .endif 5799 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 5800 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5801 eor r0, r0, r2 @ optional op; may set condition codes 5802 eor r1, r1, r3 @ result<- op, r0-r3 changed 5803 GET_INST_OPCODE ip @ extract opcode from rINST 5804 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 5805 GOTO_OPCODE ip @ jump to next instruction 5806 /* 12-15 instructions */ 5807 5808 5809/* ------------------------------ */ 5810 .balign 128 5811.L_op_shl_long_2addr: /* 0xc3 */ 5812/* File: arm/op_shl_long_2addr.S */ 5813 /* 5814 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 5815 * 32-bit shift distance. 5816 */ 5817 /* shl-long/2addr vA, vB */ 5818 mov r3, rINST, lsr #12 @ r3<- B 5819 ubfx r9, rINST, #8, #4 @ r9<- A 5820 GET_VREG r2, r3 @ r2<- vB 5821 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs 5822 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A] 5823 and r2, r2, #63 @ r2<- r2 & 0x3f 5824 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5825 mov r1, r1, asl r2 @ r1<- r1 << r2 5826 rsb r3, r2, #32 @ r3<- 32 - r2 5827 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2)) 5828 subs ip, r2, #32 @ ip<- r2 - 32 5829 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5830 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32) 5831 mov r0, r0, asl r2 @ r0<- r0 << r2 5832 GET_INST_OPCODE ip @ extract opcode from rINST 5833 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 5834 GOTO_OPCODE ip @ jump to next instruction 5835 5836/* ------------------------------ */ 5837 .balign 128 5838.L_op_shr_long_2addr: /* 0xc4 */ 5839/* File: arm/op_shr_long_2addr.S */ 5840 /* 5841 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 5842 * 32-bit shift distance. 5843 */ 5844 /* shr-long/2addr vA, vB */ 5845 mov r3, rINST, lsr #12 @ r3<- B 5846 ubfx r9, rINST, #8, #4 @ r9<- A 5847 GET_VREG r2, r3 @ r2<- vB 5848 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs 5849 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A] 5850 and r2, r2, #63 @ r2<- r2 & 0x3f 5851 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5852 mov r0, r0, lsr r2 @ r0<- r2 >> r2 5853 rsb r3, r2, #32 @ r3<- 32 - r2 5854 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 5855 subs ip, r2, #32 @ ip<- r2 - 32 5856 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5857 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32) 5858 mov r1, r1, asr r2 @ r1<- r1 >> r2 5859 GET_INST_OPCODE ip @ extract opcode from rINST 5860 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 5861 GOTO_OPCODE ip @ jump to next instruction 5862 5863/* ------------------------------ */ 5864 .balign 128 5865.L_op_ushr_long_2addr: /* 0xc5 */ 5866/* File: arm/op_ushr_long_2addr.S */ 5867 /* 5868 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 5869 * 32-bit shift distance. 5870 */ 5871 /* ushr-long/2addr vA, vB */ 5872 mov r3, rINST, lsr #12 @ r3<- B 5873 ubfx r9, rINST, #8, #4 @ r9<- A 5874 GET_VREG r2, r3 @ r2<- vB 5875 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs 5876 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A] 5877 and r2, r2, #63 @ r2<- r2 & 0x3f 5878 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 5879 mov r0, r0, lsr r2 @ r0<- r2 >> r2 5880 rsb r3, r2, #32 @ r3<- 32 - r2 5881 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 5882 subs ip, r2, #32 @ ip<- r2 - 32 5883 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5884 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32) 5885 mov r1, r1, lsr r2 @ r1<- r1 >>> r2 5886 GET_INST_OPCODE ip @ extract opcode from rINST 5887 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 5888 GOTO_OPCODE ip @ jump to next instruction 5889 5890/* ------------------------------ */ 5891 .balign 128 5892.L_op_add_float_2addr: /* 0xc6 */ 5893/* File: arm/op_add_float_2addr.S */ 5894/* File: arm/fbinop2addr.S */ 5895 /* 5896 * Generic 32-bit floating point "/2addr" binary operation. Provide 5897 * an "instr" line that specifies an instruction that performs 5898 * "s2 = s0 op s1". 5899 * 5900 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr 5901 */ 5902 /* binop/2addr vA, vB */ 5903 mov r3, rINST, lsr #12 @ r3<- B 5904 ubfx r9, rINST, #8, #4 @ r9<- A 5905 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 5906 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 5907 flds s1, [r3] @ s1<- vB 5908 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5909 flds s0, [r9] @ s0<- vA 5910 fadds s2, s0, s1 @ s2<- op 5911 GET_INST_OPCODE ip @ extract opcode from rINST 5912 fsts s2, [r9] @ vAA<- s2 5913 GOTO_OPCODE ip @ jump to next instruction 5914 5915 5916/* ------------------------------ */ 5917 .balign 128 5918.L_op_sub_float_2addr: /* 0xc7 */ 5919/* File: arm/op_sub_float_2addr.S */ 5920/* File: arm/fbinop2addr.S */ 5921 /* 5922 * Generic 32-bit floating point "/2addr" binary operation. Provide 5923 * an "instr" line that specifies an instruction that performs 5924 * "s2 = s0 op s1". 5925 * 5926 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr 5927 */ 5928 /* binop/2addr vA, vB */ 5929 mov r3, rINST, lsr #12 @ r3<- B 5930 ubfx r9, rINST, #8, #4 @ r9<- A 5931 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 5932 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 5933 flds s1, [r3] @ s1<- vB 5934 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5935 flds s0, [r9] @ s0<- vA 5936 fsubs s2, s0, s1 @ s2<- op 5937 GET_INST_OPCODE ip @ extract opcode from rINST 5938 fsts s2, [r9] @ vAA<- s2 5939 GOTO_OPCODE ip @ jump to next instruction 5940 5941 5942/* ------------------------------ */ 5943 .balign 128 5944.L_op_mul_float_2addr: /* 0xc8 */ 5945/* File: arm/op_mul_float_2addr.S */ 5946/* File: arm/fbinop2addr.S */ 5947 /* 5948 * Generic 32-bit floating point "/2addr" binary operation. Provide 5949 * an "instr" line that specifies an instruction that performs 5950 * "s2 = s0 op s1". 5951 * 5952 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr 5953 */ 5954 /* binop/2addr vA, vB */ 5955 mov r3, rINST, lsr #12 @ r3<- B 5956 ubfx r9, rINST, #8, #4 @ r9<- A 5957 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 5958 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 5959 flds s1, [r3] @ s1<- vB 5960 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5961 flds s0, [r9] @ s0<- vA 5962 fmuls s2, s0, s1 @ s2<- op 5963 GET_INST_OPCODE ip @ extract opcode from rINST 5964 fsts s2, [r9] @ vAA<- s2 5965 GOTO_OPCODE ip @ jump to next instruction 5966 5967 5968/* ------------------------------ */ 5969 .balign 128 5970.L_op_div_float_2addr: /* 0xc9 */ 5971/* File: arm/op_div_float_2addr.S */ 5972/* File: arm/fbinop2addr.S */ 5973 /* 5974 * Generic 32-bit floating point "/2addr" binary operation. Provide 5975 * an "instr" line that specifies an instruction that performs 5976 * "s2 = s0 op s1". 5977 * 5978 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr 5979 */ 5980 /* binop/2addr vA, vB */ 5981 mov r3, rINST, lsr #12 @ r3<- B 5982 ubfx r9, rINST, #8, #4 @ r9<- A 5983 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 5984 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 5985 flds s1, [r3] @ s1<- vB 5986 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 5987 flds s0, [r9] @ s0<- vA 5988 fdivs s2, s0, s1 @ s2<- op 5989 GET_INST_OPCODE ip @ extract opcode from rINST 5990 fsts s2, [r9] @ vAA<- s2 5991 GOTO_OPCODE ip @ jump to next instruction 5992 5993 5994/* ------------------------------ */ 5995 .balign 128 5996.L_op_rem_float_2addr: /* 0xca */ 5997/* File: arm/op_rem_float_2addr.S */ 5998/* EABI doesn't define a float remainder function, but libm does */ 5999/* File: arm/binop2addr.S */ 6000 /* 6001 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 6002 * that specifies an instruction that performs "result = r0 op r1". 6003 * This could be an ARM instruction or a function call. (If the result 6004 * comes back in a register other than r0, you can override "result".) 6005 * 6006 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6007 * vCC (r1). Useful for integer division and modulus. 6008 * 6009 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 6010 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 6011 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 6012 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 6013 */ 6014 /* binop/2addr vA, vB */ 6015 mov r3, rINST, lsr #12 @ r3<- B 6016 ubfx r9, rINST, #8, #4 @ r9<- A 6017 GET_VREG r1, r3 @ r1<- vB 6018 GET_VREG r0, r9 @ r0<- vA 6019 .if 0 6020 cmp r1, #0 @ is second operand zero? 6021 beq common_errDivideByZero 6022 .endif 6023 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 6024 6025 @ optional op; may set condition codes 6026 bl fmodf @ r0<- op, r0-r3 changed 6027 GET_INST_OPCODE ip @ extract opcode from rINST 6028 SET_VREG r0, r9 @ vAA<- r0 6029 GOTO_OPCODE ip @ jump to next instruction 6030 /* 10-13 instructions */ 6031 6032 6033/* ------------------------------ */ 6034 .balign 128 6035.L_op_add_double_2addr: /* 0xcb */ 6036/* File: arm/op_add_double_2addr.S */ 6037/* File: arm/fbinopWide2addr.S */ 6038 /* 6039 * Generic 64-bit floating point "/2addr" binary operation. Provide 6040 * an "instr" line that specifies an instruction that performs 6041 * "d2 = d0 op d1". 6042 * 6043 * For: add-double/2addr, sub-double/2addr, mul-double/2addr, 6044 * div-double/2addr 6045 */ 6046 /* binop/2addr vA, vB */ 6047 mov r3, rINST, lsr #12 @ r3<- B 6048 ubfx r9, rINST, #8, #4 @ r9<- A 6049 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 6050 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs 6051 fldd d1, [r3] @ d1<- vB 6052 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 6053 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 6054 fldd d0, [r9] @ d0<- vA 6055 faddd d2, d0, d1 @ d2<- op 6056 GET_INST_OPCODE ip @ extract opcode from rINST 6057 fstd d2, [r9] @ vAA<- d2 6058 GOTO_OPCODE ip @ jump to next instruction 6059 6060 6061/* ------------------------------ */ 6062 .balign 128 6063.L_op_sub_double_2addr: /* 0xcc */ 6064/* File: arm/op_sub_double_2addr.S */ 6065/* File: arm/fbinopWide2addr.S */ 6066 /* 6067 * Generic 64-bit floating point "/2addr" binary operation. Provide 6068 * an "instr" line that specifies an instruction that performs 6069 * "d2 = d0 op d1". 6070 * 6071 * For: add-double/2addr, sub-double/2addr, mul-double/2addr, 6072 * div-double/2addr 6073 */ 6074 /* binop/2addr vA, vB */ 6075 mov r3, rINST, lsr #12 @ r3<- B 6076 ubfx r9, rINST, #8, #4 @ r9<- A 6077 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 6078 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs 6079 fldd d1, [r3] @ d1<- vB 6080 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 6081 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 6082 fldd d0, [r9] @ d0<- vA 6083 fsubd d2, d0, d1 @ d2<- op 6084 GET_INST_OPCODE ip @ extract opcode from rINST 6085 fstd d2, [r9] @ vAA<- d2 6086 GOTO_OPCODE ip @ jump to next instruction 6087 6088 6089/* ------------------------------ */ 6090 .balign 128 6091.L_op_mul_double_2addr: /* 0xcd */ 6092/* File: arm/op_mul_double_2addr.S */ 6093/* File: arm/fbinopWide2addr.S */ 6094 /* 6095 * Generic 64-bit floating point "/2addr" binary operation. Provide 6096 * an "instr" line that specifies an instruction that performs 6097 * "d2 = d0 op d1". 6098 * 6099 * For: add-double/2addr, sub-double/2addr, mul-double/2addr, 6100 * div-double/2addr 6101 */ 6102 /* binop/2addr vA, vB */ 6103 mov r3, rINST, lsr #12 @ r3<- B 6104 ubfx r9, rINST, #8, #4 @ r9<- A 6105 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 6106 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs 6107 fldd d1, [r3] @ d1<- vB 6108 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 6109 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 6110 fldd d0, [r9] @ d0<- vA 6111 fmuld d2, d0, d1 @ d2<- op 6112 GET_INST_OPCODE ip @ extract opcode from rINST 6113 fstd d2, [r9] @ vAA<- d2 6114 GOTO_OPCODE ip @ jump to next instruction 6115 6116 6117/* ------------------------------ */ 6118 .balign 128 6119.L_op_div_double_2addr: /* 0xce */ 6120/* File: arm/op_div_double_2addr.S */ 6121/* File: arm/fbinopWide2addr.S */ 6122 /* 6123 * Generic 64-bit floating point "/2addr" binary operation. Provide 6124 * an "instr" line that specifies an instruction that performs 6125 * "d2 = d0 op d1". 6126 * 6127 * For: add-double/2addr, sub-double/2addr, mul-double/2addr, 6128 * div-double/2addr 6129 */ 6130 /* binop/2addr vA, vB */ 6131 mov r3, rINST, lsr #12 @ r3<- B 6132 ubfx r9, rINST, #8, #4 @ r9<- A 6133 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB 6134 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs 6135 fldd d1, [r3] @ d1<- vB 6136 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA 6137 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 6138 fldd d0, [r9] @ d0<- vA 6139 fdivd d2, d0, d1 @ d2<- op 6140 GET_INST_OPCODE ip @ extract opcode from rINST 6141 fstd d2, [r9] @ vAA<- d2 6142 GOTO_OPCODE ip @ jump to next instruction 6143 6144 6145/* ------------------------------ */ 6146 .balign 128 6147.L_op_rem_double_2addr: /* 0xcf */ 6148/* File: arm/op_rem_double_2addr.S */ 6149/* EABI doesn't define a double remainder function, but libm does */ 6150/* File: arm/binopWide2addr.S */ 6151 /* 6152 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 6153 * that specifies an instruction that performs "result = r0-r1 op r2-r3". 6154 * This could be an ARM instruction or a function call. (If the result 6155 * comes back in a register other than r0, you can override "result".) 6156 * 6157 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6158 * vCC (r1). Useful for integer division and modulus. 6159 * 6160 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr, 6161 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr, 6162 * sub-double/2addr, mul-double/2addr, div-double/2addr, 6163 * rem-double/2addr 6164 */ 6165 /* binop/2addr vA, vB */ 6166 mov r1, rINST, lsr #12 @ r1<- B 6167 ubfx rINST, rINST, #8, #4 @ rINST<- A 6168 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] 6169 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] 6170 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 6171 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1 6172 .if 0 6173 orrs ip, r2, r3 @ second arg (r2-r3) is zero? 6174 beq common_errDivideByZero 6175 .endif 6176 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs 6177 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST 6178 @ optional op; may set condition codes 6179 bl fmod @ result<- op, r0-r3 changed 6180 GET_INST_OPCODE ip @ extract opcode from rINST 6181 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1 6182 GOTO_OPCODE ip @ jump to next instruction 6183 /* 12-15 instructions */ 6184 6185 6186/* ------------------------------ */ 6187 .balign 128 6188.L_op_add_int_lit16: /* 0xd0 */ 6189/* File: arm/op_add_int_lit16.S */ 6190/* File: arm/binopLit16.S */ 6191 /* 6192 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6193 * that specifies an instruction that performs "result = r0 op r1". 6194 * This could be an ARM instruction or a function call. (If the result 6195 * comes back in a register other than r0, you can override "result".) 6196 * 6197 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6198 * vCC (r1). Useful for integer division and modulus. 6199 * 6200 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6201 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6202 */ 6203 /* binop/lit16 vA, vB, #+CCCC */ 6204 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) 6205 mov r2, rINST, lsr #12 @ r2<- B 6206 ubfx r9, rINST, #8, #4 @ r9<- A 6207 GET_VREG r0, r2 @ r0<- vB 6208 .if 0 6209 cmp r1, #0 @ is second operand zero? 6210 beq common_errDivideByZero 6211 .endif 6212 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6213 6214 add r0, r0, r1 @ r0<- op, r0-r3 changed 6215 GET_INST_OPCODE ip @ extract opcode from rINST 6216 SET_VREG r0, r9 @ vAA<- r0 6217 GOTO_OPCODE ip @ jump to next instruction 6218 /* 10-13 instructions */ 6219 6220 6221/* ------------------------------ */ 6222 .balign 128 6223.L_op_rsub_int: /* 0xd1 */ 6224/* File: arm/op_rsub_int.S */ 6225/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */ 6226/* File: arm/binopLit16.S */ 6227 /* 6228 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6229 * that specifies an instruction that performs "result = r0 op r1". 6230 * This could be an ARM instruction or a function call. (If the result 6231 * comes back in a register other than r0, you can override "result".) 6232 * 6233 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6234 * vCC (r1). Useful for integer division and modulus. 6235 * 6236 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6237 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6238 */ 6239 /* binop/lit16 vA, vB, #+CCCC */ 6240 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) 6241 mov r2, rINST, lsr #12 @ r2<- B 6242 ubfx r9, rINST, #8, #4 @ r9<- A 6243 GET_VREG r0, r2 @ r0<- vB 6244 .if 0 6245 cmp r1, #0 @ is second operand zero? 6246 beq common_errDivideByZero 6247 .endif 6248 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6249 6250 rsb r0, r0, r1 @ r0<- op, r0-r3 changed 6251 GET_INST_OPCODE ip @ extract opcode from rINST 6252 SET_VREG r0, r9 @ vAA<- r0 6253 GOTO_OPCODE ip @ jump to next instruction 6254 /* 10-13 instructions */ 6255 6256 6257/* ------------------------------ */ 6258 .balign 128 6259.L_op_mul_int_lit16: /* 0xd2 */ 6260/* File: arm/op_mul_int_lit16.S */ 6261/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 6262/* File: arm/binopLit16.S */ 6263 /* 6264 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6265 * that specifies an instruction that performs "result = r0 op r1". 6266 * This could be an ARM instruction or a function call. (If the result 6267 * comes back in a register other than r0, you can override "result".) 6268 * 6269 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6270 * vCC (r1). Useful for integer division and modulus. 6271 * 6272 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6273 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6274 */ 6275 /* binop/lit16 vA, vB, #+CCCC */ 6276 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) 6277 mov r2, rINST, lsr #12 @ r2<- B 6278 ubfx r9, rINST, #8, #4 @ r9<- A 6279 GET_VREG r0, r2 @ r0<- vB 6280 .if 0 6281 cmp r1, #0 @ is second operand zero? 6282 beq common_errDivideByZero 6283 .endif 6284 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6285 6286 mul r0, r1, r0 @ r0<- op, r0-r3 changed 6287 GET_INST_OPCODE ip @ extract opcode from rINST 6288 SET_VREG r0, r9 @ vAA<- r0 6289 GOTO_OPCODE ip @ jump to next instruction 6290 /* 10-13 instructions */ 6291 6292 6293/* ------------------------------ */ 6294 .balign 128 6295.L_op_div_int_lit16: /* 0xd3 */ 6296/* File: arm/op_div_int_lit16.S */ 6297 /* 6298 * Specialized 32-bit binary operation 6299 * 6300 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper 6301 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for 6302 * ARMv7 CPUs that have hardware division support). 6303 * 6304 * div-int/lit16 6305 * 6306 */ 6307 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) 6308 mov r2, rINST, lsr #12 @ r2<- B 6309 ubfx r9, rINST, #8, #4 @ r9<- A 6310 GET_VREG r0, r2 @ r0<- vB 6311 cmp r1, #0 @ is second operand zero? 6312 beq common_errDivideByZero 6313 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6314 6315#ifdef __ARM_ARCH_EXT_IDIV__ 6316 sdiv r0, r0, r1 @ r0<- op 6317#else 6318 bl __aeabi_idiv @ r0<- op, r0-r3 changed 6319#endif 6320 GET_INST_OPCODE ip @ extract opcode from rINST 6321 SET_VREG r0, r9 @ vAA<- r0 6322 GOTO_OPCODE ip @ jump to next instruction 6323 /* 10-13 instructions */ 6324 6325/* ------------------------------ */ 6326 .balign 128 6327.L_op_rem_int_lit16: /* 0xd4 */ 6328/* File: arm/op_rem_int_lit16.S */ 6329 /* 6330 * Specialized 32-bit binary operation 6331 * 6332 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper 6333 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for 6334 * ARMv7 CPUs that have hardware division support). 6335 * 6336 * NOTE: idivmod returns quotient in r0 and remainder in r1 6337 * 6338 * rem-int/lit16 6339 * 6340 */ 6341 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) 6342 mov r2, rINST, lsr #12 @ r2<- B 6343 ubfx r9, rINST, #8, #4 @ r9<- A 6344 GET_VREG r0, r2 @ r0<- vB 6345 cmp r1, #0 @ is second operand zero? 6346 beq common_errDivideByZero 6347 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6348 6349#ifdef __ARM_ARCH_EXT_IDIV__ 6350 sdiv r2, r0, r1 6351 mls r1, r1, r2, r0 @ r1<- op 6352#else 6353 bl __aeabi_idivmod @ r1<- op, r0-r3 changed 6354#endif 6355 GET_INST_OPCODE ip @ extract opcode from rINST 6356 SET_VREG r1, r9 @ vAA<- r1 6357 GOTO_OPCODE ip @ jump to next instruction 6358 /* 10-13 instructions */ 6359 6360/* ------------------------------ */ 6361 .balign 128 6362.L_op_and_int_lit16: /* 0xd5 */ 6363/* File: arm/op_and_int_lit16.S */ 6364/* File: arm/binopLit16.S */ 6365 /* 6366 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6367 * that specifies an instruction that performs "result = r0 op r1". 6368 * This could be an ARM instruction or a function call. (If the result 6369 * comes back in a register other than r0, you can override "result".) 6370 * 6371 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6372 * vCC (r1). Useful for integer division and modulus. 6373 * 6374 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6375 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6376 */ 6377 /* binop/lit16 vA, vB, #+CCCC */ 6378 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) 6379 mov r2, rINST, lsr #12 @ r2<- B 6380 ubfx r9, rINST, #8, #4 @ r9<- A 6381 GET_VREG r0, r2 @ r0<- vB 6382 .if 0 6383 cmp r1, #0 @ is second operand zero? 6384 beq common_errDivideByZero 6385 .endif 6386 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6387 6388 and r0, r0, r1 @ r0<- op, r0-r3 changed 6389 GET_INST_OPCODE ip @ extract opcode from rINST 6390 SET_VREG r0, r9 @ vAA<- r0 6391 GOTO_OPCODE ip @ jump to next instruction 6392 /* 10-13 instructions */ 6393 6394 6395/* ------------------------------ */ 6396 .balign 128 6397.L_op_or_int_lit16: /* 0xd6 */ 6398/* File: arm/op_or_int_lit16.S */ 6399/* File: arm/binopLit16.S */ 6400 /* 6401 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6402 * that specifies an instruction that performs "result = r0 op r1". 6403 * This could be an ARM instruction or a function call. (If the result 6404 * comes back in a register other than r0, you can override "result".) 6405 * 6406 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6407 * vCC (r1). Useful for integer division and modulus. 6408 * 6409 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6410 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6411 */ 6412 /* binop/lit16 vA, vB, #+CCCC */ 6413 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) 6414 mov r2, rINST, lsr #12 @ r2<- B 6415 ubfx r9, rINST, #8, #4 @ r9<- A 6416 GET_VREG r0, r2 @ r0<- vB 6417 .if 0 6418 cmp r1, #0 @ is second operand zero? 6419 beq common_errDivideByZero 6420 .endif 6421 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6422 6423 orr r0, r0, r1 @ r0<- op, r0-r3 changed 6424 GET_INST_OPCODE ip @ extract opcode from rINST 6425 SET_VREG r0, r9 @ vAA<- r0 6426 GOTO_OPCODE ip @ jump to next instruction 6427 /* 10-13 instructions */ 6428 6429 6430/* ------------------------------ */ 6431 .balign 128 6432.L_op_xor_int_lit16: /* 0xd7 */ 6433/* File: arm/op_xor_int_lit16.S */ 6434/* File: arm/binopLit16.S */ 6435 /* 6436 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6437 * that specifies an instruction that performs "result = r0 op r1". 6438 * This could be an ARM instruction or a function call. (If the result 6439 * comes back in a register other than r0, you can override "result".) 6440 * 6441 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6442 * vCC (r1). Useful for integer division and modulus. 6443 * 6444 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6445 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6446 */ 6447 /* binop/lit16 vA, vB, #+CCCC */ 6448 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) 6449 mov r2, rINST, lsr #12 @ r2<- B 6450 ubfx r9, rINST, #8, #4 @ r9<- A 6451 GET_VREG r0, r2 @ r0<- vB 6452 .if 0 6453 cmp r1, #0 @ is second operand zero? 6454 beq common_errDivideByZero 6455 .endif 6456 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6457 6458 eor r0, r0, r1 @ r0<- op, r0-r3 changed 6459 GET_INST_OPCODE ip @ extract opcode from rINST 6460 SET_VREG r0, r9 @ vAA<- r0 6461 GOTO_OPCODE ip @ jump to next instruction 6462 /* 10-13 instructions */ 6463 6464 6465/* ------------------------------ */ 6466 .balign 128 6467.L_op_add_int_lit8: /* 0xd8 */ 6468/* File: arm/op_add_int_lit8.S */ 6469/* File: arm/binopLit8.S */ 6470 /* 6471 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6472 * that specifies an instruction that performs "result = r0 op r1". 6473 * This could be an ARM instruction or a function call. (If the result 6474 * comes back in a register other than r0, you can override "result".) 6475 * 6476 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6477 * vCC (r1). Useful for integer division and modulus. 6478 * 6479 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6480 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6481 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6482 */ 6483 /* binop/lit8 vAA, vBB, #+CC */ 6484 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6485 mov r9, rINST, lsr #8 @ r9<- AA 6486 and r2, r3, #255 @ r2<- BB 6487 GET_VREG r0, r2 @ r0<- vBB 6488 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6489 .if 0 6490 @cmp r1, #0 @ is second operand zero? 6491 beq common_errDivideByZero 6492 .endif 6493 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6494 6495 @ optional op; may set condition codes 6496 add r0, r0, r1 @ r0<- op, r0-r3 changed 6497 GET_INST_OPCODE ip @ extract opcode from rINST 6498 SET_VREG r0, r9 @ vAA<- r0 6499 GOTO_OPCODE ip @ jump to next instruction 6500 /* 10-12 instructions */ 6501 6502 6503/* ------------------------------ */ 6504 .balign 128 6505.L_op_rsub_int_lit8: /* 0xd9 */ 6506/* File: arm/op_rsub_int_lit8.S */ 6507/* File: arm/binopLit8.S */ 6508 /* 6509 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6510 * that specifies an instruction that performs "result = r0 op r1". 6511 * This could be an ARM instruction or a function call. (If the result 6512 * comes back in a register other than r0, you can override "result".) 6513 * 6514 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6515 * vCC (r1). Useful for integer division and modulus. 6516 * 6517 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6518 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6519 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6520 */ 6521 /* binop/lit8 vAA, vBB, #+CC */ 6522 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6523 mov r9, rINST, lsr #8 @ r9<- AA 6524 and r2, r3, #255 @ r2<- BB 6525 GET_VREG r0, r2 @ r0<- vBB 6526 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6527 .if 0 6528 @cmp r1, #0 @ is second operand zero? 6529 beq common_errDivideByZero 6530 .endif 6531 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6532 6533 @ optional op; may set condition codes 6534 rsb r0, r0, r1 @ r0<- op, r0-r3 changed 6535 GET_INST_OPCODE ip @ extract opcode from rINST 6536 SET_VREG r0, r9 @ vAA<- r0 6537 GOTO_OPCODE ip @ jump to next instruction 6538 /* 10-12 instructions */ 6539 6540 6541/* ------------------------------ */ 6542 .balign 128 6543.L_op_mul_int_lit8: /* 0xda */ 6544/* File: arm/op_mul_int_lit8.S */ 6545/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */ 6546/* File: arm/binopLit8.S */ 6547 /* 6548 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6549 * that specifies an instruction that performs "result = r0 op r1". 6550 * This could be an ARM instruction or a function call. (If the result 6551 * comes back in a register other than r0, you can override "result".) 6552 * 6553 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6554 * vCC (r1). Useful for integer division and modulus. 6555 * 6556 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6557 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6558 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6559 */ 6560 /* binop/lit8 vAA, vBB, #+CC */ 6561 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6562 mov r9, rINST, lsr #8 @ r9<- AA 6563 and r2, r3, #255 @ r2<- BB 6564 GET_VREG r0, r2 @ r0<- vBB 6565 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6566 .if 0 6567 @cmp r1, #0 @ is second operand zero? 6568 beq common_errDivideByZero 6569 .endif 6570 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6571 6572 @ optional op; may set condition codes 6573 mul r0, r1, r0 @ r0<- op, r0-r3 changed 6574 GET_INST_OPCODE ip @ extract opcode from rINST 6575 SET_VREG r0, r9 @ vAA<- r0 6576 GOTO_OPCODE ip @ jump to next instruction 6577 /* 10-12 instructions */ 6578 6579 6580/* ------------------------------ */ 6581 .balign 128 6582.L_op_div_int_lit8: /* 0xdb */ 6583/* File: arm/op_div_int_lit8.S */ 6584 /* 6585 * Specialized 32-bit binary operation 6586 * 6587 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper 6588 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for 6589 * ARMv7 CPUs that have hardware division support). 6590 * 6591 * div-int/lit8 6592 * 6593 */ 6594 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC 6595 mov r9, rINST, lsr #8 @ r9<- AA 6596 and r2, r3, #255 @ r2<- BB 6597 GET_VREG r0, r2 @ r0<- vBB 6598 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6599 @cmp r1, #0 @ is second operand zero? 6600 beq common_errDivideByZero 6601 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6602 6603#ifdef __ARM_ARCH_EXT_IDIV__ 6604 sdiv r0, r0, r1 @ r0<- op 6605#else 6606 bl __aeabi_idiv @ r0<- op, r0-r3 changed 6607#endif 6608 GET_INST_OPCODE ip @ extract opcode from rINST 6609 SET_VREG r0, r9 @ vAA<- r0 6610 GOTO_OPCODE ip @ jump to next instruction 6611 /* 10-12 instructions */ 6612 6613/* ------------------------------ */ 6614 .balign 128 6615.L_op_rem_int_lit8: /* 0xdc */ 6616/* File: arm/op_rem_int_lit8.S */ 6617 /* 6618 * Specialized 32-bit binary operation 6619 * 6620 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper 6621 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for 6622 * ARMv7 CPUs that have hardware division support). 6623 * 6624 * NOTE: idivmod returns quotient in r0 and remainder in r1 6625 * 6626 * rem-int/lit8 6627 * 6628 */ 6629 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6630 mov r9, rINST, lsr #8 @ r9<- AA 6631 and r2, r3, #255 @ r2<- BB 6632 GET_VREG r0, r2 @ r0<- vBB 6633 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6634 @cmp r1, #0 @ is second operand zero? 6635 beq common_errDivideByZero 6636 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6637 6638#ifdef __ARM_ARCH_EXT_IDIV__ 6639 sdiv r2, r0, r1 6640 mls r1, r1, r2, r0 @ r1<- op 6641#else 6642 bl __aeabi_idivmod @ r1<- op, r0-r3 changed 6643#endif 6644 GET_INST_OPCODE ip @ extract opcode from rINST 6645 SET_VREG r1, r9 @ vAA<- r1 6646 GOTO_OPCODE ip @ jump to next instruction 6647 /* 10-12 instructions */ 6648 6649/* ------------------------------ */ 6650 .balign 128 6651.L_op_and_int_lit8: /* 0xdd */ 6652/* File: arm/op_and_int_lit8.S */ 6653/* File: arm/binopLit8.S */ 6654 /* 6655 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6656 * that specifies an instruction that performs "result = r0 op r1". 6657 * This could be an ARM instruction or a function call. (If the result 6658 * comes back in a register other than r0, you can override "result".) 6659 * 6660 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6661 * vCC (r1). Useful for integer division and modulus. 6662 * 6663 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6664 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6665 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6666 */ 6667 /* binop/lit8 vAA, vBB, #+CC */ 6668 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6669 mov r9, rINST, lsr #8 @ r9<- AA 6670 and r2, r3, #255 @ r2<- BB 6671 GET_VREG r0, r2 @ r0<- vBB 6672 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6673 .if 0 6674 @cmp r1, #0 @ is second operand zero? 6675 beq common_errDivideByZero 6676 .endif 6677 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6678 6679 @ optional op; may set condition codes 6680 and r0, r0, r1 @ r0<- op, r0-r3 changed 6681 GET_INST_OPCODE ip @ extract opcode from rINST 6682 SET_VREG r0, r9 @ vAA<- r0 6683 GOTO_OPCODE ip @ jump to next instruction 6684 /* 10-12 instructions */ 6685 6686 6687/* ------------------------------ */ 6688 .balign 128 6689.L_op_or_int_lit8: /* 0xde */ 6690/* File: arm/op_or_int_lit8.S */ 6691/* File: arm/binopLit8.S */ 6692 /* 6693 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6694 * that specifies an instruction that performs "result = r0 op r1". 6695 * This could be an ARM instruction or a function call. (If the result 6696 * comes back in a register other than r0, you can override "result".) 6697 * 6698 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6699 * vCC (r1). Useful for integer division and modulus. 6700 * 6701 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6702 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6703 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6704 */ 6705 /* binop/lit8 vAA, vBB, #+CC */ 6706 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6707 mov r9, rINST, lsr #8 @ r9<- AA 6708 and r2, r3, #255 @ r2<- BB 6709 GET_VREG r0, r2 @ r0<- vBB 6710 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6711 .if 0 6712 @cmp r1, #0 @ is second operand zero? 6713 beq common_errDivideByZero 6714 .endif 6715 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6716 6717 @ optional op; may set condition codes 6718 orr r0, r0, r1 @ r0<- op, r0-r3 changed 6719 GET_INST_OPCODE ip @ extract opcode from rINST 6720 SET_VREG r0, r9 @ vAA<- r0 6721 GOTO_OPCODE ip @ jump to next instruction 6722 /* 10-12 instructions */ 6723 6724 6725/* ------------------------------ */ 6726 .balign 128 6727.L_op_xor_int_lit8: /* 0xdf */ 6728/* File: arm/op_xor_int_lit8.S */ 6729/* File: arm/binopLit8.S */ 6730 /* 6731 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6732 * that specifies an instruction that performs "result = r0 op r1". 6733 * This could be an ARM instruction or a function call. (If the result 6734 * comes back in a register other than r0, you can override "result".) 6735 * 6736 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6737 * vCC (r1). Useful for integer division and modulus. 6738 * 6739 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6740 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6741 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6742 */ 6743 /* binop/lit8 vAA, vBB, #+CC */ 6744 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6745 mov r9, rINST, lsr #8 @ r9<- AA 6746 and r2, r3, #255 @ r2<- BB 6747 GET_VREG r0, r2 @ r0<- vBB 6748 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6749 .if 0 6750 @cmp r1, #0 @ is second operand zero? 6751 beq common_errDivideByZero 6752 .endif 6753 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6754 6755 @ optional op; may set condition codes 6756 eor r0, r0, r1 @ r0<- op, r0-r3 changed 6757 GET_INST_OPCODE ip @ extract opcode from rINST 6758 SET_VREG r0, r9 @ vAA<- r0 6759 GOTO_OPCODE ip @ jump to next instruction 6760 /* 10-12 instructions */ 6761 6762 6763/* ------------------------------ */ 6764 .balign 128 6765.L_op_shl_int_lit8: /* 0xe0 */ 6766/* File: arm/op_shl_int_lit8.S */ 6767/* File: arm/binopLit8.S */ 6768 /* 6769 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6770 * that specifies an instruction that performs "result = r0 op r1". 6771 * This could be an ARM instruction or a function call. (If the result 6772 * comes back in a register other than r0, you can override "result".) 6773 * 6774 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6775 * vCC (r1). Useful for integer division and modulus. 6776 * 6777 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6778 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6779 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6780 */ 6781 /* binop/lit8 vAA, vBB, #+CC */ 6782 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6783 mov r9, rINST, lsr #8 @ r9<- AA 6784 and r2, r3, #255 @ r2<- BB 6785 GET_VREG r0, r2 @ r0<- vBB 6786 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6787 .if 0 6788 @cmp r1, #0 @ is second operand zero? 6789 beq common_errDivideByZero 6790 .endif 6791 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6792 6793 and r1, r1, #31 @ optional op; may set condition codes 6794 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed 6795 GET_INST_OPCODE ip @ extract opcode from rINST 6796 SET_VREG r0, r9 @ vAA<- r0 6797 GOTO_OPCODE ip @ jump to next instruction 6798 /* 10-12 instructions */ 6799 6800 6801/* ------------------------------ */ 6802 .balign 128 6803.L_op_shr_int_lit8: /* 0xe1 */ 6804/* File: arm/op_shr_int_lit8.S */ 6805/* File: arm/binopLit8.S */ 6806 /* 6807 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6808 * that specifies an instruction that performs "result = r0 op r1". 6809 * This could be an ARM instruction or a function call. (If the result 6810 * comes back in a register other than r0, you can override "result".) 6811 * 6812 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6813 * vCC (r1). Useful for integer division and modulus. 6814 * 6815 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6816 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6817 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6818 */ 6819 /* binop/lit8 vAA, vBB, #+CC */ 6820 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6821 mov r9, rINST, lsr #8 @ r9<- AA 6822 and r2, r3, #255 @ r2<- BB 6823 GET_VREG r0, r2 @ r0<- vBB 6824 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6825 .if 0 6826 @cmp r1, #0 @ is second operand zero? 6827 beq common_errDivideByZero 6828 .endif 6829 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6830 6831 and r1, r1, #31 @ optional op; may set condition codes 6832 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed 6833 GET_INST_OPCODE ip @ extract opcode from rINST 6834 SET_VREG r0, r9 @ vAA<- r0 6835 GOTO_OPCODE ip @ jump to next instruction 6836 /* 10-12 instructions */ 6837 6838 6839/* ------------------------------ */ 6840 .balign 128 6841.L_op_ushr_int_lit8: /* 0xe2 */ 6842/* File: arm/op_ushr_int_lit8.S */ 6843/* File: arm/binopLit8.S */ 6844 /* 6845 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6846 * that specifies an instruction that performs "result = r0 op r1". 6847 * This could be an ARM instruction or a function call. (If the result 6848 * comes back in a register other than r0, you can override "result".) 6849 * 6850 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6851 * vCC (r1). Useful for integer division and modulus. 6852 * 6853 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6854 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6855 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6856 */ 6857 /* binop/lit8 vAA, vBB, #+CC */ 6858 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC) 6859 mov r9, rINST, lsr #8 @ r9<- AA 6860 and r2, r3, #255 @ r2<- BB 6861 GET_VREG r0, r2 @ r0<- vBB 6862 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended) 6863 .if 0 6864 @cmp r1, #0 @ is second operand zero? 6865 beq common_errDivideByZero 6866 .endif 6867 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6868 6869 and r1, r1, #31 @ optional op; may set condition codes 6870 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed 6871 GET_INST_OPCODE ip @ extract opcode from rINST 6872 SET_VREG r0, r9 @ vAA<- r0 6873 GOTO_OPCODE ip @ jump to next instruction 6874 /* 10-12 instructions */ 6875 6876 6877/* ------------------------------ */ 6878 .balign 128 6879.L_op_iget_quick: /* 0xe3 */ 6880/* File: arm/op_iget_quick.S */ 6881 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6882 /* op vA, vB, offset@CCCC */ 6883 mov r2, rINST, lsr #12 @ r2<- B 6884 FETCH r1, 1 @ r1<- field byte offset 6885 GET_VREG r3, r2 @ r3<- object we're operating on 6886 ubfx r2, rINST, #8, #4 @ r2<- A 6887 cmp r3, #0 @ check object for null 6888 beq common_errNullObject @ object was null 6889 ldr r0, [r3, r1] @ r0<- obj.field 6890 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6891 SET_VREG r0, r2 @ fp[A]<- r0 6892 GET_INST_OPCODE ip @ extract opcode from rINST 6893 GOTO_OPCODE ip @ jump to next instruction 6894 6895/* ------------------------------ */ 6896 .balign 128 6897.L_op_iget_wide_quick: /* 0xe4 */ 6898/* File: arm/op_iget_wide_quick.S */ 6899 /* iget-wide-quick vA, vB, offset@CCCC */ 6900 mov r2, rINST, lsr #12 @ r2<- B 6901 FETCH ip, 1 @ ip<- field byte offset 6902 GET_VREG r3, r2 @ r3<- object we're operating on 6903 ubfx r2, rINST, #8, #4 @ r2<- A 6904 cmp r3, #0 @ check object for null 6905 beq common_errNullObject @ object was null 6906 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned) 6907 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6908 VREG_INDEX_TO_ADDR r3, r2 @ r3<- &fp[A] 6909 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs 6910 GET_INST_OPCODE ip @ extract opcode from rINST 6911 stmia r3, {r0-r1} @ fp[A]<- r0/r1 6912 GOTO_OPCODE ip @ jump to next instruction 6913 6914/* ------------------------------ */ 6915 .balign 128 6916.L_op_iget_object_quick: /* 0xe5 */ 6917/* File: arm/op_iget_object_quick.S */ 6918 /* For: iget-object-quick */ 6919 /* op vA, vB, offset@CCCC */ 6920 mov r2, rINST, lsr #12 @ r2<- B 6921 FETCH r1, 1 @ r1<- field byte offset 6922 EXPORT_PC 6923 GET_VREG r0, r2 @ r0<- object we're operating on 6924 bl artIGetObjectFromMterp @ (obj, offset) 6925 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] 6926 ubfx r2, rINST, #8, #4 @ r2<- A 6927 PREFETCH_INST 2 6928 cmp r3, #0 6929 bne MterpPossibleException @ bail out 6930 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0 6931 ADVANCE 2 @ advance rPC 6932 GET_INST_OPCODE ip @ extract opcode from rINST 6933 GOTO_OPCODE ip @ jump to next instruction 6934 6935/* ------------------------------ */ 6936 .balign 128 6937.L_op_iput_quick: /* 0xe6 */ 6938/* File: arm/op_iput_quick.S */ 6939 /* For: iput-quick, iput-object-quick */ 6940 /* op vA, vB, offset@CCCC */ 6941 mov r2, rINST, lsr #12 @ r2<- B 6942 FETCH r1, 1 @ r1<- field byte offset 6943 GET_VREG r3, r2 @ r3<- fp[B], the object pointer 6944 ubfx r2, rINST, #8, #4 @ r2<- A 6945 cmp r3, #0 @ check object for null 6946 beq common_errNullObject @ object was null 6947 GET_VREG r0, r2 @ r0<- fp[A] 6948 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6949 str r0, [r3, r1] @ obj.field<- r0 6950 GET_INST_OPCODE ip @ extract opcode from rINST 6951 GOTO_OPCODE ip @ jump to next instruction 6952 6953/* ------------------------------ */ 6954 .balign 128 6955.L_op_iput_wide_quick: /* 0xe7 */ 6956/* File: arm/op_iput_wide_quick.S */ 6957 /* iput-wide-quick vA, vB, offset@CCCC */ 6958 mov r2, rINST, lsr #12 @ r2<- B 6959 FETCH r3, 1 @ r3<- field byte offset 6960 GET_VREG r2, r2 @ r2<- fp[B], the object pointer 6961 ubfx r0, rINST, #8, #4 @ r0<- A 6962 cmp r2, #0 @ check object for null 6963 beq common_errNullObject @ object was null 6964 VREG_INDEX_TO_ADDR r0, r0 @ r0<- &fp[A] 6965 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1] 6966 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6967 strd r0, [r2, r3] @ obj.field<- r0/r1 6968 GET_INST_OPCODE ip @ extract opcode from rINST 6969 GOTO_OPCODE ip @ jump to next instruction 6970 6971/* ------------------------------ */ 6972 .balign 128 6973.L_op_iput_object_quick: /* 0xe8 */ 6974/* File: arm/op_iput_object_quick.S */ 6975 EXPORT_PC 6976 add r0, rFP, #OFF_FP_SHADOWFRAME 6977 mov r1, rPC 6978 mov r2, rINST 6979 bl MterpIputObjectQuick 6980 cmp r0, #0 6981 beq MterpException 6982 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 6983 GET_INST_OPCODE ip @ extract opcode from rINST 6984 GOTO_OPCODE ip @ jump to next instruction 6985 6986/* ------------------------------ */ 6987 .balign 128 6988.L_op_invoke_virtual_quick: /* 0xe9 */ 6989/* File: arm/op_invoke_virtual_quick.S */ 6990/* File: arm/invoke.S */ 6991 /* 6992 * Generic invoke handler wrapper. 6993 */ 6994 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 6995 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 6996 .extern MterpInvokeVirtualQuick 6997 EXPORT_PC 6998 mov r0, rSELF 6999 add r1, rFP, #OFF_FP_SHADOWFRAME 7000 mov r2, rPC 7001 mov r3, rINST 7002 bl MterpInvokeVirtualQuick 7003 cmp r0, #0 7004 beq MterpException 7005 FETCH_ADVANCE_INST 3 7006 bl MterpShouldSwitchInterpreters 7007 cmp r0, #0 7008 bne MterpFallback 7009 GET_INST_OPCODE ip 7010 GOTO_OPCODE ip 7011 7012 7013 7014/* ------------------------------ */ 7015 .balign 128 7016.L_op_invoke_virtual_range_quick: /* 0xea */ 7017/* File: arm/op_invoke_virtual_range_quick.S */ 7018/* File: arm/invoke.S */ 7019 /* 7020 * Generic invoke handler wrapper. 7021 */ 7022 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 7023 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7024 .extern MterpInvokeVirtualQuickRange 7025 EXPORT_PC 7026 mov r0, rSELF 7027 add r1, rFP, #OFF_FP_SHADOWFRAME 7028 mov r2, rPC 7029 mov r3, rINST 7030 bl MterpInvokeVirtualQuickRange 7031 cmp r0, #0 7032 beq MterpException 7033 FETCH_ADVANCE_INST 3 7034 bl MterpShouldSwitchInterpreters 7035 cmp r0, #0 7036 bne MterpFallback 7037 GET_INST_OPCODE ip 7038 GOTO_OPCODE ip 7039 7040 7041 7042/* ------------------------------ */ 7043 .balign 128 7044.L_op_iput_boolean_quick: /* 0xeb */ 7045/* File: arm/op_iput_boolean_quick.S */ 7046/* File: arm/op_iput_quick.S */ 7047 /* For: iput-quick, iput-object-quick */ 7048 /* op vA, vB, offset@CCCC */ 7049 mov r2, rINST, lsr #12 @ r2<- B 7050 FETCH r1, 1 @ r1<- field byte offset 7051 GET_VREG r3, r2 @ r3<- fp[B], the object pointer 7052 ubfx r2, rINST, #8, #4 @ r2<- A 7053 cmp r3, #0 @ check object for null 7054 beq common_errNullObject @ object was null 7055 GET_VREG r0, r2 @ r0<- fp[A] 7056 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 7057 strb r0, [r3, r1] @ obj.field<- r0 7058 GET_INST_OPCODE ip @ extract opcode from rINST 7059 GOTO_OPCODE ip @ jump to next instruction 7060 7061 7062/* ------------------------------ */ 7063 .balign 128 7064.L_op_iput_byte_quick: /* 0xec */ 7065/* File: arm/op_iput_byte_quick.S */ 7066/* File: arm/op_iput_quick.S */ 7067 /* For: iput-quick, iput-object-quick */ 7068 /* op vA, vB, offset@CCCC */ 7069 mov r2, rINST, lsr #12 @ r2<- B 7070 FETCH r1, 1 @ r1<- field byte offset 7071 GET_VREG r3, r2 @ r3<- fp[B], the object pointer 7072 ubfx r2, rINST, #8, #4 @ r2<- A 7073 cmp r3, #0 @ check object for null 7074 beq common_errNullObject @ object was null 7075 GET_VREG r0, r2 @ r0<- fp[A] 7076 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 7077 strb r0, [r3, r1] @ obj.field<- r0 7078 GET_INST_OPCODE ip @ extract opcode from rINST 7079 GOTO_OPCODE ip @ jump to next instruction 7080 7081 7082/* ------------------------------ */ 7083 .balign 128 7084.L_op_iput_char_quick: /* 0xed */ 7085/* File: arm/op_iput_char_quick.S */ 7086/* File: arm/op_iput_quick.S */ 7087 /* For: iput-quick, iput-object-quick */ 7088 /* op vA, vB, offset@CCCC */ 7089 mov r2, rINST, lsr #12 @ r2<- B 7090 FETCH r1, 1 @ r1<- field byte offset 7091 GET_VREG r3, r2 @ r3<- fp[B], the object pointer 7092 ubfx r2, rINST, #8, #4 @ r2<- A 7093 cmp r3, #0 @ check object for null 7094 beq common_errNullObject @ object was null 7095 GET_VREG r0, r2 @ r0<- fp[A] 7096 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 7097 strh r0, [r3, r1] @ obj.field<- r0 7098 GET_INST_OPCODE ip @ extract opcode from rINST 7099 GOTO_OPCODE ip @ jump to next instruction 7100 7101 7102/* ------------------------------ */ 7103 .balign 128 7104.L_op_iput_short_quick: /* 0xee */ 7105/* File: arm/op_iput_short_quick.S */ 7106/* File: arm/op_iput_quick.S */ 7107 /* For: iput-quick, iput-object-quick */ 7108 /* op vA, vB, offset@CCCC */ 7109 mov r2, rINST, lsr #12 @ r2<- B 7110 FETCH r1, 1 @ r1<- field byte offset 7111 GET_VREG r3, r2 @ r3<- fp[B], the object pointer 7112 ubfx r2, rINST, #8, #4 @ r2<- A 7113 cmp r3, #0 @ check object for null 7114 beq common_errNullObject @ object was null 7115 GET_VREG r0, r2 @ r0<- fp[A] 7116 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 7117 strh r0, [r3, r1] @ obj.field<- r0 7118 GET_INST_OPCODE ip @ extract opcode from rINST 7119 GOTO_OPCODE ip @ jump to next instruction 7120 7121 7122/* ------------------------------ */ 7123 .balign 128 7124.L_op_iget_boolean_quick: /* 0xef */ 7125/* File: arm/op_iget_boolean_quick.S */ 7126/* File: arm/op_iget_quick.S */ 7127 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 7128 /* op vA, vB, offset@CCCC */ 7129 mov r2, rINST, lsr #12 @ r2<- B 7130 FETCH r1, 1 @ r1<- field byte offset 7131 GET_VREG r3, r2 @ r3<- object we're operating on 7132 ubfx r2, rINST, #8, #4 @ r2<- A 7133 cmp r3, #0 @ check object for null 7134 beq common_errNullObject @ object was null 7135 ldrb r0, [r3, r1] @ r0<- obj.field 7136 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 7137 SET_VREG r0, r2 @ fp[A]<- r0 7138 GET_INST_OPCODE ip @ extract opcode from rINST 7139 GOTO_OPCODE ip @ jump to next instruction 7140 7141 7142/* ------------------------------ */ 7143 .balign 128 7144.L_op_iget_byte_quick: /* 0xf0 */ 7145/* File: arm/op_iget_byte_quick.S */ 7146/* File: arm/op_iget_quick.S */ 7147 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 7148 /* op vA, vB, offset@CCCC */ 7149 mov r2, rINST, lsr #12 @ r2<- B 7150 FETCH r1, 1 @ r1<- field byte offset 7151 GET_VREG r3, r2 @ r3<- object we're operating on 7152 ubfx r2, rINST, #8, #4 @ r2<- A 7153 cmp r3, #0 @ check object for null 7154 beq common_errNullObject @ object was null 7155 ldrsb r0, [r3, r1] @ r0<- obj.field 7156 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 7157 SET_VREG r0, r2 @ fp[A]<- r0 7158 GET_INST_OPCODE ip @ extract opcode from rINST 7159 GOTO_OPCODE ip @ jump to next instruction 7160 7161 7162/* ------------------------------ */ 7163 .balign 128 7164.L_op_iget_char_quick: /* 0xf1 */ 7165/* File: arm/op_iget_char_quick.S */ 7166/* File: arm/op_iget_quick.S */ 7167 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 7168 /* op vA, vB, offset@CCCC */ 7169 mov r2, rINST, lsr #12 @ r2<- B 7170 FETCH r1, 1 @ r1<- field byte offset 7171 GET_VREG r3, r2 @ r3<- object we're operating on 7172 ubfx r2, rINST, #8, #4 @ r2<- A 7173 cmp r3, #0 @ check object for null 7174 beq common_errNullObject @ object was null 7175 ldrh r0, [r3, r1] @ r0<- obj.field 7176 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 7177 SET_VREG r0, r2 @ fp[A]<- r0 7178 GET_INST_OPCODE ip @ extract opcode from rINST 7179 GOTO_OPCODE ip @ jump to next instruction 7180 7181 7182/* ------------------------------ */ 7183 .balign 128 7184.L_op_iget_short_quick: /* 0xf2 */ 7185/* File: arm/op_iget_short_quick.S */ 7186/* File: arm/op_iget_quick.S */ 7187 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 7188 /* op vA, vB, offset@CCCC */ 7189 mov r2, rINST, lsr #12 @ r2<- B 7190 FETCH r1, 1 @ r1<- field byte offset 7191 GET_VREG r3, r2 @ r3<- object we're operating on 7192 ubfx r2, rINST, #8, #4 @ r2<- A 7193 cmp r3, #0 @ check object for null 7194 beq common_errNullObject @ object was null 7195 ldrsh r0, [r3, r1] @ r0<- obj.field 7196 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST 7197 SET_VREG r0, r2 @ fp[A]<- r0 7198 GET_INST_OPCODE ip @ extract opcode from rINST 7199 GOTO_OPCODE ip @ jump to next instruction 7200 7201 7202/* ------------------------------ */ 7203 .balign 128 7204.L_op_invoke_lambda: /* 0xf3 */ 7205/* Transfer stub to alternate interpreter */ 7206 b MterpFallback 7207 7208 7209/* ------------------------------ */ 7210 .balign 128 7211.L_op_unused_f4: /* 0xf4 */ 7212/* File: arm/op_unused_f4.S */ 7213/* File: arm/unused.S */ 7214/* 7215 * Bail to reference interpreter to throw. 7216 */ 7217 b MterpFallback 7218 7219 7220/* ------------------------------ */ 7221 .balign 128 7222.L_op_capture_variable: /* 0xf5 */ 7223/* Transfer stub to alternate interpreter */ 7224 b MterpFallback 7225 7226 7227/* ------------------------------ */ 7228 .balign 128 7229.L_op_create_lambda: /* 0xf6 */ 7230/* Transfer stub to alternate interpreter */ 7231 b MterpFallback 7232 7233 7234/* ------------------------------ */ 7235 .balign 128 7236.L_op_liberate_variable: /* 0xf7 */ 7237/* Transfer stub to alternate interpreter */ 7238 b MterpFallback 7239 7240 7241/* ------------------------------ */ 7242 .balign 128 7243.L_op_box_lambda: /* 0xf8 */ 7244/* Transfer stub to alternate interpreter */ 7245 b MterpFallback 7246 7247 7248/* ------------------------------ */ 7249 .balign 128 7250.L_op_unbox_lambda: /* 0xf9 */ 7251/* Transfer stub to alternate interpreter */ 7252 b MterpFallback 7253 7254 7255/* ------------------------------ */ 7256 .balign 128 7257.L_op_unused_fa: /* 0xfa */ 7258/* File: arm/op_unused_fa.S */ 7259/* File: arm/unused.S */ 7260/* 7261 * Bail to reference interpreter to throw. 7262 */ 7263 b MterpFallback 7264 7265 7266/* ------------------------------ */ 7267 .balign 128 7268.L_op_unused_fb: /* 0xfb */ 7269/* File: arm/op_unused_fb.S */ 7270/* File: arm/unused.S */ 7271/* 7272 * Bail to reference interpreter to throw. 7273 */ 7274 b MterpFallback 7275 7276 7277/* ------------------------------ */ 7278 .balign 128 7279.L_op_unused_fc: /* 0xfc */ 7280/* File: arm/op_unused_fc.S */ 7281/* File: arm/unused.S */ 7282/* 7283 * Bail to reference interpreter to throw. 7284 */ 7285 b MterpFallback 7286 7287 7288/* ------------------------------ */ 7289 .balign 128 7290.L_op_unused_fd: /* 0xfd */ 7291/* File: arm/op_unused_fd.S */ 7292/* File: arm/unused.S */ 7293/* 7294 * Bail to reference interpreter to throw. 7295 */ 7296 b MterpFallback 7297 7298 7299/* ------------------------------ */ 7300 .balign 128 7301.L_op_unused_fe: /* 0xfe */ 7302/* File: arm/op_unused_fe.S */ 7303/* File: arm/unused.S */ 7304/* 7305 * Bail to reference interpreter to throw. 7306 */ 7307 b MterpFallback 7308 7309 7310/* ------------------------------ */ 7311 .balign 128 7312.L_op_unused_ff: /* 0xff */ 7313/* File: arm/op_unused_ff.S */ 7314/* File: arm/unused.S */ 7315/* 7316 * Bail to reference interpreter to throw. 7317 */ 7318 b MterpFallback 7319 7320 7321 .balign 128 7322 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart 7323 .global artMterpAsmInstructionEnd 7324artMterpAsmInstructionEnd: 7325 7326/* 7327 * =========================================================================== 7328 * Sister implementations 7329 * =========================================================================== 7330 */ 7331 .global artMterpAsmSisterStart 7332 .type artMterpAsmSisterStart, %function 7333 .text 7334 .balign 4 7335artMterpAsmSisterStart: 7336 7337/* continuation for op_float_to_long */ 7338/* 7339 * Convert the float in r0 to a long in r0/r1. 7340 * 7341 * We have to clip values to long min/max per the specification. The 7342 * expected common case is a "reasonable" value that converts directly 7343 * to modest integer. The EABI convert function isn't doing this for us. 7344 */ 7345f2l_doconv: 7346 stmfd sp!, {r4, lr} 7347 mov r1, #0x5f000000 @ (float)maxlong 7348 mov r4, r0 7349 bl __aeabi_fcmpge @ is arg >= maxlong? 7350 cmp r0, #0 @ nonzero == yes 7351 mvnne r0, #0 @ return maxlong (7fffffff) 7352 mvnne r1, #0x80000000 7353 popne {r4, pc} 7354 7355 mov r0, r4 @ recover arg 7356 mov r1, #0xdf000000 @ (float)minlong 7357 bl __aeabi_fcmple @ is arg <= minlong? 7358 cmp r0, #0 @ nonzero == yes 7359 movne r0, #0 @ return minlong (80000000) 7360 movne r1, #0x80000000 7361 popne {r4, pc} 7362 7363 mov r0, r4 @ recover arg 7364 mov r1, r4 7365 bl __aeabi_fcmpeq @ is arg == self? 7366 cmp r0, #0 @ zero == no 7367 moveq r1, #0 @ return zero for NaN 7368 popeq {r4, pc} 7369 7370 mov r0, r4 @ recover arg 7371 bl __aeabi_f2lz @ convert float to long 7372 ldmfd sp!, {r4, pc} 7373 7374/* continuation for op_double_to_long */ 7375/* 7376 * Convert the double in r0/r1 to a long in r0/r1. 7377 * 7378 * We have to clip values to long min/max per the specification. The 7379 * expected common case is a "reasonable" value that converts directly 7380 * to modest integer. The EABI convert function isn't doing this for us. 7381 */ 7382d2l_doconv: 7383 stmfd sp!, {r4, r5, lr} @ save regs 7384 mov r3, #0x43000000 @ maxlong, as a double (high word) 7385 add r3, #0x00e00000 @ 0x43e00000 7386 mov r2, #0 @ maxlong, as a double (low word) 7387 sub sp, sp, #4 @ align for EABI 7388 mov r4, r0 @ save a copy of r0 7389 mov r5, r1 @ and r1 7390 bl __aeabi_dcmpge @ is arg >= maxlong? 7391 cmp r0, #0 @ nonzero == yes 7392 mvnne r0, #0 @ return maxlong (7fffffffffffffff) 7393 mvnne r1, #0x80000000 7394 bne 1f 7395 7396 mov r0, r4 @ recover arg 7397 mov r1, r5 7398 mov r3, #0xc3000000 @ minlong, as a double (high word) 7399 add r3, #0x00e00000 @ 0xc3e00000 7400 mov r2, #0 @ minlong, as a double (low word) 7401 bl __aeabi_dcmple @ is arg <= minlong? 7402 cmp r0, #0 @ nonzero == yes 7403 movne r0, #0 @ return minlong (8000000000000000) 7404 movne r1, #0x80000000 7405 bne 1f 7406 7407 mov r0, r4 @ recover arg 7408 mov r1, r5 7409 mov r2, r4 @ compare against self 7410 mov r3, r5 7411 bl __aeabi_dcmpeq @ is arg == self? 7412 cmp r0, #0 @ zero == no 7413 moveq r1, #0 @ return zero for NaN 7414 beq 1f 7415 7416 mov r0, r4 @ recover arg 7417 mov r1, r5 7418 bl __aeabi_d2lz @ convert double to long 7419 74201: 7421 add sp, sp, #4 7422 ldmfd sp!, {r4, r5, pc} 7423 7424 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart 7425 .global artMterpAsmSisterEnd 7426artMterpAsmSisterEnd: 7427 7428 7429 .global artMterpAsmAltInstructionStart 7430 .type artMterpAsmAltInstructionStart, %function 7431 .text 7432 7433artMterpAsmAltInstructionStart = .L_ALT_op_nop 7434/* ------------------------------ */ 7435 .balign 128 7436.L_ALT_op_nop: /* 0x00 */ 7437/* File: arm/alt_stub.S */ 7438/* 7439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7440 * any interesting requests and then jump to the real instruction 7441 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7442 */ 7443 .extern MterpCheckBefore 7444 EXPORT_PC 7445 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7446 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler. 7447 mov r0, rSELF 7448 add r1, rFP, #OFF_FP_SHADOWFRAME 7449 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7450 7451/* ------------------------------ */ 7452 .balign 128 7453.L_ALT_op_move: /* 0x01 */ 7454/* File: arm/alt_stub.S */ 7455/* 7456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7457 * any interesting requests and then jump to the real instruction 7458 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7459 */ 7460 .extern MterpCheckBefore 7461 EXPORT_PC 7462 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7463 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler. 7464 mov r0, rSELF 7465 add r1, rFP, #OFF_FP_SHADOWFRAME 7466 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7467 7468/* ------------------------------ */ 7469 .balign 128 7470.L_ALT_op_move_from16: /* 0x02 */ 7471/* File: arm/alt_stub.S */ 7472/* 7473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7474 * any interesting requests and then jump to the real instruction 7475 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7476 */ 7477 .extern MterpCheckBefore 7478 EXPORT_PC 7479 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7480 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler. 7481 mov r0, rSELF 7482 add r1, rFP, #OFF_FP_SHADOWFRAME 7483 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7484 7485/* ------------------------------ */ 7486 .balign 128 7487.L_ALT_op_move_16: /* 0x03 */ 7488/* File: arm/alt_stub.S */ 7489/* 7490 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7491 * any interesting requests and then jump to the real instruction 7492 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7493 */ 7494 .extern MterpCheckBefore 7495 EXPORT_PC 7496 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7497 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler. 7498 mov r0, rSELF 7499 add r1, rFP, #OFF_FP_SHADOWFRAME 7500 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7501 7502/* ------------------------------ */ 7503 .balign 128 7504.L_ALT_op_move_wide: /* 0x04 */ 7505/* File: arm/alt_stub.S */ 7506/* 7507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7508 * any interesting requests and then jump to the real instruction 7509 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7510 */ 7511 .extern MterpCheckBefore 7512 EXPORT_PC 7513 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7514 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler. 7515 mov r0, rSELF 7516 add r1, rFP, #OFF_FP_SHADOWFRAME 7517 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7518 7519/* ------------------------------ */ 7520 .balign 128 7521.L_ALT_op_move_wide_from16: /* 0x05 */ 7522/* File: arm/alt_stub.S */ 7523/* 7524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7525 * any interesting requests and then jump to the real instruction 7526 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7527 */ 7528 .extern MterpCheckBefore 7529 EXPORT_PC 7530 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7531 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler. 7532 mov r0, rSELF 7533 add r1, rFP, #OFF_FP_SHADOWFRAME 7534 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7535 7536/* ------------------------------ */ 7537 .balign 128 7538.L_ALT_op_move_wide_16: /* 0x06 */ 7539/* File: arm/alt_stub.S */ 7540/* 7541 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7542 * any interesting requests and then jump to the real instruction 7543 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7544 */ 7545 .extern MterpCheckBefore 7546 EXPORT_PC 7547 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7548 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler. 7549 mov r0, rSELF 7550 add r1, rFP, #OFF_FP_SHADOWFRAME 7551 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7552 7553/* ------------------------------ */ 7554 .balign 128 7555.L_ALT_op_move_object: /* 0x07 */ 7556/* File: arm/alt_stub.S */ 7557/* 7558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7559 * any interesting requests and then jump to the real instruction 7560 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7561 */ 7562 .extern MterpCheckBefore 7563 EXPORT_PC 7564 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7565 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler. 7566 mov r0, rSELF 7567 add r1, rFP, #OFF_FP_SHADOWFRAME 7568 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7569 7570/* ------------------------------ */ 7571 .balign 128 7572.L_ALT_op_move_object_from16: /* 0x08 */ 7573/* File: arm/alt_stub.S */ 7574/* 7575 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7576 * any interesting requests and then jump to the real instruction 7577 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7578 */ 7579 .extern MterpCheckBefore 7580 EXPORT_PC 7581 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7582 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler. 7583 mov r0, rSELF 7584 add r1, rFP, #OFF_FP_SHADOWFRAME 7585 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7586 7587/* ------------------------------ */ 7588 .balign 128 7589.L_ALT_op_move_object_16: /* 0x09 */ 7590/* File: arm/alt_stub.S */ 7591/* 7592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7593 * any interesting requests and then jump to the real instruction 7594 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7595 */ 7596 .extern MterpCheckBefore 7597 EXPORT_PC 7598 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7599 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler. 7600 mov r0, rSELF 7601 add r1, rFP, #OFF_FP_SHADOWFRAME 7602 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7603 7604/* ------------------------------ */ 7605 .balign 128 7606.L_ALT_op_move_result: /* 0x0a */ 7607/* File: arm/alt_stub.S */ 7608/* 7609 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7610 * any interesting requests and then jump to the real instruction 7611 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7612 */ 7613 .extern MterpCheckBefore 7614 EXPORT_PC 7615 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7616 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler. 7617 mov r0, rSELF 7618 add r1, rFP, #OFF_FP_SHADOWFRAME 7619 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7620 7621/* ------------------------------ */ 7622 .balign 128 7623.L_ALT_op_move_result_wide: /* 0x0b */ 7624/* File: arm/alt_stub.S */ 7625/* 7626 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7627 * any interesting requests and then jump to the real instruction 7628 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7629 */ 7630 .extern MterpCheckBefore 7631 EXPORT_PC 7632 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7633 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler. 7634 mov r0, rSELF 7635 add r1, rFP, #OFF_FP_SHADOWFRAME 7636 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7637 7638/* ------------------------------ */ 7639 .balign 128 7640.L_ALT_op_move_result_object: /* 0x0c */ 7641/* File: arm/alt_stub.S */ 7642/* 7643 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7644 * any interesting requests and then jump to the real instruction 7645 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7646 */ 7647 .extern MterpCheckBefore 7648 EXPORT_PC 7649 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7650 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler. 7651 mov r0, rSELF 7652 add r1, rFP, #OFF_FP_SHADOWFRAME 7653 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7654 7655/* ------------------------------ */ 7656 .balign 128 7657.L_ALT_op_move_exception: /* 0x0d */ 7658/* File: arm/alt_stub.S */ 7659/* 7660 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7661 * any interesting requests and then jump to the real instruction 7662 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7663 */ 7664 .extern MterpCheckBefore 7665 EXPORT_PC 7666 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7667 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler. 7668 mov r0, rSELF 7669 add r1, rFP, #OFF_FP_SHADOWFRAME 7670 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7671 7672/* ------------------------------ */ 7673 .balign 128 7674.L_ALT_op_return_void: /* 0x0e */ 7675/* File: arm/alt_stub.S */ 7676/* 7677 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7678 * any interesting requests and then jump to the real instruction 7679 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7680 */ 7681 .extern MterpCheckBefore 7682 EXPORT_PC 7683 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7684 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler. 7685 mov r0, rSELF 7686 add r1, rFP, #OFF_FP_SHADOWFRAME 7687 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7688 7689/* ------------------------------ */ 7690 .balign 128 7691.L_ALT_op_return: /* 0x0f */ 7692/* File: arm/alt_stub.S */ 7693/* 7694 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7695 * any interesting requests and then jump to the real instruction 7696 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7697 */ 7698 .extern MterpCheckBefore 7699 EXPORT_PC 7700 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7701 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler. 7702 mov r0, rSELF 7703 add r1, rFP, #OFF_FP_SHADOWFRAME 7704 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7705 7706/* ------------------------------ */ 7707 .balign 128 7708.L_ALT_op_return_wide: /* 0x10 */ 7709/* File: arm/alt_stub.S */ 7710/* 7711 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7712 * any interesting requests and then jump to the real instruction 7713 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7714 */ 7715 .extern MterpCheckBefore 7716 EXPORT_PC 7717 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7718 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler. 7719 mov r0, rSELF 7720 add r1, rFP, #OFF_FP_SHADOWFRAME 7721 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7722 7723/* ------------------------------ */ 7724 .balign 128 7725.L_ALT_op_return_object: /* 0x11 */ 7726/* File: arm/alt_stub.S */ 7727/* 7728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7729 * any interesting requests and then jump to the real instruction 7730 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7731 */ 7732 .extern MterpCheckBefore 7733 EXPORT_PC 7734 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7735 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler. 7736 mov r0, rSELF 7737 add r1, rFP, #OFF_FP_SHADOWFRAME 7738 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7739 7740/* ------------------------------ */ 7741 .balign 128 7742.L_ALT_op_const_4: /* 0x12 */ 7743/* File: arm/alt_stub.S */ 7744/* 7745 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7746 * any interesting requests and then jump to the real instruction 7747 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7748 */ 7749 .extern MterpCheckBefore 7750 EXPORT_PC 7751 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7752 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler. 7753 mov r0, rSELF 7754 add r1, rFP, #OFF_FP_SHADOWFRAME 7755 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7756 7757/* ------------------------------ */ 7758 .balign 128 7759.L_ALT_op_const_16: /* 0x13 */ 7760/* File: arm/alt_stub.S */ 7761/* 7762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7763 * any interesting requests and then jump to the real instruction 7764 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7765 */ 7766 .extern MterpCheckBefore 7767 EXPORT_PC 7768 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7769 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler. 7770 mov r0, rSELF 7771 add r1, rFP, #OFF_FP_SHADOWFRAME 7772 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7773 7774/* ------------------------------ */ 7775 .balign 128 7776.L_ALT_op_const: /* 0x14 */ 7777/* File: arm/alt_stub.S */ 7778/* 7779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7780 * any interesting requests and then jump to the real instruction 7781 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7782 */ 7783 .extern MterpCheckBefore 7784 EXPORT_PC 7785 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7786 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler. 7787 mov r0, rSELF 7788 add r1, rFP, #OFF_FP_SHADOWFRAME 7789 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7790 7791/* ------------------------------ */ 7792 .balign 128 7793.L_ALT_op_const_high16: /* 0x15 */ 7794/* File: arm/alt_stub.S */ 7795/* 7796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7797 * any interesting requests and then jump to the real instruction 7798 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7799 */ 7800 .extern MterpCheckBefore 7801 EXPORT_PC 7802 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7803 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler. 7804 mov r0, rSELF 7805 add r1, rFP, #OFF_FP_SHADOWFRAME 7806 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7807 7808/* ------------------------------ */ 7809 .balign 128 7810.L_ALT_op_const_wide_16: /* 0x16 */ 7811/* File: arm/alt_stub.S */ 7812/* 7813 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7814 * any interesting requests and then jump to the real instruction 7815 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7816 */ 7817 .extern MterpCheckBefore 7818 EXPORT_PC 7819 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7820 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler. 7821 mov r0, rSELF 7822 add r1, rFP, #OFF_FP_SHADOWFRAME 7823 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7824 7825/* ------------------------------ */ 7826 .balign 128 7827.L_ALT_op_const_wide_32: /* 0x17 */ 7828/* File: arm/alt_stub.S */ 7829/* 7830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7831 * any interesting requests and then jump to the real instruction 7832 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7833 */ 7834 .extern MterpCheckBefore 7835 EXPORT_PC 7836 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7837 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler. 7838 mov r0, rSELF 7839 add r1, rFP, #OFF_FP_SHADOWFRAME 7840 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7841 7842/* ------------------------------ */ 7843 .balign 128 7844.L_ALT_op_const_wide: /* 0x18 */ 7845/* File: arm/alt_stub.S */ 7846/* 7847 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7848 * any interesting requests and then jump to the real instruction 7849 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7850 */ 7851 .extern MterpCheckBefore 7852 EXPORT_PC 7853 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7854 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler. 7855 mov r0, rSELF 7856 add r1, rFP, #OFF_FP_SHADOWFRAME 7857 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7858 7859/* ------------------------------ */ 7860 .balign 128 7861.L_ALT_op_const_wide_high16: /* 0x19 */ 7862/* File: arm/alt_stub.S */ 7863/* 7864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7865 * any interesting requests and then jump to the real instruction 7866 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7867 */ 7868 .extern MterpCheckBefore 7869 EXPORT_PC 7870 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7871 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler. 7872 mov r0, rSELF 7873 add r1, rFP, #OFF_FP_SHADOWFRAME 7874 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7875 7876/* ------------------------------ */ 7877 .balign 128 7878.L_ALT_op_const_string: /* 0x1a */ 7879/* File: arm/alt_stub.S */ 7880/* 7881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7882 * any interesting requests and then jump to the real instruction 7883 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7884 */ 7885 .extern MterpCheckBefore 7886 EXPORT_PC 7887 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7888 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler. 7889 mov r0, rSELF 7890 add r1, rFP, #OFF_FP_SHADOWFRAME 7891 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7892 7893/* ------------------------------ */ 7894 .balign 128 7895.L_ALT_op_const_string_jumbo: /* 0x1b */ 7896/* File: arm/alt_stub.S */ 7897/* 7898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7899 * any interesting requests and then jump to the real instruction 7900 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7901 */ 7902 .extern MterpCheckBefore 7903 EXPORT_PC 7904 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7905 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler. 7906 mov r0, rSELF 7907 add r1, rFP, #OFF_FP_SHADOWFRAME 7908 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7909 7910/* ------------------------------ */ 7911 .balign 128 7912.L_ALT_op_const_class: /* 0x1c */ 7913/* File: arm/alt_stub.S */ 7914/* 7915 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7916 * any interesting requests and then jump to the real instruction 7917 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7918 */ 7919 .extern MterpCheckBefore 7920 EXPORT_PC 7921 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7922 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler. 7923 mov r0, rSELF 7924 add r1, rFP, #OFF_FP_SHADOWFRAME 7925 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7926 7927/* ------------------------------ */ 7928 .balign 128 7929.L_ALT_op_monitor_enter: /* 0x1d */ 7930/* File: arm/alt_stub.S */ 7931/* 7932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7933 * any interesting requests and then jump to the real instruction 7934 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7935 */ 7936 .extern MterpCheckBefore 7937 EXPORT_PC 7938 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7939 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler. 7940 mov r0, rSELF 7941 add r1, rFP, #OFF_FP_SHADOWFRAME 7942 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7943 7944/* ------------------------------ */ 7945 .balign 128 7946.L_ALT_op_monitor_exit: /* 0x1e */ 7947/* File: arm/alt_stub.S */ 7948/* 7949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7950 * any interesting requests and then jump to the real instruction 7951 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7952 */ 7953 .extern MterpCheckBefore 7954 EXPORT_PC 7955 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7956 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler. 7957 mov r0, rSELF 7958 add r1, rFP, #OFF_FP_SHADOWFRAME 7959 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7960 7961/* ------------------------------ */ 7962 .balign 128 7963.L_ALT_op_check_cast: /* 0x1f */ 7964/* File: arm/alt_stub.S */ 7965/* 7966 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7967 * any interesting requests and then jump to the real instruction 7968 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7969 */ 7970 .extern MterpCheckBefore 7971 EXPORT_PC 7972 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7973 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler. 7974 mov r0, rSELF 7975 add r1, rFP, #OFF_FP_SHADOWFRAME 7976 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7977 7978/* ------------------------------ */ 7979 .balign 128 7980.L_ALT_op_instance_of: /* 0x20 */ 7981/* File: arm/alt_stub.S */ 7982/* 7983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7984 * any interesting requests and then jump to the real instruction 7985 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7986 */ 7987 .extern MterpCheckBefore 7988 EXPORT_PC 7989 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 7990 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler. 7991 mov r0, rSELF 7992 add r1, rFP, #OFF_FP_SHADOWFRAME 7993 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 7994 7995/* ------------------------------ */ 7996 .balign 128 7997.L_ALT_op_array_length: /* 0x21 */ 7998/* File: arm/alt_stub.S */ 7999/* 8000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8001 * any interesting requests and then jump to the real instruction 8002 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8003 */ 8004 .extern MterpCheckBefore 8005 EXPORT_PC 8006 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8007 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler. 8008 mov r0, rSELF 8009 add r1, rFP, #OFF_FP_SHADOWFRAME 8010 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8011 8012/* ------------------------------ */ 8013 .balign 128 8014.L_ALT_op_new_instance: /* 0x22 */ 8015/* File: arm/alt_stub.S */ 8016/* 8017 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8018 * any interesting requests and then jump to the real instruction 8019 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8020 */ 8021 .extern MterpCheckBefore 8022 EXPORT_PC 8023 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8024 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler. 8025 mov r0, rSELF 8026 add r1, rFP, #OFF_FP_SHADOWFRAME 8027 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8028 8029/* ------------------------------ */ 8030 .balign 128 8031.L_ALT_op_new_array: /* 0x23 */ 8032/* File: arm/alt_stub.S */ 8033/* 8034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8035 * any interesting requests and then jump to the real instruction 8036 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8037 */ 8038 .extern MterpCheckBefore 8039 EXPORT_PC 8040 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8041 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler. 8042 mov r0, rSELF 8043 add r1, rFP, #OFF_FP_SHADOWFRAME 8044 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8045 8046/* ------------------------------ */ 8047 .balign 128 8048.L_ALT_op_filled_new_array: /* 0x24 */ 8049/* File: arm/alt_stub.S */ 8050/* 8051 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8052 * any interesting requests and then jump to the real instruction 8053 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8054 */ 8055 .extern MterpCheckBefore 8056 EXPORT_PC 8057 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8058 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler. 8059 mov r0, rSELF 8060 add r1, rFP, #OFF_FP_SHADOWFRAME 8061 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8062 8063/* ------------------------------ */ 8064 .balign 128 8065.L_ALT_op_filled_new_array_range: /* 0x25 */ 8066/* File: arm/alt_stub.S */ 8067/* 8068 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8069 * any interesting requests and then jump to the real instruction 8070 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8071 */ 8072 .extern MterpCheckBefore 8073 EXPORT_PC 8074 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8075 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler. 8076 mov r0, rSELF 8077 add r1, rFP, #OFF_FP_SHADOWFRAME 8078 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8079 8080/* ------------------------------ */ 8081 .balign 128 8082.L_ALT_op_fill_array_data: /* 0x26 */ 8083/* File: arm/alt_stub.S */ 8084/* 8085 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8086 * any interesting requests and then jump to the real instruction 8087 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8088 */ 8089 .extern MterpCheckBefore 8090 EXPORT_PC 8091 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8092 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler. 8093 mov r0, rSELF 8094 add r1, rFP, #OFF_FP_SHADOWFRAME 8095 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8096 8097/* ------------------------------ */ 8098 .balign 128 8099.L_ALT_op_throw: /* 0x27 */ 8100/* File: arm/alt_stub.S */ 8101/* 8102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8103 * any interesting requests and then jump to the real instruction 8104 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8105 */ 8106 .extern MterpCheckBefore 8107 EXPORT_PC 8108 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8109 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler. 8110 mov r0, rSELF 8111 add r1, rFP, #OFF_FP_SHADOWFRAME 8112 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8113 8114/* ------------------------------ */ 8115 .balign 128 8116.L_ALT_op_goto: /* 0x28 */ 8117/* File: arm/alt_stub.S */ 8118/* 8119 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8120 * any interesting requests and then jump to the real instruction 8121 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8122 */ 8123 .extern MterpCheckBefore 8124 EXPORT_PC 8125 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8126 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler. 8127 mov r0, rSELF 8128 add r1, rFP, #OFF_FP_SHADOWFRAME 8129 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8130 8131/* ------------------------------ */ 8132 .balign 128 8133.L_ALT_op_goto_16: /* 0x29 */ 8134/* File: arm/alt_stub.S */ 8135/* 8136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8137 * any interesting requests and then jump to the real instruction 8138 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8139 */ 8140 .extern MterpCheckBefore 8141 EXPORT_PC 8142 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8143 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler. 8144 mov r0, rSELF 8145 add r1, rFP, #OFF_FP_SHADOWFRAME 8146 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8147 8148/* ------------------------------ */ 8149 .balign 128 8150.L_ALT_op_goto_32: /* 0x2a */ 8151/* File: arm/alt_stub.S */ 8152/* 8153 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8154 * any interesting requests and then jump to the real instruction 8155 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8156 */ 8157 .extern MterpCheckBefore 8158 EXPORT_PC 8159 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8160 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler. 8161 mov r0, rSELF 8162 add r1, rFP, #OFF_FP_SHADOWFRAME 8163 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8164 8165/* ------------------------------ */ 8166 .balign 128 8167.L_ALT_op_packed_switch: /* 0x2b */ 8168/* File: arm/alt_stub.S */ 8169/* 8170 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8171 * any interesting requests and then jump to the real instruction 8172 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8173 */ 8174 .extern MterpCheckBefore 8175 EXPORT_PC 8176 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8177 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler. 8178 mov r0, rSELF 8179 add r1, rFP, #OFF_FP_SHADOWFRAME 8180 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8181 8182/* ------------------------------ */ 8183 .balign 128 8184.L_ALT_op_sparse_switch: /* 0x2c */ 8185/* File: arm/alt_stub.S */ 8186/* 8187 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8188 * any interesting requests and then jump to the real instruction 8189 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8190 */ 8191 .extern MterpCheckBefore 8192 EXPORT_PC 8193 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8194 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler. 8195 mov r0, rSELF 8196 add r1, rFP, #OFF_FP_SHADOWFRAME 8197 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8198 8199/* ------------------------------ */ 8200 .balign 128 8201.L_ALT_op_cmpl_float: /* 0x2d */ 8202/* File: arm/alt_stub.S */ 8203/* 8204 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8205 * any interesting requests and then jump to the real instruction 8206 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8207 */ 8208 .extern MterpCheckBefore 8209 EXPORT_PC 8210 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8211 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler. 8212 mov r0, rSELF 8213 add r1, rFP, #OFF_FP_SHADOWFRAME 8214 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8215 8216/* ------------------------------ */ 8217 .balign 128 8218.L_ALT_op_cmpg_float: /* 0x2e */ 8219/* File: arm/alt_stub.S */ 8220/* 8221 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8222 * any interesting requests and then jump to the real instruction 8223 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8224 */ 8225 .extern MterpCheckBefore 8226 EXPORT_PC 8227 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8228 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler. 8229 mov r0, rSELF 8230 add r1, rFP, #OFF_FP_SHADOWFRAME 8231 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8232 8233/* ------------------------------ */ 8234 .balign 128 8235.L_ALT_op_cmpl_double: /* 0x2f */ 8236/* File: arm/alt_stub.S */ 8237/* 8238 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8239 * any interesting requests and then jump to the real instruction 8240 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8241 */ 8242 .extern MterpCheckBefore 8243 EXPORT_PC 8244 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8245 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler. 8246 mov r0, rSELF 8247 add r1, rFP, #OFF_FP_SHADOWFRAME 8248 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8249 8250/* ------------------------------ */ 8251 .balign 128 8252.L_ALT_op_cmpg_double: /* 0x30 */ 8253/* File: arm/alt_stub.S */ 8254/* 8255 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8256 * any interesting requests and then jump to the real instruction 8257 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8258 */ 8259 .extern MterpCheckBefore 8260 EXPORT_PC 8261 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8262 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler. 8263 mov r0, rSELF 8264 add r1, rFP, #OFF_FP_SHADOWFRAME 8265 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8266 8267/* ------------------------------ */ 8268 .balign 128 8269.L_ALT_op_cmp_long: /* 0x31 */ 8270/* File: arm/alt_stub.S */ 8271/* 8272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8273 * any interesting requests and then jump to the real instruction 8274 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8275 */ 8276 .extern MterpCheckBefore 8277 EXPORT_PC 8278 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8279 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler. 8280 mov r0, rSELF 8281 add r1, rFP, #OFF_FP_SHADOWFRAME 8282 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8283 8284/* ------------------------------ */ 8285 .balign 128 8286.L_ALT_op_if_eq: /* 0x32 */ 8287/* File: arm/alt_stub.S */ 8288/* 8289 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8290 * any interesting requests and then jump to the real instruction 8291 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8292 */ 8293 .extern MterpCheckBefore 8294 EXPORT_PC 8295 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8296 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler. 8297 mov r0, rSELF 8298 add r1, rFP, #OFF_FP_SHADOWFRAME 8299 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8300 8301/* ------------------------------ */ 8302 .balign 128 8303.L_ALT_op_if_ne: /* 0x33 */ 8304/* File: arm/alt_stub.S */ 8305/* 8306 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8307 * any interesting requests and then jump to the real instruction 8308 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8309 */ 8310 .extern MterpCheckBefore 8311 EXPORT_PC 8312 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8313 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler. 8314 mov r0, rSELF 8315 add r1, rFP, #OFF_FP_SHADOWFRAME 8316 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8317 8318/* ------------------------------ */ 8319 .balign 128 8320.L_ALT_op_if_lt: /* 0x34 */ 8321/* File: arm/alt_stub.S */ 8322/* 8323 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8324 * any interesting requests and then jump to the real instruction 8325 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8326 */ 8327 .extern MterpCheckBefore 8328 EXPORT_PC 8329 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8330 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler. 8331 mov r0, rSELF 8332 add r1, rFP, #OFF_FP_SHADOWFRAME 8333 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8334 8335/* ------------------------------ */ 8336 .balign 128 8337.L_ALT_op_if_ge: /* 0x35 */ 8338/* File: arm/alt_stub.S */ 8339/* 8340 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8341 * any interesting requests and then jump to the real instruction 8342 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8343 */ 8344 .extern MterpCheckBefore 8345 EXPORT_PC 8346 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8347 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler. 8348 mov r0, rSELF 8349 add r1, rFP, #OFF_FP_SHADOWFRAME 8350 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8351 8352/* ------------------------------ */ 8353 .balign 128 8354.L_ALT_op_if_gt: /* 0x36 */ 8355/* File: arm/alt_stub.S */ 8356/* 8357 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8358 * any interesting requests and then jump to the real instruction 8359 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8360 */ 8361 .extern MterpCheckBefore 8362 EXPORT_PC 8363 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8364 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler. 8365 mov r0, rSELF 8366 add r1, rFP, #OFF_FP_SHADOWFRAME 8367 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8368 8369/* ------------------------------ */ 8370 .balign 128 8371.L_ALT_op_if_le: /* 0x37 */ 8372/* File: arm/alt_stub.S */ 8373/* 8374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8375 * any interesting requests and then jump to the real instruction 8376 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8377 */ 8378 .extern MterpCheckBefore 8379 EXPORT_PC 8380 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8381 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler. 8382 mov r0, rSELF 8383 add r1, rFP, #OFF_FP_SHADOWFRAME 8384 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8385 8386/* ------------------------------ */ 8387 .balign 128 8388.L_ALT_op_if_eqz: /* 0x38 */ 8389/* File: arm/alt_stub.S */ 8390/* 8391 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8392 * any interesting requests and then jump to the real instruction 8393 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8394 */ 8395 .extern MterpCheckBefore 8396 EXPORT_PC 8397 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8398 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler. 8399 mov r0, rSELF 8400 add r1, rFP, #OFF_FP_SHADOWFRAME 8401 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8402 8403/* ------------------------------ */ 8404 .balign 128 8405.L_ALT_op_if_nez: /* 0x39 */ 8406/* File: arm/alt_stub.S */ 8407/* 8408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8409 * any interesting requests and then jump to the real instruction 8410 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8411 */ 8412 .extern MterpCheckBefore 8413 EXPORT_PC 8414 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8415 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler. 8416 mov r0, rSELF 8417 add r1, rFP, #OFF_FP_SHADOWFRAME 8418 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8419 8420/* ------------------------------ */ 8421 .balign 128 8422.L_ALT_op_if_ltz: /* 0x3a */ 8423/* File: arm/alt_stub.S */ 8424/* 8425 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8426 * any interesting requests and then jump to the real instruction 8427 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8428 */ 8429 .extern MterpCheckBefore 8430 EXPORT_PC 8431 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8432 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler. 8433 mov r0, rSELF 8434 add r1, rFP, #OFF_FP_SHADOWFRAME 8435 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8436 8437/* ------------------------------ */ 8438 .balign 128 8439.L_ALT_op_if_gez: /* 0x3b */ 8440/* File: arm/alt_stub.S */ 8441/* 8442 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8443 * any interesting requests and then jump to the real instruction 8444 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8445 */ 8446 .extern MterpCheckBefore 8447 EXPORT_PC 8448 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8449 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler. 8450 mov r0, rSELF 8451 add r1, rFP, #OFF_FP_SHADOWFRAME 8452 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8453 8454/* ------------------------------ */ 8455 .balign 128 8456.L_ALT_op_if_gtz: /* 0x3c */ 8457/* File: arm/alt_stub.S */ 8458/* 8459 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8460 * any interesting requests and then jump to the real instruction 8461 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8462 */ 8463 .extern MterpCheckBefore 8464 EXPORT_PC 8465 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8466 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler. 8467 mov r0, rSELF 8468 add r1, rFP, #OFF_FP_SHADOWFRAME 8469 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8470 8471/* ------------------------------ */ 8472 .balign 128 8473.L_ALT_op_if_lez: /* 0x3d */ 8474/* File: arm/alt_stub.S */ 8475/* 8476 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8477 * any interesting requests and then jump to the real instruction 8478 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8479 */ 8480 .extern MterpCheckBefore 8481 EXPORT_PC 8482 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8483 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler. 8484 mov r0, rSELF 8485 add r1, rFP, #OFF_FP_SHADOWFRAME 8486 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8487 8488/* ------------------------------ */ 8489 .balign 128 8490.L_ALT_op_unused_3e: /* 0x3e */ 8491/* File: arm/alt_stub.S */ 8492/* 8493 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8494 * any interesting requests and then jump to the real instruction 8495 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8496 */ 8497 .extern MterpCheckBefore 8498 EXPORT_PC 8499 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8500 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler. 8501 mov r0, rSELF 8502 add r1, rFP, #OFF_FP_SHADOWFRAME 8503 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8504 8505/* ------------------------------ */ 8506 .balign 128 8507.L_ALT_op_unused_3f: /* 0x3f */ 8508/* File: arm/alt_stub.S */ 8509/* 8510 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8511 * any interesting requests and then jump to the real instruction 8512 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8513 */ 8514 .extern MterpCheckBefore 8515 EXPORT_PC 8516 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8517 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler. 8518 mov r0, rSELF 8519 add r1, rFP, #OFF_FP_SHADOWFRAME 8520 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8521 8522/* ------------------------------ */ 8523 .balign 128 8524.L_ALT_op_unused_40: /* 0x40 */ 8525/* File: arm/alt_stub.S */ 8526/* 8527 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8528 * any interesting requests and then jump to the real instruction 8529 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8530 */ 8531 .extern MterpCheckBefore 8532 EXPORT_PC 8533 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8534 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler. 8535 mov r0, rSELF 8536 add r1, rFP, #OFF_FP_SHADOWFRAME 8537 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8538 8539/* ------------------------------ */ 8540 .balign 128 8541.L_ALT_op_unused_41: /* 0x41 */ 8542/* File: arm/alt_stub.S */ 8543/* 8544 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8545 * any interesting requests and then jump to the real instruction 8546 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8547 */ 8548 .extern MterpCheckBefore 8549 EXPORT_PC 8550 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8551 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler. 8552 mov r0, rSELF 8553 add r1, rFP, #OFF_FP_SHADOWFRAME 8554 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8555 8556/* ------------------------------ */ 8557 .balign 128 8558.L_ALT_op_unused_42: /* 0x42 */ 8559/* File: arm/alt_stub.S */ 8560/* 8561 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8562 * any interesting requests and then jump to the real instruction 8563 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8564 */ 8565 .extern MterpCheckBefore 8566 EXPORT_PC 8567 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8568 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler. 8569 mov r0, rSELF 8570 add r1, rFP, #OFF_FP_SHADOWFRAME 8571 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8572 8573/* ------------------------------ */ 8574 .balign 128 8575.L_ALT_op_unused_43: /* 0x43 */ 8576/* File: arm/alt_stub.S */ 8577/* 8578 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8579 * any interesting requests and then jump to the real instruction 8580 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8581 */ 8582 .extern MterpCheckBefore 8583 EXPORT_PC 8584 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8585 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler. 8586 mov r0, rSELF 8587 add r1, rFP, #OFF_FP_SHADOWFRAME 8588 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8589 8590/* ------------------------------ */ 8591 .balign 128 8592.L_ALT_op_aget: /* 0x44 */ 8593/* File: arm/alt_stub.S */ 8594/* 8595 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8596 * any interesting requests and then jump to the real instruction 8597 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8598 */ 8599 .extern MterpCheckBefore 8600 EXPORT_PC 8601 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8602 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler. 8603 mov r0, rSELF 8604 add r1, rFP, #OFF_FP_SHADOWFRAME 8605 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8606 8607/* ------------------------------ */ 8608 .balign 128 8609.L_ALT_op_aget_wide: /* 0x45 */ 8610/* File: arm/alt_stub.S */ 8611/* 8612 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8613 * any interesting requests and then jump to the real instruction 8614 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8615 */ 8616 .extern MterpCheckBefore 8617 EXPORT_PC 8618 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8619 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler. 8620 mov r0, rSELF 8621 add r1, rFP, #OFF_FP_SHADOWFRAME 8622 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8623 8624/* ------------------------------ */ 8625 .balign 128 8626.L_ALT_op_aget_object: /* 0x46 */ 8627/* File: arm/alt_stub.S */ 8628/* 8629 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8630 * any interesting requests and then jump to the real instruction 8631 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8632 */ 8633 .extern MterpCheckBefore 8634 EXPORT_PC 8635 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8636 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler. 8637 mov r0, rSELF 8638 add r1, rFP, #OFF_FP_SHADOWFRAME 8639 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8640 8641/* ------------------------------ */ 8642 .balign 128 8643.L_ALT_op_aget_boolean: /* 0x47 */ 8644/* File: arm/alt_stub.S */ 8645/* 8646 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8647 * any interesting requests and then jump to the real instruction 8648 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8649 */ 8650 .extern MterpCheckBefore 8651 EXPORT_PC 8652 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8653 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler. 8654 mov r0, rSELF 8655 add r1, rFP, #OFF_FP_SHADOWFRAME 8656 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8657 8658/* ------------------------------ */ 8659 .balign 128 8660.L_ALT_op_aget_byte: /* 0x48 */ 8661/* File: arm/alt_stub.S */ 8662/* 8663 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8664 * any interesting requests and then jump to the real instruction 8665 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8666 */ 8667 .extern MterpCheckBefore 8668 EXPORT_PC 8669 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8670 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler. 8671 mov r0, rSELF 8672 add r1, rFP, #OFF_FP_SHADOWFRAME 8673 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8674 8675/* ------------------------------ */ 8676 .balign 128 8677.L_ALT_op_aget_char: /* 0x49 */ 8678/* File: arm/alt_stub.S */ 8679/* 8680 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8681 * any interesting requests and then jump to the real instruction 8682 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8683 */ 8684 .extern MterpCheckBefore 8685 EXPORT_PC 8686 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8687 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler. 8688 mov r0, rSELF 8689 add r1, rFP, #OFF_FP_SHADOWFRAME 8690 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8691 8692/* ------------------------------ */ 8693 .balign 128 8694.L_ALT_op_aget_short: /* 0x4a */ 8695/* File: arm/alt_stub.S */ 8696/* 8697 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8698 * any interesting requests and then jump to the real instruction 8699 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8700 */ 8701 .extern MterpCheckBefore 8702 EXPORT_PC 8703 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8704 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler. 8705 mov r0, rSELF 8706 add r1, rFP, #OFF_FP_SHADOWFRAME 8707 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8708 8709/* ------------------------------ */ 8710 .balign 128 8711.L_ALT_op_aput: /* 0x4b */ 8712/* File: arm/alt_stub.S */ 8713/* 8714 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8715 * any interesting requests and then jump to the real instruction 8716 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8717 */ 8718 .extern MterpCheckBefore 8719 EXPORT_PC 8720 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8721 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler. 8722 mov r0, rSELF 8723 add r1, rFP, #OFF_FP_SHADOWFRAME 8724 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8725 8726/* ------------------------------ */ 8727 .balign 128 8728.L_ALT_op_aput_wide: /* 0x4c */ 8729/* File: arm/alt_stub.S */ 8730/* 8731 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8732 * any interesting requests and then jump to the real instruction 8733 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8734 */ 8735 .extern MterpCheckBefore 8736 EXPORT_PC 8737 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8738 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler. 8739 mov r0, rSELF 8740 add r1, rFP, #OFF_FP_SHADOWFRAME 8741 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8742 8743/* ------------------------------ */ 8744 .balign 128 8745.L_ALT_op_aput_object: /* 0x4d */ 8746/* File: arm/alt_stub.S */ 8747/* 8748 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8749 * any interesting requests and then jump to the real instruction 8750 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8751 */ 8752 .extern MterpCheckBefore 8753 EXPORT_PC 8754 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8755 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler. 8756 mov r0, rSELF 8757 add r1, rFP, #OFF_FP_SHADOWFRAME 8758 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8759 8760/* ------------------------------ */ 8761 .balign 128 8762.L_ALT_op_aput_boolean: /* 0x4e */ 8763/* File: arm/alt_stub.S */ 8764/* 8765 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8766 * any interesting requests and then jump to the real instruction 8767 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8768 */ 8769 .extern MterpCheckBefore 8770 EXPORT_PC 8771 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8772 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler. 8773 mov r0, rSELF 8774 add r1, rFP, #OFF_FP_SHADOWFRAME 8775 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8776 8777/* ------------------------------ */ 8778 .balign 128 8779.L_ALT_op_aput_byte: /* 0x4f */ 8780/* File: arm/alt_stub.S */ 8781/* 8782 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8783 * any interesting requests and then jump to the real instruction 8784 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8785 */ 8786 .extern MterpCheckBefore 8787 EXPORT_PC 8788 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8789 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler. 8790 mov r0, rSELF 8791 add r1, rFP, #OFF_FP_SHADOWFRAME 8792 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8793 8794/* ------------------------------ */ 8795 .balign 128 8796.L_ALT_op_aput_char: /* 0x50 */ 8797/* File: arm/alt_stub.S */ 8798/* 8799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8800 * any interesting requests and then jump to the real instruction 8801 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8802 */ 8803 .extern MterpCheckBefore 8804 EXPORT_PC 8805 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8806 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler. 8807 mov r0, rSELF 8808 add r1, rFP, #OFF_FP_SHADOWFRAME 8809 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8810 8811/* ------------------------------ */ 8812 .balign 128 8813.L_ALT_op_aput_short: /* 0x51 */ 8814/* File: arm/alt_stub.S */ 8815/* 8816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8817 * any interesting requests and then jump to the real instruction 8818 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8819 */ 8820 .extern MterpCheckBefore 8821 EXPORT_PC 8822 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8823 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler. 8824 mov r0, rSELF 8825 add r1, rFP, #OFF_FP_SHADOWFRAME 8826 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8827 8828/* ------------------------------ */ 8829 .balign 128 8830.L_ALT_op_iget: /* 0x52 */ 8831/* File: arm/alt_stub.S */ 8832/* 8833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8834 * any interesting requests and then jump to the real instruction 8835 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8836 */ 8837 .extern MterpCheckBefore 8838 EXPORT_PC 8839 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8840 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler. 8841 mov r0, rSELF 8842 add r1, rFP, #OFF_FP_SHADOWFRAME 8843 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8844 8845/* ------------------------------ */ 8846 .balign 128 8847.L_ALT_op_iget_wide: /* 0x53 */ 8848/* File: arm/alt_stub.S */ 8849/* 8850 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8851 * any interesting requests and then jump to the real instruction 8852 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8853 */ 8854 .extern MterpCheckBefore 8855 EXPORT_PC 8856 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8857 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler. 8858 mov r0, rSELF 8859 add r1, rFP, #OFF_FP_SHADOWFRAME 8860 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8861 8862/* ------------------------------ */ 8863 .balign 128 8864.L_ALT_op_iget_object: /* 0x54 */ 8865/* File: arm/alt_stub.S */ 8866/* 8867 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8868 * any interesting requests and then jump to the real instruction 8869 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8870 */ 8871 .extern MterpCheckBefore 8872 EXPORT_PC 8873 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8874 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler. 8875 mov r0, rSELF 8876 add r1, rFP, #OFF_FP_SHADOWFRAME 8877 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8878 8879/* ------------------------------ */ 8880 .balign 128 8881.L_ALT_op_iget_boolean: /* 0x55 */ 8882/* File: arm/alt_stub.S */ 8883/* 8884 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8885 * any interesting requests and then jump to the real instruction 8886 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8887 */ 8888 .extern MterpCheckBefore 8889 EXPORT_PC 8890 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8891 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler. 8892 mov r0, rSELF 8893 add r1, rFP, #OFF_FP_SHADOWFRAME 8894 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8895 8896/* ------------------------------ */ 8897 .balign 128 8898.L_ALT_op_iget_byte: /* 0x56 */ 8899/* File: arm/alt_stub.S */ 8900/* 8901 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8902 * any interesting requests and then jump to the real instruction 8903 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8904 */ 8905 .extern MterpCheckBefore 8906 EXPORT_PC 8907 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8908 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler. 8909 mov r0, rSELF 8910 add r1, rFP, #OFF_FP_SHADOWFRAME 8911 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8912 8913/* ------------------------------ */ 8914 .balign 128 8915.L_ALT_op_iget_char: /* 0x57 */ 8916/* File: arm/alt_stub.S */ 8917/* 8918 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8919 * any interesting requests and then jump to the real instruction 8920 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8921 */ 8922 .extern MterpCheckBefore 8923 EXPORT_PC 8924 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8925 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler. 8926 mov r0, rSELF 8927 add r1, rFP, #OFF_FP_SHADOWFRAME 8928 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8929 8930/* ------------------------------ */ 8931 .balign 128 8932.L_ALT_op_iget_short: /* 0x58 */ 8933/* File: arm/alt_stub.S */ 8934/* 8935 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8936 * any interesting requests and then jump to the real instruction 8937 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8938 */ 8939 .extern MterpCheckBefore 8940 EXPORT_PC 8941 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8942 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler. 8943 mov r0, rSELF 8944 add r1, rFP, #OFF_FP_SHADOWFRAME 8945 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8946 8947/* ------------------------------ */ 8948 .balign 128 8949.L_ALT_op_iput: /* 0x59 */ 8950/* File: arm/alt_stub.S */ 8951/* 8952 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8953 * any interesting requests and then jump to the real instruction 8954 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8955 */ 8956 .extern MterpCheckBefore 8957 EXPORT_PC 8958 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8959 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler. 8960 mov r0, rSELF 8961 add r1, rFP, #OFF_FP_SHADOWFRAME 8962 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8963 8964/* ------------------------------ */ 8965 .balign 128 8966.L_ALT_op_iput_wide: /* 0x5a */ 8967/* File: arm/alt_stub.S */ 8968/* 8969 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8970 * any interesting requests and then jump to the real instruction 8971 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8972 */ 8973 .extern MterpCheckBefore 8974 EXPORT_PC 8975 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8976 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler. 8977 mov r0, rSELF 8978 add r1, rFP, #OFF_FP_SHADOWFRAME 8979 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8980 8981/* ------------------------------ */ 8982 .balign 128 8983.L_ALT_op_iput_object: /* 0x5b */ 8984/* File: arm/alt_stub.S */ 8985/* 8986 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8987 * any interesting requests and then jump to the real instruction 8988 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8989 */ 8990 .extern MterpCheckBefore 8991 EXPORT_PC 8992 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 8993 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler. 8994 mov r0, rSELF 8995 add r1, rFP, #OFF_FP_SHADOWFRAME 8996 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 8997 8998/* ------------------------------ */ 8999 .balign 128 9000.L_ALT_op_iput_boolean: /* 0x5c */ 9001/* File: arm/alt_stub.S */ 9002/* 9003 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9004 * any interesting requests and then jump to the real instruction 9005 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9006 */ 9007 .extern MterpCheckBefore 9008 EXPORT_PC 9009 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9010 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler. 9011 mov r0, rSELF 9012 add r1, rFP, #OFF_FP_SHADOWFRAME 9013 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9014 9015/* ------------------------------ */ 9016 .balign 128 9017.L_ALT_op_iput_byte: /* 0x5d */ 9018/* File: arm/alt_stub.S */ 9019/* 9020 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9021 * any interesting requests and then jump to the real instruction 9022 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9023 */ 9024 .extern MterpCheckBefore 9025 EXPORT_PC 9026 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9027 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler. 9028 mov r0, rSELF 9029 add r1, rFP, #OFF_FP_SHADOWFRAME 9030 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9031 9032/* ------------------------------ */ 9033 .balign 128 9034.L_ALT_op_iput_char: /* 0x5e */ 9035/* File: arm/alt_stub.S */ 9036/* 9037 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9038 * any interesting requests and then jump to the real instruction 9039 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9040 */ 9041 .extern MterpCheckBefore 9042 EXPORT_PC 9043 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9044 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler. 9045 mov r0, rSELF 9046 add r1, rFP, #OFF_FP_SHADOWFRAME 9047 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9048 9049/* ------------------------------ */ 9050 .balign 128 9051.L_ALT_op_iput_short: /* 0x5f */ 9052/* File: arm/alt_stub.S */ 9053/* 9054 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9055 * any interesting requests and then jump to the real instruction 9056 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9057 */ 9058 .extern MterpCheckBefore 9059 EXPORT_PC 9060 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9061 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler. 9062 mov r0, rSELF 9063 add r1, rFP, #OFF_FP_SHADOWFRAME 9064 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9065 9066/* ------------------------------ */ 9067 .balign 128 9068.L_ALT_op_sget: /* 0x60 */ 9069/* File: arm/alt_stub.S */ 9070/* 9071 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9072 * any interesting requests and then jump to the real instruction 9073 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9074 */ 9075 .extern MterpCheckBefore 9076 EXPORT_PC 9077 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9078 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler. 9079 mov r0, rSELF 9080 add r1, rFP, #OFF_FP_SHADOWFRAME 9081 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9082 9083/* ------------------------------ */ 9084 .balign 128 9085.L_ALT_op_sget_wide: /* 0x61 */ 9086/* File: arm/alt_stub.S */ 9087/* 9088 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9089 * any interesting requests and then jump to the real instruction 9090 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9091 */ 9092 .extern MterpCheckBefore 9093 EXPORT_PC 9094 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9095 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler. 9096 mov r0, rSELF 9097 add r1, rFP, #OFF_FP_SHADOWFRAME 9098 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9099 9100/* ------------------------------ */ 9101 .balign 128 9102.L_ALT_op_sget_object: /* 0x62 */ 9103/* File: arm/alt_stub.S */ 9104/* 9105 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9106 * any interesting requests and then jump to the real instruction 9107 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9108 */ 9109 .extern MterpCheckBefore 9110 EXPORT_PC 9111 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9112 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler. 9113 mov r0, rSELF 9114 add r1, rFP, #OFF_FP_SHADOWFRAME 9115 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9116 9117/* ------------------------------ */ 9118 .balign 128 9119.L_ALT_op_sget_boolean: /* 0x63 */ 9120/* File: arm/alt_stub.S */ 9121/* 9122 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9123 * any interesting requests and then jump to the real instruction 9124 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9125 */ 9126 .extern MterpCheckBefore 9127 EXPORT_PC 9128 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9129 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler. 9130 mov r0, rSELF 9131 add r1, rFP, #OFF_FP_SHADOWFRAME 9132 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9133 9134/* ------------------------------ */ 9135 .balign 128 9136.L_ALT_op_sget_byte: /* 0x64 */ 9137/* File: arm/alt_stub.S */ 9138/* 9139 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9140 * any interesting requests and then jump to the real instruction 9141 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9142 */ 9143 .extern MterpCheckBefore 9144 EXPORT_PC 9145 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9146 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler. 9147 mov r0, rSELF 9148 add r1, rFP, #OFF_FP_SHADOWFRAME 9149 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9150 9151/* ------------------------------ */ 9152 .balign 128 9153.L_ALT_op_sget_char: /* 0x65 */ 9154/* File: arm/alt_stub.S */ 9155/* 9156 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9157 * any interesting requests and then jump to the real instruction 9158 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9159 */ 9160 .extern MterpCheckBefore 9161 EXPORT_PC 9162 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9163 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler. 9164 mov r0, rSELF 9165 add r1, rFP, #OFF_FP_SHADOWFRAME 9166 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9167 9168/* ------------------------------ */ 9169 .balign 128 9170.L_ALT_op_sget_short: /* 0x66 */ 9171/* File: arm/alt_stub.S */ 9172/* 9173 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9174 * any interesting requests and then jump to the real instruction 9175 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9176 */ 9177 .extern MterpCheckBefore 9178 EXPORT_PC 9179 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9180 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler. 9181 mov r0, rSELF 9182 add r1, rFP, #OFF_FP_SHADOWFRAME 9183 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9184 9185/* ------------------------------ */ 9186 .balign 128 9187.L_ALT_op_sput: /* 0x67 */ 9188/* File: arm/alt_stub.S */ 9189/* 9190 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9191 * any interesting requests and then jump to the real instruction 9192 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9193 */ 9194 .extern MterpCheckBefore 9195 EXPORT_PC 9196 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9197 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler. 9198 mov r0, rSELF 9199 add r1, rFP, #OFF_FP_SHADOWFRAME 9200 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9201 9202/* ------------------------------ */ 9203 .balign 128 9204.L_ALT_op_sput_wide: /* 0x68 */ 9205/* File: arm/alt_stub.S */ 9206/* 9207 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9208 * any interesting requests and then jump to the real instruction 9209 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9210 */ 9211 .extern MterpCheckBefore 9212 EXPORT_PC 9213 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9214 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler. 9215 mov r0, rSELF 9216 add r1, rFP, #OFF_FP_SHADOWFRAME 9217 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9218 9219/* ------------------------------ */ 9220 .balign 128 9221.L_ALT_op_sput_object: /* 0x69 */ 9222/* File: arm/alt_stub.S */ 9223/* 9224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9225 * any interesting requests and then jump to the real instruction 9226 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9227 */ 9228 .extern MterpCheckBefore 9229 EXPORT_PC 9230 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9231 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler. 9232 mov r0, rSELF 9233 add r1, rFP, #OFF_FP_SHADOWFRAME 9234 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9235 9236/* ------------------------------ */ 9237 .balign 128 9238.L_ALT_op_sput_boolean: /* 0x6a */ 9239/* File: arm/alt_stub.S */ 9240/* 9241 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9242 * any interesting requests and then jump to the real instruction 9243 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9244 */ 9245 .extern MterpCheckBefore 9246 EXPORT_PC 9247 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9248 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler. 9249 mov r0, rSELF 9250 add r1, rFP, #OFF_FP_SHADOWFRAME 9251 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9252 9253/* ------------------------------ */ 9254 .balign 128 9255.L_ALT_op_sput_byte: /* 0x6b */ 9256/* File: arm/alt_stub.S */ 9257/* 9258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9259 * any interesting requests and then jump to the real instruction 9260 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9261 */ 9262 .extern MterpCheckBefore 9263 EXPORT_PC 9264 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9265 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler. 9266 mov r0, rSELF 9267 add r1, rFP, #OFF_FP_SHADOWFRAME 9268 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9269 9270/* ------------------------------ */ 9271 .balign 128 9272.L_ALT_op_sput_char: /* 0x6c */ 9273/* File: arm/alt_stub.S */ 9274/* 9275 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9276 * any interesting requests and then jump to the real instruction 9277 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9278 */ 9279 .extern MterpCheckBefore 9280 EXPORT_PC 9281 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9282 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler. 9283 mov r0, rSELF 9284 add r1, rFP, #OFF_FP_SHADOWFRAME 9285 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9286 9287/* ------------------------------ */ 9288 .balign 128 9289.L_ALT_op_sput_short: /* 0x6d */ 9290/* File: arm/alt_stub.S */ 9291/* 9292 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9293 * any interesting requests and then jump to the real instruction 9294 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9295 */ 9296 .extern MterpCheckBefore 9297 EXPORT_PC 9298 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9299 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler. 9300 mov r0, rSELF 9301 add r1, rFP, #OFF_FP_SHADOWFRAME 9302 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9303 9304/* ------------------------------ */ 9305 .balign 128 9306.L_ALT_op_invoke_virtual: /* 0x6e */ 9307/* File: arm/alt_stub.S */ 9308/* 9309 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9310 * any interesting requests and then jump to the real instruction 9311 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9312 */ 9313 .extern MterpCheckBefore 9314 EXPORT_PC 9315 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9316 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler. 9317 mov r0, rSELF 9318 add r1, rFP, #OFF_FP_SHADOWFRAME 9319 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9320 9321/* ------------------------------ */ 9322 .balign 128 9323.L_ALT_op_invoke_super: /* 0x6f */ 9324/* File: arm/alt_stub.S */ 9325/* 9326 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9327 * any interesting requests and then jump to the real instruction 9328 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9329 */ 9330 .extern MterpCheckBefore 9331 EXPORT_PC 9332 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9333 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler. 9334 mov r0, rSELF 9335 add r1, rFP, #OFF_FP_SHADOWFRAME 9336 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9337 9338/* ------------------------------ */ 9339 .balign 128 9340.L_ALT_op_invoke_direct: /* 0x70 */ 9341/* File: arm/alt_stub.S */ 9342/* 9343 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9344 * any interesting requests and then jump to the real instruction 9345 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9346 */ 9347 .extern MterpCheckBefore 9348 EXPORT_PC 9349 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9350 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler. 9351 mov r0, rSELF 9352 add r1, rFP, #OFF_FP_SHADOWFRAME 9353 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9354 9355/* ------------------------------ */ 9356 .balign 128 9357.L_ALT_op_invoke_static: /* 0x71 */ 9358/* File: arm/alt_stub.S */ 9359/* 9360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9361 * any interesting requests and then jump to the real instruction 9362 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9363 */ 9364 .extern MterpCheckBefore 9365 EXPORT_PC 9366 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9367 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler. 9368 mov r0, rSELF 9369 add r1, rFP, #OFF_FP_SHADOWFRAME 9370 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9371 9372/* ------------------------------ */ 9373 .balign 128 9374.L_ALT_op_invoke_interface: /* 0x72 */ 9375/* File: arm/alt_stub.S */ 9376/* 9377 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9378 * any interesting requests and then jump to the real instruction 9379 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9380 */ 9381 .extern MterpCheckBefore 9382 EXPORT_PC 9383 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9384 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler. 9385 mov r0, rSELF 9386 add r1, rFP, #OFF_FP_SHADOWFRAME 9387 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9388 9389/* ------------------------------ */ 9390 .balign 128 9391.L_ALT_op_return_void_no_barrier: /* 0x73 */ 9392/* File: arm/alt_stub.S */ 9393/* 9394 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9395 * any interesting requests and then jump to the real instruction 9396 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9397 */ 9398 .extern MterpCheckBefore 9399 EXPORT_PC 9400 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9401 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler. 9402 mov r0, rSELF 9403 add r1, rFP, #OFF_FP_SHADOWFRAME 9404 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9405 9406/* ------------------------------ */ 9407 .balign 128 9408.L_ALT_op_invoke_virtual_range: /* 0x74 */ 9409/* File: arm/alt_stub.S */ 9410/* 9411 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9412 * any interesting requests and then jump to the real instruction 9413 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9414 */ 9415 .extern MterpCheckBefore 9416 EXPORT_PC 9417 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9418 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler. 9419 mov r0, rSELF 9420 add r1, rFP, #OFF_FP_SHADOWFRAME 9421 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9422 9423/* ------------------------------ */ 9424 .balign 128 9425.L_ALT_op_invoke_super_range: /* 0x75 */ 9426/* File: arm/alt_stub.S */ 9427/* 9428 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9429 * any interesting requests and then jump to the real instruction 9430 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9431 */ 9432 .extern MterpCheckBefore 9433 EXPORT_PC 9434 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9435 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler. 9436 mov r0, rSELF 9437 add r1, rFP, #OFF_FP_SHADOWFRAME 9438 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9439 9440/* ------------------------------ */ 9441 .balign 128 9442.L_ALT_op_invoke_direct_range: /* 0x76 */ 9443/* File: arm/alt_stub.S */ 9444/* 9445 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9446 * any interesting requests and then jump to the real instruction 9447 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9448 */ 9449 .extern MterpCheckBefore 9450 EXPORT_PC 9451 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9452 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler. 9453 mov r0, rSELF 9454 add r1, rFP, #OFF_FP_SHADOWFRAME 9455 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9456 9457/* ------------------------------ */ 9458 .balign 128 9459.L_ALT_op_invoke_static_range: /* 0x77 */ 9460/* File: arm/alt_stub.S */ 9461/* 9462 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9463 * any interesting requests and then jump to the real instruction 9464 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9465 */ 9466 .extern MterpCheckBefore 9467 EXPORT_PC 9468 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9469 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler. 9470 mov r0, rSELF 9471 add r1, rFP, #OFF_FP_SHADOWFRAME 9472 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9473 9474/* ------------------------------ */ 9475 .balign 128 9476.L_ALT_op_invoke_interface_range: /* 0x78 */ 9477/* File: arm/alt_stub.S */ 9478/* 9479 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9480 * any interesting requests and then jump to the real instruction 9481 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9482 */ 9483 .extern MterpCheckBefore 9484 EXPORT_PC 9485 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9486 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler. 9487 mov r0, rSELF 9488 add r1, rFP, #OFF_FP_SHADOWFRAME 9489 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9490 9491/* ------------------------------ */ 9492 .balign 128 9493.L_ALT_op_unused_79: /* 0x79 */ 9494/* File: arm/alt_stub.S */ 9495/* 9496 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9497 * any interesting requests and then jump to the real instruction 9498 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9499 */ 9500 .extern MterpCheckBefore 9501 EXPORT_PC 9502 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9503 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler. 9504 mov r0, rSELF 9505 add r1, rFP, #OFF_FP_SHADOWFRAME 9506 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9507 9508/* ------------------------------ */ 9509 .balign 128 9510.L_ALT_op_unused_7a: /* 0x7a */ 9511/* File: arm/alt_stub.S */ 9512/* 9513 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9514 * any interesting requests and then jump to the real instruction 9515 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9516 */ 9517 .extern MterpCheckBefore 9518 EXPORT_PC 9519 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9520 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler. 9521 mov r0, rSELF 9522 add r1, rFP, #OFF_FP_SHADOWFRAME 9523 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9524 9525/* ------------------------------ */ 9526 .balign 128 9527.L_ALT_op_neg_int: /* 0x7b */ 9528/* File: arm/alt_stub.S */ 9529/* 9530 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9531 * any interesting requests and then jump to the real instruction 9532 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9533 */ 9534 .extern MterpCheckBefore 9535 EXPORT_PC 9536 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9537 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler. 9538 mov r0, rSELF 9539 add r1, rFP, #OFF_FP_SHADOWFRAME 9540 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9541 9542/* ------------------------------ */ 9543 .balign 128 9544.L_ALT_op_not_int: /* 0x7c */ 9545/* File: arm/alt_stub.S */ 9546/* 9547 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9548 * any interesting requests and then jump to the real instruction 9549 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9550 */ 9551 .extern MterpCheckBefore 9552 EXPORT_PC 9553 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9554 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler. 9555 mov r0, rSELF 9556 add r1, rFP, #OFF_FP_SHADOWFRAME 9557 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9558 9559/* ------------------------------ */ 9560 .balign 128 9561.L_ALT_op_neg_long: /* 0x7d */ 9562/* File: arm/alt_stub.S */ 9563/* 9564 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9565 * any interesting requests and then jump to the real instruction 9566 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9567 */ 9568 .extern MterpCheckBefore 9569 EXPORT_PC 9570 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9571 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler. 9572 mov r0, rSELF 9573 add r1, rFP, #OFF_FP_SHADOWFRAME 9574 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9575 9576/* ------------------------------ */ 9577 .balign 128 9578.L_ALT_op_not_long: /* 0x7e */ 9579/* File: arm/alt_stub.S */ 9580/* 9581 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9582 * any interesting requests and then jump to the real instruction 9583 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9584 */ 9585 .extern MterpCheckBefore 9586 EXPORT_PC 9587 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9588 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler. 9589 mov r0, rSELF 9590 add r1, rFP, #OFF_FP_SHADOWFRAME 9591 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9592 9593/* ------------------------------ */ 9594 .balign 128 9595.L_ALT_op_neg_float: /* 0x7f */ 9596/* File: arm/alt_stub.S */ 9597/* 9598 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9599 * any interesting requests and then jump to the real instruction 9600 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9601 */ 9602 .extern MterpCheckBefore 9603 EXPORT_PC 9604 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9605 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler. 9606 mov r0, rSELF 9607 add r1, rFP, #OFF_FP_SHADOWFRAME 9608 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9609 9610/* ------------------------------ */ 9611 .balign 128 9612.L_ALT_op_neg_double: /* 0x80 */ 9613/* File: arm/alt_stub.S */ 9614/* 9615 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9616 * any interesting requests and then jump to the real instruction 9617 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9618 */ 9619 .extern MterpCheckBefore 9620 EXPORT_PC 9621 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9622 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler. 9623 mov r0, rSELF 9624 add r1, rFP, #OFF_FP_SHADOWFRAME 9625 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9626 9627/* ------------------------------ */ 9628 .balign 128 9629.L_ALT_op_int_to_long: /* 0x81 */ 9630/* File: arm/alt_stub.S */ 9631/* 9632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9633 * any interesting requests and then jump to the real instruction 9634 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9635 */ 9636 .extern MterpCheckBefore 9637 EXPORT_PC 9638 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9639 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler. 9640 mov r0, rSELF 9641 add r1, rFP, #OFF_FP_SHADOWFRAME 9642 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9643 9644/* ------------------------------ */ 9645 .balign 128 9646.L_ALT_op_int_to_float: /* 0x82 */ 9647/* File: arm/alt_stub.S */ 9648/* 9649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9650 * any interesting requests and then jump to the real instruction 9651 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9652 */ 9653 .extern MterpCheckBefore 9654 EXPORT_PC 9655 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9656 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler. 9657 mov r0, rSELF 9658 add r1, rFP, #OFF_FP_SHADOWFRAME 9659 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9660 9661/* ------------------------------ */ 9662 .balign 128 9663.L_ALT_op_int_to_double: /* 0x83 */ 9664/* File: arm/alt_stub.S */ 9665/* 9666 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9667 * any interesting requests and then jump to the real instruction 9668 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9669 */ 9670 .extern MterpCheckBefore 9671 EXPORT_PC 9672 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9673 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler. 9674 mov r0, rSELF 9675 add r1, rFP, #OFF_FP_SHADOWFRAME 9676 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9677 9678/* ------------------------------ */ 9679 .balign 128 9680.L_ALT_op_long_to_int: /* 0x84 */ 9681/* File: arm/alt_stub.S */ 9682/* 9683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9684 * any interesting requests and then jump to the real instruction 9685 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9686 */ 9687 .extern MterpCheckBefore 9688 EXPORT_PC 9689 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9690 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler. 9691 mov r0, rSELF 9692 add r1, rFP, #OFF_FP_SHADOWFRAME 9693 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9694 9695/* ------------------------------ */ 9696 .balign 128 9697.L_ALT_op_long_to_float: /* 0x85 */ 9698/* File: arm/alt_stub.S */ 9699/* 9700 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9701 * any interesting requests and then jump to the real instruction 9702 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9703 */ 9704 .extern MterpCheckBefore 9705 EXPORT_PC 9706 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9707 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler. 9708 mov r0, rSELF 9709 add r1, rFP, #OFF_FP_SHADOWFRAME 9710 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9711 9712/* ------------------------------ */ 9713 .balign 128 9714.L_ALT_op_long_to_double: /* 0x86 */ 9715/* File: arm/alt_stub.S */ 9716/* 9717 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9718 * any interesting requests and then jump to the real instruction 9719 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9720 */ 9721 .extern MterpCheckBefore 9722 EXPORT_PC 9723 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9724 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler. 9725 mov r0, rSELF 9726 add r1, rFP, #OFF_FP_SHADOWFRAME 9727 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9728 9729/* ------------------------------ */ 9730 .balign 128 9731.L_ALT_op_float_to_int: /* 0x87 */ 9732/* File: arm/alt_stub.S */ 9733/* 9734 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9735 * any interesting requests and then jump to the real instruction 9736 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9737 */ 9738 .extern MterpCheckBefore 9739 EXPORT_PC 9740 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9741 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler. 9742 mov r0, rSELF 9743 add r1, rFP, #OFF_FP_SHADOWFRAME 9744 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9745 9746/* ------------------------------ */ 9747 .balign 128 9748.L_ALT_op_float_to_long: /* 0x88 */ 9749/* File: arm/alt_stub.S */ 9750/* 9751 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9752 * any interesting requests and then jump to the real instruction 9753 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9754 */ 9755 .extern MterpCheckBefore 9756 EXPORT_PC 9757 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9758 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler. 9759 mov r0, rSELF 9760 add r1, rFP, #OFF_FP_SHADOWFRAME 9761 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9762 9763/* ------------------------------ */ 9764 .balign 128 9765.L_ALT_op_float_to_double: /* 0x89 */ 9766/* File: arm/alt_stub.S */ 9767/* 9768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9769 * any interesting requests and then jump to the real instruction 9770 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9771 */ 9772 .extern MterpCheckBefore 9773 EXPORT_PC 9774 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9775 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler. 9776 mov r0, rSELF 9777 add r1, rFP, #OFF_FP_SHADOWFRAME 9778 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9779 9780/* ------------------------------ */ 9781 .balign 128 9782.L_ALT_op_double_to_int: /* 0x8a */ 9783/* File: arm/alt_stub.S */ 9784/* 9785 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9786 * any interesting requests and then jump to the real instruction 9787 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9788 */ 9789 .extern MterpCheckBefore 9790 EXPORT_PC 9791 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9792 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler. 9793 mov r0, rSELF 9794 add r1, rFP, #OFF_FP_SHADOWFRAME 9795 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9796 9797/* ------------------------------ */ 9798 .balign 128 9799.L_ALT_op_double_to_long: /* 0x8b */ 9800/* File: arm/alt_stub.S */ 9801/* 9802 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9803 * any interesting requests and then jump to the real instruction 9804 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9805 */ 9806 .extern MterpCheckBefore 9807 EXPORT_PC 9808 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9809 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler. 9810 mov r0, rSELF 9811 add r1, rFP, #OFF_FP_SHADOWFRAME 9812 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9813 9814/* ------------------------------ */ 9815 .balign 128 9816.L_ALT_op_double_to_float: /* 0x8c */ 9817/* File: arm/alt_stub.S */ 9818/* 9819 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9820 * any interesting requests and then jump to the real instruction 9821 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9822 */ 9823 .extern MterpCheckBefore 9824 EXPORT_PC 9825 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9826 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler. 9827 mov r0, rSELF 9828 add r1, rFP, #OFF_FP_SHADOWFRAME 9829 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9830 9831/* ------------------------------ */ 9832 .balign 128 9833.L_ALT_op_int_to_byte: /* 0x8d */ 9834/* File: arm/alt_stub.S */ 9835/* 9836 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9837 * any interesting requests and then jump to the real instruction 9838 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9839 */ 9840 .extern MterpCheckBefore 9841 EXPORT_PC 9842 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9843 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler. 9844 mov r0, rSELF 9845 add r1, rFP, #OFF_FP_SHADOWFRAME 9846 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9847 9848/* ------------------------------ */ 9849 .balign 128 9850.L_ALT_op_int_to_char: /* 0x8e */ 9851/* File: arm/alt_stub.S */ 9852/* 9853 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9854 * any interesting requests and then jump to the real instruction 9855 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9856 */ 9857 .extern MterpCheckBefore 9858 EXPORT_PC 9859 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9860 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler. 9861 mov r0, rSELF 9862 add r1, rFP, #OFF_FP_SHADOWFRAME 9863 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9864 9865/* ------------------------------ */ 9866 .balign 128 9867.L_ALT_op_int_to_short: /* 0x8f */ 9868/* File: arm/alt_stub.S */ 9869/* 9870 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9871 * any interesting requests and then jump to the real instruction 9872 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9873 */ 9874 .extern MterpCheckBefore 9875 EXPORT_PC 9876 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9877 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler. 9878 mov r0, rSELF 9879 add r1, rFP, #OFF_FP_SHADOWFRAME 9880 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9881 9882/* ------------------------------ */ 9883 .balign 128 9884.L_ALT_op_add_int: /* 0x90 */ 9885/* File: arm/alt_stub.S */ 9886/* 9887 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9888 * any interesting requests and then jump to the real instruction 9889 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9890 */ 9891 .extern MterpCheckBefore 9892 EXPORT_PC 9893 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9894 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler. 9895 mov r0, rSELF 9896 add r1, rFP, #OFF_FP_SHADOWFRAME 9897 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9898 9899/* ------------------------------ */ 9900 .balign 128 9901.L_ALT_op_sub_int: /* 0x91 */ 9902/* File: arm/alt_stub.S */ 9903/* 9904 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9905 * any interesting requests and then jump to the real instruction 9906 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9907 */ 9908 .extern MterpCheckBefore 9909 EXPORT_PC 9910 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9911 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler. 9912 mov r0, rSELF 9913 add r1, rFP, #OFF_FP_SHADOWFRAME 9914 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9915 9916/* ------------------------------ */ 9917 .balign 128 9918.L_ALT_op_mul_int: /* 0x92 */ 9919/* File: arm/alt_stub.S */ 9920/* 9921 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9922 * any interesting requests and then jump to the real instruction 9923 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9924 */ 9925 .extern MterpCheckBefore 9926 EXPORT_PC 9927 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9928 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler. 9929 mov r0, rSELF 9930 add r1, rFP, #OFF_FP_SHADOWFRAME 9931 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9932 9933/* ------------------------------ */ 9934 .balign 128 9935.L_ALT_op_div_int: /* 0x93 */ 9936/* File: arm/alt_stub.S */ 9937/* 9938 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9939 * any interesting requests and then jump to the real instruction 9940 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9941 */ 9942 .extern MterpCheckBefore 9943 EXPORT_PC 9944 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9945 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler. 9946 mov r0, rSELF 9947 add r1, rFP, #OFF_FP_SHADOWFRAME 9948 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9949 9950/* ------------------------------ */ 9951 .balign 128 9952.L_ALT_op_rem_int: /* 0x94 */ 9953/* File: arm/alt_stub.S */ 9954/* 9955 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9956 * any interesting requests and then jump to the real instruction 9957 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9958 */ 9959 .extern MterpCheckBefore 9960 EXPORT_PC 9961 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9962 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler. 9963 mov r0, rSELF 9964 add r1, rFP, #OFF_FP_SHADOWFRAME 9965 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9966 9967/* ------------------------------ */ 9968 .balign 128 9969.L_ALT_op_and_int: /* 0x95 */ 9970/* File: arm/alt_stub.S */ 9971/* 9972 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9973 * any interesting requests and then jump to the real instruction 9974 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9975 */ 9976 .extern MterpCheckBefore 9977 EXPORT_PC 9978 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9979 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler. 9980 mov r0, rSELF 9981 add r1, rFP, #OFF_FP_SHADOWFRAME 9982 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 9983 9984/* ------------------------------ */ 9985 .balign 128 9986.L_ALT_op_or_int: /* 0x96 */ 9987/* File: arm/alt_stub.S */ 9988/* 9989 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9990 * any interesting requests and then jump to the real instruction 9991 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9992 */ 9993 .extern MterpCheckBefore 9994 EXPORT_PC 9995 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 9996 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler. 9997 mov r0, rSELF 9998 add r1, rFP, #OFF_FP_SHADOWFRAME 9999 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10000 10001/* ------------------------------ */ 10002 .balign 128 10003.L_ALT_op_xor_int: /* 0x97 */ 10004/* File: arm/alt_stub.S */ 10005/* 10006 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10007 * any interesting requests and then jump to the real instruction 10008 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10009 */ 10010 .extern MterpCheckBefore 10011 EXPORT_PC 10012 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10013 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler. 10014 mov r0, rSELF 10015 add r1, rFP, #OFF_FP_SHADOWFRAME 10016 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10017 10018/* ------------------------------ */ 10019 .balign 128 10020.L_ALT_op_shl_int: /* 0x98 */ 10021/* File: arm/alt_stub.S */ 10022/* 10023 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10024 * any interesting requests and then jump to the real instruction 10025 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10026 */ 10027 .extern MterpCheckBefore 10028 EXPORT_PC 10029 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10030 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler. 10031 mov r0, rSELF 10032 add r1, rFP, #OFF_FP_SHADOWFRAME 10033 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10034 10035/* ------------------------------ */ 10036 .balign 128 10037.L_ALT_op_shr_int: /* 0x99 */ 10038/* File: arm/alt_stub.S */ 10039/* 10040 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10041 * any interesting requests and then jump to the real instruction 10042 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10043 */ 10044 .extern MterpCheckBefore 10045 EXPORT_PC 10046 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10047 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler. 10048 mov r0, rSELF 10049 add r1, rFP, #OFF_FP_SHADOWFRAME 10050 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10051 10052/* ------------------------------ */ 10053 .balign 128 10054.L_ALT_op_ushr_int: /* 0x9a */ 10055/* File: arm/alt_stub.S */ 10056/* 10057 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10058 * any interesting requests and then jump to the real instruction 10059 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10060 */ 10061 .extern MterpCheckBefore 10062 EXPORT_PC 10063 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10064 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler. 10065 mov r0, rSELF 10066 add r1, rFP, #OFF_FP_SHADOWFRAME 10067 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10068 10069/* ------------------------------ */ 10070 .balign 128 10071.L_ALT_op_add_long: /* 0x9b */ 10072/* File: arm/alt_stub.S */ 10073/* 10074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10075 * any interesting requests and then jump to the real instruction 10076 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10077 */ 10078 .extern MterpCheckBefore 10079 EXPORT_PC 10080 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10081 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler. 10082 mov r0, rSELF 10083 add r1, rFP, #OFF_FP_SHADOWFRAME 10084 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10085 10086/* ------------------------------ */ 10087 .balign 128 10088.L_ALT_op_sub_long: /* 0x9c */ 10089/* File: arm/alt_stub.S */ 10090/* 10091 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10092 * any interesting requests and then jump to the real instruction 10093 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10094 */ 10095 .extern MterpCheckBefore 10096 EXPORT_PC 10097 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10098 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler. 10099 mov r0, rSELF 10100 add r1, rFP, #OFF_FP_SHADOWFRAME 10101 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10102 10103/* ------------------------------ */ 10104 .balign 128 10105.L_ALT_op_mul_long: /* 0x9d */ 10106/* File: arm/alt_stub.S */ 10107/* 10108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10109 * any interesting requests and then jump to the real instruction 10110 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10111 */ 10112 .extern MterpCheckBefore 10113 EXPORT_PC 10114 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10115 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler. 10116 mov r0, rSELF 10117 add r1, rFP, #OFF_FP_SHADOWFRAME 10118 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10119 10120/* ------------------------------ */ 10121 .balign 128 10122.L_ALT_op_div_long: /* 0x9e */ 10123/* File: arm/alt_stub.S */ 10124/* 10125 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10126 * any interesting requests and then jump to the real instruction 10127 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10128 */ 10129 .extern MterpCheckBefore 10130 EXPORT_PC 10131 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10132 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler. 10133 mov r0, rSELF 10134 add r1, rFP, #OFF_FP_SHADOWFRAME 10135 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10136 10137/* ------------------------------ */ 10138 .balign 128 10139.L_ALT_op_rem_long: /* 0x9f */ 10140/* File: arm/alt_stub.S */ 10141/* 10142 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10143 * any interesting requests and then jump to the real instruction 10144 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10145 */ 10146 .extern MterpCheckBefore 10147 EXPORT_PC 10148 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10149 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler. 10150 mov r0, rSELF 10151 add r1, rFP, #OFF_FP_SHADOWFRAME 10152 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10153 10154/* ------------------------------ */ 10155 .balign 128 10156.L_ALT_op_and_long: /* 0xa0 */ 10157/* File: arm/alt_stub.S */ 10158/* 10159 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10160 * any interesting requests and then jump to the real instruction 10161 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10162 */ 10163 .extern MterpCheckBefore 10164 EXPORT_PC 10165 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10166 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler. 10167 mov r0, rSELF 10168 add r1, rFP, #OFF_FP_SHADOWFRAME 10169 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10170 10171/* ------------------------------ */ 10172 .balign 128 10173.L_ALT_op_or_long: /* 0xa1 */ 10174/* File: arm/alt_stub.S */ 10175/* 10176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10177 * any interesting requests and then jump to the real instruction 10178 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10179 */ 10180 .extern MterpCheckBefore 10181 EXPORT_PC 10182 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10183 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler. 10184 mov r0, rSELF 10185 add r1, rFP, #OFF_FP_SHADOWFRAME 10186 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10187 10188/* ------------------------------ */ 10189 .balign 128 10190.L_ALT_op_xor_long: /* 0xa2 */ 10191/* File: arm/alt_stub.S */ 10192/* 10193 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10194 * any interesting requests and then jump to the real instruction 10195 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10196 */ 10197 .extern MterpCheckBefore 10198 EXPORT_PC 10199 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10200 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler. 10201 mov r0, rSELF 10202 add r1, rFP, #OFF_FP_SHADOWFRAME 10203 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10204 10205/* ------------------------------ */ 10206 .balign 128 10207.L_ALT_op_shl_long: /* 0xa3 */ 10208/* File: arm/alt_stub.S */ 10209/* 10210 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10211 * any interesting requests and then jump to the real instruction 10212 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10213 */ 10214 .extern MterpCheckBefore 10215 EXPORT_PC 10216 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10217 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler. 10218 mov r0, rSELF 10219 add r1, rFP, #OFF_FP_SHADOWFRAME 10220 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10221 10222/* ------------------------------ */ 10223 .balign 128 10224.L_ALT_op_shr_long: /* 0xa4 */ 10225/* File: arm/alt_stub.S */ 10226/* 10227 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10228 * any interesting requests and then jump to the real instruction 10229 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10230 */ 10231 .extern MterpCheckBefore 10232 EXPORT_PC 10233 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10234 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler. 10235 mov r0, rSELF 10236 add r1, rFP, #OFF_FP_SHADOWFRAME 10237 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10238 10239/* ------------------------------ */ 10240 .balign 128 10241.L_ALT_op_ushr_long: /* 0xa5 */ 10242/* File: arm/alt_stub.S */ 10243/* 10244 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10245 * any interesting requests and then jump to the real instruction 10246 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10247 */ 10248 .extern MterpCheckBefore 10249 EXPORT_PC 10250 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10251 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler. 10252 mov r0, rSELF 10253 add r1, rFP, #OFF_FP_SHADOWFRAME 10254 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10255 10256/* ------------------------------ */ 10257 .balign 128 10258.L_ALT_op_add_float: /* 0xa6 */ 10259/* File: arm/alt_stub.S */ 10260/* 10261 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10262 * any interesting requests and then jump to the real instruction 10263 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10264 */ 10265 .extern MterpCheckBefore 10266 EXPORT_PC 10267 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10268 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler. 10269 mov r0, rSELF 10270 add r1, rFP, #OFF_FP_SHADOWFRAME 10271 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10272 10273/* ------------------------------ */ 10274 .balign 128 10275.L_ALT_op_sub_float: /* 0xa7 */ 10276/* File: arm/alt_stub.S */ 10277/* 10278 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10279 * any interesting requests and then jump to the real instruction 10280 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10281 */ 10282 .extern MterpCheckBefore 10283 EXPORT_PC 10284 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10285 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler. 10286 mov r0, rSELF 10287 add r1, rFP, #OFF_FP_SHADOWFRAME 10288 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10289 10290/* ------------------------------ */ 10291 .balign 128 10292.L_ALT_op_mul_float: /* 0xa8 */ 10293/* File: arm/alt_stub.S */ 10294/* 10295 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10296 * any interesting requests and then jump to the real instruction 10297 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10298 */ 10299 .extern MterpCheckBefore 10300 EXPORT_PC 10301 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10302 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler. 10303 mov r0, rSELF 10304 add r1, rFP, #OFF_FP_SHADOWFRAME 10305 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10306 10307/* ------------------------------ */ 10308 .balign 128 10309.L_ALT_op_div_float: /* 0xa9 */ 10310/* File: arm/alt_stub.S */ 10311/* 10312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10313 * any interesting requests and then jump to the real instruction 10314 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10315 */ 10316 .extern MterpCheckBefore 10317 EXPORT_PC 10318 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10319 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler. 10320 mov r0, rSELF 10321 add r1, rFP, #OFF_FP_SHADOWFRAME 10322 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10323 10324/* ------------------------------ */ 10325 .balign 128 10326.L_ALT_op_rem_float: /* 0xaa */ 10327/* File: arm/alt_stub.S */ 10328/* 10329 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10330 * any interesting requests and then jump to the real instruction 10331 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10332 */ 10333 .extern MterpCheckBefore 10334 EXPORT_PC 10335 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10336 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler. 10337 mov r0, rSELF 10338 add r1, rFP, #OFF_FP_SHADOWFRAME 10339 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10340 10341/* ------------------------------ */ 10342 .balign 128 10343.L_ALT_op_add_double: /* 0xab */ 10344/* File: arm/alt_stub.S */ 10345/* 10346 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10347 * any interesting requests and then jump to the real instruction 10348 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10349 */ 10350 .extern MterpCheckBefore 10351 EXPORT_PC 10352 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10353 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler. 10354 mov r0, rSELF 10355 add r1, rFP, #OFF_FP_SHADOWFRAME 10356 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10357 10358/* ------------------------------ */ 10359 .balign 128 10360.L_ALT_op_sub_double: /* 0xac */ 10361/* File: arm/alt_stub.S */ 10362/* 10363 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10364 * any interesting requests and then jump to the real instruction 10365 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10366 */ 10367 .extern MterpCheckBefore 10368 EXPORT_PC 10369 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10370 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler. 10371 mov r0, rSELF 10372 add r1, rFP, #OFF_FP_SHADOWFRAME 10373 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10374 10375/* ------------------------------ */ 10376 .balign 128 10377.L_ALT_op_mul_double: /* 0xad */ 10378/* File: arm/alt_stub.S */ 10379/* 10380 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10381 * any interesting requests and then jump to the real instruction 10382 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10383 */ 10384 .extern MterpCheckBefore 10385 EXPORT_PC 10386 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10387 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler. 10388 mov r0, rSELF 10389 add r1, rFP, #OFF_FP_SHADOWFRAME 10390 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10391 10392/* ------------------------------ */ 10393 .balign 128 10394.L_ALT_op_div_double: /* 0xae */ 10395/* File: arm/alt_stub.S */ 10396/* 10397 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10398 * any interesting requests and then jump to the real instruction 10399 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10400 */ 10401 .extern MterpCheckBefore 10402 EXPORT_PC 10403 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10404 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler. 10405 mov r0, rSELF 10406 add r1, rFP, #OFF_FP_SHADOWFRAME 10407 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10408 10409/* ------------------------------ */ 10410 .balign 128 10411.L_ALT_op_rem_double: /* 0xaf */ 10412/* File: arm/alt_stub.S */ 10413/* 10414 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10415 * any interesting requests and then jump to the real instruction 10416 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10417 */ 10418 .extern MterpCheckBefore 10419 EXPORT_PC 10420 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10421 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler. 10422 mov r0, rSELF 10423 add r1, rFP, #OFF_FP_SHADOWFRAME 10424 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10425 10426/* ------------------------------ */ 10427 .balign 128 10428.L_ALT_op_add_int_2addr: /* 0xb0 */ 10429/* File: arm/alt_stub.S */ 10430/* 10431 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10432 * any interesting requests and then jump to the real instruction 10433 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10434 */ 10435 .extern MterpCheckBefore 10436 EXPORT_PC 10437 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10438 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler. 10439 mov r0, rSELF 10440 add r1, rFP, #OFF_FP_SHADOWFRAME 10441 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10442 10443/* ------------------------------ */ 10444 .balign 128 10445.L_ALT_op_sub_int_2addr: /* 0xb1 */ 10446/* File: arm/alt_stub.S */ 10447/* 10448 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10449 * any interesting requests and then jump to the real instruction 10450 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10451 */ 10452 .extern MterpCheckBefore 10453 EXPORT_PC 10454 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10455 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler. 10456 mov r0, rSELF 10457 add r1, rFP, #OFF_FP_SHADOWFRAME 10458 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10459 10460/* ------------------------------ */ 10461 .balign 128 10462.L_ALT_op_mul_int_2addr: /* 0xb2 */ 10463/* File: arm/alt_stub.S */ 10464/* 10465 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10466 * any interesting requests and then jump to the real instruction 10467 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10468 */ 10469 .extern MterpCheckBefore 10470 EXPORT_PC 10471 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10472 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler. 10473 mov r0, rSELF 10474 add r1, rFP, #OFF_FP_SHADOWFRAME 10475 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10476 10477/* ------------------------------ */ 10478 .balign 128 10479.L_ALT_op_div_int_2addr: /* 0xb3 */ 10480/* File: arm/alt_stub.S */ 10481/* 10482 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10483 * any interesting requests and then jump to the real instruction 10484 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10485 */ 10486 .extern MterpCheckBefore 10487 EXPORT_PC 10488 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10489 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler. 10490 mov r0, rSELF 10491 add r1, rFP, #OFF_FP_SHADOWFRAME 10492 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10493 10494/* ------------------------------ */ 10495 .balign 128 10496.L_ALT_op_rem_int_2addr: /* 0xb4 */ 10497/* File: arm/alt_stub.S */ 10498/* 10499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10500 * any interesting requests and then jump to the real instruction 10501 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10502 */ 10503 .extern MterpCheckBefore 10504 EXPORT_PC 10505 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10506 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler. 10507 mov r0, rSELF 10508 add r1, rFP, #OFF_FP_SHADOWFRAME 10509 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10510 10511/* ------------------------------ */ 10512 .balign 128 10513.L_ALT_op_and_int_2addr: /* 0xb5 */ 10514/* File: arm/alt_stub.S */ 10515/* 10516 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10517 * any interesting requests and then jump to the real instruction 10518 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10519 */ 10520 .extern MterpCheckBefore 10521 EXPORT_PC 10522 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10523 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler. 10524 mov r0, rSELF 10525 add r1, rFP, #OFF_FP_SHADOWFRAME 10526 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10527 10528/* ------------------------------ */ 10529 .balign 128 10530.L_ALT_op_or_int_2addr: /* 0xb6 */ 10531/* File: arm/alt_stub.S */ 10532/* 10533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10534 * any interesting requests and then jump to the real instruction 10535 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10536 */ 10537 .extern MterpCheckBefore 10538 EXPORT_PC 10539 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10540 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler. 10541 mov r0, rSELF 10542 add r1, rFP, #OFF_FP_SHADOWFRAME 10543 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10544 10545/* ------------------------------ */ 10546 .balign 128 10547.L_ALT_op_xor_int_2addr: /* 0xb7 */ 10548/* File: arm/alt_stub.S */ 10549/* 10550 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10551 * any interesting requests and then jump to the real instruction 10552 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10553 */ 10554 .extern MterpCheckBefore 10555 EXPORT_PC 10556 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10557 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler. 10558 mov r0, rSELF 10559 add r1, rFP, #OFF_FP_SHADOWFRAME 10560 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10561 10562/* ------------------------------ */ 10563 .balign 128 10564.L_ALT_op_shl_int_2addr: /* 0xb8 */ 10565/* File: arm/alt_stub.S */ 10566/* 10567 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10568 * any interesting requests and then jump to the real instruction 10569 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10570 */ 10571 .extern MterpCheckBefore 10572 EXPORT_PC 10573 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10574 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler. 10575 mov r0, rSELF 10576 add r1, rFP, #OFF_FP_SHADOWFRAME 10577 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10578 10579/* ------------------------------ */ 10580 .balign 128 10581.L_ALT_op_shr_int_2addr: /* 0xb9 */ 10582/* File: arm/alt_stub.S */ 10583/* 10584 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10585 * any interesting requests and then jump to the real instruction 10586 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10587 */ 10588 .extern MterpCheckBefore 10589 EXPORT_PC 10590 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10591 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler. 10592 mov r0, rSELF 10593 add r1, rFP, #OFF_FP_SHADOWFRAME 10594 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10595 10596/* ------------------------------ */ 10597 .balign 128 10598.L_ALT_op_ushr_int_2addr: /* 0xba */ 10599/* File: arm/alt_stub.S */ 10600/* 10601 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10602 * any interesting requests and then jump to the real instruction 10603 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10604 */ 10605 .extern MterpCheckBefore 10606 EXPORT_PC 10607 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10608 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler. 10609 mov r0, rSELF 10610 add r1, rFP, #OFF_FP_SHADOWFRAME 10611 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10612 10613/* ------------------------------ */ 10614 .balign 128 10615.L_ALT_op_add_long_2addr: /* 0xbb */ 10616/* File: arm/alt_stub.S */ 10617/* 10618 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10619 * any interesting requests and then jump to the real instruction 10620 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10621 */ 10622 .extern MterpCheckBefore 10623 EXPORT_PC 10624 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10625 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler. 10626 mov r0, rSELF 10627 add r1, rFP, #OFF_FP_SHADOWFRAME 10628 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10629 10630/* ------------------------------ */ 10631 .balign 128 10632.L_ALT_op_sub_long_2addr: /* 0xbc */ 10633/* File: arm/alt_stub.S */ 10634/* 10635 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10636 * any interesting requests and then jump to the real instruction 10637 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10638 */ 10639 .extern MterpCheckBefore 10640 EXPORT_PC 10641 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10642 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler. 10643 mov r0, rSELF 10644 add r1, rFP, #OFF_FP_SHADOWFRAME 10645 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10646 10647/* ------------------------------ */ 10648 .balign 128 10649.L_ALT_op_mul_long_2addr: /* 0xbd */ 10650/* File: arm/alt_stub.S */ 10651/* 10652 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10653 * any interesting requests and then jump to the real instruction 10654 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10655 */ 10656 .extern MterpCheckBefore 10657 EXPORT_PC 10658 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10659 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler. 10660 mov r0, rSELF 10661 add r1, rFP, #OFF_FP_SHADOWFRAME 10662 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10663 10664/* ------------------------------ */ 10665 .balign 128 10666.L_ALT_op_div_long_2addr: /* 0xbe */ 10667/* File: arm/alt_stub.S */ 10668/* 10669 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10670 * any interesting requests and then jump to the real instruction 10671 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10672 */ 10673 .extern MterpCheckBefore 10674 EXPORT_PC 10675 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10676 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler. 10677 mov r0, rSELF 10678 add r1, rFP, #OFF_FP_SHADOWFRAME 10679 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10680 10681/* ------------------------------ */ 10682 .balign 128 10683.L_ALT_op_rem_long_2addr: /* 0xbf */ 10684/* File: arm/alt_stub.S */ 10685/* 10686 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10687 * any interesting requests and then jump to the real instruction 10688 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10689 */ 10690 .extern MterpCheckBefore 10691 EXPORT_PC 10692 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10693 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler. 10694 mov r0, rSELF 10695 add r1, rFP, #OFF_FP_SHADOWFRAME 10696 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10697 10698/* ------------------------------ */ 10699 .balign 128 10700.L_ALT_op_and_long_2addr: /* 0xc0 */ 10701/* File: arm/alt_stub.S */ 10702/* 10703 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10704 * any interesting requests and then jump to the real instruction 10705 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10706 */ 10707 .extern MterpCheckBefore 10708 EXPORT_PC 10709 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10710 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler. 10711 mov r0, rSELF 10712 add r1, rFP, #OFF_FP_SHADOWFRAME 10713 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10714 10715/* ------------------------------ */ 10716 .balign 128 10717.L_ALT_op_or_long_2addr: /* 0xc1 */ 10718/* File: arm/alt_stub.S */ 10719/* 10720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10721 * any interesting requests and then jump to the real instruction 10722 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10723 */ 10724 .extern MterpCheckBefore 10725 EXPORT_PC 10726 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10727 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler. 10728 mov r0, rSELF 10729 add r1, rFP, #OFF_FP_SHADOWFRAME 10730 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10731 10732/* ------------------------------ */ 10733 .balign 128 10734.L_ALT_op_xor_long_2addr: /* 0xc2 */ 10735/* File: arm/alt_stub.S */ 10736/* 10737 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10738 * any interesting requests and then jump to the real instruction 10739 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10740 */ 10741 .extern MterpCheckBefore 10742 EXPORT_PC 10743 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10744 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler. 10745 mov r0, rSELF 10746 add r1, rFP, #OFF_FP_SHADOWFRAME 10747 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10748 10749/* ------------------------------ */ 10750 .balign 128 10751.L_ALT_op_shl_long_2addr: /* 0xc3 */ 10752/* File: arm/alt_stub.S */ 10753/* 10754 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10755 * any interesting requests and then jump to the real instruction 10756 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10757 */ 10758 .extern MterpCheckBefore 10759 EXPORT_PC 10760 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10761 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler. 10762 mov r0, rSELF 10763 add r1, rFP, #OFF_FP_SHADOWFRAME 10764 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10765 10766/* ------------------------------ */ 10767 .balign 128 10768.L_ALT_op_shr_long_2addr: /* 0xc4 */ 10769/* File: arm/alt_stub.S */ 10770/* 10771 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10772 * any interesting requests and then jump to the real instruction 10773 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10774 */ 10775 .extern MterpCheckBefore 10776 EXPORT_PC 10777 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10778 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler. 10779 mov r0, rSELF 10780 add r1, rFP, #OFF_FP_SHADOWFRAME 10781 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10782 10783/* ------------------------------ */ 10784 .balign 128 10785.L_ALT_op_ushr_long_2addr: /* 0xc5 */ 10786/* File: arm/alt_stub.S */ 10787/* 10788 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10789 * any interesting requests and then jump to the real instruction 10790 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10791 */ 10792 .extern MterpCheckBefore 10793 EXPORT_PC 10794 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10795 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler. 10796 mov r0, rSELF 10797 add r1, rFP, #OFF_FP_SHADOWFRAME 10798 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10799 10800/* ------------------------------ */ 10801 .balign 128 10802.L_ALT_op_add_float_2addr: /* 0xc6 */ 10803/* File: arm/alt_stub.S */ 10804/* 10805 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10806 * any interesting requests and then jump to the real instruction 10807 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10808 */ 10809 .extern MterpCheckBefore 10810 EXPORT_PC 10811 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10812 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler. 10813 mov r0, rSELF 10814 add r1, rFP, #OFF_FP_SHADOWFRAME 10815 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10816 10817/* ------------------------------ */ 10818 .balign 128 10819.L_ALT_op_sub_float_2addr: /* 0xc7 */ 10820/* File: arm/alt_stub.S */ 10821/* 10822 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10823 * any interesting requests and then jump to the real instruction 10824 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10825 */ 10826 .extern MterpCheckBefore 10827 EXPORT_PC 10828 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10829 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler. 10830 mov r0, rSELF 10831 add r1, rFP, #OFF_FP_SHADOWFRAME 10832 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10833 10834/* ------------------------------ */ 10835 .balign 128 10836.L_ALT_op_mul_float_2addr: /* 0xc8 */ 10837/* File: arm/alt_stub.S */ 10838/* 10839 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10840 * any interesting requests and then jump to the real instruction 10841 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10842 */ 10843 .extern MterpCheckBefore 10844 EXPORT_PC 10845 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10846 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler. 10847 mov r0, rSELF 10848 add r1, rFP, #OFF_FP_SHADOWFRAME 10849 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10850 10851/* ------------------------------ */ 10852 .balign 128 10853.L_ALT_op_div_float_2addr: /* 0xc9 */ 10854/* File: arm/alt_stub.S */ 10855/* 10856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10857 * any interesting requests and then jump to the real instruction 10858 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10859 */ 10860 .extern MterpCheckBefore 10861 EXPORT_PC 10862 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10863 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler. 10864 mov r0, rSELF 10865 add r1, rFP, #OFF_FP_SHADOWFRAME 10866 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10867 10868/* ------------------------------ */ 10869 .balign 128 10870.L_ALT_op_rem_float_2addr: /* 0xca */ 10871/* File: arm/alt_stub.S */ 10872/* 10873 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10874 * any interesting requests and then jump to the real instruction 10875 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10876 */ 10877 .extern MterpCheckBefore 10878 EXPORT_PC 10879 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10880 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler. 10881 mov r0, rSELF 10882 add r1, rFP, #OFF_FP_SHADOWFRAME 10883 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10884 10885/* ------------------------------ */ 10886 .balign 128 10887.L_ALT_op_add_double_2addr: /* 0xcb */ 10888/* File: arm/alt_stub.S */ 10889/* 10890 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10891 * any interesting requests and then jump to the real instruction 10892 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10893 */ 10894 .extern MterpCheckBefore 10895 EXPORT_PC 10896 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10897 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler. 10898 mov r0, rSELF 10899 add r1, rFP, #OFF_FP_SHADOWFRAME 10900 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10901 10902/* ------------------------------ */ 10903 .balign 128 10904.L_ALT_op_sub_double_2addr: /* 0xcc */ 10905/* File: arm/alt_stub.S */ 10906/* 10907 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10908 * any interesting requests and then jump to the real instruction 10909 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10910 */ 10911 .extern MterpCheckBefore 10912 EXPORT_PC 10913 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10914 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler. 10915 mov r0, rSELF 10916 add r1, rFP, #OFF_FP_SHADOWFRAME 10917 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10918 10919/* ------------------------------ */ 10920 .balign 128 10921.L_ALT_op_mul_double_2addr: /* 0xcd */ 10922/* File: arm/alt_stub.S */ 10923/* 10924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10925 * any interesting requests and then jump to the real instruction 10926 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10927 */ 10928 .extern MterpCheckBefore 10929 EXPORT_PC 10930 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10931 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler. 10932 mov r0, rSELF 10933 add r1, rFP, #OFF_FP_SHADOWFRAME 10934 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10935 10936/* ------------------------------ */ 10937 .balign 128 10938.L_ALT_op_div_double_2addr: /* 0xce */ 10939/* File: arm/alt_stub.S */ 10940/* 10941 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10942 * any interesting requests and then jump to the real instruction 10943 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10944 */ 10945 .extern MterpCheckBefore 10946 EXPORT_PC 10947 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10948 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler. 10949 mov r0, rSELF 10950 add r1, rFP, #OFF_FP_SHADOWFRAME 10951 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10952 10953/* ------------------------------ */ 10954 .balign 128 10955.L_ALT_op_rem_double_2addr: /* 0xcf */ 10956/* File: arm/alt_stub.S */ 10957/* 10958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10959 * any interesting requests and then jump to the real instruction 10960 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10961 */ 10962 .extern MterpCheckBefore 10963 EXPORT_PC 10964 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10965 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler. 10966 mov r0, rSELF 10967 add r1, rFP, #OFF_FP_SHADOWFRAME 10968 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10969 10970/* ------------------------------ */ 10971 .balign 128 10972.L_ALT_op_add_int_lit16: /* 0xd0 */ 10973/* File: arm/alt_stub.S */ 10974/* 10975 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10976 * any interesting requests and then jump to the real instruction 10977 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10978 */ 10979 .extern MterpCheckBefore 10980 EXPORT_PC 10981 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10982 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler. 10983 mov r0, rSELF 10984 add r1, rFP, #OFF_FP_SHADOWFRAME 10985 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 10986 10987/* ------------------------------ */ 10988 .balign 128 10989.L_ALT_op_rsub_int: /* 0xd1 */ 10990/* File: arm/alt_stub.S */ 10991/* 10992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10993 * any interesting requests and then jump to the real instruction 10994 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10995 */ 10996 .extern MterpCheckBefore 10997 EXPORT_PC 10998 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 10999 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler. 11000 mov r0, rSELF 11001 add r1, rFP, #OFF_FP_SHADOWFRAME 11002 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11003 11004/* ------------------------------ */ 11005 .balign 128 11006.L_ALT_op_mul_int_lit16: /* 0xd2 */ 11007/* File: arm/alt_stub.S */ 11008/* 11009 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11010 * any interesting requests and then jump to the real instruction 11011 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11012 */ 11013 .extern MterpCheckBefore 11014 EXPORT_PC 11015 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11016 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler. 11017 mov r0, rSELF 11018 add r1, rFP, #OFF_FP_SHADOWFRAME 11019 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11020 11021/* ------------------------------ */ 11022 .balign 128 11023.L_ALT_op_div_int_lit16: /* 0xd3 */ 11024/* File: arm/alt_stub.S */ 11025/* 11026 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11027 * any interesting requests and then jump to the real instruction 11028 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11029 */ 11030 .extern MterpCheckBefore 11031 EXPORT_PC 11032 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11033 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler. 11034 mov r0, rSELF 11035 add r1, rFP, #OFF_FP_SHADOWFRAME 11036 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11037 11038/* ------------------------------ */ 11039 .balign 128 11040.L_ALT_op_rem_int_lit16: /* 0xd4 */ 11041/* File: arm/alt_stub.S */ 11042/* 11043 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11044 * any interesting requests and then jump to the real instruction 11045 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11046 */ 11047 .extern MterpCheckBefore 11048 EXPORT_PC 11049 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11050 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler. 11051 mov r0, rSELF 11052 add r1, rFP, #OFF_FP_SHADOWFRAME 11053 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11054 11055/* ------------------------------ */ 11056 .balign 128 11057.L_ALT_op_and_int_lit16: /* 0xd5 */ 11058/* File: arm/alt_stub.S */ 11059/* 11060 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11061 * any interesting requests and then jump to the real instruction 11062 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11063 */ 11064 .extern MterpCheckBefore 11065 EXPORT_PC 11066 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11067 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler. 11068 mov r0, rSELF 11069 add r1, rFP, #OFF_FP_SHADOWFRAME 11070 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11071 11072/* ------------------------------ */ 11073 .balign 128 11074.L_ALT_op_or_int_lit16: /* 0xd6 */ 11075/* File: arm/alt_stub.S */ 11076/* 11077 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11078 * any interesting requests and then jump to the real instruction 11079 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11080 */ 11081 .extern MterpCheckBefore 11082 EXPORT_PC 11083 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11084 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler. 11085 mov r0, rSELF 11086 add r1, rFP, #OFF_FP_SHADOWFRAME 11087 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11088 11089/* ------------------------------ */ 11090 .balign 128 11091.L_ALT_op_xor_int_lit16: /* 0xd7 */ 11092/* File: arm/alt_stub.S */ 11093/* 11094 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11095 * any interesting requests and then jump to the real instruction 11096 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11097 */ 11098 .extern MterpCheckBefore 11099 EXPORT_PC 11100 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11101 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler. 11102 mov r0, rSELF 11103 add r1, rFP, #OFF_FP_SHADOWFRAME 11104 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11105 11106/* ------------------------------ */ 11107 .balign 128 11108.L_ALT_op_add_int_lit8: /* 0xd8 */ 11109/* File: arm/alt_stub.S */ 11110/* 11111 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11112 * any interesting requests and then jump to the real instruction 11113 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11114 */ 11115 .extern MterpCheckBefore 11116 EXPORT_PC 11117 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11118 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler. 11119 mov r0, rSELF 11120 add r1, rFP, #OFF_FP_SHADOWFRAME 11121 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11122 11123/* ------------------------------ */ 11124 .balign 128 11125.L_ALT_op_rsub_int_lit8: /* 0xd9 */ 11126/* File: arm/alt_stub.S */ 11127/* 11128 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11129 * any interesting requests and then jump to the real instruction 11130 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11131 */ 11132 .extern MterpCheckBefore 11133 EXPORT_PC 11134 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11135 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler. 11136 mov r0, rSELF 11137 add r1, rFP, #OFF_FP_SHADOWFRAME 11138 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11139 11140/* ------------------------------ */ 11141 .balign 128 11142.L_ALT_op_mul_int_lit8: /* 0xda */ 11143/* File: arm/alt_stub.S */ 11144/* 11145 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11146 * any interesting requests and then jump to the real instruction 11147 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11148 */ 11149 .extern MterpCheckBefore 11150 EXPORT_PC 11151 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11152 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler. 11153 mov r0, rSELF 11154 add r1, rFP, #OFF_FP_SHADOWFRAME 11155 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11156 11157/* ------------------------------ */ 11158 .balign 128 11159.L_ALT_op_div_int_lit8: /* 0xdb */ 11160/* File: arm/alt_stub.S */ 11161/* 11162 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11163 * any interesting requests and then jump to the real instruction 11164 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11165 */ 11166 .extern MterpCheckBefore 11167 EXPORT_PC 11168 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11169 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler. 11170 mov r0, rSELF 11171 add r1, rFP, #OFF_FP_SHADOWFRAME 11172 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11173 11174/* ------------------------------ */ 11175 .balign 128 11176.L_ALT_op_rem_int_lit8: /* 0xdc */ 11177/* File: arm/alt_stub.S */ 11178/* 11179 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11180 * any interesting requests and then jump to the real instruction 11181 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11182 */ 11183 .extern MterpCheckBefore 11184 EXPORT_PC 11185 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11186 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler. 11187 mov r0, rSELF 11188 add r1, rFP, #OFF_FP_SHADOWFRAME 11189 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11190 11191/* ------------------------------ */ 11192 .balign 128 11193.L_ALT_op_and_int_lit8: /* 0xdd */ 11194/* File: arm/alt_stub.S */ 11195/* 11196 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11197 * any interesting requests and then jump to the real instruction 11198 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11199 */ 11200 .extern MterpCheckBefore 11201 EXPORT_PC 11202 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11203 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler. 11204 mov r0, rSELF 11205 add r1, rFP, #OFF_FP_SHADOWFRAME 11206 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11207 11208/* ------------------------------ */ 11209 .balign 128 11210.L_ALT_op_or_int_lit8: /* 0xde */ 11211/* File: arm/alt_stub.S */ 11212/* 11213 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11214 * any interesting requests and then jump to the real instruction 11215 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11216 */ 11217 .extern MterpCheckBefore 11218 EXPORT_PC 11219 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11220 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler. 11221 mov r0, rSELF 11222 add r1, rFP, #OFF_FP_SHADOWFRAME 11223 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11224 11225/* ------------------------------ */ 11226 .balign 128 11227.L_ALT_op_xor_int_lit8: /* 0xdf */ 11228/* File: arm/alt_stub.S */ 11229/* 11230 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11231 * any interesting requests and then jump to the real instruction 11232 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11233 */ 11234 .extern MterpCheckBefore 11235 EXPORT_PC 11236 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11237 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler. 11238 mov r0, rSELF 11239 add r1, rFP, #OFF_FP_SHADOWFRAME 11240 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11241 11242/* ------------------------------ */ 11243 .balign 128 11244.L_ALT_op_shl_int_lit8: /* 0xe0 */ 11245/* File: arm/alt_stub.S */ 11246/* 11247 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11248 * any interesting requests and then jump to the real instruction 11249 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11250 */ 11251 .extern MterpCheckBefore 11252 EXPORT_PC 11253 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11254 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler. 11255 mov r0, rSELF 11256 add r1, rFP, #OFF_FP_SHADOWFRAME 11257 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11258 11259/* ------------------------------ */ 11260 .balign 128 11261.L_ALT_op_shr_int_lit8: /* 0xe1 */ 11262/* File: arm/alt_stub.S */ 11263/* 11264 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11265 * any interesting requests and then jump to the real instruction 11266 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11267 */ 11268 .extern MterpCheckBefore 11269 EXPORT_PC 11270 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11271 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler. 11272 mov r0, rSELF 11273 add r1, rFP, #OFF_FP_SHADOWFRAME 11274 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11275 11276/* ------------------------------ */ 11277 .balign 128 11278.L_ALT_op_ushr_int_lit8: /* 0xe2 */ 11279/* File: arm/alt_stub.S */ 11280/* 11281 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11282 * any interesting requests and then jump to the real instruction 11283 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11284 */ 11285 .extern MterpCheckBefore 11286 EXPORT_PC 11287 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11288 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler. 11289 mov r0, rSELF 11290 add r1, rFP, #OFF_FP_SHADOWFRAME 11291 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11292 11293/* ------------------------------ */ 11294 .balign 128 11295.L_ALT_op_iget_quick: /* 0xe3 */ 11296/* File: arm/alt_stub.S */ 11297/* 11298 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11299 * any interesting requests and then jump to the real instruction 11300 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11301 */ 11302 .extern MterpCheckBefore 11303 EXPORT_PC 11304 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11305 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler. 11306 mov r0, rSELF 11307 add r1, rFP, #OFF_FP_SHADOWFRAME 11308 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11309 11310/* ------------------------------ */ 11311 .balign 128 11312.L_ALT_op_iget_wide_quick: /* 0xe4 */ 11313/* File: arm/alt_stub.S */ 11314/* 11315 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11316 * any interesting requests and then jump to the real instruction 11317 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11318 */ 11319 .extern MterpCheckBefore 11320 EXPORT_PC 11321 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11322 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler. 11323 mov r0, rSELF 11324 add r1, rFP, #OFF_FP_SHADOWFRAME 11325 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11326 11327/* ------------------------------ */ 11328 .balign 128 11329.L_ALT_op_iget_object_quick: /* 0xe5 */ 11330/* File: arm/alt_stub.S */ 11331/* 11332 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11333 * any interesting requests and then jump to the real instruction 11334 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11335 */ 11336 .extern MterpCheckBefore 11337 EXPORT_PC 11338 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11339 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler. 11340 mov r0, rSELF 11341 add r1, rFP, #OFF_FP_SHADOWFRAME 11342 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11343 11344/* ------------------------------ */ 11345 .balign 128 11346.L_ALT_op_iput_quick: /* 0xe6 */ 11347/* File: arm/alt_stub.S */ 11348/* 11349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11350 * any interesting requests and then jump to the real instruction 11351 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11352 */ 11353 .extern MterpCheckBefore 11354 EXPORT_PC 11355 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11356 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler. 11357 mov r0, rSELF 11358 add r1, rFP, #OFF_FP_SHADOWFRAME 11359 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11360 11361/* ------------------------------ */ 11362 .balign 128 11363.L_ALT_op_iput_wide_quick: /* 0xe7 */ 11364/* File: arm/alt_stub.S */ 11365/* 11366 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11367 * any interesting requests and then jump to the real instruction 11368 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11369 */ 11370 .extern MterpCheckBefore 11371 EXPORT_PC 11372 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11373 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler. 11374 mov r0, rSELF 11375 add r1, rFP, #OFF_FP_SHADOWFRAME 11376 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11377 11378/* ------------------------------ */ 11379 .balign 128 11380.L_ALT_op_iput_object_quick: /* 0xe8 */ 11381/* File: arm/alt_stub.S */ 11382/* 11383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11384 * any interesting requests and then jump to the real instruction 11385 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11386 */ 11387 .extern MterpCheckBefore 11388 EXPORT_PC 11389 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11390 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler. 11391 mov r0, rSELF 11392 add r1, rFP, #OFF_FP_SHADOWFRAME 11393 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11394 11395/* ------------------------------ */ 11396 .balign 128 11397.L_ALT_op_invoke_virtual_quick: /* 0xe9 */ 11398/* File: arm/alt_stub.S */ 11399/* 11400 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11401 * any interesting requests and then jump to the real instruction 11402 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11403 */ 11404 .extern MterpCheckBefore 11405 EXPORT_PC 11406 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11407 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler. 11408 mov r0, rSELF 11409 add r1, rFP, #OFF_FP_SHADOWFRAME 11410 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11411 11412/* ------------------------------ */ 11413 .balign 128 11414.L_ALT_op_invoke_virtual_range_quick: /* 0xea */ 11415/* File: arm/alt_stub.S */ 11416/* 11417 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11418 * any interesting requests and then jump to the real instruction 11419 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11420 */ 11421 .extern MterpCheckBefore 11422 EXPORT_PC 11423 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11424 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler. 11425 mov r0, rSELF 11426 add r1, rFP, #OFF_FP_SHADOWFRAME 11427 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11428 11429/* ------------------------------ */ 11430 .balign 128 11431.L_ALT_op_iput_boolean_quick: /* 0xeb */ 11432/* File: arm/alt_stub.S */ 11433/* 11434 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11435 * any interesting requests and then jump to the real instruction 11436 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11437 */ 11438 .extern MterpCheckBefore 11439 EXPORT_PC 11440 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11441 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler. 11442 mov r0, rSELF 11443 add r1, rFP, #OFF_FP_SHADOWFRAME 11444 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11445 11446/* ------------------------------ */ 11447 .balign 128 11448.L_ALT_op_iput_byte_quick: /* 0xec */ 11449/* File: arm/alt_stub.S */ 11450/* 11451 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11452 * any interesting requests and then jump to the real instruction 11453 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11454 */ 11455 .extern MterpCheckBefore 11456 EXPORT_PC 11457 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11458 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler. 11459 mov r0, rSELF 11460 add r1, rFP, #OFF_FP_SHADOWFRAME 11461 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11462 11463/* ------------------------------ */ 11464 .balign 128 11465.L_ALT_op_iput_char_quick: /* 0xed */ 11466/* File: arm/alt_stub.S */ 11467/* 11468 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11469 * any interesting requests and then jump to the real instruction 11470 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11471 */ 11472 .extern MterpCheckBefore 11473 EXPORT_PC 11474 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11475 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler. 11476 mov r0, rSELF 11477 add r1, rFP, #OFF_FP_SHADOWFRAME 11478 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11479 11480/* ------------------------------ */ 11481 .balign 128 11482.L_ALT_op_iput_short_quick: /* 0xee */ 11483/* File: arm/alt_stub.S */ 11484/* 11485 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11486 * any interesting requests and then jump to the real instruction 11487 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11488 */ 11489 .extern MterpCheckBefore 11490 EXPORT_PC 11491 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11492 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler. 11493 mov r0, rSELF 11494 add r1, rFP, #OFF_FP_SHADOWFRAME 11495 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11496 11497/* ------------------------------ */ 11498 .balign 128 11499.L_ALT_op_iget_boolean_quick: /* 0xef */ 11500/* File: arm/alt_stub.S */ 11501/* 11502 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11503 * any interesting requests and then jump to the real instruction 11504 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11505 */ 11506 .extern MterpCheckBefore 11507 EXPORT_PC 11508 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11509 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler. 11510 mov r0, rSELF 11511 add r1, rFP, #OFF_FP_SHADOWFRAME 11512 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11513 11514/* ------------------------------ */ 11515 .balign 128 11516.L_ALT_op_iget_byte_quick: /* 0xf0 */ 11517/* File: arm/alt_stub.S */ 11518/* 11519 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11520 * any interesting requests and then jump to the real instruction 11521 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11522 */ 11523 .extern MterpCheckBefore 11524 EXPORT_PC 11525 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11526 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler. 11527 mov r0, rSELF 11528 add r1, rFP, #OFF_FP_SHADOWFRAME 11529 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11530 11531/* ------------------------------ */ 11532 .balign 128 11533.L_ALT_op_iget_char_quick: /* 0xf1 */ 11534/* File: arm/alt_stub.S */ 11535/* 11536 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11537 * any interesting requests and then jump to the real instruction 11538 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11539 */ 11540 .extern MterpCheckBefore 11541 EXPORT_PC 11542 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11543 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler. 11544 mov r0, rSELF 11545 add r1, rFP, #OFF_FP_SHADOWFRAME 11546 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11547 11548/* ------------------------------ */ 11549 .balign 128 11550.L_ALT_op_iget_short_quick: /* 0xf2 */ 11551/* File: arm/alt_stub.S */ 11552/* 11553 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11554 * any interesting requests and then jump to the real instruction 11555 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11556 */ 11557 .extern MterpCheckBefore 11558 EXPORT_PC 11559 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11560 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler. 11561 mov r0, rSELF 11562 add r1, rFP, #OFF_FP_SHADOWFRAME 11563 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11564 11565/* ------------------------------ */ 11566 .balign 128 11567.L_ALT_op_invoke_lambda: /* 0xf3 */ 11568/* File: arm/alt_stub.S */ 11569/* 11570 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11571 * any interesting requests and then jump to the real instruction 11572 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11573 */ 11574 .extern MterpCheckBefore 11575 EXPORT_PC 11576 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11577 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler. 11578 mov r0, rSELF 11579 add r1, rFP, #OFF_FP_SHADOWFRAME 11580 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11581 11582/* ------------------------------ */ 11583 .balign 128 11584.L_ALT_op_unused_f4: /* 0xf4 */ 11585/* File: arm/alt_stub.S */ 11586/* 11587 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11588 * any interesting requests and then jump to the real instruction 11589 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11590 */ 11591 .extern MterpCheckBefore 11592 EXPORT_PC 11593 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11594 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler. 11595 mov r0, rSELF 11596 add r1, rFP, #OFF_FP_SHADOWFRAME 11597 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11598 11599/* ------------------------------ */ 11600 .balign 128 11601.L_ALT_op_capture_variable: /* 0xf5 */ 11602/* File: arm/alt_stub.S */ 11603/* 11604 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11605 * any interesting requests and then jump to the real instruction 11606 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11607 */ 11608 .extern MterpCheckBefore 11609 EXPORT_PC 11610 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11611 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler. 11612 mov r0, rSELF 11613 add r1, rFP, #OFF_FP_SHADOWFRAME 11614 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11615 11616/* ------------------------------ */ 11617 .balign 128 11618.L_ALT_op_create_lambda: /* 0xf6 */ 11619/* File: arm/alt_stub.S */ 11620/* 11621 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11622 * any interesting requests and then jump to the real instruction 11623 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11624 */ 11625 .extern MterpCheckBefore 11626 EXPORT_PC 11627 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11628 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler. 11629 mov r0, rSELF 11630 add r1, rFP, #OFF_FP_SHADOWFRAME 11631 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11632 11633/* ------------------------------ */ 11634 .balign 128 11635.L_ALT_op_liberate_variable: /* 0xf7 */ 11636/* File: arm/alt_stub.S */ 11637/* 11638 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11639 * any interesting requests and then jump to the real instruction 11640 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11641 */ 11642 .extern MterpCheckBefore 11643 EXPORT_PC 11644 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11645 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler. 11646 mov r0, rSELF 11647 add r1, rFP, #OFF_FP_SHADOWFRAME 11648 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11649 11650/* ------------------------------ */ 11651 .balign 128 11652.L_ALT_op_box_lambda: /* 0xf8 */ 11653/* File: arm/alt_stub.S */ 11654/* 11655 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11656 * any interesting requests and then jump to the real instruction 11657 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11658 */ 11659 .extern MterpCheckBefore 11660 EXPORT_PC 11661 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11662 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler. 11663 mov r0, rSELF 11664 add r1, rFP, #OFF_FP_SHADOWFRAME 11665 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11666 11667/* ------------------------------ */ 11668 .balign 128 11669.L_ALT_op_unbox_lambda: /* 0xf9 */ 11670/* File: arm/alt_stub.S */ 11671/* 11672 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11673 * any interesting requests and then jump to the real instruction 11674 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11675 */ 11676 .extern MterpCheckBefore 11677 EXPORT_PC 11678 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11679 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler. 11680 mov r0, rSELF 11681 add r1, rFP, #OFF_FP_SHADOWFRAME 11682 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11683 11684/* ------------------------------ */ 11685 .balign 128 11686.L_ALT_op_unused_fa: /* 0xfa */ 11687/* File: arm/alt_stub.S */ 11688/* 11689 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11690 * any interesting requests and then jump to the real instruction 11691 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11692 */ 11693 .extern MterpCheckBefore 11694 EXPORT_PC 11695 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11696 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler. 11697 mov r0, rSELF 11698 add r1, rFP, #OFF_FP_SHADOWFRAME 11699 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11700 11701/* ------------------------------ */ 11702 .balign 128 11703.L_ALT_op_unused_fb: /* 0xfb */ 11704/* File: arm/alt_stub.S */ 11705/* 11706 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11707 * any interesting requests and then jump to the real instruction 11708 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11709 */ 11710 .extern MterpCheckBefore 11711 EXPORT_PC 11712 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11713 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler. 11714 mov r0, rSELF 11715 add r1, rFP, #OFF_FP_SHADOWFRAME 11716 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11717 11718/* ------------------------------ */ 11719 .balign 128 11720.L_ALT_op_unused_fc: /* 0xfc */ 11721/* File: arm/alt_stub.S */ 11722/* 11723 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11724 * any interesting requests and then jump to the real instruction 11725 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11726 */ 11727 .extern MterpCheckBefore 11728 EXPORT_PC 11729 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11730 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler. 11731 mov r0, rSELF 11732 add r1, rFP, #OFF_FP_SHADOWFRAME 11733 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11734 11735/* ------------------------------ */ 11736 .balign 128 11737.L_ALT_op_unused_fd: /* 0xfd */ 11738/* File: arm/alt_stub.S */ 11739/* 11740 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11741 * any interesting requests and then jump to the real instruction 11742 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11743 */ 11744 .extern MterpCheckBefore 11745 EXPORT_PC 11746 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11747 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler. 11748 mov r0, rSELF 11749 add r1, rFP, #OFF_FP_SHADOWFRAME 11750 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11751 11752/* ------------------------------ */ 11753 .balign 128 11754.L_ALT_op_unused_fe: /* 0xfe */ 11755/* File: arm/alt_stub.S */ 11756/* 11757 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11758 * any interesting requests and then jump to the real instruction 11759 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11760 */ 11761 .extern MterpCheckBefore 11762 EXPORT_PC 11763 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11764 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler. 11765 mov r0, rSELF 11766 add r1, rFP, #OFF_FP_SHADOWFRAME 11767 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11768 11769/* ------------------------------ */ 11770 .balign 128 11771.L_ALT_op_unused_ff: /* 0xff */ 11772/* File: arm/alt_stub.S */ 11773/* 11774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11775 * any interesting requests and then jump to the real instruction 11776 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11777 */ 11778 .extern MterpCheckBefore 11779 EXPORT_PC 11780 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE. 11781 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler. 11782 mov r0, rSELF 11783 add r1, rFP, #OFF_FP_SHADOWFRAME 11784 b MterpCheckBefore @ (self, shadow_frame) @ Tail call. 11785 11786 .balign 128 11787 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart 11788 .global artMterpAsmAltInstructionEnd 11789artMterpAsmAltInstructionEnd: 11790/* File: arm/footer.S */ 11791/* 11792 * =========================================================================== 11793 * Common subroutines and data 11794 * =========================================================================== 11795 */ 11796 11797 .text 11798 .align 2 11799 11800/* 11801 * We've detected a condition that will result in an exception, but the exception 11802 * has not yet been thrown. Just bail out to the reference interpreter to deal with it. 11803 * TUNING: for consistency, we may want to just go ahead and handle these here. 11804 */ 11805common_errDivideByZero: 11806 EXPORT_PC 11807#if MTERP_LOGGING 11808 mov r0, rSELF 11809 add r1, rFP, #OFF_FP_SHADOWFRAME 11810 bl MterpLogDivideByZeroException 11811#endif 11812 b MterpCommonFallback 11813 11814common_errArrayIndex: 11815 EXPORT_PC 11816#if MTERP_LOGGING 11817 mov r0, rSELF 11818 add r1, rFP, #OFF_FP_SHADOWFRAME 11819 bl MterpLogArrayIndexException 11820#endif 11821 b MterpCommonFallback 11822 11823common_errNegativeArraySize: 11824 EXPORT_PC 11825#if MTERP_LOGGING 11826 mov r0, rSELF 11827 add r1, rFP, #OFF_FP_SHADOWFRAME 11828 bl MterpLogNegativeArraySizeException 11829#endif 11830 b MterpCommonFallback 11831 11832common_errNoSuchMethod: 11833 EXPORT_PC 11834#if MTERP_LOGGING 11835 mov r0, rSELF 11836 add r1, rFP, #OFF_FP_SHADOWFRAME 11837 bl MterpLogNoSuchMethodException 11838#endif 11839 b MterpCommonFallback 11840 11841common_errNullObject: 11842 EXPORT_PC 11843#if MTERP_LOGGING 11844 mov r0, rSELF 11845 add r1, rFP, #OFF_FP_SHADOWFRAME 11846 bl MterpLogNullObjectException 11847#endif 11848 b MterpCommonFallback 11849 11850common_exceptionThrown: 11851 EXPORT_PC 11852#if MTERP_LOGGING 11853 mov r0, rSELF 11854 add r1, rFP, #OFF_FP_SHADOWFRAME 11855 bl MterpLogExceptionThrownException 11856#endif 11857 b MterpCommonFallback 11858 11859MterpSuspendFallback: 11860 EXPORT_PC 11861#if MTERP_LOGGING 11862 mov r0, rSELF 11863 add r1, rFP, #OFF_FP_SHADOWFRAME 11864 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET] 11865 bl MterpLogSuspendFallback 11866#endif 11867 b MterpCommonFallback 11868 11869/* 11870 * If we're here, something is out of the ordinary. If there is a pending 11871 * exception, handle it. Otherwise, roll back and retry with the reference 11872 * interpreter. 11873 */ 11874MterpPossibleException: 11875 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET] 11876 cmp r0, #0 @ Exception pending? 11877 beq MterpFallback @ If not, fall back to reference interpreter. 11878 /* intentional fallthrough - handle pending exception. */ 11879/* 11880 * On return from a runtime helper routine, we've found a pending exception. 11881 * Can we handle it here - or need to bail out to caller? 11882 * 11883 */ 11884MterpException: 11885 mov r0, rSELF 11886 add r1, rFP, #OFF_FP_SHADOWFRAME 11887 bl MterpHandleException @ (self, shadow_frame) 11888 cmp r0, #0 11889 beq MterpExceptionReturn @ no local catch, back to caller. 11890 ldr r0, [rFP, #OFF_FP_CODE_ITEM] 11891 ldr r1, [rFP, #OFF_FP_DEX_PC] 11892 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] 11893 add rPC, r0, #CODEITEM_INSNS_OFFSET 11894 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr 11895 /* Do we need to switch interpreters? */ 11896 bl MterpShouldSwitchInterpreters 11897 cmp r0, #0 11898 bne MterpFallback 11899 /* resume execution at catch block */ 11900 EXPORT_PC 11901 FETCH_INST 11902 GET_INST_OPCODE ip 11903 GOTO_OPCODE ip 11904 /* NOTE: no fallthrough */ 11905 11906/* 11907 * Common handling for branches with support for Jit profiling. 11908 * On entry: 11909 * rINST <= signed offset 11910 * rPROFILE <= signed hotness countdown (expanded to 32 bits) 11911 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not) 11912 * 11913 * We have quite a few different cases for branch profiling, OSR detection and 11914 * suspend check support here. 11915 * 11916 * Taken backward branches: 11917 * If profiling active, do hotness countdown and report if we hit zero. 11918 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so. 11919 * Is there a pending suspend request? If so, suspend. 11920 * 11921 * Taken forward branches and not-taken backward branches: 11922 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so. 11923 * 11924 * Our most common case is expected to be a taken backward branch with active jit profiling, 11925 * but no full OSR check and no pending suspend request. 11926 * Next most common case is not-taken branch with no full OSR check. 11927 * 11928 */ 11929MterpCommonTakenBranchNoFlags: 11930 cmp rINST, #0 11931MterpCommonTakenBranch: 11932 bgt .L_forward_branch @ don't add forward branches to hotness 11933/* 11934 * We need to subtract 1 from positive values and we should not see 0 here, 11935 * so we may use the result of the comparison with -1. 11936 */ 11937#if JIT_CHECK_OSR != -1 11938# error "JIT_CHECK_OSR must be -1." 11939#endif 11940 cmp rPROFILE, #JIT_CHECK_OSR 11941 beq .L_osr_check 11942 subgts rPROFILE, #1 11943 beq .L_add_batch @ counted down to zero - report 11944.L_resume_backward_branch: 11945 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET] 11946 REFRESH_IBASE 11947 add r2, rINST, rINST @ r2<- byte offset 11948 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST 11949 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 11950 bne .L_suspend_request_pending 11951 GET_INST_OPCODE ip @ extract opcode from rINST 11952 GOTO_OPCODE ip @ jump to next instruction 11953 11954.L_suspend_request_pending: 11955 EXPORT_PC 11956 mov r0, rSELF 11957 bl MterpSuspendCheck @ (self) 11958 cmp r0, #0 11959 bne MterpFallback 11960 REFRESH_IBASE @ might have changed during suspend 11961 GET_INST_OPCODE ip @ extract opcode from rINST 11962 GOTO_OPCODE ip @ jump to next instruction 11963 11964.L_no_count_backwards: 11965 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 11966 bne .L_resume_backward_branch 11967.L_osr_check: 11968 mov r0, rSELF 11969 add r1, rFP, #OFF_FP_SHADOWFRAME 11970 mov r2, rINST 11971 EXPORT_PC 11972 bl MterpMaybeDoOnStackReplacement @ (self, shadow_frame, offset) 11973 cmp r0, #0 11974 bne MterpOnStackReplacement 11975 b .L_resume_backward_branch 11976 11977.L_forward_branch: 11978 cmp rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry? 11979 beq .L_check_osr_forward 11980.L_resume_forward_branch: 11981 add r2, rINST, rINST @ r2<- byte offset 11982 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST 11983 GET_INST_OPCODE ip @ extract opcode from rINST 11984 GOTO_OPCODE ip @ jump to next instruction 11985 11986.L_check_osr_forward: 11987 mov r0, rSELF 11988 add r1, rFP, #OFF_FP_SHADOWFRAME 11989 mov r2, rINST 11990 EXPORT_PC 11991 bl MterpMaybeDoOnStackReplacement @ (self, shadow_frame, offset) 11992 cmp r0, #0 11993 bne MterpOnStackReplacement 11994 b .L_resume_forward_branch 11995 11996.L_add_batch: 11997 add r1, rFP, #OFF_FP_SHADOWFRAME 11998 strh rPROFILE, [r1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET] 11999 ldr r0, [rFP, #OFF_FP_METHOD] 12000 mov r2, rSELF 12001 bl MterpAddHotnessBatch @ (method, shadow_frame, self) 12002 mov rPROFILE, r0 @ restore new hotness countdown to rPROFILE 12003 b .L_no_count_backwards 12004 12005/* 12006 * Entered from the conditional branch handlers when OSR check request active on 12007 * not-taken path. All Dalvik not-taken conditional branch offsets are 2. 12008 */ 12009.L_check_not_taken_osr: 12010 mov r0, rSELF 12011 add r1, rFP, #OFF_FP_SHADOWFRAME 12012 mov r2, #2 12013 EXPORT_PC 12014 bl MterpMaybeDoOnStackReplacement @ (self, shadow_frame, offset) 12015 cmp r0, #0 12016 bne MterpOnStackReplacement 12017 FETCH_ADVANCE_INST 2 12018 GET_INST_OPCODE ip @ extract opcode from rINST 12019 GOTO_OPCODE ip @ jump to next instruction 12020 12021/* 12022 * On-stack replacement has happened, and now we've returned from the compiled method. 12023 */ 12024MterpOnStackReplacement: 12025#if MTERP_LOGGING 12026 mov r0, rSELF 12027 add r1, rFP, #OFF_FP_SHADOWFRAME 12028 mov r2, rINST 12029 bl MterpLogOSR 12030#endif 12031 mov r0, #1 @ Signal normal return 12032 b MterpDone 12033 12034/* 12035 * Bail out to reference interpreter. 12036 */ 12037MterpFallback: 12038 EXPORT_PC 12039#if MTERP_LOGGING 12040 mov r0, rSELF 12041 add r1, rFP, #OFF_FP_SHADOWFRAME 12042 bl MterpLogFallback 12043#endif 12044MterpCommonFallback: 12045 mov r0, #0 @ signal retry with reference interpreter. 12046 b MterpDone 12047 12048/* 12049 * We pushed some registers on the stack in ExecuteMterpImpl, then saved 12050 * SP and LR. Here we restore SP, restore the registers, and then restore 12051 * LR to PC. 12052 * 12053 * On entry: 12054 * uint32_t* rFP (should still be live, pointer to base of vregs) 12055 */ 12056MterpExceptionReturn: 12057 mov r0, #1 @ signal return to caller. 12058 b MterpDone 12059MterpReturn: 12060 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER] 12061 str r0, [r2] 12062 str r1, [r2, #4] 12063 mov r0, #1 @ signal return to caller. 12064MterpDone: 12065/* 12066 * At this point, we expect rPROFILE to be non-zero. If negative, hotness is disabled or we're 12067 * checking for OSR. If greater than zero, we might have unreported hotness to register 12068 * (the difference between the ending rPROFILE and the cached hotness counter). rPROFILE 12069 * should only reach zero immediately after a hotness decrement, and is then reset to either 12070 * a negative special state or the new non-zero countdown value. 12071 */ 12072 cmp rPROFILE, #0 12073 bgt MterpProfileActive @ if > 0, we may have some counts to report. 12074 ldmfd sp!, {r3-r10,fp,pc} @ restore 10 regs and return 12075 12076MterpProfileActive: 12077 mov rINST, r0 @ stash return value 12078 /* Report cached hotness counts */ 12079 ldr r0, [rFP, #OFF_FP_METHOD] 12080 add r1, rFP, #OFF_FP_SHADOWFRAME 12081 mov r2, rSELF 12082 strh rPROFILE, [r1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET] 12083 bl MterpAddHotnessBatch @ (method, shadow_frame, self) 12084 mov r0, rINST @ restore return value 12085 ldmfd sp!, {r3-r10,fp,pc} @ restore 10 regs and return 12086 12087 .fnend 12088 .size ExecuteMterpImpl, .-ExecuteMterpImpl 12089 12090 12091