424 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			424 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Inferno utils/6c/6.out.h
 | |
| // https://bitbucket.org/inferno-os/inferno-os/src/master/utils/6c/6.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 x86
 | |
| 
 | |
| import "github.com/twitchyliquid64/golang-asm/obj"
 | |
| 
 | |
| const (
 | |
| 	REG_NONE = 0
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	REG_AL = obj.RBaseAMD64 + iota
 | |
| 	REG_CL
 | |
| 	REG_DL
 | |
| 	REG_BL
 | |
| 	REG_SPB
 | |
| 	REG_BPB
 | |
| 	REG_SIB
 | |
| 	REG_DIB
 | |
| 	REG_R8B
 | |
| 	REG_R9B
 | |
| 	REG_R10B
 | |
| 	REG_R11B
 | |
| 	REG_R12B
 | |
| 	REG_R13B
 | |
| 	REG_R14B
 | |
| 	REG_R15B
 | |
| 
 | |
| 	REG_AX
 | |
| 	REG_CX
 | |
| 	REG_DX
 | |
| 	REG_BX
 | |
| 	REG_SP
 | |
| 	REG_BP
 | |
| 	REG_SI
 | |
| 	REG_DI
 | |
| 	REG_R8
 | |
| 	REG_R9
 | |
| 	REG_R10
 | |
| 	REG_R11
 | |
| 	REG_R12
 | |
| 	REG_R13
 | |
| 	REG_R14
 | |
| 	REG_R15
 | |
| 
 | |
| 	REG_AH
 | |
| 	REG_CH
 | |
| 	REG_DH
 | |
| 	REG_BH
 | |
| 
 | |
| 	REG_F0
 | |
| 	REG_F1
 | |
| 	REG_F2
 | |
| 	REG_F3
 | |
| 	REG_F4
 | |
| 	REG_F5
 | |
| 	REG_F6
 | |
| 	REG_F7
 | |
| 
 | |
| 	REG_M0
 | |
| 	REG_M1
 | |
| 	REG_M2
 | |
| 	REG_M3
 | |
| 	REG_M4
 | |
| 	REG_M5
 | |
| 	REG_M6
 | |
| 	REG_M7
 | |
| 
 | |
| 	REG_K0
 | |
| 	REG_K1
 | |
| 	REG_K2
 | |
| 	REG_K3
 | |
| 	REG_K4
 | |
| 	REG_K5
 | |
| 	REG_K6
 | |
| 	REG_K7
 | |
| 
 | |
| 	REG_X0
 | |
| 	REG_X1
 | |
| 	REG_X2
 | |
| 	REG_X3
 | |
| 	REG_X4
 | |
| 	REG_X5
 | |
| 	REG_X6
 | |
| 	REG_X7
 | |
| 	REG_X8
 | |
| 	REG_X9
 | |
| 	REG_X10
 | |
| 	REG_X11
 | |
| 	REG_X12
 | |
| 	REG_X13
 | |
| 	REG_X14
 | |
| 	REG_X15
 | |
| 	REG_X16
 | |
| 	REG_X17
 | |
| 	REG_X18
 | |
| 	REG_X19
 | |
| 	REG_X20
 | |
| 	REG_X21
 | |
| 	REG_X22
 | |
| 	REG_X23
 | |
| 	REG_X24
 | |
| 	REG_X25
 | |
| 	REG_X26
 | |
| 	REG_X27
 | |
| 	REG_X28
 | |
| 	REG_X29
 | |
| 	REG_X30
 | |
| 	REG_X31
 | |
| 
 | |
| 	REG_Y0
 | |
| 	REG_Y1
 | |
| 	REG_Y2
 | |
| 	REG_Y3
 | |
| 	REG_Y4
 | |
| 	REG_Y5
 | |
| 	REG_Y6
 | |
| 	REG_Y7
 | |
| 	REG_Y8
 | |
| 	REG_Y9
 | |
| 	REG_Y10
 | |
| 	REG_Y11
 | |
| 	REG_Y12
 | |
| 	REG_Y13
 | |
| 	REG_Y14
 | |
| 	REG_Y15
 | |
| 	REG_Y16
 | |
| 	REG_Y17
 | |
| 	REG_Y18
 | |
| 	REG_Y19
 | |
| 	REG_Y20
 | |
| 	REG_Y21
 | |
| 	REG_Y22
 | |
| 	REG_Y23
 | |
| 	REG_Y24
 | |
| 	REG_Y25
 | |
| 	REG_Y26
 | |
| 	REG_Y27
 | |
| 	REG_Y28
 | |
| 	REG_Y29
 | |
| 	REG_Y30
 | |
| 	REG_Y31
 | |
| 
 | |
| 	REG_Z0
 | |
| 	REG_Z1
 | |
| 	REG_Z2
 | |
| 	REG_Z3
 | |
| 	REG_Z4
 | |
| 	REG_Z5
 | |
| 	REG_Z6
 | |
| 	REG_Z7
 | |
| 	REG_Z8
 | |
| 	REG_Z9
 | |
| 	REG_Z10
 | |
| 	REG_Z11
 | |
| 	REG_Z12
 | |
| 	REG_Z13
 | |
| 	REG_Z14
 | |
| 	REG_Z15
 | |
| 	REG_Z16
 | |
| 	REG_Z17
 | |
| 	REG_Z18
 | |
| 	REG_Z19
 | |
| 	REG_Z20
 | |
| 	REG_Z21
 | |
| 	REG_Z22
 | |
| 	REG_Z23
 | |
| 	REG_Z24
 | |
| 	REG_Z25
 | |
| 	REG_Z26
 | |
| 	REG_Z27
 | |
| 	REG_Z28
 | |
| 	REG_Z29
 | |
| 	REG_Z30
 | |
| 	REG_Z31
 | |
| 
 | |
| 	REG_CS
 | |
| 	REG_SS
 | |
| 	REG_DS
 | |
| 	REG_ES
 | |
| 	REG_FS
 | |
| 	REG_GS
 | |
| 
 | |
| 	REG_GDTR // global descriptor table register
 | |
| 	REG_IDTR // interrupt descriptor table register
 | |
| 	REG_LDTR // local descriptor table register
 | |
| 	REG_MSW  // machine status word
 | |
| 	REG_TASK // task register
 | |
| 
 | |
| 	REG_CR0
 | |
| 	REG_CR1
 | |
| 	REG_CR2
 | |
| 	REG_CR3
 | |
| 	REG_CR4
 | |
| 	REG_CR5
 | |
| 	REG_CR6
 | |
| 	REG_CR7
 | |
| 	REG_CR8
 | |
| 	REG_CR9
 | |
| 	REG_CR10
 | |
| 	REG_CR11
 | |
| 	REG_CR12
 | |
| 	REG_CR13
 | |
| 	REG_CR14
 | |
| 	REG_CR15
 | |
| 
 | |
| 	REG_DR0
 | |
| 	REG_DR1
 | |
| 	REG_DR2
 | |
| 	REG_DR3
 | |
| 	REG_DR4
 | |
| 	REG_DR5
 | |
| 	REG_DR6
 | |
| 	REG_DR7
 | |
| 
 | |
| 	REG_TR0
 | |
| 	REG_TR1
 | |
| 	REG_TR2
 | |
| 	REG_TR3
 | |
| 	REG_TR4
 | |
| 	REG_TR5
 | |
| 	REG_TR6
 | |
| 	REG_TR7
 | |
| 
 | |
| 	REG_TLS
 | |
| 
 | |
| 	MAXREG
 | |
| 
 | |
| 	REG_CR = REG_CR0
 | |
| 	REG_DR = REG_DR0
 | |
| 	REG_TR = REG_TR0
 | |
| 
 | |
| 	REGARG   = -1
 | |
| 	REGRET   = REG_AX
 | |
| 	FREGRET  = REG_X0
 | |
| 	REGSP    = REG_SP
 | |
| 	REGCTXT  = REG_DX
 | |
| 	REGEXT   = REG_R15     // compiler allocates external registers R15 down
 | |
| 	FREGMIN  = REG_X0 + 5  // first register variable
 | |
| 	FREGEXT  = REG_X0 + 15 // first external register
 | |
| 	T_TYPE   = 1 << 0
 | |
| 	T_INDEX  = 1 << 1
 | |
| 	T_OFFSET = 1 << 2
 | |
| 	T_FCONST = 1 << 3
 | |
| 	T_SYM    = 1 << 4
 | |
| 	T_SCONST = 1 << 5
 | |
| 	T_64     = 1 << 6
 | |
| 	T_GOTYPE = 1 << 7
 | |
| )
 | |
