Source file src/cmd/vendor/golang.org/x/arch/riscv64/riscv64asm/inst.go

     1  // Copyright 2024 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package riscv64asm
     6  
     7  import (
     8  	"fmt"
     9  	"strings"
    10  )
    11  
    12  // An Op is a RISC-V opcode.
    13  type Op uint16
    14  
    15  // NOTE: The actual Op values are defined in tables.go.
    16  func (op Op) String() string {
    17  	if op >= Op(len(opstr)) || opstr[op] == "" {
    18  		return fmt.Sprintf("Op(%d)", op)
    19  	}
    20  
    21  	return opstr[op]
    22  }
    23  
    24  // An Arg is a single instruction argument.
    25  type Arg interface {
    26  	String() string
    27  }
    28  
    29  // An Args holds the instruction arguments.
    30  // If an instruction has fewer than 6 arguments,
    31  // the final elements in the array are nil.
    32  type Args [6]Arg
    33  
    34  // An Inst is a single instruction.
    35  type Inst struct {
    36  	Op   Op     // Opcode mnemonic.
    37  	Enc  uint32 // Raw encoding bits.
    38  	Args Args   // Instruction arguments, in RISC-V mamual order.
    39  	Len  int    // Length of encoded instruction in bytes
    40  }
    41  
    42  func (i Inst) String() string {
    43  	var args []string
    44  	for _, arg := range i.Args {
    45  		if arg == nil {
    46  			break
    47  		}
    48  		args = append(args, arg.String())
    49  	}
    50  
    51  	if len(args) == 0 {
    52  		return i.Op.String()
    53  	}
    54  	return i.Op.String() + " " + strings.Join(args, ",")
    55  }
    56  
    57  // A Reg is a single register.
    58  // The zero value denotes X0, not the absence of a register.
    59  type Reg uint16
    60  
    61  const (
    62  	// General-purpose registers
    63  	X0 Reg = iota
    64  	X1
    65  	X2
    66  	X3
    67  	X4
    68  	X5
    69  	X6
    70  	X7
    71  	X8
    72  	X9
    73  	X10
    74  	X11
    75  	X12
    76  	X13
    77  	X14
    78  	X15
    79  	X16
    80  	X17
    81  	X18
    82  	X19
    83  	X20
    84  	X21
    85  	X22
    86  	X23
    87  	X24
    88  	X25
    89  	X26
    90  	X27
    91  	X28
    92  	X29
    93  	X30
    94  	X31
    95  
    96  	// Floating point registers
    97  	F0
    98  	F1
    99  	F2
   100  	F3
   101  	F4
   102  	F5
   103  	F6
   104  	F7
   105  	F8
   106  	F9
   107  	F10
   108  	F11
   109  	F12
   110  	F13
   111  	F14
   112  	F15
   113  	F16
   114  	F17
   115  	F18
   116  	F19
   117  	F20
   118  	F21
   119  	F22
   120  	F23
   121  	F24
   122  	F25
   123  	F26
   124  	F27
   125  	F28
   126  	F29
   127  	F30
   128  	F31
   129  
   130  	// Vector registers
   131  	V0
   132  	V1
   133  	V2
   134  	V3
   135  	V4
   136  	V5
   137  	V6
   138  	V7
   139  	V8
   140  	V9
   141  	V10
   142  	V11
   143  	V12
   144  	V13
   145  	V14
   146  	V15
   147  	V16
   148  	V17
   149  	V18
   150  	V19
   151  	V20
   152  	V21
   153  	V22
   154  	V23
   155  	V24
   156  	V25
   157  	V26
   158  	V27
   159  	V28
   160  	V29
   161  	V30
   162  	V31
   163  )
   164  
   165  func (r Reg) String() string {
   166  	switch {
   167  	case r >= X0 && r <= X31:
   168  		return fmt.Sprintf("x%d", r)
   169  
   170  	case r >= F0 && r <= F31:
   171  		return fmt.Sprintf("f%d", r-F0)
   172  
   173  	case r >= V0 && r <= V31:
   174  		return fmt.Sprintf("v%d", r-V0)
   175  
   176  	default:
   177  		return fmt.Sprintf("Unknown(%d)", r)
   178  	}
   179  }
   180  
   181  // A CSR is a single control and status register.
   182  // Use stringer to generate CSR match table.
   183  //
   184  //go:generate stringer -type=CSR
   185  type CSR uint16
   186  
   187  const (
   188  	// Control status register
   189  	USTATUS        CSR = 0x0000
   190  	FFLAGS         CSR = 0x0001
   191  	FRM            CSR = 0x0002
   192  	FCSR           CSR = 0x0003
   193  	UIE            CSR = 0x0004
   194  	UTVEC          CSR = 0x0005
   195  	UTVT           CSR = 0x0007
   196  	VSTART         CSR = 0x0008
   197  	VXSAT          CSR = 0x0009
   198  	VXRM           CSR = 0x000a
   199  	VCSR           CSR = 0x000f
   200  	USCRATCH       CSR = 0x0040
   201  	UEPC           CSR = 0x0041
   202  	UCAUSE         CSR = 0x0042
   203  	UTVAL          CSR = 0x0043
   204  	UIP            CSR = 0x0044
   205  	UNXTI          CSR = 0x0045
   206  	UINTSTATUS     CSR = 0x0046
   207  	USCRATCHCSW    CSR = 0x0048
   208  	USCRATCHCSWL   CSR = 0x0049
   209  	SSTATUS        CSR = 0x0100
   210  	SEDELEG        CSR = 0x0102
   211  	SIDELEG        CSR = 0x0103
   212  	SIE            CSR = 0x0104
   213  	STVEC          CSR = 0x0105
   214  	SCOUNTEREN     CSR = 0x0106
   215  	STVT           CSR = 0x0107
   216  	SSCRATCH       CSR = 0x0140
   217  	SEPC           CSR = 0x0141
   218  	SCAUSE         CSR = 0x0142
   219  	STVAL          CSR = 0x0143
   220  	SIP            CSR = 0x0144
   221  	SNXTI          CSR = 0x0145
   222  	SINTSTATUS     CSR = 0x0146
   223  	SSCRATCHCSW    CSR = 0x0148
   224  	SSCRATCHCSWL   CSR = 0x0149
   225  	SATP           CSR = 0x0180
   226  	VSSTATUS       CSR = 0x0200
   227  	VSIE           CSR = 0x0204
   228  	VSTVEC         CSR = 0x0205
   229  	VSSCRATCH      CSR = 0x0240
   230  	VSEPC          CSR = 0x0241
   231  	VSCAUSE        CSR = 0x0242
   232  	VSTVAL         CSR = 0x0243
   233  	VSIP           CSR = 0x0244
   234  	VSATP          CSR = 0x0280
   235  	MSTATUS        CSR = 0x0300
   236  	MISA           CSR = 0x0301
   237  	MEDELEG        CSR = 0x0302
   238  	MIDELEG        CSR = 0x0303
   239  	MIE            CSR = 0x0304
   240  	MTVEC          CSR = 0x0305
   241  	MCOUNTEREN     CSR = 0x0306
   242  	MTVT           CSR = 0x0307
   243  	MSTATUSH       CSR = 0x0310
   244  	MCOUNTINHIBIT  CSR = 0x0320
   245  	MHPMEVENT3     CSR = 0x0323
   246  	MHPMEVENT4     CSR = 0x0324
   247  	MHPMEVENT5     CSR = 0x0325
   248  	MHPMEVENT6     CSR = 0x0326
   249  	MHPMEVENT7     CSR = 0x0327
   250  	MHPMEVENT8     CSR = 0x0328
   251  	MHPMEVENT9     CSR = 0x0329
   252  	MHPMEVENT10    CSR = 0x032a
   253  	MHPMEVENT11    CSR = 0x032b
   254  	MHPMEVENT12    CSR = 0x032c
   255  	MHPMEVENT13    CSR = 0x032d
   256  	MHPMEVENT14    CSR = 0x032e
   257  	MHPMEVENT15    CSR = 0x032f
   258  	MHPMEVENT16    CSR = 0x0330
   259  	MHPMEVENT17    CSR = 0x0331
   260  	MHPMEVENT18    CSR = 0x0332
   261  	MHPMEVENT19    CSR = 0x0333
   262  	MHPMEVENT20    CSR = 0x0334
   263  	MHPMEVENT21    CSR = 0x0335
   264  	MHPMEVENT22    CSR = 0x0336
   265  	MHPMEVENT23    CSR = 0x0337
   266  	MHPMEVENT24    CSR = 0x0338
   267  	MHPMEVENT25    CSR = 0x0339
   268  	MHPMEVENT26    CSR = 0x033a
   269  	MHPMEVENT27    CSR = 0x033b
   270  	MHPMEVENT28    CSR = 0x033c
   271  	MHPMEVENT29    CSR = 0x033d
   272  	MHPMEVENT30    CSR = 0x033e
   273  	MHPMEVENT31    CSR = 0x033f
   274  	MSCRATCH       CSR = 0x0340
   275  	MEPC           CSR = 0x0341
   276  	MCAUSE         CSR = 0x0342
   277  	MTVAL          CSR = 0x0343
   278  	MIP            CSR = 0x0344
   279  	MNXTI          CSR = 0x0345
   280  	MINTSTATUS     CSR = 0x0346
   281  	MSCRATCHCSW    CSR = 0x0348
   282  	MSCRATCHCSWL   CSR = 0x0349
   283  	MTINST         CSR = 0x034a
   284  	MTVAL2         CSR = 0x034b
   285  	PMPCFG0        CSR = 0x03a0
   286  	PMPCFG1        CSR = 0x03a1
   287  	PMPCFG2        CSR = 0x03a2
   288  	PMPCFG3        CSR = 0x03a3
   289  	PMPADDR0       CSR = 0x03b0
   290  	PMPADDR1       CSR = 0x03b1
   291  	PMPADDR2       CSR = 0x03b2
   292  	PMPADDR3       CSR = 0x03b3
   293  	PMPADDR4       CSR = 0x03b4
   294  	PMPADDR5       CSR = 0x03b5
   295  	PMPADDR6       CSR = 0x03b6
   296  	PMPADDR7       CSR = 0x03b7
   297  	PMPADDR8       CSR = 0x03b8
   298  	PMPADDR9       CSR = 0x03b9
   299  	PMPADDR10      CSR = 0x03ba
   300  	PMPADDR11      CSR = 0x03bb
   301  	PMPADDR12      CSR = 0x03bc
   302  	PMPADDR13      CSR = 0x03bd
   303  	PMPADDR14      CSR = 0x03be
   304  	PMPADDR15      CSR = 0x03bf
   305  	HSTATUS        CSR = 0x0600
   306  	HEDELEG        CSR = 0x0602
   307  	HIDELEG        CSR = 0x0603
   308  	HIE            CSR = 0x0604
   309  	HTIMEDELTA     CSR = 0x0605
   310  	HCOUNTEREN     CSR = 0x0606
   311  	HGEIE          CSR = 0x0607
   312  	HTIMEDELTAH    CSR = 0x0615
   313  	HTVAL          CSR = 0x0643
   314  	HIP            CSR = 0x0644
   315  	HVIP           CSR = 0x0645
   316  	HTINST         CSR = 0x064a
   317  	HGATP          CSR = 0x0680
   318  	TSELECT        CSR = 0x07a0
   319  	TDATA1         CSR = 0x07a1
   320  	TDATA2         CSR = 0x07a2
   321  	TDATA3         CSR = 0x07a3
   322  	TINFO          CSR = 0x07a4
   323  	TCONTROL       CSR = 0x07a5
   324  	MCONTEXT       CSR = 0x07a8
   325  	MNOISE         CSR = 0x07a9
   326  	SCONTEXT       CSR = 0x07aa
   327  	DCSR           CSR = 0x07b0
   328  	DPC            CSR = 0x07b1
   329  	DSCRATCH0      CSR = 0x07b2
   330  	DSCRATCH1      CSR = 0x07b3
   331  	MCYCLE         CSR = 0x0b00
   332  	MINSTRET       CSR = 0x0b02
   333  	MHPMCOUNTER3   CSR = 0x0b03
   334  	MHPMCOUNTER4   CSR = 0x0b04
   335  	MHPMCOUNTER5   CSR = 0x0b05
   336  	MHPMCOUNTER6   CSR = 0x0b06
   337  	MHPMCOUNTER7   CSR = 0x0b07
   338  	MHPMCOUNTER8   CSR = 0x0b08
   339  	MHPMCOUNTER9   CSR = 0x0b09
   340  	MHPMCOUNTER10  CSR = 0x0b0a
   341  	MHPMCOUNTER11  CSR = 0x0b0b
   342  	MHPMCOUNTER12  CSR = 0x0b0c
   343  	MHPMCOUNTER13  CSR = 0x0b0d
   344  	MHPMCOUNTER14  CSR = 0x0b0e
   345  	MHPMCOUNTER15  CSR = 0x0b0f
   346  	MHPMCOUNTER16  CSR = 0x0b10
   347  	MHPMCOUNTER17  CSR = 0x0b11
   348  	MHPMCOUNTER18  CSR = 0x0b12
   349  	MHPMCOUNTER19  CSR = 0x0b13
   350  	MHPMCOUNTER20  CSR = 0x0b14
   351  	MHPMCOUNTER21  CSR = 0x0b15
   352  	MHPMCOUNTER22  CSR = 0x0b16
   353  	MHPMCOUNTER23  CSR = 0x0b17
   354  	MHPMCOUNTER24  CSR = 0x0b18
   355  	MHPMCOUNTER25  CSR = 0x0b19
   356  	MHPMCOUNTER26  CSR = 0x0b1a
   357  	MHPMCOUNTER27  CSR = 0x0b1b
   358  	MHPMCOUNTER28  CSR = 0x0b1c
   359  	MHPMCOUNTER29  CSR = 0x0b1d
   360  	MHPMCOUNTER30  CSR = 0x0b1e
   361  	MHPMCOUNTER31  CSR = 0x0b1f
   362  	MCYCLEH        CSR = 0x0b80
   363  	MINSTRETH      CSR = 0x0b82
   364  	MHPMCOUNTER3H  CSR = 0x0b83
   365  	MHPMCOUNTER4H  CSR = 0x0b84
   366  	MHPMCOUNTER5H  CSR = 0x0b85
   367  	MHPMCOUNTER6H  CSR = 0x0b86
   368  	MHPMCOUNTER7H  CSR = 0x0b87
   369  	MHPMCOUNTER8H  CSR = 0x0b88
   370  	MHPMCOUNTER9H  CSR = 0x0b89
   371  	MHPMCOUNTER10H CSR = 0x0b8a
   372  	MHPMCOUNTER11H CSR = 0x0b8b
   373  	MHPMCOUNTER12H CSR = 0x0b8c
   374  	MHPMCOUNTER13H CSR = 0x0b8d
   375  	MHPMCOUNTER14H CSR = 0x0b8e
   376  	MHPMCOUNTER15H CSR = 0x0b8f
   377  	MHPMCOUNTER16H CSR = 0x0b90
   378  	MHPMCOUNTER17H CSR = 0x0b91
   379  	MHPMCOUNTER18H CSR = 0x0b92
   380  	MHPMCOUNTER19H CSR = 0x0b93
   381  	MHPMCOUNTER20H CSR = 0x0b94
   382  	MHPMCOUNTER21H CSR = 0x0b95
   383  	MHPMCOUNTER22H CSR = 0x0b96
   384  	MHPMCOUNTER23H CSR = 0x0b97
   385  	MHPMCOUNTER24H CSR = 0x0b98
   386  	MHPMCOUNTER25H CSR = 0x0b99
   387  	MHPMCOUNTER26H CSR = 0x0b9a
   388  	MHPMCOUNTER27H CSR = 0x0b9b
   389  	MHPMCOUNTER28H CSR = 0x0b9c
   390  	MHPMCOUNTER29H CSR = 0x0b9d
   391  	MHPMCOUNTER30H CSR = 0x0b9e
   392  	MHPMCOUNTER31H CSR = 0x0b9f
   393  	CYCLE          CSR = 0x0c00
   394  	TIME           CSR = 0x0c01
   395  	INSTRET        CSR = 0x0c02
   396  	HPMCOUNTER3    CSR = 0x0c03
   397  	HPMCOUNTER4    CSR = 0x0c04
   398  	HPMCOUNTER5    CSR = 0x0c05
   399  	HPMCOUNTER6    CSR = 0x0c06
   400  	HPMCOUNTER7    CSR = 0x0c07
   401  	HPMCOUNTER8    CSR = 0x0c08
   402  	HPMCOUNTER9    CSR = 0x0c09
   403  	HPMCOUNTER10   CSR = 0x0c0a
   404  	HPMCOUNTER11   CSR = 0x0c0b
   405  	HPMCOUNTER12   CSR = 0x0c0c
   406  	HPMCOUNTER13   CSR = 0x0c0d
   407  	HPMCOUNTER14   CSR = 0x0c0e
   408  	HPMCOUNTER15   CSR = 0x0c0f
   409  	HPMCOUNTER16   CSR = 0x0c10
   410  	HPMCOUNTER17   CSR = 0x0c11
   411  	HPMCOUNTER18   CSR = 0x0c12
   412  	HPMCOUNTER19   CSR = 0x0c13
   413  	HPMCOUNTER20   CSR = 0x0c14
   414  	HPMCOUNTER21   CSR = 0x0c15
   415  	HPMCOUNTER22   CSR = 0x0c16
   416  	HPMCOUNTER23   CSR = 0x0c17
   417  	HPMCOUNTER24   CSR = 0x0c18
   418  	HPMCOUNTER25   CSR = 0x0c19
   419  	HPMCOUNTER26   CSR = 0x0c1a
   420  	HPMCOUNTER27   CSR = 0x0c1b
   421  	HPMCOUNTER28   CSR = 0x0c1c
   422  	HPMCOUNTER29   CSR = 0x0c1d
   423  	HPMCOUNTER30   CSR = 0x0c1e
   424  	HPMCOUNTER31   CSR = 0x0c1f
   425  	VL             CSR = 0x0c20
   426  	VTYPE          CSR = 0x0c21
   427  	VLENB          CSR = 0x0c22
   428  	CYCLEH         CSR = 0x0c80
   429  	TIMEH          CSR = 0x0c81
   430  	INSTRETH       CSR = 0x0c82
   431  	HPMCOUNTER3H   CSR = 0x0c83
   432  	HPMCOUNTER4H   CSR = 0x0c84
   433  	HPMCOUNTER5H   CSR = 0x0c85
   434  	HPMCOUNTER6H   CSR = 0x0c86
   435  	HPMCOUNTER7H   CSR = 0x0c87
   436  	HPMCOUNTER8H   CSR = 0x0c88
   437  	HPMCOUNTER9H   CSR = 0x0c89
   438  	HPMCOUNTER10H  CSR = 0x0c8a
   439  	HPMCOUNTER11H  CSR = 0x0c8b
   440  	HPMCOUNTER12H  CSR = 0x0c8c
   441  	HPMCOUNTER13H  CSR = 0x0c8d
   442  	HPMCOUNTER14H  CSR = 0x0c8e
   443  	HPMCOUNTER15H  CSR = 0x0c8f
   444  	HPMCOUNTER16H  CSR = 0x0c90
   445  	HPMCOUNTER17H  CSR = 0x0c91
   446  	HPMCOUNTER18H  CSR = 0x0c92
   447  	HPMCOUNTER19H  CSR = 0x0c93
   448  	HPMCOUNTER20H  CSR = 0x0c94
   449  	HPMCOUNTER21H  CSR = 0x0c95
   450  	HPMCOUNTER22H  CSR = 0x0c96
   451  	HPMCOUNTER23H  CSR = 0x0c97
   452  	HPMCOUNTER24H  CSR = 0x0c98
   453  	HPMCOUNTER25H  CSR = 0x0c99
   454  	HPMCOUNTER26H  CSR = 0x0c9a
   455  	HPMCOUNTER27H  CSR = 0x0c9b
   456  	HPMCOUNTER28H  CSR = 0x0c9c
   457  	HPMCOUNTER29H  CSR = 0x0c9d
   458  	HPMCOUNTER30H  CSR = 0x0c9e
   459  	HPMCOUNTER31H  CSR = 0x0c9f
   460  	HGEIP          CSR = 0x0e12
   461  	MVENDORID      CSR = 0x0f11
   462  	MARCHID        CSR = 0x0f12
   463  	MIMPID         CSR = 0x0f13
   464  	MHARTID        CSR = 0x0f14
   465  	MENTROPY       CSR = 0x0f15
   466  )
   467  
   468  // An Uimm is an unsigned immediate number
   469  type Uimm struct {
   470  	Imm     uint32 // 32-bit unsigned integer
   471  	Decimal bool   // Print format of the immediate, either decimal or hexadecimal
   472  }
   473  
   474  func (ui Uimm) String() string {
   475  	if ui.Decimal {
   476  		return fmt.Sprintf("%d", ui.Imm)
   477  	}
   478  	return fmt.Sprintf("%#x", ui.Imm)
   479  }
   480  
   481  // A Simm is a signed immediate number
   482  type Simm struct {
   483  	Imm     int32 // 32-bit signed integer
   484  	Decimal bool  // Print format of the immediate, either decimal or hexadecimal
   485  	Width   uint8 // Actual width of the Simm
   486  }
   487  
   488  func (si Simm) String() string {
   489  	if si.Decimal {
   490  		return fmt.Sprintf("%d", si.Imm)
   491  	}
   492  	return fmt.Sprintf("%#x", si.Imm)
   493  }
   494  
   495  // A RegPtr is an address register with no offset
   496  type RegPtr struct {
   497  	reg Reg // Avoid promoted String method
   498  }
   499  
   500  func (regPtr RegPtr) String() string {
   501  	return fmt.Sprintf("(%s)", regPtr.reg)
   502  }
   503  
   504  // A RegOffset is a register with offset value
   505  type RegOffset struct {
   506  	OfsReg Reg
   507  	Ofs    Simm
   508  }
   509  
   510  func (regofs RegOffset) String() string {
   511  	return fmt.Sprintf("%s(%s)", regofs.Ofs, regofs.OfsReg)
   512  }
   513  
   514  // A MemOrder is a memory order hint in fence instruction
   515  type MemOrder uint8
   516  
   517  func (memOrder MemOrder) String() string {
   518  	var str string
   519  	if memOrder<<7>>7 == 1 {
   520  		str += "i"
   521  	}
   522  	if memOrder>>1<<7>>7 == 1 {
   523  		str += "o"
   524  	}
   525  	if memOrder>>2<<7>>7 == 1 {
   526  		str += "r"
   527  	}
   528  	if memOrder>>3<<7>>7 == 1 {
   529  		str += "w"
   530  	}
   531  	return str
   532  }
   533  
   534  // A VType represents the vtype field of VSETIVLI and VSETVLI instructions
   535  type VType uint32
   536  
   537  var vlmulName = []string{"M1", "M2", "M4", "M8", "", "MF8", "MF4", "MF2"}
   538  var vsewName = []string{"E8", "E16", "E32", "E64", "", "", "", ""}
   539  var vtaName = []string{"TU", "TA"}
   540  var vmaName = []string{"MU", "MA"}
   541  
   542  func (vtype VType) String() string {
   543  
   544  	vlmul := vtype & 0x7
   545  	vsew := (vtype >> 3) & 0x7
   546  	vta := (vtype >> 6) & 0x1
   547  	vma := (vtype >> 7) & 0x1
   548  
   549  	return fmt.Sprintf("%s, %s, %s, %s", vsewName[vsew], vlmulName[vlmul], vtaName[vta], vmaName[vma])
   550  }
   551  

View as plain text