mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/obj/loong64: add {V,XV}MUL{B/H/W/V} and {V,XV}MUH{B/H/W/V}[U] instructions support
Go asm syntax:
VMUL{B/H/W/V} VK, VJ, VD
VMUH{B/H/W/V}[U] VK, VJ, VD
XVMUL{B/H/W/V} XK, XJ, XD
XVMUH{B/H/W/V}[U] XK, XJ, XD
Equivalent platform assembler syntax:
vmul.{b/h/w/d} vd, vj, vk
vmuh.{b/h/w/d}[u] vd, vj, vk
xvmul.{b/h/w/d} xd, xj, xk
xvmuh.{b/h/w/d}[u] xd, xj, xk
Change-Id: I2f15a5b4b6303a0f82cb85114477f58e1b5fd950
Reviewed-on: https://go-review.googlesource.com/c/go/+/636375
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: abner chenc <chenguoqi@loongson.cn>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
This commit is contained in:
parent
6c70f2b960
commit
b0e2f185c5
4 changed files with 148 additions and 0 deletions
26
src/cmd/asm/internal/asm/testdata/loong64enc1.s
vendored
26
src/cmd/asm/internal/asm/testdata/loong64enc1.s
vendored
|
|
@ -775,3 +775,29 @@ lable2:
|
||||||
XVILVHH X3, X2, X1 // 418c1c75
|
XVILVHH X3, X2, X1 // 418c1c75
|
||||||
XVILVHW X3, X2, X1 // 410c1d75
|
XVILVHW X3, X2, X1 // 410c1d75
|
||||||
XVILVHV X3, X2, X1 // 418c1d75
|
XVILVHV X3, X2, X1 // 418c1d75
|
||||||
|
|
||||||
|
// [X]VMUL{B/H/W/V} and [X]VMUH{B/H/W/V}[U] instructions
|
||||||
|
VMULB V1, V2, V3 // 43048470
|
||||||
|
VMULH V1, V2, V3 // 43848470
|
||||||
|
VMULW V1, V2, V3 // 43048570
|
||||||
|
VMULV V1, V2, V3 // 43848570
|
||||||
|
VMUHB V1, V2, V3 // 43048670
|
||||||
|
VMUHH V1, V2, V3 // 43848670
|
||||||
|
VMUHW V1, V2, V3 // 43048770
|
||||||
|
VMUHV V1, V2, V3 // 43848770
|
||||||
|
VMUHBU V1, V2, V3 // 43048870
|
||||||
|
VMUHHU V1, V2, V3 // 43848870
|
||||||
|
VMUHWU V1, V2, V3 // 43048970
|
||||||
|
VMUHVU V1, V2, V3 // 43848970
|
||||||
|
XVMULB X3, X2, X1 // 410c8474
|
||||||
|
XVMULH X3, X2, X1 // 418c8474
|
||||||
|
XVMULW X3, X2, X1 // 410c8574
|
||||||
|
XVMULV X3, X2, X1 // 418c8574
|
||||||
|
XVMUHB X3, X2, X1 // 410c8674
|
||||||
|
XVMUHH X3, X2, X1 // 418c8674
|
||||||
|
XVMUHW X3, X2, X1 // 410c8774
|
||||||
|
XVMUHV X3, X2, X1 // 418c8774
|
||||||
|
XVMUHBU X3, X2, X1 // 410c8874
|
||||||
|
XVMUHHU X3, X2, X1 // 418c8874
|
||||||
|
XVMUHWU X3, X2, X1 // 410c8974
|
||||||
|
XVMUHVU X3, X2, X1 // 418c8974
|
||||||
|
|
|
||||||
|
|
@ -876,6 +876,32 @@ const (
|
||||||
AXVILVHW
|
AXVILVHW
|
||||||
AXVILVHV
|
AXVILVHV
|
||||||
|
|
||||||
|
// LSX and LASX integer mul instructions
|
||||||
|
AVMULB
|
||||||
|
AVMULH
|
||||||
|
AVMULW
|
||||||
|
AVMULV
|
||||||
|
AVMUHB
|
||||||
|
AVMUHH
|
||||||
|
AVMUHW
|
||||||
|
AVMUHV
|
||||||
|
AVMUHBU
|
||||||
|
AVMUHHU
|
||||||
|
AVMUHWU
|
||||||
|
AVMUHVU
|
||||||
|
AXVMULB
|
||||||
|
AXVMULH
|
||||||
|
AXVMULW
|
||||||
|
AXVMULV
|
||||||
|
AXVMUHB
|
||||||
|
AXVMUHH
|
||||||
|
AXVMUHW
|
||||||
|
AXVMUHV
|
||||||
|
AXVMUHBU
|
||||||
|
AXVMUHHU
|
||||||
|
AXVMUHWU
|
||||||
|
AXVMUHVU
|
||||||
|
|
||||||
ALAST
|
ALAST
|
||||||
|
|
||||||
// aliases
|
// aliases
|
||||||
|
|
|
||||||
|
|
@ -381,5 +381,29 @@ var Anames = []string{
|
||||||
"XVILVHH",
|
"XVILVHH",
|
||||||
"XVILVHW",
|
"XVILVHW",
|
||||||
"XVILVHV",
|
"XVILVHV",
|
||||||
|
"VMULB",
|
||||||
|
"VMULH",
|
||||||
|
"VMULW",
|
||||||
|
"VMULV",
|
||||||
|
"VMUHB",
|
||||||
|
"VMUHH",
|
||||||
|
"VMUHW",
|
||||||
|
"VMUHV",
|
||||||
|
"VMUHBU",
|
||||||
|
"VMUHHU",
|
||||||
|
"VMUHWU",
|
||||||
|
"VMUHVU",
|
||||||
|
"XVMULB",
|
||||||
|
"XVMULH",
|
||||||
|
"XVMULW",
|
||||||
|
"XVMULV",
|
||||||
|
"XVMUHB",
|
||||||
|
"XVMUHH",
|
||||||
|
"XVMUHW",
|
||||||
|
"XVMUHV",
|
||||||
|
"XVMUHBU",
|
||||||
|
"XVMUHHU",
|
||||||
|
"XVMUHWU",
|
||||||
|
"XVMUHVU",
|
||||||
"LAST",
|
"LAST",
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1555,6 +1555,18 @@ func buildop(ctxt *obj.Link) {
|
||||||
opset(AVILVHH, r0)
|
opset(AVILVHH, r0)
|
||||||
opset(AVILVHW, r0)
|
opset(AVILVHW, r0)
|
||||||
opset(AVILVHV, r0)
|
opset(AVILVHV, r0)
|
||||||
|
opset(AVMULB, r0)
|
||||||
|
opset(AVMULH, r0)
|
||||||
|
opset(AVMULW, r0)
|
||||||
|
opset(AVMULV, r0)
|
||||||
|
opset(AVMUHB, r0)
|
||||||
|
opset(AVMUHH, r0)
|
||||||
|
opset(AVMUHW, r0)
|
||||||
|
opset(AVMUHV, r0)
|
||||||
|
opset(AVMUHBU, r0)
|
||||||
|
opset(AVMUHHU, r0)
|
||||||
|
opset(AVMUHWU, r0)
|
||||||
|
opset(AVMUHVU, r0)
|
||||||
|
|
||||||
case AXVSEQB:
|
case AXVSEQB:
|
||||||
opset(AXVSEQH, r0)
|
opset(AXVSEQH, r0)
|
||||||
|
|
@ -1568,6 +1580,18 @@ func buildop(ctxt *obj.Link) {
|
||||||
opset(AXVILVHH, r0)
|
opset(AXVILVHH, r0)
|
||||||
opset(AXVILVHW, r0)
|
opset(AXVILVHW, r0)
|
||||||
opset(AXVILVHV, r0)
|
opset(AXVILVHV, r0)
|
||||||
|
opset(AXVMULB, r0)
|
||||||
|
opset(AXVMULH, r0)
|
||||||
|
opset(AXVMULW, r0)
|
||||||
|
opset(AXVMULV, r0)
|
||||||
|
opset(AXVMUHB, r0)
|
||||||
|
opset(AXVMUHH, r0)
|
||||||
|
opset(AXVMUHW, r0)
|
||||||
|
opset(AXVMUHV, r0)
|
||||||
|
opset(AXVMUHBU, r0)
|
||||||
|
opset(AXVMUHHU, r0)
|
||||||
|
opset(AXVMUHWU, r0)
|
||||||
|
opset(AXVMUHVU, r0)
|
||||||
|
|
||||||
case AVANDB:
|
case AVANDB:
|
||||||
opset(AVORB, r0)
|
opset(AVORB, r0)
|
||||||
|
|
@ -2986,6 +3010,54 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
|
||||||
return 0xea3a << 15 // xvilvh.w
|
return 0xea3a << 15 // xvilvh.w
|
||||||
case AXVILVHV:
|
case AXVILVHV:
|
||||||
return 0xea3b << 15 // xvilvh.d
|
return 0xea3b << 15 // xvilvh.d
|
||||||
|
case AVMULB:
|
||||||
|
return 0xe108 << 15 // vmul.b
|
||||||
|
case AVMULH:
|
||||||
|
return 0xe109 << 15 // vmul.h
|
||||||
|
case AVMULW:
|
||||||
|
return 0xe10a << 15 // vmul.w
|
||||||
|
case AVMULV:
|
||||||
|
return 0xe10b << 15 // vmul.d
|
||||||
|
case AVMUHB:
|
||||||
|
return 0xe10c << 15 // vmuh.b
|
||||||
|
case AVMUHH:
|
||||||
|
return 0xe10d << 15 // vmuh.h
|
||||||
|
case AVMUHW:
|
||||||
|
return 0xe10e << 15 // vmuh.w
|
||||||
|
case AVMUHV:
|
||||||
|
return 0xe10f << 15 // vmuh.d
|
||||||
|
case AVMUHBU:
|
||||||
|
return 0xe110 << 15 // vmuh.bu
|
||||||
|
case AVMUHHU:
|
||||||
|
return 0xe111 << 15 // vmuh.hu
|
||||||
|
case AVMUHWU:
|
||||||
|
return 0xe112 << 15 // vmuh.wu
|
||||||
|
case AVMUHVU:
|
||||||
|
return 0xe113 << 15 // vmuh.du
|
||||||
|
case AXVMULB:
|
||||||
|
return 0xe908 << 15 // xvmul.b
|
||||||
|
case AXVMULH:
|
||||||
|
return 0xe909 << 15 // xvmul.h
|
||||||
|
case AXVMULW:
|
||||||
|
return 0xe90a << 15 // xvmul.w
|
||||||
|
case AXVMULV:
|
||||||
|
return 0xe90b << 15 // xvmul.d
|
||||||
|
case AXVMUHB:
|
||||||
|
return 0xe90c << 15 // xvmuh.b
|
||||||
|
case AXVMUHH:
|
||||||
|
return 0xe90d << 15 // xvmuh.h
|
||||||
|
case AXVMUHW:
|
||||||
|
return 0xe90e << 15 // xvmuh.w
|
||||||
|
case AXVMUHV:
|
||||||
|
return 0xe90f << 15 // xvmuh.d
|
||||||
|
case AXVMUHBU:
|
||||||
|
return 0xe910 << 15 // xvmuh.bu
|
||||||
|
case AXVMUHHU:
|
||||||
|
return 0xe911 << 15 // xvmuh.hu
|
||||||
|
case AXVMUHWU:
|
||||||
|
return 0xe912 << 15 // xvmuh.wu
|
||||||
|
case AXVMUHVU:
|
||||||
|
return 0xe913 << 15 // xvmuh.du
|
||||||
}
|
}
|
||||||
|
|
||||||
if a < 0 {
|
if a < 0 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue