]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/loong64: add {V,XV}DIV{B/H/W/V}[U] and {V,XV}MOD{B/H/W/V}[U] instruc...
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Mon, 16 Dec 2024 02:24:17 +0000 (10:24 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Thu, 13 Mar 2025 00:52:19 +0000 (17:52 -0700)
Go asm syntax:
 VDIV{B/H/W/V}[U] VK, VJ, VD
XVDIV{B/H/W/V}[U] XK, XJ, XD
 VMOD{B/H/W/V}[U] VK, VJ, VD
XVMOD{B/H/W/V}[U] XK, XJ, XD

Equivalent platform assembler syntax:
 vdiv.{b/h/w/d}[u] vd, vj, vk
xvdiv.{b/h/w/d}[u] xd, xj, xk
 vmod.{b/h/w/d}[u] vd, vj, vk
xvmod.{b/h/w/d}[u] xd, xj, xk

Change-Id: I3676721c3c415de0f2ebbd480ecd1b2400a28dba
Reviewed-on: https://go-review.googlesource.com/c/go/+/636376
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.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 136926647395d30b8a39bffb68b4587c9b5c3b64..f85939afbcf859d78265ee984fa04846b83faa57 100644 (file)
@@ -801,3 +801,37 @@ lable2:
        XVMUHHU         X3, X2, X1      // 418c8874
        XVMUHWU         X3, X2, X1      // 410c8974
        XVMUHVU         X3, X2, X1      // 418c8974
+
+       // [X]VDIV{B/H/W/V}[U] and [X]VMOD{B/H/W/V}[U] instructions
+       VDIVB           V1, V2, V3      // 4304e070
+       VDIVH           V1, V2, V3      // 4384e070
+       VDIVW           V1, V2, V3      // 4304e170
+       VDIVV           V1, V2, V3      // 4384e170
+       VDIVBU          V1, V2, V3      // 4304e470
+       VDIVHU          V1, V2, V3      // 4384e470
+       VDIVWU          V1, V2, V3      // 4304e570
+       VDIVVU          V1, V2, V3      // 4384e570
+       VMODB           V1, V2, V3      // 4304e270
+       VMODH           V1, V2, V3      // 4384e270
+       VMODW           V1, V2, V3      // 4304e370
+       VMODV           V1, V2, V3      // 4384e370
+       VMODBU          V1, V2, V3      // 4304e670
+       VMODHU          V1, V2, V3      // 4384e670
+       VMODWU          V1, V2, V3      // 4304e770
+       VMODVU          V1, V2, V3      // 4384e770
+       XVDIVB          X3, X2, X1      // 410ce074
+       XVDIVH          X3, X2, X1      // 418ce074
+       XVDIVW          X3, X2, X1      // 410ce174
+       XVDIVV          X3, X2, X1      // 418ce174
+       XVDIVBU         X3, X2, X1      // 410ce474
+       XVDIVHU         X3, X2, X1      // 418ce474
+       XVDIVWU         X3, X2, X1      // 410ce574
+       XVDIVVU         X3, X2, X1      // 418ce574
+       XVMODB          X3, X2, X1      // 410ce274
+       XVMODH          X3, X2, X1      // 418ce274
+       XVMODW          X3, X2, X1      // 410ce374
+       XVMODV          X3, X2, X1      // 418ce374
+       XVMODBU         X3, X2, X1      // 410ce674
+       XVMODHU         X3, X2, X1      // 418ce674
+       XVMODWU         X3, X2, X1      // 410ce774
+       XVMODVU         X3, X2, X1      // 418ce774
index 39f617fa168999975cd644c3948e142ff7272ba2..55ca273455995282e1e3c7c30e76216c2e794e4c 100644 (file)
@@ -824,6 +824,40 @@ const (
        AVSEQV
        AXVSEQV
 
+       // LSX and LASX integer div and mod instructions
+       AVDIVB
+       AVDIVH
+       AVDIVW
+       AVDIVV
+       AVDIVBU
+       AVDIVHU
+       AVDIVWU
+       AVDIVVU
+       AVMODB
+       AVMODH
+       AVMODW
+       AVMODV
+       AVMODBU
+       AVMODHU
+       AVMODWU
+       AVMODVU
+       AXVDIVB
+       AXVDIVH
+       AXVDIVW
+       AXVDIVV
+       AXVDIVBU
+       AXVDIVHU
+       AXVDIVWU
+       AXVDIVVU
+       AXVMODB
+       AXVMODH
+       AXVMODW
+       AXVMODV
+       AXVMODBU
+       AXVMODHU
+       AXVMODWU
+       AXVMODVU
+
        // LSX and LASX shift operation instructions
        AVSLLB
        AVSLLH
index fa616a5d54ce9422056c67f391fa9a1658410509..b91bb93d0a6c5c6a71926e03344f9fe235a458a9 100644 (file)
@@ -333,6 +333,38 @@ var Anames = []string{
        "XVSEQW",
        "VSEQV",
        "XVSEQV",
+       "VDIVB",
+       "VDIVH",
+       "VDIVW",
+       "VDIVV",
+       "VDIVBU",
+       "VDIVHU",
+       "VDIVWU",
+       "VDIVVU",
+       "VMODB",
+       "VMODH",
+       "VMODW",
+       "VMODV",
+       "VMODBU",
+       "VMODHU",
+       "VMODWU",
+       "VMODVU",
+       "XVDIVB",
+       "XVDIVH",
+       "XVDIVW",
+       "XVDIVV",
+       "XVDIVBU",
+       "XVDIVHU",
+       "XVDIVWU",
+       "XVDIVVU",
+       "XVMODB",
+       "XVMODH",
+       "XVMODW",
+       "XVMODV",
+       "XVMODBU",
+       "XVMODHU",
+       "XVMODWU",
+       "XVMODVU",
        "VSLLB",
        "VSLLH",
        "VSLLW",
index b92b9b60effaa90c92b6d79aec8a63414040b815..306a309cac5867ac9b54f5e14e2d0011f4ae78c3 100644 (file)
@@ -1567,6 +1567,22 @@ func buildop(ctxt *obj.Link) {
                        opset(AVMUHHU, r0)
                        opset(AVMUHWU, r0)
                        opset(AVMUHVU, r0)
+                       opset(AVDIVB, r0)
+                       opset(AVDIVH, r0)
+                       opset(AVDIVW, r0)
+                       opset(AVDIVV, r0)
+                       opset(AVMODB, r0)
+                       opset(AVMODH, r0)
+                       opset(AVMODW, r0)
+                       opset(AVMODV, r0)
+                       opset(AVDIVBU, r0)
+                       opset(AVDIVHU, r0)
+                       opset(AVDIVWU, r0)
+                       opset(AVDIVVU, r0)
+                       opset(AVMODBU, r0)
+                       opset(AVMODHU, r0)
+                       opset(AVMODWU, r0)
+                       opset(AVMODVU, r0)
 
                case AXVSEQB:
                        opset(AXVSEQH, r0)
@@ -1592,6 +1608,22 @@ func buildop(ctxt *obj.Link) {
                        opset(AXVMUHHU, r0)
                        opset(AXVMUHWU, r0)
                        opset(AXVMUHVU, r0)
+                       opset(AXVDIVB, r0)
+                       opset(AXVDIVH, r0)
+                       opset(AXVDIVW, r0)
+                       opset(AXVDIVV, r0)
+                       opset(AXVMODB, r0)
+                       opset(AXVMODH, r0)
+                       opset(AXVMODW, r0)
+                       opset(AXVMODV, r0)
+                       opset(AXVDIVBU, r0)
+                       opset(AXVDIVHU, r0)
+                       opset(AXVDIVWU, r0)
+                       opset(AXVDIVVU, r0)
+                       opset(AXVMODBU, r0)
+                       opset(AXVMODHU, r0)
+                       opset(AXVMODWU, r0)
+                       opset(AXVMODVU, r0)
 
                case AVANDB:
                        opset(AVORB, r0)
@@ -2874,6 +2906,70 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
                return 0x0EA50 << 15 // xvandn.v
        case AXVORNV:
                return 0x0EA51 << 15 // xvorn.v
+       case AVDIVB:
+               return 0xe1c0 << 15 // vdiv.b
+       case AVDIVH:
+               return 0xe1c1 << 15 // vdiv.h
+       case AVDIVW:
+               return 0xe1c2 << 15 // vdiv.w
+       case AVDIVV:
+               return 0xe1c3 << 15 // vdiv.d
+       case AVMODB:
+               return 0xe1c4 << 15 // vmod.b
+       case AVMODH:
+               return 0xe1c5 << 15 // vmod.h
+       case AVMODW:
+               return 0xe1c6 << 15 // vmod.w
+       case AVMODV:
+               return 0xe1c7 << 15 // vmod.d
+       case AVDIVBU:
+               return 0xe1c8 << 15 // vdiv.bu
+       case AVDIVHU:
+               return 0xe1c9 << 15 // vdiv.hu
+       case AVDIVWU:
+               return 0xe1ca << 15 // vdiv.wu
+       case AVDIVVU:
+               return 0xe1cb << 15 // vdiv.du
+       case AVMODBU:
+               return 0xe1cc << 15 // vmod.bu
+       case AVMODHU:
+               return 0xe1cd << 15 // vmod.hu
+       case AVMODWU:
+               return 0xe1ce << 15 // vmod.wu
+       case AVMODVU:
+               return 0xe1cf << 15 // vmod.du
+       case AXVDIVB:
+               return 0xe9c0 << 15 // xvdiv.b
+       case AXVDIVH:
+               return 0xe9c1 << 15 // xvdiv.h
+       case AXVDIVW:
+               return 0xe9c2 << 15 // xvdiv.w
+       case AXVDIVV:
+               return 0xe9c3 << 15 // xvdiv.d
+       case AXVMODB:
+               return 0xe9c4 << 15 // xvmod.b
+       case AXVMODH:
+               return 0xe9c5 << 15 // xvmod.h
+       case AXVMODW:
+               return 0xe9c6 << 15 // xvmod.w
+       case AXVMODV:
+               return 0xe9c7 << 15 // xvmod.d
+       case AXVDIVBU:
+               return 0xe9c8 << 15 // xvdiv.bu
+       case AXVDIVHU:
+               return 0xe9c9 << 15 // xvdiv.hu
+       case AXVDIVWU:
+               return 0xe9ca << 15 // xvdiv.wu
+       case AXVDIVVU:
+               return 0xe9cb << 15 // xvdiv.du
+       case AXVMODBU:
+               return 0xe9cc << 15 // xvmod.bu
+       case AXVMODHU:
+               return 0xe9cd << 15 // xvmod.hu
+       case AXVMODWU:
+               return 0xe9ce << 15 // xvmod.wu
+       case AXVMODVU:
+               return 0xe9cf << 15 // xvmod.du
        case AVSLLB:
                return 0xe1d0 << 15 // vsll.b
        case AVSLLH: