mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 00:12:26 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			1033 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			1033 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// cmd/7c/7.out.h  from Vita Nuova.
 | 
						|
// https://code.google.com/p/ken-cc/source/browse/src/cmd/7c/7.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 arm64
 | 
						|
 | 
						|
import "github.com/twitchyliquid64/golang-asm/obj"
 | 
						|
 | 
						|
const (
 | 
						|
	NSNAME = 8
 | 
						|
	NSYM   = 50
 | 
						|
	NREG   = 32 /* number of general registers */
 | 
						|
	NFREG  = 32 /* number of floating point registers */
 | 
						|
)
 | 
						|
 | 
						|
// General purpose registers, kept in the low bits of Prog.Reg.
 | 
						|
const (
 | 
						|
	// integer
 | 
						|
	REG_R0 = obj.RBaseARM64 + iota
 | 
						|
	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
 | 
						|
 | 
						|
	// scalar floating point
 | 
						|
	REG_F0
 | 
						|
	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
 | 
						|
 | 
						|
	// SIMD
 | 
						|
	REG_V0
 | 
						|
	REG_V1
 | 
						|
	REG_V2
 | 
						|
	REG_V3
 | 
						|
	REG_V4
 | 
						|
	REG_V5
 | 
						|
	REG_V6
 | 
						|
	REG_V7
 | 
						|
	REG_V8
 | 
						|
	REG_V9
 | 
						|
	REG_V10
 | 
						|
	REG_V11
 | 
						|
	REG_V12
 | 
						|
	REG_V13
 | 
						|
	REG_V14
 | 
						|
	REG_V15
 | 
						|
	REG_V16
 | 
						|
	REG_V17
 | 
						|
	REG_V18
 | 
						|
	REG_V19
 | 
						|
	REG_V20
 | 
						|
	REG_V21
 | 
						|
	REG_V22
 | 
						|
	REG_V23
 | 
						|
	REG_V24
 | 
						|
	REG_V25
 | 
						|
	REG_V26
 | 
						|
	REG_V27
 | 
						|
	REG_V28
 | 
						|
	REG_V29
 | 
						|
	REG_V30
 | 
						|
	REG_V31
 | 
						|
 | 
						|
	// The EQ in
 | 
						|
	// 	CSET	EQ, R0
 | 
						|
	// is encoded as TYPE_REG, even though it's not really a register.
 | 
						|
	COND_EQ
 | 
						|
	COND_NE
 | 
						|
	COND_HS
 | 
						|
	COND_LO
 | 
						|
	COND_MI
 | 
						|
	COND_PL
 | 
						|
	COND_VS
 | 
						|
	COND_VC
 | 
						|
	COND_HI
 | 
						|
	COND_LS
 | 
						|
	COND_GE
 | 
						|
	COND_LT
 | 
						|
	COND_GT
 | 
						|
	COND_LE
 | 
						|
	COND_AL
 | 
						|
	COND_NV
 | 
						|
 | 
						|
	REG_RSP = REG_V31 + 32 // to differentiate ZR/SP, REG_RSP&0x1f = 31
 | 
						|
)
 | 
						|
 | 
						|
// bits 0-4 indicates register: Vn
 | 
						|
// bits 5-8 indicates arrangement: <T>
 | 
						|
const (
 | 
						|
	REG_ARNG = obj.RBaseARM64 + 1<<10 + iota<<9 // Vn.<T>
 | 
						|
	REG_ELEM                                    // Vn.<T>[index]
 | 
						|
	REG_ELEM_END
 | 
						|
)
 | 
						|
 | 
						|
// Not registers, but flags that can be combined with regular register
 | 
						|
// constants to indicate extended register conversion. When checking,
 | 
						|
// you should subtract obj.RBaseARM64 first. From this difference, bit 11
 | 
						|
// indicates extended register, bits 8-10 select the conversion mode.
 | 
						|
// REG_LSL is the index shift specifier, bit 9 indicates shifted offset register.
 | 
						|
const REG_LSL = obj.RBaseARM64 + 1<<9
 | 
						|
const REG_EXT = obj.RBaseARM64 + 1<<11
 | 
						|
 | 
						|
const (
 | 
						|
	REG_UXTB = REG_EXT + iota<<8
 | 
						|
	REG_UXTH
 | 
						|
	REG_UXTW
 | 
						|
	REG_UXTX
 | 
						|
	REG_SXTB
 | 
						|
	REG_SXTH
 | 
						|
	REG_SXTW
 | 
						|
	REG_SXTX
 | 
						|
)
 | 
						|
 | 
						|
// Special registers, after subtracting obj.RBaseARM64, bit 12 indicates
 | 
						|
// a special register and the low bits select the register.
 | 
						|
// SYSREG_END is the last item in the automatically generated system register
 | 
						|
// declaration, and it is defined in the sysRegEnc.go file.
 | 
						|
