Bläddra i källkod

Introduced a new DISPATCH_INNER macro to be used in do/while(0) loops when COMPUTED_GOTO is not available

Marco Bambini 5 år sedan
förälder
incheckning
b51227de55
1 ändrade filer med 6 tillägg och 4 borttagningar
  1. 6 4
      src/runtime/gravity_vmmacros.h

+ 6 - 4
src/runtime/gravity_vmmacros.h

@@ -143,11 +143,13 @@
 #else
 #define DISPATCH()                  DEBUG_STACK();INC_PC;inst = *ip++;goto *dispatchTable[op = (opcode_t)OPCODE_GET_OPCODE(inst)];
 #endif
+#define DISPATCH_INNER()            DISPATCH()
 #else
 #define DECLARE_DISPATCH_TABLE
-#define INTERPRET_LOOP              inst = *ip++;op = (opcode_t)OPCODE_GET_OPCODE(inst);UPDATE_STATS(op);switch (op)
+#define INTERPRET_LOOP              vm_loop: inst = *ip++;op = (opcode_t)OPCODE_GET_OPCODE(inst);UPDATE_STATS(op); switch (op)
 #define CASE_CODE(name)             case name
 #define DISPATCH()                  break
+#define DISPATCH_INNER()            goto vm_loop
 #endif
 
 #define INIT_PARAMS(n)              for (uint32_t i=n; i<func->nparams; ++i)            \
@@ -181,9 +183,9 @@
 #define COMPUTE_JUMP(value)                         (func->bytecode + (value))
 
 // FAST MATH MACROS
-#define FMATH_BIN_INT(_r1,_v2,_v3,_OP)              do {SETVALUE(_r1, VALUE_FROM_INT(_v2 _OP _v3)); DISPATCH();} while(0)
-#define FMATH_BIN_FLOAT(_r1,_v2,_v3,_OP)            do {SETVALUE(_r1, VALUE_FROM_FLOAT(_v2 _OP _v3)); DISPATCH();} while(0)
-#define FMATH_BIN_BOOL(_r1,_v2,_v3,_OP)             do {SETVALUE(_r1, VALUE_FROM_BOOL(_v2 _OP _v3)); DISPATCH();} while(0)
+#define FMATH_BIN_INT(_r1,_v2,_v3,_OP)              do {SETVALUE(_r1, VALUE_FROM_INT(_v2 _OP _v3)); DISPATCH_INNER();} while(0)
+#define FMATH_BIN_FLOAT(_r1,_v2,_v3,_OP)            do {SETVALUE(_r1, VALUE_FROM_FLOAT(_v2 _OP _v3)); DISPATCH_INNER();} while(0)
+#define FMATH_BIN_BOOL(_r1,_v2,_v3,_OP)             do {SETVALUE(_r1, VALUE_FROM_BOOL(_v2 _OP _v3)); DISPATCH_INNER();} while(0)
 
 #define DEFINE_STACK_VARIABLE(_v,_r)                register gravity_value_t _v = STACK_GET(_r)
 #define DEFINE_INDEX_VARIABLE(_v,_r)                register gravity_value_t _v = (_r < MAX_REGISTERS) ? STACK_GET(_r) : VALUE_FROM_INT(_r-MAX_REGISTERS)