gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

a.out.go (7715B)


      1 // cmd/9c/9.out.h from Vita Nuova.
      2 //
      3 //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
      4 //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
      5 //	Portions Copyright © 1997-1999 Vita Nuova Limited
      6 //	Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
      7 //	Portions Copyright © 2004,2006 Bruce Ellis
      8 //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
      9 //	Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
     10 //	Portions Copyright © 2009 The Go Authors. All rights reserved.
     11 //
     12 // Permission is hereby granted, free of charge, to any person obtaining a copy
     13 // of this software and associated documentation files (the "Software"), to deal
     14 // in the Software without restriction, including without limitation the rights
     15 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     16 // copies of the Software, and to permit persons to whom the Software is
     17 // furnished to do so, subject to the following conditions:
     18 //
     19 // The above copyright notice and this permission notice shall be included in
     20 // all copies or substantial portions of the Software.
     21 //
     22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     23 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     24 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
     25 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     26 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     27 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     28 // THE SOFTWARE.
     29 
     30 package mips
     31 
     32 import (
     33 	"github.com/twitchyliquid64/golang-asm/obj"
     34 )
     35 
     36 //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p mips
     37 
     38 /*
     39  * mips 64
     40  */
     41 const (
     42 	NSNAME = 8
     43 	NSYM   = 50
     44 	NREG   = 32 /* number of general registers */
     45 	NFREG  = 32 /* number of floating point registers */
     46 	NWREG  = 32 /* number of MSA registers */
     47 )
     48 
     49 const (
     50 	REG_R0 = obj.RBaseMIPS + iota // must be a multiple of 32
     51 	REG_R1
     52 	REG_R2
     53 	REG_R3
     54 	REG_R4
     55 	REG_R5
     56 	REG_R6
     57 	REG_R7
     58 	REG_R8
     59 	REG_R9
     60 	REG_R10
     61 	REG_R11
     62 	REG_R12
     63 	REG_R13
     64 	REG_R14
     65 	REG_R15
     66 	REG_R16
     67 	REG_R17
     68 	REG_R18
     69 	REG_R19
     70 	REG_R20
     71 	REG_R21
     72 	REG_R22
     73 	REG_R23
     74 	REG_R24
     75 	REG_R25
     76 	REG_R26
     77 	REG_R27
     78 	REG_R28
     79 	REG_R29
     80 	REG_R30
     81 	REG_R31
     82 
     83 	REG_F0 // must be a multiple of 32
     84 	REG_F1
     85 	REG_F2
     86 	REG_F3
     87 	REG_F4
     88 	REG_F5
     89 	REG_F6
     90 	REG_F7
     91 	REG_F8
     92 	REG_F9
     93 	REG_F10
     94 	REG_F11
     95 	REG_F12
     96 	REG_F13
     97 	REG_F14
     98 	REG_F15
     99 	REG_F16
    100 	REG_F17
    101 	REG_F18
    102 	REG_F19
    103 	REG_F20
    104 	REG_F21
    105 	REG_F22
    106 	REG_F23
    107 	REG_F24
    108 	REG_F25
    109 	REG_F26
    110 	REG_F27
    111 	REG_F28
    112 	REG_F29
    113 	REG_F30
    114 	REG_F31
    115 
    116 	// co-processor 0 control registers
    117 	REG_M0 // must be a multiple of 32
    118 	REG_M1
    119 	REG_M2
    120 	REG_M3
    121 	REG_M4
    122 	REG_M5
    123 	REG_M6
    124 	REG_M7
    125 	REG_M8
    126 	REG_M9
    127 	REG_M10
    128 	REG_M11
    129 	REG_M12
    130 	REG_M13
    131 	REG_M14
    132 	REG_M15
    133 	REG_M16
    134 	REG_M17
    135 	REG_M18
    136 	REG_M19
    137 	REG_M20
    138 	REG_M21
    139 	REG_M22
    140 	REG_M23
    141 	REG_M24
    142 	REG_M25
    143 	REG_M26
    144 	REG_M27
    145 	REG_M28
    146 	REG_M29
    147 	REG_M30
    148 	REG_M31
    149 
    150 	// FPU control registers
    151 	REG_FCR0 // must be a multiple of 32
    152 	REG_FCR1
    153 	REG_FCR2
    154 	REG_FCR3
    155 	REG_FCR4
    156 	REG_FCR5
    157 	REG_FCR6
    158 	REG_FCR7
    159 	REG_FCR8
    160 	REG_FCR9
    161 	REG_FCR10
    162 	REG_FCR11
    163 	REG_FCR12
    164 	REG_FCR13
    165 	REG_FCR14
    166 	REG_FCR15
    167 	REG_FCR16
    168 	REG_FCR17
    169 	REG_FCR18
    170 	REG_FCR19
    171 	REG_FCR20
    172 	REG_FCR21
    173 	REG_FCR22
    174 	REG_FCR23
    175 	REG_FCR24
    176 	REG_FCR25
    177 	REG_FCR26
    178 	REG_FCR27
    179 	REG_FCR28
    180 	REG_FCR29
    181 	REG_FCR30
    182 	REG_FCR31
    183 
    184 	// MSA registers
    185 	// The lower bits of W registers are alias to F registers
    186 	REG_W0 // must be a multiple of 32
    187 	REG_W1
    188 	REG_W2
    189 	REG_W3
    190 	REG_W4
    191 	REG_W5
    192 	REG_W6
    193 	REG_W7
    194 	REG_W8
    195 	REG_W9
    196 	REG_W10
    197 	REG_W11
    198 	REG_W12
    199 	REG_W13
    200 	REG_W14
    201 	REG_W15
    202 	REG_W16
    203 	REG_W17
    204 	REG_W18
    205 	REG_W19
    206 	REG_W20
    207 	REG_W21
    208 	REG_W22
    209 	REG_W23
    210 	REG_W24
    211 	REG_W25
    212 	REG_W26
    213 	REG_W27
    214 	REG_W28
    215 	REG_W29
    216 	REG_W30
    217 	REG_W31
    218 
    219 	REG_HI
    220 	REG_LO
    221 
    222 	REG_LAST = REG_LO // the last defined register
    223 
    224 	REG_SPECIAL = REG_M0
    225 
    226 	REGZERO = REG_R0 /* set to zero */
    227 	REGSP   = REG_R29
    228 	REGSB   = REG_R28
    229 	REGLINK = REG_R31
    230 	REGRET  = REG_R1
    231 	REGARG  = -1      /* -1 disables passing the first argument in register */
    232 	REGRT1  = REG_R1  /* reserved for runtime, duffzero and duffcopy */
    233 	REGRT2  = REG_R2  /* reserved for runtime, duffcopy */
    234 	REGCTXT = REG_R22 /* context for closures */
    235 	REGG    = REG_R30 /* G */
    236 	REGTMP  = REG_R23 /* used by the linker */
    237 	FREGRET = REG_F0
    238 )
    239 
    240 // https://llvm.org/svn/llvm-project/llvm/trunk/lib/Target/Mips/MipsRegisterInfo.td search for DwarfRegNum
    241 // https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/config/mips/mips.c?view=co&revision=258099&content-type=text%2Fplain search for mips_dwarf_regno
    242 // For now, this is adequate for both 32 and 64 bit.
    243 var MIPSDWARFRegisters = map[int16]int16{}
    244 
    245 func init() {
    246 	// f assigns dwarfregisters[from:to] = (base):(to-from+base)
    247 	f := func(from, to, base int16) {
    248 		for r := int16(from); r <= to; r++ {
    249 			MIPSDWARFRegisters[r] = (r - from) + base
    250 		}
    251 	}
    252 	f(REG_R0, REG_R31, 0)
    253 	f(REG_F0, REG_F31, 32) // For 32-bit MIPS, compiler only uses even numbered registers --  see cmd/compile/internal/ssa/gen/MIPSOps.go
    254 	MIPSDWARFRegisters[REG_HI] = 64
    255 	MIPSDWARFRegisters[REG_LO] = 65
    256 	// The lower bits of W registers are alias to F registers
    257 	f(REG_W0, REG_W31, 32)
    258 }
    259 
    260 const (
    261 	BIG = 32766
    262 )
    263 
    264 const (
    265 	/* mark flags */
    266 	FOLL    = 1 << 0
    267 	LABEL   = 1 << 1
    268 	LEAF    = 1 << 2
    269 	SYNC    = 1 << 3
    270 	BRANCH  = 1 << 4
    271 	LOAD    = 1 << 5
    272 	FCMP    = 1 << 6
    273 	NOSCHED = 1 << 7
    274 
    275 	NSCHED = 20
    276 )
    277 
    278 const (
    279 	C_NONE = iota
    280 	C_REG
    281 	C_FREG
    282 	C_FCREG
    283 	C_MREG /* special processor register */
    284 	C_WREG /* MSA registers */
    285 	C_HI
    286 	C_LO
    287 	C_ZCON
    288 	C_SCON /* 16 bit signed */
    289 	C_UCON /* 32 bit signed, low 16 bits 0 */
    290 	C_ADD0CON
    291 	C_AND0CON
    292 	C_ADDCON /* -0x8000 <= v < 0 */
    293 	C_ANDCON /* 0 < v <= 0xFFFF */
    294 	C_LCON   /* other 32 */
    295 	C_DCON   /* other 64 (could subdivide further) */
    296 	C_SACON  /* $n(REG) where n <= int16 */
    297 	C_SECON
    298 	C_LACON /* $n(REG) where int16 < n <= int32 */
    299 	C_LECON
    300 	C_DACON /* $n(REG) where int32 < n */
    301 	C_STCON /* $tlsvar */
    302 	C_SBRA
    303 	C_LBRA
    304 	C_SAUTO
    305 	C_LAUTO
    306 	C_SEXT
    307 	C_LEXT
    308 	C_ZOREG
    309 	C_SOREG
    310 	C_LOREG
    311 	C_GOK
    312 	C_ADDR
    313 	C_TLS
    314 	C_TEXTSIZE
    315 
    316 	C_NCLASS /* must be the last */
    317 )
    318 
    319 const (
    320 	AABSD = obj.ABaseMIPS + obj.A_ARCHSPECIFIC + iota
    321 	AABSF
    322 	AABSW
    323 	AADD
    324 	AADDD
    325 	AADDF
    326 	AADDU
    327 	AADDW
    328 	AAND
    329 	ABEQ
    330 	ABFPF
    331 	ABFPT
    332 	ABGEZ
    333 	ABGEZAL
    334 	ABGTZ
    335 	ABLEZ
    336 	ABLTZ
    337 	ABLTZAL
    338 	ABNE
    339 	ABREAK
    340 	ACLO
    341 	ACLZ
    342 	ACMOVF
    343 	ACMOVN
    344 	ACMOVT
    345 	ACMOVZ
    346 	ACMPEQD
    347 	ACMPEQF
    348 	ACMPGED
    349 	ACMPGEF
    350 	ACMPGTD
    351 	ACMPGTF
    352 	ADIV
    353 	ADIVD
    354 	ADIVF
    355 	ADIVU
    356 	ADIVW
    357 	AGOK
    358 	ALL
    359 	ALLV
    360 	ALUI
    361 	AMADD
    362 	AMOVB
    363 	AMOVBU
    364 	AMOVD
    365 	AMOVDF
    366 	AMOVDW
    367 	AMOVF
    368 	AMOVFD
    369 	AMOVFW
    370 	AMOVH
    371 	AMOVHU
    372 	AMOVW
    373 	AMOVWD
    374 	AMOVWF
    375 	AMOVWL
    376 	AMOVWR
    377 	AMSUB
    378 	AMUL
    379 	AMULD
    380 	AMULF
    381 	AMULU
    382 	AMULW
    383 	ANEGD
    384 	ANEGF
    385 	ANEGW
    386 	ANEGV
    387 	ANOOP // hardware nop
    388 	ANOR
    389 	AOR
    390 	AREM
    391 	AREMU
    392 	ARFE
    393 	ASC
    394 	ASCV
    395 	ASGT
    396 	ASGTU
    397 	ASLL
    398 	ASQRTD
    399 	ASQRTF
    400 	ASRA
    401 	ASRL
    402 	ASUB
    403 	ASUBD
    404 	ASUBF
    405 	ASUBU
    406 	ASUBW
    407 	ASYNC
    408 	ASYSCALL
    409 	ATEQ
    410 	ATLBP
    411 	ATLBR
    412 	ATLBWI
    413 	ATLBWR
    414 	ATNE
    415 	AWORD
    416 	AXOR
    417 
    418 	/* 64-bit */
    419 	AMOVV
    420 	AMOVVL
    421 	AMOVVR
    422 	ASLLV
    423 	ASRAV
    424 	ASRLV
    425 	ADIVV
    426 	ADIVVU
    427 	AREMV
    428 	AREMVU
    429 	AMULV
    430 	AMULVU
    431 	AADDV
    432 	AADDVU
    433 	ASUBV
    434 	ASUBVU
    435 
    436 	/* 64-bit FP */
    437 	ATRUNCFV
    438 	ATRUNCDV
    439 	ATRUNCFW
    440 	ATRUNCDW
    441 	AMOVWU
    442 	AMOVFV
    443 	AMOVDV
    444 	AMOVVF
    445 	AMOVVD
    446 
    447 	/* MSA */
    448 	AVMOVB
    449 	AVMOVH
    450 	AVMOVW
    451 	AVMOVD
    452 
    453 	ALAST
    454 
    455 	// aliases
    456 	AJMP = obj.AJMP
    457 	AJAL = obj.ACALL
    458 	ARET = obj.ARET
    459 )
    460 
    461 func init() {
    462 	// The asm encoder generally assumes that the lowest 5 bits of the
    463 	// REG_XX constants match the machine instruction encoding, i.e.
    464 	// the lowest 5 bits is the register number.
    465 	// Check this here.
    466 	if REG_R0%32 != 0 {
    467 		panic("REG_R0 is not a multiple of 32")
    468 	}
    469 	if REG_F0%32 != 0 {
    470 		panic("REG_F0 is not a multiple of 32")
    471 	}
    472 	if REG_M0%32 != 0 {
    473 		panic("REG_M0 is not a multiple of 32")
    474 	}
    475 	if REG_FCR0%32 != 0 {
    476 		panic("REG_FCR0 is not a multiple of 32")
    477 	}
    478 	if REG_W0%32 != 0 {
    479 		panic("REG_W0 is not a multiple of 32")
    480 	}
    481 }