const (
 | 
						|
	REG_SPECIAL = obj.RBaseARM64 + 1<<12
 | 
						|
	REG_DAIFSet = SYSREG_END + iota
 | 
						|
	REG_DAIFClr
 | 
						|
	REG_PLDL1KEEP
 | 
						|
	REG_PLDL1STRM
 | 
						|
	REG_PLDL2KEEP
 | 
						|
	REG_PLDL2STRM
 | 
						|
	REG_PLDL3KEEP
 | 
						|
	REG_PLDL3STRM
 | 
						|
	REG_PLIL1KEEP
 | 
						|
	REG_PLIL1STRM
 | 
						|
	REG_PLIL2KEEP
 | 
						|
	REG_PLIL2STRM
 | 
						|
	REG_PLIL3KEEP
 | 
						|
	REG_PLIL3STRM
 | 
						|
	REG_PSTL1KEEP
 | 
						|
	REG_PSTL1STRM
 | 
						|
	REG_PSTL2KEEP
 | 
						|
	REG_PSTL2STRM
 | 
						|
	REG_PSTL3KEEP
 | 
						|
	REG_PSTL3STRM
 | 
						|
)
 | 
						|
 | 
						|
// Register assignments:
 | 
						|
//
 | 
						|
// compiler allocates R0 up as temps
 | 
						|
// compiler allocates register variables R7-R25
 | 
						|
// compiler allocates external registers R26 down
 | 
						|
//
 | 
						|
// compiler allocates register variables F7-F26
 | 
						|
// compiler allocates external registers F26 down
 | 
						|
const (
 | 
						|
	REGMIN = REG_R7  // register variables allocated from here to REGMAX
 | 
						|
	REGRT1 = REG_R16 // ARM64 IP0, external linker may use as a scrach register in trampoline
 | 
						|
	REGRT2 = REG_R17 // ARM64 IP1, external linker may use as a scrach register in trampoline
 | 
						|
	REGPR  = REG_R18 // ARM64 platform register, unused in the Go toolchain
 | 
						|
	REGMAX = REG_R25
 | 
						|
 | 
						|
	REGCTXT = REG_R26 // environment for closures
 | 
						|
	REGTMP  = REG_R27 // reserved for liblink
 | 
						|
	REGG    = REG_R28 // G
 | 
						|
	REGFP   = REG_R29 // frame pointer, unused in the Go toolchain
 | 
						|
	REGLINK = REG_R30
 | 
						|
 | 
						|
	// ARM64 uses R31 as both stack pointer and zero register,
 | 
						|
	// depending on the instruction. To differentiate RSP from ZR,
 | 
						|
	// we use a different numeric value for REGZERO and REGSP.
 | 
						|
	REGZERO = REG_R31
 | 
						|
	REGSP   = REG_RSP
 | 
						|
 | 
						|
	FREGRET = REG_F0
 | 
						|
	FREGMIN = REG_F7  // first register variable
 | 
						|
	FREGMAX = REG_F26 // last register variable for 7g only
 | 
						|
	FREGEXT = REG_F26 // first external register
 | 
						|
)
 | 
						|
 | 
						|
// http://infocenter.arm.com/help/topic/com.arm.doc.ecm0665627/abi_sve_aadwarf_100985_0000_00_en.pdf
 | 
						|
