Skip to content

Commit 9136d95

Browse files
committed
cmd/asm: complete the support for VDUP on arm64
"VMOV Vn.<T>[index], Vn" is equivalent to "VDUP Vn.<T>[index], Vn", and the latter has a higher priority in the disassembler than the former. But the assembler doesn't support to encode this combination of VDUP, this leads to an inconsistency between assembler and disassembler. For example, if we assemble "VMOV V20.S[0], V20" to hex then decode it, we'll get "VDUP V20.S[0], V20". VMOV V20.S[0], V20 -> 9406045e -> VDUP V20.S[0], V20 -> error But we cannot assemble this VDUP again. Similar reason for "VDUP Rn, Vd.<T>". This CL completes the support for VDUP. This patch is a copy of CL 276092. Co-authored-by: JunchenLi <[email protected]> Change-Id: I8f8d86cf1911d5b16bb40d189f1dc34b24416aaf Reviewed-on: https://go-review.googlesource.com/c/go/+/302929 Trust: fannie zhang <[email protected]> Run-TryBot: fannie zhang <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent 6704843 commit 9136d95

File tree

3 files changed

+11
-4
lines changed

3 files changed

+11
-4
lines changed

src/cmd/asm/internal/asm/testdata/arm64.s

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,9 +596,12 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8
596596
VMOV R20, V1.S[0] // 811e044e
597597
VMOV R20, V1.S[1] // 811e0c4e
598598
VMOV R1, V9.H4 // 290c020e
599+
VDUP R1, V9.H4 // 290c020e
599600
VMOV R22, V11.D2 // cb0e084e
601+
VDUP R22, V11.D2 // cb0e084e
600602
VMOV V2.B16, V4.B16 // 441ca24e
601603
VMOV V20.S[0], V20 // 9406045e
604+
VDUP V20.S[0], V20 // 9406045e
602605
VMOV V12.D[0], V12.D[1] // 8c05186e
603606
VMOV V10.S[0], V12.S[1] // 4c050c6e
604607
VMOV V9.H[0], V12.H[1] // 2c05066e

src/cmd/asm/internal/asm/testdata/arm64enc.s

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
669669
VCMEQ V24.S4, V13.S4, V12.S4 // ac8db86e
670670
VCNT V13.B8, V11.B8 // ab59200e
671671
VMOV V31.B[15], V18 // f2071f5e
672+
VDUP V31.B[15], V18 // f2071f5e
672673
VDUP V31.B[13], V20.B16 // f4071b4e
673674
VEOR V4.B8, V18.B8, V7.B8 // 471e242e
674675
VEXT $4, V2.B8, V1.B8, V3.B8 // 2320022e
@@ -700,6 +701,7 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
700701
//TODO FMOVS.W 71(R29), F28 // bc7f44bc
701702
FMOVS 6160(R4), F23 // 971058bd
702703
VMOV V18.B[10], V27 // 5b06155e
704+
VDUP V18.B[10], V27 // 5b06155e
703705
VMOV V12.B[2], V28.B[12] // 9c15196e
704706
VMOV R30, V4.B[13] // c41f1b4e
705707
VMOV V2.B16, V4.B16 // 441ca24e

src/cmd/internal/obj/arm64/asm7.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,8 @@ var optab = []Optab{
501501
{AVMOV, C_REG, C_NONE, C_NONE, C_ELEM, 78, 4, 0, 0, 0},
502502
{AVMOV, C_ARNG, C_NONE, C_NONE, C_ARNG, 83, 4, 0, 0, 0},
503503
{AVDUP, C_ELEM, C_NONE, C_NONE, C_ARNG, 79, 4, 0, 0, 0},
504+
{AVDUP, C_ELEM, C_NONE, C_NONE, C_VREG, 80, 4, 0, 0, 0},
505+
{AVDUP, C_REG, C_NONE, C_NONE, C_ARNG, 82, 4, 0, 0, 0},
504506
{AVMOVI, C_ADDCON, C_NONE, C_NONE, C_ARNG, 86, 4, 0, 0, 0},
505507
{AVFMLA, C_ARNG, C_ARNG, C_NONE, C_ARNG, 72, 4, 0, 0, 0},
506508
{AVEXT, C_VCON, C_ARNG, C_ARNG, C_ARNG, 94, 4, 0, 0, 0},
@@ -4653,13 +4655,13 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
46534655
o1 |= (uint32(Q&1) << 30) | (uint32(imm5&0x1f) << 16)
46544656
o1 |= (uint32(rf&31) << 5) | uint32(rt&31)
46554657

4656-
case 80: /* vmov V.<T>[index], Vn */
4658+
case 80: /* vmov/vdup V.<T>[index], Vn */
46574659
rf := int(p.From.Reg)
46584660
rt := int(p.To.Reg)
46594661
imm5 := 0
46604662
index := int(p.From.Index)
46614663
switch p.As {
4662-
case AVMOV:
4664+
case AVMOV, AVDUP:
46634665
o1 = 1<<30 | 15<<25 | 1<<10
46644666
switch (p.From.Reg >> 5) & 15 {
46654667
case ARNG_B:
@@ -4709,7 +4711,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
47094711
o1 = c.maskOpvldvst(p, o1)
47104712
o1 |= uint32(r&31) << 5
47114713

4712-
case 82: /* vmov Rn, Vd.<T> */
4714+
case 82: /* vmov/vdup Rn, Vd.<T> */
47134715
rf := int(p.From.Reg)
47144716
rt := int(p.To.Reg)
47154717
o1 = 7<<25 | 3<<10
@@ -4737,7 +4739,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
47374739
Q = 1
47384740
imm5 = 2
47394741
default:
4740-
c.ctxt.Diag("invalid arrangement on VMOV Rn, Vd.<T>: %v\n", p)
4742+
c.ctxt.Diag("invalid arrangement: %v\n", p)
47414743
}
47424744
o1 |= (Q & 1 << 30) | (imm5 & 0x1f << 16)
47434745
o1 |= (uint32(rf&31) << 5) | uint32(rt&31)

0 commit comments

Comments
 (0)