]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/loong64: add {,X}VS{ADD,SUB}.{B/H/W/V}{,U} instructions support
authorGuoqi Chen <chenguoqi@loongson.cn>
Mon, 10 Nov 2025 07:57:14 +0000 (15:57 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Thu, 13 Nov 2025 06:16:07 +0000 (22:16 -0800)
Go asm syntax:
 VSADD{B,H,W,V}     V1, V2, V3
 VSADD{B,H,W,V}U    V1, V2, V3
 VSSUB{B,H,W,V}     V1, V2, V3
 VSSUB{B,H,W,V}U    V1, V2, V3
XVSADD{B,H,W,V}     X1, X2, X3
XVSADD{B,H,W,V}U    X1, X2, X3
XVSSUB{B,H,W,V}     X1, X2, X3
XVSSUB{B,H,W,V}U    X1, X2, X3

Equivalent platform assembler syntax:
 vsadd.{b,h,w,d}    v3, v2, v1
 vsadd.{b,h,w,d}u   v3, v2, v1
 vssub.{b,h,w,d}    v3, v2, v1
 vssub.{b,h,w,d}u   v3, v2, v1
xvsadd.{b,h,w,d}    x3, x2, x1
xvsadd.{b,h,w,d}u   x3, x2, x1
xvssub.{b,h,w,d}    x3, x2, x1
xvssub.{b,h,w,d}u   x3, x2, x1

Change-Id: Iab8c1a9bdc4940598936f3beac846466e913ffa2
Reviewed-on: https://go-review.googlesource.com/c/go/+/719200
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn>
Reviewed-by: Michael Pratt <mpratt@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 2eb3156e4543f0dd77bd9dfe1dbf9d0347ac520d..c820a0a5a10cc125d99d84aff6d13ef7c6458553 100644 (file)
@@ -843,6 +843,42 @@ lable2:
        XVSUBWU         $15, X1, X2     // 223c8d76
        XVSUBVU         $16, X1, X2     // 22c08d76
 
+       // [X]VSADD{B,H,W,V}, [X]VSSUB{B,H,W,V} instructions
+       VSADDB          V1, V2, V3      // 43044670
+       VSADDH          V1, V2, V3      // 43844670
+       VSADDW          V1, V2, V3      // 43044770
+       VSADDV          V1, V2, V3      // 43844770
+       VSSUBB          V1, V2, V3      // 43044870
+       VSSUBH          V1, V2, V3      // 43844870
+       VSSUBW          V1, V2, V3      // 43044970
+       VSSUBV          V1, V2, V3      // 43844970
+       XVSADDB         X3, X2, X1      // 410c4674
+       XVSADDH         X3, X2, X1      // 418c4674
+       XVSADDW         X3, X2, X1      // 410c4774
+       XVSADDV         X3, X2, X1      // 418c4774
+       XVSSUBB         X3, X2, X1      // 410c4874
+       XVSSUBH         X3, X2, X1      // 418c4874
+       XVSSUBW         X3, X2, X1      // 410c4974
+       XVSSUBV         X3, X2, X1      // 418c4974
+
+       // [X]VSADD{B,H,W,V}U, [X]VSSUB{B,H,W,V}U instructions
+       VSADDBU         V1, V2, V3      // 43044a70
+       VSADDHU         V1, V2, V3      // 43844a70
+       VSADDWU         V1, V2, V3      // 43044b70
+       VSADDVU         V1, V2, V3      // 43844b70
+       VSSUBBU         V1, V2, V3      // 43044c70
+       VSSUBHU         V1, V2, V3      // 43844c70
+       VSSUBWU         V1, V2, V3      // 43044d70
+       VSSUBVU         V1, V2, V3      // 43844d70
+       XVSADDBU        X1, X2, X3      // 43044a74
+       XVSADDHU        X1, X2, X3      // 43044b74
+       XVSADDWU        X1, X2, X3      // 43044b74
+       XVSADDVU        X1, X2, X3      // 43844b74
+       XVSSUBBU        X1, X2, X3      // 43044c74
+       XVSSUBHU        X1, X2, X3      // 43844c74
+       XVSSUBWU        X1, X2, X3      // 43044d74
+       XVSSUBVU        X1, X2, X3      // 43844d74
+
        // [X]VILV{L/H}{B,H,W,V} instructions
        VILVLB          V1, V2, V3      // 43041a71
        VILVLH          V1, V2, V3      // 43841a71
index 6bf2068334474db059ec007a47e75c18a2b31c4b..73f145df1462b04a16843ebf4a26831cd81af80c 100644 (file)
@@ -809,6 +809,38 @@ const (
        AXVSUBHU
        AXVSUBWU
        AXVSUBVU
+       AVSADDB
+       AVSADDH
+       AVSADDW
+       AVSADDV
+       AVSSUBB
+       AVSSUBH
+       AVSSUBW
+       AVSSUBV
+       AVSADDBU
+       AVSADDHU
+       AVSADDWU
+       AVSADDVU
+       AVSSUBBU
+       AVSSUBHU
+       AVSSUBWU
+       AVSSUBVU
+       AXVSADDB
+       AXVSADDH
+       AXVSADDW
+       AXVSADDV
+       AXVSSUBB
+       AXVSSUBH
+       AXVSSUBW
+       AXVSSUBV
+       AXVSADDBU
+       AXVSADDHU
+       AXVSADDWU
+       AXVSADDVU
+       AXVSSUBBU
+       AXVSSUBHU
+       AXVSSUBWU
+       AXVSSUBVU
 
        // LSX and LASX Bit-manipulation Instructions
        AVANDB
index 0e00cb887f678fc4460269616a62a6fbbed49d2a..ab85c52a21b2ac02f08c170205f06a2ea8d64b12 100644 (file)
@@ -306,6 +306,38 @@ var Anames = []string{
        "XVSUBHU",
        "XVSUBWU",
        "XVSUBVU",
+       "VSADDB",
+       "VSADDH",
+       "VSADDW",
+       "VSADDV",
+       "VSSUBB",
+       "VSSUBH",
+       "VSSUBW",
+       "VSSUBV",
+       "VSADDBU",
+       "VSADDHU",
+       "VSADDWU",
+       "VSADDVU",
+       "VSSUBBU",
+       "VSSUBHU",
+       "VSSUBWU",
+       "VSSUBVU",
+       "XVSADDB",
+       "XVSADDH",
+       "XVSADDW",
+       "XVSADDV",
+       "XVSSUBB",
+       "XVSSUBH",
+       "XVSSUBW",
+       "XVSSUBV",
+       "XVSADDBU",
+       "XVSADDHU",
+       "XVSADDWU",
+       "XVSADDVU",
+       "XVSSUBBU",
+       "XVSSUBHU",
+       "XVSSUBWU",
+       "XVSSUBVU",
        "VANDB",
        "VORB",
        "VXORB",
index 53cea8d37c29e407ddd516a18690be4ebaebc9a1..38b075d77e744a3ec63175550166c38ffa24efc1 100644 (file)
@@ -1890,6 +1890,22 @@ func buildop(ctxt *obj.Link) {
                        opset(AVSUBW, r0)
                        opset(AVSUBV, r0)
                        opset(AVSUBQ, r0)
+                       opset(AVSADDB, r0)
+                       opset(AVSADDH, r0)
+                       opset(AVSADDW, r0)
+                       opset(AVSADDV, r0)
+                       opset(AVSSUBB, r0)
+                       opset(AVSSUBH, r0)
+                       opset(AVSSUBW, r0)
+                       opset(AVSSUBV, r0)
+                       opset(AVSADDBU, r0)
+                       opset(AVSADDHU, r0)
+                       opset(AVSADDWU, r0)
+                       opset(AVSADDVU, r0)
+                       opset(AVSSUBBU, r0)
+                       opset(AVSSUBHU, r0)
+                       opset(AVSSUBWU, r0)
+                       opset(AVSSUBVU, r0)
 
                case AXVADDB:
                        opset(AXVADDH, r0)
@@ -1901,6 +1917,22 @@ func buildop(ctxt *obj.Link) {
                        opset(AXVSUBW, r0)
                        opset(AXVSUBV, r0)
                        opset(AXVSUBQ, r0)
+                       opset(AXVSADDB, r0)
+                       opset(AXVSADDH, r0)
+                       opset(AXVSADDW, r0)
+                       opset(AXVSADDV, r0)
+                       opset(AXVSSUBB, r0)
+                       opset(AXVSSUBH, r0)
+                       opset(AXVSSUBW, r0)
+                       opset(AXVSSUBV, r0)
+                       opset(AXVSADDBU, r0)
+                       opset(AXVSADDHU, r0)
+                       opset(AXVSADDWU, r0)
+                       opset(AXVSADDVU, r0)
+                       opset(AXVSSUBBU, r0)
+                       opset(AXVSSUBHU, r0)
+                       opset(AXVSSUBWU, r0)
+                       opset(AXVSSUBVU, r0)
 
                case AVSLLB:
                        opset(AVSRLB, r0)
@@ -3629,6 +3661,70 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
                return 0xe81b << 15 // xvsub.d
        case AXVSUBQ:
                return 0xea5b << 15 // xvsub.q
+       case AVSADDB:
+               return 0x0E08C << 15 // vsadd.b
+       case AVSADDH:
+               return 0x0E08D << 15 // vsadd.h
+       case AVSADDW:
+               return 0x0E08E << 15 // vsadd.w
+       case AVSADDV:
+               return 0x0E08F << 15 // vsadd.d
+       case AVSSUBB:
+               return 0x0E090 << 15 // vssub.b
+       case AVSSUBH:
+               return 0x0E091 << 15 // vssub.w
+       case AVSSUBW:
+               return 0x0E092 << 15 // vssub.h
+       case AVSSUBV:
+               return 0x0E093 << 15 // vssub.d
+       case AVSADDBU:
+               return 0x0E094 << 15 // vsadd.bu
+       case AVSADDHU:
+               return 0x0E095 << 15 // vsadd.hu
+       case AVSADDWU:
+               return 0x0E096 << 15 // vsadd.wu
+       case AVSADDVU:
+               return 0x0E097 << 15 // vsadd.du
+       case AVSSUBBU:
+               return 0x0E098 << 15 // vssub.bu
+       case AVSSUBHU:
+               return 0x0E099 << 15 // vssub.wu
+       case AVSSUBWU:
+               return 0x0E09A << 15 // vssub.hu
+       case AVSSUBVU:
+               return 0x0E09B << 15 // vssub.du
+       case AXVSADDB:
+               return 0x0E88C << 15 // vxsadd.b
+       case AXVSADDH:
+               return 0x0E88D << 15 // vxsadd.h
+       case AXVSADDW:
+               return 0x0E88E << 15 // vxsadd.w
+       case AXVSADDV:
+               return 0x0E88F << 15 // vxsadd.d
+       case AXVSSUBB:
+               return 0x0E890 << 15 // xvssub.b
+       case AXVSSUBH:
+               return 0x0E891 << 15 // xvssub.h
+       case AXVSSUBW:
+               return 0x0E892 << 15 // xvssub.w
+       case AXVSSUBV:
+               return 0x0E893 << 15 // xvssub.d
+       case AXVSADDBU:
+               return 0x0E894 << 15 // vxsadd.bu
+       case AXVSADDHU:
+               return 0x0E896 << 15 // vxsadd.hu
+       case AXVSADDWU:
+               return 0x0E896 << 15 // vxsadd.wu
+       case AXVSADDVU:
+               return 0x0E897 << 15 // vxsadd.du
+       case AXVSSUBBU:
+               return 0x0E898 << 15 // xvssub.bu
+       case AXVSSUBHU:
+               return 0x0E899 << 15 // xvssub.hu
+       case AXVSSUBWU:
+               return 0x0E89A << 15 // xvssub.wu
+       case AXVSSUBVU:
+               return 0x0E89B << 15 // xvssub.du
        case AVILVLB:
                return 0xe234 << 15 // vilvl.b
        case AVILVLH: