Skip to content

Commit 8111104

Browse files
committed
cmd/internal/obj/loong64: add {,X}VSHUF.{B/H/W/V} instructions support
Go asm syntax: VSHUFB V1, V2, V3, V4 XVSHUFB X1, X2, X3, X4 VSHUF{H/W/V} V1, V2, V3 XVSHUF{H/W/V} X1, X2, X3 Equivalent platform assembler syntax: vshuf.b v4, v3, v2, v1 xvshuf.b x4, x3, x2, x1 vshuf.{h/w/d} v3, v2, v1 xvshuf.{h/w/d} x3, x2, x1 Change-Id: I8983467495f587cf46083fd81cb024400c7dc2a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/716804 Reviewed-by: Meidan Li <limeidan@loongson.cn> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn>
1 parent 2e20725 commit 8111104

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,16 @@ lable2:
10231023
XVSHUF4IV $8, X1, X2 // 22209c77
10241024
XVSHUF4IV $15, X1, X2 // 223c9c77
10251025

1026+
// [X]VSHUF.{B/H/W/V} instructions
1027+
VSHUFH V1, V2, V3 // 43847a71
1028+
VSHUFW V1, V2, V3 // 43047b71
1029+
VSHUFV V1, V2, V3 // 43847b71
1030+
XVSHUFH X1, X2, X3 // 43847a75
1031+
XVSHUFW X1, X2, X3 // 43047b75
1032+
XVSHUFV X1, X2, X3 // 43847b75
1033+
VSHUFB V1, V2, V3, V4 // 6488500d
1034+
XVSHUFB X1, X2, X3, X4 // 6488600d
1035+
10261036
// VPERMIW, XVPERMI{W,V,Q} instructions
10271037
VPERMIW $0x1B, V1, V2 // VPERMIW $27, V1, V2 // 226ce473
10281038
XVPERMIW $0x2B, X1, X2 // XVPERMIW $43, X1, X2 // 22ace477

src/cmd/internal/obj/loong64/a.out.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,15 @@ const (
11151115
AXVSHUF4IW
11161116
AXVSHUF4IV
11171117

1118+
AVSHUFB
1119+
AVSHUFH
1120+
AVSHUFW
1121+
AVSHUFV
1122+
AXVSHUFB
1123+
AXVSHUFH
1124+
AXVSHUFW
1125+
AXVSHUFV
1126+
11181127
AVPERMIW
11191128
AXVPERMIW
11201129
AXVPERMIV

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

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ var optab = []Optab{
155155

156156
{AFMADDF, C_FREG, C_FREG, C_NONE, C_FREG, C_NONE, 37, 4, 0, 0},
157157
{AFMADDF, C_FREG, C_FREG, C_FREG, C_FREG, C_NONE, 37, 4, 0, 0},
158+
{AVSHUFB, C_VREG, C_VREG, C_VREG, C_VREG, C_NONE, 37, 4, 0, 0},
159+
{AXVSHUFB, C_XREG, C_XREG, C_XREG, C_XREG, C_NONE, 37, 4, 0, 0},
158160

159161
{AFSEL, C_FCCREG, C_FREG, C_FREG, C_FREG, C_NONE, 33, 4, 0, 0},
160162
{AFSEL, C_FCCREG, C_FREG, C_NONE, C_FREG, C_NONE, 33, 4, 0, 0},
@@ -1561,6 +1563,8 @@ func buildop(ctxt *obj.Link) {
15611563
AMOVWU,
15621564
AVMOVQ,
15631565
AXVMOVQ,
1566+
AVSHUFB,
1567+
AXVSHUFB,
15641568
ANEGW,
15651569
ANEGV,
15661570
AWORD,
@@ -1698,6 +1702,9 @@ func buildop(ctxt *obj.Link) {
16981702
opset(AVMULD, r0)
16991703
opset(AVDIVF, r0)
17001704
opset(AVDIVD, r0)
1705+
opset(AVSHUFH, r0)
1706+
opset(AVSHUFW, r0)
1707+
opset(AVSHUFV, r0)
17011708

17021709
case AXVSEQB:
17031710
opset(AXVSEQH, r0)
@@ -1771,6 +1778,9 @@ func buildop(ctxt *obj.Link) {
17711778
opset(AXVMULD, r0)
17721779
opset(AXVDIVF, r0)
17731780
opset(AXVDIVD, r0)
1781+
opset(AXVSHUFH, r0)
1782+
opset(AXVSHUFW, r0)
1783+
opset(AXVSHUFV, r0)
17741784

17751785
case AVANDB:
17761786
opset(AVORB, r0)
@@ -3107,6 +3117,10 @@ func (c *ctxt0) oprrrr(a obj.As) uint32 {
31073117
return 0x8d << 20 // fnmsub.s
31083118
case AFNMSUBD:
31093119
return 0x8e << 20 // fnmsub.d
3120+
case AVSHUFB:
3121+
return 0x0D5 << 20 // vshuf.b
3122+
case AXVSHUFB:
3123+
return 0x0D6 << 20 // xvshuf.b
31103124
}
31113125

31123126
c.ctxt.Diag("bad rrrr opcode %v", a)
@@ -3775,6 +3789,18 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
37753789
return 0xea22 << 15 // xvbitrev.w
37763790
case AXVBITREVV:
37773791
return 0xea23 << 15 // xvbitrev.d
3792+
case AVSHUFH:
3793+
return 0x0E2F5 << 15 // vshuf.h
3794+
case AVSHUFW:
3795+
return 0x0E2F6 << 15 // vshuf.w
3796+
case AVSHUFV:
3797+
return 0x0E2F7 << 15 // vshuf.d
3798+
case AXVSHUFH:
3799+
return 0x0EAF5 << 15 // xvshuf.h
3800+
case AXVSHUFW:
3801+
return 0x0EAF6 << 15 // xvshuf.w
3802+
case AXVSHUFV:
3803+
return 0x0EAF7 << 15 // xvshuf.d
37783804
}
37793805

37803806
if a < 0 {

0 commit comments

Comments
 (0)