Skip to content

Commit abb241a

Browse files
committed
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 <[email protected]> Reviewed-by: Meidan Li <[email protected]> Reviewed-by: Junyang Shao <[email protected]> Reviewed-by: sophie zhao <[email protected]> Reviewed-by: Michael Pratt <[email protected]>
1 parent 0929d21 commit abb241a

File tree

4 files changed

+196
-0
lines changed

4 files changed

+196
-0
lines changed

src/cmd/asm/internal/asm/testdata/loong64enc1.s

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,42 @@ lable2:
843843
XVSUBWU $15, X1, X2 // 223c8d76
844844
XVSUBVU $16, X1, X2 // 22c08d76
845845

846+
// [X]VSADD{B,H,W,V}, [X]VSSUB{B,H,W,V} instructions
847+
VSADDB V1, V2, V3 // 43044670
848+
VSADDH V1, V2, V3 // 43844670
849+
VSADDW V1, V2, V3 // 43044770
850+
VSADDV V1, V2, V3 // 43844770
851+
VSSUBB V1, V2, V3 // 43044870
852+
VSSUBH V1, V2, V3 // 43844870
853+
VSSUBW V1, V2, V3 // 43044970
854+
VSSUBV V1, V2, V3 // 43844970
855+
XVSADDB X3, X2, X1 // 410c4674
856+
XVSADDH X3, X2, X1 // 418c4674
857+
XVSADDW X3, X2, X1 // 410c4774
858+
XVSADDV X3, X2, X1 // 418c4774
859+
XVSSUBB X3, X2, X1 // 410c4874
860+
XVSSUBH X3, X2, X1 // 418c4874
861+
XVSSUBW X3, X2, X1 // 410c4974
862+
XVSSUBV X3, X2, X1 // 418c4974
863+
864+
// [X]VSADD{B,H,W,V}U, [X]VSSUB{B,H,W,V}U instructions
865+
VSADDBU V1, V2, V3 // 43044a70
866+
VSADDHU V1, V2, V3 // 43844a70
867+
VSADDWU V1, V2, V3 // 43044b70
868+
VSADDVU V1, V2, V3 // 43844b70
869+
VSSUBBU V1, V2, V3 // 43044c70
870+
VSSUBHU V1, V2, V3 // 43844c70
871+
VSSUBWU V1, V2, V3 // 43044d70
872+
VSSUBVU V1, V2, V3 // 43844d70
873+
XVSADDBU X1, X2, X3 // 43044a74
874+
XVSADDHU X1, X2, X3 // 43044b74
875+
XVSADDWU X1, X2, X3 // 43044b74
876+
XVSADDVU X1, X2, X3 // 43844b74
877+
XVSSUBBU X1, X2, X3 // 43044c74
878+
XVSSUBHU X1, X2, X3 // 43844c74
879+
XVSSUBWU X1, X2, X3 // 43044d74
880+
XVSSUBVU X1, X2, X3 // 43844d74
881+
846882
// [X]VILV{L/H}{B,H,W,V} instructions
847883
VILVLB V1, V2, V3 // 43041a71
848884
VILVLH V1, V2, V3 // 43841a71

