| // Copyright 2015 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // This input was created by taking the instruction productions in |
| // the old assembler's (7a's) grammar and hand-writing complete |
| // instructions for each rule, to guarantee we cover the same space. |
| |
| #include "../../../../../runtime/textflag.h" |
| |
| TEXT foo(SB), DUPOK|NOSPLIT, $-8 |
| |
| // |
| // ADD |
| // |
| // LTYPE1 imsr ',' spreg ',' reg |
| // { |
| // outcode($1, &$2, $4, &$6); |
| // } |
| // imsr comes from the old 7a, we only support immediates and registers |
| ADDW $1, R2, R3 |
| ADDW R1, R2, R3 |
| ADDW R1, ZR, R3 |
| ADD $1, R2, R3 |
| ADD R1, R2, R3 |
| ADD R1, ZR, R3 |
| ADD $1, R2, R3 |
| ADD R1>>11, R2, R3 |
| ADD R1<<22, R2, R3 |
| ADD R1->33, R2, R3 |
| AND R1@>33, R2, R3 |
| |
| // LTYPE1 imsr ',' spreg ',' |
| // { |
| // outcode($1, &$2, $4, &nullgen); |
| // } |
| // LTYPE1 imsr ',' reg |
| // { |
| // outcode($1, &$2, NREG, &$4); |
| // } |
| ADDW $1, R2 |
| ADDW R1, R2 |
| ADD $1, R2 |
| ADD R1, R2 |
| ADD R1>>11, R2 |
| ADD R1<<22, R2 |
| ADD R1->33, R2 |
| AND R1@>33, R2 |
| |
| // logical ops |
| // make sure constants get encoded into an instruction when it could |
| AND $(1<<63), R1 // AND $-9223372036854775808, R1 // 21004192 |
| AND $(1<<63-1), R1 // AND $9223372036854775807, R1 // 21f84092 |
| ORR $(1<<63), R1 // ORR $-9223372036854775808, R1 // 210041b2 |
| ORR $(1<<63-1), R1 // ORR $9223372036854775807, R1 // 21f840b2 |
| EOR $(1<<63), R1 // EOR $-9223372036854775808, R1 // 210041d2 |
| EOR $(1<<63-1), R1 // EOR $9223372036854775807, R1 // 21f840d2 |
| |
| // |
| // CLS |
| // |
| // LTYPE2 imsr ',' reg |
| // { |
| // outcode($1, &$2, NREG, &$4); |
| // } |
| CLSW R1, R2 |
| CLS R1, R2 |
| |
| // |
| // MOV |
| // |
| // LTYPE3 addr ',' addr |
| // { |
| // outcode($1, &$2, NREG, &$4); |
| // } |
| MOVW R1, R2 |
| MOVW ZR, R1 |
| MOVW R1, ZR |
| MOVW $1, ZR |
| MOVW $1, R1 |
| MOVW ZR, (R1) |
| MOVD R1, R2 |
| MOVD ZR, R1 |
| MOVD $1, ZR |
| MOVD $1, R1 |
| MOVD ZR, (R1) |
| |
| // small offset fits into instructions |
| MOVB 1(R1), R2 // 22048039 |
| MOVH 1(R1), R2 // 22108078 |
| MOVH 2(R1), R2 // 22048079 |
| MOVW 1(R1), R2 // 221080b8 |
| MOVW 4(R1), R2 // 220480b9 |
| MOVD 1(R1), R2 // 221040f8 |
| MOVD 8(R1), R2 // 220440f9 |
| FMOVS 1(R1), F2 // 221040bc |
| FMOVS 4(R1), F2 // 220440bd |
| FMOVD 1(R1), F2 // 221040fc |
| FMOVD 8(R1), F2 // 220440fd |
| MOVB R1, 1(R2) // 41040039 |
| MOVH R1, 1(R2) // 41100078 |
| MOVH R1, 2(R2) // 41040079 |
| MOVW R1, 1(R2) // 411000b8 |
| MOVW R1, 4(R2) // 410400b9 |
| MOVD R1, 1(R2) // 411000f8 |
| MOVD R1, 8(R2) // 410400f9 |
| FMOVS F1, 1(R2) // 411000bc |
| FMOVS F1, 4(R2) // 410400bd |
| FMOVD F1, 1(R2) // 411000fc |
| FMOVD F1, 8(R2) // 410400fd |
| |
| // large aligned offset, use two instructions |
| MOVB 0x1001(R1), R2 // MOVB 4097(R1), R2 // 3b04409162078039 |
| MOVH 0x2002(R1), R2 // MOVH 8194(R1), R2 // 3b08409162078079 |
| MOVW 0x4004(R1), R2 // MOVW 16388(R1), R2 // 3b104091620780b9 |
| MOVD 0x8008(R1), R2 // MOVD 32776(R1), R2 // 3b204091620740f9 |
| FMOVS 0x4004(R1), F2 // FMOVS 16388(R1), F2 // 3b104091620740bd |
| FMOVD 0x8008(R1), F2 // FMOVD 32776(R1), F2 // 3b204091620740fd |
| MOVB R1, 0x1001(R2) // MOVB R1, 4097(R2) // 5b04409161070039 |
| MOVH R1, 0x2002(R2) // MOVH R1, 8194(R2) // 5b08409161070079 |
| MOVW R1, 0x4004(R2) // MOVW R1, 16388(R2) // 5b104091610700b9 |
| MOVD R1, 0x8008(R2) // MOVD R1, 32776(R2) // 5b204091610700f9 |
| FMOVS F1, 0x4004(R2) // FMOVS F1, 16388(R2) // 5b104091610700bd |
| FMOVD F1, 0x8008(R2) // FMOVD F1, 32776(R2) // 5b204091610700fd |
| |
| // very large or unaligned offset uses constant pool |
| // the encoding cannot be checked as the address of the constant pool is unknown. |
| // here we only test that they can be assembled. |
| MOVB 0x44332211(R1), R2 // MOVB 1144201745(R1), R2 |
| MOVH 0x44332211(R1), R2 // MOVH 1144201745(R1), R2 |
| MOVW 0x44332211(R1), R2 // MOVW 1144201745(R1), R2 |
| MOVD 0x44332211(R1), R2 // MOVD 1144201745(R1), R2 |
| FMOVS 0x44332211(R1), F2 // FMOVS 1144201745(R1), F2 |
| FMOVD 0x44332211(R1), F2 // FMOVD 1144201745(R1), F2 |
| MOVB R1, 0x44332211(R2) // MOVB R1, 1144201745(R2) |
| MOVH R1, 0x44332211(R2) // MOVH R1, 1144201745(R2) |
| MOVW R1, 0x44332211(R2) // MOVW R1, 1144201745(R2) |
| MOVD R1, 0x44332211(R2) // MOVD R1, 1144201745(R2) |
| FMOVS F1, 0x44332211(R2) // FMOVS F1, 1144201745(R2) |
| FMOVD F1, 0x44332211(R2) // FMOVD F1, 1144201745(R2) |
| |
| // |
| // MOVK |
| // |
| // LMOVK imm ',' reg |
| // { |
| // outcode($1, &$2, NREG, &$4); |
| // } |
| MOVK $1, R1 |
| |
| // |
| // B/BL |
| // |
| // LTYPE4 comma rel |
| // { |
| // outcode($1, &nullgen, NREG, &$3); |
| // } |
| BL 1(PC) // CALL 1(PC) |
| |
| // LTYPE4 comma nireg |
| // { |
| // outcode($1, &nullgen, NREG, &$3); |
| // } |
| BL (R2) // CALL (R2) |
| BL foo(SB) // CALL foo(SB) |
| BL bar<>(SB) // CALL bar<>(SB) |
| // |
| // BEQ |
| // |
| // LTYPE5 comma rel |
| // { |
| // outcode($1, &nullgen, NREG, &$3); |
| // } |
| BEQ 1(PC) |
| // |
| // SVC |
| // |
| // LTYPE6 |
| // { |
| // outcode($1, &nullgen, NREG, &nullgen); |
| // } |
| SVC |
| |
| // |
| // CMP |
| // |
| // LTYPE7 imsr ',' spreg comma |
| // { |
| // outcode($1, &$2, $4, &nullgen); |
| // } |
| CMP $3, R2 |
| CMP R1, R2 |
| CMP R1->11, R2 |
| CMP R1>>22, R2 |
| CMP R1<<33, R2 |
| // |
| // CBZ |
| // |
| // LTYPE8 reg ',' rel |
| // { |
| // outcode($1, &$2, NREG, &$4); |
| // } |
| again: |
| CBZ R1, again // CBZ R1 |
| |
| // |
| // CSET |
| // |
| // LTYPER cond ',' reg |
| // { |
| // outcode($1, &$2, NREG, &$4); |
| // } |
| CSET GT, R1 // e1d79f9a |
| // |
| // CSEL/CSINC/CSNEG/CSINV |
| // |
| // LTYPES cond ',' reg ',' reg ',' reg |
| // { |
| // outgcode($1, &$2, $6.reg, &$4, &$8); |
| // } |
| CSEL LT, R1, R2, ZR // 3fb0829a |
| CSINC GT, R1, ZR, R3 // 23c49f9a |
| CSNEG MI, R1, R2, R3 // 234482da |
| CSINV CS, R1, R2, R3 // CSINV HS, R1, R2, R3 // 232082da |
| |
| // LTYPES cond ',' reg ',' reg |
| // { |
| // outcode($1, &$2, $4.reg, &$6); |
| // } |
| CINC EQ, R4, R9 // 8914849a |
| CINV PL, R11, R22 // 76418bda |
| CNEG LS, R13, R7 // a7858dda |
| // |
| // CCMN |
| // |
| // LTYPEU cond ',' imsr ',' reg ',' imm comma |
| // { |
| // outgcode($1, &$2, $6.reg, &$4, &$8); |
| // } |
| CCMN MI, ZR, R1, $4 // e44341ba |
| |
| // |
| // FADDD |
| // |
| // LTYPEK frcon ',' freg |
| // { |
| // outcode($1, &$2, NREG, &$4); |
| // } |
| FADDD $0.5, F1 // FADDD $(0.5), F1 |
| FADDD F1, F2 |
| |
| // LTYPEK frcon ',' freg ',' freg |
| // { |
| // outcode($1, &$2, $4.reg, &$6); |
| // } |
| FADDD $0.7, F1, F2 // FADDD $(0.69999999999999996), F1, F2 |
| FADDD F1, F2, F3 |
| |
| // |
| // FCMP |
| // |
| // LTYPEL frcon ',' freg comma |
| // { |
| // outcode($1, &$2, $4.reg, &nullgen); |
| // } |
| // FCMP $0.2, F1 |
| // FCMP F1, F2 |
| |
| // |
| // FCCMP |
| // |
| // LTYPEF cond ',' freg ',' freg ',' imm comma |
| // { |
| // outgcode($1, &$2, $6.reg, &$4, &$8); |
| // } |
| FCCMPS LT, F1, F2, $1 // 41b4211e |
| |
| // |
| // FMULA |
| // |
| // LTYPE9 freg ',' freg ',' freg ',' freg comma |
| // { |
| // outgcode($1, &$2, $4.reg, &$6, &$8); |
| // } |
| // FMULA F1, F2, F3, F4 |
| |
| // |
| // FCSEL |
| // |
| // LFCSEL cond ',' freg ',' freg ',' freg |
| // { |
| // outgcode($1, &$2, $6.reg, &$4, &$8); |
| // } |
| // |
| // MADD Rn,Rm,Ra,Rd |
| // |
| // LTYPEM reg ',' reg ',' sreg ',' reg |
| // { |
| // outgcode($1, &$2, $6, &$4, &$8); |
| // } |
| // MADD R1, R2, R3, R4 |
| |
| // DMB, HINT |
| // |
| // LDMB imm |
| // { |
| // outcode($1, &$2, NREG, &nullgen); |
| // } |
| DMB $1 |
| |
| // |
| // STXR |
| // |
| // LSTXR reg ',' addr ',' reg |
| // { |
| // outcode($1, &$2, &$4, &$6); |
| // } |
| LDAXRW (R0), R2 |
| STLXRW R1, (R0), R3 |
| |
| // RET |
| // |
| // LTYPEA comma |
| // { |
| // outcode($1, &nullgen, NREG, &nullgen); |
| // } |
| BEQ 2(PC) |
| RET |
| |
| // More B/BL cases, and canonical names JMP, CALL. |
| |
| BEQ 2(PC) |
| B foo(SB) // JMP foo(SB) |
| BL foo(SB) // CALL foo(SB) |
| BEQ 2(PC) |
| TBZ $1, R1, 2(PC) |
| TBNZ $2, R2, 2(PC) |
| JMP foo(SB) |
| CALL foo(SB) |
| |
| // END |
| // |
| // LTYPEE comma |
| // { |
| // outcode($1, &nullgen, NREG, &nullgen); |
| // } |
| END |