]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/loong64: add [X]VF{ADD/SUB/MUL/DIV}.{S/D} instructions
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Tue, 6 May 2025 02:47:07 +0000 (10:47 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Fri, 9 May 2025 00:40:23 +0000 (17:40 -0700)
Go asm syntax:
 V{ADD/SUB/MUL/DIV}{F/D} VK, VJ, VD
XV{ADD/SUB/MUL/DIV}{F/D} XK, XJ, XD

Equivalent platform assembler syntax:
 vf{add/sub/mul/div}.{s/d} vd, vj, vk
xvf{add/sub/mul/div}.{s/d} xd, xj, xk

Change-Id: I4607884212167ac97d7b6448ea3c849fc0fdd506
Reviewed-on: https://go-review.googlesource.com/c/go/+/670255
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
Reviewed-by: Carlos Amedee <carlos@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@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 a901da9b69d721bd57d83d6fa3ac1c3505514f85..3dfe89aab3fcc6f65904b8ee359b6f53f9004a87 100644 (file)
@@ -986,3 +986,21 @@ lable2:
        XVFRINTRMD      X1, X2          // 22489d76
        XVFRINTF        X1, X2          // 22349d76
        XVFRINTD        X1, X2          // 22389d76
+
+       // [X]VF{ADD/SUB/MUL/DIV}.{S/D} instructions
+       VADDF           V1, V2, V3      // 43843071
+       VADDD           V1, V2, V3      // 43043171
+       VSUBF           V1, V2, V3      // 43843271
+       VSUBD           V1, V2, V3      // 43043371
+       VMULF           V1, V2, V3      // 43843871
+       VMULD           V1, V2, V3      // 43043971
+       VDIVF           V1, V2, V3      // 43843a71
+       VDIVD           V1, V2, V3      // 43043b71
+       XVADDF          X1, X2, X3      // 43843075
+       XVADDD          X1, X2, X3      // 43043175
+       XVSUBF          X1, X2, X3      // 43843275
+       XVSUBD          X1, X2, X3      // 43043375
+       XVMULF          X1, X2, X3      // 43843875
+       XVMULD          X1, X2, X3      // 43043975
+       XVDIVF          X1, X2, X3      // 43843a75
+       XVDIVD          X1, X2, X3      // 43043b75
index 5e8210d5ddcdf0bec0e78547ff8553f6d9f13626..c88c556bfe9b50c074a07e7d52206b4500c924ac 100644 (file)
@@ -950,6 +950,23 @@ const (
        AXVFRSQRTF
        AXVFRSQRTD
 
+       AVADDF
+       AVADDD
+       AVSUBF
+       AVSUBD
+       AVMULF
+       AVMULD
+       AVDIVF
+       AVDIVD
+       AXVADDF
+       AXVADDD
+       AXVSUBF
+       AXVSUBD
+       AXVMULF
+       AXVMULD
+       AXVDIVF
+       AXVDIVD
+
        // LSX and LASX floating point conversion instructions
        AVFRINTRNEF
        AVFRINTRNED
index 86110c217d21d163149a00e8beaf62e633c492eb..533e5f41540bcf299734f70624377eb0e13dedf7 100644 (file)
@@ -449,6 +449,22 @@ var Anames = []string{
        "XVFRECIPD",
        "XVFRSQRTF",
        "XVFRSQRTD",
+       "VADDF",
+       "VADDD",
+       "VSUBF",
+       "VSUBD",
+       "VMULF",
+       "VMULD",
+       "VDIVF",
+       "VDIVD",
+       "XVADDF",
+       "XVADDD",
+       "XVSUBF",
+       "XVSUBD",
+       "XVMULF",
+       "XVMULD",
+       "XVDIVF",
+       "XVDIVD",
        "VFRINTRNEF",
        "VFRINTRNED",
        "VFRINTRZF",
index 1b46aa68a1f1b9245a364f335f29c3ba24fb61d7..dc9fafc0e2e43c79f011acdaa06bbb3303a04f1a 100644 (file)
@@ -1610,6 +1610,14 @@ func buildop(ctxt *obj.Link) {
                        opset(AVMULWODWHUH, r0)
                        opset(AVMULWODVWUW, r0)
                        opset(AVMULWODQVUV, r0)
+                       opset(AVADDF, r0)
+                       opset(AVADDD, r0)
+                       opset(AVSUBF, r0)
+                       opset(AVSUBD, r0)
+                       opset(AVMULF, r0)
+                       opset(AVMULD, r0)
+                       opset(AVDIVF, r0)
+                       opset(AVDIVD, r0)
 
                case AXVSEQB:
                        opset(AXVSEQH, r0)
@@ -1675,6 +1683,14 @@ func buildop(ctxt *obj.Link) {
                        opset(AXVMULWODWHUH, r0)
                        opset(AXVMULWODVWUW, r0)
                        opset(AXVMULWODQVUV, r0)
+                       opset(AXVADDF, r0)
+                       opset(AXVADDD, r0)
+                       opset(AXVSUBF, r0)
+                       opset(AXVSUBD, r0)
+                       opset(AXVMULF, r0)
+                       opset(AXVMULD, r0)
+                       opset(AXVDIVF, r0)
+                       opset(AXVDIVD, r0)
 
                case AVANDB:
                        opset(AVORB, r0)
@@ -3387,6 +3403,38 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
                return 0xe912 << 15 // xvmuh.wu
        case AXVMUHVU:
                return 0xe913 << 15 // xvmuh.du
+       case AVADDF:
+               return 0xe261 << 15 // vfadd.s
+       case AVADDD:
+               return 0xe262 << 15 // vfadd.d
+       case AVSUBF:
+               return 0xe265 << 15 // vfsub.s
+       case AVSUBD:
+               return 0xe266 << 15 // vfsub.d
+       case AVMULF:
+               return 0xe271 << 15 // vfmul.s
+       case AVMULD:
+               return 0xe272 << 15 // vfmul.d
+       case AVDIVF:
+               return 0xe275 << 15 // vfdiv.s
+       case AVDIVD:
+               return 0xe276 << 15 // vfdiv.d
+       case AXVADDF:
+               return 0xea61 << 15 // xvfadd.s
+       case AXVADDD:
+               return 0xea62 << 15 // xvfadd.d
+       case AXVSUBF:
+               return 0xea65 << 15 // xvfsub.s
+       case AXVSUBD:
+               return 0xea66 << 15 // xvfsub.d
+       case AXVMULF:
+               return 0xea71 << 15 // xvfmul.s
+       case AXVMULD:
+               return 0xea72 << 15 // xvfmul.d
+       case AXVDIVF:
+               return 0xea75 << 15 // xvfdiv.s
+       case AXVDIVD:
+               return 0xea76 << 15 // xvfdiv.d
        }
 
        if a < 0 {