24 b00,b01,b02,b03,b04,b05,b06,b07, \ 25 b08,b09,b0a,b0b,b0c,b0d,b0e,b0f, \ 26 b10,b11,b12,b13,b14,b15,b16,b17, \ 27 b18,b19,b1a,b1b,b1c,b1d,b1e,b1f \ 29 (b00<<0x00)|(b01<<0x01)|(b02<<0x02)|(b03<<0x03)| \ 30 (b04<<0x04)|(b05<<0x05)|(b06<<0x06)|(b07<<0x07)| \ 31 (b08<<0x08)|(b09<<0x09)|(b0a<<0x0a)|(b0b<<0x0b)| \ 32 (b0c<<0x0c)|(b0d<<0x0d)|(b0e<<0x0e)|(b0f<<0x0f)| \ 33 (b10<<0x10)|(b11<<0x11)|(b12<<0x12)|(b13<<0x13)| \ 34 (b14<<0x14)|(b15<<0x15)|(b16<<0x16)|(b17<<0x17)| \ 35 (b18<<0x18)|(b19<<0x19)|(b1a<<0x1a)|(b1b<<0x1b)| \ 36 (b1c<<0x1c)|(b1d<<0x1d)|(b1e<<0x1e)|(b1f<<0x1f) \ 38 #define CHECK_TABLE(t, v) ((t[(v)>>5]>>((v)&0x1f))&1) 41 const static unsigned int prefix_t[] = {
43 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
44 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
45 BITMASK32(0,0,0,0,0,0,1,0, 0,0,0,0,0,0,1,0,
46 0,0,0,0,0,0,1,0, 0,0,0,0,0,0,1,0),
47 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
48 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
49 BITMASK32(0,0,0,0,1,1,1,1, 0,0,0,0,0,0,0,0,
50 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
51 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
52 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
53 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
54 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
55 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
56 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
57 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
58 1,0,1,1,0,0,0,0, 0,0,0,0,0,0,0,0)
60 #define CHECK_PREFIX(v) CHECK_TABLE(prefix_t, v) 63 #define CHECK_REX(v) (((v)>>4)==0x4) 64 #define CHECK_REXW(v) ((v)&0x08) 67 #define CHECK_IMM64(v) (((v)&0xf8)==0xb8) 70 #define CHECK_OFF64(v) ((v)==0xa1) 73 #define CHECK_PREFIX_66(v) ((v)==0x66) 76 #define CHECK_PREFIX_67(v) ((v)==0x67) 79 #define CHECK_0F(v) ((v)==0x0f) 82 #define CHECK_38(v) ((v)==0x38) 85 #define CHECK_3A(v) ((v)==0x3a) 88 const static unsigned int modrm3a_t[] = {
90 BITMASK32(1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
91 0,0,0,0,1,1,1,1, 1,1,1,1,0,1,1,1),
92 BITMASK32(1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,
93 1,1,1,1,0,0,0,0, 1,1,1,1,0,1,1,1),
94 BITMASK32(1,1,1,1,1,0,1,0, 1,1,1,1,1,0,0,0,
95 1,1,1,0,1,1,1,1, 0,0,0,0,1,1,1,1),
96 BITMASK32(1,1,1,1,0,0,1,1, 1,1,1,1,1,1,1,1,
97 0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1),
98 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
99 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
100 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
101 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
102 BITMASK32(0,0,0,0,0,0,0,0, 0,0,1,1,1,0,0,0,
103 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1),
104 BITMASK32(0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,
105 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0)
107 #define CHECK_MODRM3A(v) CHECK_TABLE(modrm3a_t, v) 110 const static unsigned int modrm38_t[] = {
112 BITMASK32(1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
113 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1),
114 BITMASK32(1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
115 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1),
116 BITMASK32(1,1,1,1,1,1,1,1, 0,0,0,0,1,1,1,1,
117 1,1,1,1,0,1,0,0, 1,1,1,1,1,1,1,1),
118 BITMASK32(0,0,0,0,1,1,1,0, 0,0,0,0,1,1,1,1,
119 0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1),
120 BITMASK32(1,1,1,1,1,0,1,1, 1,1,1,1,1,1,1,1,
121 1,1,1,1,0,0,1,1, 1,1,1,1,1,1,1,1),
122 BITMASK32(1,1,1,1,1,0,1,1, 1,1,1,1,1,1,1,1,
123 0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1),
124 BITMASK32(0,0,0,0,0,1,1,1, 1,1,1,1,1,1,0,0,
125 1,1,0,0,1,1,0,0, 0,0,0,1,1,1,1,1),
126 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
127 1,1,1,1,0,1,1,1, 0,0,0,0,0,0,0,0)
129 #define CHECK_MODRM38(v) CHECK_TABLE(modrm38_t, v) 132 const static unsigned int modrm2_t[] = {
134 BITMASK32(1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,
135 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1),
136 BITMASK32(1,1,1,1,0,0,0,0, 1,1,1,1,1,1,1,1,
137 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
138 BITMASK32(1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
139 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1),
140 BITMASK32(1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
141 1,0,0,0,1,1,1,0, 1,1,0,0,1,1,1,1),
142 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
143 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1),
144 BITMASK32(0,0,0,1,1,1,0,0, 0,0,0,1,1,1,0,1,
145 1,1,1,1,1,1,1,1, 1,0,1,1,1,1,1,1),
146 BITMASK32(1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,
147 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1),
148 BITMASK32(1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
149 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1)
151 #define CHECK_MODRM2(v) CHECK_TABLE(modrm2_t, v) 154 #define CHECK_DATA12(v) ((v)==0xa4||(v)==0xac||(v)==0xba) 157 #define CHECK_DATA662(v) (((v)&0xf0)==0x80) 160 const static unsigned int modrm_t[] = {
162 BITMASK32(1,1,1,1,0,0,0,0, 1,1,1,1,0,0,0,0,
163 1,1,1,1,0,0,0,0, 1,1,1,1,0,0,0,0),
164 BITMASK32(1,1,1,1,0,0,0,0, 1,1,1,1,0,0,0,0,
165 1,1,1,1,0,0,0,0, 1,1,1,1,0,0,0,0),
166 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
167 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
168 BITMASK32(0,0,1,1,0,0,0,0, 0,1,0,1,0,0,0,0,
169 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
170 BITMASK32(1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
171 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
172 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
173 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
174 BITMASK32(1,1,0,0,1,1,1,1, 0,0,0,0,0,0,0,0,
175 1,1,1,1,0,0,0,0, 1,1,1,1,1,1,1,1),
176 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
177 0,0,0,0,0,0,1,1, 0,0,0,0,0,0,1,1)
179 #define CHECK_MODRM(v) CHECK_TABLE(modrm_t, v) 182 #define CHECK_TEST(v) ((v)==0xf6||(v)==0xf7) 185 const static unsigned int data1_t[] = {
187 BITMASK32(0,0,0,0,1,0,0,0, 0,0,0,0,1,0,0,0,
188 0,0,0,0,1,0,0,0, 0,0,0,0,1,0,0,0),
189 BITMASK32(0,0,0,0,1,0,0,0, 0,0,0,0,1,0,0,0,
190 0,0,0,0,1,0,0,0, 0,0,0,0,1,0,0,0),
191 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
192 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
193 BITMASK32(0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,0,
194 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1),
195 BITMASK32(1,0,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,
196 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
197 BITMASK32(0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,
198 1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0),
199 BITMASK32(1,1,0,0,0,0,1,0, 1,0,0,0,0,1,0,0,
200 0,0,0,0,1,1,0,0, 0,0,0,0,0,0,0,0),
201 BITMASK32(1,1,1,1,1,1,1,1, 0,0,0,1,0,0,0,0,
202 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0)
204 #define CHECK_DATA1(v) CHECK_TABLE(data1_t, v) 207 const static unsigned int data2_t[] = {
209 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
210 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
211 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
212 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
213 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
214 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
215 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
216 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
217 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
218 0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0),
219 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
220 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
221 BITMASK32(0,0,1,0,0,0,0,0, 1,0,1,0,0,0,0,0,
222 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
223 BITMASK32(0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,
224 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0)
226 #define CHECK_DATA2(v) CHECK_TABLE(data2_t, v) 229 const static unsigned int data66_t[] = {
231 BITMASK32(0,0,0,0,0,1,0,0, 0,0,0,0,0,1,0,0,
232 0,0,0,0,0,1,0,0, 0,0,0,0,0,1,0,0),
233 BITMASK32(0,0,0,0,0,1,0,0, 0,0,0,0,0,1,0,0,
234 0,0,0,0,0,1,0,0, 0,0,0,0,0,1,0,0),
235 BITMASK32(0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
236 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
237 BITMASK32(0,0,0,0,0,0,0,0, 1,1,0,0,0,0,0,0,
238 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
239 BITMASK32(0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
240 0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0),
241 BITMASK32(0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,
242 0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1),
243 BITMASK32(0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,
244 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0),
245 BITMASK32(0,0,0,0,0,0,0,0, 1,1,1,0,0,0,0,0,
246 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0)
248 #define CHECK_DATA66(v) CHECK_TABLE(data66_t, v) 251 #define CHECK_MEM67(v) (((v)&0xfc)==0xa0)