mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/obj/loong64: add {,X}VS{ADD,SUB}.{B/H/W/V}{,U} instructions support
Go asm syntax:
VSADD{B,H,W,V} V1, V2, V3
VSADD{B,H,W,V}U V1, V2, V3
VSSUB{B,H,W,V} V1, V2, V3
VSSUB{B,H,W,V}U V1, V2, V3
XVSADD{B,H,W,V} X1, X2, X3
XVSADD{B,H,W,V}U X1, X2, X3
XVSSUB{B,H,W,V} X1, X2, X3
XVSSUB{B,H,W,V}U X1, X2, X3
Equivalent platform assembler syntax:
vsadd.{b,h,w,d} v3, v2, v1
vsadd.{b,h,w,d}u v3, v2, v1
vssub.{b,h,w,d} v3, v2, v1
vssub.{b,h,w,d}u v3, v2, v1
xvsadd.{b,h,w,d} x3, x2, x1
xvsadd.{b,h,w,d}u x3, x2, x1
xvssub.{b,h,w,d} x3, x2, x1
xvssub.{b,h,w,d}u x3, x2, x1
Change-Id: Iab8c1a9bdc4940598936f3beac846466e913ffa2
Reviewed-on: https://go-review.googlesource.com/c/go/+/719200
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn>
Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
parent
0929d21978
commit
abb241a789
4 changed files with 196 additions and 0 deletions
36
src/cmd/asm/internal/asm/testdata/loong64enc1.s
vendored
36
src/cmd/asm/internal/asm/testdata/loong64enc1.s
vendored
|
|
@ -843,6 +843,42 @@ lable2:
|
||||||
XVSUBWU $15, X1, X2 // 223c8d76
|
XVSUBWU $15, X1, X2 // 223c8d76
|
||||||
XVSUBVU $16, X1, X2 // 22c08d76
|
XVSUBVU $16, X1, X2 // 22c08d76
|
||||||
|
|
||||||
|
// [X]VSADD{B,H,W,V}, [X]VSSUB{B,H,W,V} instructions
|
||||||
|
VSADDB V1, V2, V3 // 43044670
|
||||||
|
VSADDH V1, V2, V3 // 43844670
|
||||||
|
VSADDW V1, V2, V3 // 43044770
|
||||||
|
VSADDV V1, V2, V3 // 43844770
|
||||||
|
VSSUBB V1, V2, V3 // 43044870
|
||||||
|
VSSUBH V1, V2, V3 // 43844870
|
||||||
|
VSSUBW V1, V2, V3 // 43044970
|
||||||
|
VSSUBV V1, V2, V3 // 43844970
|
||||||
|
XVSADDB X3, X2, X1 // 410c4674
|
||||||
|
XVSADDH X3, X2, X1 // 418c4674
|
||||||
|
XVSADDW X3, X2, X1 // 410c4774
|
||||||
|
XVSADDV X3, X2, X1 // 418c4774
|
||||||
|
XVSSUBB X3, X2, X1 // 410c4874
|
||||||
|
XVSSUBH X3, X2, X1 // 418c4874
|
||||||
|
XVSSUBW X3, X2, X1 // 410c4974
|
||||||
|
XVSSUBV X3, X2, X1 // 418c4974
|
||||||
|
|
||||||
|
// [X]VSADD{B,H,W,V}U, [X]VSSUB{B,H,W,V}U instructions
|
||||||
|
VSADDBU V1, V2, V3 // 43044a70
|
||||||
|
VSADDHU V1, V2, V3 // 43844a70
|
||||||
|
VSADDWU V1, V2, V3 // 43044b70
|
||||||
|
VSADDVU V1, V2, V3 // 43844b70
|
||||||
|
VSSUBBU V1, V2, V3 // 43044c70
|
||||||
|
VSSUBHU V1, V2, V3 // 43844c70
|
||||||
|
VSSUBWU V1, V2, V3 // 43044d70
|
||||||
|
VSSUBVU V1, V2, V3 // 43844d70
|
||||||
|
XVSADDBU X1, X2, X3 // 43044a74
|
||||||
|
XVSADDHU X1, X2, X3 // 43044b74
|
||||||
|
XVSADDWU X1, X2, X3 // 43044b74
|
||||||
|
XVSADDVU X1, X2, X3 // 43844b74
|
||||||
|
XVSSUBBU X1, X2, X3 // 43044c74
|
||||||
|
XVSSUBHU X1, X2, X3 // 43844c74
|
||||||
|
XVSSUBWU X1, X2, X3 // 43044d74
|
||||||
|
XVSSUBVU X1, X2, X3 // 43844d74
|
||||||
|
|
||||||
// [X]VILV{L/H}{B,H,W,V} instructions
|
// [X]VILV{L/H}{B,H,W,V} instructions
|
||||||
VILVLB V1, V2, V3 // 43041a71
|
VILVLB V1, V2, V3 // 43041a71
|
||||||
VILVLH V1, V2, V3 // 43841a71
|
VILVLH V1, V2, V3 // 43841a71
|
||||||
|
|
|
||||||
|
|
@ -809,6 +809,38 @@ const (
|
||||||
AXVSUBHU
|
AXVSUBHU
|
||||||
AXVSUBWU
|
AXVSUBWU
|
||||||
AXVSUBVU
|
AXVSUBVU
|
||||||
|
AVSADDB
|
||||||
|
AVSADDH
|
||||||
|
AVSADDW
|
||||||
|
AVSADDV
|
||||||
|
AVSSUBB
|
||||||
|
AVSSUBH
|
||||||
|
AVSSUBW
|
||||||
|
AVSSUBV
|
||||||
|
AVSADDBU
|
||||||
|
AVSADDHU
|
||||||
|
AVSADDWU
|
||||||
|
AVSADDVU
|
||||||
|
AVSSUBBU
|
||||||
|
AVSSUBHU
|
||||||
|
AVSSUBWU
|
||||||
|
AVSSUBVU
|
||||||
|
AXVSADDB
|
||||||
|
AXVSADDH
|
||||||
|
AXVSADDW
|
||||||
|
AXVSADDV
|
||||||
|
AXVSSUBB
|
||||||
|
AXVSSUBH
|
||||||
|
AXVSSUBW
|
||||||
|
AXVSSUBV
|
||||||
|
AXVSADDBU
|
||||||
|
AXVSADDHU
|
||||||
|
AXVSADDWU
|
||||||
|
AXVSADDVU
|
||||||
|
AXVSSUBBU
|
||||||
|
AXVSSUBHU
|
||||||
|
AXVSSUBWU
|
||||||
|
AXVSSUBVU
|
||||||
|
|
||||||
// LSX and LASX Bit-manipulation Instructions
|
// LSX and LASX Bit-manipulation Instructions
|
||||||
AVANDB
|
AVANDB
|
||||||
|
|
|
||||||
|
|
@ -306,6 +306,38 @@ var Anames = []string{
|
||||||
"XVSUBHU",
|
"XVSUBHU",
|
||||||
"XVSUBWU",
|
"XVSUBWU",
|
||||||
"XVSUBVU",
|
"XVSUBVU",
|
||||||
|
"VSADDB",
|
||||||
|
"VSADDH",
|
||||||
|
"VSADDW",
|
||||||
|
"VSADDV",
|
||||||
|
"VSSUBB",
|
||||||
|
"VSSUBH",
|
||||||
|
"VSSUBW",
|
||||||
|
"VSSUBV",
|
||||||
|
"VSADDBU",
|
||||||
|
"VSADDHU",
|
||||||
|
"VSADDWU",
|
||||||
|
"VSADDVU",
|
||||||
|
"VSSUBBU",
|
||||||
|
"VSSUBHU",
|
||||||
|
"VSSUBWU",
|
||||||
|
"VSSUBVU",
|
||||||
|
"XVSADDB",
|
||||||
|
"XVSADDH",
|
||||||
|
"XVSADDW",
|
||||||
|
"XVSADDV",
|
||||||
|
"XVSSUBB",
|
||||||
|
"XVSSUBH",
|
||||||
|
"XVSSUBW",
|
||||||
|
"XVSSUBV",
|
||||||
|
"XVSADDBU",
|
||||||
|
"XVSADDHU",
|
||||||
|
"XVSADDWU",
|
||||||
|
"XVSADDVU",
|
||||||
|
"XVSSUBBU",
|
||||||
|
"XVSSUBHU",
|
||||||
|
"XVSSUBWU",
|
||||||
|
"XVSSUBVU",
|
||||||
"VANDB",
|
"VANDB",
|
||||||
"VORB",
|
"VORB",
|
||||||
"VXORB",
|
"VXORB",
|
||||||
|
|
|
||||||
|
|
@ -1890,6 +1890,22 @@ func buildop(ctxt *obj.Link) {
|
||||||
opset(AVSUBW, r0)
|
opset(AVSUBW, r0)
|
||||||
opset(AVSUBV, r0)
|
opset(AVSUBV, r0)
|
||||||
opset(AVSUBQ, r0)
|
opset(AVSUBQ, r0)
|
||||||
|
opset(AVSADDB, r0)
|
||||||
|
opset(AVSADDH, r0)
|
||||||
|
opset(AVSADDW, r0)
|
||||||
|
opset(AVSADDV, r0)
|
||||||
|
opset(AVSSUBB, r0)
|
||||||
|
opset(AVSSUBH, r0)
|
||||||
|
opset(AVSSUBW, r0)
|
||||||
|
opset(AVSSUBV, r0)
|
||||||
|
opset(AVSADDBU, r0)
|
||||||
|
opset(AVSADDHU, r0)
|
||||||
|
opset(AVSADDWU, r0)
|
||||||
|
opset(AVSADDVU, r0)
|
||||||
|
opset(AVSSUBBU, r0)
|
||||||
|
opset(AVSSUBHU, r0)
|
||||||
|
opset(AVSSUBWU, r0)
|
||||||
|
opset(AVSSUBVU, r0)
|
||||||
|
|
||||||
case AXVADDB:
|
case AXVADDB:
|
||||||
opset(AXVADDH, r0)
|
opset(AXVADDH, r0)
|
||||||
|
|
@ -1901,6 +1917,22 @@ func buildop(ctxt *obj.Link) {
|
||||||
opset(AXVSUBW, r0)
|
opset(AXVSUBW, r0)
|
||||||
opset(AXVSUBV, r0)
|
opset(AXVSUBV, r0)
|
||||||
opset(AXVSUBQ, r0)
|
opset(AXVSUBQ, r0)
|
||||||
|
opset(AXVSADDB, r0)
|
||||||
|
opset(AXVSADDH, r0)
|
||||||
|
opset(AXVSADDW, r0)
|
||||||
|
opset(AXVSADDV, r0)
|
||||||
|
opset(AXVSSUBB, r0)
|
||||||
|
opset(AXVSSUBH, r0)
|
||||||
|
opset(AXVSSUBW, r0)
|
||||||
|
opset(AXVSSUBV, r0)
|
||||||
|
opset(AXVSADDBU, r0)
|
||||||
|
opset(AXVSADDHU, r0)
|
||||||
|
opset(AXVSADDWU, r0)
|
||||||
|
opset(AXVSADDVU, r0)
|
||||||
|
opset(AXVSSUBBU, r0)
|
||||||
|
opset(AXVSSUBHU, r0)
|
||||||
|
opset(AXVSSUBWU, r0)
|
||||||
|
opset(AXVSSUBVU, r0)
|
||||||
|
|
||||||
case AVSLLB:
|
case AVSLLB:
|
||||||
opset(AVSRLB, r0)
|
opset(AVSRLB, r0)
|
||||||
|
|
@ -3629,6 +3661,70 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
|
||||||
return 0xe81b << 15 // xvsub.d
|
return 0xe81b << 15 // xvsub.d
|
||||||
case AXVSUBQ:
|
case AXVSUBQ:
|
||||||
return 0xea5b << 15 // xvsub.q
|
return 0xea5b << 15 // xvsub.q
|
||||||
|
case AVSADDB:
|
||||||
|
return 0x0E08C << 15 // vsadd.b
|
||||||
|
case AVSADDH:
|
||||||
|
return 0x0E08D << 15 // vsadd.h
|
||||||
|
case AVSADDW:
|
||||||
|
return 0x0E08E << 15 // vsadd.w
|
||||||
|
case AVSADDV:
|
||||||
|
return 0x0E08F << 15 // vsadd.d
|
||||||
|
case AVSSUBB:
|
||||||
|
return 0x0E090 << 15 // vssub.b
|
||||||
|
case AVSSUBH:
|
||||||
|
return 0x0E091 << 15 // vssub.w
|
||||||
|
case AVSSUBW:
|
||||||
|
return 0x0E092 << 15 // vssub.h
|
||||||
|
case AVSSUBV:
|
||||||
|
return 0x0E093 << 15 // vssub.d
|
||||||
|
case AVSADDBU:
|
||||||
|
return 0x0E094 << 15 // vsadd.bu
|
||||||
|
case AVSADDHU:
|
||||||
|
return 0x0E095 << 15 // vsadd.hu
|
||||||
|
case AVSADDWU:
|
||||||
|
return 0x0E096 << 15 // vsadd.wu
|
||||||
|
case AVSADDVU:
|
||||||
|
return 0x0E097 << 15 // vsadd.du
|
||||||
|
case AVSSUBBU:
|
||||||
|
return 0x0E098 << 15 // vssub.bu
|
||||||
|
case AVSSUBHU:
|
||||||
|
return 0x0E099 << 15 // vssub.wu
|
||||||
|
case AVSSUBWU:
|
||||||
|
return 0x0E09A << 15 // vssub.hu
|
||||||
|
case AVSSUBVU:
|
||||||
|
return 0x0E09B << 15 // vssub.du
|
||||||
|
case AXVSADDB:
|
||||||
|
return 0x0E88C << 15 // vxsadd.b
|
||||||
|
case AXVSADDH:
|
||||||
|
return 0x0E88D << 15 // vxsadd.h
|
||||||
|
case AXVSADDW:
|
||||||
|
return 0x0E88E << 15 // vxsadd.w
|
||||||
|
case AXVSADDV:
|
||||||
|
return 0x0E88F << 15 // vxsadd.d
|
||||||
|
case AXVSSUBB:
|
||||||
|
return 0x0E890 << 15 // xvssub.b
|
||||||
|
case AXVSSUBH:
|
||||||
|
return 0x0E891 << 15 // xvssub.h
|
||||||
|
case AXVSSUBW:
|
||||||
|
return 0x0E892 << 15 // xvssub.w
|
||||||
|
case AXVSSUBV:
|
||||||
|
return 0x0E893 << 15 // xvssub.d
|
||||||
|
case AXVSADDBU:
|
||||||
|
return 0x0E894 << 15 // vxsadd.bu
|
||||||
|
case AXVSADDHU:
|
||||||
|
return 0x0E896 << 15 // vxsadd.hu
|
||||||
|
case AXVSADDWU:
|
||||||
|
return 0x0E896 << 15 // vxsadd.wu
|
||||||
|
case AXVSADDVU:
|
||||||
|
return 0x0E897 << 15 // vxsadd.du
|
||||||
|
case AXVSSUBBU:
|
||||||
|
return 0x0E898 << 15 // xvssub.bu
|
||||||
|
case AXVSSUBHU:
|
||||||
|
return 0x0E899 << 15 // xvssub.hu
|
||||||
|
case AXVSSUBWU:
|
||||||
|
return 0x0E89A << 15 // xvssub.wu
|
||||||
|
case AXVSSUBVU:
|
||||||
|
return 0x0E89B << 15 // xvssub.du
|
||||||
case AVILVLB:
|
case AVILVLB:
|
||||||
return 0xe234 << 15 // vilvl.b
|
return 0xe234 << 15 // vilvl.b
|
||||||
case AVILVLH:
|
case AVILVLH:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue