1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed"
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "negative array length"
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "allocation fails"
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Allocate an array of objects, specified with the array class
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and a count.
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * check for it here.
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-array vA, vB, class@CCCC */
129f601a917c8878204482c37aec7005054b6776fabuzbee    movl    rSELF,%ecx
13f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    EXPORT_PC
149f601a917c8878204482c37aec7005054b6776fabuzbee    movl    offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                       # eax<- CCCC
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%ecx),%ecx  # ecx<- pDvmDex->pResClasses
17a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    SPILL(rIBASE)
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%ecx,%eax,4),%ecx                # ecx<- resolved class
19f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movzbl  rINSTbl,%eax
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $$4,%eax                          # eax<- B
21f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    GET_VREG_R %eax %eax                      # eax<- vB (array length)
22f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    andb    $$0xf,rINSTbl                     # rINST<- A
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
248cb0d098d79af61546e275f633325794f4587602buzbee    js      common_errNegativeArraySize       # bail, passing len in eax
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                         # already resolved?
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .L${opcode}_finish                # yes, fast path
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class (null here)
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds array length (vB)
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
329f601a917c8878204482c37aec7005054b6776fabuzbee    movl    rSELF,%ecx
33f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    SPILL_TMP1(%eax)                   # save array length
349f601a917c8878204482c37aec7005054b6776fabuzbee    movl    offThread_method(%ecx),%ecx  # ecx<- self->method
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- CCCC
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$0,OUT_ARG2(%esp)
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass            # eax<- call(clazz,ref,flag)
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx
42f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    UNSPILL_TMP1(%eax)
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                  # successful resolution?
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown     # no, bail.
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# fall through to ${opcode}_finish
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish allocation
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx holds class
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax holds array length (vB)
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish:
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$ALLOC_DONT_TRACK,OUT_ARG2(%esp)
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
58a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    FETCH_INST_OPCODE 2 %ecx
59a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    UNSPILL(rIBASE)
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax               # failed?
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown  # yup - go handle
62f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    SET_VREG %eax rINST
63f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    ADVANCE_PC 2
64a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    GOTO_NEXT_R %ecx
65