...

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

Documentation: github.com/chenzhuoyu/iasm/x86_64

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

View as plain text