var ARM64DWARFRegisters = map[int16]int16{
 | 
						|
	REG_R0:  0,
 | 
						|
	REG_R1:  1,
 | 
						|
	REG_R2:  2,
 | 
						|
	REG_R3:  3,
 | 
						|
	REG_R4:  4,
 | 
						|
	REG_R5:  5,
 | 
						|
	REG_R6:  6,
 | 
						|
	REG_R7:  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,
 | 
						|
	REG_R16: 16,
 | 
						|
	REG_R17: 17,
 | 
						|
	REG_R18: 18,
 | 
						|
	REG_R19: 19,
 | 
						|
	REG_R20: 20,
 | 
						|
	REG_R21: 21,
 | 
						|
	REG_R22: 22,
 | 
						|
	REG_R23: 23,
 | 
						|
	REG_R24: 24,
 | 
						|
	REG_R25: 25,
 | 
						|
	REG_R26: 26,
 | 
						|
	REG_R27: 27,
 | 
						|
	REG_R28: 28,
 | 
						|
	REG_R29: 29,
 | 
						|
	REG_R30: 30,
 | 
						|
 | 
						|
	// floating point
 | 
						|
	REG_F0:  64,
 | 
						|
	REG_F1:  65,
 | 
						|
	REG_F2:  66,
 | 
						|
	REG_F3:  67,
 | 
						|
	REG_F4:  68,
 | 
						|
	REG_F5:  69,
 | 
						|
	REG_F6:  70,
 | 
						|
	REG_F7:  71,
 | 
						|
	REG_F8:  72,
 | 
						|
	REG_F9:  73,
 | 
						|
	REG_F10: 74,
 | 
						|
	REG_F11: 75,
 | 
						|
	REG_F12: 76,
 | 
						|
	REG_F13: 77,
 | 
						|
	REG_F14: 78,
 | 
						|
	REG_F15: 79,
 | 
						|
	REG_F16: 80,
 | 
						|
	REG_F17: 81,
 | 
						|
	REG_F18: 82,
 | 
						|
	REG_F19: 83,
 | 
						|
	REG_F20: 84,
 | 
						|
	REG_F21: 85,
 | 
						|
	REG_F22: 86,
 | 
						|
	REG_F23: 87,
 | 
						|
	REG_F24: 88,
 | 
						|
	REG_F25: 89,
 | 
						|
	REG_F26: 90,
 | 
						|
	REG_F27: 91,
 | 
						|
	REG_F28: 92,
 | 
						|
	REG_F29: 93,
 | 
						|
	REG_F30: 94,
 | 
						|
	REG_F31: 95,
 | 
						|
 | 
						|
	// SIMD
 | 
						|
	REG_V0:  64,
 | 
						|
	REG_V1:  65,
 | 
						|
	REG_V2:  66,
 | 
						|
	REG_V3:  67,
 | 
						|
	REG_V4:  68,
 | 
						|
	REG_V5:  69,
 | 
						|
	REG_V6:  70,
 | 
						|
	REG_V7:  71,
 | 
						|
	REG_V8:  72,
 | 
						|
	REG_V9:  73,
 | 
						|
	REG_V10: 74,
 | 
						|
	REG_V11: 75,
 | 
						|
	REG_V12: 76,
 | 
						|
	REG_V13: 77,
 | 
						|
	REG_V14: 78,
 | 
						|
	REG_V15: 79,
 | 
						|
	REG_V16: 80,
 | 
						|
	REG_V17: 81,
 | 
						|
	REG_V18: 82,
 | 
						|
	REG_V19: 83,
 | 
						|
	REG_V20: 84,
 | 
						|
	REG_V21: 85,
 | 
						|
	REG_V22: 86,
 | 
						|
	REG_V23: 87,
 | 
						|
	REG_V24: 88,
 | 
						|
	REG_V25: 89,
 | 
						|
	REG_V26: 90,
 | 
						|
	REG_V27: 91,
 | 
						|
	REG_V28: 92,
 | 
						|
	REG_V29: 93,
 | 
						|
	REG_V30: 94,
 | 
						|
	REG_V31: 95,
 | 
						|
}
 | 
						|
 | 
						|
