Skip to content

Commit 42440c6

Browse files
committed
[mono][2/2] Add SIMD Support for s390x
This is a followup patch to dotnet#116669 to add vector support to s390x
1 parent 3c5f74a commit 42440c6

File tree

7 files changed

+1646
-697
lines changed

7 files changed

+1646
-697
lines changed

src/mono/mono/arch/s390x/s390x-codegen.h

Lines changed: 212 additions & 73 deletions
Large diffs are not rendered by default.

src/mono/mono/mini/cpu-s390x.mdesc

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ int_clt_un: dest:i len:12
298298
int_cneq: dest:i len:12
299299
int_cge: dest:i len:12
300300
int_cle: dest:i len:12
301+
int_cnle: dest:i len:12
301302
int_cge_un: dest:i len:12
302303
int_cle_un: dest:i len:12
303304

@@ -472,3 +473,170 @@ s390_cij: len:24
472473
s390_cij_un: src1:i len:24
473474
s390_cgij: len:24
474475
s390_cgij_un: len:24
476+
477+
insert_i1: dest:x src1:x src2:i len:12
478+
insert_i2: dest:x src1:x src2:i len:12
479+
insert_i4: dest:x src1:x src2:i len:12
480+
insert_i8: dest:x src1:x src2:i len:12
481+
insert_r4: dest:x src1:x src2:f clob:1 len:12
482+
insert_r8: dest:x src1:x src2:f clob:1 len:12
483+
484+
xinsert_i1: dest:x src1:x src2:i src3:i len:12
485+
xinsert_i2: dest:x src1:x src2:i src3:i len:12
486+
xinsert_i4: dest:x src1:x src2:i src3:i len:12
487+
xinsert_i8: dest:x src1:x src2:i src3:i len:12
488+
xinsert_r4: dest:x src1:x src2:f src3:i clob:1 len:12
489+
xinsert_r8: dest:x src1:x src2:f src3:i clob:1 len:12
490+
491+
extract_i1: dest:i src1:x len:6
492+
extract_i2: dest:i src1:x len:6
493+
extract_i4: dest:i src1:x len:6
494+
extract_i8: dest:i src1:x len:6
495+
extract_r4: dest:f src1:x len:12
496+
extract_r8: dest:f src1:x len:12
497+
498+
xextract_i1: dest:i src1:x src2:i len:6
499+
xextract_i2: dest:i src1:x src2:i len:6
500+
xextract_i4: dest:i src1:x src2:i len:6
501+
xextract_i8: dest:i src1:x src2:i len:6
502+
xextract_r4: dest:f src1:x src2:i len:10
503+
xextract_r8: dest:f src1:x src2:i len:10
504+
505+
expand_i1: dest:x src1:i len:12
506+
expand_i2: dest:x src1:i len:14
507+
expand_i4: dest:x src1:i len:12
508+
expand_i8: dest:x src1:i len:12
509+
expand_r8: dest:x src1:f len:20
510+
expand_r4: dest:x src1:f len:20
511+
512+
513+
xextract: dest:i src1:x len:12
514+
xones: dest:x len:6
515+
xmove: dest:x src1:x len:6
516+
#xcast: dest:x src1:x len:6
517+
xzero: dest:x len:6
518+
xcompare: dest:x src1:x src2:x len:6
519+
xcompare_fp: dest:x src1:x src2:x len:6
520+
loadx_membase: dest:x src1:b len:16
521+
storex_membase: dest:b src1:x len:16
522+
vaddb: dest:x src1:x src2:x len:6
523+
vaddh: dest:x src1:x src2:x len:6
524+
vaddf: dest:x src1:x src2:x len:6
525+
vaddg: dest:x src1:x src2:x len:6
526+
vaddq: dest:x src1:x src2:x len:6
527+
vfadds: dest:x src1:x src2:x len:6
528+
vfaddd: dest:x src1:x src2:x len:6
529+
vsubb: dest:x src1:x src2:x len:6
530+
vsubh: dest:x src1:x src2:x len:6
531+
vsubf: dest:x src1:x src2:x len:6
532+
vsubg: dest:x src1:x src2:x len:6
533+
vsubq: dest:x src1:x src2:x len:6
534+
vfsubs: dest:x src1:x src2:x len:6
535+
vfsubd: dest:x src1:x src2:x len:6
536+
vxor: dest:x src1:x src2:x len:6
537+
vor: dest:x src1:x src2:x len:6
538+
vnor: dest:x src1:x src2:x len:24
539+
vand: dest:x src1:x src2:x len:6
540+
vandnot: dest:x src1:x src2:x len:12
541+
vnand: dest:x src1:x src2:x len:6
542+
vmulb: dest:x src1:x src2:x len:6
543+
vmulhw: dest:x src1:x src2:x len:6
544+
vmulf: dest:x src1:x src2:x len:6
545+
vfmuls: dest:x src1:x src2:x len:6
546+
vfmuld: dest:x src1:x src2:x len:6
547+
vfdivs: dest:x src1:x src2:x len:6
548+
vfdivd: dest:x src1:x src2:x len:6
549+
vmxb: dest:x src1:x src2:x len:6
550+
vmxh: dest:x src1:x src2:x len:6
551+
vmxf: dest:x src1:x src2:x len:6
552+
vmxg: dest:x src1:x src2:x len:6
553+
vmnb: dest:x src1:x src2:x len:6
554+
vmnh: dest:x src1:x src2:x len:6
555+
vmnf: dest:x src1:x src2:x len:6
556+
vmng: dest:x src1:x src2:x len:6
557+
vmxlb: dest:x src1:x src2:x len:6
558+
vmxlh: dest:x src1:x src2:x len:6
559+
vmxlf: dest:x src1:x src2:x len:6
560+
vmxlg: dest:x src1:x src2:x len:6
561+
vfmaxs: dest:x src1:x src2:x len:6
562+
vfmaxd: dest:x src1:x src2:x len:6
563+
vmnlb: dest:x src1:x src2:x len:6
564+
vmnlh: dest:x src1:x src2:x len:6
565+
vmnlf: dest:x src1:x src2:x len:6
566+
vmnlg: dest:x src1:x src2:x len:6
567+
vfmins: dest:x src1:x src2:x len:6
568+
vfmind: dest:x src1:x src2:x len:6
569+
vsumb: dest:x src1:x src2:x len:6
570+
vsumh: dest:x src1:x src2:x len:6
571+
vsumqf: dest:x src1:x src2:x len:6
572+
vsumqg: dest:x src1:x src2:x len:6
573+
vperm: dest:x src1:x src2:x len:6
574+
vrepib: dest:x len:6
575+
vrepih: dest:x len:6
576+
vrepif: dest:x len:6
577+
vrepig: dest:x len:6
578+
vceqbs: dest:x src1:x src2:x len:6
579+
vceqhs: dest:x src1:x src2:x len:6
580+
vceqfs: dest:x src1:x src2:x len:6
581+
vceqgs: dest:x src1:x src2:x len:6
582+
vfcesbs: dest:x src1:x src2:x len:6
583+
vfcedbs: dest:x src1:x src2:x len:6
584+
vfchsbs: dest:x src1:x src2:x len:6
585+
vfchdbs: dest:x src1:x src2:x len:6
586+
vgmb: dest:x src1:i src2:i len:6
587+
vgmh: dest:x src1:i src2:i len:6
588+
vgmf: dest:x src1:i src2:i len:6
589+
vgmg: dest:x src1:i src2:i len:6
590+
vecb: dest:x src1:x len:6
591+
vech: dest:x src1:x len:6
592+
vecf: dest:x src1:x len:6
593+
vecg: dest:x src1:x len:6
594+
veclb: dest:x src1:x len:6
595+
veclh: dest:x src1:x len:6
596+
veclf: dest:x src1:x len:6
597+
veclg: dest:x src1:x len:6
598+
vchbs: dest:x src1:x src2:x len:6
599+
vchhs: dest:x src1:x src2:x len:6
600+
vchfs: dest:x src1:x src2:x len:6
601+
vchgs: dest:x src1:x src2:x len:6
602+
#vfsqsb: src1:x src2:x len:6 clob:1
603+
vfsqsb: dest:x src1:x len:6
604+
#vfsqdb: src1:x src2:x len:6 clob:1
605+
vfsqdb: dest:x src1:x len:6
606+
vchlbs: dest:x src1:x src2:x len:6
607+
vchlhs: dest:x src1:x src2:x len:6
608+
vchlfs: dest:x src1:x src2:x len:6
609+
vchlgs: dest:x src1:x src2:x len:6
610+
vlpb: dest:x src1:x len:6
611+
vlph: dest:x src1:x len:6
612+
vlpf: dest:x src1:x len:6
613+
vlpg: dest:x src1:x len:6
614+
vflpdb: dest:x src1:x len:6
615+
vflpsb: dest:x src1:x len:6
616+
vflcdb: dest:x src1:x len:6
617+
vflcsb: dest:x src1:x len:6
618+
vpkh: dest:x src1:x src2:x len:6
619+
vpkf: dest:x src1:x src2:x len:6
620+
vpkg: dest:x src1:x src2:x len:6
621+
vlcb: dest:x src1:x len:6
622+
vlch: dest:x src1:x len:6
623+
vlcf: dest:x src1:x len:6
624+
vlcg: dest:x src1:x len:6
625+
vuplb: dest:x src1:x len:6
626+
vuplh: dest:x src1:x len:6
627+
vuplf: dest:x src1:x len:6
628+
vupllb: dest:x src1:x len:6
629+
vupllh: dest:x src1:x len:6
630+
vupllf: dest:x src1:x len:6
631+
vuphb: dest:x src1:x len:6
632+
vuphh: dest:x src1:x len:6
633+
vuphf: dest:x src1:x len:6
634+
vuplhb: dest:x src1:x len:6
635+
vuplhh: dest:x src1:x len:6
636+
vuplhf: dest:x src1:x len:6
637+
vfisb: dest:x src1:x len:6
638+
vfidb: dest:x src1:x len:6
639+
ceil_floor: dest:x src1:x len:6
640+
ones_complement: dest:x src1:x len:6
641+
negate: dest:x src1:x len:12
642+
xconst: dest:x len:18

