mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/obj/loong64: add [X]VF{ADD/SUB/MUL/DIV}.{S/D} instructions
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>
This commit is contained in:
parent
0c8615be08
commit
d65c209b4b
4 changed files with 99 additions and 0 deletions
18
src/cmd/asm/internal/asm/testdata/loong64enc1.s
vendored
18
src/cmd/asm/internal/asm/testdata/loong64enc1.s
vendored
|
|
@ -986,3 +986,21 @@ lable2:
|
||||||
XVFRINTRMD X1, X2 // 22489d76
|
XVFRINTRMD X1, X2 // 22489d76
|
||||||
XVFRINTF X1, X2 // 22349d76
|
XVFRINTF X1, X2 // 22349d76
|
||||||
XVFRINTD X1, X2 // 22389d76
|
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
|
||||||
|
|
|
||||||
|
|
@ -950,6 +950,23 @@ const (
|
||||||
AXVFRSQRTF
|
AXVFRSQRTF
|
||||||
AXVFRSQRTD
|
AXVFRSQRTD
|
||||||
|
|
||||||
|
AVADDF
|
||||||
|
AVADDD
|
||||||
|
AVSUBF
|
||||||
|
AVSUBD
|
||||||
|
AVMULF
|
||||||
|
AVMULD
|
||||||
|
AVDIVF
|
||||||
|
AVDIVD
|
||||||
|
AXVADDF
|
||||||
|
AXVADDD
|
||||||
|
AXVSUBF
|
||||||
|
AXVSUBD
|
||||||
|
AXVMULF
|
||||||
|
AXVMULD
|
||||||
|
AXVDIVF
|
||||||
|
AXVDIVD
|
||||||
|
|
||||||
// LSX and LASX floating point conversion instructions
|
// LSX and LASX floating point conversion instructions
|
||||||
AVFRINTRNEF
|
AVFRINTRNEF
|
||||||
AVFRINTRNED
|
AVFRINTRNED
|
||||||
|
|
|
||||||
|
|
@ -449,6 +449,22 @@ var Anames = []string{
|
||||||
"XVFRECIPD",
|
"XVFRECIPD",
|
||||||
"XVFRSQRTF",
|
"XVFRSQRTF",
|
||||||
"XVFRSQRTD",
|
"XVFRSQRTD",
|
||||||
|
"VADDF",
|
||||||
|
"VADDD",
|
||||||
|
"VSUBF",
|
||||||
|
"VSUBD",
|
||||||
|
"VMULF",
|
||||||
|
"VMULD",
|
||||||
|
"VDIVF",
|
||||||
|
"VDIVD",
|
||||||
|
"XVADDF",
|
||||||
|
"XVADDD",
|
||||||
|
"XVSUBF",
|
||||||
|
"XVSUBD",
|
||||||
|
"XVMULF",
|
||||||
|
"XVMULD",
|
||||||
|
"XVDIVF",
|
||||||
|
"XVDIVD",
|
||||||
"VFRINTRNEF",
|
"VFRINTRNEF",
|
||||||
"VFRINTRNED",
|
"VFRINTRNED",
|
||||||
"VFRINTRZF",
|
"VFRINTRZF",
|
||||||
|
|
|
||||||
|
|
@ -1610,6 +1610,14 @@ func buildop(ctxt *obj.Link) {
|
||||||
opset(AVMULWODWHUH, r0)
|
opset(AVMULWODWHUH, r0)
|
||||||
opset(AVMULWODVWUW, r0)
|
opset(AVMULWODVWUW, r0)
|
||||||
opset(AVMULWODQVUV, 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:
|
case AXVSEQB:
|
||||||
opset(AXVSEQH, r0)
|
opset(AXVSEQH, r0)
|
||||||
|
|
@ -1675,6 +1683,14 @@ func buildop(ctxt *obj.Link) {
|
||||||
opset(AXVMULWODWHUH, r0)
|
opset(AXVMULWODWHUH, r0)
|
||||||
opset(AXVMULWODVWUW, r0)
|
opset(AXVMULWODVWUW, r0)
|
||||||
opset(AXVMULWODQVUV, 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:
|
case AVANDB:
|
||||||
opset(AVORB, r0)
|
opset(AVORB, r0)
|
||||||
|
|
@ -3387,6 +3403,38 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
|
||||||
return 0xe912 << 15 // xvmuh.wu
|
return 0xe912 << 15 // xvmuh.wu
|
||||||
case AXVMUHVU:
|
case AXVMUHVU:
|
||||||
return 0xe913 << 15 // xvmuh.du
|
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 {
|
if a < 0 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue