• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

HANDLE_OPCODE(OP_EXECUTE_INLINE_RANGE)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