cmd/internal/obj/loong64: add [X]VMULW{EV/OD} series instructions support

Go asm syntax:
	 VMULW{EV/OD}{HB/WH/VW/QV}[U]		VK, VJ, VD
	XVMULW{EV/OD}{HB/WH/VW/QV}[U]		XK, XJ, XD
	 VMULW{EV/OD}{HBUB/WHUH/VWUW/QVUV}	VK, VJ, VD
	XVMULW{EV/OD}{HBUB/WHUH/VWUW/QVUV}	XK, XJ, XD

Equivalent platform assembler syntax:
	 vmulw{ev/od}.{h.b/w.h/d.w/q.d}[u]		vd, vj, vk
	xvmulw{ev/od}.{h.b/w.h/d.w/q.d}[u]		xd, xj, xk
	 vmulw{ev/od}.{h.bu.b/w.hu.h/d.wu.w/q.du.d}	vd, vj, vk
	xvmulw{ev/od}.{h.bu.b/w.hu.h/d.wu.w/q.du.d}	xd, xj, xk

Change-Id: Ib1b5fb9605417a2b81841deae40e0e2beb90d03c
Reviewed-on: https://go-review.googlesource.com/c/go/+/658375
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
Xiaolin Zhao 2025-03-17 14:48:01 +08:00 committed by abner chenc
parent 4f5863c2ce
commit ac8474c0a2
4 changed files with 294 additions and 0 deletions

View file

@ -1583,6 +1583,30 @@ func buildop(ctxt *obj.Link) {
opset(AVMODHU, r0)
opset(AVMODWU, r0)
opset(AVMODVU, r0)
opset(AVMULWEVHB, r0)
opset(AVMULWEVWH, r0)
opset(AVMULWEVVW, r0)
opset(AVMULWEVQV, r0)
opset(AVMULWODHB, r0)
opset(AVMULWODWH, r0)
opset(AVMULWODVW, r0)
opset(AVMULWODQV, r0)
opset(AVMULWEVHBU, r0)
opset(AVMULWEVWHU, r0)
opset(AVMULWEVVWU, r0)
opset(AVMULWEVQVU, r0)
opset(AVMULWODHBU, r0)
opset(AVMULWODWHU, r0)
opset(AVMULWODVWU, r0)
opset(AVMULWODQVU, r0)
opset(AVMULWEVHBUB, r0)
opset(AVMULWEVWHUH, r0)
opset(AVMULWEVVWUW, r0)
opset(AVMULWEVQVUV, r0)
opset(AVMULWODHBUB, r0)
opset(AVMULWODWHUH, r0)
opset(AVMULWODVWUW, r0)
opset(AVMULWODQVUV, r0)
case AXVSEQB:
opset(AXVSEQH, r0)
@ -1624,6 +1648,30 @@ func buildop(ctxt *obj.Link) {
opset(AXVMODHU, r0)
opset(AXVMODWU, r0)
opset(AXVMODVU, r0)
opset(AXVMULWEVHB, r0)
opset(AXVMULWEVWH, r0)
opset(AXVMULWEVVW, r0)
opset(AXVMULWEVQV, r0)
opset(AXVMULWODHB, r0)
opset(AXVMULWODWH, r0)
opset(AXVMULWODVW, r0)
opset(AXVMULWODQV, r0)
opset(AXVMULWEVHBU, r0)
opset(AXVMULWEVWHU, r0)
opset(AXVMULWEVVWU, r0)
opset(AXVMULWEVQVU, r0)
opset(AXVMULWODHBU, r0)
opset(AXVMULWODWHU, r0)
opset(AXVMULWODVWU, r0)
opset(AXVMULWODQVU, r0)
opset(AXVMULWEVHBUB, r0)
opset(AXVMULWEVWHUH, r0)
opset(AXVMULWEVVWUW, r0)
opset(AXVMULWEVQVUV, r0)
opset(AXVMULWODHBUB, r0)
opset(AXVMULWODWHUH, r0)
opset(AXVMULWODVWUW, r0)
opset(AXVMULWODQVUV, r0)
case AVANDB:
opset(AVORB, r0)
@ -2990,6 +3038,102 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
return 0xe9ce << 15 // xvmod.wu
case AXVMODVU:
return 0xe9cf << 15 // xvmod.du
case AVMULWEVHB:
return 0xe120 << 15 // vmulwev.h.b
case AVMULWEVWH:
return 0xe121 << 15 // vmulwev.w.h
case AVMULWEVVW:
return 0xe122 << 15 // vmulwev.d.w
case AVMULWEVQV:
return 0xe123 << 15 // vmulwev.q.d
case AVMULWODHB:
return 0xe124 << 15 // vmulwod.h.b
case AVMULWODWH:
return 0xe125 << 15 // vmulwod.w.h
case AVMULWODVW:
return 0xe126 << 15 // vmulwod.d.w
case AVMULWODQV:
return 0xe127 << 15 // vmulwod.q.d
case AVMULWEVHBU:
return 0xe130 << 15 // vmulwev.h.bu
case AVMULWEVWHU:
return 0xe131 << 15 // vmulwev.w.hu
case AVMULWEVVWU:
return 0xe132 << 15 // vmulwev.d.wu
case AVMULWEVQVU:
return 0xe133 << 15 // vmulwev.q.du
case AVMULWODHBU:
return 0xe134 << 15 // vmulwod.h.bu
case AVMULWODWHU:
return 0xe135 << 15 // vmulwod.w.hu
case AVMULWODVWU:
return 0xe136 << 15 // vmulwod.d.wu
case AVMULWODQVU:
return 0xe137 << 15 // vmulwod.q.du
case AVMULWEVHBUB:
return 0xe140 << 15 // vmulwev.h.bu.b
case AVMULWEVWHUH:
return 0xe141 << 15 // vmulwev.w.hu.h
case AVMULWEVVWUW:
return 0xe142 << 15 // vmulwev.d.wu.w
case AVMULWEVQVUV:
return 0xe143 << 15 // vmulwev.q.du.d
case AVMULWODHBUB:
return 0xe144 << 15 // vmulwod.h.bu.b
case AVMULWODWHUH:
return 0xe145 << 15 // vmulwod.w.hu.h
case AVMULWODVWUW:
return 0xe146 << 15 // vmulwod.d.wu.w
case AVMULWODQVUV:
return 0xe147 << 15 // vmulwod.q.du.d
case AXVMULWEVHB:
return 0xe920 << 15 // xvmulwev.h.b
case AXVMULWEVWH:
return 0xe921 << 15 // xvmulwev.w.h
case AXVMULWEVVW:
return 0xe922 << 15 // xvmulwev.d.w
case AXVMULWEVQV:
return 0xe923 << 15 // xvmulwev.q.d
case AXVMULWODHB:
return 0xe924 << 15 // xvmulwod.h.b
case AXVMULWODWH:
return 0xe925 << 15 // xvmulwod.w.h
case AXVMULWODVW:
return 0xe926 << 15 // xvmulwod.d.w
case AXVMULWODQV:
return 0xe927 << 15 // xvmulwod.q.d
case AXVMULWEVHBU:
return 0xe930 << 15 // xvmulwev.h.bu
case AXVMULWEVWHU:
return 0xe931 << 15 // xvmulwev.w.hu
case AXVMULWEVVWU:
return 0xe932 << 15 // xvmulwev.d.wu
case AXVMULWEVQVU:
return 0xe933 << 15 // xvmulwev.q.du
case AXVMULWODHBU:
return 0xe934 << 15 // xvmulwod.h.bu
case AXVMULWODWHU:
return 0xe935 << 15 // xvmulwod.w.hu
case AXVMULWODVWU:
return 0xe936 << 15 // xvmulwod.d.wu
case AXVMULWODQVU:
return 0xe937 << 15 // xvmulwod.q.du
case AXVMULWEVHBUB:
return 0xe940 << 15 // xvmulwev.h.bu.b
case AXVMULWEVWHUH:
return 0xe941 << 15 // xvmulwev.w.hu.h
case AXVMULWEVVWUW:
return 0xe942 << 15 // xvmulwev.d.wu.w
case AXVMULWEVQVUV:
return 0xe943 << 15 // xvmulwev.q.du.d
case AXVMULWODHBUB:
return 0xe944 << 15 // xvmulwod.h.bu.b
case AXVMULWODWHUH:
return 0xe945 << 15 // xvmulwod.w.hu.h
case AXVMULWODVWUW:
return 0xe946 << 15 // xvmulwod.d.wu.w
case AXVMULWODQVUV:
return 0xe947 << 15 // xvmulwod.q.du.d
case AVSLLB:
return 0xe1d0 << 15 // vsll.b
case AVSLLH: