a.out.go raw

   1  // Inferno utils/5c/5.out.h
   2  // https://bitbucket.org/inferno-os/inferno-os/src/master/utils/5c/5.out.h
   3  //
   4  //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
   5  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
   6  //	Portions Copyright © 1997-1999 Vita Nuova Limited
   7  //	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
   8  //	Portions Copyright © 2004,2006 Bruce Ellis
   9  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
  10  //	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
  11  //	Portions Copyright © 2009 The Go Authors. All rights reserved.
  12  //
  13  // Permission is hereby granted, free of charge, to any person obtaining a copy
  14  // of this software and associated documentation files (the "Software"), to deal
  15  // in the Software without restriction, including without limitation the rights
  16  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  17  // copies of the Software, and to permit persons to whom the Software is
  18  // furnished to do so, subject to the following conditions:
  19  //
  20  // The above copyright notice and this permission notice shall be included in
  21  // all copies or substantial portions of the Software.
  22  //
  23  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  24  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  25  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
  26  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  27  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  28  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  29  // THE SOFTWARE.
  30  
  31  package arm
  32  
  33  import "github.com/twitchyliquid64/golang-asm/obj"
  34  
  35  //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p arm
  36  
  37  const (
  38  	NSNAME = 8
  39  	NSYM   = 50
  40  	NREG   = 16
  41  )
  42  
  43  /* -1 disables use of REGARG */
  44  const (
  45  	REGARG = -1
  46  )
  47  
  48  const (
  49  	REG_R0 = obj.RBaseARM + iota // must be 16-aligned
  50  	REG_R1
  51  	REG_R2
  52  	REG_R3
  53  	REG_R4
  54  	REG_R5
  55  	REG_R6
  56  	REG_R7
  57  	REG_R8
  58  	REG_R9
  59  	REG_R10
  60  	REG_R11
  61  	REG_R12
  62  	REG_R13
  63  	REG_R14
  64  	REG_R15
  65  
  66  	REG_F0 // must be 16-aligned
  67  	REG_F1
  68  	REG_F2
  69  	REG_F3
  70  	REG_F4
  71  	REG_F5
  72  	REG_F6
  73  	REG_F7
  74  	REG_F8
  75  	REG_F9
  76  	REG_F10
  77  	REG_F11
  78  	REG_F12
  79  	REG_F13
  80  	REG_F14
  81  	REG_F15
  82  
  83  	REG_FPSR // must be 2-aligned
  84  	REG_FPCR
  85  
  86  	REG_CPSR // must be 2-aligned
  87  	REG_SPSR
  88  
  89  	REGRET = REG_R0
  90  	/* compiler allocates R1 up as temps */
  91  	/* compiler allocates register variables R3 up */
  92  	/* compiler allocates external registers R10 down */
  93  	REGEXT = REG_R10
  94  	/* these two registers are declared in runtime.h */
  95  	REGG = REGEXT - 0
  96  	REGM = REGEXT - 1
  97  
  98  	REGCTXT = REG_R7
  99  	REGTMP  = REG_R11
 100  	REGSP   = REG_R13
 101  	REGLINK = REG_R14
 102  	REGPC   = REG_R15
 103  
 104  	NFREG = 16
 105  	/* compiler allocates register variables F0 up */
 106  	/* compiler allocates external registers F7 down */
 107  	FREGRET = REG_F0
 108  	FREGEXT = REG_F7
 109  	FREGTMP = REG_F15
 110  )
 111  
 112  // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf
 113  var ARMDWARFRegisters = map[int16]int16{}
 114  
 115  func init() {
 116  	// f assigns dwarfregisters[from:to] = (base):(step*(to-from)+base)
 117  	f := func(from, to, base, step int16) {
 118  		for r := int16(from); r <= to; r++ {
 119  			ARMDWARFRegisters[r] = step*(r-from) + base
 120  		}
 121  	}
 122  	f(REG_R0, REG_R15, 0, 1)
 123  	f(REG_F0, REG_F15, 64, 2) // Use d0 through D15, aka S0, S2, ..., S30
 124  }
 125  
 126  // Special registers, after subtracting obj.RBaseARM, bit 9 indicates
 127  // a special register and the low bits select the register.
 128  const (
 129  	REG_SPECIAL = obj.RBaseARM + 1<<9 + iota
 130  	REG_MB_SY
 131  	REG_MB_ST
 132  	REG_MB_ISH
 133  	REG_MB_ISHST
 134  	REG_MB_NSH
 135  	REG_MB_NSHST
 136  	REG_MB_OSH
 137  	REG_MB_OSHST
 138  
 139  	MAXREG
 140  )
 141  
 142  const (
 143  	C_NONE = iota
 144  	C_REG
 145  	C_REGREG
 146  	C_REGREG2
 147  	C_REGLIST
 148  	C_SHIFT     /* register shift R>>x */
 149  	C_SHIFTADDR /* memory address with shifted offset R>>x(R) */
 150  	C_FREG
 151  	C_PSR
 152  	C_FCR
 153  	C_SPR /* REG_MB_SY */
 154  
 155  	C_RCON   /* 0xff rotated */
 156  	C_NCON   /* ~RCON */
 157  	C_RCON2A /* OR of two disjoint C_RCON constants */
 158  	C_RCON2S /* subtraction of two disjoint C_RCON constants */
 159  	C_SCON   /* 0xffff */
 160  	C_LCON
 161  	C_LCONADDR
 162  	C_ZFCON
 163  	C_SFCON
 164  	C_LFCON
 165  
 166  	C_RACON
 167  	C_LACON
 168  
 169  	C_SBRA
 170  	C_LBRA
 171  
 172  	C_HAUTO  /* halfword insn offset (-0xff to 0xff) */
 173  	C_FAUTO  /* float insn offset (0 to 0x3fc, word aligned) */
 174  	C_HFAUTO /* both H and F */
 175  	C_SAUTO  /* -0xfff to 0xfff */
 176  	C_LAUTO
 177  
 178  	C_HOREG
 179  	C_FOREG
 180  	C_HFOREG
 181  	C_SOREG
 182  	C_ROREG
 183  	C_SROREG /* both nil and R */
 184  	C_LOREG
 185  
 186  	C_PC
 187  	C_SP
 188  	C_HREG
 189  
 190  	C_ADDR /* reference to relocatable address */
 191  
 192  	// TLS "var" in local exec mode: will become a constant offset from
 193  	// thread local base that is ultimately chosen by the program linker.
 194  	C_TLS_LE
 195  
 196  	// TLS "var" in initial exec mode: will become a memory address (chosen
 197  	// by the program linker) that the dynamic linker will fill with the
 198  	// offset from the thread local base.
 199  	C_TLS_IE
 200  
 201  	C_TEXTSIZE
 202  
 203  	C_GOK
 204  
 205  	C_NCLASS /* must be the last */
 206  )
 207  
 208  const (
 209  	AAND = obj.ABaseARM + obj.A_ARCHSPECIFIC + iota
 210  	AEOR
 211  	ASUB
 212  	ARSB
 213  	AADD
 214  	AADC
 215  	ASBC
 216  	ARSC
 217  	ATST
 218  	ATEQ
 219  	ACMP
 220  	ACMN
 221  	AORR
 222  	ABIC
 223  
 224  	AMVN
 225  
 226  	/*
 227  	 * Do not reorder or fragment the conditional branch
 228  	 * opcodes, or the predication code will break
 229  	 */
 230  	ABEQ
 231  	ABNE
 232  	ABCS
 233  	ABHS
 234  	ABCC
 235  	ABLO
 236  	ABMI
 237  	ABPL
 238  	ABVS
 239  	ABVC
 240  	ABHI
 241  	ABLS
 242  	ABGE
 243  	ABLT
 244  	ABGT
 245  	ABLE
 246  
 247  	AMOVWD
 248  	AMOVWF
 249  	AMOVDW
 250  	AMOVFW
 251  	AMOVFD
 252  	AMOVDF
 253  	AMOVF
 254  	AMOVD
 255  
 256  	ACMPF
 257  	ACMPD
 258  	AADDF
 259  	AADDD
 260  	ASUBF
 261  	ASUBD
 262  	AMULF
 263  	AMULD
 264  	ANMULF
 265  	ANMULD
 266  	AMULAF
 267  	AMULAD
 268  	ANMULAF
 269  	ANMULAD
 270  	AMULSF
 271  	AMULSD
 272  	ANMULSF
 273  	ANMULSD
 274  	AFMULAF
 275  	AFMULAD
 276  	AFNMULAF
 277  	AFNMULAD
 278  	AFMULSF
 279  	AFMULSD
 280  	AFNMULSF
 281  	AFNMULSD
 282  	ADIVF
 283  	ADIVD
 284  	ASQRTF
 285  	ASQRTD
 286  	AABSF
 287  	AABSD
 288  	ANEGF
 289  	ANEGD
 290  
 291  	ASRL
 292  	ASRA
 293  	ASLL
 294  	AMULU
 295  	ADIVU
 296  	AMUL
 297  	AMMUL
 298  	ADIV
 299  	AMOD
 300  	AMODU
 301  	ADIVHW
 302  	ADIVUHW
 303  
 304  	AMOVB
 305  	AMOVBS
 306  	AMOVBU
 307  	AMOVH
 308  	AMOVHS
 309  	AMOVHU
 310  	AMOVW
 311  	AMOVM
 312  	ASWPBU
 313  	ASWPW
 314  
 315  	ARFE
 316  	ASWI
 317  	AMULA
 318  	AMULS
 319  	AMMULA
 320  	AMMULS
 321  
 322  	AWORD
 323  
 324  	AMULL
 325  	AMULAL
 326  	AMULLU
 327  	AMULALU
 328  
 329  	ABX
 330  	ABXRET
 331  	ADWORD
 332  
 333  	ALDREX
 334  	ASTREX
 335  	ALDREXD
 336  	ASTREXD
 337  
 338  	ADMB
 339  
 340  	APLD
 341  
 342  	ACLZ
 343  	AREV
 344  	AREV16
 345  	AREVSH
 346  	ARBIT
 347  
 348  	AXTAB
 349  	AXTAH
 350  	AXTABU
 351  	AXTAHU
 352  
 353  	ABFX
 354  	ABFXU
 355  	ABFC
 356  	ABFI
 357  
 358  	AMULWT
 359  	AMULWB
 360  	AMULBB
 361  	AMULAWT
 362  	AMULAWB
 363  	AMULABB
 364  
 365  	AMRC // MRC/MCR
 366  
 367  	ALAST
 368  
 369  	// aliases
 370  	AB  = obj.AJMP
 371  	ABL = obj.ACALL
 372  )
 373  
 374  /* scond byte */
 375  const (
 376  	C_SCOND = (1 << 4) - 1
 377  	C_SBIT  = 1 << 4
 378  	C_PBIT  = 1 << 5
 379  	C_WBIT  = 1 << 6
 380  	C_FBIT  = 1 << 7 /* psr flags-only */
 381  	C_UBIT  = 1 << 7 /* up bit, unsigned bit */
 382  
 383  	// These constants are the ARM condition codes encodings,
 384  	// XORed with 14 so that C_SCOND_NONE has value 0,
 385  	// so that a zeroed Prog.scond means "always execute".
 386  	C_SCOND_XOR = 14
 387  
 388  	C_SCOND_EQ   = 0 ^ C_SCOND_XOR
 389  	C_SCOND_NE   = 1 ^ C_SCOND_XOR
 390  	C_SCOND_HS   = 2 ^ C_SCOND_XOR
 391  	C_SCOND_LO   = 3 ^ C_SCOND_XOR
 392  	C_SCOND_MI   = 4 ^ C_SCOND_XOR
 393  	C_SCOND_PL   = 5 ^ C_SCOND_XOR
 394  	C_SCOND_VS   = 6 ^ C_SCOND_XOR
 395  	C_SCOND_VC   = 7 ^ C_SCOND_XOR
 396  	C_SCOND_HI   = 8 ^ C_SCOND_XOR
 397  	C_SCOND_LS   = 9 ^ C_SCOND_XOR
 398  	C_SCOND_GE   = 10 ^ C_SCOND_XOR
 399  	C_SCOND_LT   = 11 ^ C_SCOND_XOR
 400  	C_SCOND_GT   = 12 ^ C_SCOND_XOR
 401  	C_SCOND_LE   = 13 ^ C_SCOND_XOR
 402  	C_SCOND_NONE = 14 ^ C_SCOND_XOR
 403  	C_SCOND_NV   = 15 ^ C_SCOND_XOR
 404  
 405  	/* D_SHIFT type */
 406  	SHIFT_LL = 0 << 5
 407  	SHIFT_LR = 1 << 5
 408  	SHIFT_AR = 2 << 5
 409  	SHIFT_RR = 3 << 5
 410  )
 411