github.com/cloudwego/iasm@v0.2.0/x86_64/registers.go (about) 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 { 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 // Registers maps register name into Register instances. 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 /** Register Name Tables **/ 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 }