Home | History | Annotate | Download | only in c
      1 HANDLE_OPCODE(OP_EXECUTE_INLINE_RANGE /*{vCCCC..v(CCCC+AA-1)}, inline@BBBB*/)
      2     {
      3         u4 arg0, arg1, arg2, arg3;
      4         arg0 = arg1 = arg2 = arg3 = 0;      /* placate gcc */
      5 
      6         EXPORT_PC();
      7 
      8         vsrc1 = INST_AA(inst);      /* #of args */
      9         ref = FETCH(1);             /* inline call "ref" */
     10         vdst = FETCH(2);            /* range base */
     11         ILOGV("|execute-inline-range args=%d @%d {regs=v%d-v%d}",
     12             vsrc1, ref, vdst, vdst+vsrc1-1);
     13 
     14         assert((vdst >> 16) == 0);  // 16-bit type -or- high 16 bits clear
     15         assert(vsrc1 <= 4);
     16 
     17         switch (vsrc1) {
     18         case 4:
     19             arg3 = GET_REGISTER(vdst+3);
     20             /* fall through */
     21         case 3:
     22             arg2 = GET_REGISTER(vdst+2);
     23             /* fall through */
     24         case 2:
     25             arg1 = GET_REGISTER(vdst+1);
     26             /* fall through */
     27         case 1:
     28             arg0 = GET_REGISTER(vdst+0);
     29             /* fall through */
     30         default:        // case 0
     31             ;
     32         }
     33 
     34         if (self->interpBreak.ctl.subMode & kSubModeDebugProfile) {
     35             if (!dvmPerformInlineOp4Dbg(arg0, arg1, arg2, arg3, &retval, ref))
     36                 GOTO_exceptionThrown();
     37         } else {
     38             if (!dvmPerformInlineOp4Std(arg0, arg1, arg2, arg3, &retval, ref))
     39                 GOTO_exceptionThrown();
     40         }
     41     }
     42     FINISH(3);
     43 OP_END
     44