1 package x86_64
2
3 import (
4 `fmt`
5 )
6
7
8 type Register interface {
9 fmt.Stringer
10 implRegister()
11 }
12
13 type (
14 Register8 byte
15 Register16 byte
16 Register32 byte
17 Register64 byte
18 )
19
20 type (
21 KRegister byte
22 MMRegister byte
23 XMMRegister byte
24 YMMRegister byte
25 ZMMRegister byte
26 )
27
28
29 type RegisterMask struct {
30 Z bool
31 K KRegister
32 }
33
34
35 func (self RegisterMask) String() string {
36 if !self.Z {
37 return fmt.Sprintf("{%%%s}", self.K)
38 } else {
39 return fmt.Sprintf("{%%%s}{z}", self.K)
40 }
41 }
42
43
44 type MaskedRegister struct {
45 Reg Register
46 Mask RegisterMask
47 }
48
49
50 func (self MaskedRegister) String() string {
51 return self.Reg.String() + self.Mask.String()
52 }
53
54 const (
55 AL Register8 = iota
56 CL
57 DL
58 BL
59 SPL
60 BPL
61 SIL
62 DIL
63 R8b
64 R9b
65 R10b
66 R11b
67 R12b
68 R13b
69 R14b
70 R15b
71 )
72
73 const (
74 AH = SPL | 0x80
75 CH = BPL | 0x80
76 DH = SIL | 0x80
77 BH = DIL | 0x80
78 )
79
80 const (
81 AX Register16 = iota
82 CX
83 DX
84 BX
85 SP
86 BP
87 SI
88 DI
89 R8w
90 R9w
91 R10w
92 R11w
93 R12w
94 R13w
95 R14w
96 R15w
97 )
98
99 const (
100 EAX Register32 = iota
101 ECX
102 EDX
103 EBX
104 ESP
105 EBP
106 ESI
107 EDI
108 R8d
109 R9d
110 R10d
111 R11d
112 R12d
113 R13d
114 R14d
115 R15d
116 )
117
118 const (
119 RAX Register64 = iota
120 RCX
121 RDX
122 RBX
123 RSP
124 RBP
125 RSI
126 RDI
127 R8
128 R9
129 R10
130 R11
131 R12
132 R13
133 R14
134 R15
135 )
136
137 const (
138 K0 KRegister = iota
139 K1
140 K2
141 K3
142 K4
143 K5
144 K6
145 K7
146 )
147
148 const (
149 MM0 MMRegister = iota
150 MM1
151 MM2
152 MM3
153 MM4
154 MM5
155 MM6
156 MM7
157 )
158
159 const (
160 XMM0 XMMRegister = iota
161 XMM1
162 XMM2
163 XMM3
164 XMM4
165 XMM5
166 XMM6
167 XMM7
168 XMM8
169 XMM9
170 XMM10
171 XMM11
172 XMM12
173 XMM13
174 XMM14
175 XMM15
176 XMM16
177 XMM17
178 XMM18
179 XMM19
180 XMM20
181 XMM21
182 XMM22
183 XMM23
184 XMM24
185 XMM25
186 XMM26
187 XMM27
188 XMM28
189 XMM29
190 XMM30
191 XMM31
192 )
193
194 const (
195 YMM0 YMMRegister = iota
196 YMM1
197 YMM2
198 YMM3
199 YMM4
200 YMM5
201 YMM6
202 YMM7
203 YMM8
204 YMM9
205 YMM10
206 YMM11
207 YMM12
208 YMM13
209 YMM14
210 YMM15
211 YMM16
212 YMM17
213 YMM18
214 YMM19
215 YMM20
216 YMM21
217 YMM22
218 YMM23
219 YMM24
220 YMM25
221 YMM26
222 YMM27
223 YMM28
224 YMM29
225 YMM30
226 YMM31
227 )
228
229 const (
230 ZMM0 ZMMRegister = iota
231 ZMM1
232 ZMM2
233 ZMM3
234 ZMM4
235 ZMM5
236 ZMM6
237 ZMM7
238 ZMM8
239 ZMM9
240 ZMM10
241 ZMM11
242 ZMM12
243 ZMM13
244 ZMM14
245 ZMM15
246 ZMM16
247 ZMM17
248 ZMM18
249 ZMM19
250 ZMM20
251 ZMM21
252 ZMM22
253 ZMM23
254 ZMM24
255 ZMM25
256 ZMM26
257 ZMM27
258 ZMM28
259 ZMM29
260 ZMM30
261 ZMM31
262 )
263
264 func (self Register8) implRegister() {}
265 func (self Register16) implRegister() {}
266 func (self Register32) implRegister() {}
267 func (self Register64) implRegister() {}
268
269 func (self KRegister) implRegister() {}
270 func (self MMRegister) implRegister() {}
271 func (self XMMRegister) implRegister() {}
272 func (self YMMRegister) implRegister() {}
273 func (self ZMMRegister) implRegister() {}
274
275 func (self Register8) String() string { if int(self) >= len(r8names) { return "???" } else { return r8names[self] } }
276 func (self Register16) String() string { if int(self) >= len(r16names) { return "???" } else { return r16names[self] } }
277 func (self Register32) String() string { if int(self) >= len(r32names) { return "???" } else { return r32names[self] } }
278 func (self Register64) String() string { if int(self) >= len(r64names) { return "???" } else { return r64names[self] } }
279
280 func (self KRegister) String() string { if int(self) >= len(knames) { return "???" } else { return knames[self] } }
281 func (self MMRegister) String() string { if int(self) >= len(mmnames) { return "???" } else { return mmnames[self] } }
282 func (self XMMRegister) String() string { if int(self) >= len(xmmnames) { return "???" } else { return xmmnames[self] } }
283 func (self YMMRegister) String() string { if int(self) >= len(ymmnames) { return "???" } else { return ymmnames[self] } }
284 func (self ZMMRegister) String() string { if int(self) >= len(zmmnames) { return "???" } else { return zmmnames[self] } }
285
286
287 var Registers = map[string]Register {
288 "al" : AL,
289 "cl" : CL,
290 "dl" : DL,
291 "bl" : BL,
292 "spl" : SPL,
293 "bpl" : BPL,
294 "sil" : SIL,
295 "dil" : DIL,
296 "r8b" : R8b,
297 "r9b" : R9b,
298 "r10b" : R10b,
299 "r11b" : R11b,
300 "r12b" : R12b,
301 "r13b" : R13b,
302 "r14b" : R14b,
303 "r15b" : R15b,
304 "ah" : AH,
305 "ch" : CH,
306 "dh" : DH,
307 "bh" : BH,
308 "ax" : AX,
309 "cx" : CX,
310 "dx" : DX,
311 "bx" : BX,
312 "sp" : SP,
313 "bp" : BP,
314 "si" : SI,
315 "di" : DI,
316 "r8w" : R8w,
317 "r9w" : R9w,
318 "r10w" : R10w,
319 "r11w" : R11w,
320 "r12w" : R12w,
321 "r13w" : R13w,
322 "r14w" : R14w,
323 "r15w" : R15w,
324 "eax" : EAX,
325 "ecx" : ECX,
326 "edx" : EDX,
327 "ebx" : EBX,
328 "esp" : ESP,
329 "ebp" : EBP,
330 "esi" : ESI,
331 "edi" : EDI,
332 "r8d" : R8d,
333 "r9d" : R9d,
334 "r10d" : R10d,
335 "r11d" : R11d,
336 "r12d" : R12d,
337 "r13d" : R13d,
338 "r14d" : R14d,
339 "r15d" : R15d,
340 "rax" : RAX,
341 "rcx" : RCX,
342 "rdx" : RDX,
343 "rbx" : RBX,
344 "rsp" : RSP,
345 "rbp" : RBP,
346 "rsi" : RSI,
347 "rdi" : RDI,
348 "r8" : R8,
349 "r9" : R9,
350 "r10" : R10,
351 "r11" : R11,
352 "r12" : R12,
353 "r13" : R13,
354 "r14" : R14,
355 "r15" : R15,
356 "k0" : K0,
357 "k1" : K1,
358 "k2" : K2,
359 "k3" : K3,
360 "k4" : K4,
361 "k5" : K5,
362 "k6" : K6,
363 "k7" : K7,
364 "mm0" : MM0,
365 "mm1" : MM1,
366 "mm2" : MM2,
367 "mm3" : MM3,
368 "mm4" : MM4,
369 "mm5" : MM5,
370 "mm6" : MM6,
371 "mm7" : MM7,
372 "xmm0" : XMM0,
373 "xmm1" : XMM1,
374 "xmm2" : XMM2,
375 "xmm3" : XMM3,
376 "xmm4" : XMM4,
377 "xmm5" : XMM5,
378 "xmm6" : XMM6,
379 "xmm7" : XMM7,
380 "xmm8" : XMM8,
381 "xmm9" : XMM9,
382 "xmm10" : XMM10,
383 "xmm11" : XMM11,
384 "xmm12" : XMM12,
385 "xmm13" : XMM13,
386 "xmm14" : XMM14,
387 "xmm15" : XMM15,
388 "xmm16" : XMM16,
389 "xmm17" : XMM17,
390 "xmm18" : XMM18,
391 "xmm19" : XMM19,
392 "xmm20" : XMM20,
393 "xmm21" : XMM21,
394 "xmm22" : XMM22,
395 "xmm23" : XMM23,
396 "xmm24" : XMM24,
397 "xmm25" : XMM25,
398 "xmm26" : XMM26,
399 "xmm27" : XMM27,
400 "xmm28" : XMM28,
401 "xmm29" : XMM29,
402 "xmm30" : XMM30,
403 "xmm31" : XMM31,
404 "ymm0" : YMM0,
405 "ymm1" : YMM1,
406 "ymm2" : YMM2,
407 "ymm3" : YMM3,
408 "ymm4" : YMM4,
409 "ymm5" : YMM5,
410 "ymm6" : YMM6,
411 "ymm7" : YMM7,
412 "ymm8" : YMM8,
413 "ymm9" : YMM9,
414 "ymm10" : YMM10,
415 "ymm11" : YMM11,
416 "ymm12" : YMM12,
417 "ymm13" : YMM13,
418 "ymm14" : YMM14,
419 "ymm15" : YMM15,
420 "ymm16" : YMM16,
421 "ymm17" : YMM17,
422 "ymm18" : YMM18,
423 "ymm19" : YMM19,
424 "ymm20" : YMM20,
425 "ymm21" : YMM21,
426 "ymm22" : YMM22,
427 "ymm23" : YMM23,
428 "ymm24" : YMM24,
429 "ymm25" : YMM25,
430 "ymm26" : YMM26,
431 "ymm27" : YMM27,
432 "ymm28" : YMM28,
433 "ymm29" : YMM29,
434 "ymm30" : YMM30,
435 "ymm31" : YMM31,
436 "zmm0" : ZMM0,
437 "zmm1" : ZMM1,
438 "zmm2" : ZMM2,
439 "zmm3" : ZMM3,
440 "zmm4" : ZMM4,
441 "zmm5" : ZMM5,
442 "zmm6" : ZMM6,
443 "zmm7" : ZMM7,
444 "zmm8" : ZMM8,
445 "zmm9" : ZMM9,
446 "zmm10" : ZMM10,
447 "zmm11" : ZMM11,
448 "zmm12" : ZMM12,
449 "zmm13" : ZMM13,
450 "zmm14" : ZMM14,
451 "zmm15" : ZMM15,
452 "zmm16" : ZMM16,
453 "zmm17" : ZMM17,
454 "zmm18" : ZMM18,
455 "zmm19" : ZMM19,
456 "zmm20" : ZMM20,
457 "zmm21" : ZMM21,
458 "zmm22" : ZMM22,
459 "zmm23" : ZMM23,
460 "zmm24" : ZMM24,
461 "zmm25" : ZMM25,
462 "zmm26" : ZMM26,
463 "zmm27" : ZMM27,
464 "zmm28" : ZMM28,
465 "zmm29" : ZMM29,
466 "zmm30" : ZMM30,
467 "zmm31" : ZMM31,
468 }
469
470
471
472 var r8names = [...]string {
473 AL : "al",
474 CL : "cl",
475 DL : "dl",
476 BL : "bl",
477 SPL : "spl",
478 BPL : "bpl",
479 SIL : "sil",
480 DIL : "dil",
481 R8b : "r8b",
482 R9b : "r9b",
483 R10b : "r10b",
484 R11b : "r11b",
485 R12b : "r12b",
486 R13b : "r13b",
487 R14b : "r14b",
488 R15b : "r15b",
489 AH : "ah",
490 CH : "ch",
491 DH : "dh",
492 BH : "bh",
493 }
494
495 var r16names = [...]string {
496 AX : "ax",
497 CX : "cx",
498 DX : "dx",
499 BX : "bx",
500 SP : "sp",
501 BP : "bp",
502 SI : "si",
503 DI : "di",
504 R8w : "r8w",
505 R9w : "r9w",
506 R10w : "r10w",
507 R11w : "r11w",
508 R12w : "r12w",
509 R13w : "r13w",
510 R14w : "r14w",
511 R15w : "r15w",
512 }
513
514 var r32names = [...]string {
515 EAX : "eax",
516 ECX : "ecx",
517 EDX : "edx",
518 EBX : "ebx",
519 ESP : "esp",
520 EBP : "ebp",
521 ESI : "esi",
522 EDI : "edi",
523 R8d : "r8d",
524 R9d : "r9d",
525 R10d : "r10d",
526 R11d : "r11d",
527 R12d : "r12d",
528 R13d : "r13d",
529 R14d : "r14d",
530 R15d : "r15d",
531 }
532
533 var r64names = [...]string {
534 RAX : "rax",
535 RCX : "rcx",
536 RDX : "rdx",
537 RBX : "rbx",
538 RSP : "rsp",
539 RBP : "rbp",
540 RSI : "rsi",
541 RDI : "rdi",
542 R8 : "r8",
543 R9 : "r9",
544 R10 : "r10",
545 R11 : "r11",
546 R12 : "r12",
547 R13 : "r13",
548 R14 : "r14",
549 R15 : "r15",
550 }
551
552 var knames = [...]string {
553 K0: "k0",
554 K1: "k1",
555 K2: "k2",
556 K3: "k3",
557 K4: "k4",
558 K5: "k5",
559 K6: "k6",
560 K7: "k7",
561 }
562
563 var mmnames = [...]string {
564 MM0: "mm0",
565 MM1: "mm1",
566 MM2: "mm2",
567 MM3: "mm3",
568 MM4: "mm4",
569 MM5: "mm5",
570 MM6: "mm6",
571 MM7: "mm7",
572 }
573
574 var xmmnames = [...]string {
575 XMM0 : "xmm0",
576 XMM1 : "xmm1",
577 XMM2 : "xmm2",
578 XMM3 : "xmm3",
579 XMM4 : "xmm4",
580 XMM5 : "xmm5",
581 XMM6 : "xmm6",
582 XMM7 : "xmm7",
583 XMM8 : "xmm8",
584 XMM9 : "xmm9",
585 XMM10 : "xmm10",
586 XMM11 : "xmm11",
587 XMM12 : "xmm12",
588 XMM13 : "xmm13",
589 XMM14 : "xmm14",
590 XMM15 : "xmm15",
591 XMM16 : "xmm16",
592 XMM17 : "xmm17",
593 XMM18 : "xmm18",
594 XMM19 : "xmm19",
595 XMM20 : "xmm20",
596 XMM21 : "xmm21",
597 XMM22 : "xmm22",
598 XMM23 : "xmm23",
599 XMM24 : "xmm24",
600 XMM25 : "xmm25",
601 XMM26 : "xmm26",
602 XMM27 : "xmm27",
603 XMM28 : "xmm28",
604 XMM29 : "xmm29",
605 XMM30 : "xmm30",
606 XMM31 : "xmm31",
607 }
608
609 var ymmnames = [...]string {
610 YMM0 : "ymm0",
611 YMM1 : "ymm1",
612 YMM2 : "ymm2",
613 YMM3 : "ymm3",
614 YMM4 : "ymm4",
615 YMM5 : "ymm5",
616 YMM6 : "ymm6",
617 YMM7 : "ymm7",
618 YMM8 : "ymm8",
619 YMM9 : "ymm9",
620 YMM10 : "ymm10",
621 YMM11 : "ymm11",
622 YMM12 : "ymm12",
623 YMM13 : "ymm13",
624 YMM14 : "ymm14",
625 YMM15 : "ymm15",
626 YMM16 : "ymm16",
627 YMM17 : "ymm17",
628 YMM18 : "ymm18",
629 YMM19 : "ymm19",
630 YMM20 : "ymm20",
631 YMM21 : "ymm21",
632 YMM22 : "ymm22",
633 YMM23 : "ymm23",
634 YMM24 : "ymm24",
635 YMM25 : "ymm25",
636 YMM26 : "ymm26",
637 YMM27 : "ymm27",
638 YMM28 : "ymm28",
639 YMM29 : "ymm29",
640 YMM30 : "ymm30",
641 YMM31 : "ymm31",
642 }
643
644 var zmmnames = [...]string {
645 ZMM0 : "zmm0",
646 ZMM1 : "zmm1",
647 ZMM2 : "zmm2",
648 ZMM3 : "zmm3",
649 ZMM4 : "zmm4",
650 ZMM5 : "zmm5",
651 ZMM6 : "zmm6",
652 ZMM7 : "zmm7",
653 ZMM8 : "zmm8",
654 ZMM9 : "zmm9",
655 ZMM10 : "zmm10",
656 ZMM11 : "zmm11",
657 ZMM12 : "zmm12",
658 ZMM13 : "zmm13",
659 ZMM14 : "zmm14",
660 ZMM15 : "zmm15",
661 ZMM16 : "zmm16",
662 ZMM17 : "zmm17",
663 ZMM18 : "zmm18",
664 ZMM19 : "zmm19",
665 ZMM20 : "zmm20",
666 ZMM21 : "zmm21",
667 ZMM22 : "zmm22",
668 ZMM23 : "zmm23",
669 ZMM24 : "zmm24",
670 ZMM25 : "zmm25",
671 ZMM26 : "zmm26",
672 ZMM27 : "zmm27",
673 ZMM28 : "zmm28",
674 ZMM29 : "zmm29",
675 ZMM30 : "zmm30",
676 ZMM31 : "zmm31",
677 }
678
View as plain text