mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/obj/loong64: add {V,XV}DIV{B/H/W/V}[U] and {V,XV}MOD{B/H/W/V}[U] instructions support
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>
This commit is contained in:
parent
d729053edf
commit
b10c35945d
4 changed files with 196 additions and 0 deletions
34
src/cmd/asm/internal/asm/testdata/loong64enc1.s
vendored
34
src/cmd/asm/internal/asm/testdata/loong64enc1.s
vendored
|
|
@ -801,3 +801,37 @@ lable2:
|
||||||
XVMUHHU X3, X2, X1 // 418c8874
|
XVMUHHU X3, X2, X1 // 418c8874
|
||||||
XVMUHWU X3, X2, X1 // 410c8974
|
XVMUHWU X3, X2, X1 // 410c8974
|
||||||
XVMUHVU X3, X2, X1 // 418c8974
|
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
|
||||||
|
|
|
||||||
|
|
@ -824,6 +824,40 @@ const (
|
||||||
AVSEQV
|
AVSEQV
|
||||||
AXVSEQV
|
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
|
// LSX and LASX shift operation instructions
|
||||||
AVSLLB
|
AVSLLB
|
||||||
AVSLLH
|
AVSLLH
|
||||||
|
|
|
||||||
|
|
@ -333,6 +333,38 @@ var Anames = []string{
|
||||||
"XVSEQW",
|
"XVSEQW",
|
||||||
"VSEQV",
|
"VSEQV",
|
||||||
"XVSEQV",
|
"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",
|
"VSLLB",
|
||||||
"VSLLH",
|
"VSLLH",
|
||||||
"VSLLW",
|
"VSLLW",
|
||||||
|
|
|
||||||
|
|
@ -1567,6 +1567,22 @@ func buildop(ctxt *obj.Link) {
|
||||||
opset(AVMUHHU, r0)
|
opset(AVMUHHU, r0)
|
||||||
opset(AVMUHWU, r0)
|
opset(AVMUHWU, r0)
|
||||||
opset(AVMUHVU, 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:
|
case AXVSEQB:
|
||||||
opset(AXVSEQH, r0)
|
opset(AXVSEQH, r0)
|
||||||
|
|
@ -1592,6 +1608,22 @@ func buildop(ctxt *obj.Link) {
|
||||||
opset(AXVMUHHU, r0)
|
opset(AXVMUHHU, r0)
|
||||||
opset(AXVMUHWU, r0)
|
opset(AXVMUHWU, r0)
|
||||||
opset(AXVMUHVU, 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:
|
case AVANDB:
|
||||||
opset(AVORB, r0)
|
opset(AVORB, r0)
|
||||||
|
|
@ -2874,6 +2906,70 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
|
||||||
return 0x0EA50 << 15 // xvandn.v
|
return 0x0EA50 << 15 // xvandn.v
|
||||||
case AXVORNV:
|
case AXVORNV:
|
||||||
return 0x0EA51 << 15 // xvorn.v
|
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:
|
case AVSLLB:
|
||||||
return 0xe1d0 << 15 // vsll.b
|
return 0xe1d0 << 15 // vsll.b
|
||||||
case AVSLLH:
|
case AVSLLH:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue