mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 06:02:26 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			481 lines
		
	
	
	
		
			7.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			481 lines
		
	
	
	
		
			7.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // cmd/9c/9.out.h from Vita Nuova.
 | |
| //
 | |
| //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
 | |
| //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
 | |
| //	Portions Copyright © 1997-1999 Vita Nuova Limited
 | |
| //	Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
 | |
| //	Portions Copyright © 2004,2006 Bruce Ellis
 | |
| //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
 | |
| //	Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
 | |
| //	Portions Copyright © 2009 The Go Authors. All rights reserved.
 | |
| //
 | |
| // Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
| // of this software and associated documentation files (the "Software"), to deal
 | |
| // in the Software without restriction, including without limitation the rights
 | |
| // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
| // copies of the Software, and to permit persons to whom the Software is
 | |
| // furnished to do so, subject to the following conditions:
 | |
| //
 | |
| // The above copyright notice and this permission notice shall be included in
 | |
| // all copies or substantial portions of the Software.
 | |
| //
 | |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 | |
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | |
| // THE SOFTWARE.
 | |
| 
 | |
| package mips
 | |
| 
 | |
| import (
 | |
| 	"github.com/twitchyliquid64/golang-asm/obj"
 | |
| )
 | |
| 
 | |
| //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p mips
 | |
| 
 | |
| /*
 | |
|  * mips 64
 | |
|  */
 | |