const (
 | 
						|
	BIG = 2048 - 8
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	/* mark flags */
 | 
						|
	LABEL = 1 << iota
 | 
						|
	LEAF
 | 
						|
	FLOAT
 | 
						|
	BRANCH
 | 
						|
	LOAD
 | 
						|
	FCMP
 | 
						|
	SYNC
 | 
						|
	LIST
 | 
						|
	FOLL
 | 
						|
	NOSCHED
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// optab is sorted based on the order of these constants
 | 
						|
	// and the first match is chosen.
 | 
						|
	// The more specific class needs to come earlier.
 | 
						|
	C_NONE   = iota
 | 
						|
	C_REG    // R0..R30
 | 
						|
	C_RSP    // R0..R30, RSP
 | 
						|
	C_FREG   // F0..F31
 | 
						|
	C_VREG   // V0..V31
 | 
						|
	C_PAIR   // (Rn, Rm)
 | 
						|
	C_SHIFT  // Rn<<2
 | 
						|
	C_EXTREG // Rn.UXTB[<<3]
 | 
						|
	C_SPR    // REG_NZCV
 | 
						|
	C_COND   // EQ, NE, etc
 | 
						|
	C_ARNG   // Vn.<T>
 | 
						|
	C_ELEM   // Vn.<T>[index]
 | 
						|
	C_LIST   // [V1, V2, V3]
 | 
						|
 | 
						|
	C_ZCON     // $0 or ZR
 | 
						|
	C_ABCON0   // could be C_ADDCON0 or C_BITCON
 | 
						|
	C_ADDCON0  // 12-bit unsigned, unshifted
 | 
						|
	C_ABCON    // could be C_ADDCON or C_BITCON
 | 
						|
	C_AMCON    // could be C_ADDCON or C_MOVCON
 | 
						|
	C_ADDCON   // 12-bit unsigned, shifted left by 0 or 12
 | 
						|
	C_MBCON    // could be C_MOVCON or C_BITCON
 | 
						|
	C_MOVCON   // generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16
 | 
						|
	C_BITCON   // bitfield and logical immediate masks
 | 
						|
	C_ADDCON2  // 24-bit constant
 | 
						|
	C_LCON     // 32-bit constant
 | 
						|
	C_MOVCON2  // a constant that can be loaded with one MOVZ/MOVN and one MOVK
 | 
						|
	C_MOVCON3  // a constant that can be loaded with one MOVZ/MOVN and two MOVKs
 | 
						|
	C_VCON     // 64-bit constant
 | 
						|
	C_FCON     // floating-point constant
 | 
						|
	C_VCONADDR // 64-bit memory address
 | 
						|
 | 
						|
	C_AACON  // ADDCON offset in auto constant $a(FP)
 | 
						|
	C_AACON2 // 24-bit offset in auto constant $a(FP)
 | 
						|
	C_LACON  // 32-bit offset in auto constant $a(FP)
 | 
						|
	C_AECON  // ADDCON offset in extern constant $e(SB)
 | 
						|
 | 
						|
	// TODO(aram): only one branch class should be enough
 | 
						|
	C_SBRA // for TYPE_BRANCH
 | 
						|
	C_LBRA
 | 
						|
 | 
						|
	C_ZAUTO      // 0(RSP)
 | 
						|
	C_NSAUTO_8   // -256 <= x < 0, 0 mod 8
 | 
						|
	C_NSAUTO_4   // -256 <= x < 0, 0 mod 4
 | 
						|
	C_NSAUTO     // -256 <= x < 0
 | 
						|
	C_NPAUTO     // -512 <= x < 0, 0 mod 8
 | 
						|
	C_NAUTO4K    // -4095 <= x < 0
 | 
						|
	C_PSAUTO_8   // 0 to 255, 0 mod 8
 | 
						|
	C_PSAUTO_4   // 0 to 255, 0 mod 4
 | 
						|
	C_PSAUTO     // 0 to 255
 | 
						|
	C_PPAUTO     // 0 to 504, 0 mod 8
 | 
						|
	C_UAUTO4K_8  // 0 to 4095, 0 mod 8
 | 
						|
	C_UAUTO4K_4  // 0 to 4095, 0 mod 4
 | 
						|
	C_UAUTO4K_2  // 0 to 4095, 0 mod 2
 | 
						|
	C_UAUTO4K    // 0 to 4095
 | 
						|
	C_UAUTO8K_8  // 0 to 8190, 0 mod 8
 | 
						|
	C_UAUTO8K_4  // 0 to 8190, 0 mod 4
 | 
						|
	C_UAUTO8K    // 0 to 8190, 0 mod 2
 | 
						|
	C_UAUTO16K_8 // 0 to 16380, 0 mod 8
 | 
						|
	C_UAUTO16K   // 0 to 16380, 0 mod 4
 | 
						|
	C_UAUTO32K   // 0 to 32760, 0 mod 8
 | 
						|
	C_LAUTO      // any other 32-bit constant
 | 
						|
 | 
						|
	C_SEXT1  // 0 to 4095, direct
 | 
						|
	C_SEXT2  // 0 to 8190
 | 
						|
	C_SEXT4  // 0 to 16380
 | 
						|
	C_SEXT8  // 0 to 32760
 | 
						|
	C_SEXT16 // 0 to 65520
 | 
						|
	C_LEXT
 | 
						|
 | 
						|
	C_ZOREG    // 0(R)
 | 
						|
	C_NSOREG_8 // must mirror C_NSAUTO_8, etc
 | 
						|
	C_NSOREG_4
 | 
						|
	C_NSOREG
 | 
						|
	C_NPOREG
 | 
						|
	C_NOREG4K
 | 
						|
	C_PSOREG_8
 | 
						|
	C_PSOREG_4
 | 
						|
	C_PSOREG
 | 
						|
	C_PPOREG
 | 
						|
	C_UOREG4K_8
 | 
						|
	C_UOREG4K_4
 | 
						|
	C_UOREG4K_2
 | 
						|
	C_UOREG4K
 | 
						|
	C_UOREG8K_8
 | 
						|
	C_UOREG8K_4
 | 
						|
	C_UOREG8K
 | 
						|
	C_UOREG16K_8
 | 
						|
	C_UOREG16K
 | 
						|
	C_UOREG32K
 | 
						|
	C_LOREG
 | 
						|
 | 
						|
	C_ADDR // TODO(aram): explain difference from C_VCONADDR
 | 
						|
 | 
						|
	// The GOT slot for a symbol in -dynlink mode.
 | 
						|
	C_GOTADDR
 | 
						|
 | 
						|
	// 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_ROFF // register offset (including register extended)
 | 
						|
 | 
						|
	C_GOK
 | 
						|
	C_TEXTSIZE
 | 
						|
	C_NCLASS // must be last
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	C_XPRE  = 1 << 6 // match arm.C_WBIT, so Prog.String know how to print it
 | 
						|
	C_XPOST = 1 << 5 // match arm.C_PBIT, so Prog.String know how to print it
 | 
						|
)
 | 
						|
 | 
						|
//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p arm64
 | 
						|
 | 
						|