| 
 | |
| // https://www.uclibc.org/docs/psABI-x86_64.pdf, figure 3.36
 | |
| var AMD64DWARFRegisters = map[int16]int16{
 | |
| 	REG_AX:  0,
 | |
| 	REG_DX:  1,
 | |
| 	REG_CX:  2,
 | |
| 	REG_BX:  3,
 | |
| 	REG_SI:  4,
 | |
| 	REG_DI:  5,
 | |
| 	REG_BP:  6,
 | |
| 	REG_SP:  7,
 | |
| 	REG_R8:  8,
 | |
| 	REG_R9:  9,
 | |
| 	REG_R10: 10,
 | |
| 	REG_R11: 11,
 | |
| 	REG_R12: 12,
 | |
| 	REG_R13: 13,
 | |
| 	REG_R14: 14,
 | |
| 	REG_R15: 15,
 | |
| 	// 16 is "Return Address RA", whatever that is.
 | |
| 	// 17-24 vector registers (X/Y/Z).
 | |
| 	REG_X0: 17,
 | |
| 	REG_X1: 18,
 | |
| 	REG_X2: 19,
 | |
| 	REG_X3: 20,
 | |
| 	REG_X4: 21,
 | |
| 	REG_X5: 22,
 | |
| 	REG_X6: 23,
 | |
| 	REG_X7: 24,
 | |
| 	// 25-32 extended vector registers (X/Y/Z).
 | |
| 	REG_X8:  25,
 | |
| 	REG_X9:  26,
 | |
| 	REG_X10: 27,
 | |
| 	REG_X11: 28,
 | |
| 	REG_X12: 29,
 | |
| 	REG_X13: 30,
 | |
| 	REG_X14: 31,
 | |
| 	REG_X15: 32,
 | |
| 	// ST registers. %stN => FN.
 | |
| 	REG_F0: 33,
 | |
| 	REG_F1: 34,
 | |
| 	REG_F2: 35,
 | |
| 	REG_F3: 36,
 | |
| 	REG_F4: 37,
 | |
| 	REG_F5: 38,
 | |
| 	REG_F6: 39,
 | |
| 	REG_F7: 40,
 | |
| 	// MMX registers. %mmN => MN.
 | |
| 	REG_M0: 41,
 | |
| 	REG_M1: 42,
 | |
| 	REG_M2: 43,
 | |
| 	REG_M3: 44,
 | |
| 	REG_M4: 45,
 | |
| 	REG_M5: 46,
 | |
| 	REG_M6: 47,
 | |
| 	REG_M7: 48,
 | |
| 	// 48 is flags, which doesn't have a name.
 | |
| 	REG_ES: 50,
 | |
| 	REG_CS: 51,
 | |
| 	REG_SS: 52,
 | |
| 	REG_DS: 53,
 | |
| 	REG_FS: 54,
 | |
| 	REG_GS: 55,
 | |
| 	// 58 and 59 are {fs,gs}base, which don't have names.
 | |
| 	REG_TR:   62,
 | |
| 	REG_LDTR: 63,
 | |
| 	// 64-66 are mxcsr, fcw, fsw, which don't have names.
 | |
| 
 | |
| 	// 67-82 upper vector registers (X/Y/Z).
 | |
| 	REG_X16: 67,
 | |
| 	REG_X17: 68,
 | |
| 	REG_X18: 69,
 | |
| 	REG_X19: 70,
 | |
| 	REG_X20: 71,
 | |
| 	REG_X21: 72,
 | |
| 	REG_X22: 73,
 | |
| 	REG_X23: 74,
 | |
| 	REG_X24: 75,
 | |
| 	REG_X25: 76,
 | |
| 	REG_X26: 77,
 | |
| 	REG_X27: 78,
 | |
| 	REG_X28: 79,
 | |
| 	REG_X29: 80,
 | |
| 	REG_X30: 81,
 | |
| 	REG_X31: 82,
 | |
| 
 | |
| 	// 118-125 vector mask registers. %kN => KN.
 | |
| 	REG_K0: 118,
 | |
| 	REG_K1: 119,
 | |
| 	REG_K2: 120,
 | |
| 	REG_K3: 121,
 | |
| 	REG_K4: 122,
 | |
| 	REG_K5: 123,
 | |
| 	REG_K6: 124,
 | |
| 	REG_K7: 125,
 | |
| }
 | |
