github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/obj/arm/a.out.go (about) 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/go-asm/go/cmd/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 /* <=0xff rotated constant offset from auto */ 167 C_LACON /* Large Auto CONstant, i.e. large offset from SP */ 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 )