1HANDLE_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);
43OP_END
44