diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc1.s b/src/cmd/asm/internal/asm/testdata/loong64enc1.s index a901da9b69d721bd57d83d6fa3ac1c3505514f85..3dfe89aab3fcc6f65904b8ee359b6f53f9004a87 100644 --- a/src/cmd/asm/internal/asm/testdata/loong64enc1.s +++ b/src/cmd/asm/internal/asm/testdata/loong64enc1.s @@ -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 diff --git a/src/cmd/internal/obj/loong64/a.out.go b/src/cmd/internal/obj/loong64/a.out.go index 5e8210d5ddcdf0bec0e78547ff8553f6d9f13626..c88c556bfe9b50c074a07e7d52206b4500c924ac 100644 --- a/src/cmd/internal/obj/loong64/a.out.go +++ b/src/cmd/internal/obj/loong64/a.out.go @@ -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 diff --git a/src/cmd/internal/obj/loong64/anames.go b/src/cmd/internal/obj/loong64/anames.go index 86110c217d21d163149a00e8beaf62e633c492eb..533e5f41540bcf299734f70624377eb0e13dedf7 100644 --- a/src/cmd/internal/obj/loong64/anames.go +++ b/src/cmd/internal/obj/loong64/anames.go @@ -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", diff --git a/src/cmd/internal/obj/loong64/asm.go b/src/cmd/internal/obj/loong64/asm.go index 1b46aa68a1f1b9245a364f335f29c3ba24fb61d7..dc9fafc0e2e43c79f011acdaa06bbb3303a04f1a 100644 --- a/src/cmd/internal/obj/loong64/asm.go +++ b/src/cmd/internal/obj/loong64/asm.go @@ -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 {