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