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