const (
 | 
						|
	AADC = obj.ABaseARM64 + obj.A_ARCHSPECIFIC + iota
 | 
						|
	AADCS
 | 
						|
	AADCSW
 | 
						|
	AADCW
 | 
						|
	AADD
 | 
						|
	AADDS
 | 
						|
	AADDSW
 | 
						|
	AADDW
 | 
						|
	AADR
 | 
						|
	AADRP
 | 
						|
	AAND
 | 
						|
	AANDS
 | 
						|
	AANDSW
 | 
						|
	AANDW
 | 
						|
	AASR
 | 
						|
	AASRW
 | 
						|
	AAT
 | 
						|
	ABFI
 | 
						|
	ABFIW
 | 
						|
	ABFM
 | 
						|
	ABFMW
 | 
						|
	ABFXIL
 | 
						|
	ABFXILW
 | 
						|
	ABIC
 | 
						|
	ABICS
 | 
						|
	ABICSW
 | 
						|
	ABICW
 | 
						|
	ABRK
 | 
						|
	ACBNZ
 | 
						|
	ACBNZW
 | 
						|
	ACBZ
 | 
						|
	ACBZW
 | 
						|
	ACCMN
 | 
						|
	ACCMNW
 | 
						|
	ACCMP
 | 
						|
	ACCMPW
 | 
						|
	ACINC
 | 
						|
	ACINCW
 | 
						|
	ACINV
 | 
						|
	ACINVW
 | 
						|
	ACLREX
 | 
						|
	ACLS
 | 
						|
	ACLSW
 | 
						|
	ACLZ
 | 
						|
	ACLZW
 | 
						|
	ACMN
 | 
						|
	ACMNW
 | 
						|
	ACMP
 | 
						|
	ACMPW
 | 
						|
	ACNEG
 | 
						|
	ACNEGW
 | 
						|
	ACRC32B
 | 
						|
	ACRC32CB
 | 
						|
	ACRC32CH
 | 
						|
	ACRC32CW
 | 
						|
	ACRC32CX
 | 
						|
	ACRC32H
 | 
						|
	ACRC32W
 | 
						|
	ACRC32X
 | 
						|
	ACSEL
 | 
						|
	ACSELW
 | 
						|
	ACSET
 | 
						|
	ACSETM
 | 
						|
	ACSETMW
 | 
						|
	ACSETW
 | 
						|
	ACSINC
 | 
						|
	ACSINCW
 | 
						|
	ACSINV
 | 
						|
	ACSINVW
 | 
						|
	ACSNEG
 | 
						|
	ACSNEGW
 | 
						|
	ADC
 | 
						|
	ADCPS1
 | 
						|
	ADCPS2
 | 
						|
	ADCPS3
 | 
						|
	ADMB
 | 
						|
	ADRPS
 | 
						|
	ADSB
 | 
						|
	AEON
 | 
						|
	AEONW
 | 
						|
	AEOR
 | 
						|
	AEORW
 | 
						|
	AERET
 | 
						|
	AEXTR
 | 
						|
	AEXTRW
 | 
						|
	AHINT
 | 
						|
	AHLT
 | 
						|
	AHVC
 | 
						|
	AIC
 | 
						|
	AISB
 | 
						|
	ALDADDAB
 | 
						|
	ALDADDAD
 | 
						|
	ALDADDAH
 | 
						|
	ALDADDAW
 | 
						|
	ALDADDALB
 | 
						|
	ALDADDALD
 | 
						|
	ALDADDALH
 | 
						|
	ALDADDALW
 | 
						|
	ALDADDB
 | 
						|
	ALDADDD
 | 
						|
	ALDADDH
 | 
						|
	ALDADDW
 | 
						|
	ALDADDLB
 | 
						|
	ALDADDLD
 | 
						|
	ALDADDLH
 | 
						|
	ALDADDLW
 | 
						|
	ALDANDAB
 | 
						|
	ALDANDAD
 | 
						|
	ALDANDAH
 | 
						|
	ALDANDAW
 | 
						|
	ALDANDALB
 | 
						|
	ALDANDALD
 | 
						|
	ALDANDALH
 | 
						|
	ALDANDALW
 | 
						|
	ALDANDB
 | 
						|
	ALDANDD
 | 
						|
	ALDANDH
 | 
						|
	ALDANDW
 | 
						|
	ALDANDLB
 | 
						|
	ALDANDLD
 | 
						|
	ALDANDLH
 | 
						|
	ALDANDLW
 | 
						|
	ALDAR
 | 
						|
	ALDARB
 | 
						|
	ALDARH
 | 
						|
	ALDARW
 | 
						|
	ALDAXP
 | 
						|
	ALDAXPW
 | 
						|
	ALDAXR
 | 
						|
	ALDAXRB
 | 
						|
	ALDAXRH
 | 
						|
	ALDAXRW
 | 
						|
	ALDEORAB
 | 
						|
	ALDEORAD
 | 
						|
	ALDEORAH
 | 
						|
	ALDEORAW
 | 
						|
	ALDEORALB
 | 
						|
	ALDEORALD
 | 
						|
	ALDEORALH
 | 
						|
	ALDEORALW
 | 
						|
	ALDEORB
 | 
						|
	ALDEORD
 | 
						|
	ALDEORH
 | 
						|
	ALDEORW
 | 
						|
	ALDEORLB
 | 
						|
	ALDEORLD
 | 
						|
	ALDEORLH
 | 
						|
	ALDEORLW
 | 
						|
	ALDORAB
 | 
						|
	ALDORAD
 | 
						|
	ALDORAH
 | 
						|
	ALDORAW
 | 
						|
	ALDORALB
 | 
						|
	ALDORALD
 | 
						|
	ALDORALH
 | 
						|
	ALDORALW
 | 
						|
	ALDORB
 | 
						|
	ALDORD
 | 
						|
	ALDORH
 | 
						|
	ALDORW
 | 
						|
	ALDORLB
 | 
						|
	ALDORLD
 | 
						|
	ALDORLH
 | 
						|
	ALDORLW
 | 
						|
	ALDP
 | 
						|
	ALDPW
 | 
						|
	ALDPSW
 | 
						|
	ALDXR
 | 
						|
	ALDXRB
 | 
						|
	ALDXRH
 | 
						|
	ALDXRW
 | 
						|
	ALDXP
 | 
						|
	ALDXPW
 | 
						|
	ALSL
 | 
						|
	ALSLW
 | 
						|
	ALSR
 | 
						|
	ALSRW
 | 
						|
	AMADD
 | 
						|
	AMADDW
 | 
						|
	AMNEG
 | 
						|
	AMNEGW
 | 
						|
	AMOVK
 | 
						|
	AMOVKW
 | 
						|
	AMOVN
 | 
						|
	AMOVNW
 | 
						|
	AMOVZ
 | 
						|
	AMOVZW
 | 
						|
	AMRS
 | 
						|
	AMSR
 | 
						|
	AMSUB
 | 
						|
	AMSUBW
 | 
						|
	AMUL
 | 
						|
	AMULW
 | 
						|
	AMVN
 | 
						|
	AMVNW
 | 
						|
	ANEG
 | 
						|
	ANEGS
 | 
						|
	ANEGSW
 | 
						|
	ANEGW
 | 
						|
	ANGC
 | 
						|
	ANGCS
 | 
						|
	ANGCSW
 | 
						|
	ANGCW
 | 
						|
	ANOOP
 | 
						|
	AORN
 | 
						|
	AORNW
 | 
						|
	AORR
 | 
						|
	AORRW
 | 
						|
	APRFM
 | 
						|
	APRFUM
 | 
						|
	ARBIT
 | 
						|
	ARBITW
 | 
						|
	AREM
 | 
						|
	AREMW
 | 
						|
	AREV
 | 
						|
	AREV16
 | 
						|
	AREV16W
 | 
						|
	AREV32
 | 
						|
	AREVW
 | 
						|
	AROR
 | 
						|
	ARORW
 | 
						|
	ASBC
 | 
						|
	ASBCS
 | 
						|
	ASBCSW
 | 
						|
	ASBCW
 | 
						|
	ASBFIZ
 | 
						|
	ASBFIZW
 | 
						|
	ASBFM
 | 
						|
	ASBFMW
 | 
						|
	ASBFX
 | 
						|
	ASBFXW
 | 
						|
	ASDIV
 | 
						|
	ASDIVW
 | 
						|
	ASEV
 | 
						|
	ASEVL
 | 
						|
	ASMADDL
 | 
						|
	ASMC
 | 
						|
	ASMNEGL
 | 
						|
	ASMSUBL
 | 
						|
	ASMULH
 | 
						|
	ASMULL
 | 
						|
	ASTXR
 | 
						|
	ASTXRB
 | 
						|
	ASTXRH
 | 
						|
	ASTXP
 | 
						|
	ASTXPW
 | 
						|
	ASTXRW
 | 
						|
	ASTLP
 | 
						|
	ASTLPW
 | 
						|
	ASTLR
 | 
						|
	ASTLRB
 | 
						|
	ASTLRH
 | 
						|
	ASTLRW
 | 
						|
	ASTLXP
 | 
						|
	ASTLXPW
 | 
						|
	ASTLXR
 | 
						|
	ASTLXRB
 | 
						|
	ASTLXRH
 | 
						|
	ASTLXRW
 | 
						|
	ASTP
 | 
						|
	ASTPW
 | 
						|
	ASUB
 | 
						|
	ASUBS
 | 
						|
	ASUBSW
 | 
						|
	ASUBW
 | 
						|
	ASVC
 | 
						|
	ASXTB
 | 
						|
	ASXTBW
 | 
						|
	ASXTH
 | 
						|
	ASXTHW
 | 
						|
	ASXTW
 | 
						|
	ASYS
 | 
						|
	ASYSL
 | 
						|
	ATBNZ
 | 
						|
	ATBZ
 | 
						|
	ATLBI
 | 
						|
	ATST
 | 
						|
	ATSTW
 | 
						|
	AUBFIZ
 | 
						|
	AUBFIZW
 | 
						|
	AUBFM
 | 
						|
	AUBFMW
 | 
						|
	AUBFX
 | 
						|
	AUBFXW
 | 
						|
	AUDIV
 | 
						|
	AUDIVW
 | 
						|
	AUMADDL
 | 
						|
	AUMNEGL
 | 
						|
	AUMSUBL
 | 
						|
	AUMULH
 | 
						|
	AUMULL
 | 
						|
	AUREM
 | 
						|
	AUREMW
 | 
						|
	AUXTB
 | 
						|
	AUXTH
 | 
						|
	AUXTW
 | 
						|
	AUXTBW
 | 
						|
	AUXTHW
 | 
						|
	AWFE
 | 
						|
	AWFI
 | 
						|
	AYIELD
 | 
						|
	AMOVB
 | 
						|
	AMOVBU
 | 
						|
	AMOVH
 | 
						|
	AMOVHU
 | 
						|
	AMOVW
 | 
						|
	AMOVWU
 | 
						|
	AMOVD
 | 
						|
	AMOVNP
 | 
						|
	AMOVNPW
 | 
						|
	AMOVP
 | 
						|
	AMOVPD
 | 
						|
	AMOVPQ
 | 
						|
	AMOVPS
 | 
						|
	AMOVPSW
 | 
						|
	AMOVPW
 | 
						|
	ASWPAD
 | 
						|
	ASWPAW
 | 
						|
	ASWPAH
 | 
						|
	ASWPAB
 | 
						|
	ASWPALD
 | 
						|
	ASWPALW
 | 
						|
	ASWPALH
 | 
						|
	ASWPALB
 | 
						|
	ASWPD
 | 
						|
	ASWPW
 | 
						|
	ASWPH
 | 
						|
	ASWPB
 | 
						|
	ASWPLD
 | 
						|
	ASWPLW
 | 
						|
	ASWPLH
 | 
						|
	ASWPLB
 | 
						|
	ABEQ
 | 
						|
	ABNE
 | 
						|
	ABCS
 | 
						|
	ABHS
 | 
						|
	ABCC
 | 
						|
	ABLO
 | 
						|
	ABMI
 | 
						|
	ABPL
 | 
						|
	ABVS
 | 
						|
	ABVC
 | 
						|
	ABHI
 | 
						|
	ABLS
 | 
						|
	ABGE
 | 
						|
	ABLT
 | 
						|
	ABGT
 | 
						|
	ABLE
 | 
						|
	AFABSD
 | 
						|
	AFABSS
 | 
						|
	AFADDD
 | 
						|
	AFADDS
 | 
						|
	AFCCMPD
 | 
						|
	AFCCMPED
 | 
						|
	AFCCMPS
 | 
						|
	AFCCMPES
 | 
						|
	AFCMPD
 | 
						|
	AFCMPED
 | 
						|
	AFCMPES
 | 
						|
	AFCMPS
 | 
						|
	AFCVTSD
 | 
						|
	AFCVTDS
 | 
						|
	AFCVTZSD
 | 
						|
	AFCVTZSDW
 | 
						|
	AFCVTZSS
 | 
						|
	AFCVTZSSW
 | 
						|
	AFCVTZUD
 | 
						|
	AFCVTZUDW
 | 
						|
	AFCVTZUS
 | 
						|
	AFCVTZUSW
 | 
						|
	AFDIVD
 | 
						|
	AFDIVS
 | 
						|
	AFLDPD
 | 
						|
	AFLDPS
 | 
						|
	AFMOVD
 | 
						|
	AFMOVS
 | 
						|
	AFMOVQ
 | 
						|
	AFMULD
 | 
						|
	AFMULS
 | 
						|
	AFNEGD
 | 
						|
	AFNEGS
 | 
						|
	AFSQRTD
 | 
						|
	AFSQRTS
 | 
						|
	AFSTPD
 | 
						|
	AFSTPS
 | 
						|
	AFSUBD
 | 
						|
	AFSUBS
 | 
						|
	ASCVTFD
 | 
						|
	ASCVTFS
 | 
						|
	ASCVTFWD
 | 
						|
	ASCVTFWS
 | 
						|
	AUCVTFD
 | 
						|
	AUCVTFS
 | 
						|
	AUCVTFWD
 | 
						|
	AUCVTFWS
 | 
						|
	AWORD
 | 
						|
	ADWORD
 | 
						|
	AFCSELS
 | 
						|
	AFCSELD
 | 
						|
	AFMAXS
 | 
						|
	AFMINS
 | 
						|
	AFMAXD
 | 
						|
	AFMIND
 | 
						|
	AFMAXNMS
 | 
						|
	AFMAXNMD
 | 
						|
	AFNMULS
 | 
						|
	AFNMULD
 | 
						|
	AFRINTNS
 | 
						|
	AFRINTND
 | 
						|
	AFRINTPS
 | 
						|
	AFRINTPD
 | 
						|
	AFRINTMS
 | 
						|
	AFRINTMD
 | 
						|
	AFRINTZS
 | 
						|
	AFRINTZD
 | 
						|
	AFRINTAS
 | 
						|
	AFRINTAD
 | 
						|
	AFRINTXS
 | 
						|
	AFRINTXD
 | 
						|
	AFRINTIS
 | 
						|
	AFRINTID
 | 
						|
	AFMADDS
 | 
						|
	AFMADDD
 | 
						|
	AFMSUBS
 | 
						|
	AFMSUBD
 | 
						|
	AFNMADDS
 | 
						|
	AFNMADDD
 | 
						|
	AFNMSUBS
 | 
						|
	AFNMSUBD
 | 
						|
	AFMINNMS
 | 
						|
	AFMINNMD
 | 
						|
	AFCVTDH
 | 
						|
	AFCVTHS
 | 
						|
	AFCVTHD
 | 
						|
	AFCVTSH
 | 
						|
	AAESD
 | 
						|
	AAESE
 | 
						|
	AAESIMC
 | 
						|
	AAESMC
 | 
						|
	ASHA1C
 | 
						|
	ASHA1H
 | 
						|
	ASHA1M
 | 
						|
	ASHA1P
 | 
						|
	ASHA1SU0
 | 
						|
	ASHA1SU1
 | 
						|
	ASHA256H
 | 
						|
	ASHA256H2
 | 
						|
	ASHA256SU0
 | 
						|
	ASHA256SU1
 | 
						|
	ASHA512H
 | 
						|
	ASHA512H2
 | 
						|
	ASHA512SU0
 | 
						|
	ASHA512SU1
 | 
						|
	AVADD
 | 
						|
	AVADDP
 | 
						|
	AVAND
 | 
						|
	AVBIF
 | 
						|
	AVCMEQ
 | 
						|
	AVCNT
 | 
						|
	AVEOR
 | 
						|
	AVMOV
 | 
						|
	AVLD1
 | 
						|
	AVLD2
 | 
						|
	AVLD3
 | 
						|
	AVLD4
 | 
						|
	AVLD1R
 | 
						|
	AVLD2R
 | 
						|
	AVLD3R
 | 
						|
	AVLD4R
 | 
						|
	AVORR
 | 
						|
	AVREV16
 | 
						|
	AVREV32
 | 
						|
	AVREV64
 | 
						|
	AVST1
 | 
						|
	AVST2
 | 
						|
	AVST3
 | 
						|
	AVST4
 | 
						|
	AVDUP
 | 
						|
	AVADDV
 | 
						|
	AVMOVI
 | 
						|
	AVUADDLV
 | 
						|
	AVSUB
 | 
						|
	AVFMLA
 | 
						|
	AVFMLS
 | 
						|
	AVPMULL
 | 
						|
	AVPMULL2
 | 
						|
	AVEXT
 | 
						|
	AVRBIT
 | 
						|
	AVUSHR
 | 
						|
	AVUSHLL
 | 
						|
	AVUSHLL2
 | 
						|
	AVUXTL
 | 
						|
	AVUXTL2
 | 
						|
	AVUZP1
 | 
						|
	AVUZP2
 | 
						|
	AVSHL
 | 
						|
	AVSRI
 | 
						|
	AVBSL
 | 
						|
	AVBIT
 | 
						|
	AVTBL
 | 
						|
	AVZIP1
 | 
						|
	AVZIP2
 | 
						|
	AVCMTST
 | 
						|
	ALAST
 | 
						|
	AB  = obj.AJMP
 | 
						|
	ABL = obj.ACALL
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// shift types
 | 
						|
	SHIFT_LL = 0 << 22
 | 
						|
	SHIFT_LR = 1 << 22
 | 
						|
	SHIFT_AR = 2 << 22
 | 
						|
)
 | 
						|
 | 
						|
// Arrangement for ARM64 SIMD instructions
 | 
						|
const (
 | 
						|
	// arrangement types
 | 
						|
	ARNG_8B = iota
 | 
						|
	ARNG_16B
 | 
						|
	ARNG_1D
 | 
						|
	ARNG_4H
 | 
						|
	ARNG_8H
 | 
						|
	ARNG_2S
 | 
						|
	ARNG_4S
 | 
						|
	ARNG_2D
 | 
						|
	ARNG_1Q
 | 
						|
	ARNG_B
 | 
						|
	ARNG_H
 | 
						|
	ARNG_S
 | 
						|
	ARNG_D
 | 
						|
)
 |