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:
Guoqi Chen 2025-11-10 15:57:14 +08:00 committed by abner chenc
parent 0929d21978
commit abb241a789
4 changed files with 196 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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",

View file

@ -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: