1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In the C mterp stubs, "goto" is a function call followed immediately
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * by a return.
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_TARGET_DECL(_target, ...)
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_TARGET(_target, ...) _target:
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_TARGET_END
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ugh */
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define STUB_HACK(x)
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Instruction framing.  For a switch-oriented implementation this is
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * case/break, for a threaded implementation it's a goto label and an
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction fetch/computed goto.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Assumes the existence of "const u2* pc" and (for threaded operation)
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "u2 inst".
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef THREADED_INTERP
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define H(_op)             &&op_##_op
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define HANDLE_OPCODE(_op) op_##_op:
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define FINISH(_offset) {                                                  \
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ADJUST_PC(_offset);                                                 \
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        inst = FETCH(0);                                                    \
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CHECK_DEBUG_AND_PROF();                                             \
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CHECK_TRACKED_REFS();                                               \
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        goto *handlerTable[INST_INST(inst)];                                \
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define HANDLE_OPCODE(_op) case _op:
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define FINISH(_offset)    { ADJUST_PC(_offset); break; }
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OP_END
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_TRACKREF_CHECKS)
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define CHECK_TRACKED_REFS() \
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmInterpCheckTrackedRefs(self, curMethod, debugTrackedRefStart)
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define CHECK_TRACKED_REFS() ((void)0)
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "goto" targets just turn into goto statements.  The "arguments" are
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * passed through local variables.
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_exceptionThrown() goto exceptionThrown;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_returnFromMethod() goto returnFromMethod;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_invoke(_target, _methodCallRange)                              \
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    do {                                                                    \
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        methodCallRange = _methodCallRange;                                 \
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        goto _target;                                                       \
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } while(false)
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* for this, the "args" are already in the locals */
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_invokeMethod(_methodCallRange, _methodToCall, _vsrc1, _vdst) goto invokeMethod;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_bail() goto bail;
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_bail_switch() goto bail_switch;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Periodically check for thread suspension.
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * While we're at it, see if a debugger has attached or the profiler has
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * started.  If so, switch to a different "goto" table.
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define PERIODIC_CHECKS(_entryPoint, _pcadj) {                              \
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmCheckSuspendQuick(self);                                         \
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (NEED_INTERP_SWITCH(INTERP_TYPE)) {                              \
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ADJUST_PC(_pcadj);                                              \
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            interpState->entryPoint = _entryPoint;                          \
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            LOGVV("threadid=%d: switch to %s ep=%d adj=%d\n",               \
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                self->threadId,                                             \
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (interpState->nextMode == INTERP_STD) ? "STD" : "DBG",      \
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (_entryPoint), (_pcadj));                                   \
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            GOTO_bail_switch();                                             \
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }                                                                   \
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88