Rune - Generation work
[rune.git] / librune / insn.h
1 /*
2  * INSN.H
3  *
4  * (c)Copyright 2015, Matthew Dillon, All Rights Reserved.  See the  
5  *    COPYRIGHT file at the base of the distribution.
6  */
7
8 /*
9  * Control bits determine capabilities and restrictions.
10  */
11 #define INSNF_UNUSED0   0x00001000
12 #define INSNF_SSIZE     0x00002000      /* type sizes can be different */
13 #define INSNF_U0        0x00004000      /* implied instruction */
14 #define INSNF_U1        0x00008000      /* unary 1-op */
15 #define INSNF_U2        0x00010000      /* unary 2-op */
16 #define INSNF_CAST      0x00020000      /* operand size differences ok */
17 #define INSNF_B2        0x00040000      /* binary 2-op */
18 #define INSNF_B3        0x00080000      /* binary 3-op */
19 #define INSNF_LEAS      0x00100000      /* data1 is lea */
20 #define INSNF_LEAM      0x00200000      /* data2 is lea */
21 #define INSNF_LEAD      0x00400000      /* data3 is lea */
22 #define INSNF_BOOLD     0x00800000      /* destination operand is BOOL */
23 #define INSNF_LABELD    0x01000000      /* destination operand is a label */
24 #define INSNF_UNSIZED   0x02000000      /* unsized opcode */
25 #define INSNF_FLOAT     0x04000000      /* FP unit involved */
26 #define INSNF_PTRS      0x08000000      /* source must be a raw pointer */
27 #define INSNF_UNUSED28  0x10000000
28 #define INSNF_PTRD      0x20000000      /* destination must be a raw pointer */
29 #define INSNF_COND      0x40000000      /* label or boolean arg3 */
30
31 /*
32  * Instructions (12 bits | flags)
33  *
34  * Note that some instruction codes are repeated with different flags.
35  */
36 #define INSN_MOVE       (0x0001)
37 #define INSN_ADD        (0x0002)
38 #define INSN_SUB        (0x0003)
39 #define INSN_AND        (0x0004)
40 #define INSN_OR         (0x0005)
41 #define INSN_XOR        (0x0006)
42 #define INSN_NOT        (0x0007)
43 #define INSN_COM        (0x0008)
44 #define INSN_NEG        (0x0009)
45 #define INSN_POS        (0x000A)
46 #define INSN_ASL        (0x000B | INSNF_SSIZE)
47 #define INSN_ASR        (0x000C | INSNF_SSIZE)
48 #define INSN_LSR        (0x000D | INSNF_SSIZE)
49 #define INSN_ADDC       (0x000E)
50 #define INSN_SUBC       (0x000F)
51
52 #define INSN_MULU       (0x0010)
53 #define INSN_MULS       (0x0011)
54 #define INSN_DIVU       (0x0012)
55 #define INSN_DIVS       (0x0013)
56 #define INSN_MODU       (0x0014)
57 #define INSN_MODS       (0x0015)
58
59 #define INSN_INC        (0x0016)
60 #define INSN_DEC        (0x0017)
61
62 #define INSN_CMP_EQ     (0x001F | INSNF_COND)
63 #define INSN_CMP_NE     (0x011F | INSNF_COND)
64 #define INSN_CMP_UGT    (0x021F | INSNF_COND)
65 #define INSN_CMP_UGE    (0x031F | INSNF_COND)
66 #define INSN_CMP_ULT    (0x041F | INSNF_COND)
67 #define INSN_CMP_ULE    (0x051F | INSNF_COND)
68 #define INSN_CMP_SGT    (0x061F | INSNF_COND)
69 #define INSN_CMP_SGE    (0x071F | INSNF_COND)
70 #define INSN_CMP_SLT    (0x081F | INSNF_COND)
71 #define INSN_CMP_SLE    (0x091F | INSNF_COND)
72
73 /*
74  * Special (C-style) pointer handling insns.  Typically passed &CVoidPtrType
75  * (do not pass the fat PointerType!), and can be used to add/sub integers
76  * of different sizes to the pointer.
77  */
78 #define INSN_MOVEA      (0x0020 | INSNF_SSIZE | INSNF_PTRD)
79 #define INSN_ADDA       (0x0021 | INSNF_SSIZE | INSNF_PTRD)
80 #define INSN_SUBA       (0x0022 | INSNF_SSIZE | INSNF_PTRD)
81 #define INSN_ADDAU      (0x0023 | INSNF_SSIZE | INSNF_PTRD)
82 #define INSN_SUBAU      (0x0024 | INSNF_SSIZE | INSNF_PTRD)
83 #define INSN_SUBAA      (0x0025 | INSNF_SSIZE | INSNF_PTRD)
84 #define INSN_LEA        (0x0026 | INSNF_LEAS | INSNF_PTRD)
85
86 /*
87  * NOTE: BZERO uses the passed-in destination type alignment for optimizations.
88  */
89 #define INSN_BCOPY      (0x0028 | INSNF_UNSIZED | INSNF_LEAM | INSNF_LEAD)
90 #define INSN_BZERO      (0x0029 | INSNF_UNSIZED | INSNF_LEAD)
91
92 #define INSN_CMPTYPE    (0x002A | INSNF_COND | INSNF_LEAS | INSNF_LEAM)
93
94 /*
95  * Compare addresses
96  */
97 #define INSN_CMPA_EQ    (0x002F | INSNF_COND)
98 #define INSN_CMPA_NE    (0x012F | INSNF_COND)
99 #define INSN_CMPA_UGT   (0x022F | INSNF_COND)
100 #define INSN_CMPA_UGE   (0x032F | INSNF_COND)
101 #define INSN_CMPA_ULT   (0x042F | INSNF_COND)
102 #define INSN_CMPA_ULE   (0x052F | INSNF_COND)
103 #define INSN_CMPA_SGT   (0x062F | INSNF_COND)
104 #define INSN_CMPA_SGE   (0x072F | INSNF_COND)
105 #define INSN_CMPA_SLT   (0x082F | INSNF_COND)
106 #define INSN_CMPA_SLE   (0x092F | INSNF_COND)
107
108 /*
109  * Casts - signed/unsigned/pointer specification is for source.
110  *
111  * CAST*        [s/u]integer<->integer
112  * CASTP        pointer -> integer
113  */
114 #define INSN_CASTU      (0x0030 | INSNF_CAST | INSNF_SSIZE)
115 #define INSN_CASTS      (0x0031 | INSNF_CAST | INSNF_SSIZE)
116 #define INSN_CASTP      (0x0032 | INSNF_CAST | INSNF_SSIZE | INSNF_PTRS)
117
118 /*
119  * PointerStor, LValueStor, and RefStor handling.
120  *
121  * PCOPY  src,dst               Copy PointerStor
122  * PDROP  pstor                 Drop contents of pstor and zero (PREL+ZERO)
123  * PREF   pstor                 Ref the pstor's refstor
124  * PREL   pstor                 Rel the pstor's refstor
125  * LVDROP lvstor                Same for LValueStor
126  * LVREF  lvstor
127  * LVREL  lvstor
128  * PRSGET pstor,cptr            Extract refstor from pstor & ref (1)
129  * LVRSGET lvstor,cptr          Extract refstor from lvs & ref (1)
130  * RSPUT  cptr                  Release the refstor
131  * PCHECK cptr,pstor            Bounds check raw pointer against pstor bounds
132  *
133  * NOTE(1) - Target must be a CVoidPtrType
134  */
135 #define INSN_PCOPY      (0x0033 | INSNF_LEAS | INSNF_LEAD)
136 #define INSN_PDROP      (0x0034 | INSNF_LEAS)
137 #define INSN_PREF       (0x0035 | INSNF_LEAS)
138 #define INSN_PREL       (0x0036 | INSNF_LEAS)
139 #define INSN_LVDROP     (0x0037 | INSNF_LEAS)
140 #define INSN_LVREF      (0x0038 | INSNF_LEAS)
141 #define INSN_LVREL      (0x0039 | INSNF_LEAS)
142 #define INSN_PRSGET     (0x003A | INSNF_LEAS | INSNF_PTRD)
143 #define INSN_LVRSGET    (0x003B | INSNF_LEAS | INSNF_PTRD)
144 #define INSN_RSPUT      (0x003C | INSNF_PTRS)
145 #define INSN_PCHECK     (0x003D | INSNF_PTRS | INSNF_LEAD)
146
147 /*
148  * CALL target,argea,retea
149  */
150 #define INSN_BND_TRAP   (0x0040)
151 #define INSN_CALL       (0x0041 | INSNF_LEAS | INSNF_LEAM | INSNF_LEAD | \
152                                   INSNF_UNSIZED)
153 #define INSN_RET        (0x0042)
154 #define INSN_LINK       (0x0043)
155
156 /*
157  * TEST_EQ - Test if equals zero        (If B3, test (a & b))
158  * TEST_NE - Test if not equals zero    (If B3, test (a & b))
159  */
160 #define INSN_TEST_EQ    (0x004F | INSNF_COND)
161 #define INSN_TEST_NE    (0x014F | INSNF_COND)
162
163 #define INSN_FMOVE      (0x0080 | INSNF_FLOAT)
164 #define INSN_FADD       (0x0081 | INSNF_FLOAT)
165 #define INSN_FSUB       (0x0082 | INSNF_FLOAT)
166 #define INSN_FMUL       (0x0083 | INSNF_FLOAT)
167 #define INSN_FDIV       (0x0084 | INSNF_FLOAT)
168
169 #define INSN_FINC       (0x0090 | INSNF_FLOAT)
170 #define INSN_FDEC       (0x0091 | INSNF_FLOAT)
171 #define INSN_FNEG       (0x0092 | INSNF_FLOAT)
172 #define INSN_FPOS       (0x0093 | INSNF_FLOAT)
173 #define INSN_FNOT       (0x0094 | INSNF_FLOAT)
174
175 /*
176  * *ITOF        [s/u]integer to float
177  * FTOI*        float to [s/u]integer
178  * CASTF        float to float
179  */
180 #define INSN_UITOF      (0x0096 | INSNF_CAST | INSNF_FLOAT | INSNF_SSIZE)
181 #define INSN_SITOF      (0x0097 | INSNF_CAST | INSNF_FLOAT | INSNF_SSIZE)
182 #define INSN_FTOUI      (0x0098 | INSNF_CAST | INSNF_FLOAT | INSNF_SSIZE)
183 #define INSN_FTOSI      (0x0099 | INSNF_CAST | INSNF_FLOAT | INSNF_SSIZE)
184 #define INSN_CASTF      (0x009A | INSNF_CAST | INSNF_FLOAT | INSNF_SSIZE)
185
186 #define INSN_FCMP_UEQ   (0x009F | INSNF_COND | INSNF_FLOAT)
187 #define INSN_FCMP_UGT   (0x029F | INSNF_COND | INSNF_FLOAT)
188 #define INSN_FCMP_UGE   (0x039F | INSNF_COND | INSNF_FLOAT)
189 #define INSN_FCMP_ULT   (0x049F | INSNF_COND | INSNF_FLOAT)
190 #define INSN_FCMP_ULE   (0x059F | INSNF_COND | INSNF_FLOAT)
191 #define INSN_FCMP_UNE   (0x019F | INSNF_COND | INSNF_FLOAT)
192