1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%default { "isrange":"0" } 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "unimplemented array type" 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new array with elements filled from registers. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: filled-new-array, filled-new-array/range 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 119f601a917c8878204482c37aec7005054b6776fabuzbee ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- pDvmDex 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 1) @ r1<- BBBB 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r3, #offDvmDex_pResClasses] @ r3<- pDvmDex->pResClasses 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ need for resolve and alloc 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, r1, lsl #2] @ r0<- resolved class 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r10, rINST, lsr #8 @ r10<- AA or BA 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ already resolved? 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .L${opcode}_continue @ yes, continue on 199f601a917c8878204482c37aec7005054b6776fabuzbee8: ldr r3, [rSELF, #offThread_method] @ r3<- self->method 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #0 @ r2<- false 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r3, #offMethod_clazz] @ r0<- method->clazz 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmResolveClass @ r0<- call(clazz, ref) 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ got null? 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ yes, handle exception 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b .L${opcode}_continue 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%break 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 holds array class 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 holds AA or BA 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_continue: 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r2, #ALLOC_DONT_TRACK @ r2<- alloc flags 36919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee ldrb rINST, [r3, #1] @ rINST<- descriptor[1] 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $isrange 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10 @ r1<- AA (length) 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r10, lsr #4 @ r1<- B (length) 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 42919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp rINST, #'I' @ array of ints? 43919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmpne rINST, #'L' @ array of objects? 44919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmpne rINST, #'[' @ array of arrays? 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, r1 @ save length in r9 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne .L${opcode}_notimpl @ no, not handled yet 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmAllocArrayByClass @ r0<- call(arClass, length, flags) 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ null return? 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ alloc failed, handle exception 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- FEDC or CCCC 529f601a917c8878204482c37aec7005054b6776fabuzbee str r0, [rSELF, #offThread_retval] @ retval.l <- new array 539f601a917c8878204482c37aec7005054b6776fabuzbee str rINST, [rSELF, #offThread_retval+4] @ retval.h <- type 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, r0, #offArrayObject_contents @ r0<- newArray->contents 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ length--, check for neg 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi 2f @ was zero, bail 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ copy values from registers into the array 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $isrange 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r2, rFP, r1, lsl #2 @ r2<- &fp[CCCC] 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: ldr r3, [r2], #4 @ r3<- *r2++ 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #4 @ length was initially 5? 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r10, #15 @ r2<- A 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bne 1f @ <= 4 args, branch 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vA 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub r9, r9, #1 @ count-- 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0, #16] @ contents[4] = vA 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and r2, r1, #15 @ r2<- F/E/D/C 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r3, r2) @ r3<- vF/vE/vD/vC 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r1, r1, lsr #4 @ r1<- next reg in low 4 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subs r9, r9, #1 @ count-- 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r3, [r0], #4 @ *contents++ = vX 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bpl 1b 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ continue at 2 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: 859f601a917c8878204482c37aec7005054b6776fabuzbee ldr r0, [rSELF, #offThread_retval] @ r0<- object 869f601a917c8878204482c37aec7005054b6776fabuzbee ldr r1, [rSELF, #offThread_retval+4] @ r1<- type 879f601a917c8878204482c37aec7005054b6776fabuzbee ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base 88919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_INST_OPCODE(ip) @ ip<- opcode from rINST 89919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee cmp r1, #'I' @ Is int array? 90d82097f6b409c5cd48568e54eb701604c3cceb18buzbee strneb r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head 91919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GOTO_OPCODE(ip) @ execute it 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception indicating that we have not implemented this 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mode of filled-new-array. 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_notimpl: 989a3147c7412f4794434b4c2604aa2ba784867774buzbee ldr r0, .L_strFilledNewArrayNotImpl_${opcode} 9998f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee bl dvmThrowInternalError 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_exceptionThrown 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1029a3147c7412f4794434b4c2604aa2ba784867774buzbee /* 1039a3147c7412f4794434b4c2604aa2ba784867774buzbee * Ideally we'd only define this once, but depending on layout we can 1049a3147c7412f4794434b4c2604aa2ba784867774buzbee * exceed the range of the load above. 1059a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 1069a3147c7412f4794434b4c2604aa2ba784867774buzbee 1079a3147c7412f4794434b4c2604aa2ba784867774buzbee.L_strFilledNewArrayNotImpl_${opcode}: 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word .LstrFilledNewArrayNotImpl 109