Skip to content

Commit cdba82c

Browse files
committed
cmd/internal/obj/loong64: add {,X}VSLT.{B/H/W/V}{,U} instructions support
Go asm syntax: VSLT{B,H,W,V} V1, V2, V3 VSLT{B,H,W,V}U V1, V2, V3 VSLT{B,H,W,V} $-2, V2, V3 VSLT{B,H,W,V}U $8, V2, V3 XVSLT{B,H,W,V} X1, X2, X3 XVSLT{B,H,W,V}U X1, X2, X3 XVSLT{B,H,W,V} $-16, X2, X3 XVSLT{B,H,W,V}U $31, X2, X3 Equivalent platform assembler syntax: vslt.{b,h,w,d} v3, v2, v1 vslt.{b,h,w,d}u v3, v2, v1 vslti.{b,h,w,d} v3, v2, $-2 vslti.{b,h,w,d}u v3, v2, $8 xvslt.{b,h,w,d} x3, x2, x1 xvslt.{b,h,w,d}u x3, x2, x1 xvslti.{b,h,w,d} x3, x2, $-16 xvslti.{b,h,w,d}u x3, x2, $31 Change-Id: Iccfb65c0c19b62d2c5ec279a077393c68e1bf7d4 Reviewed-on: https://go-review.googlesource.com/c/go/+/721620 Reviewed-by: Mark Freeman <[email protected]> Reviewed-by: Junyang Shao <[email protected]> Reviewed-by: Meidan Li <[email protected]> Reviewed-by: sophie zhao <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent bd2b117 commit cdba82c

File tree

4 files changed

+159
-0
lines changed

4 files changed

+159
-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
@@ -597,6 +597,42 @@ lable2:
597597
XVSEQV $15, X2, X4 // 44bc8176
598598
XVSEQV $-15, X2, X4 // 44c48176
599599

