stubdefs.cpp revision cd8f5e701547739f241594b43e9470c92d98e9cf
1/* 2 * In the C mterp stubs, "goto" is a function call followed immediately 3 * by a return. 4 */ 5 6#define GOTO_TARGET_DECL(_target, ...) 7 8#define GOTO_TARGET(_target, ...) _target: 9 10#define GOTO_TARGET_END 11 12/* ugh */ 13#define STUB_HACK(x) 14#define JIT_STUB_HACK(x) 15 16/* 17 * InterpSave's pc and fp must be valid when breaking out to a 18 * "Reportxxx" routine. Because the portable interpreter uses local 19 * variables for these, we must flush prior. Stubs, however, use 20 * the interpSave vars directly, so this is a nop for stubs. 21 */ 22#define PC_FP_TO_SELF() \ 23 self->interpSave.pc = pc; \ 24 self->interpSave.fp = fp; 25 26/* 27 * Instruction framing. For a switch-oriented implementation this is 28 * case/break, for a threaded implementation it's a goto label and an 29 * instruction fetch/computed goto. 30 * 31 * Assumes the existence of "const u2* pc" and (for threaded operation) 32 * "u2 inst". 33 */ 34# define H(_op) &&op_##_op 35# define HANDLE_OPCODE(_op) op_##_op: 36# define FINISH(_offset) { \ 37 ADJUST_PC(_offset); \ 38 inst = FETCH(0); \ 39 if (self->interpBreak.ctl.subMode) { \ 40 dvmCheckBefore(pc, fp, self); \ 41 } \ 42 goto *handlerTable[INST_INST(inst)]; \ 43 } 44# define FINISH_BKPT(_opcode) { \ 45 goto *handlerTable[_opcode]; \ 46 } 47# define DISPATCH_EXTENDED(_opcode) { \ 48 goto *handlerTable[0x100 + _opcode]; \ 49 } 50 51#define OP_END 52 53/* 54 * The "goto" targets just turn into goto statements. The "arguments" are 55 * passed through local variables. 56 */ 57 58#define GOTO_exceptionThrown() goto exceptionThrown; 59 60#define GOTO_returnFromMethod() goto returnFromMethod; 61 62#define GOTO_invoke(_target, _methodCallRange, _jumboFormat) \ 63 do { \ 64 methodCallRange = _methodCallRange; \ 65 jumboFormat = _jumboFormat; \ 66 goto _target; \ 67 } while(false) 68 69/* for this, the "args" are already in the locals */ 70#define GOTO_invokeMethod(_methodCallRange, _methodToCall, _vsrc1, _vdst) goto invokeMethod; 71 72#define GOTO_bail() goto bail; 73 74/* 75 * Periodically check for thread suspension. 76 * 77 * While we're at it, see if a debugger has attached or the profiler has 78 * started. If so, switch to a different "goto" table. 79 */ 80#define PERIODIC_CHECKS(_pcadj) { \ 81 if (dvmCheckSuspendQuick(self)) { \ 82 EXPORT_PC(); /* need for precise GC */ \ 83 dvmCheckSuspendPending(self); \ 84 } \ 85 } 86