411 lines
6.9 KiB
Go
411 lines
6.9 KiB
Go
|
// Inferno utils/5c/5.out.h
|
||
|
// https://bitbucket.org/inferno-os/inferno-os/src/master/utils/5c/5.out.h
|
||
|
//
|
||
|
// 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-2007 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-2007 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 arm
|
||
|
|
||
|
import "github.com/twitchyliquid64/golang-asm/obj"
|
||
|
|
||
|
//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p arm
|
||
|
|
||
|
const (
|
||
|
NSNAME = 8
|
||
|
NSYM = 50
|
||
|
NREG = 16
|
||
|
)
|
||
|
|
||
|
/* -1 disables use of REGARG */
|
||
|
const (
|
||
|
REGARG = -1
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
REG_R0 = obj.RBaseARM + iota // must be 16-aligned
|
||
|
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_F0 // must be 16-aligned
|
||
|
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_FPSR // must be 2-aligned
|
||
|
REG_FPCR
|
||
|
|
||
|
REG_CPSR // must be 2-aligned
|
||
|
REG_SPSR
|
||
|
|
||
|
REGRET = REG_R0
|
||
|
/* compiler allocates R1 up as temps */
|
||
|
/* compiler allocates register variables R3 up */
|
||
|
/* compiler allocates external registers R10 down */
|
||
|
REGEXT = REG_R10
|
||
|
/* these two registers are declared in runtime.h */
|
||
|
REGG = REGEXT - 0
|
||
|
REGM = REGEXT - 1
|
||
|
|
||
|
REGCTXT = REG_R7
|
||
|
REGTMP = REG_R11
|
||
|
REGSP = REG_R13
|
||
|
REGLINK = REG_R14
|
||
|
REGPC = REG_R15
|
||
|
|
||
|
NFREG = 16
|
||
|
/* compiler allocates register variables F0 up */
|
||
|
/* compiler allocates external registers F7 down */
|
||
|
FREGRET = REG_F0
|
||
|
FREGEXT = REG_F7
|
||
|
FREGTMP = REG_F15
|
||
|
)
|
||
|
|
||
|
// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf
|
||
|
var ARMDWARFRegisters = map[int16]int16{}
|
||
|
|
||
|
func init() {
|
||
|
// f assigns dwarfregisters[from:to] = (base):(step*(to-from)+base)
|
||
|
f := func(from, to, base, step int16) {
|
||
|
for r := int16(from); r <= to; r++ {
|
||
|
ARMDWARFRegisters[r] = step*(r-from) + base
|
||
|
}
|
||
|
}
|
||
|
f(REG_R0, REG_R15, 0, 1)
|
||
|
f(REG_F0, REG_F15, 64, 2) // Use d0 through D15, aka S0, S2, ..., S30
|
||
|
}
|
||
|
|
||
|
// Special registers, after subtracting obj.RBaseARM, bit 9 indicates
|
||
|
// a special register and the low bits select the register.
|
||
|
const (
|
||
|
REG_SPECIAL = obj.RBaseARM + 1<<9 + iota
|
||
|
REG_MB_SY
|
||
|
REG_MB_ST
|
||
|
REG_MB_ISH
|
||
|
REG_MB_ISHST
|
||
|
REG_MB_NSH
|
||
|
REG_MB_NSHST
|
||
|
REG_MB_OSH
|
||
|
REG_MB_OSHST
|
||
|
|
||
|
MAXREG
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
C_NONE = iota
|
||
|
C_REG
|
||
|
C_REGREG
|
||
|
C_REGREG2
|
||
|
C_REGLIST
|
||
|
C_SHIFT /* register shift R>>x */
|
||
|
C_SHIFTADDR /* memory address with shifted offset R>>x(R) */
|
||
|
C_FREG
|
||
|
C_PSR
|
||
|
C_FCR
|
||
|
C_SPR /* REG_MB_SY */
|
||
|
|
||
|
C_RCON /* 0xff rotated */
|
||
|
C_NCON /* ~RCON */
|
||
|
C_RCON2A /* OR of two disjoint C_RCON constants */
|
||
|
C_RCON2S /* subtraction of two disjoint C_RCON constants */
|
||
|
C_SCON /* 0xffff */
|
||
|
C_LCON
|
||
|
C_LCONADDR
|
||
|
C_ZFCON
|
||
|
C_SFCON
|
||
|
C_LFCON
|
||
|
|
||
|
C_RACON
|
||
|
C_LACON
|
||
|
|
||
|
C_SBRA
|
||
|
C_LBRA
|
||
|
|
||
|
C_HAUTO /* halfword insn offset (-0xff to 0xff) */
|
||
|
C_FAUTO /* float insn offset (0 to 0x3fc, word aligned) */
|
||
|
C_HFAUTO /* both H and F */
|
||
|
C_SAUTO /* -0xfff to 0xfff */
|
||
|
C_LAUTO
|
||
|
|
||
|
C_HOREG
|
||
|
C_FOREG
|
||
|
C_HFOREG
|
||
|
C_SOREG
|
||
|
C_ROREG
|
||
|
C_SROREG /* both nil and R */
|
||
|
C_LOREG
|
||
|
|
||
|
C_PC
|
||
|
C_SP
|
||
|
C_HREG
|
||
|
|
||
|
C_ADDR /* reference to relocatable address */
|
||
|
|
||
|
// TLS "var" in local exec mode: will become a constant offset from
|
||
|
// thread local base that is ultimately chosen by the program linker.
|
||
|
C_TLS_LE
|
||
|
|
||
|
// TLS "var" in initial exec mode: will become a memory address (chosen
|
||
|
// by the program linker) that the dynamic linker will fill with the
|
||
|
// offset from the thread local base.
|
||
|
C_TLS_IE
|
||
|
|
||
|
C_TEXTSIZE
|
||
|
|
||
|
C_GOK
|
||
|
|
||
|
C_NCLASS /* must be the last */
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
AAND = obj.ABaseARM + obj.A_ARCHSPECIFIC + iota
|
||
|
AEOR
|
||
|
ASUB
|
||
|
ARSB
|
||
|
AADD
|
||
|
AADC
|
||
|
ASBC
|
||
|
ARSC
|
||
|
ATST
|
||
|
ATEQ
|
||
|
ACMP
|
||
|
ACMN
|
||
|
AORR
|
||
|
ABIC
|
||
|
|
||
|
AMVN
|
||
|
|
||
|
/*
|
||
|
* Do not reorder or fragment the conditional branch
|
||
|
* opcodes, or the predication code will break
|
||
|
*/
|
||
|
ABEQ
|
||
|
ABNE
|
||
|
ABCS
|
||
|
ABHS
|
||
|
ABCC
|
||
|
ABLO
|
||
|
ABMI
|
||
|
ABPL
|
||
|
ABVS
|
||
|
ABVC
|
||
|
ABHI
|
||
|
ABLS
|
||
|
ABGE
|
||
|
ABLT
|
||
|
ABGT
|
||
|
ABLE
|
||
|
|
||
|
AMOVWD
|
||
|
AMOVWF
|
||
|
AMOVDW
|
||
|
AMOVFW
|
||
|
AMOVFD
|
||
|
AMOVDF
|
||
|
AMOVF
|
||
|
AMOVD
|
||
|
|
||
|
ACMPF
|
||
|
ACMPD
|
||
|
AADDF
|
||
|
AADDD
|
||
|
ASUBF
|
||
|
ASUBD
|
||
|
AMULF
|
||
|
AMULD
|
||
|
ANMULF
|
||
|
ANMULD
|
||
|
AMULAF
|
||
|
AMULAD
|
||
|
ANMULAF
|
||
|
ANMULAD
|
||
|
AMULSF
|
||
|
AMULSD
|
||
|
ANMULSF
|
||
|
ANMULSD
|
||
|
AFMULAF
|
||
|
AFMULAD
|
||
|
AFNMULAF
|
||
|
AFNMULAD
|
||
|
AFMULSF
|
||
|
AFMULSD
|
||
|
AFNMULSF
|
||
|
AFNMULSD
|
||
|
ADIVF
|
||
|
ADIVD
|
||
|
ASQRTF
|
||
|
ASQRTD
|
||
|
AABSF
|
||
|
AABSD
|
||
|
ANEGF
|
||
|
ANEGD
|
||
|
|
||
|
ASRL
|
||
|
ASRA
|
||
|
ASLL
|
||
|
AMULU
|
||
|
ADIVU
|
||
|
AMUL
|
||
|
AMMUL
|
||
|
ADIV
|
||
|
AMOD
|
||
|
AMODU
|
||
|
ADIVHW
|
||
|
ADIVUHW
|
||
|
|
||
|
AMOVB
|
||
|
AMOVBS
|
||
|
AMOVBU
|
||
|
AMOVH
|
||
|
AMOVHS
|
||
|
AMOVHU
|
||
|
AMOVW
|
||
|
AMOVM
|
||
|
ASWPBU
|
||
|
ASWPW
|
||
|
|
||
|
ARFE
|
||
|
ASWI
|
||
|
AMULA
|
||
|
AMULS
|
||
|
AMMULA
|
||
|
AMMULS
|
||
|
|
||
|
AWORD
|
||
|
|
||
|
AMULL
|
||
|
AMULAL
|
||
|
AMULLU
|
||
|
AMULALU
|
||
|
|
||
|
ABX
|
||
|
ABXRET
|
||
|
ADWORD
|
||
|
|
||
|
ALDREX
|
||
|
ASTREX
|
||
|
ALDREXD
|
||
|
ASTREXD
|
||
|
|
||
|
ADMB
|
||
|
|
||
|
APLD
|
||
|
|
||
|
ACLZ
|
||
|
AREV
|
||
|
AREV16
|
||
|
AREVSH
|
||
|
ARBIT
|
||
|
|
||
|
AXTAB
|
||
|
AXTAH
|
||
|
AXTABU
|
||
|
AXTAHU
|
||
|
|
||
|
ABFX
|
||
|
ABFXU
|
||
|
ABFC
|
||
|
ABFI
|
||
|
|
||
|
AMULWT
|
||
|
AMULWB
|
||
|
AMULBB
|
||
|
AMULAWT
|
||
|
AMULAWB
|
||
|
AMULABB
|
||
|
|
||
|
AMRC // MRC/MCR
|
||
|
|
||
|
ALAST
|
||
|
|
||
|
// aliases
|
||
|
AB = obj.AJMP
|
||
|
ABL = obj.ACALL
|
||
|
)
|
||
|
|
||
|
/* scond byte */
|
||
|
const (
|
||
|
C_SCOND = (1 << 4) - 1
|
||
|
C_SBIT = 1 << 4
|
||
|
C_PBIT = 1 << 5
|
||
|
C_WBIT = 1 << 6
|
||
|
C_FBIT = 1 << 7 /* psr flags-only */
|
||
|
C_UBIT = 1 << 7 /* up bit, unsigned bit */
|
||
|
|
||
|
// These constants are the ARM condition codes encodings,
|
||
|
// XORed with 14 so that C_SCOND_NONE has value 0,
|
||
|
// so that a zeroed Prog.scond means "always execute".
|
||
|
C_SCOND_XOR = 14
|
||
|
|
||
|
C_SCOND_EQ = 0 ^ C_SCOND_XOR
|
||
|
C_SCOND_NE = 1 ^ C_SCOND_XOR
|
||
|
C_SCOND_HS = 2 ^ C_SCOND_XOR
|
||
|
C_SCOND_LO = 3 ^ C_SCOND_XOR
|
||
|
C_SCOND_MI = 4 ^ C_SCOND_XOR
|
||
|
C_SCOND_PL = 5 ^ C_SCOND_XOR
|
||
|
C_SCOND_VS = 6 ^ C_SCOND_XOR
|
||
|
C_SCOND_VC = 7 ^ C_SCOND_XOR
|
||
|
C_SCOND_HI = 8 ^ C_SCOND_XOR
|
||
|
C_SCOND_LS = 9 ^ C_SCOND_XOR
|
||
|
C_SCOND_GE = 10 ^ C_SCOND_XOR
|
||
|
C_SCOND_LT = 11 ^ C_SCOND_XOR
|
||
|
C_SCOND_GT = 12 ^ C_SCOND_XOR
|
||
|
C_SCOND_LE = 13 ^ C_SCOND_XOR
|
||
|
C_SCOND_NONE = 14 ^ C_SCOND_XOR
|
||
|
C_SCOND_NV = 15 ^ C_SCOND_XOR
|
||
|
|
||
|
/* D_SHIFT type */
|
||
|
SHIFT_LL = 0 << 5
|
||
|
SHIFT_LR = 1 << 5
|
||
|
SHIFT_AR = 2 << 5
|
||
|
SHIFT_RR = 3 << 5
|
||
|
)
|