1a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%default { "isrange":"0" } 2a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%verify "executed" 3a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%verify "unimplemented array type" 4a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* 5a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Create a new array with elements filled from registers. 6a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 7a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * for: filled-new-array, filled-new-array/range 8a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 9a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # op vB, {vD, vE, vF, vG, vA}, class /* CCCC */ 10a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # op {vCCCC..v(CCCC+AA-1)}, type /* BBBB */ 11a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_rSELF_methodClassDex(a3) # a3 <- pDvmDex 12a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham FETCH(a1, 1) # a1 <- BBBB 13a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_base_offDvmDex_pResClasses(a3, a3) # a3 <- pDvmDex->pResClasses 14a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham EXPORT_PC() # need for resolve and alloc 15a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_eas2(a0, a3, a1) # a0 <- resolved class 16a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GET_OPA(rOBJ) # rOBJ <- AA or BA 17a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # already resolved? 18a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham bnez a0, .L${opcode}_continue # yes, continue on 19a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_rSELF_method(a3) # a3 <- self->method 20a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham li a2, 0 # a2 <- false 21a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_base_offMethod_clazz(a0, a3) # a0 <- method->clazz 22a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham JAL(dvmResolveClass) # v0 <- call(clazz, ref) 23a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham move a0, v0 24a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # got null? 25a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham beqz v0, common_exceptionThrown # yes, handle exception 26a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham b .L${opcode}_continue 27a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%break 28a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 29a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* 30a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * On entry: 31a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * a0 holds array class 32a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * rOBJ holds AA or BA 33a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 34a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham.L${opcode}_continue: 35a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LOAD_base_offClassObject_descriptor(a3, a0) # a3 <- arrayClass->descriptor 36a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham li a2, ALLOC_DONT_TRACK # a2 <- alloc flags 37a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lbu rINST, 1(a3) # rINST <- descriptor[1] 38a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham .if $isrange 39a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham move a1, rOBJ # a1 <- AA (length) 40a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham .else 41a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham srl a1, rOBJ, 4 # rOBJ <- B (length) 42a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham .endif 43a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham seq t0, rINST, 'I' # array of ints? 44a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham seq t1, rINST, 'L' # array of objects? 45a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham or t0, t1 46a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham seq t1, rINST, '[' # array of arrays? 47a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham or t0, t1 48a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham move rBIX, a1 # save length in rBIX 49a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham beqz t0, .L${opcode}_notimpl # no, not handled yet 50a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham JAL(dvmAllocArrayByClass) # v0 <- call(arClass, length, flags) 51a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # null return? 52a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham beqz v0, common_exceptionThrown # alloc failed, handle exception 53a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 54a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham FETCH(a1, 2) # a1 <- FEDC or CCCC 55a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sw v0, offThread_retval(rSELF) # retval.l <- new array 56a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sw rINST, (offThread_retval+4)(rSELF) # retval.h <- type 57a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham addu a0, v0, offArrayObject_contents # a0 <- newArray->contents 58a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham subu rBIX, rBIX, 1 # length--, check for neg 59a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham FETCH_ADVANCE_INST(3) # advance to next instr, load rINST 60a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham bltz rBIX, 2f # was zero, bail 61a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 62a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # copy values from registers into the array 63a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # a0=array, a1=CCCC/FEDC, t0=length (from AA or B), rOBJ=AA/BA 64a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham move t0, rBIX 65a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham .if $isrange 66a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham EAS2(a2, rFP, a1) # a2 <- &fp[CCCC] 67a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham1: 68a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lw a3, 0(a2) # a3 <- *a2++ 69a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham addu a2, 4 70a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham subu t0, t0, 1 # count-- 71a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sw a3, (a0) # *contents++ = vX 72a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham addu a0, 4 73a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham bgez t0, 1b 74a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 75a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # continue at 2 76a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham .else 77a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham slt t1, t0, 4 # length was initially 5? 78a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham and a2, rOBJ, 15 # a2 <- A 79a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham bnez t1, 1f # <= 4 args, branch 80a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GET_VREG(a3, a2) # a3 <- vA 81a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham subu t0, t0, 1 # count-- 82a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sw a3, 16(a0) # contents[4] = vA 83a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham1: 84a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham and a2, a1, 15 # a2 <- F/E/D/C 85a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GET_VREG(a3, a2) # a3 <- vF/vE/vD/vC 86a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham srl a1, a1, 4 # a1 <- next reg in low 4 87a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham subu t0, t0, 1 # count-- 88a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sw a3, 0(a0) # *contents++ = vX 89a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham addu a0, a0, 4 90a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham bgez t0, 1b 91a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham # continue at 2 92a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham .endif 93a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 94a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham2: 95a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lw a0, offThread_retval(rSELF) # a0 <- object 96a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lw a1, (offThread_retval+4)(rSELF) # a1 <- type 97a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham seq t1, a1, 'I' # Is int array? 98a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham bnez t1, 3f 99a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lw a2, offThread_cardTable(rSELF) # a2 <- card table base 100a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham srl t3, a0, GC_CARD_SHIFT 101a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham addu t2, a2, t3 102a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sb a2, (t2) 103a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham3: 104a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GET_INST_OPCODE(t0) # ip <- opcode from rINST 105a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham GOTO_OPCODE(t0) # execute it 106a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 107a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 108a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* 109a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Throw an exception indicating that we have not implemented this 110a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * mode of filled-new-array. 111a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 112a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham.L${opcode}_notimpl: 113a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham la a0, .LstrFilledNewArrayNotImpl 114a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham JAL(dvmThrowInternalError) 115a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham b common_exceptionThrown 116a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 117a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* 118a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Ideally we'd only define this once, but depending on layout we can 119a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * exceed the range of the load above. 120a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 121