]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/loong64: add {V,XV}ILV{L/H}.{B/H/W/D} instructions support
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Fri, 13 Dec 2024 10:00:09 +0000 (18:00 +0800)
committerGopher Robot <gobot@golang.org>
Thu, 6 Mar 2025 16:15:51 +0000 (08:15 -0800)
Go asm syntax:
 VILV{L/H}{B/H/W/V} VK, VJ, VD
XVILV{L/H}{B/H/W/V} XK, XJ, XD

Equivalent platform assembler syntax:
 vilv{l/h}.{b/h/w/d} vd, vj, vk
xvilv{l/h}.{b/h/w/d} xd, xj, xk

Change-Id: I40e21737649d9fdbbc9a423e859f4c0a56d069fb
Reviewed-on: https://go-review.googlesource.com/c/go/+/635936
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Junyang Shao <shaojunyang@google.com>

src/cmd/asm/internal/asm/testdata/loong64enc1.s
src/cmd/internal/obj/loong64/a.out.go
src/cmd/internal/obj/loong64/anames.go
src/cmd/internal/obj/loong64/asm.go

index c3d1908e75d36ee3f3c024741f168ce55ceb2da7..bb16f874f62ec83654b83c6aa9115360a2cf5902 100644 (file)
@@ -719,3 +719,21 @@ lable2:
        XVSUBHU         $14, X1, X2     // 22b88c76
        XVSUBWU         $15, X1, X2     // 223c8d76
        XVSUBVU         $16, X1, X2     // 22c08d76
+
+       // [X]VILV{L/H}{B,H,W,V} instructions
+       VILVLB          V1, V2, V3      // 43041a71
+       VILVLH          V1, V2, V3      // 43841a71
+       VILVLW          V1, V2, V3      // 43041b71
+       VILVLV          V1, V2, V3      // 43841b71
+       VILVHB          V1, V2, V3      // 43041c71
+       VILVHH          V1, V2, V3      // 43841c71
+       VILVHW          V1, V2, V3      // 43041d71
+       VILVHV          V1, V2, V3      // 43841d71
+       XVILVLB         X3, X2, X1      // 410c1a75
+       XVILVLH         X3, X2, X1      // 418c1a75
+       XVILVLW         X3, X2, X1      // 410c1b75
+       XVILVLV         X3, X2, X1      // 418c1b75
+       XVILVHB         X3, X2, X1      // 410c1c75
+       XVILVHH         X3, X2, X1      // 418c1c75
+       XVILVHW         X3, X2, X1      // 410c1d75
+       XVILVHV         X3, X2, X1      // 418c1d75
index 2bc895b880acec760d99f8548fc20b3b7c5d02a1..155d0f0c02b89138c8fae4a2a819bb154565a376 100644 (file)
@@ -837,6 +837,24 @@ const (
        AXVROTRW
        AXVROTRV
 
+       // LSX and LASX move and shuffle instructions
+       AVILVLB
+       AVILVLH
+       AVILVLW
+       AVILVLV
+       AVILVHB
+       AVILVHH
+       AVILVHW
+       AVILVHV
+       AXVILVLB
+       AXVILVLH
+       AXVILVLW
+       AXVILVLV
+       AXVILVHB
+       AXVILVHH
+       AXVILVHW
+       AXVILVHV
+
        ALAST
 
        // aliases
index 7201f7d961c7da01867a7524e9b72080aa2a89b7..de4a158d0944bd8a8b711b2d1e104e75f48d58ed 100644 (file)
@@ -345,5 +345,21 @@ var Anames = []string{
        "XVROTRH",
        "XVROTRW",
        "XVROTRV",
+       "VILVLB",
+       "VILVLH",
+       "VILVLW",
+       "VILVLV",
+       "VILVHB",
+       "VILVHH",
+       "VILVHW",
+       "VILVHV",
+       "XVILVLB",
+       "XVILVLH",
+       "XVILVLW",
+       "XVILVLV",
+       "XVILVHB",
+       "XVILVHH",
+       "XVILVHW",
+       "XVILVHV",
        "LAST",
 }
index 3ede02210443b1564f63145bfd39e87b274e3b60..e5ffa51ae1cdbb5541ff29ea6e0da4e8c398ae7d 100644 (file)
@@ -1539,11 +1539,27 @@ func buildop(ctxt *obj.Link) {
                        opset(AVSEQH, r0)
                        opset(AVSEQW, r0)
                        opset(AVSEQV, r0)
+                       opset(AVILVLB, r0)
+                       opset(AVILVLH, r0)
+                       opset(AVILVLW, r0)
+                       opset(AVILVLV, r0)
+                       opset(AVILVHB, r0)
+                       opset(AVILVHH, r0)
+                       opset(AVILVHW, r0)
+                       opset(AVILVHV, r0)
 
                case AXVSEQB:
                        opset(AXVSEQH, r0)
                        opset(AXVSEQW, r0)
                        opset(AXVSEQV, r0)
+                       opset(AXVILVLB, r0)
+                       opset(AXVILVLH, r0)
+                       opset(AXVILVLW, r0)
+                       opset(AXVILVLV, r0)
+                       opset(AXVILVHB, r0)
+                       opset(AXVILVHH, r0)
+                       opset(AXVILVHW, r0)
+                       opset(AXVILVHV, r0)
 
                case AVPCNTB:
                        opset(AVPCNTH, r0)
@@ -2862,6 +2878,38 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
                return 0xe81b << 15 // xvsub.d
        case AXVSUBQ:
                return 0xea5b << 15 // xvsub.q
+       case AVILVLB:
+               return 0xe234 << 15 // vilvl.b
+       case AVILVLH:
+               return 0xe235 << 15 // vilvl.h
+       case AVILVLW:
+               return 0xe236 << 15 // vilvl.w
+       case AVILVLV:
+               return 0xe237 << 15 // vilvl.d
+       case AVILVHB:
+               return 0xe238 << 15 // vilvh.b
+       case AVILVHH:
+               return 0xe239 << 15 // vilvh.h
+       case AVILVHW:
+               return 0xe23a << 15 // vilvh.w
+       case AVILVHV:
+               return 0xe23b << 15 // vilvh.d
+       case AXVILVLB:
+               return 0xea34 << 15 // xvilvl.b
+       case AXVILVLH:
+               return 0xea35 << 15 // xvilvl.h
+       case AXVILVLW:
+               return 0xea36 << 15 // xvilvl.w
+       case AXVILVLV:
+               return 0xea37 << 15 // xvilvl.d
+       case AXVILVHB:
+               return 0xea38 << 15 // xvilvh.b
+       case AXVILVHH:
+               return 0xea39 << 15 // xvilvh.h
+       case AXVILVHW:
+               return 0xea3a << 15 // xvilvh.w
+       case AXVILVHV:
+               return 0xea3b << 15 // xvilvh.d
        }
 
        if a < 0 {