Home | History | Annotate | Download | only in mips
      1 %default { "isrange":"0", "routine":"NoRange" }
      2 %verify "executed"
      3 %verify "unknown method"
      4     /*
      5      * Handle an optimized "super" method call.
      6      *
      7      * for: [opt] invoke-super-quick, invoke-super-quick/range
      8      */
      9     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
     10     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
     11     FETCH(t0, 2)                           #  t0 <- GFED or CCCC
     12     LOAD_rSELF_method(a2)                  #  a2 <- current method
     13     .if (!$isrange)
     14     and       t0, t0, 15                   #  t0 <- D (or stays CCCC)
     15     .endif
     16     FETCH(a1, 1)                           #  a1 <- BBBB
     17     LOAD_base_offMethod_clazz(a2, a2)      #  a2 <- method->clazz
     18     EXPORT_PC()                            #  must export for invoke
     19     LOAD_base_offClassObject_super(a2, a2) #  a2 <- method->clazz->super
     20     GET_VREG(rOBJ, t0)                     #  rOBJ <- "this"
     21     LOAD_base_offClassObject_vtable(a2, a2) #  a2 <- ...clazz->super->vtable
     22     # is "this" null ?
     23     LOAD_eas2(a0, a2, a1)                  #  a0 <- super->vtable[BBBB]
     24     beqz      rOBJ, common_errNullObject   #  "this" is null, throw exception
     25     b         common_invokeMethod${routine} #  (a0=method, rOBJ="this")
     26 
     27