| const (
 | |
| 	NSNAME = 8
 | |
| 	NSYM   = 50
 | |
| 	NREG   = 32 /* number of general registers */
 | |
| 	NFREG  = 32 /* number of floating point registers */
 | |
| 	NWREG  = 32 /* number of MSA registers */
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	REG_R0 = obj.RBaseMIPS + iota // must be a multiple of 32
 | |
| 	REG_R1
 | |
| 	REG_R2
 | |
| 	REG_R3
 | |
| 	REG_R4
 | |
| 	REG_R5
 | |
| 	REG_R6
 | |
| 	REG_R7
 | |
| 	REG_R8
 | |
| 	REG_R9
 | |
| 	REG_R10
 | |
| 	REG_R11
 | |
| 	REG_R12
 | |
| 	REG_R13
 | |
| 	REG_R14
 | |
| 	REG_R15
 | |
| 	REG_R16
 | |
| 	REG_R17
 | |
| 	REG_R18
 | |
| 	REG_R19
 | |
| 	REG_R20
 | |
| 	REG_R21
 | |
| 	REG_R22
 | |
| 	REG_R23
 | |
| 	REG_R24
 | |
| 	REG_R25
 | |
| 	REG_R26
 | |
| 	REG_R27
 | |
| 	REG_R28
 | |
| 	REG_R29
 | |
| 	REG_R30
 | |
| 	REG_R31
 | |
| 
 | |
| 	REG_F0 // must be a multiple of 32
 | |
| 	REG_F1
 | |
| 	REG_F2
 | |
| 	REG_F3
 | |
| 	REG_F4
 | |
| 	REG_F5
 | |
| 	REG_F6
 | |
| 	REG_F7
 | |
| 	REG_F8
 | |
| 	REG_F9
 | |
| 	REG_F10
 | |
| 	REG_F11
 | |
| 	REG_F12
 | |
| 	REG_F13
 | |
| 	REG_F14
 | |
| 	REG_F15
 | |
| 	REG_F16
 | |
| 	REG_F17
 | |
| 	REG_F18
 | |
| 	REG_F19
 | |
| 	REG_F20
 | |
| 	REG_F21
 | |
| 	REG_F22
 | |
| 	REG_F23
 | |
| 	REG_F24
 | |
| 	REG_F25
 | |
| 	REG_F26
 | |
| 	REG_F27
 | |
| 	REG_F28
 | |
| 	REG_F29
 | |
| 	REG_F30
 | |
| 	REG_F31
 | |
| 
 | |
| 	// co-processor 0 control registers
 | |
| 	REG_M0 // must be a multiple of 32
 | |
| 	REG_M1
 | |
| 	REG_M2
 | |
| 	REG_M3
 | |
| 	REG_M4
 | |
| 	REG_M5
 | |
| 	REG_M6
 | |
| 	REG_M7
 | |
| 	REG_M8
 | |
| 	REG_M9
 | |
| 	REG_M10
 | |
| 	REG_M11
 | |
| 	REG_M12
 | |
| 	REG_M13
 | |
| 	REG_M14
 | |
| 	REG_M15
 | |
| 	REG_M16
 | |
| 	REG_M17
 | |
| 	REG_M18
 | |
| 	REG_M19
 | |
| 	REG_M20
 | |
| 	REG_M21
 | |
| 	REG_M22
 | |
| 	REG_M23
 | |
| 	REG_M24
 | |
| 	REG_M25
 | |
| 	REG_M26
 | |
| 	REG_M27
 | |
| 	REG_M28
 | |
| 	REG_M29
 | |
| 	REG_M30
 | |
| 	REG_M31
 | |
| 
 | |
| 	// FPU control registers
 | |
| 	REG_FCR0 // must be a multiple of 32
 | |
| 	REG_FCR1
 | |
| 	REG_FCR2
 | |
| 	REG_FCR3
 | |
| 	REG_FCR4
 | |
| 	REG_FCR5
 | |
| 	REG_FCR6
 | |
| 	REG_FCR7
 | |
| 	REG_FCR8
 | |
| 	REG_FCR9
 | |
| 	REG_FCR10
 | |
| 	REG_FCR11
 | |
| 	REG_FCR12
 | |
| 	REG_FCR13
 | |
| 	REG_FCR14
 | |
| 	REG_FCR15
 | |
| 	REG_FCR16
 | |
| 	REG_FCR17
 | |
| 	REG_FCR18
 | |
| 	REG_FCR19
 | |
| 	REG_FCR20
 | |
| 	REG_FCR21
 | |
| 	REG_FCR22
 | |
| 	REG_FCR23
 | |
| 	REG_FCR24
 | |
| 	REG_FCR25
 | |
| 	REG_FCR26
 | |
| 	REG_FCR27
 | |
| 	REG_FCR28
 | |
| 	REG_FCR29
 | |
| 	REG_FCR30
 | |
| 	REG_FCR31
 | |
| 
 | |
| 	// MSA registers
 | |
| 	// The lower bits of W registers are alias to F registers
 | |
| 	REG_W0 // must be a multiple of 32
 | |
| 	REG_W1
 | |
| 	REG_W2
 | |
| 	REG_W3
 | |
| 	REG_W4
 | |
| 	REG_W5
 | |
| 	REG_W6
 | |
| 	REG_W7
 | |
| 	REG_W8
 | |
| 	REG_W9
 | |
| 	REG_W10
 | |
| 	REG_W11
 | |
| 	REG_W12
 | |
| 	REG_W13
 | |
| 	REG_W14
 | |
| 	REG_W15
 | |
| 	REG_W16
 | |
| 	REG_W17
 | |
| 	REG_W18
 | |
| 	REG_W19
 | |
| 	REG_W20
 | |
| 	REG_W21
 | |
| 	REG_W22
 | |
| 	REG_W23
 | |
| 	REG_W24
 | |
| 	REG_W25
 | |
| 	REG_W26
 | |
| 	REG_W27
 | |
| 	REG_W28
 | |
| 	REG_W29
 | |
| 	REG_W30
 | |
| 	REG_W31
 | |
| 
 | |
| 	REG_HI
 | |
| 	REG_LO
 | |
| 
 | |
| 	REG_LAST = REG_LO // the last defined register
 | |
| 
 | |
| 	REG_SPECIAL = REG_M0
 | |
| 
 | |
| 	REGZERO = REG_R0 /* set to zero */
 | |
| 	REGSP   = REG_R29
 | |
| 	REGSB   = REG_R28
 | |
| 	REGLINK = REG_R31
 | |
| 	REGRET  = REG_R1
 | |
| 	REGARG  = -1      /* -1 disables passing the first argument in register */
 | |
| 	REGRT1  = REG_R1  /* reserved for runtime, duffzero and duffcopy */
 | |
| 	REGRT2  = REG_R2  /* reserved for runtime, duffcopy */
 | |
| 	REGCTXT = REG_R22 /* context for closures */
 | |
| 	REGG    = REG_R30 /* G */
 | |
| 	REGTMP  = REG_R23 /* used by the linker */
 | |
| 	FREGRET = REG_F0
 | |
| )
 | |
| 
 | |
| // https://llvm.org/svn/llvm-project/llvm/trunk/lib/Target/Mips/MipsRegisterInfo.td search for DwarfRegNum
 | |
| // 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
 | |
| // For now, this is adequate for both 32 and 64 bit.
 | |
| var MIPSDWARFRegisters = map[int16]int16{}
 | |
| 
 | |
