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