600+
// VSLTB{B,H,W,V}, XVSLTB{B,H,W,V} instruction
601+
VSLTB V1, V2, V3 // 43040670
602+
VSLTH V1, V2, V3 // 43840670
603+
VSLTW V1, V2, V3 // 43040770
604+
VSLTV V1, V2, V3 // 43840770
605+
XVSLTB X1, X2, X3 // 43040674
606+
XVSLTH X1, X2, X3 // 43840674
607+
XVSLTW X1, X2, X3 // 43040774
608+
XVSLTV X1, X2, X3 // 43840774
609+
VSLTB $1, V2, V3 // 43048672
610+
VSLTH $16, V2, V3 // 43c08672
611+
VSLTW $-16, V2, V3 // 43408772
612+
VSLTV $-15, V2, V3 // 43c48772
613+
XVSLTB $1, X2, X3 // 43048676
614+
XVSLTH $16, X2, X3 // 43c08676
615+
XVSLTW $-16, X2, X3 // 43408776
616+
XVSLTV $-16, X2, X3 // 43c08776
617+
618+
// VSLTB{B,H,W,V}U, XVSLTB{B,H,W,V}U instruction
619+
VSLTBU V1, V2, V3 // 43040870
620+
VSLTHU V1, V2, V3 // 43840870
621+
VSLTWU V1, V2, V3 // 43040970
622+
VSLTVU V1, V2, V3 // 43840970
623+
XVSLTBU X1, X2, X3 // 43040874
624+
XVSLTHU X1, X2, X3 // 43840874
625+
XVSLTWU X1, X2, X3 // 43040974
626+
XVSLTVU X1, X2, X3 // 43840974
627+
VSLTBU $0, V2, V3 // 43008872
628+
VSLTHU $31, V2, V3 // 43fc8872
629+
VSLTWU $16, V2, V3 // 43408972
630+
VSLTVU $1, V2, V3 // 43848972
631+
XVSLTBU $0, X2, X3 // 43008876
632+
XVSLTHU $31, X2, X3 // 43fc8876
633+
XVSLTWU $8, X2, X3 // 43208976
634+
XVSLTVU $0, X2, X3 // 43808976
635+
600636
// VPCNT{B,H,W,V}, XVPCNT{B,H,W,V} instruction
601637
VPCNTB V1, V2 // 22209c72
602638
VPCNTH V1, V2 // 22249c72

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,23 @@ const (
912912
AVSEQV
913913
AXVSEQV
914914

915+
AVSLTB
916+
AVSLTH
917+
AVSLTW
918+
AVSLTV
919+
AVSLTBU
920+
AVSLTHU
921+
AVSLTWU
922+
AVSLTVU
923+
AXVSLTB
924+
AXVSLTH
925+
AXVSLTW
926+
AXVSLTV
927+
AXVSLTBU
928+
AXVSLTHU
929+
AXVSLTWU
930+
AXVSLTVU
931+
915932
// LSX and LASX integer div and mod instructions
916933
AVDIVB
917934
AVDIVH

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

Lines changed: 16 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: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ var optab = []Optab{
9393
{AXVSEQB, C_XREG, C_XREG, C_NONE, C_XREG, C_NONE, 2, 4, 0, 0},
9494
{AVSEQB, C_S5CON, C_VREG, C_NONE, C_VREG, C_NONE, 22, 4, 0, 0},
9595
{AXVSEQB, C_S5CON, C_XREG, C_NONE, C_XREG, C_NONE, 22, 4, 0, 0},
96+
97+
{AVSLTB, C_VREG, C_VREG, C_NONE, C_VREG, C_NONE, 2, 4, 0, 0},
98+
{AXVSLTB, C_XREG, C_XREG, C_NONE, C_XREG, C_NONE, 2, 4, 0, 0},
99+
{AVSLTB, C_S5CON, C_VREG, C_NONE, C_VREG, C_NONE, 22, 4, 0, 0},
100+
{AXVSLTB, C_S5CON, C_XREG, C_NONE, C_XREG, C_NONE, 22, 4, 0, 0},
101+
{AVSLTB, C_U5CON, C_VREG, C_NONE, C_VREG, C_NONE, 31, 4, 0, 0},
102+
{AXVSLTB, C_U5CON, C_XREG, C_NONE, C_XREG, C_NONE, 31, 4, 0, 0},
103+
96104
{AVANDV, C_VREG, C_VREG, C_NONE, C_VREG, C_NONE, 2, 4, 0, 0},
97105
{AVANDV, C_VREG, C_NONE, C_NONE, C_VREG, C_NONE, 2, 4, 0, 0},
98106
{AXVANDV, C_XREG, C_XREG, C_NONE, C_XREG, C_NONE, 2, 4, 0, 0},
@@ -1784,6 +1792,24 @@ func buildop(ctxt *obj.Link) {
17841792
opset(AXVSHUFW, r0)
17851793
opset(AXVSHUFV, r0)
17861794

1795+
case AVSLTB:
1796+
opset(AVSLTH, r0)
1797+
opset(AVSLTW, r0)
1798+
opset(AVSLTV, r0)
1799+
opset(AVSLTBU, r0)
1800+
opset(AVSLTHU, r0)
1801+
opset(AVSLTWU, r0)
1802+
opset(AVSLTVU, r0)
1803+
1804+
case AXVSLTB:
1805+
opset(AXVSLTH, r0)
1806+
opset(AXVSLTW, r0)
1807+
opset(AXVSLTV, r0)
1808+
opset(AXVSLTBU, r0)
1809+
opset(AXVSLTHU, r0)
1810+
opset(AXVSLTWU, r0)
1811+
opset(AXVSLTVU, r0)
1812+
17871813
case AVANDB:
17881814
opset(AVORB, r0)
17891815
opset(AVXORB, r0)
@@ -3379,6 +3405,38 @@ func (c *ctxt0) oprrr(a obj.As) uint32 {
33793405
return 0x0e003 << 15 // vseq.d
33803406
case AXVSEQV:
33813407
return 0x0e803 << 15 // xvseq.d
3408+
case AVSLTB:
3409+
return 0x0E00C << 15 // vslt.b
3410+
case AVSLTH:
3411+
return 0x0E00D << 15 // vslt.h
3412+
case AVSLTW:
3413+
return 0x0E00E << 15 // vslt.w
3414+
case AVSLTV:
3415+
return 0x0E00F << 15 // vslt.d
3416+
case AVSLTBU:
3417+
return 0x0E010 << 15 // vslt.bu
3418+
case AVSLTHU:
3419+
return 0x0E011 << 15 // vslt.hu
3420+
case AVSLTWU:
3421+
return 0x0E012 << 15 // vslt.wu
3422+
case AVSLTVU:
3423+
return 0x0E013 << 15 // vslt.du
3424+
case AXVSLTB:
3425+
return 0x0E80C << 15 // xvslt.b
3426+
case AXVSLTH:
3427+
return 0x0E80D << 15 // xvslt.h
3428+
case AXVSLTW:
3429+
return 0x0E80E << 15 // xvslt.w
3430+
case AXVSLTV:
3431+
return 0x0E80F << 15 // xvslt.d
3432+
case AXVSLTBU:
3433+
return 0x0E810 << 15 // xvslt.bu
3434+
case AXVSLTHU:
3435+
return 0x0E811 << 15 // xvslt.hu
3436+
case AXVSLTWU:
3437+
return 0x0E812 << 15 // xvslt.wu
3438+
case AXVSLTVU:
3439+
return 0x0E813 << 15 // xvslt.du
33823440
case AVANDV:
33833441
return 0x0E24C << 15 // vand.v
33843442
case AVORV:
@@ -4399,6 +4457,38 @@ func (c *ctxt0) opirr(a obj.As) uint32 {
43994457
return 0x0ED02 << 15 // xvseqi.w
44004458
case AXVSEQV:
44014459
return 0x0ED03 << 15 // xvseqi.d
4460+
case AVSLTB:
4461+
return 0x0E50C << 15 // vslti.b
4462+
case AVSLTH:
4463+
return 0x0E50D << 15 // vslti.h
4464+
case AVSLTW:
4465+
return 0x0E50E << 15 // vslti.w
4466+
case AVSLTV:
4467+
return 0x0E50F << 15 // vslti.d
4468+
case AVSLTBU:
4469+
return 0x0E510 << 15 // vslti.bu
4470+
case AVSLTHU:
4471+
return 0x0E511 << 15 // vslti.hu
4472+
case AVSLTWU:
4473+
return 0x0E512 << 15 // vslti.wu
4474+
case AVSLTVU:
4475+
return 0x0E513 << 15 // vslti.du
4476+
case AXVSLTB:
4477+
return 0x0ED0C << 15 // xvslti.b
4478+
case AXVSLTH:
4479+
return 0x0ED0D << 15 // xvslti.h
4480+
case AXVSLTW:
4481+
return 0x0ED0E << 15 // xvslti.w
4482+
case AXVSLTV:
4483+
return 0x0ED0F << 15 // xvslti.d
4484+
case AXVSLTBU:
4485+
return 0x0ED10 << 15 // xvslti.bu
4486+
case AXVSLTHU:
4487+
return 0x0ED11 << 15 // xvslti.hu
4488+
case AXVSLTWU:
4489+
return 0x0ED12 << 15 // xvslti.wu
4490+
case AXVSLTVU:
4491+
return 0x0ED13 << 15 // xvslti.du
44024492
case AVROTRB:
44034493
return 0x1ca8<<18 | 0x1<<13 // vrotri.b
44044494
case AVROTRH:

0 commit comments

Comments
 (0)