src/cmd/internal/obj/loong64/a.out.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,38 @@ const (
809809
AXVSUBHU
810810
AXVSUBWU
811811
AXVSUBVU
812+
AVSADDB
813+
AVSADDH
814+
AVSADDW
815+
AVSADDV
816+
AVSSUBB
817+
AVSSUBH
818+
AVSSUBW
819+
AVSSUBV
820+
AVSADDBU
821+
AVSADDHU
822+
AVSADDWU
823+
AVSADDVU
824+
AVSSUBBU
825+
AVSSUBHU
826+
AVSSUBWU
827+
AVSSUBVU
828+
AXVSADDB
829+
AXVSADDH
830+
AXVSADDW
831+
AXVSADDV
832+
AXVSSUBB
833+
AXVSSUBH
834+
AXVSSUBW
835+
AXVSSUBV
836+
AXVSADDBU
837+
AXVSADDHU
838+
AXVSADDWU
839+
AXVSADDVU
840+
AXVSSUBBU
841+
AXVSSUBHU
842+
AXVSSUBWU
843+
AXVSSUBVU
812844

813845
// LSX and LASX Bit-manipulation Instructions
814846
AVANDB

src/cmd/internal/obj/loong64/anames.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cmd/internal/obj/loong64/asm.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,6 +1890,22 @@ func buildop(ctxt *obj.Link) {
18901890
opset(AVSUBW, r0)
18911891
opset(AVSUBV, r0)
18921892
opset(AVSUBQ, r0)
1893+
opset(AVSADDB, r0)
1894+
opset(AVSADDH, r0)
1895+
opset(AVSADDW, r0)
1896+
opset(AVSADDV, r0)
1897+
opset(AVSSUBB, r0)
1898+
opset(AVSSUBH, r0)
1899+
opset(AVSSUBW, r0)
1900+
opset(AVSSUBV, r0)
1901+
opset(AVSADDBU, r0)
1902+
opset(AVSADDHU, r0)
1903+
opset(AVSADDWU, r0)
1904+
opset(AVSADDVU, r0)
1905+
opset(AVSSUBBU, r0)
1906+
opset(AVSSUBHU, r0)
1907+
opset(AVSSUBWU, r0)
1908+
opset(AVSSUBVU, r0)
18931909

18941910
case AXVADDB:
18951911
opset(AXVADDH, r0)
@@ -1901,6 +1917,22 @@ func buildop(ctxt *obj.Link) {
19011917
opset(AXVSUBW, r0)
19021918
opset(AXVSUBV, r0)
19031919
opset(AXVSUBQ, r0)
1920+
opset(AXVSADDB, r0)
1921+
opset(AXVSADDH, r0)
1922+
opset(AXVSADDW, r0)
1923+
opset(AXVSADDV, r0)
1924+
opset(AXVSSUBB, r0)
1925+
opset(AXVSSUBH, r0)
1926+
opset(AXVSSUBW, r0)
1927+
opset(AXVSSUBV, r0)
1928+
opset(AXVSADDBU, r0)
1929+
opset(AXVSADDHU, r0)
1930+
opset(AXVSADDWU, r0)
1931+
opset(AXVSADDVU, r0)
1932+
opset(AXVSSUBBU, r0)
1933+
opset(AXVSSUBHU, r0)
1934+
opset(AXVSSUBWU, r0)
1935+
opset(AXVSSUBVU, r0)
19041936

19051937
case AVSLLB:
19061938
opset(AVSRLB, r0)
@@ -3629,6 +3661,70 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
36293661
return 0xe81b << 15 // xvsub.d
36303662
case AXVSUBQ:
36313663
return 0xea5b << 15 // xvsub.q
3664+
case AVSADDB:
3665+
return 0x0E08C << 15 // vsadd.b
3666+
case AVSADDH:
3667+
return 0x0E08D << 15 // vsadd.h
3668+
case AVSADDW:
3669+
return 0x0E08E << 15 // vsadd.w
3670+
case AVSADDV:
3671+
return 0x0E08F << 15 // vsadd.d
3672+
case AVSSUBB:
3673+
return 0x0E090 << 15 // vssub.b
3674+
case AVSSUBH:
3675+
return 0x0E091 << 15 // vssub.w
3676+
case AVSSUBW:
3677+
return 0x0E092 << 15 // vssub.h
3678+
case AVSSUBV:
3679+
return 0x0E093 << 15 // vssub.d
3680+
case AVSADDBU:
3681+
return 0x0E094 << 15 // vsadd.bu
3682+
case AVSADDHU:
3683+
return 0x0E095 << 15 // vsadd.hu
3684+
case AVSADDWU:
3685+
return 0x0E096 << 15 // vsadd.wu
3686+
case AVSADDVU:
3687+
return 0x0E097 << 15 // vsadd.du
3688+
case AVSSUBBU:
3689+
return 0x0E098 << 15 // vssub.bu
3690+
case AVSSUBHU:
3691+
return 0x0E099 << 15 // vssub.wu
3692+
case AVSSUBWU:
3693+
return 0x0E09A << 15 // vssub.hu
3694+
case AVSSUBVU:
3695+
return 0x0E09B << 15 // vssub.du
3696+
case AXVSADDB:
3697+
return 0x0E88C << 15 // vxsadd.b
3698+
case AXVSADDH:
3699+
return 0x0E88D << 15 // vxsadd.h
3700+
case AXVSADDW:
3701+
return 0x0E88E << 15 // vxsadd.w
3702+
case AXVSADDV:
3703+
return 0x0E88F << 15 // vxsadd.d
3704+
case AXVSSUBB:
3705+
return 0x0E890 << 15 // xvssub.b
3706+
case AXVSSUBH:
3707+
return 0x0E891 << 15 // xvssub.h
3708+
case AXVSSUBW:
3709+
return 0x0E892 << 15 // xvssub.w
3710+
case AXVSSUBV:
3711+
return 0x0E893 << 15 // xvssub.d
3712+
case AXVSADDBU:
3713+
return 0x0E894 << 15 // vxsadd.bu
3714+
case AXVSADDHU:
3715+
return 0x0E896 << 15 // vxsadd.hu
3716+
case AXVSADDWU:
3717+
return 0x0E896 << 15 // vxsadd.wu
3718+
case AXVSADDVU:
3719+
return 0x0E897 << 15 // vxsadd.du
3720+
case AXVSSUBBU:
3721+
return 0x0E898 << 15 // xvssub.bu
3722+
case AXVSSUBHU:
3723+
return 0x0E899 << 15 // xvssub.hu
3724+
case AXVSSUBWU:
3725+
return 0x0E89A << 15 // xvssub.wu
3726+
case AXVSSUBVU:
3727+
return 0x0E89B << 15 // xvssub.du
36323728
case AVILVLB:
36333729
return 0xe234 << 15 // vilvl.b
36343730
case AVILVLH:

0 commit comments

Comments
 (0)