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