github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/obj/loong64/a.out.go (about)

     1  // Copyright 2022 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 loong64
     6  
     7  import (
     8  	"github.com/go-asm/go/cmd/obj"
     9  )
    10  
    11  //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p loong64
    12  
    13  const (
    14  	NSNAME = 8
    15  	NSYM   = 50
    16  	NREG   = 32 // number of general registers
    17  	NFREG  = 32 // number of floating point registers
    18  )
    19  
    20  const (
    21  	REG_R0 = obj.RBaseLOONG64 + iota // must be a multiple of 32
    22  	REG_R1
    23  	REG_R2
    24  	REG_R3
    25  	REG_R4
    26  	REG_R5
    27  	REG_R6
    28  	REG_R7
    29  	REG_R8
    30  	REG_R9
    31  	REG_R10
    32  	REG_R11
    33  	REG_R12
    34  	REG_R13
    35  	REG_R14
    36  	REG_R15
    37  	REG_R16
    38  	REG_R17
    39  	REG_R18
    40  	REG_R19
    41  	REG_R20
    42  	REG_R21
    43  	REG_R22
    44  	REG_R23
    45  	REG_R24
    46  	REG_R25
    47  	REG_R26
    48  	REG_R27
    49  	REG_R28
    50  	REG_R29
    51  	REG_R30
    52  	REG_R31
    53  
    54  	REG_F0 // must be a multiple of 32
    55  	REG_F1
    56  	REG_F2
    57  	REG_F3
    58  	REG_F4
    59  	REG_F5
    60  	REG_F6
    61  	REG_F7
    62  	REG_F8
    63  	REG_F9
    64  	REG_F10
    65  	REG_F11
    66  	REG_F12
    67  	REG_F13
    68  	REG_F14
    69  	REG_F15
    70  	REG_F16
    71  	REG_F17
    72  	REG_F18
    73  	REG_F19
    74  	REG_F20
    75  	REG_F21
    76  	REG_F22
    77  	REG_F23
    78  	REG_F24
    79  	REG_F25
    80  	REG_F26
    81  	REG_F27
    82  	REG_F28
    83  	REG_F29
    84  	REG_F30
    85  	REG_F31
    86  
    87  	REG_FCSR0 // must be a multiple of 32
    88  	REG_FCSR1
    89  	REG_FCSR2
    90  	REG_FCSR3 // only four registers are needed
    91  	REG_FCSR4
    92  	REG_FCSR5
    93  	REG_FCSR6
    94  	REG_FCSR7
    95  	REG_FCSR8
    96  	REG_FCSR9
    97  	REG_FCSR10
    98  	REG_FCSR11
    99  	REG_FCSR12
   100  	REG_FCSR13
   101  	REG_FCSR14
   102  	REG_FCSR15
   103  	REG_FCSR16
   104  	REG_FCSR17
   105  	REG_FCSR18
   106  	REG_FCSR19
   107  	REG_FCSR20
   108  	REG_FCSR21
   109  	REG_FCSR22
   110  	REG_FCSR23
   111  	REG_FCSR24
   112  	REG_FCSR25
   113  	REG_FCSR26
   114  	REG_FCSR27
   115  	REG_FCSR28
   116  	REG_FCSR29
   117  	REG_FCSR30
   118  	REG_FCSR31
   119  
   120  	REG_FCC0 // must be a multiple of 32
   121  	REG_FCC1
   122  	REG_FCC2
   123  	REG_FCC3
   124  	REG_FCC4
   125  	REG_FCC5
   126  	REG_FCC6
   127  	REG_FCC7 // only eight registers are needed
   128  	REG_FCC8
   129  	REG_FCC9
   130  	REG_FCC10
   131  	REG_FCC11
   132  	REG_FCC12
   133  	REG_FCC13
   134  	REG_FCC14
   135  	REG_FCC15
   136  	REG_FCC16
   137  	REG_FCC17
   138  	REG_FCC18
   139  	REG_FCC19
   140  	REG_FCC20
   141  	REG_FCC21
   142  	REG_FCC22
   143  	REG_FCC23
   144  	REG_FCC24
   145  	REG_FCC25
   146  	REG_FCC26
   147  	REG_FCC27
   148  	REG_FCC28
   149  	REG_FCC29
   150  	REG_FCC30
   151  	REG_FCC31
   152  
   153  	REG_LAST = REG_FCC31 // the last defined register
   154  
   155  	REG_SPECIAL = REG_FCSR0
   156  
   157  	REGZERO = REG_R0 // set to zero
   158  	REGLINK = REG_R1
   159  	REGSP   = REG_R3
   160  	REGRET  = REG_R20 // not use
   161  	REGARG  = -1      // -1 disables passing the first argument in register
   162  	REGRT1  = REG_R20 // reserved for runtime, duffzero and duffcopy
   163  	REGRT2  = REG_R21 // reserved for runtime, duffcopy
   164  	REGCTXT = REG_R29 // context for closures
   165  	REGG    = REG_R22 // G in loong64
   166  	REGTMP  = REG_R30 // used by the assembler
   167  	FREGRET = REG_F0  // not use
   168  )
   169  
   170  var LOONG64DWARFRegisters = map[int16]int16{}
   171  
   172  func init() {
   173  	// f assigns dwarfregisters[from:to] = (base):(to-from+base)
   174  	f := func(from, to, base int16) {
   175  		for r := int16(from); r <= to; r++ {
   176  			LOONG64DWARFRegisters[r] = (r - from) + base
   177  		}
   178  	}
   179  	f(REG_R0, REG_R31, 0)
   180  	f(REG_F0, REG_F31, 32)
   181  
   182  }
   183  
   184  const (
   185  	BIG = 2046
   186  )
   187  
   188  const (
   189  	// mark flags
   190  	LABEL  = 1 << 0
   191  	LEAF   = 1 << 1
   192  	SYNC   = 1 << 2
   193  	BRANCH = 1 << 3
   194  )
   195  
   196  const (
   197  	C_NONE = iota
   198  	C_REG
   199  	C_FREG
   200  	C_FCSRREG
   201  	C_FCCREG
   202  	C_ZCON
   203  	C_SCON // 12 bit signed
   204  	C_UCON // 32 bit signed, low 12 bits 0
   205  	C_ADD0CON
   206  	C_AND0CON
   207  	C_ADDCON // -0x800 <= v < 0
   208  	C_ANDCON // 0 < v <= 0xFFF
   209  	C_LCON   // other 32
   210  	C_DCON   // other 64 (could subdivide further)
   211  	C_SACON  // $n(REG) where n <= int12
   212  	C_SECON
   213  	C_LACON // $n(REG) where int12 < n <= int32
   214  	C_LECON
   215  	C_DACON // $n(REG) where int32 < n
   216  	C_STCON // $tlsvar
   217  	C_SBRA
   218  	C_LBRA
   219  	C_SAUTO
   220  	C_LAUTO
   221  	C_SEXT
   222  	C_LEXT
   223  	C_ZOREG
   224  	C_SOREG
   225  	C_LOREG
   226  	C_GOK
   227  	C_ADDR
   228  	C_TLS_LE
   229  	C_TLS_IE
   230  	C_GOTADDR
   231  	C_TEXTSIZE
   232  
   233  	C_NCLASS // must be the last
   234  )
   235  
   236  const (
   237  	AABSD = obj.ABaseLoong64 + obj.A_ARCHSPECIFIC + iota
   238  	AABSF
   239  	AADD
   240  	AADDD
   241  	AADDF
   242  	AADDU
   243  
   244  	AADDW
   245  	AAND
   246  	ABEQ
   247  	ABGEZ
   248  	ABLEZ
   249  	ABGTZ
   250  	ABLTZ
   251  	ABFPF
   252  	ABFPT
   253  
   254  	ABNE
   255  	ABREAK
   256  	ACLO
   257  	ACLZ
   258  
   259  	ACMPEQD
   260  	ACMPEQF
   261  
   262  	ACMPGED // ACMPGED -> fcmp.sle.d
   263  	ACMPGEF // ACMPGEF -> fcmp.sle.s
   264  	ACMPGTD // ACMPGTD -> fcmp.slt.d
   265  	ACMPGTF // ACMPGTF -> fcmp.slt.s
   266  
   267  	ALU12IW
   268  	ALU32ID
   269  	ALU52ID
   270  	APCALAU12I
   271  	APCADDU12I
   272  	AJIRL
   273  	ABGE
   274  	ABLT
   275  	ABLTU
   276  	ABGEU
   277  
   278  	ADIV
   279  	ADIVD
   280  	ADIVF
   281  	ADIVU
   282  	ADIVW
   283  
   284  	ALL
   285  	ALLV
   286  
   287  	ALUI
   288  
   289  	AMOVB
   290  	AMOVBU
   291  
   292  	AMOVD
   293  	AMOVDF
   294  	AMOVDW
   295  	AMOVF
   296  	AMOVFD
   297  	AMOVFW
   298  
   299  	AMOVH
   300  	AMOVHU
   301  	AMOVW
   302  
   303  	AMOVWD
   304  	AMOVWF
   305  
   306  	AMOVWL
   307  	AMOVWR
   308  
   309  	AMUL
   310  	AMULD
   311  	AMULF
   312  	AMULU
   313  	AMULH
   314  	AMULHU
   315  	AMULW
   316  	ANEGD
   317  	ANEGF
   318  
   319  	ANEGW
   320  	ANEGV
   321  
   322  	ANOOP // hardware nop
   323  	ANOR
   324  	AOR
   325  	AREM
   326  	AREMU
   327  
   328  	ARFE
   329  
   330  	ASC
   331  	ASCV
   332  
   333  	ASGT
   334  	ASGTU
   335  
   336  	ASLL
   337  	ASQRTD
   338  	ASQRTF
   339  	ASRA
   340  	ASRL
   341  	AROTR
   342  	ASUB
   343  	ASUBD
   344  	ASUBF
   345  
   346  	ASUBU
   347  	ASUBW
   348  	ADBAR
   349  	ASYSCALL
   350  
   351  	ATEQ
   352  	ATNE
   353  
   354  	AWORD
   355  
   356  	AXOR
   357  
   358  	AMASKEQZ
   359  	AMASKNEZ
   360  
   361  	// 64-bit
   362  	AMOVV
   363  	AMOVVL
   364  	AMOVVR
   365  
   366  	ASLLV
   367  	ASRAV
   368  	ASRLV
   369  	AROTRV
   370  	ADIVV
   371  	ADIVVU
   372  
   373  	AREMV
   374  	AREMVU
   375  
   376  	AMULV
   377  	AMULVU
   378  	AMULHV
   379  	AMULHVU
   380  	AADDV
   381  	AADDVU
   382  	ASUBV
   383  	ASUBVU
   384  
   385  	// 64-bit FP
   386  	ATRUNCFV
   387  	ATRUNCDV
   388  	ATRUNCFW
   389  	ATRUNCDW
   390  
   391  	AMOVWU
   392  	AMOVFV
   393  	AMOVDV
   394  	AMOVVF
   395  	AMOVVD
   396  
   397  	// 2.2.10. Other Miscellaneous Instructions
   398  	ARDTIMELW
   399  	ARDTIMEHW
   400  	ARDTIMED
   401  
   402  	ALAST
   403  
   404  	// aliases
   405  	AJMP = obj.AJMP
   406  	AJAL = obj.ACALL
   407  	ARET = obj.ARET
   408  )
   409  
   410  func init() {
   411  	// The asm encoder generally assumes that the lowest 5 bits of the
   412  	// REG_XX constants match the machine instruction encoding, i.e.
   413  	// the lowest 5 bits is the register number.
   414  	// Check this here.
   415  	if REG_R0%32 != 0 {
   416  		panic("REG_R0 is not a multiple of 32")
   417  	}
   418  	if REG_F0%32 != 0 {
   419  		panic("REG_F0 is not a multiple of 32")
   420  	}
   421  	if REG_FCSR0%32 != 0 {
   422  		panic("REG_FCSR0 is not a multiple of 32")
   423  	}
   424  	if REG_FCC0%32 != 0 {
   425  		panic("REG_FCC0 is not a multiple of 32")
   426  	}
   427  }