github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/src/cmd/internal/obj/arm64/a.out.go (about) 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@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 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 // optab is sorted based on the order of these constants 258 // and the first match is chosen. 259 // The more specific class needs to come earlier. 260 C_NONE = iota 261 C_REG // R0..R30 262 C_RSP // R0..R30, RSP 263 C_FREG // F0..F31 264 C_VREG // V0..V31 265 C_PAIR // (Rn, Rm) 266 C_SHIFT // Rn<<2 267 C_EXTREG // Rn.UXTB<<3 268 C_SPR // REG_NZCV 269 C_COND // EQ, NE, etc 270 271 C_ZCON // $0 or ZR 272 C_ABCON0 // could be C_ADDCON0 or C_BITCON 273 C_ADDCON0 // 12-bit unsigned, unshifted 274 C_ABCON // could be C_ADDCON or C_BITCON 275 C_ADDCON // 12-bit unsigned, shifted left by 0 or 12 276 C_MBCON // could be C_MOVCON or C_BITCON 277 C_MOVCON // generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16 278 C_BITCON // bitfield and logical immediate masks 279 C_LCON // 32-bit constant 280 C_VCON // 64-bit constant 281 C_FCON // floating-point constant 282 C_VCONADDR // 64-bit memory address 283 284 C_AACON // ADDCON offset in auto constant $a(FP) 285 C_LACON // 32-bit offset in auto constant $a(FP) 286 C_AECON // ADDCON offset in extern constant $e(SB) 287 288 // TODO(aram): only one branch class should be enough 289 C_SBRA // for TYPE_BRANCH 290 C_LBRA 291 292 C_NPAUTO // -512 <= x < 0, 0 mod 8 293 C_NSAUTO // -256 <= x < 0 294 C_PSAUTO // 0 to 255 295 C_PPAUTO // 0 to 504, 0 mod 8 296 C_UAUTO4K_8 // 0 to 4095, 0 mod 8 297 C_UAUTO4K_4 // 0 to 4095, 0 mod 4 298 C_UAUTO4K_2 // 0 to 4095, 0 mod 2 299 C_UAUTO4K // 0 to 4095 300 C_UAUTO8K_8 // 0 to 8190, 0 mod 8 301 C_UAUTO8K_4 // 0 to 8190, 0 mod 4 302 C_UAUTO8K // 0 to 8190, 0 mod 2 303 C_UAUTO16K_8 // 0 to 16380, 0 mod 8 304 C_UAUTO16K // 0 to 16380, 0 mod 4 305 C_UAUTO32K // 0 to 32760, 0 mod 8 306 C_LAUTO // any other 32-bit constant 307 308 C_SEXT1 // 0 to 4095, direct 309 C_SEXT2 // 0 to 8190 310 C_SEXT4 // 0 to 16380 311 C_SEXT8 // 0 to 32760 312 C_SEXT16 // 0 to 65520 313 C_LEXT 314 315 C_ZOREG // 0(R) 316 C_NPOREG // must mirror NPAUTO, etc 317 C_NSOREG 318 C_PSOREG 319 C_PPOREG 320 C_UOREG4K_8 321 C_UOREG4K_4 322 C_UOREG4K_2 323 C_UOREG4K 324 C_UOREG8K_8 325 C_UOREG8K_4 326 C_UOREG8K 327 C_UOREG16K_8 328 C_UOREG16K 329 C_UOREG32K 330 C_LOREG 331 332 C_ADDR // TODO(aram): explain difference from C_VCONADDR 333 334 // The GOT slot for a symbol in -dynlink mode. 335 C_GOTADDR 336 337 // TLS "var" in local exec mode: will become a constant offset from 338 // thread local base that is ultimately chosen by the program linker. 339 C_TLS_LE 340 341 // TLS "var" in initial exec mode: will become a memory address (chosen 342 // by the program linker) that the dynamic linker will fill with the 343 // offset from the thread local base. 344 C_TLS_IE 345 346 C_ROFF // register offset (including register extended) 347 348 C_GOK 349 C_TEXTSIZE 350 C_NCLASS // must be last 351 ) 352 353 const ( 354 C_XPRE = 1 << 6 // match arm.C_WBIT, so Prog.String know how to print it 355 C_XPOST = 1 << 5 // match arm.C_PBIT, so Prog.String know how to print it 356 ) 357 358 //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p arm64 359 360 const ( 361 AADC = obj.ABaseARM64 + obj.A_ARCHSPECIFIC + iota 362 AADCS 363 AADCSW 364 AADCW 365 AADD 366 AADDS 367 AADDSW 368 AADDW 369 AADR 370 AADRP 371 AAND 372 AANDS 373 AANDSW 374 AANDW 375 AASR 376 AASRW 377 AAT 378 ABFI 379 ABFIW 380 ABFM 381 ABFMW 382 ABFXIL 383 ABFXILW 384 ABIC 385 ABICS 386 ABICSW 387 ABICW 388 ABRK 389 ACBNZ 390 ACBNZW 391 ACBZ 392 ACBZW 393 ACCMN 394 ACCMNW 395 ACCMP 396 ACCMPW 397 ACINC 398 ACINCW 399 ACINV 400 ACINVW 401 ACLREX 402 ACLS 403 ACLSW 404 ACLZ 405 ACLZW 406 ACMN 407 ACMNW 408 ACMP 409 ACMPW 410 ACNEG 411 ACNEGW 412 ACRC32B 413 ACRC32CB 414 ACRC32CH 415 ACRC32CW 416 ACRC32CX 417 ACRC32H 418 ACRC32W 419 ACRC32X 420 ACSEL 421 ACSELW 422 ACSET 423 ACSETM 424 ACSETMW 425 ACSETW 426 ACSINC 427 ACSINCW 428 ACSINV 429 ACSINVW 430 ACSNEG 431 ACSNEGW 432 ADC 433 ADCPS1 434 ADCPS2 435 ADCPS3 436 ADMB 437 ADRPS 438 ADSB 439 AEON 440 AEONW 441 AEOR 442 AEORW 443 AERET 444 AEXTR 445 AEXTRW 446 AHINT 447 AHLT 448 AHVC 449 AIC 450 AISB 451 ALDAR 452 ALDARB 453 ALDARH 454 ALDARW 455 ALDAXP 456 ALDAXPW 457 ALDAXR 458 ALDAXRB 459 ALDAXRH 460 ALDAXRW 461 ALDP 462 ALDXR 463 ALDXRB 464 ALDXRH 465 ALDXRW 466 ALDXP 467 ALDXPW 468 ALSL 469 ALSLW 470 ALSR 471 ALSRW 472 AMADD 473 AMADDW 474 AMNEG 475 AMNEGW 476 AMOVK 477 AMOVKW 478 AMOVN 479 AMOVNW 480 AMOVZ 481 AMOVZW 482 AMRS 483 AMSR 484 AMSUB 485 AMSUBW 486 AMUL 487 AMULW 488 AMVN 489 AMVNW 490 ANEG 491 ANEGS 492 ANEGSW 493 ANEGW 494 ANGC 495 ANGCS 496 ANGCSW 497 ANGCW 498 AORN 499 AORNW 500 AORR 501 AORRW 502 APRFM 503 APRFUM 504 ARBIT 505 ARBITW 506 AREM 507 AREMW 508 AREV 509 AREV16 510 AREV16W 511 AREV32 512 AREVW 513 AROR 514 ARORW 515 ASBC 516 ASBCS 517 ASBCSW 518 ASBCW 519 ASBFIZ 520 ASBFIZW 521 ASBFM 522 ASBFMW 523 ASBFX 524 ASBFXW 525 ASDIV 526 ASDIVW 527 ASEV 528 ASEVL 529 ASMADDL 530 ASMC 531 ASMNEGL 532 ASMSUBL 533 ASMULH 534 ASMULL 535 ASTXR 536 ASTXRB 537 ASTXRH 538 ASTXP 539 ASTXPW 540 ASTXRW 541 ASTLP 542 ASTLPW 543 ASTLR 544 ASTLRB 545 ASTLRH 546 ASTLRW 547 ASTLXP 548 ASTLXPW 549 ASTLXR 550 ASTLXRB 551 ASTLXRH 552 ASTLXRW 553 ASTP 554 ASUB 555 ASUBS 556 ASUBSW 557 ASUBW 558 ASVC 559 ASXTB 560 ASXTBW 561 ASXTH 562 ASXTHW 563 ASXTW 564 ASYS 565 ASYSL 566 ATBNZ 567 ATBZ 568 ATLBI 569 ATST 570 ATSTW 571 AUBFIZ 572 AUBFIZW 573 AUBFM 574 AUBFMW 575 AUBFX 576 AUBFXW 577 AUDIV 578 AUDIVW 579 AUMADDL 580 AUMNEGL 581 AUMSUBL 582 AUMULH 583 AUMULL 584 AUREM 585 AUREMW 586 AUXTB 587 AUXTH 588 AUXTW 589 AUXTBW 590 AUXTHW 591 AWFE 592 AWFI 593 AYIELD 594 AMOVB 595 AMOVBU 596 AMOVH 597 AMOVHU 598 AMOVW 599 AMOVWU 600 AMOVD 601 AMOVNP 602 AMOVNPW 603 AMOVP 604 AMOVPD 605 AMOVPQ 606 AMOVPS 607 AMOVPSW 608 AMOVPW 609 ABEQ 610 ABNE 611 ABCS 612 ABHS 613 ABCC 614 ABLO 615 ABMI 616 ABPL 617 ABVS 618 ABVC 619 ABHI 620 ABLS 621 ABGE 622 ABLT 623 ABGT 624 ABLE 625 AFABSD 626 AFABSS 627 AFADDD 628 AFADDS 629 AFCCMPD 630 AFCCMPED 631 AFCCMPS 632 AFCCMPES 633 AFCMPD 634 AFCMPED 635 AFCMPES 636 AFCMPS 637 AFCVTSD 638 AFCVTDS 639 AFCVTZSD 640 AFCVTZSDW 641 AFCVTZSS 642 AFCVTZSSW 643 AFCVTZUD 644 AFCVTZUDW 645 AFCVTZUS 646 AFCVTZUSW 647 AFDIVD 648 AFDIVS 649 AFMOVD 650 AFMOVS 651 AFMULD 652 AFMULS 653 AFNEGD 654 AFNEGS 655 AFSQRTD 656 AFSQRTS 657 AFSUBD 658 AFSUBS 659 ASCVTFD 660 ASCVTFS 661 ASCVTFWD 662 ASCVTFWS 663 AUCVTFD 664 AUCVTFS 665 AUCVTFWD 666 AUCVTFWS 667 AWORD 668 ADWORD 669 AFCSELS 670 AFCSELD 671 AFMAXS 672 AFMINS 673 AFMAXD 674 AFMIND 675 AFMAXNMS 676 AFMAXNMD 677 AFNMULS 678 AFNMULD 679 AFRINTNS 680 AFRINTND 681 AFRINTPS 682 AFRINTPD 683 AFRINTMS 684 AFRINTMD 685 AFRINTZS 686 AFRINTZD 687 AFRINTAS 688 AFRINTAD 689 AFRINTXS 690 AFRINTXD 691 AFRINTIS 692 AFRINTID 693 AFMADDS 694 AFMADDD 695 AFMSUBS 696 AFMSUBD 697 AFNMADDS 698 AFNMADDD 699 AFNMSUBS 700 AFNMSUBD 701 AFMINNMS 702 AFMINNMD 703 AFCVTDH 704 AFCVTHS 705 AFCVTHD 706 AFCVTSH 707 AAESD 708 AAESE 709 AAESIMC 710 AAESMC 711 ASHA1C 712 ASHA1H 713 ASHA1M 714 ASHA1P 715 ASHA1SU0 716 ASHA1SU1 717 ASHA256H 718 ASHA256H2 719 ASHA256SU0 720 ASHA256SU1 721 ALAST 722 AB = obj.AJMP 723 ABL = obj.ACALL 724 ) 725 726 const ( 727 // shift types 728 SHIFT_LL = 0 << 22 729 SHIFT_LR = 1 << 22 730 SHIFT_AR = 2 << 22 731 )