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