1use lazy_static::lazy_static;
3
4use crate::common::Size;
5use super::ast::{RegId, RegFamily};
6
7use self::RegId::*;
8use crate::common::Size::*;
9
10use std::collections::HashMap;
11
12pub const PREFIXES: [&str; 12] = [
14 "lock",
15 "rep",
16 "repe",
17 "repz",
18 "repne",
19 "repnz",
20 "ss",
21 "cs",
22 "ds",
23 "es",
24 "fs",
25 "gs",
26];
27
28pub const X86_SIZES: [(&str, Size); 9] = [
30 ("BYTE", BYTE),
31 ("WORD", WORD),
32 ("DWORD", DWORD),
33 ("AWORD", DWORD),
34 ("FWORD", FWORD),
35 ("QWORD", QWORD),
36 ("TWORD", PWORD),
37 ("OWORD", OWORD),
38 ("YWORD", HWORD)
39];
40
41pub const X64_SIZES: [(&str, Size); 9] = [
43 ("BYTE", BYTE),
44 ("WORD", WORD),
45 ("DWORD", DWORD),
46 ("FWORD", FWORD),
47 ("AWORD", QWORD),
48 ("QWORD", QWORD),
49 ("TWORD", PWORD),
50 ("OWORD", OWORD),
51 ("YWORD", HWORD)
52];
53
54pub const X64_REGISTERS: &[(&str, (RegId, Size))] = &[
55 ("rax", (RAX, QWORD)),
56 ("r0" , (RAX, QWORD)),
57 ("rcx", (RCX, QWORD)),
58 ("r1" , (RCX, QWORD)),
59 ("rdx", (RDX, QWORD)),
60 ("r2" , (RDX, QWORD)),
61 ("rbx", (RBX, QWORD)),
62 ("r3" , (RBX, QWORD)),
63 ("rsp", (RSP, QWORD)),
64 ("r4" , (RSP, QWORD)),
65 ("rbp", (RBP, QWORD)),
66 ("r5" , (RBP, QWORD)),
67 ("rsi", (RSI, QWORD)),
68 ("r6" , (RSI, QWORD)),
69 ("rdi", (RDI, QWORD)),
70 ("r7" , (RDI, QWORD)),
71 ("r8" , (R8, QWORD)),
72 ("r9" , (R9, QWORD)),
73 ("r10", (R10, QWORD)),
74 ("r11", (R11, QWORD)),
75 ("r12", (R12, QWORD)),
76 ("r13", (R13, QWORD)),
77 ("r14", (R14, QWORD)),
78 ("r15", (R15, QWORD)),
79
80 ("eax" , (RAX, DWORD)),
81 ("r0d" , (RAX, DWORD)),
82 ("ecx" , (RCX, DWORD)),
83 ("r1d" , (RCX, DWORD)),
84 ("edx" , (RDX, DWORD)),
85 ("r2d" , (RDX, DWORD)),
86 ("ebx" , (RBX, DWORD)),
87 ("r3d" , (RBX, DWORD)),
88 ("esp" , (RSP, DWORD)),
89 ("r4d" , (RSP, DWORD)),
90 ("ebp" , (RBP, DWORD)),
91 ("r5d" , (RBP, DWORD)),
92 ("esi" , (RSI, DWORD)),
93 ("r6d" , (RSI, DWORD)),
94 ("edi" , (RDI, DWORD)),
95 ("r7d" , (RDI, DWORD)),
96 ("r8d" , (R8, DWORD)),
97 ("r9d" , (R9, DWORD)),
98 ("r10d", (R10, DWORD)),
99 ("r11d", (R11, DWORD)),
100 ("r12d", (R12, DWORD)),
101 ("r13d", (R13, DWORD)),
102 ("r14d", (R14, DWORD)),
103 ("r15d", (R15, DWORD)),
104
105 ("ax" , (RAX, WORD)),
106 ("r0w" , (RAX, WORD)),
107 ("cx" , (RCX, WORD)),
108 ("r1w" , (RCX, WORD)),
109 ("dx" , (RDX, WORD)),
110 ("r2w" , (RDX, WORD)),
111 ("bx" , (RBX, WORD)),
112 ("r3w" , (RBX, WORD)),
113 ("sp" , (RSP, WORD)),
114 ("r4w" , (RSP, WORD)),
115 ("bp" , (RBP, WORD)),
116 ("r5w" , (RBP, WORD)),
117 ("si" , (RSI, WORD)),
118 ("r6w" , (RSI, WORD)),
119 ("di" , (RDI, WORD)),
120 ("r7w" , (RDI, WORD)),
121 ("r8w" , (R8, WORD)),
122 ("r9w" , (R9, WORD)),
123 ("r10w", (R10, WORD)),
124 ("r11w", (R11, WORD)),
125 ("r12w", (R12, WORD)),
126 ("r13w", (R13, WORD)),
127 ("r14w", (R14, WORD)),
128 ("r15w", (R15, WORD)),
129
130 ("al" , (RAX, BYTE)),
131 ("r0b" , (RAX, BYTE)),
132 ("cl" , (RCX, BYTE)),
133 ("r1b" , (RCX, BYTE)),
134 ("dl" , (RDX, BYTE)),
135 ("r2b" , (RDX, BYTE)),
136 ("bl" , (RBX, BYTE)),
137 ("r3b" , (RBX, BYTE)),
138 ("spl" , (RSP, BYTE)),
139 ("r4b" , (RSP, BYTE)),
140 ("bpl" , (RBP, BYTE)),
141 ("r5b" , (RBP, BYTE)),
142 ("sil" , (RSI, BYTE)),
143 ("r6b" , (RSI, BYTE)),
144 ("dil" , (RDI, BYTE)),
145 ("r7b" , (RDI, BYTE)),
146 ("r8b" , (R8, BYTE)),
147 ("r9b" , (R9, BYTE)),
148 ("r10b", (R10, BYTE)),
149 ("r11b", (R11, BYTE)),
150 ("r12b", (R12, BYTE)),
151 ("r13b", (R13, BYTE)),
152 ("r14b", (R14, BYTE)),
153 ("r15b", (R15, BYTE)),
154
155 ("rip", (RIP, QWORD)),
156 ("eip", (RIP, DWORD)),
157
158 ("ah", (AH, BYTE)),
159 ("ch", (CH, BYTE)),
160 ("dh", (DH, BYTE)),
161 ("bh", (BH, BYTE)),
162
163 ("st0", (ST0, PWORD)),
164 ("st1", (ST1, PWORD)),
165 ("st2", (ST2, PWORD)),
166 ("st3", (ST3, PWORD)),
167 ("st4", (ST4, PWORD)),
168 ("st5", (ST5, PWORD)),
169 ("st6", (ST6, PWORD)),
170 ("st7", (ST7, PWORD)),
171
172 ("mm0", (MMX0, QWORD)),
173 ("mm1", (MMX1, QWORD)),
174 ("mm2", (MMX2, QWORD)),
175 ("mm3", (MMX3, QWORD)),
176 ("mm4", (MMX4, QWORD)),
177 ("mm5", (MMX5, QWORD)),
178 ("mm6", (MMX6, QWORD)),
179 ("mm7", (MMX7, QWORD)),
180
181 ("xmm0" , (XMM0 , OWORD)),
182 ("xmm1" , (XMM1 , OWORD)),
183 ("xmm2" , (XMM2 , OWORD)),
184 ("xmm3" , (XMM3 , OWORD)),
185 ("xmm4" , (XMM4 , OWORD)),
186 ("xmm5" , (XMM5 , OWORD)),
187 ("xmm6" , (XMM6 , OWORD)),
188 ("xmm7" , (XMM7 , OWORD)),
189 ("xmm8" , (XMM8 , OWORD)),
190 ("xmm9" , (XMM9 , OWORD)),
191 ("xmm10", (XMM10, OWORD)),
192 ("xmm11", (XMM11, OWORD)),
193 ("xmm12", (XMM12, OWORD)),
194 ("xmm13", (XMM13, OWORD)),
195 ("xmm14", (XMM14, OWORD)),
196 ("xmm15", (XMM15, OWORD)),
197
198 ("ymm0" , (XMM0 , HWORD)),
199 ("ymm1" , (XMM1 , HWORD)),
200 ("ymm2" , (XMM2 , HWORD)),
201 ("ymm3" , (XMM3 , HWORD)),
202 ("ymm4" , (XMM4 , HWORD)),
203 ("ymm5" , (XMM5 , HWORD)),
204 ("ymm6" , (XMM6 , HWORD)),
205 ("ymm7" , (XMM7 , HWORD)),
206 ("ymm8" , (XMM8 , HWORD)),
207 ("ymm9" , (XMM9 , HWORD)),
208 ("ymm10", (XMM10, HWORD)),
209 ("ymm11", (XMM11, HWORD)),
210 ("ymm12", (XMM12, HWORD)),
211 ("ymm13", (XMM13, HWORD)),
212 ("ymm14", (XMM14, HWORD)),
213 ("ymm15", (XMM15, HWORD)),
214
215 ("es", (ES, WORD)),
216 ("cs", (CS, WORD)),
217 ("ss", (SS, WORD)),
218 ("ds", (DS, WORD)),
219 ("fs", (FS, WORD)),
220 ("gs", (GS, WORD)),
221
222 ("cr0" , (CR0 , QWORD)),
223 ("cr1" , (CR1 , QWORD)),
224 ("cr2" , (CR2 , QWORD)),
225 ("cr3" , (CR3 , QWORD)),
226 ("cr4" , (CR4 , QWORD)),
227 ("cr5" , (CR5 , QWORD)),
228 ("cr6" , (CR6 , QWORD)),
229 ("cr7" , (CR7 , QWORD)),
230 ("cr8" , (CR8 , QWORD)),
231 ("cr9" , (CR9 , QWORD)),
232 ("cr10", (CR10, QWORD)),
233 ("cr11", (CR11, QWORD)),
234 ("cr12", (CR12, QWORD)),
235 ("cr13", (CR13, QWORD)),
236 ("cr14", (CR14, QWORD)),
237 ("cr15", (CR15, QWORD)),
238
239 ("dr0" , (DR0 , QWORD)),
240 ("dr1" , (DR1 , QWORD)),
241 ("dr2" , (DR2 , QWORD)),
242 ("dr3" , (DR3 , QWORD)),
243 ("dr4" , (DR4 , QWORD)),
244 ("dr5" , (DR5 , QWORD)),
245 ("dr6" , (DR6 , QWORD)),
246 ("dr7" , (DR7 , QWORD)),
247 ("dr8" , (DR8 , QWORD)),
248 ("dr9" , (DR9 , QWORD)),
249 ("dr10", (DR10, QWORD)),
250 ("dr11", (DR11, QWORD)),
251 ("dr12", (DR12, QWORD)),
252 ("dr13", (DR13, QWORD)),
253 ("dr14", (DR14, QWORD)),
254 ("dr15", (DR15, QWORD)),
255
256 ("bnd0", (BND0, OWORD)),
257 ("bnd1", (BND1, OWORD)),
258 ("bnd2", (BND2, OWORD)),
259 ("bnd3", (BND3, OWORD)),
260];
261
262static X86_REGISTERS: &[(&str, (RegId, Size))] = &[
263 ("eax", (RAX, DWORD)),
264 ("ecx", (RCX, DWORD)),
265 ("edx", (RDX, DWORD)),
266 ("ebx", (RBX, DWORD)),
267 ("esp", (RSP, DWORD)),
268 ("ebp", (RBP, DWORD)),
269 ("esi", (RSI, DWORD)),
270 ("edi", (RDI, DWORD)),
271
272 ("ax", (RAX, WORD)),
273 ("cx", (RCX, WORD)),
274 ("dx", (RDX, WORD)),
275 ("bx", (RBX, WORD)),
276 ("sp", (RSP, WORD)),
277 ("bp", (RBP, WORD)),
278 ("si", (RSI, WORD)),
279 ("di", (RDI, WORD)),
280
281 ("al", (RAX, BYTE)),
282 ("cl", (RCX, BYTE)),
283 ("dl", (RDX, BYTE)),
284 ("bl", (RBX, BYTE)),
285
286 ("eip", (RIP, DWORD)),
287
288 ("ah", (AH, BYTE)),
289 ("ch", (CH, BYTE)),
290 ("dh", (DH, BYTE)),
291 ("bh", (BH, BYTE)),
292
293 ("st0", (ST0, PWORD)),
294 ("st1", (ST1, PWORD)),
295 ("st2", (ST2, PWORD)),
296 ("st3", (ST3, PWORD)),
297 ("st4", (ST4, PWORD)),
298 ("st5", (ST5, PWORD)),
299 ("st6", (ST6, PWORD)),
300 ("st7", (ST7, PWORD)),
301
302 ("mm0", (MMX0, QWORD)),
303 ("mm1", (MMX1, QWORD)),
304 ("mm2", (MMX2, QWORD)),
305 ("mm3", (MMX3, QWORD)),
306 ("mm4", (MMX4, QWORD)),
307 ("mm5", (MMX5, QWORD)),
308 ("mm6", (MMX6, QWORD)),
309 ("mm7", (MMX7, QWORD)),
310
311 ("xmm0", (XMM0, OWORD)),
312 ("xmm1", (XMM1, OWORD)),
313 ("xmm2", (XMM2, OWORD)),
314 ("xmm3", (XMM3, OWORD)),
315 ("xmm4", (XMM4, OWORD)),
316 ("xmm5", (XMM5, OWORD)),
317 ("xmm6", (XMM6, OWORD)),
318 ("xmm7", (XMM7, OWORD)),
319
320 ("ymm0", (XMM0, HWORD)),
321 ("ymm1", (XMM1, HWORD)),
322 ("ymm2", (XMM2, HWORD)),
323 ("ymm3", (XMM3, HWORD)),
324 ("ymm4", (XMM4, HWORD)),
325 ("ymm5", (XMM5, HWORD)),
326 ("ymm6", (XMM6, HWORD)),
327 ("ymm7", (XMM7, HWORD)),
328
329 ("es", (ES, WORD)),
330 ("cs", (CS, WORD)),
331 ("ss", (SS, WORD)),
332 ("ds", (DS, WORD)),
333 ("fs", (FS, WORD)),
334 ("gs", (GS, WORD)),
335
336 ("cr0", (CR0, DWORD)),
337 ("cr1", (CR1, DWORD)),
338 ("cr2", (CR2, DWORD)),
339 ("cr3", (CR3, DWORD)),
340 ("cr4", (CR4, DWORD)),
341 ("cr5", (CR5, DWORD)),
342 ("cr6", (CR6, DWORD)),
343 ("cr7", (CR7, DWORD)),
344
345 ("dr0", (DR0, DWORD)),
346 ("dr1", (DR1, DWORD)),
347 ("dr2", (DR2, DWORD)),
348 ("dr3", (DR3, DWORD)),
349 ("dr4", (DR4, DWORD)),
350 ("dr5", (DR5, DWORD)),
351 ("dr6", (DR6, DWORD)),
352 ("dr7", (DR7, DWORD)),
353
354 ("bnd0", (BND0, OWORD)),
355 ("bnd1", (BND1, OWORD)),
356 ("bnd2", (BND2, OWORD)),
357 ("bnd3", (BND3, OWORD)),
358];
359
360pub const X64_FAMILIES: &[(&str, (Size, RegFamily))] = &[
361 ("Rb", (Size::BYTE, RegFamily::LEGACY)),
362 ("Rh", (Size::BYTE, RegFamily::HIGHBYTE)),
363 ("Rw", (Size::WORD, RegFamily::LEGACY)),
364 ("Rd", (Size::DWORD, RegFamily::LEGACY)),
365 ("Ra", (Size::QWORD, RegFamily::LEGACY)),
366 ("Rq", (Size::QWORD, RegFamily::LEGACY)),
367 ("Rf", (Size::PWORD, RegFamily::FP)),
368 ("Rm", (Size::QWORD, RegFamily::MMX)),
369 ("Rx", (Size::OWORD, RegFamily::XMM)),
370 ("Ry", (Size::HWORD, RegFamily::XMM)),
371 ("Rs", (Size::WORD, RegFamily::SEGMENT)),
372 ("RC", (Size::QWORD, RegFamily::CONTROL)),
373 ("RD", (Size::QWORD, RegFamily::DEBUG)),
374 ("RB", (Size::OWORD, RegFamily::BOUND)),
375];
376
377pub const X86_FAMILIES: &[(&str, (Size, RegFamily))] = &[
378 ("Rb",(Size::BYTE, RegFamily::LEGACY)),
379 ("Rh",(Size::BYTE, RegFamily::HIGHBYTE)),
380 ("Rw",(Size::WORD, RegFamily::LEGACY)),
381 ("Ra",(Size::DWORD, RegFamily::LEGACY)),
382 ("Rd",(Size::DWORD, RegFamily::LEGACY)),
383 ("Rf",(Size::PWORD, RegFamily::FP)),
384 ("Rm",(Size::QWORD, RegFamily::MMX)),
385 ("Rx",(Size::OWORD, RegFamily::XMM)),
386 ("Ry",(Size::HWORD, RegFamily::XMM)),
387 ("Rs",(Size::WORD, RegFamily::SEGMENT)),
388 ("RC",(Size::DWORD, RegFamily::CONTROL)),
389 ("RD",(Size::DWORD, RegFamily::DEBUG)),
390 ("RB",(Size::OWORD, RegFamily::BOUND)),
391];
392
393lazy_static!{
394 pub static ref X64_REGISTER_MAP: HashMap<&'static str, (RegId, Size)> = {
395 X64_REGISTERS.iter().cloned().collect()
396 };
397 pub static ref X86_REGISTERS_MAP: HashMap<&'static str, (RegId, Size)> = {
398 X86_REGISTERS.iter().cloned().collect()
399 };
400 pub static ref X64_FAMILIES_MAP: HashMap<&'static str, (Size, RegFamily)> = {
401 X64_FAMILIES.iter().cloned().collect()
402 };
403 pub static ref X86_FAMILIES_MAP: HashMap<&'static str, (Size, RegFamily)> = {
404 X86_FAMILIES.iter().cloned().collect()
405 };
406}