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