]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/loong64: add {V,XV}MUL{B/H/W/V} and {V,XV}MUH{B/H/W/V}[U] instructio...
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Mon, 16 Dec 2024 01:51:29 +0000 (09:51 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 11 Mar 2025 21:25:30 +0000 (14:25 -0700)
Go asm syntax:
 VMUL{B/H/W/V} VK, VJ, VD
 VMUH{B/H/W/V}[U] VK, VJ, VD
XVMUL{B/H/W/V} XK, XJ, XD
XVMUH{B/H/W/V}[U] XK, XJ, XD

Equivalent platform assembler syntax:
 vmul.{b/h/w/d} vd, vj, vk
 vmuh.{b/h/w/d}[u] vd, vj, vk
xvmul.{b/h/w/d} xd, xj, xk
xvmuh.{b/h/w/d}[u] xd, xj, xk

Change-Id: I2f15a5b4b6303a0f82cb85114477f58e1b5fd950
Reviewed-on: https://go-review.googlesource.com/c/go/+/636375
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: abner chenc <chenguoqi@loongson.cn>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
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 10f295d61cdd56815cfcd9f41e7dae36598dcb1d..136926647395d30b8a39bffb68b4587c9b5c3b64 100644 (file)
@@ -775,3 +775,29 @@ lable2:
        XVILVHH         X3, X2, X1      // 418c1c75
        XVILVHW         X3, X2, X1      // 410c1d75
        XVILVHV         X3, X2, X1      // 418c1d75
+
+       // [X]VMUL{B/H/W/V} and [X]VMUH{B/H/W/V}[U] instructions
+       VMULB           V1, V2, V3      // 43048470
+       VMULH           V1, V2, V3      // 43848470
+       VMULW           V1, V2, V3      // 43048570
+       VMULV           V1, V2, V3      // 43848570
+       VMUHB           V1, V2, V3      // 43048670
+       VMUHH           V1, V2, V3      // 43848670
+       VMUHW           V1, V2, V3      // 43048770
+       VMUHV           V1, V2, V3      // 43848770
+       VMUHBU          V1, V2, V3      // 43048870
+       VMUHHU          V1, V2, V3      // 43848870
+       VMUHWU          V1, V2, V3      // 43048970
+       VMUHVU          V1, V2, V3      // 43848970
+       XVMULB          X3, X2, X1      // 410c8474
+       XVMULH          X3, X2, X1      // 418c8474
+       XVMULW          X3, X2, X1      // 410c8574
+       XVMULV          X3, X2, X1      // 418c8574
+       XVMUHB          X3, X2, X1      // 410c8674
+       XVMUHH          X3, X2, X1      // 418c8674
+       XVMUHW          X3, X2, X1      // 410c8774
+       XVMUHV          X3, X2, X1      // 418c8774
+       XVMUHBU         X3, X2, X1      // 410c8874
+       XVMUHHU         X3, X2, X1      // 418c8874
+       XVMUHWU         X3, X2, X1      // 410c8974
+       XVMUHVU         X3, X2, X1      // 418c8974
index 977a2c2ddf3080f87526bf28df81287bcc85b3a3..39f617fa168999975cd644c3948e142ff7272ba2 100644 (file)
@@ -876,6 +876,32 @@ const (
        AXVILVHW
        AXVILVHV
 
+       // LSX and LASX integer mul instructions
+       AVMULB
+       AVMULH
+       AVMULW
+       AVMULV
+       AVMUHB
+       AVMUHH
+       AVMUHW
+       AVMUHV
+       AVMUHBU
+       AVMUHHU
+       AVMUHWU
+       AVMUHVU
+       AXVMULB
+       AXVMULH
+       AXVMULW
+       AXVMULV
+       AXVMUHB
+       AXVMUHH
+       AXVMUHW
+       AXVMUHV
+       AXVMUHBU
+       AXVMUHHU
+       AXVMUHWU
+       AXVMUHVU
+
        ALAST
 
        // aliases
index 92f09d5927dbd47164bf641f41c088eeb7c9b7c9..fa616a5d54ce9422056c67f391fa9a1658410509 100644 (file)
@@ -381,5 +381,29 @@ var Anames = []string{
        "XVILVHH",
        "XVILVHW",
        "XVILVHV",
+       "VMULB",
+       "VMULH",
+       "VMULW",
+       "VMULV",
+       "VMUHB",
+       "VMUHH",
+       "VMUHW",
+       "VMUHV",
+       "VMUHBU",
+       "VMUHHU",
+       "VMUHWU",
+       "VMUHVU",
+       "XVMULB",
+       "XVMULH",
+       "XVMULW",
+       "XVMULV",
+       "XVMUHB",
+       "XVMUHH",
+       "XVMUHW",
+       "XVMUHV",
+       "XVMUHBU",
+       "XVMUHHU",
+       "XVMUHWU",
+       "XVMUHVU",
        "LAST",
 }
index 7c30147a787716e471b2ca22bad76e018f90fc52..b92b9b60effaa90c92b6d79aec8a63414040b815 100644 (file)
@@ -1555,6 +1555,18 @@ func buildop(ctxt *obj.Link) {
                        opset(AVILVHH, r0)
                        opset(AVILVHW, r0)
                        opset(AVILVHV, r0)
+                       opset(AVMULB, r0)
+                       opset(AVMULH, r0)
+                       opset(AVMULW, r0)
+                       opset(AVMULV, r0)
+                       opset(AVMUHB, r0)
+                       opset(AVMUHH, r0)
+                       opset(AVMUHW, r0)
+                       opset(AVMUHV, r0)
+                       opset(AVMUHBU, r0)
+                       opset(AVMUHHU, r0)
+                       opset(AVMUHWU, r0)
+                       opset(AVMUHVU, r0)
 
                case AXVSEQB:
                        opset(AXVSEQH, r0)
@@ -1568,6 +1580,18 @@ func buildop(ctxt *obj.Link) {
                        opset(AXVILVHH, r0)
                        opset(AXVILVHW, r0)
                        opset(AXVILVHV, r0)
+                       opset(AXVMULB, r0)
+                       opset(AXVMULH, r0)
+                       opset(AXVMULW, r0)
+                       opset(AXVMULV, r0)
+                       opset(AXVMUHB, r0)
+                       opset(AXVMUHH, r0)
+                       opset(AXVMUHW, r0)
+                       opset(AXVMUHV, r0)
+                       opset(AXVMUHBU, r0)
+                       opset(AXVMUHHU, r0)
+                       opset(AXVMUHWU, r0)
+                       opset(AXVMUHVU, r0)
 
                case AVANDB:
                        opset(AVORB, r0)
@@ -2986,6 +3010,54 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
                return 0xea3a << 15 // xvilvh.w
        case AXVILVHV:
                return 0xea3b << 15 // xvilvh.d
+       case AVMULB:
+               return 0xe108 << 15 // vmul.b
+       case AVMULH:
+               return 0xe109 << 15 // vmul.h
+       case AVMULW:
+               return 0xe10a << 15 // vmul.w
+       case AVMULV:
+               return 0xe10b << 15 // vmul.d
+       case AVMUHB:
+               return 0xe10c << 15 // vmuh.b
+       case AVMUHH:
+               return 0xe10d << 15 // vmuh.h
+       case AVMUHW:
+               return 0xe10e << 15 // vmuh.w
+       case AVMUHV:
+               return 0xe10f << 15 // vmuh.d
+       case AVMUHBU:
+               return 0xe110 << 15 // vmuh.bu
+       case AVMUHHU:
+               return 0xe111 << 15 // vmuh.hu
+       case AVMUHWU:
+               return 0xe112 << 15 // vmuh.wu
+       case AVMUHVU:
+               return 0xe113 << 15 // vmuh.du
+       case AXVMULB:
+               return 0xe908 << 15 // xvmul.b
+       case AXVMULH:
+               return 0xe909 << 15 // xvmul.h
+       case AXVMULW:
+               return 0xe90a << 15 // xvmul.w
+       case AXVMULV:
+               return 0xe90b << 15 // xvmul.d
+       case AXVMUHB:
+               return 0xe90c << 15 // xvmuh.b
+       case AXVMUHH:
+               return 0xe90d << 15 // xvmuh.h
+       case AXVMUHW:
+               return 0xe90e << 15 // xvmuh.w
+       case AXVMUHV:
+               return 0xe90f << 15 // xvmuh.d
+       case AXVMUHBU:
+               return 0xe910 << 15 // xvmuh.bu
+       case AXVMUHHU:
+               return 0xe911 << 15 // xvmuh.hu
+       case AXVMUHWU:
+               return 0xe912 << 15 // xvmuh.wu
+       case AXVMUHVU:
+               return 0xe913 << 15 // xvmuh.du
        }
 
        if a < 0 {