Skip to content

Commit ad5e941

Browse files
committed
cmd/internal/obj/loong64: using {xv,v}slli.d to perform copying between vector registers
Go asm syntax: VMOVQ Vj, Vd XVMOVQ Xj, Xd Equivalent platform assembler syntax: vslli.d vd, vj, 0x0 xvslli.d xd, xj, 0x0 Change-Id: Ifddc3d4d3fbaa6fee2e079bf2ebfe96a2febaa1c Reviewed-on: https://go-review.googlesource.com/c/go/+/716801 Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> Reviewed-by: Meidan Li <limeidan@loongson.cn> Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
1 parent dadbac0 commit ad5e941

File tree

3 files changed

+30
-6
lines changed

3 files changed

+30
-6
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,12 +533,18 @@ lable2:
533533
XVMOVQ X28.V[3], X8 // 88ef0377
534534
XVMOVQ X27.V[0], X9 // 69e30377
535535

536-
//Move vector element to vector.
536+
// Move vector element to vector.
537537
VMOVQ V1.B[3], V9.B16 // 298cf772
538538
VMOVQ V2.H[2], V8.H8 // 48c8f772
539539
VMOVQ V3.W[1], V7.W4 // 67e4f772
540540
VMOVQ V4.V[0], V6.V2 // 86f0f772
541541

542+
// Move vector register to vector register.
543+
VMOVQ V1, V9 // 29002d73
544+
VMOVQ V2, V8 // 48002d73
545+
XVMOVQ X3, X7 // 67002d77
546+
XVMOVQ X4, X6 // 86002d77
547+
542548
// Load data from memory and broadcast to each element of a vector register: VMOVQ offset(Rj), <Vd>.<T>
543549
VMOVQ (R4), V0.B16 // 80008030
544550
VMOVQ 1(R4), V0.B16 // 80048030

src/cmd/internal/obj/loong64/asm.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ var optab = []Optab{
5858

5959
{AMOVW, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 1, 4, 0, 0},
6060
{AMOVV, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 1, 4, 0, 0},
61+
{AVMOVQ, C_VREG, C_NONE, C_NONE, C_VREG, C_NONE, 1, 4, 0, 0},
62+
{AXVMOVQ, C_XREG, C_NONE, C_NONE, C_XREG, C_NONE, 1, 4, 0, 0},
6163
{AMOVB, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 12, 4, 0, 0},
6264
{AMOVBU, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 12, 4, 0, 0},
6365
{AMOVWU, C_REG, C_NONE, C_NONE, C_REG, C_NONE, 12, 4, 0, 0},
@@ -2101,12 +2103,19 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
21012103
case 0: // pseudo ops
21022104
break
21032105

2104-
case 1: // mov r1,r2 ==> OR r1,r0,r2
2105-
a := AOR
2106-
if p.As == AMOVW {
2107-
a = ASLL
2106+
case 1: // mov rj, rd
2107+
switch p.As {
2108+
case AMOVW:
2109+
o1 = OP_RRR(c.oprrr(ASLL), uint32(REGZERO), uint32(p.From.Reg), uint32(p.To.Reg))
2110+
case AMOVV:
2111+
o1 = OP_RRR(c.oprrr(AOR), uint32(REGZERO), uint32(p.From.Reg), uint32(p.To.Reg))
2112+
case AVMOVQ:
2113+
o1 = OP_6IRR(c.opirr(AVSLLV), uint32(0), uint32(p.From.Reg), uint32(p.To.Reg))
2114+
case AXVMOVQ:
2115+
o1 = OP_6IRR(c.opirr(AXVSLLV), uint32(0), uint32(p.From.Reg), uint32(p.To.Reg))
2116+
default:
2117+
c.ctxt.Diag("unexpected encoding\n%v", p)
21082118
}
2109-
o1 = OP_RRR(c.oprrr(a), uint32(REGZERO), uint32(p.From.Reg), uint32(p.To.Reg))
21102119

21112120
case 2: // add/sub r1,[r2],r3
21122121
r := int(p.Reg)

src/cmd/internal/obj/loong64/doc.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,15 @@ Note: In the following sections 3.1 to 3.6, "ui4" (4-bit unsigned int immediate)
203203
VMOVQ Vj.W[index], Vd.W4 | vreplvei.w vd, vj, ui2 | for i in range(4) : VR[vd].w[i] = VR[vj].w[ui2]
204204
VMOVQ Vj.V[index], Vd.V2 | vreplvei.d vd, vj, ui1 | for i in range(2) : VR[vd].d[i] = VR[vj].d[ui1]
205205
206+
3.7 Move vector register to vector register.
207+
Instruction format:
208+
VMOVQ Vj, Vd
209+
210+
Mapping between Go and platform assembly:
211+
Go assembly | platform assembly | semantics
212+
VMOVQ Vj, Vd | vslli.d vd, vj, 0x0 | for i in range(2) : VR[vd].D[i] = SLL(VR[vj].D[i], 0)
213+
VXMOVQ Xj, Xd | xvslli.d xd, xj, 0x0 | for i in range(4) : XR[xd].D[i] = SLL(XR[xj].D[i], 0)
214+
206215
3.7 Load data from memory and broadcast to each element of a vector register.
207216
208217
Instruction format:

0 commit comments

Comments
 (0)