...

Source file src/github.com/cloudwego/iasm/x86_64/registers.go

Documentation: github.com/cloudwego/iasm/x86_64

     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  }
   694  

View as plain text