mirror of
https://github.com/janet-lang/janet
synced 2025-02-20 18:40:00 +00:00
Reenable computed gotos - they were disabled.
This commit is contained in:
parent
6c63c4f129
commit
ddedae6831
149
src/core/vm.c
149
src/core/vm.c
@ -57,83 +57,13 @@ JANET_THREAD_LOCAL jmp_buf *janet_vm_jmp_buf = NULL;
|
||||
/* How we dispatch instructions. By default, we use
|
||||
* a switch inside an infinite loop. For GCC/clang, we use
|
||||
* computed gotos. */
|
||||
#ifdef ____GNUC__
|
||||
#ifdef __GNUC__
|
||||
#define VM_START() { goto *op_lookup[first_opcode];
|
||||
#define VM_END() }
|
||||
#define VM_OP(op) label_##op :
|
||||
#define VM_DEFAULT() label_unknown_op:
|
||||
#define vm_next() goto *op_lookup[*pc & 0xFF]
|
||||
static void *op_lookup[255] = {
|
||||
&&label_JOP_NOOP,
|
||||
&&label_JOP_ERROR,
|
||||
&&label_JOP_TYPECHECK,
|
||||
&&label_JOP_RETURN,
|
||||
&&label_JOP_RETURN_NIL,
|
||||
&&label_JOP_ADD_IMMEDIATE,
|
||||
&&label_JOP_ADD,
|
||||
&&label_JOP_SUBTRACT,
|
||||
&&label_JOP_MULTIPLY_IMMEDIATE,
|
||||
&&label_JOP_MULTIPLY,
|
||||
&&label_JOP_DIVIDE_IMMEDIATE,
|
||||
&&label_JOP_DIVIDE,
|
||||
&&label_JOP_BAND,
|
||||
&&label_JOP_BOR,
|
||||
&&label_JOP_BXOR,
|
||||
&&label_JOP_BNOT,
|
||||
&&label_JOP_SHIFT_LEFT,
|
||||
&&label_JOP_SHIFT_LEFT_IMMEDIATE,
|
||||
&&label_JOP_SHIFT_RIGHT,
|
||||
&&label_JOP_SHIFT_RIGHT_IMMEDIATE,
|
||||
&&label_JOP_SHIFT_RIGHT_UNSIGNED,
|
||||
&&label_JOP_SHIFT_RIGHT_UNSIGNED_IMMEDIATE,
|
||||
&&label_JOP_MOVE_FAR,
|
||||
&&label_JOP_MOVE_NEAR,
|
||||
&&label_JOP_JUMP,
|
||||
&&label_JOP_JUMP_IF,
|
||||
&&label_JOP_JUMP_IF_NOT,
|
||||
&&label_JOP_GREATER_THAN,
|
||||
&&label_JOP_GREATER_THAN_IMMEDIATE,
|
||||
&&label_JOP_LESS_THAN,
|
||||
&&label_JOP_LESS_THAN_IMMEDIATE,
|
||||
&&label_JOP_EQUALS,
|
||||
&&label_JOP_EQUALS_IMMEDIATE,
|
||||
&&label_JOP_COMPARE,
|
||||
&&label_JOP_LOAD_NIL,
|
||||
&&label_JOP_LOAD_TRUE,
|
||||
&&label_JOP_LOAD_FALSE,
|
||||
&&label_JOP_LOAD_INTEGER,
|
||||
&&label_JOP_LOAD_CONSTANT,
|
||||
&&label_JOP_LOAD_UPVALUE,
|
||||
&&label_JOP_LOAD_SELF,
|
||||
&&label_JOP_SET_UPVALUE,
|
||||
&&label_JOP_CLOSURE,
|
||||
&&label_JOP_PUSH,
|
||||
&&label_JOP_PUSH_2,
|
||||
&&label_JOP_PUSH_3,
|
||||
&&label_JOP_PUSH_ARRAY,
|
||||
&&label_JOP_CALL,
|
||||
&&label_JOP_TAILCALL,
|
||||
&&label_JOP_RESUME,
|
||||
&&label_JOP_SIGNAL,
|
||||
&&label_JOP_GET,
|
||||
&&label_JOP_PUT,
|
||||
&&label_JOP_GET_INDEX,
|
||||
&&label_JOP_PUT_INDEX,
|
||||
&&label_JOP_LENGTH,
|
||||
&&label_JOP_MAKE_ARRAY,
|
||||
&&label_JOP_MAKE_BUFFER,
|
||||
&&label_JOP_MAKE_STRING,
|
||||
&&label_JOP_MAKE_STRUCT,
|
||||
&&label_JOP_MAKE_TABLE,
|
||||
&&label_JOP_MAKE_TUPLE,
|
||||
&&label_JOP_MAKE_BRACKET_TUPLE,
|
||||
&&label_JOP_NUMERIC_LESS_THAN,
|
||||
&&label_JOP_NUMERIC_LESS_THAN_EQUAL,
|
||||
&&label_JOP_NUMERIC_GREATER_THAN,
|
||||
&&label_JOP_NUMERIC_GREATER_THAN_EQUAL,
|
||||
&&label_JOP_NUMERIC_EQUAL,
|
||||
&&label_unknown_op
|
||||
};
|
||||
#define opcode (*pc & 0xFF)
|
||||
#else
|
||||
#define VM_START() uint8_t opcode = first_opcode; for (;;) {switch(opcode) {
|
||||
#define VM_END() }}
|
||||
@ -261,6 +191,81 @@ static Janet call_nonfn(JanetFiber *fiber, Janet callee) {
|
||||
/* Interpreter main loop */
|
||||
static JanetSignal run_vm(JanetFiber *fiber, Janet in, JanetFiberStatus status) {
|
||||
|
||||
/* opcode -> label lookup if using clang/GCC */
|
||||
#ifdef __GNUC__
|
||||
static void *op_lookup[255] = {
|
||||
&&label_JOP_NOOP,
|
||||
&&label_JOP_ERROR,
|
||||
&&label_JOP_TYPECHECK,
|
||||
&&label_JOP_RETURN,
|
||||
&&label_JOP_RETURN_NIL,
|
||||
&&label_JOP_ADD_IMMEDIATE,
|
||||
&&label_JOP_ADD,
|
||||
&&label_JOP_SUBTRACT,
|
||||
&&label_JOP_MULTIPLY_IMMEDIATE,
|
||||
&&label_JOP_MULTIPLY,
|
||||
&&label_JOP_DIVIDE_IMMEDIATE,
|
||||
&&label_JOP_DIVIDE,
|
||||
&&label_JOP_BAND,
|
||||
&&label_JOP_BOR,
|
||||
&&label_JOP_BXOR,
|
||||
&&label_JOP_BNOT,
|
||||
&&label_JOP_SHIFT_LEFT,
|
||||
&&label_JOP_SHIFT_LEFT_IMMEDIATE,
|
||||
&&label_JOP_SHIFT_RIGHT,
|
||||
&&label_JOP_SHIFT_RIGHT_IMMEDIATE,
|
||||
&&label_JOP_SHIFT_RIGHT_UNSIGNED,
|
||||
&&label_JOP_SHIFT_RIGHT_UNSIGNED_IMMEDIATE,
|
||||
&&label_JOP_MOVE_FAR,
|
||||
&&label_JOP_MOVE_NEAR,
|
||||
&&label_JOP_JUMP,
|
||||
&&label_JOP_JUMP_IF,
|
||||
&&label_JOP_JUMP_IF_NOT,
|
||||
&&label_JOP_GREATER_THAN,
|
||||
&&label_JOP_GREATER_THAN_IMMEDIATE,
|
||||
&&label_JOP_LESS_THAN,
|
||||
&&label_JOP_LESS_THAN_IMMEDIATE,
|
||||
&&label_JOP_EQUALS,
|
||||
&&label_JOP_EQUALS_IMMEDIATE,
|
||||
&&label_JOP_COMPARE,
|
||||
&&label_JOP_LOAD_NIL,
|
||||
&&label_JOP_LOAD_TRUE,
|
||||
&&label_JOP_LOAD_FALSE,
|
||||
&&label_JOP_LOAD_INTEGER,
|
||||
&&label_JOP_LOAD_CONSTANT,
|
||||
&&label_JOP_LOAD_UPVALUE,
|
||||
&&label_JOP_LOAD_SELF,
|
||||
&&label_JOP_SET_UPVALUE,
|
||||
&&label_JOP_CLOSURE,
|
||||
&&label_JOP_PUSH,
|
||||
&&label_JOP_PUSH_2,
|
||||
&&label_JOP_PUSH_3,
|
||||
&&label_JOP_PUSH_ARRAY,
|
||||
&&label_JOP_CALL,
|
||||
&&label_JOP_TAILCALL,
|
||||
&&label_JOP_RESUME,
|
||||
&&label_JOP_SIGNAL,
|
||||
&&label_JOP_GET,
|
||||
&&label_JOP_PUT,
|
||||
&&label_JOP_GET_INDEX,
|
||||
&&label_JOP_PUT_INDEX,
|
||||
&&label_JOP_LENGTH,
|
||||
&&label_JOP_MAKE_ARRAY,
|
||||
&&label_JOP_MAKE_BUFFER,
|
||||
&&label_JOP_MAKE_STRING,
|
||||
&&label_JOP_MAKE_STRUCT,
|
||||
&&label_JOP_MAKE_TABLE,
|
||||
&&label_JOP_MAKE_TUPLE,
|
||||
&&label_JOP_MAKE_BRACKET_TUPLE,
|
||||
&&label_JOP_NUMERIC_LESS_THAN,
|
||||
&&label_JOP_NUMERIC_LESS_THAN_EQUAL,
|
||||
&&label_JOP_NUMERIC_GREATER_THAN,
|
||||
&&label_JOP_NUMERIC_GREATER_THAN_EQUAL,
|
||||
&&label_JOP_NUMERIC_EQUAL,
|
||||
&&label_unknown_op
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Interpreter state */
|
||||
register Janet *stack;
|
||||
register uint32_t *pc;
|
||||
|
Loading…
x
Reference in New Issue
Block a user