Home | History | Annotate | Download | only in x86
      1 %verify "executed"
      2     /*
      3      * Array put, 32 bits or less.  vBB[vCC] <- vAA
      4      *
      5      * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
      6      */
      7     /* op vAA, vBB, vCC */
      8     movzbl    2(rPC),%eax               # eax<- BB
      9     movzbl    3(rPC),%ecx               # ecx<- CC
     10     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
     11     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     12     GET_VREG_R  rINST rINST             # rINST<- vAA
     13     testl     %eax,%eax                 # null array object?
     14     je        common_errNullObject      # bail if so
     15     cmpl      offArrayObject_length(%eax),%ecx
     16     jae       common_errArrayIndex      # index >= length, bail.  Expects
     17                                         #    arrayObj in eax
     18                                         #    index in ecx
     19     /* On entry:
     20      *   eax<- array object
     21      *   ecx<- index
     22      *   rINST<- vAA
     23      */
     24     leal      offArrayObject_contents(%eax,%ecx,4),%ecx
     25     testl     rINST,rINST                    # storing null reference?
     26     je        .L${opcode}_skip_check
     27     SPILL_TMP1(%ecx)                         # save target address
     28     SPILL_TMP2(%eax)                         # save object head
     29     movl      offObject_clazz(%eax),%eax     # eax<- arrayObj->clazz
     30     movl      offObject_clazz(rINST),%ecx    # ecx<- obj->clazz
     31     movl      %eax,OUT_ARG1(%esp)
     32     movl      %ecx,OUT_ARG0(%esp)
     33     movl      %ecx,sReg0                     # store the two classes for later
     34     movl      %eax,sReg1
     35     SPILL(rIBASE)
     36     call      dvmCanPutArrayElement          # test object type vs. array type
     37     UNSPILL(rIBASE)
     38     UNSPILL_TMP1(%ecx)                       # recover target address
     39     testl     %eax,%eax
     40     movl      rSELF,%eax
     41     jne       .L${opcode}_types_okay
     42 
     43     # The types don't match.  We need to throw an ArrayStoreException.
     44     EXPORT_PC
     45     movl      sReg0,%eax                     # restore the two classes...
     46     movl      %eax,OUT_ARG0(%esp)
     47     movl      sReg1,%ecx
     48     movl      %ecx,OUT_ARG1(%esp)
     49     call      dvmThrowArrayStoreExceptionIncompatibleElement # ...and throw
     50     jmp       common_exceptionThrown
     51 
     52 .L${opcode}_types_okay:
     53     movl      offThread_cardTable(%eax),%eax   # get card table base
     54     movl      rINST,(%ecx)                   # store into array
     55     UNSPILL_TMP2(rINST)                      # recover object head
     56     FETCH_INST_OPCODE 2 %ecx
     57     shrl      $$GC_CARD_SHIFT,rINST          # object head to card number
     58     movb      %al,(%eax,rINST)               # mark card using object head
     59     ADVANCE_PC 2
     60     GOTO_NEXT_R %ecx
     61 
     62 .L${opcode}_skip_check:
     63     movl      rINST,(%ecx)
     64     FETCH_INST_OPCODE 2 %ecx
     65     ADVANCE_PC 2
     66     GOTO_NEXT_R %ecx
     67