| func init() {
 | |
| 	// f assigns dwarfregisters[from:to] = (base):(to-from+base)
 | |
| 	f := func(from, to, base int16) {
 | |
| 		for r := int16(from); r <= to; r++ {
 | |
| 			MIPSDWARFRegisters[r] = (r - from) + base
 | |
| 		}
 | |
| 	}
 | |
| 	f(REG_R0, REG_R31, 0)
 | |
| 	f(REG_F0, REG_F31, 32) // For 32-bit MIPS, compiler only uses even numbered registers --  see cmd/compile/internal/ssa/gen/MIPSOps.go
 | |
| 	MIPSDWARFRegisters[REG_HI] = 64
 | |
| 	MIPSDWARFRegisters[REG_LO] = 65
 | |
| 	// The lower bits of W registers are alias to F registers
 | |
| 	f(REG_W0, REG_W31, 32)
 | |
| }
 | |
| 
 | |
| const (
 | |
| 	BIG = 32766
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	/* mark flags */
 | |
| 	FOLL    = 1 << 0
 | |
| 	LABEL   = 1 << 1
 | |
| 	LEAF    = 1 << 2
 | |
| 	SYNC    = 1 << 3
 | |
| 	BRANCH  = 1 << 4
 | |
| 	LOAD    = 1 << 5
 | |
| 	FCMP    = 1 << 6
 | |
| 	NOSCHED = 1 << 7
 | |
| 
 | |
| 	NSCHED = 20
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	C_NONE = iota
 | |
| 	C_REG
 | |
| 	C_FREG
 | |
| 	C_FCREG
 | |
| 	C_MREG /* special processor register */
 | |
| 	C_WREG /* MSA registers */
 | |
| 	C_HI
 | |
| 	C_LO
 | |
| 	C_ZCON
 | |
| 	C_SCON /* 16 bit signed */
 | |
| 	C_UCON /* 32 bit signed, low 16 bits 0 */
 | |
| 	C_ADD0CON
 | |
| 	C_AND0CON
 | |
| 	C_ADDCON /* -0x8000 <= v < 0 */
 | |
| 	C_ANDCON /* 0 < v <= 0xFFFF */
 | |
| 	C_LCON   /* other 32 */
 | |
| 	C_DCON   /* other 64 (could subdivide further) */
 | |
| 	C_SACON  /* $n(REG) where n <= int16 */
 | |
| 	C_SECON
 | |
| 	C_LACON /* $n(REG) where int16 < n <= int32 */
 | |
| 	C_LECON
 | |
| 	C_DACON /* $n(REG) where int32 < n */
 | |
| 	C_STCON /* $tlsvar */
 | |
| 	C_SBRA
 | |
| 	C_LBRA
 | |
| 	C_SAUTO
 | |
| 	C_LAUTO
 | |
| 	C_SEXT
 | |
| 	C_LEXT
 | |
| 	C_ZOREG
 | |
| 	C_SOREG
 | |
| 	C_LOREG
 | |
| 	C_GOK
 | |
| 	C_ADDR
 | |
| 	C_TLS
 | |
| 	C_TEXTSIZE
 | |
| 
 | |
| 	C_NCLASS /* must be the last */
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	AABSD = obj.ABaseMIPS + obj.A_ARCHSPECIFIC + iota
 | |
| 	AABSF
 | |
| 	AABSW
 | |
| 	AADD
 | |
| 	AADDD
 | |
| 	AADDF
 | |
| 	AADDU
 | |
| 	AADDW
 | |
| 	AAND
 | |
| 	ABEQ
 | |
| 	ABFPF
 | |
| 	ABFPT
 | |
| 	ABGEZ
 | |
| 	ABGEZAL
 | |
| 	ABGTZ
 | |
| 	ABLEZ
 | |
| 	ABLTZ
 | |
| 	ABLTZAL
 | |
| 	ABNE
 | |
| 	ABREAK
 | |
| 	ACLO
 | |
| 	ACLZ
 | |
| 	ACMOVF
 | |
| 	ACMOVN
 | |
| 	ACMOVT
 | |
| 	ACMOVZ
 | |
| 	ACMPEQD
 | |
| 	ACMPEQF
 | |
| 	ACMPGED
 | |
| 	ACMPGEF
 | |
| 	ACMPGTD
 | |
| 	ACMPGTF
 | |
| 	ADIV
 | |
| 	ADIVD
 | |
| 	ADIVF
 | |
| 	ADIVU
 | |
| 	ADIVW
 | |
| 	AGOK
 | |
| 	ALL
 | |
| 	ALLV
 | |
| 	ALUI
 | |
| 	AMADD
 | |
| 	AMOVB
 | |
| 	AMOVBU
 | |
| 	AMOVD
 | |
| 	AMOVDF
 | |
| 	AMOVDW
 | |
| 	AMOVF
 | |
| 	AMOVFD
 | |
| 	AMOVFW
 | |
| 	AMOVH
 | |
| 	AMOVHU
 | |
| 	AMOVW
 | |
| 	AMOVWD
 | |
| 	AMOVWF
 | |
| 	AMOVWL
 | |
| 	AMOVWR
 | |
| 	AMSUB
 | |
| 	AMUL
 | |
| 	AMULD
 | |
| 	AMULF
 | |
| 	AMULU
 | |
| 	AMULW
 | |
| 	ANEGD
 | |
| 	ANEGF
 | |
| 	ANEGW
 | |
| 	ANEGV
 | |
| 	ANOOP // hardware nop
 | |
| 	ANOR
 | |
| 	AOR
 | |
| 	AREM
 | |
| 	AREMU
 | |
| 	ARFE
 | |
| 	ASC
 | |
| 	ASCV
 | |
| 	ASGT
 | |
| 	ASGTU
 | |
| 	ASLL
 | |
| 	ASQRTD
 | |
| 	ASQRTF
 | |
| 	ASRA
 | |
| 	ASRL
 | |
| 	ASUB
 | |
| 	ASUBD
 | |
| 	ASUBF
 | |
| 	ASUBU
 | |
| 	ASUBW
 | |
| 	ASYNC
 | |
| 	ASYSCALL
 | |
| 	ATEQ
 | |
| 	ATLBP
 | |
| 	ATLBR
 | |
| 	ATLBWI
 | |
| 	ATLBWR
 | |
| 	ATNE
 | |
| 	AWORD
 | |
| 	AXOR
 | |
| 
 | |
| 	/* 64-bit */
 | |
| 	AMOVV
 | |
| 	AMOVVL
 | |
| 	AMOVVR
 | |
| 	ASLLV
 | |
| 	ASRAV
 | |
| 	ASRLV
 | |
| 	ADIVV
 | |
| 	ADIVVU
 | |
| 	AREMV
 | |
| 	AREMVU
 | |
| 	AMULV
 | |
| 	AMULVU
 | |
| 	AADDV
 | |
| 	AADDVU
 | |
| 	ASUBV
 | |
| 	ASUBVU
 | |
| 
 | |
| 	/* 64-bit FP */
 | |
| 	ATRUNCFV
 | |
| 	ATRUNCDV
 | |
| 	ATRUNCFW
 | |
| 	ATRUNCDW
 | |
| 	AMOVWU
 | |
| 	AMOVFV
 | |
| 	AMOVDV
 | |
| 	AMOVVF
 | |
| 	AMOVVD
 | |
| 
 | |
| 	/* MSA */
 | |
| 	AVMOVB
 | |
| 	AVMOVH
 | |
| 	AVMOVW
 | |
| 	AVMOVD
 | |
| 
 | |
| 	ALAST
 | |
| 
 | |
| 	// aliases
 | |
| 	AJMP = obj.AJMP
 | |
| 	AJAL = obj.ACALL
 | |
| 	ARET = obj.ARET
 | |
| )
 | |
| 
 | |
| func init() {
 | |
| 	// The asm encoder generally assumes that the lowest 5 bits of the
 | |
| 	// REG_XX constants match the machine instruction encoding, i.e.
 | |
| 	// the lowest 5 bits is the register number.
 | |
| 	// Check this here.
 | |
| 	if REG_R0%32 != 0 {
 | |
| 		panic("REG_R0 is not a multiple of 32")
 | |
| 	}
 | |
| 	if REG_F0%32 != 0 {
 | |
| 		panic("REG_F0 is not a multiple of 32")
 | |
| 	}
 | |
| 	if REG_M0%32 != 0 {
 | |
| 		panic("REG_M0 is not a multiple of 32")
 | |
| 	}
 | |
| 	if REG_FCR0%32 != 0 {
 | |
| 		panic("REG_FCR0 is not a multiple of 32")
 | |
| 	}
 | |
| 	if REG_W0%32 != 0 {
 | |
| 		panic("REG_W0 is not a multiple of 32")
 | |
| 	}
 | |
| }
 |