src/mono/mono/mini/mini-ops.h

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,6 +1498,128 @@ MINI_OP(OP_S390_CIJ, "s390_cij", IREG, NONE, NONE)
14981498
MINI_OP(OP_S390_CLIJ, "s390_cij_un", IREG, IREG, NONE)
14991499
MINI_OP(OP_S390_CGIJ, "s390_cgij", LREG, NONE, NONE)
15001500
MINI_OP(OP_S390_CLGIJ, "s390_cgij_un", LREG, NONE, NONE)
1501+
MINI_OP(OP_VADDB, "vaddb", XREG, XREG, XREG)
1502+
MINI_OP(OP_VADDH, "vaddh", XREG, XREG, XREG)
1503+
MINI_OP(OP_VADDF, "vaddf", XREG, XREG, XREG)
1504+
MINI_OP(OP_VADDG, "vaddg", XREG, XREG, XREG)
1505+
MINI_OP(OP_VADDQ, "vaddq", XREG, XREG, XREG)
1506+
MINI_OP(OP_VFADDS, "vfadds", XREG, XREG, XREG)
1507+
MINI_OP(OP_VFADDD, "vfaddd", XREG, XREG, XREG)
1508+
MINI_OP(OP_VSUBB, "vsubb", XREG, XREG, XREG)
1509+
MINI_OP(OP_VSUBH, "vsubh", XREG, XREG, XREG)
1510+
MINI_OP(OP_VSUBF, "vsubf", XREG, XREG, XREG)
1511+
MINI_OP(OP_VSUBG, "vsubg", XREG, XREG, XREG)
1512+
MINI_OP(OP_VSUBQ, "vsubq", XREG, XREG, XREG)
1513+
MINI_OP(OP_VFSUBS, "vfsubs", XREG, XREG, XREG)
1514+
MINI_OP(OP_VFSUBD, "vfsubd", XREG, XREG, XREG)
1515+
MINI_OP(OP_VMULB, "vmulb", XREG, XREG, XREG)
1516+
MINI_OP(OP_VMULHW, "vmulhw", XREG, XREG, XREG)
1517+
MINI_OP(OP_VMULF, "vmulf", XREG, XREG, XREG)
1518+
MINI_OP(OP_VFMULS, "vfmuls", XREG, XREG, XREG)
1519+
MINI_OP(OP_VFMULD, "vfmuld", XREG, XREG, XREG)
1520+
MINI_OP(OP_VFDIVS, "vfdivs", XREG, XREG, XREG)
1521+
MINI_OP(OP_VFDIVD, "vfdivd", XREG, XREG, XREG)
1522+
MINI_OP(OP_VMXB, "vmxb", XREG, XREG, XREG)
1523+
MINI_OP(OP_VMXH, "vmxh", XREG, XREG, XREG)
1524+
MINI_OP(OP_VMXF, "vmxf", XREG, XREG, XREG)
1525+
MINI_OP(OP_VMXG, "vmxg", XREG, XREG, XREG)
1526+
MINI_OP(OP_VFMAXS, "vfmaxs", XREG, XREG, XREG)
1527+
MINI_OP(OP_VFMAXD, "vfmaxd", XREG, XREG, XREG)
1528+
MINI_OP(OP_VMNB, "vmnb", XREG, XREG, XREG)
1529+
MINI_OP(OP_VMNH, "vmnh", XREG, XREG, XREG)
1530+
MINI_OP(OP_VMNF, "vmnf", XREG, XREG, XREG)
1531+
MINI_OP(OP_VMNG, "vmng", XREG, XREG, XREG)
1532+
MINI_OP(OP_VFMINS, "vfmins", XREG, XREG, XREG)
1533+
MINI_OP(OP_VFMIND, "vfmind", XREG, XREG, XREG)
1534+
MINI_OP(OP_VMXLB, "vmxlb", XREG, XREG, XREG)
1535+
MINI_OP(OP_VMXLH, "vmxlh", XREG, XREG, XREG)
1536+
MINI_OP(OP_VMXLF, "vmxlf", XREG, XREG, XREG)
1537+
MINI_OP(OP_VMXLG, "vmxlg", XREG, XREG, XREG)
1538+
MINI_OP(OP_VMNLB, "vmnlb", XREG, XREG, XREG)
1539+
MINI_OP(OP_VMNLH, "vmnlh", XREG, XREG, XREG)
1540+
MINI_OP(OP_VMNLF, "vmnlf", XREG, XREG, XREG)
1541+
MINI_OP(OP_VMNLG, "vmnlg", XREG, XREG, XREG)
1542+
MINI_OP(OP_VOR, "vor", XREG, XREG, XREG)
1543+
MINI_OP(OP_VNOR, "vnor", XREG, XREG, XREG)
1544+
MINI_OP(OP_VXOR, "vxor", XREG, XREG, XREG)
1545+
MINI_OP(OP_VAND, "vand", XREG, XREG, XREG)
1546+
MINI_OP(OP_VNAND, "vnand", XREG, XREG, XREG)
1547+
MINI_OP(OP_VECTOR_ANDN, "vandnot", XREG, XREG, XREG)
1548+
MINI_OP(OP_VSUMB, "vsumb", XREG, XREG, XREG)
1549+
MINI_OP(OP_VSUMH, "vsumh", XREG, XREG, XREG)
1550+
MINI_OP(OP_VSUMQF, "vsumqf", XREG, XREG, XREG)
1551+
MINI_OP(OP_VSUMQG, "vsumqg", XREG, XREG, XREG)
1552+
MINI_OP(OP_VPERM, "vperm", XREG, XREG, XREG)
1553+
MINI_OP(OP_VREPIB, "vrepib", XREG, NONE, NONE)
1554+
MINI_OP(OP_VREPIH, "vrepih", XREG, NONE, NONE)
1555+
MINI_OP(OP_VREPIF, "vrepif", XREG, NONE, NONE)
1556+
MINI_OP(OP_VREPIG, "vrepig", XREG, NONE, NONE)
1557+
MINI_OP(OP_VFSQSB, "vfsqsb", XREG, XREG, NONE)
1558+
MINI_OP(OP_VFSQDB, "vfsqdb", XREG, XREG, NONE)
1559+
MINI_OP(OP_VFCESBS, "vfcesbs", XREG, XREG, XREG)
1560+
MINI_OP(OP_VFCEDBS, "vfcedbs", XREG, XREG, XREG)
1561+
MINI_OP(OP_VFCHSBS, "vfchsbs", XREG, XREG, XREG)
1562+
MINI_OP(OP_VFCHDBS, "vfchdbs", XREG, XREG, XREG)
1563+
MINI_OP(OP_VCEQBS, "vceqbs", XREG, XREG, XREG)
1564+
MINI_OP(OP_VCEQHS, "vceqhs", XREG, XREG, XREG)
1565+
MINI_OP(OP_VCEQFS, "vceqfs", XREG, XREG, XREG)
1566+
MINI_OP(OP_VCEQGS, "vceqgs", XREG, XREG, XREG)
1567+
MINI_OP(OP_VGMB, "vgmb", XREG, IREG, IREG)
1568+
MINI_OP(OP_VGMH, "vgmh", XREG, IREG, IREG)
1569+
MINI_OP(OP_VGMF, "vgmf", XREG, IREG, IREG)
1570+
MINI_OP(OP_VGMG, "vgmg", XREG, IREG, IREG)
1571+
MINI_OP(OP_VECB, "vecb", XREG, XREG, NONE)
1572+
MINI_OP(OP_VECF, "vecf", XREG, XREG, NONE)
1573+
MINI_OP(OP_VECH, "vech", XREG, XREG, NONE)
1574+
MINI_OP(OP_VECG, "vecg", XREG, XREG, NONE)
1575+
MINI_OP(OP_VECLB, "veclb", XREG, XREG, NONE)
1576+
MINI_OP(OP_VECLF, "veclf", XREG, XREG, NONE)
1577+
MINI_OP(OP_VECLH, "veclh", XREG, XREG, NONE)
1578+
MINI_OP(OP_VECLG, "veclg", XREG, XREG, NONE)
1579+
MINI_OP(OP_VCHBS, "vchbs", XREG, XREG, XREG)
1580+
MINI_OP(OP_VCHHS, "vchhs", XREG, XREG, XREG)
1581+
MINI_OP(OP_VCHFS, "vchfs", XREG, XREG, XREG)
1582+
MINI_OP(OP_VCHGS, "vchgs", XREG, XREG, XREG)
1583+
MINI_OP(OP_VCHLBS, "vchlbs", XREG, XREG, XREG)
1584+
MINI_OP(OP_VCHLHS, "vchlhs", XREG, XREG, XREG)
1585+
MINI_OP(OP_VCHLFS, "vchlfs", XREG, XREG, XREG)
1586+
MINI_OP(OP_VCHLGS, "vchlgs", XREG, XREG, XREG)
1587+
MINI_OP(OP_VEC_ABS, "vecabs", XREG, XREG, NONE)
1588+
MINI_OP(OP_VEC_ONE, "vecone", XREG, NONE, NONE)
1589+
MINI_OP(OP_VLPB, "vlpb", XREG, XREG, NONE)
1590+
MINI_OP(OP_VLPH, "vlph", XREG, XREG, NONE)
1591+
MINI_OP(OP_VLPF, "vlpf", XREG, XREG, NONE)
1592+
MINI_OP(OP_VLPG, "vlpg", XREG, XREG, NONE)
1593+
MINI_OP(OP_VFLPDB, "vflpdb", XREG, XREG, NONE)
1594+
MINI_OP(OP_VFLPSB, "vflpsb", XREG, XREG, NONE)
1595+
MINI_OP(OP_VFLCDB, "vflcdb", XREG, XREG, NONE)
1596+
MINI_OP(OP_VFLCSB, "vflcsb", XREG, XREG, NONE)
1597+
MINI_OP3(OP_BSL, "bitwise_select", XREG, XREG, XREG, XREG)
1598+
MINI_OP(OP_VPKH, "vpkh", XREG, XREG, XREG)
1599+
MINI_OP(OP_VPKF, "vpkf", XREG, XREG, XREG)
1600+
MINI_OP(OP_VPKG, "vpkg", XREG, XREG, XREG)
1601+
MINI_OP(OP_VLCB, "vlcb", XREG, XREG, NONE)
1602+
MINI_OP(OP_VLCH, "vlch", XREG, XREG, NONE)
1603+
MINI_OP(OP_VLCF, "vlcf", XREG, XREG, NONE)
1604+
MINI_OP(OP_VLCG, "vlcg", XREG, XREG, NONE)
1605+
MINI_OP(OP_VUPHB, "vuphb", XREG, XREG, NONE)
1606+
MINI_OP(OP_VUPHH, "vuphh", XREG, XREG, NONE)
1607+
MINI_OP(OP_VUPHF, "vuphf", XREG, XREG, NONE)
1608+
MINI_OP(OP_VUPLB, "vuplb", XREG, XREG, NONE)
1609+
MINI_OP(OP_VUPLH, "vuplh", XREG, XREG, NONE)
1610+
MINI_OP(OP_VUPLF, "vuplf", XREG, XREG, NONE)
1611+
MINI_OP(OP_VUPLHB, "vuplhb", XREG, XREG, NONE)
1612+
MINI_OP(OP_VUPLHH, "vuplhh", XREG, XREG, NONE)
1613+
MINI_OP(OP_VUPLHF, "vuplhf", XREG, XREG, NONE)
1614+
MINI_OP(OP_VUPLLB, "vupllb", XREG, XREG, NONE)
1615+
MINI_OP(OP_VUPLLH, "vupllh", XREG, XREG, NONE)
1616+
MINI_OP(OP_VUPLLF, "vupllf", XREG, XREG, NONE)
1617+
MINI_OP(OP_VFISB, "vfidb", XREG, XREG, NONE)
1618+
MINI_OP(OP_VFIDB, "vfisb", XREG, XREG, NONE)
1619+
MINI_OP(OP_CEIL_FLOOR, "ceil_floor", XREG, XREG, NONE)
1620+
MINI_OP(OP_ICNLE, "int_cnle", IREG, NONE, NONE)
1621+
MINI_OP(OP_ONES_COMPLEMENT, "ones_complement", XREG, XREG, NONE)
1622+
MINI_OP(OP_NEGATION, "negate", XREG, XREG, NONE)
15011623
#endif
15021624

15031625
#if defined(TARGET_ARM64)

src/mono/mono/mini/mini-runtime.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4496,7 +4496,7 @@ init_class (MonoClass *klass)
44964496
}
44974497
#endif
44984498

4499-
#ifdef TARGET_ARM64
4499+
#if defined(TARGET_ARM64) || defined(TARGET_S390X)
45004500
if (!strcmp (m_class_get_name_space (klass), "System.Numerics")) {
45014501
if (!strcmp (name, "Vector2") || !strcmp (name, "Vector3") ||!strcmp (name, "Vector4") || !strcmp (name, "Quaternion") || !strcmp (name, "Plane"))
45024502
mono_class_set_is_simd_type (klass, TRUE);

0 commit comments

Comments
 (0)