| 
 | |
| // https://www.uclibc.org/docs/psABI-i386.pdf, table 2.14
 | |
| var X86DWARFRegisters = map[int16]int16{
 | |
| 	REG_AX: 0,
 | |
| 	REG_CX: 1,
 | |
| 	REG_DX: 2,
 | |
| 	REG_BX: 3,
 | |
| 	REG_SP: 4,
 | |
| 	REG_BP: 5,
 | |
| 	REG_SI: 6,
 | |
| 	REG_DI: 7,
 | |
| 	// 8 is "Return Address RA", whatever that is.
 | |
| 	// 9 is flags, which doesn't have a name.
 | |
| 	// ST registers. %stN => FN.
 | |
| 	REG_F0: 11,
 | |
| 	REG_F1: 12,
 | |
| 	REG_F2: 13,
 | |
| 	REG_F3: 14,
 | |
| 	REG_F4: 15,
 | |
| 	REG_F5: 16,
 | |
| 	REG_F6: 17,
 | |
| 	REG_F7: 18,
 | |
| 	// XMM registers. %xmmN => XN.
 | |
| 	REG_X0: 21,
 | |
| 	REG_X1: 22,
 | |
| 	REG_X2: 23,
 | |
| 	REG_X3: 24,
 | |
| 	REG_X4: 25,
 | |
| 	REG_X5: 26,
 | |
| 	REG_X6: 27,
 | |
| 	REG_X7: 28,
 | |
| 	// MMX registers. %mmN => MN.
 | |
| 	REG_M0: 29,
 | |
| 	REG_M1: 30,
 | |
| 	REG_M2: 31,
 | |
| 	REG_M3: 32,
 | |
| 	REG_M4: 33,
 | |
| 	REG_M5: 34,
 | |
| 	REG_M6: 35,
 | |
| 	REG_M7: 36,
 | |
| 	// 39 is mxcsr, which doesn't have a name.
 | |
| 	REG_ES:   40,
 | |
| 	REG_CS:   41,
 | |
| 	REG_SS:   42,
 | |
| 	REG_DS:   43,
 | |
| 	REG_FS:   44,
 | |
| 	REG_GS:   45,
 | |
| 	REG_TR:   48,
 | |
| 	REG_LDTR: 49,
 | |
| }
 |