registers.go raw
1 //
2 // Copyright 2024 CloudWeGo Authors
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 package x86_64
18
19 import (
20 "fmt"
21 )
22
23 // Register represents a hardware register.
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 // RegisterMask is a KRegister used to mask another register.
45 type RegisterMask struct {
46 Z bool
47 K KRegister
48 }
49
50 // String implements the fmt.Stringer interface.
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 // MaskedRegister is a Register masked by a RegisterMask.
60 type MaskedRegister struct {
61 Reg Register
62 Mask RegisterMask
63 }
64
65 // String implements the fmt.Stringer interface.
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 {
292 if int(self) >= len(r8names) {
293 return "???"
294 } else {
295 return r8names[self]
296 }
297 }
298 func (self Register16) String() string {
299 if int(self) >= len(r16names) {
300 return "???"
301 } else {
302 return r16names[self]
303 }
304 }
305 func (self Register32) String() string {
306 if int(self) >= len(r32names) {
307 return "???"
308 } else {
309 return r32names[self]
310 }
311 }
312 func (self Register64) String() string {
313 if int(self) >= len(r64names) {
314 return "???"
315 } else {
316 return r64names[self]
317 }
318 }
319
320 func (self KRegister) String() string {
321 if int(self) >= len(knames) {
322 return "???"
323 } else {
324 return knames[self]
325 }
326 }
327 func (self MMRegister) String() string {
328 if int(self) >= len(mmnames) {
329 return "???"
330 } else {
331 return mmnames[self]
332 }
333 }
334 func (self XMMRegister) String() string {
335 if int(self) >= len(xmmnames) {
336 return "???"
337 } else {
338 return xmmnames[self]
339 }
340 }
341 func (self YMMRegister) String() string {
342 if int(self) >= len(ymmnames) {
343 return "???"
344 } else {
345 return ymmnames[self]
346 }
347 }
348 func (self ZMMRegister) String() string {
349 if int(self) >= len(zmmnames) {
350 return "???"
351 } else {
352 return zmmnames[self]
353 }
354 }
355
356 // Registers maps register name into Register instances.
357 var Registers = map[string]Register{
358 "al": AL,
359 "cl": CL,
360 "dl": DL,
361 "bl": BL,
362 "spl": SPL,
363 "bpl": BPL,
364 "sil": SIL,
365 "dil": DIL,
366 "r8b": R8b,
367 "r9b": R9b,
368 "r10b": R10b,
369 "r11b": R11b,
370 "r12b": R12b,
371 "r13b": R13b,
372 "r14b": R14b,
373 "r15b": R15b,
374 "ah": AH,
375 "ch": CH,
376 "dh": DH,
377 "bh": BH,
378 "ax": AX,
379 "cx": CX,
380 "dx": DX,
381 "bx": BX,
382 "sp": SP,
383 "bp": BP,
384 "si": SI,
385 "di": DI,
386 "r8w": R8w,
387 "r9w": R9w,
388 "r10w": R10w,
389 "r11w": R11w,
390 "r12w": R12w,
391 "r13w": R13w,
392 "r14w": R14w,
393 "r15w": R15w,
394 "eax": EAX,
395 "ecx": ECX,
396 "edx": EDX,
397 "ebx": EBX,
398 "esp": ESP,
399 "ebp": EBP,
400 "esi": ESI,
401 "edi": EDI,
402 "r8d": R8d,
403 "r9d": R9d,
404 "r10d": R10d,
405 "r11d": R11d,
406 "r12d": R12d,
407 "r13d": R13d,
408 "r14d": R14d,
409 "r15d": R15d,
410 "rax": RAX,
411 "rcx": RCX,
412 "rdx": RDX,
413 "rbx": RBX,
414 "rsp": RSP,
415 "rbp": RBP,
416 "rsi": RSI,
417 "rdi": RDI,
418 "r8": R8,
419 "r9": R9,
420 "r10": R10,
421 "r11": R11,
422 "r12": R12,
423 "r13": R13,
424 "r14": R14,
425 "r15": R15,
426 "k0": K0,
427 "k1": K1,
428 "k2": K2,
429 "k3": K3,
430 "k4": K4,
431 "k5": K5,
432 "k6": K6,
433 "k7": K7,
434 "mm0": MM0,
435 "mm1": MM1,
436 "mm2": MM2,
437 "mm3": MM3,
438 "mm4": MM4,
439 "mm5": MM5,
440 "mm6": MM6,
441 "mm7": MM7,
442 "xmm0": XMM0,
443 "xmm1": XMM1,
444 "xmm2": XMM2,
445 "xmm3": XMM3,
446 "xmm4": XMM4,
447 "xmm5": XMM5,
448 "xmm6": XMM6,
449 "xmm7": XMM7,
450 "xmm8": XMM8,
451 "xmm9": XMM9,
452 "xmm10": XMM10,
453 "xmm11": XMM11,
454 "xmm12": XMM12,
455 "xmm13": XMM13,
456 "xmm14": XMM14,
457 "xmm15": XMM15,
458 "xmm16": XMM16,
459 "xmm17": XMM17,
460 "xmm18": XMM18,
461 "xmm19": XMM19,
462 "xmm20": XMM20,
463 "xmm21": XMM21,
464 "xmm22": XMM22,
465 "xmm23": XMM23,
466 "xmm24": XMM24,
467 "xmm25": XMM25,
468 "xmm26": XMM26,
469 "xmm27": XMM27,
470 "xmm28": XMM28,
471 "xmm29": XMM29,
472 "xmm30": XMM30,
473 "xmm31": XMM31,
474 "ymm0": YMM0,
475 "ymm1": YMM1,
476 "ymm2": YMM2,
477 "ymm3": YMM3,
478 "ymm4": YMM4,
479 "ymm5": YMM5,
480 "ymm6": YMM6,
481 "ymm7": YMM7,
482 "ymm8": YMM8,
483 "ymm9": YMM9,
484 "ymm10": YMM10,
485 "ymm11": YMM11,
486 "ymm12": YMM12,
487 "ymm13": YMM13,
488 "ymm14": YMM14,
489 "ymm15": YMM15,
490 "ymm16": YMM16,
491 "ymm17": YMM17,
492 "ymm18": YMM18,
493 "ymm19": YMM19,
494 "ymm20": YMM20,
495 "ymm21": YMM21,
496 "ymm22": YMM22,
497 "ymm23": YMM23,
498 "ymm24": YMM24,
499 "ymm25": YMM25,
500 "ymm26": YMM26,
501 "ymm27": YMM27,
502 "ymm28": YMM28,
503 "ymm29": YMM29,
504 "ymm30": YMM30,
505 "ymm31": YMM31,
506 "zmm0": ZMM0,
507 "zmm1": ZMM1,
508 "zmm2": ZMM2,
509 "zmm3": ZMM3,
510 "zmm4": ZMM4,
511 "zmm5": ZMM5,
512 "zmm6": ZMM6,
513 "zmm7": ZMM7,
514 "zmm8": ZMM8,
515 "zmm9": ZMM9,
516 "zmm10": ZMM10,
517 "zmm11": ZMM11,
518 "zmm12": ZMM12,
519 "zmm13": ZMM13,
520 "zmm14": ZMM14,
521 "zmm15": ZMM15,
522 "zmm16": ZMM16,
523 "zmm17": ZMM17,
524 "zmm18": ZMM18,
525 "zmm19": ZMM19,
526 "zmm20": ZMM20,
527 "zmm21": ZMM21,
528 "zmm22": ZMM22,
529 "zmm23": ZMM23,
530 "zmm24": ZMM24,
531 "zmm25": ZMM25,
532 "zmm26": ZMM26,
533 "zmm27": ZMM27,
534 "zmm28": ZMM28,
535 "zmm29": ZMM29,
536 "zmm30": ZMM30,
537 "zmm31": ZMM31,
538 }
539
540 /** Register Name Tables **/
541
542 var r8names = [...]string{
543 AL: "al",
544 CL: "cl",
545 DL: "dl",
546 BL: "bl",
547 SPL: "spl",
548 BPL: "bpl",
549 SIL: "sil",
550 DIL: "dil",
551 R8b: "r8b",
552 R9b: "r9b",
553 R10b: "r10b",
554 R11b: "r11b",
555 R12b: "r12b",
556 R13b: "r13b",
557 R14b: "r14b",
558 R15b: "r15b",
559 AH: "ah",
560 CH: "ch",
561 DH: "dh",
562 BH: "bh",
563 }
564
565 var r16names = [...]string{
566 AX: "ax",
567 CX: "cx",
568 DX: "dx",
569 BX: "bx",
570 SP: "sp",
571 BP: "bp",
572 SI: "si",
573 DI: "di",
574 R8w: "r8w",
575 R9w: "r9w",
576 R10w: "r10w",
577 R11w: "r11w",
578 R12w: "r12w",
579 R13w: "r13w",
580 R14w: "r14w",
581 R15w: "r15w",
582 }
583
584 var r32names = [...]string{
585 EAX: "eax",
586 ECX: "ecx",
587 EDX: "edx",
588 EBX: "ebx",
589 ESP: "esp",
590 EBP: "ebp",
591 ESI: "esi",
592 EDI: "edi",
593 R8d: "r8d",
594 R9d: "r9d",
595 R10d: "r10d",
596 R11d: "r11d",
597 R12d: "r12d",
598 R13d: "r13d",
599 R14d: "r14d",
600 R15d: "r15d",
601 }
602
603 var r64names = [...]string{
604 RAX: "rax",
605 RCX: "rcx",
606 RDX: "rdx",
607 RBX: "rbx",
608 RSP: "rsp",
609 RBP: "rbp",
610 RSI: "rsi",
611 RDI: "rdi",
612 R8: "r8",
613 R9: "r9",
614 R10: "r10",
615 R11: "r11",
616 R12: "r12",
617 R13: "r13",
618 R14: "r14",
619 R15: "r15",
620 }
621
622 var knames = [...]string{
623 K0: "k0",
624 K1: "k1",
625 K2: "k2",
626 K3: "k3",
627 K4: "k4",
628 K5: "k5",
629 K6: "k6",
630 K7: "k7",
631 }
632
633 var mmnames = [...]string{
634 MM0: "mm0",
635 MM1: "mm1",
636 MM2: "mm2",
637 MM3: "mm3",
638 MM4: "mm4",
639 MM5: "mm5",
640 MM6: "mm6",
641 MM7: "mm7",
642 }
643
644 var xmmnames = [...]string{
645 XMM0: "xmm0",
646 XMM1: "xmm1",
647 XMM2: "xmm2",
648 XMM3: "xmm3",
649 XMM4: "xmm4",
650 XMM5: "xmm5",
651 XMM6: "xmm6",
652 XMM7: "xmm7",
653 XMM8: "xmm8",
654 XMM9: "xmm9",
655 XMM10: "xmm10",
656 XMM11: "xmm11",
657 XMM12: "xmm12",
658 XMM13: "xmm13",
659 XMM14: "xmm14",
660 XMM15: "xmm15",
661 XMM16: "xmm16",
662 XMM17: "xmm17",
663 XMM18: "xmm18",
664 XMM19: "xmm19",
665 XMM20: "xmm20",
666 XMM21: "xmm21",
667 XMM22: "xmm22",
668 XMM23: "xmm23",
669 XMM24: "xmm24",
670 XMM25: "xmm25",
671 XMM26: "xmm26",
672 XMM27: "xmm27",
673 XMM28: "xmm28",
674 XMM29: "xmm29",
675 XMM30: "xmm30",
676 XMM31: "xmm31",
677 }
678
679 var ymmnames = [...]string{
680 YMM0: "ymm0",
681 YMM1: "ymm1",
682 YMM2: "ymm2",
683 YMM3: "ymm3",
684 YMM4: "ymm4",
685 YMM5: "ymm5",
686 YMM6: "ymm6",
687 YMM7: "ymm7",
688 YMM8: "ymm8",
689 YMM9: "ymm9",
690 YMM10: "ymm10",
691 YMM11: "ymm11",
692 YMM12: "ymm12",
693 YMM13: "ymm13",
694 YMM14: "ymm14",
695 YMM15: "ymm15",
696 YMM16: "ymm16",
697 YMM17: "ymm17",
698 YMM18: "ymm18",
699 YMM19: "ymm19",
700 YMM20: "ymm20",
701 YMM21: "ymm21",
702 YMM22: "ymm22",
703 YMM23: "ymm23",
704 YMM24: "ymm24",
705 YMM25: "ymm25",
706 YMM26: "ymm26",
707 YMM27: "ymm27",
708 YMM28: "ymm28",
709 YMM29: "ymm29",
710 YMM30: "ymm30",
711 YMM31: "ymm31",
712 }
713
714 var zmmnames = [...]string{
715 ZMM0: "zmm0",
716 ZMM1: "zmm1",
717 ZMM2: "zmm2",
718 ZMM3: "zmm3",
719 ZMM4: "zmm4",
720 ZMM5: "zmm5",
721 ZMM6: "zmm6",
722 ZMM7: "zmm7",
723 ZMM8: "zmm8",
724 ZMM9: "zmm9",
725 ZMM10: "zmm10",
726 ZMM11: "zmm11",
727 ZMM12: "zmm12",
728 ZMM13: "zmm13",
729 ZMM14: "zmm14",
730 ZMM15: "zmm15",
731 ZMM16: "zmm16",
732 ZMM17: "zmm17",
733 ZMM18: "zmm18",
734 ZMM19: "zmm19",
735 ZMM20: "zmm20",
736 ZMM21: "zmm21",
737 ZMM22: "zmm22",
738 ZMM23: "zmm23",
739 ZMM24: "zmm24",
740 ZMM25: "zmm25",
741 ZMM26: "zmm26",
742 ZMM27: "zmm27",
743 ZMM28: "zmm28",
744 ZMM29: "zmm29",
745 ZMM30: "zmm30",
746 ZMM31: "zmm31",
747 }
748