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 & kSubModeDebuggerActive) { 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