github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/cmd/internal/obj/arm/a.out.go (about)

     1  // Inferno utils/5c/5.out.h
     2  // https://bitbucket.org/inferno-os/inferno-os/src/default/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 "cmd/internal/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  	MAXREG
    90  	REGRET = REG_R0
    91  	/* compiler allocates R1 up as temps */
    92  	/* compiler allocates register variables R3 up */
    93  	/* compiler allocates external registers R10 down */
    94  	REGEXT = REG_R10
    95  	/* these two registers are declared in runtime.h */
    96  	REGG = REGEXT - 0
    97  	REGM = REGEXT - 1
    98  
    99  	REGCTXT = REG_R7
   100  	REGTMP  = REG_R11
   101  	REGSP   = REG_R13
   102  	REGLINK = REG_R14
   103  	REGPC   = REG_R15
   104  
   105  	NFREG = 16
   106  	/* compiler allocates register variables F0 up */
   107  	/* compiler allocates external registers F7 down */
   108  	FREGRET = REG_F0
   109  	FREGEXT = REG_F7
   110  	FREGTMP = REG_F15
   111  )
   112  
   113  const (
   114  	C_NONE = iota
   115  	C_REG
   116  	C_REGREG
   117  	C_REGREG2
   118  	C_REGLIST
   119  	C_SHIFT     /* register shift R>>x */
   120  	C_SHIFTADDR /* memory address with shifted offset R>>x(R) */
   121  	C_FREG
   122  	C_PSR
   123  	C_FCR
   124  
   125  	C_RCON   /* 0xff rotated */
   126  	C_NCON   /* ~RCON */
   127  	C_RCON2A /* OR of two disjoint C_RCON constants */
   128  	C_RCON2S /* subtraction of two disjoint C_RCON constants */
   129  	C_SCON   /* 0xffff */
   130  	C_LCON
   131  	C_LCONADDR
   132  	C_ZFCON
   133  	C_SFCON
   134  	C_LFCON
   135  
   136  	C_RACON
   137  	C_LACON
   138  
   139  	C_SBRA
   140  	C_LBRA
   141  
   142  	C_HAUTO  /* halfword insn offset (-0xff to 0xff) */
   143  	C_FAUTO  /* float insn offset (0 to 0x3fc, word aligned) */
   144  	C_HFAUTO /* both H and F */
   145  	C_SAUTO  /* -0xfff to 0xfff */
   146  	C_LAUTO
   147  
   148  	C_HOREG
   149  	C_FOREG
   150  	C_HFOREG
   151  	C_SOREG
   152  	C_ROREG
   153  	C_SROREG /* both nil and R */
   154  	C_LOREG
   155  
   156  	C_PC
   157  	C_SP
   158  	C_HREG
   159  
   160  	C_ADDR /* reference to relocatable address */
   161  
   162  	// TLS "var" in local exec mode: will become a constant offset from
   163  	// thread local base that is ultimately chosen by the program linker.
   164  	C_TLS_LE
   165  
   166  	// TLS "var" in initial exec mode: will become a memory address (chosen
   167  	// by the program linker) that the dynamic linker will fill with the
   168  	// offset from the thread local base.
   169  	C_TLS_IE
   170  
   171  	C_TEXTSIZE
   172  
   173  	C_GOK
   174  
   175  	C_NCLASS /* must be the last */
   176  )
   177  
   178  const (
   179  	AAND = obj.ABaseARM + obj.A_ARCHSPECIFIC + iota
   180  	AEOR
   181  	ASUB
   182  	ARSB
   183  	AADD
   184  	AADC
   185  	ASBC
   186  	ARSC
   187  	ATST
   188  	ATEQ
   189  	ACMP
   190  	ACMN
   191  	AORR
   192  	ABIC
   193  
   194  	AMVN
   195  
   196  	/*
   197  	 * Do not reorder or fragment the conditional branch
   198  	 * opcodes, or the predication code will break
   199  	 */
   200  	ABEQ
   201  	ABNE
   202  	ABCS
   203  	ABHS
   204  	ABCC
   205  	ABLO
   206  	ABMI
   207  	ABPL
   208  	ABVS
   209  	ABVC
   210  	ABHI
   211  	ABLS
   212  	ABGE
   213  	ABLT
   214  	ABGT
   215  	ABLE
   216  
   217  	AMOVWD
   218  	AMOVWF
   219  	AMOVDW
   220  	AMOVFW
   221  	AMOVFD
   222  	AMOVDF
   223  	AMOVF
   224  	AMOVD
   225  
   226  	ACMPF
   227  	ACMPD
   228  	AADDF
   229  	AADDD
   230  	ASUBF
   231  	ASUBD
   232  	AMULF
   233  	AMULD
   234  	ANMULF
   235  	ANMULD
   236  	AMULAF
   237  	AMULAD
   238  	ANMULAF
   239  	ANMULAD
   240  	AMULSF
   241  	AMULSD
   242  	ANMULSF
   243  	ANMULSD
   244  	AFMULAF
   245  	AFMULAD
   246  	AFNMULAF
   247  	AFNMULAD
   248  	AFMULSF
   249  	AFMULSD
   250  	AFNMULSF
   251  	AFNMULSD
   252  	ADIVF
   253  	ADIVD
   254  	ASQRTF
   255  	ASQRTD
   256  	AABSF
   257  	AABSD
   258  	ANEGF
   259  	ANEGD
   260  
   261  	ASRL
   262  	ASRA
   263  	ASLL
   264  	AMULU
   265  	ADIVU
   266  	AMUL
   267  	AMMUL
   268  	ADIV
   269  	AMOD
   270  	AMODU
   271  	ADIVHW
   272  	ADIVUHW
   273  
   274  	AMOVB
   275  	AMOVBS
   276  	AMOVBU
   277  	AMOVH
   278  	AMOVHS
   279  	AMOVHU
   280  	AMOVW
   281  	AMOVM
   282  	ASWPBU
   283  	ASWPW
   284  
   285  	ARFE
   286  	ASWI
   287  	AMULA
   288  	AMULS
   289  	AMMULA
   290  	AMMULS
   291  
   292  	AWORD
   293  
   294  	AMULL
   295  	AMULAL
   296  	AMULLU
   297  	AMULALU
   298  
   299  	ABX
   300  	ABXRET
   301  	ADWORD
   302  
   303  	ALDREX
   304  	ASTREX
   305  	ALDREXD
   306  	ASTREXD
   307  
   308  	APLD
   309  
   310  	ACLZ
   311  	AREV
   312  	AREV16
   313  	AREVSH
   314  	ARBIT
   315  
   316  	AXTAB
   317  	AXTAH
   318  	AXTABU
   319  	AXTAHU
   320  
   321  	ABFX
   322  	ABFXU
   323  	ABFC
   324  	ABFI
   325  
   326  	AMULWT
   327  	AMULWB
   328  	AMULBB
   329  	AMULAWT
   330  	AMULAWB
   331  	AMULABB
   332  
   333  	ADATABUNDLE
   334  	ADATABUNDLEEND
   335  
   336  	AMRC // MRC/MCR
   337  
   338  	ALAST
   339  
   340  	// aliases
   341  	AB  = obj.AJMP
   342  	ABL = obj.ACALL
   343  )
   344  
   345  /* scond byte */
   346  const (
   347  	C_SCOND = (1 << 4) - 1
   348  	C_SBIT  = 1 << 4
   349  	C_PBIT  = 1 << 5
   350  	C_WBIT  = 1 << 6
   351  	C_FBIT  = 1 << 7 /* psr flags-only */
   352  	C_UBIT  = 1 << 7 /* up bit, unsigned bit */
   353  
   354  	// These constants are the ARM condition codes encodings,
   355  	// XORed with 14 so that C_SCOND_NONE has value 0,
   356  	// so that a zeroed Prog.scond means "always execute".
   357  	C_SCOND_XOR = 14
   358  
   359  	C_SCOND_EQ   = 0 ^ C_SCOND_XOR
   360  	C_SCOND_NE   = 1 ^ C_SCOND_XOR
   361  	C_SCOND_HS   = 2 ^ C_SCOND_XOR
   362  	C_SCOND_LO   = 3 ^ C_SCOND_XOR
   363  	C_SCOND_MI   = 4 ^ C_SCOND_XOR
   364  	C_SCOND_PL   = 5 ^ C_SCOND_XOR
   365  	C_SCOND_VS   = 6 ^ C_SCOND_XOR
   366  	C_SCOND_VC   = 7 ^ C_SCOND_XOR
   367  	C_SCOND_HI   = 8 ^ C_SCOND_XOR
   368  	C_SCOND_LS   = 9 ^ C_SCOND_XOR
   369  	C_SCOND_GE   = 10 ^ C_SCOND_XOR
   370  	C_SCOND_LT   = 11 ^ C_SCOND_XOR
   371  	C_SCOND_GT   = 12 ^ C_SCOND_XOR
   372  	C_SCOND_LE   = 13 ^ C_SCOND_XOR
   373  	C_SCOND_NONE = 14 ^ C_SCOND_XOR
   374  	C_SCOND_NV   = 15 ^ C_SCOND_XOR
   375  
   376  	/* D_SHIFT type */
   377  	SHIFT_LL = 0 << 5
   378  	SHIFT_LR = 1 << 5
   379  	SHIFT_AR = 2 << 5
   380  	SHIFT_RR = 3 << 5
   381  )