Home | History | Annotate | Download | only in mips
      1 %default { "cccc":"2" }
      2 %verify "executed"
      3 %verify "finalizable class"
      4     /*
      5      * Invoke Object.<init> on an object.  In practice we know that
      6      * Object's nullary constructor doesn't do anything, so we just
      7      * skip it unless a debugger is active.
      8      */
      9     FETCH(a1, ${cccc})                  # a1<- CCCC
     10     GET_VREG(a0, a1)                    # a0<- "this" ptr
     11     # check for NULL
     12     beqz    a0, common_errNullObject    # export PC and throw NPE
     13     LOAD_base_offObject_clazz(a1, a0)   # a1<- obj->clazz
     14     LOAD_base_offClassObject_accessFlags(a2, a1) # a2<- clazz->accessFlags
     15     and     a2, CLASS_ISFINALIZABLE     # is this class finalizable?
     16     beqz    a2, .L${opcode}_finish      # no, go
     17 
     18 .L${opcode}_setFinal:
     19     EXPORT_PC()                         # can throw
     20     JAL(dvmSetFinalizable)              # call dvmSetFinalizable(obj)
     21     LOAD_offThread_exception(a0, rSELF)	# a0<- self->exception
     22     # exception pending?
     23     bnez    a0, common_exceptionThrown  # yes, handle it
     24 
     25 .L${opcode}_finish:
     26     lhu     a1, offThread_subMode(rSELF)
     27     and     a1, kSubModeDebuggerActive  # debugger active?
     28     bnez    a1, .L${opcode}_debugger    # Yes - skip optimization
     29     FETCH_ADVANCE_INST(${cccc}+1)       # advance to next instr, load rINST
     30     GET_INST_OPCODE(t0)                 # t0<- opcode from rINST
     31     GOTO_OPCODE(t0)                     # execute it
     32 
     33 %break
     34     /*
     35      * A debugger is attached, so we need to go ahead and do
     36      * this.  For simplicity, we'll just jump directly to the
     37      * corresponding handler.  Note that we can't use
     38      * rIBASE here because it may be in single-step mode.
     39      * Load the primary table base directly.
     40      */
     41 .L${opcode}_debugger:
     42     lw      a1, offThread_mainHandlerTable(rSELF)
     43     li      t0, OP_INVOKE_DIRECT_RANGE
     44     GOTO_OPCODE_BASE(a1, t0)            # execute it
     45