OP_EXECUTE_INLINE.cpp revision f6c387128427e121477c1b32ad35cdcaa5101ba3
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectHANDLE_OPCODE(OP_EXECUTE_INLINE /*vB, {vD, vE, vF, vG}, inline@CCCC*/) 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This has the same form as other method calls, but we ignore 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the 5th argument (vA). This is chiefly because the first four 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * arguments to a function on ARM are in registers. 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We only set the arguments that are actually used, leaving 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the rest uninitialized. We're assuming that, if the method 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * needs them, they'll be specified in the call. 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This annoys gcc when optimizations are enabled, causing a 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "may be used uninitialized" warning. We can quiet the warnings 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for a slight penalty (5%: 373ns vs. 393ns on empty method). Note 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that valgrind is perfectly happy with this arrangement, because 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the uninitialiezd values are never actually used. 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 arg0, arg1, arg2, arg3; 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //arg0 = arg1 = arg2 = arg3 = 0; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC(); 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project vsrc1 = INST_B(inst); /* #of args */ 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ref = FETCH(1); /* inline call "ref" */ 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project vdst = FETCH(2); /* 0-4 register indices */ 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ILOGV("|execute-inline args=%d @%d {regs=0x%04x}", 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project vsrc1, ref, vdst); 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert((vdst >> 16) == 0); // 16-bit type -or- high 16 bits clear 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(vsrc1 <= 4); 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (vsrc1) { 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 4: 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arg3 = GET_REGISTER(vdst >> 12); 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fall through */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 3: 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arg2 = GET_REGISTER((vdst & 0x0f00) >> 8); 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fall through */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 2: 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arg1 = GET_REGISTER((vdst & 0x00f0) >> 4); 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fall through */ 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 1: 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arg0 = GET_REGISTER(vdst & 0x0f); 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fall through */ 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: // case 0 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if INTERP_TYPE == INTERP_DBG 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmPerformInlineOp4Dbg(arg0, arg1, arg2, arg3, &retval, ref)) 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_exceptionThrown(); 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmPerformInlineOp4Std(arg0, arg1, arg2, arg3, &retval, ref)) 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_exceptionThrown(); 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FINISH(3); 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_END 59