1 /* Generated automatically from boot/instructions.scm */ 2 /* DO NOT EDIT */ 3 4 #ifndef SAGITTARIUS_INSTRUCATIONS_H 5 #define SAGITTARIUS_INSTRUCATIONS_H 6 7 #include "sagittariusdefs.h" 8 #define INSN_MASK 0xFF 9 #define INSN_VALUE1_MASK 0xFFF 10 #define INSN_VALUE2_MASK (uintptr_t)-1 11 #define INSN_VALUE1_SHIFT 8 12 #define INSN_VALUE2_SHIFT 20 13 #if defined(_MSC_VER) || defined(_SG_WIN_SUPPORT) 14 /* what a stupid macro definition on windows.h */ 15 #undef CONST 16 #endif 17 18 typedef enum { 19 NOP = 0x00, 20 HALT = 0x01, 21 UNDEF = 0x02, 22 CONST = 0x03, 23 CONSTI = 0x04, 24 LREF = 0x05, 25 LSET = 0x06, 26 FREF = 0x07, 27 FSET = 0x08, 28 GREF = 0x09, 29 GSET = 0x0a, 30 PUSH = 0x0b, 31 BOX = 0x0c, 32 UNBOX = 0x0d, 33 ADD = 0x0e, 34 ADDI = 0x0f, 35 SUB = 0x10, 36 SUBI = 0x11, 37 MUL = 0x12, 38 MULI = 0x13, 39 DIV = 0x14, 40 DIVI = 0x15, 41 NEG = 0x16, 42 TEST = 0x17, 43 JUMP = 0x18, 44 SHIFTJ = 0x19, 45 BNNUME = 0x1a, 46 BNLT = 0x1b, 47 BNLE = 0x1c, 48 BNGT = 0x1d, 49 BNGE = 0x1e, 50 BNEQ = 0x1f, 51 BNEQV = 0x20, 52 BNNULL = 0x21, 53 NOT = 0x22, 54 NUM_EQ = 0x23, 55 NUM_LT = 0x24, 56 NUM_LE = 0x25, 57 NUM_GT = 0x26, 58 NUM_GE = 0x27, 59 RECEIVE = 0x28, 60 CLOSURE = 0x29, 61 APPLY = 0x2a, 62 CALL = 0x2b, 63 LOCAL_CALL = 0x2c, 64 TAIL_CALL = 0x2d, 65 LOCAL_TAIL_CALL = 0x2e, 66 RET = 0x2f, 67 FRAME = 0x30, 68 INST_STACK = 0x31, 69 LEAVE = 0x32, 70 DEFINE = 0x33, 71 LIBRARY = 0x34, 72 CAR = 0x35, 73 CDR = 0x36, 74 CONS = 0x37, 75 LIST = 0x38, 76 APPEND = 0x39, 77 VALUES = 0x3a, 78 EQ = 0x3b, 79 EQV = 0x3c, 80 NULLP = 0x3d, 81 PAIRP = 0x3e, 82 SYMBOLP = 0x3f, 83 VECTOR = 0x40, 84 VECTORP = 0x41, 85 VEC_LEN = 0x42, 86 VEC_REF = 0x43, 87 VEC_SET = 0x44, 88 LREF_PUSH = 0x45, 89 FREF_PUSH = 0x46, 90 GREF_PUSH = 0x47, 91 CONST_PUSH = 0x48, 92 CONSTI_PUSH = 0x49, 93 GREF_CALL = 0x4a, 94 GREF_TAIL_CALL = 0x4b, 95 SET_CAR = 0x4c, 96 SET_CDR = 0x4d, 97 CAAR = 0x4e, 98 CADR = 0x4f, 99 CDAR = 0x50, 100 CDDR = 0x51, 101 CAR_PUSH = 0x52, 102 CDR_PUSH = 0x53, 103 CONS_PUSH = 0x54, 104 LREF_CAR = 0x55, 105 LREF_CDR = 0x56, 106 FREF_CAR = 0x57, 107 FREF_CDR = 0x58, 108 GREF_CAR = 0x59, 109 GREF_CDR = 0x5a, 110 LREF_CAR_PUSH = 0x5b, 111 LREF_CDR_PUSH = 0x5c, 112 FREF_CAR_PUSH = 0x5d, 113 FREF_CDR_PUSH = 0x5e, 114 GREF_CAR_PUSH = 0x5f, 115 GREF_CDR_PUSH = 0x60, 116 CONST_RET = 0x61, 117 APPLY_VALUES = 0x62, 118 RESV_STACK = 0x63, 119 } Instruction; 120 #define INSTRUCTION_COUNT 100 /** number of instructions */ 121 typedef struct InsnInfoRec InsnInfo; 122 struct InsnInfoRec 123 { 124 const char *name; 125 int number; 126 int instValues; 127 int argc; 128 int hasSrc; 129 int label; 130 }; 131 #define INSN(o) ((o) & INSN_MASK) 132 #define INSN_VALUE1(insn) (((int)(insn)) >> INSN_VALUE1_SHIFT) 133 #define INSN_VALUE2(insn) (((int)(insn)) >> INSN_VALUE2_SHIFT) 134 #define INSN_VAL1(v, insn) ((v) = INSN_VALUE1(insn)) 135 #define INSN_VAL2(v1, v2, insn) \ 136 do { \ 137 (v1) = (INSN_VALUE1(insn) & INSN_VALUE1_MASK); \ 138 (v2) = (INSN_VALUE2(insn) & INSN_VALUE2_MASK); \ 139 } while (0) 140 #define MERGE_INSN_VALUE1(insn, value) \ 141 ((insn) | ((value) << INSN_VALUE1_SHIFT)) 142 #define MERGE_INSN_VALUE2(insn, val1, val2) \ 143 ((insn) | ((val1) << INSN_VALUE1_SHIFT) | ((val2) << INSN_VALUE2_SHIFT)) 144 SG_CDECL_BEGIN 145 SG_EXTERN InsnInfo* Sg_LookupInsnName(Instruction insn); 146 SG_CDECL_END 147 #endif 148 149