1*795d594fSAndroid Build Coastguard Worker%def unused(): 2*795d594fSAndroid Build Coastguard Worker ebreak 3*795d594fSAndroid Build Coastguard Worker 4*795d594fSAndroid Build Coastguard Worker// nop 5*795d594fSAndroid Build Coastguard Worker// Format 10x: 00|00 6*795d594fSAndroid Build Coastguard Worker%def op_nop(): 7*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 1 // advance xPC, load xINST 8*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 // t0 holds next opcode 9*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 // continue to next 10*795d594fSAndroid Build Coastguard Worker 11*795d594fSAndroid Build Coastguard Worker// move vA, vB 12*795d594fSAndroid Build Coastguard Worker// Format 12x: B|A|01 13*795d594fSAndroid Build Coastguard Worker%def op_move(is_object=False, is_wide=False): 14*795d594fSAndroid Build Coastguard Worker srliw t1, xINST, 12 // t1 := B 15*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := B|A 16*795d594fSAndroid Build Coastguard Worker% if is_object: 17*795d594fSAndroid Build Coastguard Worker // Note: leaves a useful breadcrumb if the reference is corrupted, unlike GET_VREG_OBJECT. 18*795d594fSAndroid Build Coastguard Worker% get_vreg("t1", "t1", is_unsigned=True) # t1 = fp[B], zext 19*795d594fSAndroid Build Coastguard Worker% else: 20*795d594fSAndroid Build Coastguard Worker% get_vreg("t1", "t1", is_wide=is_wide) # t1 := fp[B] 21*795d594fSAndroid Build Coastguard Worker%#: 22*795d594fSAndroid Build Coastguard Worker and t2, t2, 0xF // t2 := A 23*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 1 // advance xPC, load xINST 24*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 holds next opcode 25*795d594fSAndroid Build Coastguard Worker% if is_object: 26*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT t1, t2, z0=t0 // refs[A] := fp[B] 27*795d594fSAndroid Build Coastguard Worker% else: 28*795d594fSAndroid Build Coastguard Worker% set_vreg("t1", "t2", z0="t0", is_wide=is_wide) # fp[A] := fp[B] 29*795d594fSAndroid Build Coastguard Worker%#: 30*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Worker// move/from16 vAA, vBBBB 33*795d594fSAndroid Build Coastguard Worker// Format 22x: AA|16 BBBB 34*795d594fSAndroid Build Coastguard Worker%def op_move_from16(is_object=False, is_wide=False): 35*795d594fSAndroid Build Coastguard Worker FETCH t1, count=1 // t1 := BBBB 36*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := AA 37*795d594fSAndroid Build Coastguard Worker% if is_object: 38*795d594fSAndroid Build Coastguard Worker // Note: leaves a useful breadcrumb if the reference is corrupted, unlike GET_VREG_OBJECT. 39*795d594fSAndroid Build Coastguard Worker% get_vreg("t1", "t1", is_unsigned=True) # t1 = fp[BBBB], zext 40*795d594fSAndroid Build Coastguard Worker% else: 41*795d594fSAndroid Build Coastguard Worker% get_vreg("t1", "t1", is_wide=is_wide) # t1 := fp[BBBB] 42*795d594fSAndroid Build Coastguard Worker%#: 43*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 // advance xPC, load xINST 44*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 := next opcode 45*795d594fSAndroid Build Coastguard Worker% if is_object: 46*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT t1, t2, z0=t0 // refs[AA] := fp[BBBB] 47*795d594fSAndroid Build Coastguard Worker% else: 48*795d594fSAndroid Build Coastguard Worker% set_vreg("t1", "t2", z0="t0", is_wide=is_wide) # fp[AA] := fp[BBBB] 49*795d594fSAndroid Build Coastguard Worker%#: 50*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker// move/16 vAAAA, vBBBB 53*795d594fSAndroid Build Coastguard Worker// Format 32x: 00|03 AAAA BBBB 54*795d594fSAndroid Build Coastguard Worker%def op_move_16(is_object=False, is_wide=False): 55*795d594fSAndroid Build Coastguard Worker FETCH t1, count=2 // t1 := BBBB 56*795d594fSAndroid Build Coastguard Worker FETCH t2, count=1 // t2 := AAAA 57*795d594fSAndroid Build Coastguard Worker% if is_object: 58*795d594fSAndroid Build Coastguard Worker // Note: leaves a useful breadcrumb if the reference is corrupted, unlike GET_VREG_OBJECT. 59*795d594fSAndroid Build Coastguard Worker% get_vreg("t1", "t1", is_unsigned=True) # t1 = fp[BBBB], zext 60*795d594fSAndroid Build Coastguard Worker% else: 61*795d594fSAndroid Build Coastguard Worker% get_vreg("t1", "t1", is_wide=is_wide) # t1 := fp[BBBB] 62*795d594fSAndroid Build Coastguard Worker%#: 63*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 3 // advance xPC, load xINST 64*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 := next opcode 65*795d594fSAndroid Build Coastguard Worker% if is_object: 66*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT t1, t2, z0=t0 // refs[AAAA] := fp[BBBB] 67*795d594fSAndroid Build Coastguard Worker% else: 68*795d594fSAndroid Build Coastguard Worker% set_vreg("t1", "t2", z0="t0", is_wide=is_wide) # fp[AAAA] := fp[BBBB] 69*795d594fSAndroid Build Coastguard Worker%#: 70*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 71*795d594fSAndroid Build Coastguard Worker 72*795d594fSAndroid Build Coastguard Worker// move-wide vA, vB 73*795d594fSAndroid Build Coastguard Worker// Format 12x: B|A|04 74*795d594fSAndroid Build Coastguard Worker// NOTE: vregs can overlap, e.g. "move-wide v6,v7" or "move-wide v7,v6" 75*795d594fSAndroid Build Coastguard Worker%def op_move_wide(): 76*795d594fSAndroid Build Coastguard Worker% op_move(is_wide=True) 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker// move-wide/from16 vAA, vBBBB 79*795d594fSAndroid Build Coastguard Worker// Format 22x: AA|05 BBBB 80*795d594fSAndroid Build Coastguard Worker// NOTE: vregs can overlap, e.g. "move-wide v6,v7" or "move-wide v7,v6" 81*795d594fSAndroid Build Coastguard Worker%def op_move_wide_from16(): 82*795d594fSAndroid Build Coastguard Worker% op_move_from16(is_wide=True) 83*795d594fSAndroid Build Coastguard Worker 84*795d594fSAndroid Build Coastguard Worker// move-wide/16, vAAAA, vBBBB 85*795d594fSAndroid Build Coastguard Worker// Format 32x: 00|06 AAAA BBBB 86*795d594fSAndroid Build Coastguard Worker// NOTE: vregs can overlap, e.g. "move-wide v6,v7" or "move-wide v7,v6" 87*795d594fSAndroid Build Coastguard Worker%def op_move_wide_16(): 88*795d594fSAndroid Build Coastguard Worker% op_move_16(is_wide=True) 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker// move-object vA, vB 91*795d594fSAndroid Build Coastguard Worker// Format 12x: B|A|07 92*795d594fSAndroid Build Coastguard Worker%def op_move_object(): 93*795d594fSAndroid Build Coastguard Worker% op_move(is_object=True) 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker// move-object/from16 vAA, vBBBB 96*795d594fSAndroid Build Coastguard Worker// Format 22x: AA|08 BBBB 97*795d594fSAndroid Build Coastguard Worker%def op_move_object_from16(): 98*795d594fSAndroid Build Coastguard Worker% op_move_from16(is_object=True) 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker// move-object/16 vAAAA, vBBBB 101*795d594fSAndroid Build Coastguard Worker// Format 32x: 00|09 AAAA BBBB 102*795d594fSAndroid Build Coastguard Worker%def op_move_object_16(): 103*795d594fSAndroid Build Coastguard Worker% op_move_16(is_object=True) 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker// move-result vAA 106*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|0a 107*795d594fSAndroid Build Coastguard Worker%def op_move_result(is_object=False, is_wide=False): 108*795d594fSAndroid Build Coastguard Worker srliw t1, xINST, 8 // t1 := AA 109*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 1 // advance xPC, load xINST 110*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t2 // t2 := next opcode 111*795d594fSAndroid Build Coastguard Worker% if is_object: 112*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT a0, t1, z0=t0 // refs[AA] := a0 113*795d594fSAndroid Build Coastguard Worker% else: 114*795d594fSAndroid Build Coastguard Worker% set_vreg("a0", "t1", z0="t0", is_wide=is_wide) # fp[AA] := a0 115*795d594fSAndroid Build Coastguard Worker%#: 116*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t2 // continue to next 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker// move-result-wide vAA 119*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|0b 120*795d594fSAndroid Build Coastguard Worker%def op_move_result_wide(): 121*795d594fSAndroid Build Coastguard Worker% op_move_result(is_wide=True) 122*795d594fSAndroid Build Coastguard Worker 123*795d594fSAndroid Build Coastguard Worker// move-result-object vAA 124*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|0c 125*795d594fSAndroid Build Coastguard Worker%def op_move_result_object(): 126*795d594fSAndroid Build Coastguard Worker% op_move_result(is_object=True) 127*795d594fSAndroid Build Coastguard Worker 128*795d594fSAndroid Build Coastguard Worker// move-exception vAA 129*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|0d 130*795d594fSAndroid Build Coastguard Worker%def op_move_exception(): 131*795d594fSAndroid Build Coastguard Worker ld t1, THREAD_EXCEPTION_OFFSET(xSELF) // t1 := exception object 132*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := AA 133*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 1 // advance xPC, load xINST 134*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT t1, t2, z0=t0 // refs[AA] := exception object 135*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 := next opcode 136*795d594fSAndroid Build Coastguard Worker sd zero, THREAD_EXCEPTION_OFFSET(xSELF) // clear exception 137*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker// const/4 vA, #+B 140*795d594fSAndroid Build Coastguard Worker// Format 11n: B|A|12 141*795d594fSAndroid Build Coastguard Worker// Clobbers: t0, t1, t2, t3 142*795d594fSAndroid Build Coastguard Worker%def op_const_4(): 143*795d594fSAndroid Build Coastguard Worker slliw t1, xINST, 16 // B as MSB of word 144*795d594fSAndroid Build Coastguard Worker sraiw t1, t1, 28 // t1 := sssssssB 145*795d594fSAndroid Build Coastguard Worker slliw t2, xINST, 20 // A as MSB of word 146*795d594fSAndroid Build Coastguard Worker srliw t2, t2, 28 // t2 := A 147*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 1 // advance xPC, load xINST 148*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 holds next opcode 149*795d594fSAndroid Build Coastguard Worker% set_vreg("t1", "t2", z0="t0") # fp[A] := sssssssB 150*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker// const/16 vAA, #+BBBB 153*795d594fSAndroid Build Coastguard Worker// Format 21s: AA|13 BBBB 154*795d594fSAndroid Build Coastguard Worker// Clobbers: t0, t1, t2, t3 155*795d594fSAndroid Build Coastguard Worker%def op_const_16(is_wide=False): 156*795d594fSAndroid Build Coastguard Worker FETCH t1, count=1, signed=1 157*795d594fSAndroid Build Coastguard Worker // t1 := ssssssssssssBBBB 158*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := AA 159*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 // advance xPC, load xINST 160*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 := next opcode 161*795d594fSAndroid Build Coastguard Worker% set_vreg("t1", "t2", z0="t0", is_wide=is_wide) 162*795d594fSAndroid Build Coastguard Worker // fp[AA] := +BBBB 163*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 164*795d594fSAndroid Build Coastguard Worker 165*795d594fSAndroid Build Coastguard Worker// const vAA, #+BBBBBBBB 166*795d594fSAndroid Build Coastguard Worker// Format 31i: AA|14 BBBB(lo) BBBB(hi) 167*795d594fSAndroid Build Coastguard Worker// Clobbers: t0, t1, t2, t3 168*795d594fSAndroid Build Coastguard Worker%def op_const(is_wide=False): 169*795d594fSAndroid Build Coastguard Worker FETCH t1, count=1, signed=1, width=32 170*795d594fSAndroid Build Coastguard Worker // t1 := ssssssssBBBBBBBB 171*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := AA 172*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 3 // advance xPC, load xINST 173*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 := next opcode 174*795d594fSAndroid Build Coastguard Worker% set_vreg("t1", "t2", z0="t0", is_wide=is_wide) 175*795d594fSAndroid Build Coastguard Worker // fp[AA] := +BBBBBBBB 176*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker// const/high16 vAA, #+BBBB0000 179*795d594fSAndroid Build Coastguard Worker// Format 21h: AA|15 BBBB 180*795d594fSAndroid Build Coastguard Worker// Clobbers: t0, t1, t2, t3 181*795d594fSAndroid Build Coastguard Worker%def op_const_high16(): 182*795d594fSAndroid Build Coastguard Worker FETCH t1, count=1 // t1 := BBBB 183*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := AA 184*795d594fSAndroid Build Coastguard Worker slliw t1, t1, 16 // t1 := BBBB0000 185*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 // advance xPC, load xINST 186*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 := next opcode 187*795d594fSAndroid Build Coastguard Worker% set_vreg("t1", "t2", z0="t0") # fp[AA] := BBBB0000 188*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 189*795d594fSAndroid Build Coastguard Worker 190*795d594fSAndroid Build Coastguard Worker// const-wide/16 vAA, #+BBBB 191*795d594fSAndroid Build Coastguard Worker// Format 21s: AA|16 BBBB 192*795d594fSAndroid Build Coastguard Worker%def op_const_wide_16(): 193*795d594fSAndroid Build Coastguard Worker% op_const_16(is_wide=True) 194*795d594fSAndroid Build Coastguard Worker 195*795d594fSAndroid Build Coastguard Worker// const-wide/32 vAA, #+BBBBBBBB 196*795d594fSAndroid Build Coastguard Worker// Format 31i: AA|17 BBBB(lo) BBBB(hi) 197*795d594fSAndroid Build Coastguard Worker%def op_const_wide_32(): 198*795d594fSAndroid Build Coastguard Worker% op_const(is_wide=True) 199*795d594fSAndroid Build Coastguard Worker 200*795d594fSAndroid Build Coastguard Worker// const-wide vAA, #+BBBBBBBBBBBBBBBB 201*795d594fSAndroid Build Coastguard Worker// Format 51l: AA|18 BBBB(lo) BBBB BBBB BBBB(hi) 202*795d594fSAndroid Build Coastguard Worker%def op_const_wide(): 203*795d594fSAndroid Build Coastguard Worker FETCH t1, count=1, width=64 204*795d594fSAndroid Build Coastguard Worker // t1 := BBBBBBBBBBBBBBBB 205*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := AA 206*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 5 // advance xPC, load xINST 207*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 := next opcode 208*795d594fSAndroid Build Coastguard Worker SET_VREG_WIDE t1, t2, z0=t0 209*795d594fSAndroid Build Coastguard Worker // fp[AA] := BBBBBBBBBBBBBBBB 210*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker// const-wide/high16 vAA, #+BBBB000000000000 213*795d594fSAndroid Build Coastguard Worker// Format 21h: AA|19 BBBB 214*795d594fSAndroid Build Coastguard Worker%def op_const_wide_high16(): 215*795d594fSAndroid Build Coastguard Worker FETCH t1, count=1 // t1 := BBBB 216*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := AA 217*795d594fSAndroid Build Coastguard Worker slli t1, t1, 48 // t1 := BBBB000000000000 218*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 // advance xPC, load xINST 219*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 // t3 := next opcode 220*795d594fSAndroid Build Coastguard Worker SET_VREG_WIDE t1, t2, z0=t0 221*795d594fSAndroid Build Coastguard Worker // fp[AA] := BBBB000000000000 222*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 // continue to next 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker// const-string vAA, string@BBBB 226*795d594fSAndroid Build Coastguard Worker// Format 21c: AA|1a BBBB 227*795d594fSAndroid Build Coastguard Worker%def op_const_string(jumbo=False): 228*795d594fSAndroid Build Coastguard Worker // Fast path: string from thread-local cache. 229*795d594fSAndroid Build Coastguard Worker FETCH_FROM_THREAD_CACHE /*object*/a0, .L${opcode}_slow, t0, t1 230*795d594fSAndroid Build Coastguard Worker TEST_IF_MARKING t2, .L${opcode}_mark 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker.L${opcode}_resume: 233*795d594fSAndroid Build Coastguard Worker srliw t0, xINST, 8 // t0 := AA 234*795d594fSAndroid Build Coastguard Worker% code_units = "3" if jumbo else "2" 235*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST $code_units 236*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT a0, t0, z0=t1 237*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 238*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 239*795d594fSAndroid Build Coastguard Worker 240*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark: 241*795d594fSAndroid Build Coastguard Worker call art_quick_read_barrier_mark_reg10 // a0, string 242*795d594fSAndroid Build Coastguard Worker j .L${opcode}_resume 243*795d594fSAndroid Build Coastguard Worker.L${opcode}_slow: 244*795d594fSAndroid Build Coastguard Worker EXPORT_PC 245*795d594fSAndroid Build Coastguard Worker mv a0, xSELF 246*795d594fSAndroid Build Coastguard Worker ld a1, (sp) // caller ArtMethod* 247*795d594fSAndroid Build Coastguard Worker mv a2, xPC 248*795d594fSAndroid Build Coastguard Worker call nterp_load_object // return a0 := string 249*795d594fSAndroid Build Coastguard Worker j .L${opcode}_resume 250*795d594fSAndroid Build Coastguard Worker 251*795d594fSAndroid Build Coastguard Worker 252*795d594fSAndroid Build Coastguard Worker// const-string/jumbo vAA, string@BBBBBBBB 253*795d594fSAndroid Build Coastguard Worker// Format 31c: AA|1b BBBB(lo) BBBB(hi) 254*795d594fSAndroid Build Coastguard Worker%def op_const_string_jumbo(): 255*795d594fSAndroid Build Coastguard Worker% op_const_string(jumbo=True) 256*795d594fSAndroid Build Coastguard Worker 257*795d594fSAndroid Build Coastguard Worker// const-class vAA, type@BBBB 258*795d594fSAndroid Build Coastguard Worker// Format 21c: AA|1c BBBB 259*795d594fSAndroid Build Coastguard Worker%def op_const_class(): 260*795d594fSAndroid Build Coastguard Worker // Fast path: klass reference from thread-local cache. 261*795d594fSAndroid Build Coastguard Worker FETCH_FROM_THREAD_CACHE /*object*/a0, .L${opcode}_slow, t0, t1 262*795d594fSAndroid Build Coastguard Worker TEST_IF_MARKING t2, .L${opcode}_mark 263*795d594fSAndroid Build Coastguard Worker 264*795d594fSAndroid Build Coastguard Worker.L${opcode}_resume: 265*795d594fSAndroid Build Coastguard Worker srliw t0, xINST, 8 // t0 := AA 266*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 267*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT a0, t0, z0=t1 268*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 269*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 270*795d594fSAndroid Build Coastguard Worker 271*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark: 272*795d594fSAndroid Build Coastguard Worker call art_quick_read_barrier_mark_reg10 // a0, klass 273*795d594fSAndroid Build Coastguard Worker j .L${opcode}_resume 274*795d594fSAndroid Build Coastguard Worker.L${opcode}_slow: 275*795d594fSAndroid Build Coastguard Worker EXPORT_PC 276*795d594fSAndroid Build Coastguard Worker mv a0, xSELF 277*795d594fSAndroid Build Coastguard Worker ld a1, (sp) // caller ArtMethod* 278*795d594fSAndroid Build Coastguard Worker mv a2, xPC 279*795d594fSAndroid Build Coastguard Worker call nterp_get_class // return a0 := klass 280*795d594fSAndroid Build Coastguard Worker j .L${opcode}_resume 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker 283*795d594fSAndroid Build Coastguard Worker// const-method-handle vAA, method_handle@BBBB 284*795d594fSAndroid Build Coastguard Worker// Format 21c: AA|fe BBBB 285*795d594fSAndroid Build Coastguard Worker%def op_const_method_handle(): 286*795d594fSAndroid Build Coastguard Worker // Method handle and method type are not cached, just call helper directly. 287*795d594fSAndroid Build Coastguard Worker EXPORT_PC 288*795d594fSAndroid Build Coastguard Worker mv a0, xSELF 289*795d594fSAndroid Build Coastguard Worker ld a1, (sp) // caller ArtMethod* 290*795d594fSAndroid Build Coastguard Worker mv a2, xPC 291*795d594fSAndroid Build Coastguard Worker call nterp_load_object // return a0 := method handle or method type 292*795d594fSAndroid Build Coastguard Worker srliw t0, xINST, 8 // t0 := AA 293*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 294*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT a0, t0, z0=t1 295*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 296*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 297*795d594fSAndroid Build Coastguard Worker 298*795d594fSAndroid Build Coastguard Worker 299*795d594fSAndroid Build Coastguard Worker// const-method-type vAA, proto@BBBB 300*795d594fSAndroid Build Coastguard Worker// Format 21c: AA|ff BBBB 301*795d594fSAndroid Build Coastguard Worker%def op_const_method_type(): 302*795d594fSAndroid Build Coastguard Worker% op_const_method_handle() 303*795d594fSAndroid Build Coastguard Worker 304*795d594fSAndroid Build Coastguard Worker 305*795d594fSAndroid Build Coastguard Worker// monitor-enter vAA 306*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|1d 307*795d594fSAndroid Build Coastguard Worker// Acquire the monitor for the indicated object. 308*795d594fSAndroid Build Coastguard Worker%def op_monitor_enter(): 309*795d594fSAndroid Build Coastguard Worker EXPORT_PC 310*795d594fSAndroid Build Coastguard Worker srliw t0, xINST, 8 // t0 := AA 311*795d594fSAndroid Build Coastguard Worker GET_VREG_OBJECT a0, t0 312*795d594fSAndroid Build Coastguard Worker call art_quick_lock_object // arg a0 313*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 1 314*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 315*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 316*795d594fSAndroid Build Coastguard Worker 317*795d594fSAndroid Build Coastguard Worker 318*795d594fSAndroid Build Coastguard Worker// monitor-exit vAA 319*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|1e 320*795d594fSAndroid Build Coastguard Worker// Release the monitor for the indicated object. 321*795d594fSAndroid Build Coastguard Worker// Note: If this instruction needs to throw an exception, it must do so as if the pc has 322*795d594fSAndroid Build Coastguard Worker// already advanced past the instruction. It may be useful to think of this as the instruction 323*795d594fSAndroid Build Coastguard Worker// successfully executing (in a sense), and the exception getting thrown after the instruction 324*795d594fSAndroid Build Coastguard Worker// but before the next one gets a chance to run. This definition makes it possible for a 325*795d594fSAndroid Build Coastguard Worker// method to use a monitor cleanup catch-all (e.g., finally) block as the monitor cleanup for 326*795d594fSAndroid Build Coastguard Worker// that block itself, as a way to handle the arbitrary exceptions that might get thrown due to 327*795d594fSAndroid Build Coastguard Worker// the historical implementation of Thread.stop(), while still managing to have proper monitor 328*795d594fSAndroid Build Coastguard Worker// hygiene. 329*795d594fSAndroid Build Coastguard Worker%def op_monitor_exit(): 330*795d594fSAndroid Build Coastguard Worker EXPORT_PC 331*795d594fSAndroid Build Coastguard Worker srliw t0, xINST, 8 // t0 := AA 332*795d594fSAndroid Build Coastguard Worker GET_VREG_OBJECT a0, t0 333*795d594fSAndroid Build Coastguard Worker call art_quick_unlock_object // arg a0 334*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 1 335*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 336*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 337*795d594fSAndroid Build Coastguard Worker 338*795d594fSAndroid Build Coastguard Worker 339*795d594fSAndroid Build Coastguard Worker%def op_unused_3e(): 340*795d594fSAndroid Build Coastguard Worker% unused() 341*795d594fSAndroid Build Coastguard Worker 342*795d594fSAndroid Build Coastguard Worker%def op_unused_3f(): 343*795d594fSAndroid Build Coastguard Worker% unused() 344*795d594fSAndroid Build Coastguard Worker 345*795d594fSAndroid Build Coastguard Worker%def op_unused_40(): 346*795d594fSAndroid Build Coastguard Worker% unused() 347*795d594fSAndroid Build Coastguard Worker 348*795d594fSAndroid Build Coastguard Worker%def op_unused_41(): 349*795d594fSAndroid Build Coastguard Worker% unused() 350*795d594fSAndroid Build Coastguard Worker 351*795d594fSAndroid Build Coastguard Worker%def op_unused_42(): 352*795d594fSAndroid Build Coastguard Worker% unused() 353*795d594fSAndroid Build Coastguard Worker 354*795d594fSAndroid Build Coastguard Worker%def op_unused_43(): 355*795d594fSAndroid Build Coastguard Worker% unused() 356*795d594fSAndroid Build Coastguard Worker 357*795d594fSAndroid Build Coastguard Worker%def op_unused_73(): 358*795d594fSAndroid Build Coastguard Worker% unused() 359*795d594fSAndroid Build Coastguard Worker 360*795d594fSAndroid Build Coastguard Worker%def op_unused_79(): 361*795d594fSAndroid Build Coastguard Worker% unused() 362*795d594fSAndroid Build Coastguard Worker 363*795d594fSAndroid Build Coastguard Worker%def op_unused_7a(): 364*795d594fSAndroid Build Coastguard Worker% unused() 365*795d594fSAndroid Build Coastguard Worker 366*795d594fSAndroid Build Coastguard Worker%def op_unused_e3(): 367*795d594fSAndroid Build Coastguard Worker% unused() 368*795d594fSAndroid Build Coastguard Worker 369*795d594fSAndroid Build Coastguard Worker%def op_unused_e4(): 370*795d594fSAndroid Build Coastguard Worker% unused() 371*795d594fSAndroid Build Coastguard Worker 372*795d594fSAndroid Build Coastguard Worker%def op_unused_e5(): 373*795d594fSAndroid Build Coastguard Worker% unused() 374*795d594fSAndroid Build Coastguard Worker 375*795d594fSAndroid Build Coastguard Worker%def op_unused_e6(): 376*795d594fSAndroid Build Coastguard Worker% unused() 377*795d594fSAndroid Build Coastguard Worker 378*795d594fSAndroid Build Coastguard Worker%def op_unused_e7(): 379*795d594fSAndroid Build Coastguard Worker% unused() 380*795d594fSAndroid Build Coastguard Worker 381*795d594fSAndroid Build Coastguard Worker%def op_unused_e8(): 382*795d594fSAndroid Build Coastguard Worker% unused() 383*795d594fSAndroid Build Coastguard Worker 384*795d594fSAndroid Build Coastguard Worker%def op_unused_e9(): 385*795d594fSAndroid Build Coastguard Worker% unused() 386*795d594fSAndroid Build Coastguard Worker 387*795d594fSAndroid Build Coastguard Worker%def op_unused_ea(): 388*795d594fSAndroid Build Coastguard Worker% unused() 389*795d594fSAndroid Build Coastguard Worker 390*795d594fSAndroid Build Coastguard Worker%def op_unused_eb(): 391*795d594fSAndroid Build Coastguard Worker% unused() 392*795d594fSAndroid Build Coastguard Worker 393*795d594fSAndroid Build Coastguard Worker%def op_unused_ec(): 394*795d594fSAndroid Build Coastguard Worker% unused() 395*795d594fSAndroid Build Coastguard Worker 396*795d594fSAndroid Build Coastguard Worker%def op_unused_ed(): 397*795d594fSAndroid Build Coastguard Worker% unused() 398*795d594fSAndroid Build Coastguard Worker 399*795d594fSAndroid Build Coastguard Worker%def op_unused_ee(): 400*795d594fSAndroid Build Coastguard Worker% unused() 401*795d594fSAndroid Build Coastguard Worker 402*795d594fSAndroid Build Coastguard Worker%def op_unused_ef(): 403*795d594fSAndroid Build Coastguard Worker% unused() 404*795d594fSAndroid Build Coastguard Worker 405*795d594fSAndroid Build Coastguard Worker%def op_unused_f0(): 406*795d594fSAndroid Build Coastguard Worker% unused() 407*795d594fSAndroid Build Coastguard Worker 408*795d594fSAndroid Build Coastguard Worker%def op_unused_f1(): 409*795d594fSAndroid Build Coastguard Worker% unused() 410*795d594fSAndroid Build Coastguard Worker 411*795d594fSAndroid Build Coastguard Worker%def op_unused_f2(): 412*795d594fSAndroid Build Coastguard Worker% unused() 413*795d594fSAndroid Build Coastguard Worker 414*795d594fSAndroid Build Coastguard Worker%def op_unused_f3(): 415*795d594fSAndroid Build Coastguard Worker% unused() 416*795d594fSAndroid Build Coastguard Worker 417*795d594fSAndroid Build Coastguard Worker%def op_unused_f4(): 418*795d594fSAndroid Build Coastguard Worker% unused() 419*795d594fSAndroid Build Coastguard Worker 420*795d594fSAndroid Build Coastguard Worker%def op_unused_f5(): 421*795d594fSAndroid Build Coastguard Worker% unused() 422*795d594fSAndroid Build Coastguard Worker 423*795d594fSAndroid Build Coastguard Worker%def op_unused_f6(): 424*795d594fSAndroid Build Coastguard Worker% unused() 425*795d594fSAndroid Build Coastguard Worker 426*795d594fSAndroid Build Coastguard Worker%def op_unused_f7(): 427*795d594fSAndroid Build Coastguard Worker% unused() 428*795d594fSAndroid Build Coastguard Worker 429*795d594fSAndroid Build Coastguard Worker%def op_unused_f8(): 430*795d594fSAndroid Build Coastguard Worker% unused() 431*795d594fSAndroid Build Coastguard Worker 432*795d594fSAndroid Build Coastguard Worker%def op_unused_f9(): 433*795d594fSAndroid Build Coastguard Worker% unused() 434*795d594fSAndroid Build Coastguard Worker 435*795d594fSAndroid Build Coastguard Worker%def op_unused_fc(): 436*795d594fSAndroid Build Coastguard Worker% unused() 437*795d594fSAndroid Build Coastguard Worker 438*795d594fSAndroid Build Coastguard Worker%def op_unused_fd(): 439*795d594fSAndroid Build Coastguard Worker% unused() 440*795d594fSAndroid Build Coastguard Worker 441