123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481 |
- // 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")
- }
- }
|