aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal
diff options
context:
space:
mode:
authorGuoqi Chen <chenguoqi@loongson.cn>2025-11-24 12:56:15 +0800
committerabner chenc <chenguoqi@loongson.cn>2025-11-25 16:50:48 -0800
commita9093067ee0fda40421bd1d4fad893dfa6c99fd5 (patch)
tree0deff53449c0b39c7714bfb5c90d940d4c3a6d85 /src/cmd/internal
parent7b904c25a27a1a2d33436826790459bc6dbbdb4a (diff)
downloadgo-a9093067ee0fda40421bd1d4fad893dfa6c99fd5.tar.xz
cmd/internal/obj/loong64: add {,X}V{ADD,SUB}W{EV,OD}.{H.B,W.H,D.W,Q.D}{,U} instructions support
Go asm syntax: VADDWEV{HB, WH, VW, QV}{,U} V1, V2, V3 VSUBWEV{HB, WH, VW, QV}{,U} V1, V2, V3 VADDWOD{HB, WH, VW, QV}{,U} V1, V2, V3 VSUBWOD{HB, WH, VW, QV}{,U} V1, V2, V3 XVADDWEV{HB, WH, VW, QV}{,U} X1, X2, X3 XVSUBWEV{HB, WH, VW, QV}{,U} X1, X2, X3 XVADDWOD{HB, WH, VW, QV}{,U} X1, X2, X3 XVSUBWOD{HB, WH, VW, QV}{,U} X1, X2, X3 Equivalent platform assembler syntax: vaddwev.{h.b, w.h, d.w, q.d}{,u} V3, V2, V1 vsubwev.{h.b, w.h, d.w, q.d}{,u} V3, V2, V1 vaddwod.{h.b, w.h, d.w, q.d}{,u} V3, V2, V1 vsubwod.{h.b, w.h, d.w, q.d}{,u} V3, V2, V1 xvaddwev.{h.b, w.h, d.w, q.d}{,u} X3, X2, X1 xvsubwev.{h.b, w.h, d.w, q.d}{,u} X3, X2, X1 xvaddwod.{h.b, w.h, d.w, q.d}{,u} X3, X2, X1 xvsubwod.{h.b, w.h, d.w, q.d}{,u} X3, X2, X1 Change-Id: I407dc65b32b89844fd303e265a99d8aafdf922ec Reviewed-on: https://go-review.googlesource.com/c/go/+/723620 Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Meidan Li <limeidan@loongson.cn> Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Mark Freeman <markfreeman@google.com>
Diffstat (limited to 'src/cmd/internal')
-rw-r--r--src/cmd/internal/obj/loong64/a.out.go65
-rw-r--r--src/cmd/internal/obj/loong64/anames.go64
-rw-r--r--src/cmd/internal/obj/loong64/asm.go192
3 files changed, 321 insertions, 0 deletions
diff --git a/src/cmd/internal/obj/loong64/a.out.go b/src/cmd/internal/obj/loong64/a.out.go
index 2eabe9bda8..96f0889199 100644
--- a/src/cmd/internal/obj/loong64/a.out.go
+++ b/src/cmd/internal/obj/loong64/a.out.go
@@ -1159,6 +1159,71 @@ const (
AXVMULWODVWUW
AXVMULWODQVUV
+ AVADDWEVHB
+ AVADDWEVWH
+ AVADDWEVVW
+ AVADDWEVQV
+ AVSUBWEVHB
+ AVSUBWEVWH
+ AVSUBWEVVW
+ AVSUBWEVQV
+ AVADDWODHB
+ AVADDWODWH
+ AVADDWODVW
+ AVADDWODQV
+ AVSUBWODHB
+ AVSUBWODWH
+ AVSUBWODVW
+ AVSUBWODQV
+ AXVADDWEVHB
+ AXVADDWEVWH
+ AXVADDWEVVW
+ AXVADDWEVQV
+ AXVSUBWEVHB
+ AXVSUBWEVWH
+ AXVSUBWEVVW
+ AXVSUBWEVQV
+ AXVADDWODHB
+ AXVADDWODWH
+ AXVADDWODVW
+ AXVADDWODQV
+ AXVSUBWODHB
+ AXVSUBWODWH
+ AXVSUBWODVW
+ AXVSUBWODQV
+ AVADDWEVHBU
+ AVADDWEVWHU
+ AVADDWEVVWU
+ AVADDWEVQVU
+ AVSUBWEVHBU
+ AVSUBWEVWHU
+ AVSUBWEVVWU
+ AVSUBWEVQVU
+ AVADDWODHBU
+ AVADDWODWHU
+ AVADDWODVWU
+ AVADDWODQVU
+ AVSUBWODHBU
+ AVSUBWODWHU
+ AVSUBWODVWU
+ AVSUBWODQVU
+ AXVADDWEVHBU
+ AXVADDWEVWHU
+ AXVADDWEVVWU
+ AXVADDWEVQVU
+ AXVSUBWEVHBU
+ AXVSUBWEVWHU
+ AXVSUBWEVVWU
+ AXVSUBWEVQVU
+ AXVADDWODHBU
+ AXVADDWODWHU
+ AXVADDWODVWU
+ AXVADDWODQVU
+ AXVSUBWODHBU
+ AXVSUBWODWHU
+ AXVSUBWODVWU
+ AXVSUBWODQVU
+
AVSHUF4IB
AVSHUF4IH
AVSHUF4IW
diff --git a/src/cmd/internal/obj/loong64/anames.go b/src/cmd/internal/obj/loong64/anames.go
index 92e3cab950..0ee911401f 100644
--- a/src/cmd/internal/obj/loong64/anames.go
+++ b/src/cmd/internal/obj/loong64/anames.go
@@ -628,6 +628,70 @@ var Anames = []string{
"XVMULWODWHUH",
"XVMULWODVWUW",
"XVMULWODQVUV",
+ "VADDWEVHB",
+ "VADDWEVWH",
+ "VADDWEVVW",
+ "VADDWEVQV",
+ "VSUBWEVHB",
+ "VSUBWEVWH",
+ "VSUBWEVVW",
+ "VSUBWEVQV",
+ "VADDWODHB",
+ "VADDWODWH",
+ "VADDWODVW",
+ "VADDWODQV",
+ "VSUBWODHB",
+ "VSUBWODWH",
+ "VSUBWODVW",
+ "VSUBWODQV",
+ "XVADDWEVHB",
+ "XVADDWEVWH",
+ "XVADDWEVVW",
+ "XVADDWEVQV",
+ "XVSUBWEVHB",
+ "XVSUBWEVWH",
+ "XVSUBWEVVW",
+ "XVSUBWEVQV",
+ "XVADDWODHB",
+ "XVADDWODWH",
+ "XVADDWODVW",
+ "XVADDWODQV",
+ "XVSUBWODHB",
+ "XVSUBWODWH",
+ "XVSUBWODVW",
+ "XVSUBWODQV",
+ "VADDWEVHBU",
+ "VADDWEVWHU",
+ "VADDWEVVWU",
+ "VADDWEVQVU",
+ "VSUBWEVHBU",
+ "VSUBWEVWHU",
+ "VSUBWEVVWU",
+ "VSUBWEVQVU",
+ "VADDWODHBU",
+ "VADDWODWHU",
+ "VADDWODVWU",
+ "VADDWODQVU",
+ "VSUBWODHBU",
+ "VSUBWODWHU",
+ "VSUBWODVWU",
+ "VSUBWODQVU",
+ "XVADDWEVHBU",
+ "XVADDWEVWHU",
+ "XVADDWEVVWU",
+ "XVADDWEVQVU",
+ "XVSUBWEVHBU",
+ "XVSUBWEVWHU",
+ "XVSUBWEVVWU",
+ "XVSUBWEVQVU",
+ "XVADDWODHBU",
+ "XVADDWODWHU",
+ "XVADDWODVWU",
+ "XVADDWODQVU",
+ "XVSUBWODHBU",
+ "XVSUBWODWHU",
+ "XVSUBWODVWU",
+ "XVSUBWODQVU",
"VSHUF4IB",
"VSHUF4IH",
"VSHUF4IW",
diff --git a/src/cmd/internal/obj/loong64/asm.go b/src/cmd/internal/obj/loong64/asm.go
index 857ef31ca3..9aff344931 100644
--- a/src/cmd/internal/obj/loong64/asm.go
+++ b/src/cmd/internal/obj/loong64/asm.go
@@ -1791,6 +1791,38 @@ func buildop(ctxt *obj.Link) {
opset(AVSLTHU, r0)
opset(AVSLTWU, r0)
opset(AVSLTVU, r0)
+ opset(AVADDWEVHB, r0)
+ opset(AVADDWEVWH, r0)
+ opset(AVADDWEVVW, r0)
+ opset(AVADDWEVQV, r0)
+ opset(AVSUBWEVHB, r0)
+ opset(AVSUBWEVWH, r0)
+ opset(AVSUBWEVVW, r0)
+ opset(AVSUBWEVQV, r0)
+ opset(AVADDWODHB, r0)
+ opset(AVADDWODWH, r0)
+ opset(AVADDWODVW, r0)
+ opset(AVADDWODQV, r0)
+ opset(AVSUBWODHB, r0)
+ opset(AVSUBWODWH, r0)
+ opset(AVSUBWODVW, r0)
+ opset(AVSUBWODQV, r0)
+ opset(AVADDWEVHBU, r0)
+ opset(AVADDWEVWHU, r0)
+ opset(AVADDWEVVWU, r0)
+ opset(AVADDWEVQVU, r0)
+ opset(AVSUBWEVHBU, r0)
+ opset(AVSUBWEVWHU, r0)
+ opset(AVSUBWEVVWU, r0)
+ opset(AVSUBWEVQVU, r0)
+ opset(AVADDWODHBU, r0)
+ opset(AVADDWODWHU, r0)
+ opset(AVADDWODVWU, r0)
+ opset(AVADDWODQVU, r0)
+ opset(AVSUBWODHBU, r0)
+ opset(AVSUBWODWHU, r0)
+ opset(AVSUBWODVWU, r0)
+ opset(AVSUBWODQVU, r0)
case AXVSLTB:
opset(AXVSLTH, r0)
@@ -1800,6 +1832,38 @@ func buildop(ctxt *obj.Link) {
opset(AXVSLTHU, r0)
opset(AXVSLTWU, r0)
opset(AXVSLTVU, r0)
+ opset(AXVADDWEVHB, r0)
+ opset(AXVADDWEVWH, r0)
+ opset(AXVADDWEVVW, r0)
+ opset(AXVADDWEVQV, r0)
+ opset(AXVSUBWEVHB, r0)
+ opset(AXVSUBWEVWH, r0)
+ opset(AXVSUBWEVVW, r0)
+ opset(AXVSUBWEVQV, r0)
+ opset(AXVADDWODHB, r0)
+ opset(AXVADDWODWH, r0)
+ opset(AXVADDWODVW, r0)
+ opset(AXVADDWODQV, r0)
+ opset(AXVSUBWODHB, r0)
+ opset(AXVSUBWODWH, r0)
+ opset(AXVSUBWODVW, r0)
+ opset(AXVSUBWODQV, r0)
+ opset(AXVADDWEVHBU, r0)
+ opset(AXVADDWEVWHU, r0)
+ opset(AXVADDWEVVWU, r0)
+ opset(AXVADDWEVQVU, r0)
+ opset(AXVSUBWEVHBU, r0)
+ opset(AXVSUBWEVWHU, r0)
+ opset(AXVSUBWEVVWU, r0)
+ opset(AXVSUBWEVQVU, r0)
+ opset(AXVADDWODHBU, r0)
+ opset(AXVADDWODWHU, r0)
+ opset(AXVADDWODVWU, r0)
+ opset(AXVADDWODQVU, r0)
+ opset(AXVSUBWODHBU, r0)
+ opset(AXVSUBWODWHU, r0)
+ opset(AXVSUBWODVWU, r0)
+ opset(AXVSUBWODQVU, r0)
case AVANDB:
opset(AVORB, r0)
@@ -3612,6 +3676,134 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
return 0xe946 << 15 // xvmulwod.d.wu.w
case AXVMULWODQVUV:
return 0xe947 << 15 // xvmulwod.q.du.d
+ case AVADDWEVHB:
+ return 0x0E03C << 15 // vaddwev.h.b
+ case AVADDWEVWH:
+ return 0x0E03D << 15 // vaddwev.w.h
+ case AVADDWEVVW:
+ return 0x0E03E << 15 // vaddwev.d.w
+ case AVADDWEVQV:
+ return 0x0E03F << 15 // vaddwev.q.d
+ case AVSUBWEVHB:
+ return 0x0E040 << 15 // vsubwev.h.b
+ case AVSUBWEVWH:
+ return 0x0E041 << 15 // vsubwev.w.h
+ case AVSUBWEVVW:
+ return 0x0E042 << 15 // vsubwev.d.w
+ case AVSUBWEVQV:
+ return 0x0E043 << 15 // vsubwev.q.d
+ case AVADDWODHB:
+ return 0x0E044 << 15 // vaddwod.h.b
+ case AVADDWODWH:
+ return 0x0E045 << 15 // vaddwod.w.h
+ case AVADDWODVW:
+ return 0x0E046 << 15 // vaddwod.d.w
+ case AVADDWODQV:
+ return 0x0E047 << 15 // vaddwod.q.d
+ case AVSUBWODHB:
+ return 0x0E048 << 15 // vsubwod.h.b
+ case AVSUBWODWH:
+ return 0x0E049 << 15 // vsubwod.w.h
+ case AVSUBWODVW:
+ return 0x0E04A << 15 // vsubwod.d.w
+ case AVSUBWODQV:
+ return 0x0E04B << 15 // vsubwod.q.d
+ case AXVADDWEVHB:
+ return 0x0E83C << 15 // xvaddwev.h.b
+ case AXVADDWEVWH:
+ return 0x0E83D << 15 // xvaddwev.w.h
+ case AXVADDWEVVW:
+ return 0x0E83E << 15 // xvaddwev.d.w
+ case AXVADDWEVQV:
+ return 0x0E83F << 15 // xvaddwev.q.d
+ case AXVSUBWEVHB:
+ return 0x0E840 << 15 // xvsubwev.h.b
+ case AXVSUBWEVWH:
+ return 0x0E841 << 15 // xvsubwev.w.h
+ case AXVSUBWEVVW:
+ return 0x0E842 << 15 // xvsubwev.d.w
+ case AXVSUBWEVQV:
+ return 0x0E843 << 15 // xvsubwev.q.d
+ case AXVADDWODHB:
+ return 0x0E844 << 15 // xvaddwod.h.b
+ case AXVADDWODWH:
+ return 0x0E845 << 15 // xvaddwod.w.h
+ case AXVADDWODVW:
+ return 0x0E846 << 15 // xvaddwod.d.w
+ case AXVADDWODQV:
+ return 0x0E847 << 15 // xvaddwod.q.d
+ case AXVSUBWODHB:
+ return 0x0E848 << 15 // xvsubwod.h.b
+ case AXVSUBWODWH:
+ return 0x0E849 << 15 // xvsubwod.w.h
+ case AXVSUBWODVW:
+ return 0x0E84A << 15 // xvsubwod.d.w
+ case AXVSUBWODQV:
+ return 0x0E84B << 15 // xvsubwod.q.d
+ case AVADDWEVHBU:
+ return 0x0E05C << 15 // vaddwev.h.bu
+ case AVADDWEVWHU:
+ return 0x0E05E << 15 // vaddwev.w.hu
+ case AVADDWEVVWU:
+ return 0x0E05E << 15 // vaddwev.d.wu
+ case AVADDWEVQVU:
+ return 0x0E05F << 15 // vaddwev.q.du
+ case AVSUBWEVHBU:
+ return 0x0E060 << 15 // vsubwev.h.bu
+ case AVSUBWEVWHU:
+ return 0x0E061 << 15 // vsubwev.w.hu
+ case AVSUBWEVVWU:
+ return 0x0E062 << 15 // vsubwev.d.wu
+ case AVSUBWEVQVU:
+ return 0x0E063 << 15 // vsubwev.q.du
+ case AVADDWODHBU:
+ return 0x0E064 << 15 // vaddwod.h.bu
+ case AVADDWODWHU:
+ return 0x0E065 << 15 // vaddwod.w.hu
+ case AVADDWODVWU:
+ return 0x0E066 << 15 // vaddwod.d.wu
+ case AVADDWODQVU:
+ return 0x0E067 << 15 // vaddwod.q.du
+ case AVSUBWODHBU:
+ return 0x0E068 << 15 // vsubwod.h.bu
+ case AVSUBWODWHU:
+ return 0x0E069 << 15 // vsubwod.w.hu
+ case AVSUBWODVWU:
+ return 0x0E06A << 15 // vsubwod.d.wu
+ case AVSUBWODQVU:
+ return 0x0E06B << 15 // vsubwod.q.du
+ case AXVADDWEVHBU:
+ return 0x0E85C << 15 // xvaddwev.h.bu
+ case AXVADDWEVWHU:
+ return 0x0E85D << 15 // xvaddwev.w.hu
+ case AXVADDWEVVWU:
+ return 0x0E85E << 15 // xvaddwev.d.wu
+ case AXVADDWEVQVU:
+ return 0x0E85F << 15 // xvaddwev.q.du
+ case AXVSUBWEVHBU:
+ return 0x0E860 << 15 // xvsubwev.h.bu
+ case AXVSUBWEVWHU:
+ return 0x0E861 << 15 // xvsubwev.w.hu
+ case AXVSUBWEVVWU:
+ return 0x0E862 << 15 // xvsubwev.d.wu
+ case AXVSUBWEVQVU:
+ return 0x0E863 << 15 // xvsubwev.q.du
+ case AXVADDWODHBU:
+ return 0x0E864 << 15 // xvaddwod.h.bu
+ case AXVADDWODWHU:
+ return 0x0E865 << 15 // xvaddwod.w.hu
+ case AXVADDWODVWU:
+ return 0x0E866 << 15 // xvaddwod.d.wu
+ case AXVADDWODQVU:
+ return 0x0E867 << 15 // xvaddwod.q.du
+ case AXVSUBWODHBU:
+ return 0x0E868 << 15 // xvsubwod.h.bu
+ case AXVSUBWODWHU:
+ return 0x0E869 << 15 // xvsubwod.w.hu
+ case AXVSUBWODVWU:
+ return 0x0E86A << 15 // xvsubwod.d.wu
+ case AXVSUBWODQVU:
+ return 0x0E86B << 15 // xvsubwod.q.du
case AVSLLB:
return 0xe1d0 << 15 // vsll.b
case AVSLLH: