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
|
||||
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
|
||||
VILVLB V1, V2, V3 // 43041a71
|
||||
VILVLH V1, V2, V3 // 43841a71
|
||||
|
|
|
|||
|
|
@ -809,6 +809,38 @@ const (
|
|||
AXVSUBHU
|
||||
AXVSUBWU
|
||||
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
|
||||
AVANDB
|
||||
|
|
|
|||
|
|
@ -306,6 +306,38 @@ var Anames = []string{
|
|||
"XVSUBHU",
|
||||
"XVSUBWU",
|
||||
"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",
|
||||
"VORB",
|
||||
"VXORB",
|
||||
|
|
|
|||
|
|
@ -1890,6 +1890,22 @@ func buildop(ctxt *obj.Link) {
|
|||
opset(AVSUBW, r0)
|
||||
opset(AVSUBV, 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:
|
||||
opset(AXVADDH, r0)
|
||||
|
|
@ -1901,6 +1917,22 @@ func buildop(ctxt *obj.Link) {
|
|||
opset(AXVSUBW, r0)
|
||||
opset(AXVSUBV, 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:
|
||||
opset(AVSRLB, r0)
|
||||
|
|
@ -3629,6 +3661,70 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
|
|||
return 0xe81b << 15 // xvsub.d
|
||||
case AXVSUBQ:
|
||||
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:
|
||||
return 0xe234 << 15 // vilvl.b
|
||||
case AVILVLH:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue