Skip to content

Commit dadbac0

Browse files
committed
cmd/internal/obj/loong64: add VPERMI.W, XVPERMI.{W,V,Q} instruction support
Go asm syntax: VPERMIW $0x1b, vj, vd XVPERMI{W,V,Q} $0x1b, xj, xd Equivalent platform assembler syntax: vpermi.w vd, vj, $0x1b xvpermi.{w,d,q} xd, xj, $0x1b Change-Id: Ie23b2fdd09b4c93801dc804913206f1c5a496268 Reviewed-on: https://go-review.googlesource.com/c/go/+/716800 Reviewed-by: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Meidan Li <limeidan@loongson.cn> Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn> Reviewed-by: Michael Knyszek <mknyszek@google.com>
1 parent e2c6a20 commit dadbac0

File tree

5 files changed

+44
-0
lines changed

5 files changed

+44
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,12 @@ lable2:
10171017
XVSHUF4IV $8, X1, X2 // 22209c77
10181018
XVSHUF4IV $15, X1, X2 // 223c9c77
10191019

1020+
// VPERMIW, XVPERMI{W,V,Q} instructions
1021+
VPERMIW $0x1B, V1, V2 // VPERMIW $27, V1, V2 // 226ce473
1022+
XVPERMIW $0x2B, X1, X2 // XVPERMIW $43, X1, X2 // 22ace477
1023+
XVPERMIV $0x3B, X1, X2 // XVPERMIV $59, X1, X2 // 22ece877
1024+
XVPERMIQ $0x4B, X1, X2 // XVPERMIQ $75, X1, X2 // 222ced77
1025+
10201026
// [X]VSETEQZ.V, [X]VSETNEZ.V
10211027
VSETEQV V1, FCC0 // 20989c72
10221028
VSETNEV V1, FCC0 // 209c9c72

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

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

1118+
AVPERMIW
1119+
AXVPERMIW
1120+
AXVPERMIV
1121+
AXVPERMIQ
1122+
11181123
AVSETEQV
11191124
AVSETNEV
11201125
AVSETANYEQB

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

Lines changed: 4 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: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1778,6 +1778,7 @@ func buildop(ctxt *obj.Link) {
17781778
opset(AVSHUF4IH, r0)
17791779
opset(AVSHUF4IW, r0)
17801780
opset(AVSHUF4IV, r0)
1781+
opset(AVPERMIW, r0)
17811782

17821783
case AXVANDB:
17831784
opset(AXVORB, r0)
@@ -1787,6 +1788,9 @@ func buildop(ctxt *obj.Link) {
17871788
opset(AXVSHUF4IH, r0)
17881789
opset(AXVSHUF4IW, r0)
17891790
opset(AXVSHUF4IV, r0)
1791+
opset(AXVPERMIW, r0)
1792+
opset(AXVPERMIV, r0)
1793+
opset(AXVPERMIQ, r0)
17901794

17911795
case AVANDV:
17921796
opset(AVORV, r0)
@@ -4362,6 +4366,14 @@ func (c *ctxt0) opirr(a obj.As) uint32 {
43624366
return 0x1de6 << 18 // xvshuf4i.w
43634367
case AXVSHUF4IV:
43644368
return 0x1de7 << 18 // xvshuf4i.d
4369+
case AVPERMIW:
4370+
return 0x1cf9 << 18 // vpermi.w
4371+
case AXVPERMIW:
4372+
return 0x1df9 << 18 // xvpermi.w
4373+
case AXVPERMIV:
4374+
return 0x1dfa << 18 // xvpermi.d
4375+
case AXVPERMIQ:
4376+
return 0x1dfb << 18 // xvpermi.q
43654377
case AVBITCLRB:
43664378
return 0x1CC4<<18 | 0x1<<13 // vbitclri.b
43674379
case AVBITCLRH:

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,23 @@ Note: In the following sections 3.1 to 3.6, "ui4" (4-bit unsigned int immediate)
229229
VMOVQ 8(R4), V5.W4 | vldrepl.w v5, r4, $2
230230
VMOVQ 8(R4), V5.V2 | vldrepl.d v5, r4, $1
231231
232+
3.8 Vector permutation instruction
233+
Instruction format:
234+
VPERMIW ui8, Vj, Vd
235+
236+
Mapping between Go and platform assembly:
237+
Go assembly | platform assembly | semantics
238+
VPERMIW ui8, Vj, Vd | vpermi.w vd, vj, ui8 | VR[vd].W[0] = VR[vj].W[ui8[1:0]], VR[vd].W[1] = VR[vj].W[ui8[3:2]],
239+
| | VR[vd].W[2] = VR[vd].W[ui8[5:4]], VR[vd].W[3] = VR[vd].W[ui8[7:6]]
240+
XVPERMIW ui8, Xj, Xd | xvpermi.w xd, xj, ui8 | XR[xd].W[0] = XR[xj].W[ui8[1:0]], XR[xd].W[1] = XR[xj].W[ui8[3:2]],
241+
| | XR[xd].W[3] = XR[xd].W[ui8[7:6]], XR[xd].W[2] = XR[xd].W[ui8[5:4]],
242+
| | XR[xd].W[4] = XR[xj].W[ui8[1:0]+4], XR[xd].W[5] = XR[xj].W[ui8[3:2]+4],
243+
| | XR[xd].W[6] = XR[xd].W[ui8[5:4]+4], XR[xd].W[7] = XR[xd].W[ui8[7:6]+4]
244+
XVPERMIV ui8, Xj, Xd | xvpermi.d xd, xj, ui8 | XR[xd].D[0] = XR[xj].D[ui8[1:0]], XR[xd].D[1] = XR[xj].D[ui8[3:2]],
245+
| | XR[xd].D[2] = XR[xj].D[ui8[5:4]], XR[xd].D[3] = XR[xj].D[ui8[7:6]]
246+
XVPERMIQ ui8, Xj, Xd | xvpermi.q xd, xj, ui8 | vec = {XR[xd], XR[xj]}, XR[xd].Q[0] = vec.Q[ui8[1:0]], XR[xd].Q[1] = vec.Q[ui8[5:4]]
247+
248+
232249
# Special instruction encoding definition and description on LoongArch
233250
234251
1. DBAR hint encoding for LA664(Loongson 3A6000) and later micro-architectures, paraphrased

0 commit comments

Comments
 (0)