Home | History | Annotate | Download | only in arm64
      1 // cmd/7c/7.out.h  from Vita Nuova.
      2 // https://code.google.com/p/ken-cc/source/browse/src/cmd/7c/7.out.h
      3 //
      4 // 	Copyright  1994-1999 Lucent Technologies Inc. All rights reserved.
      5 // 	Portions Copyright  1995-1997 C H Forsyth (forsyth (a] 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 (a] 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 arm64
     32 
     33 import "cmd/internal/obj"
     34 
     35 const (
     36 	NSNAME = 8
     37 	NSYM   = 50
     38 	NREG   = 32 /* number of general registers */
     39 	NFREG  = 32 /* number of floating point registers */
     40 )
     41 
     42 // General purpose registers, kept in the low bits of Prog.Reg.
     43 const (
     44 	// integer
     45 	REG_R0 = obj.RBaseARM64 + iota
     46 	REG_R1
     47 	REG_R2
     48 	REG_R3
     49 	REG_R4
     50 	REG_R5
     51 	REG_R6
     52 	REG_R7
     53 	REG_R8
     54 	REG_R9
     55 	REG_R10
     56 	REG_R11
     57 	REG_R12
     58 	REG_R13
     59 	REG_R14
     60 	REG_R15
     61 	REG_R16
     62 	REG_R17
     63 	REG_R18
     64 	REG_R19
     65 	REG_R20
     66 	REG_R21
     67 	REG_R22
     68 	REG_R23
     69 	REG_R24
     70 	REG_R25
     71 	REG_R26
     72 	REG_R27
     73 	REG_R28
     74 	REG_R29
     75 	REG_R30
     76 	REG_R31
     77 
     78 	// scalar floating point
     79 	REG_F0
     80 	REG_F1
     81 	REG_F2
     82 	REG_F3
     83 	REG_F4
     84 	REG_F5
     85 	REG_F6
     86 	REG_F7
     87 	REG_F8
     88 	REG_F9
     89 	REG_F10
     90 	REG_F11
     91 	REG_F12
     92 	REG_F13
     93 	REG_F14
     94 	REG_F15
     95 	REG_F16
     96 	REG_F17
     97 	REG_F18
     98 	REG_F19
     99 	REG_F20
    100 	REG_F21
    101 	REG_F22
    102 	REG_F23
    103 	REG_F24
    104 	REG_F25
    105 	REG_F26
    106 	REG_F27
    107 	REG_F28
    108 	REG_F29
    109 	REG_F30
    110 	REG_F31
    111 
    112 	// SIMD
    113 	REG_V0
    114 	REG_V1
    115 	REG_V2
    116 	REG_V3
    117 	REG_V4
    118 	REG_V5
    119 	REG_V6
    120 	REG_V7
    121 	REG_V8
    122 	REG_V9
    123 	REG_V10
    124 	REG_V11
    125 	REG_V12
    126 	REG_V13
    127 	REG_V14
    128 	REG_V15
    129 	REG_V16
    130 	REG_V17
    131 	REG_V18
    132 	REG_V19
    133 	REG_V20
    134 	REG_V21
    135 	REG_V22
    136 	REG_V23
    137 	REG_V24
    138 	REG_V25
    139 	REG_V26
    140 	REG_V27
    141 	REG_V28
    142 	REG_V29
    143 	REG_V30
    144 	REG_V31
    145 
    146 	// The EQ in
    147 	// 	CSET	EQ, R0
    148 	// is encoded as TYPE_REG, even though it's not really a register.
    149 	COND_EQ
    150 	COND_NE
    151 	COND_HS
    152 	COND_LO
    153 	COND_MI
    154 	COND_PL
    155 	COND_VS
    156 	COND_VC
    157 	COND_HI
    158 	COND_LS
    159 	COND_GE
    160 	COND_LT
    161 	COND_GT
    162 	COND_LE
    163 	COND_AL
    164 	COND_NV
    165 
    166 	REG_RSP = REG_V31 + 32 // to differentiate ZR/SP, REG_RSP&0x1f = 31
    167 )
    168 
    169 // Not registers, but flags that can be combined with regular register
    170 // constants to indicate extended register conversion. When checking,
    171 // you should subtract obj.RBaseARM64 first. From this difference, bit 11
    172 // indicates extended register, bits 8-10 select the conversion mode.
    173 const REG_EXT = obj.RBaseARM64 + 1<<11
    174 
    175 const (
    176 	REG_UXTB = REG_EXT + iota<<8
    177 	REG_UXTH
    178 	REG_UXTW
    179 	REG_UXTX
    180 	REG_SXTB
    181 	REG_SXTH
    182 	REG_SXTW
    183 	REG_SXTX
    184 )
    185 
    186 // Special registers, after subtracting obj.RBaseARM64, bit 12 indicates
    187 // a special register and the low bits select the register.
    188 const (
    189 	REG_SPECIAL = obj.RBaseARM64 + 1<<12 + iota
    190 	REG_DAIF
    191 	REG_NZCV
    192 	REG_FPSR
    193 	REG_FPCR
    194 	REG_SPSR_EL1
    195 	REG_ELR_EL1
    196 	REG_SPSR_EL2
    197 	REG_ELR_EL2
    198 	REG_CurrentEL
    199 	REG_SP_EL0
    200 	REG_SPSel
    201 	REG_DAIFSet
    202 	REG_DAIFClr
    203 )
    204 
    205 // Register assignments:
    206 //
    207 // compiler allocates R0 up as temps
    208 // compiler allocates register variables R7-R25
    209 // compiler allocates external registers R26 down
    210 //
    211 // compiler allocates register variables F7-F26
    212 // compiler allocates external registers F26 down
    213 const (
    214 	REGMIN = REG_R7  // register variables allocated from here to REGMAX
    215 	REGRT1 = REG_R16 // ARM64 IP0, for external linker, runtime, duffzero and duffcopy
    216 	REGRT2 = REG_R17 // ARM64 IP1, for external linker, runtime, duffcopy
    217 	REGPR  = REG_R18 // ARM64 platform register, unused in the Go toolchain
    218 	REGMAX = REG_R25
    219 
    220 	REGCTXT = REG_R26 // environment for closures
    221 	REGTMP  = REG_R27 // reserved for liblink
    222 	REGG    = REG_R28 // G
    223 	REGFP   = REG_R29 // frame pointer, unused in the Go toolchain
    224 	REGLINK = REG_R30
    225 
    226 	// ARM64 uses R31 as both stack pointer and zero register,
    227 	// depending on the instruction. To differentiate RSP from ZR,
    228 	// we use a different numeric value for REGZERO and REGSP.
    229 	REGZERO = REG_R31
    230 	REGSP   = REG_RSP
    231 
    232 	FREGRET = REG_F0
    233 	FREGMIN = REG_F7  // first register variable
    234 	FREGMAX = REG_F26 // last register variable for 7g only
    235 	FREGEXT = REG_F26 // first external register
    236 )
    237 
    238 const (
    239 	BIG = 2048 - 8
    240 )
    241 
    242 const (
    243 	/* mark flags */
    244 	LABEL = 1 << iota
    245 	LEAF
    246 	FLOAT
    247 	BRANCH
    248 	LOAD
    249 	FCMP
    250 	SYNC
    251 	LIST
    252 	FOLL
    253 	NOSCHED
    254 )
    255 
    256 const (
    257 	C_NONE   = iota
    258 	C_REG    // R0..R30
    259 	C_RSP    // R0..R30, RSP
    260 	C_FREG   // F0..F31
    261 	C_VREG   // V0..V31
    262 	C_PAIR   // (Rn, Rm)
    263 	C_SHIFT  // Rn<<2
    264 	C_EXTREG // Rn.UXTB<<3
    265 	C_SPR    // REG_NZCV
    266 	C_COND   // EQ, NE, etc
    267 
    268 	C_ZCON     // $0 or ZR
    269 	C_ADDCON0  // 12-bit unsigned, unshifted
    270 	C_ADDCON   // 12-bit unsigned, shifted left by 0 or 12
    271 	C_MOVCON   // generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16
    272 	C_BITCON   // bitfield and logical immediate masks
    273 	C_ABCON0   // could be C_ADDCON0 or C_BITCON
    274 	C_ABCON    // could be C_ADDCON or C_BITCON
    275 	C_MBCON    // could be C_MOVCON or C_BITCON
    276 	C_LCON     // 32-bit constant
    277 	C_VCON     // 64-bit constant
    278 	C_FCON     // floating-point constant
    279 	C_VCONADDR // 64-bit memory address
    280 
    281 	C_AACON // ADDCON offset in auto constant $a(FP)
    282 	C_LACON // 32-bit offset in auto constant $a(FP)
    283 	C_AECON // ADDCON offset in extern constant $e(SB)
    284 
    285 	// TODO(aram): only one branch class should be enough
    286 	C_SBRA // for TYPE_BRANCH
    287 	C_LBRA
    288 
    289 	C_NPAUTO   // -512 <= x < 0, 0 mod 8
    290 	C_NSAUTO   // -256 <= x < 0
    291 	C_PSAUTO   // 0 to 255
    292 	C_PPAUTO   // 0 to 504, 0 mod 8
    293 	C_UAUTO4K  // 0 to 4095
    294 	C_UAUTO8K  // 0 to 8190, 0 mod 2
    295 	C_UAUTO16K // 0 to 16380, 0 mod 4
    296 	C_UAUTO32K // 0 to 32760, 0 mod 8
    297 	C_UAUTO64K // 0 to 65520, 0 mod 16
    298 	C_LAUTO    // any other 32-bit constant
    299 
    300 	C_SEXT1  // 0 to 4095, direct
    301 	C_SEXT2  // 0 to 8190
    302 	C_SEXT4  // 0 to 16380
    303 	C_SEXT8  // 0 to 32760
    304 	C_SEXT16 // 0 to 65520
    305 	C_LEXT
    306 
    307 	// TODO(aram): s/AUTO/INDIR/
    308 	C_ZOREG  // 0(R)
    309 	C_NPOREG // mirror NPAUTO, etc
    310 	C_NSOREG
    311 	C_PSOREG
    312 	C_PPOREG
    313 	C_UOREG4K
    314 	C_UOREG8K
    315 	C_UOREG16K
    316 	C_UOREG32K
    317 	C_UOREG64K
    318 	C_LOREG
    319 
    320 	C_ADDR // TODO(aram): explain difference from C_VCONADDR
    321 
    322 	// The GOT slot for a symbol in -dynlink mode.
    323 	C_GOTADDR
    324 
    325 	// TLS "var" in local exec mode: will become a constant offset from
    326 	// thread local base that is ultimately chosen by the program linker.
    327 	C_TLS_LE
    328 
    329 	// TLS "var" in initial exec mode: will become a memory address (chosen
    330 	// by the program linker) that the dynamic linker will fill with the
    331 	// offset from the thread local base.
    332 	C_TLS_IE
    333 
    334 	C_ROFF // register offset (including register extended)
    335 
    336 	C_GOK
    337 	C_TEXTSIZE
    338 	C_NCLASS // must be last
    339 )
    340 
    341 const (
    342 	C_XPRE  = 1 << 6 // match arm.C_WBIT, so Prog.String know how to print it
    343 	C_XPOST = 1 << 5 // match arm.C_PBIT, so Prog.String know how to print it
    344 )
    345 
    346 //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p arm64
    347 
    348 const (
    349 	AADC = obj.ABaseARM64 + obj.A_ARCHSPECIFIC + iota
    350 	AADCS
    351 	AADCSW
    352 	AADCW
    353 	AADD
    354 	AADDS
    355 	AADDSW
    356 	AADDW
    357 	AADR
    358 	AADRP
    359 	AAND
    360 	AANDS
    361 	AANDSW
    362 	AANDW
    363 	AASR
    364 	AASRW
    365 	AAT
    366 	ABFI
    367 	ABFIW
    368 	ABFM
    369 	ABFMW
    370 	ABFXIL
    371 	ABFXILW
    372 	ABIC
    373 	ABICS
    374 	ABICSW
    375 	ABICW
    376 	ABRK
    377 	ACBNZ
    378 	ACBNZW
    379 	ACBZ
    380 	ACBZW
    381 	ACCMN
    382 	ACCMNW
    383 	ACCMP
    384 	ACCMPW
    385 	ACINC
    386 	ACINCW
    387 	ACINV
    388 	ACINVW
    389 	ACLREX
    390 	ACLS
    391 	ACLSW
    392 	ACLZ
    393 	ACLZW
    394 	ACMN
    395 	ACMNW
    396 	ACMP
    397 	ACMPW
    398 	ACNEG
    399 	ACNEGW
    400 	ACRC32B
    401 	ACRC32CB
    402 	ACRC32CH
    403 	ACRC32CW
    404 	ACRC32CX
    405 	ACRC32H
    406 	ACRC32W
    407 	ACRC32X
    408 	ACSEL
    409 	ACSELW
    410 	ACSET
    411 	ACSETM
    412 	ACSETMW
    413 	ACSETW
    414 	ACSINC
    415 	ACSINCW
    416 	ACSINV
    417 	ACSINVW
    418 	ACSNEG
    419 	ACSNEGW
    420 	ADC
    421 	ADCPS1
    422 	ADCPS2
    423 	ADCPS3
    424 	ADMB
    425 	ADRPS
    426 	ADSB
    427 	AEON
    428 	AEONW
    429 	AEOR
    430 	AEORW
    431 	AERET
    432 	AEXTR
    433 	AEXTRW
    434 	AHINT
    435 	AHLT
    436 	AHVC
    437 	AIC
    438 	AISB
    439 	ALDAR
    440 	ALDARB
    441 	ALDARH
    442 	ALDARW
    443 	ALDAXP
    444 	ALDAXPW
    445 	ALDAXR
    446 	ALDAXRB
    447 	ALDAXRH
    448 	ALDAXRW
    449 	ALDP
    450 	ALDXR
    451 	ALDXRB
    452 	ALDXRH
    453 	ALDXRW
    454 	ALDXP
    455 	ALDXPW
    456 	ALSL
    457 	ALSLW
    458 	ALSR
    459 	ALSRW
    460 	AMADD
    461 	AMADDW
    462 	AMNEG
    463 	AMNEGW
    464 	AMOVK
    465 	AMOVKW
    466 	AMOVN
    467 	AMOVNW
    468 	AMOVZ
    469 	AMOVZW
    470 	AMRS
    471 	AMSR
    472 	AMSUB
    473 	AMSUBW
    474 	AMUL
    475 	AMULW
    476 	AMVN
    477 	AMVNW
    478 	ANEG
    479 	ANEGS
    480 	ANEGSW
    481 	ANEGW
    482 	ANGC
    483 	ANGCS
    484 	ANGCSW
    485 	ANGCW
    486 	AORN
    487 	AORNW
    488 	AORR
    489 	AORRW
    490 	APRFM
    491 	APRFUM
    492 	ARBIT
    493 	ARBITW
    494 	AREM
    495 	AREMW
    496 	AREV
    497 	AREV16
    498 	AREV16W
    499 	AREV32
    500 	AREVW
    501 	AROR
    502 	ARORW
    503 	ASBC
    504 	ASBCS
    505 	ASBCSW
    506 	ASBCW
    507 	ASBFIZ
    508 	ASBFIZW
    509 	ASBFM
    510 	ASBFMW
    511 	ASBFX
    512 	ASBFXW
    513 	ASDIV
    514 	ASDIVW
    515 	ASEV
    516 	ASEVL
    517 	ASMADDL
    518 	ASMC
    519 	ASMNEGL
    520 	ASMSUBL
    521 	ASMULH
    522 	ASMULL
    523 	ASTXR
    524 	ASTXRB
    525 	ASTXRH
    526 	ASTXP
    527 	ASTXPW
    528 	ASTXRW
    529 	ASTLP
    530 	ASTLPW
    531 	ASTLR
    532 	ASTLRB
    533 	ASTLRH
    534 	ASTLRW
    535 	ASTLXP
    536 	ASTLXPW
    537 	ASTLXR
    538 	ASTLXRB
    539 	ASTLXRH
    540 	ASTLXRW
    541 	ASTP
    542 	ASUB
    543 	ASUBS
    544 	ASUBSW
    545 	ASUBW
    546 	ASVC
    547 	ASXTB
    548 	ASXTBW
    549 	ASXTH
    550 	ASXTHW
    551 	ASXTW
    552 	ASYS
    553 	ASYSL
    554 	ATBNZ
    555 	ATBZ
    556 	ATLBI
    557 	ATST
    558 	ATSTW
    559 	AUBFIZ
    560 	AUBFIZW
    561 	AUBFM
    562 	AUBFMW
    563 	AUBFX
    564 	AUBFXW
    565 	AUDIV
    566 	AUDIVW
    567 	AUMADDL
    568 	AUMNEGL
    569 	AUMSUBL
    570 	AUMULH
    571 	AUMULL
    572 	AUREM
    573 	AUREMW
    574 	AUXTB
    575 	AUXTH
    576 	AUXTW
    577 	AUXTBW
    578 	AUXTHW
    579 	AWFE
    580 	AWFI
    581 	AYIELD
    582 	AMOVB
    583 	AMOVBU
    584 	AMOVH
    585 	AMOVHU
    586 	AMOVW
    587 	AMOVWU
    588 	AMOVD
    589 	AMOVNP
    590 	AMOVNPW
    591 	AMOVP
    592 	AMOVPD
    593 	AMOVPQ
    594 	AMOVPS
    595 	AMOVPSW
    596 	AMOVPW
    597 	ABEQ
    598 	ABNE
    599 	ABCS
    600 	ABHS
    601 	ABCC
    602 	ABLO
    603 	ABMI
    604 	ABPL
    605 	ABVS
    606 	ABVC
    607 	ABHI
    608 	ABLS
    609 	ABGE
    610 	ABLT
    611 	ABGT
    612 	ABLE
    613 	AFABSD
    614 	AFABSS
    615 	AFADDD
    616 	AFADDS
    617 	AFCCMPD
    618 	AFCCMPED
    619 	AFCCMPS
    620 	AFCCMPES
    621 	AFCMPD
    622 	AFCMPED
    623 	AFCMPES
    624 	AFCMPS
    625 	AFCVTSD
    626 	AFCVTDS
    627 	AFCVTZSD
    628 	AFCVTZSDW
    629 	AFCVTZSS
    630 	AFCVTZSSW
    631 	AFCVTZUD
    632 	AFCVTZUDW
    633 	AFCVTZUS
    634 	AFCVTZUSW
    635 	AFDIVD
    636 	AFDIVS
    637 	AFMOVD
    638 	AFMOVS
    639 	AFMULD
    640 	AFMULS
    641 	AFNEGD
    642 	AFNEGS
    643 	AFSQRTD
    644 	AFSQRTS
    645 	AFSUBD
    646 	AFSUBS
    647 	ASCVTFD
    648 	ASCVTFS
    649 	ASCVTFWD
    650 	ASCVTFWS
    651 	AUCVTFD
    652 	AUCVTFS
    653 	AUCVTFWD
    654 	AUCVTFWS
    655 	AWORD
    656 	ADWORD
    657 	AFCSELS
    658 	AFCSELD
    659 	AFMAXS
    660 	AFMINS
    661 	AFMAXD
    662 	AFMIND
    663 	AFMAXNMS
    664 	AFMAXNMD
    665 	AFNMULS
    666 	AFNMULD
    667 	AFRINTNS
    668 	AFRINTND
    669 	AFRINTPS
    670 	AFRINTPD
    671 	AFRINTMS
    672 	AFRINTMD
    673 	AFRINTZS
    674 	AFRINTZD
    675 	AFRINTAS
    676 	AFRINTAD
    677 	AFRINTXS
    678 	AFRINTXD
    679 	AFRINTIS
    680 	AFRINTID
    681 	AFMADDS
    682 	AFMADDD
    683 	AFMSUBS
    684 	AFMSUBD
    685 	AFNMADDS
    686 	AFNMADDD
    687 	AFNMSUBS
    688 	AFNMSUBD
    689 	AFMINNMS
    690 	AFMINNMD
    691 	AFCVTDH
    692 	AFCVTHS
    693 	AFCVTHD
    694 	AFCVTSH
    695 	AAESD
    696 	AAESE
    697 	AAESIMC
    698 	AAESMC
    699 	ASHA1C
    700 	ASHA1H
    701 	ASHA1M
    702 	ASHA1P
    703 	ASHA1SU0
    704 	ASHA1SU1
    705 	ASHA256H
    706 	ASHA256H2
    707 	ASHA256SU0
    708 	ASHA256SU1
    709 	ALAST
    710 	AB  = obj.AJMP
    711 	ABL = obj.ACALL
    712 )
    713 
    714 const (
    715 	// shift types
    716 	SHIFT_LL = 0 << 22
    717 	SHIFT_LR = 1 << 22
    718 	SHIFT_AR = 2 << 22
    719 )
    720