diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc1.s b/src/cmd/asm/internal/asm/testdata/loong64enc1.s index 2eb3156e454..c820a0a5a10 100644 --- a/src/cmd/asm/internal/asm/testdata/loong64enc1.s +++ b/src/cmd/asm/internal/asm/testdata/loong64enc1.s @@ -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 diff --git a/src/cmd/internal/obj/loong64/a.out.go b/src/cmd/internal/obj/loong64/a.out.go index 6bf20683344..73f145df146 100644 --- a/src/cmd/internal/obj/loong64/a.out.go +++ b/src/cmd/internal/obj/loong64/a.out.go @@ -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 diff --git a/src/cmd/internal/obj/loong64/anames.go b/src/cmd/internal/obj/loong64/anames.go index 0e00cb887f6..ab85c52a21b 100644 --- a/src/cmd/internal/obj/loong64/anames.go +++ b/src/cmd/internal/obj/loong64/anames.go @@ -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", diff --git a/src/cmd/internal/obj/loong64/asm.go b/src/cmd/internal/obj/loong64/asm.go index 53cea8d37c2..38b075d77e7 100644 --- a/src/cmd/internal/obj/loong64/asm.go +++ b/src/cmd/internal/obj/loong64/asm.go @@ -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: