github.com/huandu/go@v0.0.0-20151114150818-04e615e41150/src/cmd/internal/obj/arm/a.out.go (about)

     1  // Inferno utils/5c/5.out.h
     2  // http://code.google.com/p/inferno-os/source/browse/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
   120  	C_FREG
   121  	C_PSR
   122  	C_FCR
   123  
   124  	C_RCON /* 0xff rotated */
   125  	C_NCON /* ~RCON */
   126  	C_SCON /* 0xffff */
   127  	C_LCON
   128  	C_LCONADDR
   129  	C_ZFCON
   130  	C_SFCON
   131  	C_LFCON
   132  
   133  	C_RACON
   134  	C_LACON
   135  
   136  	C_SBRA
   137  	C_LBRA
   138  
   139  	C_HAUTO  /* halfword insn offset (-0xff to 0xff) */
   140  	C_FAUTO  /* float insn offset (0 to 0x3fc, word aligned) */
   141  	C_HFAUTO /* both H and F */
   142  	C_SAUTO  /* -0xfff to 0xfff */
   143  	C_LAUTO
   144  
   145  	C_HOREG
   146  	C_FOREG
   147  	C_HFOREG
   148  	C_SOREG
   149  	C_ROREG
   150  	C_SROREG /* both nil and R */
   151  	C_LOREG
   152  
   153  	C_PC
   154  	C_SP
   155  	C_HREG
   156  
   157  	C_ADDR /* reference to relocatable address */
   158  	C_TEXTSIZE
   159  
   160  	C_GOK
   161  
   162  	C_NCLASS /* must be the last */
   163  )
   164  
   165  const (
   166  	AAND = obj.ABaseARM + obj.A_ARCHSPECIFIC + iota
   167  	AEOR
   168  	ASUB
   169  	ARSB
   170  	AADD
   171  	AADC
   172  	ASBC
   173  	ARSC
   174  	ATST
   175  	ATEQ
   176  	ACMP
   177  	ACMN
   178  	AORR
   179  	ABIC
   180  
   181  	AMVN
   182  
   183  	/*
   184  	 * Do not reorder or fragment the conditional branch
   185  	 * opcodes, or the predication code will break
   186  	 */
   187  	ABEQ
   188  	ABNE
   189  	ABCS
   190  	ABHS
   191  	ABCC
   192  	ABLO
   193  	ABMI
   194  	ABPL
   195  	ABVS
   196  	ABVC
   197  	ABHI
   198  	ABLS
   199  	ABGE
   200  	ABLT
   201  	ABGT
   202  	ABLE
   203  
   204  	AMOVWD
   205  	AMOVWF
   206  	AMOVDW
   207  	AMOVFW
   208  	AMOVFD
   209  	AMOVDF
   210  	AMOVF
   211  	AMOVD
   212  
   213  	ACMPF
   214  	ACMPD
   215  	AADDF
   216  	AADDD
   217  	ASUBF
   218  	ASUBD
   219  	AMULF
   220  	AMULD
   221  	ADIVF
   222  	ADIVD
   223  	ASQRTF
   224  	ASQRTD
   225  	AABSF
   226  	AABSD
   227  
   228  	ASRL
   229  	ASRA
   230  	ASLL
   231  	AMULU
   232  	ADIVU
   233  	AMUL
   234  	ADIV
   235  	AMOD
   236  	AMODU
   237  
   238  	AMOVB
   239  	AMOVBS
   240  	AMOVBU
   241  	AMOVH
   242  	AMOVHS
   243  	AMOVHU
   244  	AMOVW
   245  	AMOVM
   246  	ASWPBU
   247  	ASWPW
   248  
   249  	ARFE
   250  	ASWI
   251  	AMULA
   252  
   253  	AWORD
   254  	ABCASE
   255  	ACASE
   256  
   257  	AMULL
   258  	AMULAL
   259  	AMULLU
   260  	AMULALU
   261  
   262  	ABX
   263  	ABXRET
   264  	ADWORD
   265  
   266  	ALDREX
   267  	ASTREX
   268  	ALDREXD
   269  	ASTREXD
   270  
   271  	APLD
   272  
   273  	ACLZ
   274  
   275  	AMULWT
   276  	AMULWB
   277  	AMULAWT
   278  	AMULAWB
   279  
   280  	ADATABUNDLE
   281  	ADATABUNDLEEND
   282  
   283  	AMRC // MRC/MCR
   284  
   285  	ALAST
   286  
   287  	// aliases
   288  	AB  = obj.AJMP
   289  	ABL = obj.ACALL
   290  )
   291  
   292  /* scond byte */
   293  const (
   294  	C_SCOND = (1 << 4) - 1
   295  	C_SBIT  = 1 << 4
   296  	C_PBIT  = 1 << 5
   297  	C_WBIT  = 1 << 6
   298  	C_FBIT  = 1 << 7 /* psr flags-only */
   299  	C_UBIT  = 1 << 7 /* up bit, unsigned bit */
   300  
   301  	// These constants are the ARM condition codes encodings,
   302  	// XORed with 14 so that C_SCOND_NONE has value 0,
   303  	// so that a zeroed Prog.scond means "always execute".
   304  	C_SCOND_XOR = 14
   305  
   306  	C_SCOND_EQ   = 0 ^ C_SCOND_XOR
   307  	C_SCOND_NE   = 1 ^ C_SCOND_XOR
   308  	C_SCOND_HS   = 2 ^ C_SCOND_XOR
   309  	C_SCOND_LO   = 3 ^ C_SCOND_XOR
   310  	C_SCOND_MI   = 4 ^ C_SCOND_XOR
   311  	C_SCOND_PL   = 5 ^ C_SCOND_XOR
   312  	C_SCOND_VS   = 6 ^ C_SCOND_XOR
   313  	C_SCOND_VC   = 7 ^ C_SCOND_XOR
   314  	C_SCOND_HI   = 8 ^ C_SCOND_XOR
   315  	C_SCOND_LS   = 9 ^ C_SCOND_XOR
   316  	C_SCOND_GE   = 10 ^ C_SCOND_XOR
   317  	C_SCOND_LT   = 11 ^ C_SCOND_XOR
   318  	C_SCOND_GT   = 12 ^ C_SCOND_XOR
   319  	C_SCOND_LE   = 13 ^ C_SCOND_XOR
   320  	C_SCOND_NONE = 14 ^ C_SCOND_XOR
   321  	C_SCOND_NV   = 15 ^ C_SCOND_XOR
   322  
   323  	/* D_SHIFT type */
   324  	SHIFT_LL = 0 << 5
   325  	SHIFT_LR = 1 << 5
   326  	SHIFT_AR = 2 << 5
   327  	SHIFT_RR = 3 << 5
   328  )