1*795d594fSAndroid Build Coastguard Worker// array-length vA, vB 2*795d594fSAndroid Build Coastguard Worker// Format 12x: B|A|21 3*795d594fSAndroid Build Coastguard Worker// Store in the given destination register the length of the indicated array, in entries 4*795d594fSAndroid Build Coastguard Worker%def op_array_length(): 5*795d594fSAndroid Build Coastguard Worker srliw t0, xINST, 12 // t0 := B 6*795d594fSAndroid Build Coastguard Worker GET_VREG_OBJECT t0, t0 // t0 := refs[B] 7*795d594fSAndroid Build Coastguard Worker beqz t0, 1f 8*795d594fSAndroid Build Coastguard Worker srliw t1, xINST, 8 // t1 := B|A 9*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 1 10*795d594fSAndroid Build Coastguard Worker andi t1, t1, 0xF // t1 := A 11*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t3 12*795d594fSAndroid Build Coastguard Worker lw t2, MIRROR_ARRAY_LENGTH_OFFSET(t0) 13*795d594fSAndroid Build Coastguard Worker% set_vreg("t2", "t1", z0="t0") 14*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t3 15*795d594fSAndroid Build Coastguard Worker1: 16*795d594fSAndroid Build Coastguard Worker tail common_errNullObject 17*795d594fSAndroid Build Coastguard Worker 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker// new-array vA, vB, type@CCCC 20*795d594fSAndroid Build Coastguard Worker// Format 22c: B|A|23 CCCC 21*795d594fSAndroid Build Coastguard Worker// Construct a new array of the indicated type and size. The type must be an array type. 22*795d594fSAndroid Build Coastguard Worker%def op_new_array(): 23*795d594fSAndroid Build Coastguard Worker EXPORT_PC 24*795d594fSAndroid Build Coastguard Worker srliw s8, xINST, 8 // s8 := B|A 25*795d594fSAndroid Build Coastguard Worker srliw s7, xINST, 12 // s7 := B 26*795d594fSAndroid Build Coastguard Worker andi s8, s8, 0xF // s8 := A 27*795d594fSAndroid Build Coastguard Worker FETCH_FROM_THREAD_CACHE /*resolved klass*/a0, .L${opcode}_miss, t0, t1 28*795d594fSAndroid Build Coastguard Worker TEST_IF_MARKING t0, .L${opcode}_mark 29*795d594fSAndroid Build Coastguard Worker.L${opcode}_resume: 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker% get_vreg("a1", "s7") # a1 := fp[B] length 32*795d594fSAndroid Build Coastguard Worker ld t0, THREAD_ALLOC_ARRAY_ENTRYPOINT_OFFSET(xSELF) 33*795d594fSAndroid Build Coastguard Worker jalr t0 // args a0 (klass), a1 (length) 34*795d594fSAndroid Build Coastguard Worker // return a0 := new-array 35*795d594fSAndroid Build Coastguard Worker fence w, w // constructor fence; main.S has details 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT a0, s8, z0=t0 // refs[A] := new-array 38*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 39*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 40*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark: 43*795d594fSAndroid Build Coastguard Worker call art_quick_read_barrier_mark_reg10 // a0, klass 44*795d594fSAndroid Build Coastguard Worker j .L${opcode}_resume 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker.L${opcode}_miss: 47*795d594fSAndroid Build Coastguard Worker EXPORT_PC 48*795d594fSAndroid Build Coastguard Worker mv a0, xSELF 49*795d594fSAndroid Build Coastguard Worker ld a1, (sp) // caller ArtMethod* 50*795d594fSAndroid Build Coastguard Worker mv a2, xPC 51*795d594fSAndroid Build Coastguard Worker call nterp_get_class 52*795d594fSAndroid Build Coastguard Worker j .L${opcode}_resume 53*795d594fSAndroid Build Coastguard Worker 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker 57*795d594fSAndroid Build Coastguard Worker// filled-new-array {vC, vD, vE, vF, vG}, type@BBBB 58*795d594fSAndroid Build Coastguard Worker// Format 35c: A|G|24 BBBB F|E|D|C 59*795d594fSAndroid Build Coastguard Worker// Construct an array of the given type and size, filling it with the supplied contents. The type 60*795d594fSAndroid Build Coastguard Worker// must be an array type. The array's contents must be single-word (that is, no arrays of long or 61*795d594fSAndroid Build Coastguard Worker// double, but reference types are acceptable). The constructed instance is stored as a "result" in 62*795d594fSAndroid Build Coastguard Worker// the same way that the method invocation instructions store their results, so the constructed 63*795d594fSAndroid Build Coastguard Worker// instance must be moved to a register with an immediately subsequent move-result-object 64*795d594fSAndroid Build Coastguard Worker// instruction (if it is to be used). 65*795d594fSAndroid Build Coastguard Worker%def op_filled_new_array(is_range=False): 66*795d594fSAndroid Build Coastguard Worker EXPORT_PC 67*795d594fSAndroid Build Coastguard Worker mv a0, xSELF 68*795d594fSAndroid Build Coastguard Worker ld a1, (sp) // a1 := caller ArtMethod* 69*795d594fSAndroid Build Coastguard Worker mv a2, xFP // a2 := vreg array 70*795d594fSAndroid Build Coastguard Worker mv a3, xPC 71*795d594fSAndroid Build Coastguard Worker% if is_range: 72*795d594fSAndroid Build Coastguard Worker call nterp_filled_new_array_range // args a0, a1, a2, a3 73*795d594fSAndroid Build Coastguard Worker% else: 74*795d594fSAndroid Build Coastguard Worker call nterp_filled_new_array // args a0, a1, a2, a3 75*795d594fSAndroid Build Coastguard Worker%#: 76*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 3 77*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 78*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 79*795d594fSAndroid Build Coastguard Worker 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker// filled-new-array/range {vCCCC .. vNNNN}, type@BBBB 82*795d594fSAndroid Build Coastguard Worker// where NNNN = CCCC + AA - 1 83*795d594fSAndroid Build Coastguard Worker// Format 3rc: AA|25 BBBB CCCC 84*795d594fSAndroid Build Coastguard Worker// Construct an array of the given type and size, filling it with the supplied contents. 85*795d594fSAndroid Build Coastguard Worker// Clarifications and restrictions are the same as filled-new-array, described above. 86*795d594fSAndroid Build Coastguard Worker%def op_filled_new_array_range(): 87*795d594fSAndroid Build Coastguard Worker% op_filled_new_array(is_range=True) 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker// fill-array-data vAA, +BBBBBBBB 91*795d594fSAndroid Build Coastguard Worker// Format 31t: AA|26 BBBB(lo) BBBB(hi) 92*795d594fSAndroid Build Coastguard Worker// Fill the given array with the indicated data. The reference must be to an array of primitives, 93*795d594fSAndroid Build Coastguard Worker// and the data table must match it in type and must contain no more elements than will fit in the 94*795d594fSAndroid Build Coastguard Worker// array. That is, the array may be larger than the table, and if so, only the initial elements of 95*795d594fSAndroid Build Coastguard Worker// the array are set, leaving the remainder alone. 96*795d594fSAndroid Build Coastguard Worker%def op_fill_array_data(): 97*795d594fSAndroid Build Coastguard Worker EXPORT_PC 98*795d594fSAndroid Build Coastguard Worker srliw t0, xINST, 8 // t0 := AA 99*795d594fSAndroid Build Coastguard Worker FETCH t1, count=1, signed=1, width=32 100*795d594fSAndroid Build Coastguard Worker // t1 := ssssssssBBBBBBBB 101*795d594fSAndroid Build Coastguard Worker GET_VREG_OBJECT a1, t0 // a1 := refs[AA] (array ref) 102*795d594fSAndroid Build Coastguard Worker // +BBBBBBBB offset is in code units. Multiply by 2 for byte offset against dex PC. 103*795d594fSAndroid Build Coastguard Worker sh1add a0, t1, xPC // a0 := payload address 104*795d594fSAndroid Build Coastguard Worker call art_quick_handle_fill_data // args a0, a1 105*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 3 106*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 107*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker 110*795d594fSAndroid Build Coastguard Worker// Common setup across APUT and AGET variants. 111*795d594fSAndroid Build Coastguard Worker// Sets \array, \index, and \length registers. 112*795d594fSAndroid Build Coastguard Worker// Branches to null handler and out-of-bounds handler. 113*795d594fSAndroid Build Coastguard Worker%def array_prelude(array, index, length, null_label, oob_label): 114*795d594fSAndroid Build Coastguard Worker FETCH $index, count=1 // index := CC|BB 115*795d594fSAndroid Build Coastguard Worker andi $array, $index, 0xFF // array := BB 116*795d594fSAndroid Build Coastguard Worker GET_VREG_OBJECT $array, $array // array := refs[BB], array obj 117*795d594fSAndroid Build Coastguard Worker beqz $array, $null_label 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker srliw $index, $index, 8 // index := CC 120*795d594fSAndroid Build Coastguard Worker% get_vreg(index, index) # index := fp[CC] 121*795d594fSAndroid Build Coastguard Worker lw $length, MIRROR_ARRAY_LENGTH_OFFSET($array) // length (signed 32b) 122*795d594fSAndroid Build Coastguard Worker bgeu $index, $length, $oob_label // Unsigned comparison also catches negative index. 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker// aget vAA, vBB, vCC 126*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|44 CC|BB 127*795d594fSAndroid Build Coastguard Worker// vAA := vBB[vCC] 128*795d594fSAndroid Build Coastguard Worker%def op_aget(width=32, zext=False): 129*795d594fSAndroid Build Coastguard Worker% array_prelude(array="t0", index="a0", length="a1", null_label=f".L{opcode}_null", oob_label=f".L{opcode}_oob") 130*795d594fSAndroid Build Coastguard Worker // t0 := vBB array object, a0 := vCC index, a1 := array length 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker% if width == 8 and zext: 133*795d594fSAndroid Build Coastguard Worker add t0, a0, t0 134*795d594fSAndroid Build Coastguard Worker lbu t0, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(t0) 135*795d594fSAndroid Build Coastguard Worker% elif width == 8: 136*795d594fSAndroid Build Coastguard Worker add t0, a0, t0 137*795d594fSAndroid Build Coastguard Worker lb t0, MIRROR_BYTE_ARRAY_DATA_OFFSET(t0) 138*795d594fSAndroid Build Coastguard Worker% elif width == 16 and zext: 139*795d594fSAndroid Build Coastguard Worker sh1add t0, a0, t0 140*795d594fSAndroid Build Coastguard Worker lhu t0, MIRROR_CHAR_ARRAY_DATA_OFFSET(t0) 141*795d594fSAndroid Build Coastguard Worker% elif width == 16: 142*795d594fSAndroid Build Coastguard Worker sh1add t0, a0, t0 143*795d594fSAndroid Build Coastguard Worker lh t0, MIRROR_SHORT_ARRAY_DATA_OFFSET(t0) 144*795d594fSAndroid Build Coastguard Worker% elif width == 32: 145*795d594fSAndroid Build Coastguard Worker sh2add t0, a0, t0 146*795d594fSAndroid Build Coastguard Worker lw t0, MIRROR_INT_ARRAY_DATA_OFFSET(t0) 147*795d594fSAndroid Build Coastguard Worker% elif width == 64: 148*795d594fSAndroid Build Coastguard Worker sh3add t0, a0, t0 149*795d594fSAndroid Build Coastguard Worker ld t0, MIRROR_WIDE_ARRAY_DATA_OFFSET(t0) 150*795d594fSAndroid Build Coastguard Worker% else: 151*795d594fSAndroid Build Coastguard Worker% assert False, width 152*795d594fSAndroid Build Coastguard Worker%#: 153*795d594fSAndroid Build Coastguard Worker // t0 := *(array obj + data offset + idx * elem_size) 154*795d594fSAndroid Build Coastguard Worker srliw t1, xINST, 8 // t1 := AA 155*795d594fSAndroid Build Coastguard Worker% set_vreg("t0", "t1", z0="t2", width=width) 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 158*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 159*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 160*795d594fSAndroid Build Coastguard Worker 161*795d594fSAndroid Build Coastguard Worker.L${opcode}_null: 162*795d594fSAndroid Build Coastguard Worker tail common_errNullObject 163*795d594fSAndroid Build Coastguard Worker.L${opcode}_oob: 164*795d594fSAndroid Build Coastguard Worker tail common_errArrayIndex // args a0 (index), a1 (length) 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker 167*795d594fSAndroid Build Coastguard Worker// aget-wide vAA, vBB, vCC 168*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|45 CC|BB 169*795d594fSAndroid Build Coastguard Worker%def op_aget_wide(): 170*795d594fSAndroid Build Coastguard Worker% op_aget(width=64) 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker// aget-object vAA, vBB, vCC 174*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|46 CC|BB 175*795d594fSAndroid Build Coastguard Worker%def op_aget_object(): 176*795d594fSAndroid Build Coastguard Worker% array_prelude(array="t0", index="a0", length="a1", null_label=f".L{opcode}_null", oob_label=f".L{opcode}_oob") 177*795d594fSAndroid Build Coastguard Worker // t0 := vBB array object, a0 := vCC index, a1 := array length 178*795d594fSAndroid Build Coastguard Worker 179*795d594fSAndroid Build Coastguard Worker sh2add t0, a0, t0 180*795d594fSAndroid Build Coastguard Worker lwu a0, MIRROR_OBJECT_ARRAY_DATA_OFFSET(t0) 181*795d594fSAndroid Build Coastguard Worker // a0 := *(array obj + data offset + idx * elem_size) 182*795d594fSAndroid Build Coastguard Worker UNPOISON_HEAP_REF a0 183*795d594fSAndroid Build Coastguard Worker TEST_IF_MARKING t1, .L${opcode}_mark 184*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark_resume: 185*795d594fSAndroid Build Coastguard Worker srliw t1, xINST, 8 // t1 := AA 186*795d594fSAndroid Build Coastguard Worker SET_VREG_OBJECT a0, t1, z0=t2 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 189*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 190*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark: 193*795d594fSAndroid Build Coastguard Worker call art_quick_read_barrier_mark_reg10 // a0, object elem 194*795d594fSAndroid Build Coastguard Worker j .L${opcode}_mark_resume 195*795d594fSAndroid Build Coastguard Worker.L${opcode}_null: 196*795d594fSAndroid Build Coastguard Worker tail common_errNullObject 197*795d594fSAndroid Build Coastguard Worker.L${opcode}_oob: 198*795d594fSAndroid Build Coastguard Worker tail common_errArrayIndex // args a0 (index), a1 (length) 199*795d594fSAndroid Build Coastguard Worker 200*795d594fSAndroid Build Coastguard Worker 201*795d594fSAndroid Build Coastguard Worker// aget-boolean vAA, vBB, vCC 202*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|47 CC|BB 203*795d594fSAndroid Build Coastguard Worker%def op_aget_boolean(): 204*795d594fSAndroid Build Coastguard Worker% op_aget(width=8, zext=True) 205*795d594fSAndroid Build Coastguard Worker 206*795d594fSAndroid Build Coastguard Worker 207*795d594fSAndroid Build Coastguard Worker// aget-byte vAA, vBB, vCC 208*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|48 CC|BB 209*795d594fSAndroid Build Coastguard Worker%def op_aget_byte(): 210*795d594fSAndroid Build Coastguard Worker% op_aget(width=8) 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker// aget_char vAA, vBB, vCC 214*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|49 CC|BB 215*795d594fSAndroid Build Coastguard Worker%def op_aget_char(): 216*795d594fSAndroid Build Coastguard Worker% op_aget(width=16, zext=True) 217*795d594fSAndroid Build Coastguard Worker 218*795d594fSAndroid Build Coastguard Worker 219*795d594fSAndroid Build Coastguard Worker// aget-short vAA, vBB, vCC 220*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4a CC|BB 221*795d594fSAndroid Build Coastguard Worker%def op_aget_short(): 222*795d594fSAndroid Build Coastguard Worker% op_aget(width=16) 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker// aput vAA, vBB, vCC 226*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4b CC|BB 227*795d594fSAndroid Build Coastguard Worker// vBB[vCC] := vAA 228*795d594fSAndroid Build Coastguard Worker%def op_aput(width=32, zext=False): 229*795d594fSAndroid Build Coastguard Worker% array_prelude(array="t0", index="t1", length="t2", null_label=f".L{opcode}_null", oob_label=f".L{opcode}_oob") 230*795d594fSAndroid Build Coastguard Worker // t0 := vBB array object, t1 := vCC zext index, t2 := array length 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker srliw t2, xINST, 8 // t2 := AA 233*795d594fSAndroid Build Coastguard Worker% get_vreg("t2", "t2", width=width) # t2 := fp[AA] 234*795d594fSAndroid Build Coastguard Worker% if width == 8 and zext: 235*795d594fSAndroid Build Coastguard Worker add t0, t1, t0 236*795d594fSAndroid Build Coastguard Worker sb t2, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(t0) 237*795d594fSAndroid Build Coastguard Worker% elif width == 8: 238*795d594fSAndroid Build Coastguard Worker add t0, t1, t0 239*795d594fSAndroid Build Coastguard Worker sb t2, MIRROR_BYTE_ARRAY_DATA_OFFSET(t0) 240*795d594fSAndroid Build Coastguard Worker% elif width == 16 and zext: 241*795d594fSAndroid Build Coastguard Worker sh1add t0, t1, t0 242*795d594fSAndroid Build Coastguard Worker sh t2, MIRROR_CHAR_ARRAY_DATA_OFFSET(t0) 243*795d594fSAndroid Build Coastguard Worker% elif width == 16: 244*795d594fSAndroid Build Coastguard Worker sh1add t0, t1, t0 245*795d594fSAndroid Build Coastguard Worker sh t2, MIRROR_SHORT_ARRAY_DATA_OFFSET(t0) 246*795d594fSAndroid Build Coastguard Worker% elif width == 32: 247*795d594fSAndroid Build Coastguard Worker sh2add t0, t1, t0 248*795d594fSAndroid Build Coastguard Worker sw t2, MIRROR_INT_ARRAY_DATA_OFFSET(t0) 249*795d594fSAndroid Build Coastguard Worker% elif width == 64: 250*795d594fSAndroid Build Coastguard Worker sh3add t0, t1, t0 251*795d594fSAndroid Build Coastguard Worker sd t2, MIRROR_WIDE_ARRAY_DATA_OFFSET(t0) 252*795d594fSAndroid Build Coastguard Worker% else: 253*795d594fSAndroid Build Coastguard Worker% assert False, width 254*795d594fSAndroid Build Coastguard Worker%#: 255*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 256*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 257*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 258*795d594fSAndroid Build Coastguard Worker 259*795d594fSAndroid Build Coastguard Worker.L${opcode}_null: 260*795d594fSAndroid Build Coastguard Worker tail common_errNullObject 261*795d594fSAndroid Build Coastguard Worker.L${opcode}_oob: 262*795d594fSAndroid Build Coastguard Worker sext.w a0, t1 263*795d594fSAndroid Build Coastguard Worker mv a1, t2 264*795d594fSAndroid Build Coastguard Worker tail common_errArrayIndex // args a0 (index), a1 (length) 265*795d594fSAndroid Build Coastguard Worker 266*795d594fSAndroid Build Coastguard Worker 267*795d594fSAndroid Build Coastguard Worker// aput-wide vAA, vBB, vCC 268*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4c CC|BB 269*795d594fSAndroid Build Coastguard Worker%def op_aput_wide(): 270*795d594fSAndroid Build Coastguard Worker% op_aput(width=64) 271*795d594fSAndroid Build Coastguard Worker 272*795d594fSAndroid Build Coastguard Worker 273*795d594fSAndroid Build Coastguard Worker// aput-object vAA, vBB, vCC 274*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4d CC|BB 275*795d594fSAndroid Build Coastguard Worker%def op_aput_object(): 276*795d594fSAndroid Build Coastguard Worker% array_prelude(array="a0", index="a1", length="a2", null_label=f".L{opcode}_null", oob_label=f".L{opcode}_oob") 277*795d594fSAndroid Build Coastguard Worker // a0 := vBB array object, a1 := vCC zext index, a2 := array length 278*795d594fSAndroid Build Coastguard Worker 279*795d594fSAndroid Build Coastguard Worker EXPORT_PC 280*795d594fSAndroid Build Coastguard Worker srliw a2, xINST, 8 // a2 := AA 281*795d594fSAndroid Build Coastguard Worker GET_VREG_OBJECT a2, a2 // a2 := fp[AA] 282*795d594fSAndroid Build Coastguard Worker sext.w a1, a1 // a1 := sext index 283*795d594fSAndroid Build Coastguard Worker call art_quick_aput_obj // args a0 (array obj), a1 (index), a2 (obj) 284*795d594fSAndroid Build Coastguard Worker 285*795d594fSAndroid Build Coastguard Worker FETCH_ADVANCE_INST 2 286*795d594fSAndroid Build Coastguard Worker GET_INST_OPCODE t0 287*795d594fSAndroid Build Coastguard Worker GOTO_OPCODE t0 288*795d594fSAndroid Build Coastguard Worker 289*795d594fSAndroid Build Coastguard Worker.L${opcode}_null: 290*795d594fSAndroid Build Coastguard Worker tail common_errNullObject 291*795d594fSAndroid Build Coastguard Worker.L${opcode}_oob: 292*795d594fSAndroid Build Coastguard Worker sext.w a0, a1 293*795d594fSAndroid Build Coastguard Worker mv a1, a2 294*795d594fSAndroid Build Coastguard Worker tail common_errArrayIndex // args a0 (index), a1 (length) 295*795d594fSAndroid Build Coastguard Worker 296*795d594fSAndroid Build Coastguard Worker// aput-boolean vAA, vBB, vCC 297*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4e CC|BB 298*795d594fSAndroid Build Coastguard Worker%def op_aput_boolean(): 299*795d594fSAndroid Build Coastguard Worker% op_aput(width=8, zext=True) 300*795d594fSAndroid Build Coastguard Worker 301*795d594fSAndroid Build Coastguard Worker 302*795d594fSAndroid Build Coastguard Worker// aput-byte vAA, vBB, vCC 303*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4f CC|BB 304*795d594fSAndroid Build Coastguard Worker%def op_aput_byte(): 305*795d594fSAndroid Build Coastguard Worker% op_aput(width=8) 306*795d594fSAndroid Build Coastguard Worker 307*795d594fSAndroid Build Coastguard Worker 308*795d594fSAndroid Build Coastguard Worker// aput-char vAA, vBB, vCC 309*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|50 CC|BB 310*795d594fSAndroid Build Coastguard Worker%def op_aput_char(): 311*795d594fSAndroid Build Coastguard Worker% op_aput(width=16, zext=True) 312*795d594fSAndroid Build Coastguard Worker 313*795d594fSAndroid Build Coastguard Worker 314*795d594fSAndroid Build Coastguard Worker// aput-short vAA, vBB, vCC 315*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|51 CC|BB 316*795d594fSAndroid Build Coastguard Worker%def op_aput_short(): 317*795d594fSAndroid Build Coastguard Worker% op_aput(width=16) 318