4 * (c)Copyright 2015, Matthew Dillon, All Rights Reserved. See the
5 * COPYRIGHT file at the base of the distribution.
9 * Control bits determine capabilities and restrictions.
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 */
32 * Instructions (12 bits | flags)
34 * Note that some instruction codes are repeated with different flags.
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)
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)
59 #define INSN_INC (0x0016)
60 #define INSN_DEC (0x0017)
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)
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.
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)
87 * NOTE: BZERO uses the passed-in destination type alignment for optimizations.
89 #define INSN_BCOPY (0x0028 | INSNF_UNSIZED | INSNF_LEAM | INSNF_LEAD)
90 #define INSN_BZERO (0x0029 | INSNF_UNSIZED | INSNF_LEAD)
92 #define INSN_CMPTYPE (0x002A | INSNF_COND | INSNF_LEAS | INSNF_LEAM)
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)
109 * Casts - signed/unsigned/pointer specification is for source.
111 * CAST* [s/u]integer<->integer
112 * CASTP pointer -> integer
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)
119 * PointerStor, LValueStor, and RefStor handling.
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
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
133 * NOTE(1) - Target must be a CVoidPtrType
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)
148 * CALL target,argea,retea
150 #define INSN_BND_TRAP (0x0040)
151 #define INSN_CALL (0x0041 | INSNF_LEAS | INSNF_LEAM | INSNF_LEAD | \
153 #define INSN_RET (0x0042)
154 #define INSN_LINK (0x0043)
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))
160 #define INSN_TEST_EQ (0x004F | INSNF_COND)
161 #define INSN_TEST_NE (0x014F | INSNF_COND)
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)
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)
176 * *ITOF [s/u]integer to float
177 * FTOI* float to [s/u]integer
178 * CASTF float to float
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)
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)