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