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