Skip to content

Commit c6b844e

Browse files
authored
[mono][2/2] Add SIMD Support for s390x (#116779)
* [mono][2/2] Add SIMD Support for s390x This is a followup patch to #116669 to add vector support to s390x * Address Review Comments * remove SIY_1 (duplicacy) * remove locgrnle and locghinle use locghiho instead * reformat whole patch * remove vflc use vfpso instead * move common op's to a common ifdef in mini-ops * remove NEW_INS , it's used no-where * rewrite the whole logic for Vector conditional ops for floats * update ANDN with vnc instruction * add couple of comments * remove some pseudo op in simd-intrinsics * add aligned loads and stores * Adress Review Comments - 2 * reformat patch - rename opcode from OP_ to OP_S390 * rewrite OP_XCOMPARE and OP_XEXTRACT into one opcode OP_S390_OPXCOMPARE_XEXTRACT * introduce compare neumonics without setting the condition code * rewrite OP_VEC_ABS to handle float and integer separately * Address Review Comments - 3 * remove hard-coded s390_vr16 to allocate a temp_reg instead * omit move incase ins->sreg and ins->dreg
1 parent 4e8625b commit c6b844e

File tree

7 files changed

+1798
-548
lines changed

7 files changed

+1798
-548
lines changed

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

Lines changed: 224 additions & 75 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
@@ -472,3 +472,171 @@ s390_cij: len:24
472472
s390_cij_un: src1:i len:24
473473
s390_cgij: len:24
474474
s390_cgij_un: len:24
475+
476+
insert_i1: dest:x src1:x src2:i len:12
477+
insert_i2: dest:x src1:x src2:i len:12
478+
insert_i4: dest:x src1:x src2:i len:12
479+
insert_i8: dest:x src1:x src2:i len:12
480+
insert_r4: dest:x src1:x src2:f clob:1 len:12
481+
insert_r8: dest:x src1:x src2:f clob:1 len:12
482+
483+
extract_i1: dest:i src1:x len:6
484+
extract_i2: dest:i src1:x len:6
485+
extract_i4: dest:i src1:x len:6
486+
extract_i8: dest:i src1:x len:6
487+
extract_r4: dest:f src1:x len:12
488+
extract_r8: dest:f src1:x len:12
489+
490+
xextract_i1: dest:i src1:x src2:i len:6
491+
xextract_i2: dest:i src1:x src2:i len:6
492+
xextract_i4: dest:i src1:x src2:i len:6
493+
xextract_i8: dest:i src1:x src2:i len:6
494+
xextract_r4: dest:f src1:x src2:i len:10
495+
xextract_r8: dest:f src1:x src2:i len:10
496+
497+
expand_i1: dest:x src1:i len:12
498+
expand_i2: dest:x src1:i len:12
499+
expand_i4: dest:x src1:i len:12
500+
expand_i8: dest:x src1:i len:12
501+
expand_r4: dest:x src1:f len:18
502+
expand_r8: dest:x src1:f len:16
503+
504+
xones: dest:x len:6
505+
xmove: dest:x src1:x len:6
506+
xzero: dest:x len:6
507+
loadx_membase: dest:x src1:b len:26
508+
storex_membase: dest:b src1:x len:26
509+
s390_vab: dest:x src1:x src2:x len:6
510+
s390_vah: dest:x src1:x src2:x len:6
511+
s390_vaf: dest:x src1:x src2:x len:6
512+
s390_vag: dest:x src1:x src2:x len:6
513+
s390_vfasb: dest:x src1:x src2:x len:6
514+
s390_vfadb: dest:x src1:x src2:x len:6
515+
s390_vsb: dest:x src1:x src2:x len:6
516+
s390_vsh: dest:x src1:x src2:x len:6
517+
s390_vsf: dest:x src1:x src2:x len:6
518+
s390_vsg: dest:x src1:x src2:x len:6
519+
s390_vfssb: dest:x src1:x src2:x len:6
520+
s390_vfsdb: dest:x src1:x src2:x len:6
521+
s390_vx: dest:x src1:x src2:x len:6
522+
s390_vo: dest:x src1:x src2:x len:6
523+
s390_vno: dest:x src1:x src2:x len:6
524+
s390_vn: dest:x src1:x src2:x len:6
525+
vector_andnot: dest:x src1:x src2:x len:6
526+
s390_vnn: dest:x src1:x src2:x len:6
527+
s390_vmlb: dest:x src1:x src2:x len:6
528+
s390_vmlhw: dest:x src1:x src2:x len:6
529+
s390_vmlf: dest:x src1:x src2:x len:6
530+
s390_vfmsb: dest:x src1:x src2:x len:6
531+
s390_vfmdb: dest:x src1:x src2:x len:6
532+
s390_vfdsb: dest:x src1:x src2:x len:6
533+
s390_vfddb: dest:x src1:x src2:x len:6
534+
s390_vmxb: dest:x src1:x src2:x len:6
535+
s390_vmxh: dest:x src1:x src2:x len:6
536+
s390_vmxf: dest:x src1:x src2:x len:6
537+
s390_vmxg: dest:x src1:x src2:x len:6
538+
s390_vmnb: dest:x src1:x src2:x len:6
539+
s390_vmnh: dest:x src1:x src2:x len:6
540+
s390_vmnf: dest:x src1:x src2:x len:6
541+
s390_vmng: dest:x src1:x src2:x len:6
542+
s390_vmxlb: dest:x src1:x src2:x len:6
543+
s390_vmxlh: dest:x src1:x src2:x len:6
544+
s390_vmxlf: dest:x src1:x src2:x len:6
545+
s390_vmxlg: dest:x src1:x src2:x len:6
546+
s390_vfmaxsb: dest:x src1:x src2:x len:6
547+
s390_vfmaxdb: dest:x src1:x src2:x len:6
548+
s390_vmnlb: dest:x src1:x src2:x len:6
549+
s390_vmnlh: dest:x src1:x src2:x len:6
550+
s390_vmnlf: dest:x src1:x src2:x len:6
551+
s390_vmnlg: dest:x src1:x src2:x len:6
552+
s390_vfminsb: dest:x src1:x src2:x len:6
553+
s390_vfmindb: dest:x src1:x src2:x len:6
554+
s390_vsumb: dest:x src1:x src2:x len:6
555+
s390_vsumh: dest:x src1:x src2:x len:6
556+
s390_vsumqf: dest:x src1:x src2:x len:6
557+
s390_vsumqg: dest:x src1:x src2:x len:6
558+
s390_vperm: dest:x src1:x src2:x len:6
559+
s390_vrepib: dest:x len:6
560+
s390_vrepih: dest:x len:6
561+
s390_vrepif: dest:x len:6
562+
s390_vrepig: dest:x len:6
563+
s390_vceqbs: dest:x src1:x src2:x len:6
564+
s390_vceqhs: dest:x src1:x src2:x len:6
565+
s390_vceqfs: dest:x src1:x src2:x len:6
566+
s390_vceqgs: dest:x src1:x src2:x len:6
567+
s390_vceqb: dest:x src1:x src2:x len:6
568+
s390_vceqh: dest:x src1:x src2:x len:6
569+
s390_vceqf: dest:x src1:x src2:x len:6
570+
s390_vceqg: dest:x src1:x src2:x len:6
571+
s390_vfcesbs: dest:x src1:x src2:x len:6
572+
s390_vfcedbs: dest:x src1:x src2:x len:6
573+
s390_vfchsbs: dest:x src1:x src2:x len:6
574+
s390_vfchdbs: dest:x src1:x src2:x len:6
575+
s390_vfcesb: dest:x src1:x src2:x len:6
576+
s390_vfcedb: dest:x src1:x src2:x len:6
577+
s390_vfchsb: dest:x src1:x src2:x len:6
578+
s390_vfchdb: dest:x src1:x src2:x len:6
579+
s390_vgmb: dest:x src1:i src2:i len:6
580+
s390_vgmh: dest:x src1:i src2:i len:6
581+
s390_vgmf: dest:x src1:i src2:i len:6
582+
s390_vgmg: dest:x src1:i src2:i len:6
583+
s390_vecb: dest:x src1:x len:6
584+
s390_vech: dest:x src1:x len:6
585+
s390_vecf: dest:x src1:x len:6
586+
s390_vecg: dest:x src1:x len:6
587+
s390_veclb: dest:x src1:x len:6
588+
s390_veclh: dest:x src1:x len:6
589+
s390_veclf: dest:x src1:x len:6
590+
s390_veclg: dest:x src1:x len:6
591+
s390_vchbs: dest:x src1:x src2:x len:6
592+
s390_vchhs: dest:x src1:x src2:x len:6
593+
s390_vchfs: dest:x src1:x src2:x len:6
594+
s390_vchgs: dest:x src1:x src2:x len:6
595+
s390_vchb: dest:x src1:x src2:x len:6
596+
s390_vchh: dest:x src1:x src2:x len:6
597+
s390_vchf: dest:x src1:x src2:x len:6
598+
s390_vchg: dest:x src1:x src2:x len:6
599+
s390_vfsqsb: dest:x src1:x len:6
600+
s390_vfsqdb: dest:x src1:x len:6
601+
s390_vchlbs: dest:x src1:x src2:x len:6
602+
s390_vchlhs: dest:x src1:x src2:x len:6
603+
s390_vchlfs: dest:x src1:x src2:x len:6
604+
s390_vchlgs: dest:x src1:x src2:x len:6
605+
s390_vchlb: dest:x src1:x src2:x len:6
606+
s390_vchlh: dest:x src1:x src2:x len:6
607+
s390_vchlf: dest:x src1:x src2:x len:6
608+
s390_vchlg: dest:x src1:x src2:x len:6
609+
s390_vfchesbs: dest:x src1:x src2:x len:6
610+
s390_vfchedbs: dest:x src1:x src2:x len:6
611+
s390_vfchesb: dest:x src1:x src2:x len:6
612+
s390_vfchedb: dest:x src1:x src2:x len:6
613+
s390_vlpb: dest:x src1:x len:6
614+
s390_vlph: dest:x src1:x len:6
615+
s390_vlpf: dest:x src1:x len:6
616+
s390_vlpg: dest:x src1:x len:6
617+
s390_vflpdb: dest:x src1:x len:6
618+
s390_vflpsb: dest:x src1:x len:6
619+
s390_vflcdb: dest:x src1:x len:6
620+
s390_vflcsb: dest:x src1:x len:6
621+
s390_vpkh: dest:x src1:x src2:x len:6
622+
s390_vpkf: dest:x src1:x src2:x len:6
623+
s390_vpkg: dest:x src1:x src2:x len:6
624+
s390_vlcb: dest:x src1:x len:6
625+
s390_vlch: dest:x src1:x len:6
626+
s390_vlcf: dest:x src1:x len:6
627+
s390_vlcg: dest:x src1:x len:6
628+
s390_vuplb: dest:x src1:x len:6
629+
s390_vuplhw: dest:x src1:x len:6
630+
s390_vuplf: dest:x src1:x len:6
631+
s390_vupllb: dest:x src1:x len:6
632+
s390_vupllh: dest:x src1:x len:6
633+
s390_vupllf: dest:x src1:x len:6
634+
s390_vuphb: dest:x src1:x len:6
635+
s390_vuphh: dest:x src1:x len:6
636+
s390_vuphf: dest:x src1:x len:6
637+
s390_vuplhb: dest:x src1:x len:6
638+
s390_vuplhh: dest:x src1:x len:6
639+
s390_vuplhf: dest:x src1:x len:6
640+
s390_vfisb: dest:x src1:x len:6
641+
s390_vfidb: dest:x src1:x len:6
642+
xconst: dest:x len:18

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

Lines changed: 143 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ MINI_OP(OP_STORER8_MEMBASE_REG, "storer8_membase_reg", IREG, FREG, NONE)
121121

122122
#if defined(TARGET_X86) || defined(TARGET_AMD64)
123123
MINI_OP(OP_STOREX_MEMBASE_REG, "storex_membase_reg", IREG, XREG, NONE)
124-
MINI_OP(OP_STOREX_ALIGNED_MEMBASE_REG, "storex_aligned_membase_reg", IREG, XREG, NONE)
125124
MINI_OP(OP_STOREX_NTA_MEMBASE_REG, "storex_nta_membase_reg", IREG, XREG, NONE)
126125
#endif
127126

@@ -149,8 +148,9 @@ MINI_OP(OP_LOADR8_MEMBASE,"loadr8_membase", FREG, IREG, NONE)
149148
/* klass must be set to a simd class */
150149
MINI_OP(OP_LOADX_MEMBASE, "loadx_membase", XREG, IREG, NONE)
151150

152-
#if defined(TARGET_X86) || defined(TARGET_AMD64)
151+
#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_S390X)
153152
MINI_OP(OP_LOADX_ALIGNED_MEMBASE, "loadx_aligned_membase", XREG, IREG, NONE)
153+
MINI_OP(OP_STOREX_ALIGNED_MEMBASE_REG, "storex_aligned_membase_reg", IREG, XREG, NONE)
154154
#endif
155155

156156
MINI_OP(OP_LOADV_MEMBASE, "loadv_membase", VREG, IREG, NONE)
@@ -1049,8 +1049,6 @@ MINI_OP(OP_CVTPS2PD, "cvtps2pd", XREG, XREG, NONE)
10491049
MINI_OP(OP_CVTTPD2DQ, "cvttpd2dq", XREG, XREG, NONE)
10501050
MINI_OP(OP_CVTTPS2DQ, "cvttps2dq", XREG, XREG, NONE)
10511051

1052-
MINI_OP(OP_VECTOR_IABS, "vector_integer_abs", XREG, XREG, NONE)
1053-
MINI_OP(OP_VECTOR_ANDN, "vector_andnot", XREG, XREG, XREG)
10541052

10551053
/* sse 1 */
10561054
/* inst_c1 is target type */
@@ -1498,6 +1496,139 @@ MINI_OP(OP_S390_CIJ, "s390_cij", IREG, NONE, NONE)
14981496
MINI_OP(OP_S390_CLIJ, "s390_cij_un", IREG, IREG, NONE)
14991497
MINI_OP(OP_S390_CGIJ, "s390_cgij", LREG, NONE, NONE)
15001498
MINI_OP(OP_S390_CLGIJ, "s390_cgij_un", LREG, NONE, NONE)
1499+
MINI_OP(OP_S390_VAB, "s390_vab", XREG, XREG, XREG)
1500+
MINI_OP(OP_S390_VAH, "s390_vah", XREG, XREG, XREG)
1501+
MINI_OP(OP_S390_VAF, "s390_vaf", XREG, XREG, XREG)
1502+
MINI_OP(OP_S390_VAG, "s390_vag", XREG, XREG, XREG)
1503+
MINI_OP(OP_S390_VFASB, "s390_vfasb", XREG, XREG, XREG)
1504+
MINI_OP(OP_S390_VFADB, "s390_vfadb", XREG, XREG, XREG)
1505+
MINI_OP(OP_S390_VSB, "s390_vsb", XREG, XREG, XREG)
1506+
MINI_OP(OP_S390_VSH, "s390_vsh", XREG, XREG, XREG)
1507+
MINI_OP(OP_S390_VSF, "s390_vsf", XREG, XREG, XREG)
1508+
MINI_OP(OP_S390_VSG, "s390_vsg", XREG, XREG, XREG)
1509+
MINI_OP(OP_S390_VFSSB, "s390_vfssb", XREG, XREG, XREG)
1510+
MINI_OP(OP_S390_VFSDB, "s390_vfsdb", XREG, XREG, XREG)
1511+
MINI_OP(OP_S390_VMLB, "s390_vmlb", XREG, XREG, XREG)
1512+
MINI_OP(OP_S390_VMLHW, "s390_vmlhw", XREG, XREG, XREG)
1513+
MINI_OP(OP_S390_VMLF, "s390_vmlf", XREG, XREG, XREG)
1514+
MINI_OP(OP_S390_VFMSB, "s390_vfmsb", XREG, XREG, XREG)
1515+
MINI_OP(OP_S390_VFMDB, "s390_vfmdb", XREG, XREG, XREG)
1516+
MINI_OP(OP_S390_VFDSB, "s390_vfdsb", XREG, XREG, XREG)
1517+
MINI_OP(OP_S390_VFDDB, "s390_vfddb", XREG, XREG, XREG)
1518+
MINI_OP(OP_S390_VMXB, "s390_vmxb", XREG, XREG, XREG)
1519+
MINI_OP(OP_S390_VMXH, "s390_vmxh", XREG, XREG, XREG)
1520+
MINI_OP(OP_S390_VMXF, "s390_vmxf", XREG, XREG, XREG)
1521+
MINI_OP(OP_S390_VMXG, "s390_vmxg", XREG, XREG, XREG)
1522+
MINI_OP(OP_S390_VFMAXSB, "s390_vfmaxsb", XREG, XREG, XREG)
1523+
MINI_OP(OP_S390_VFMAXDB, "s390_vfmaxdb", XREG, XREG, XREG)
1524+
MINI_OP(OP_S390_VMNB, "s390_vmnb", XREG, XREG, XREG)
1525+
MINI_OP(OP_S390_VMNH, "s390_vmnh", XREG, XREG, XREG)
1526+
MINI_OP(OP_S390_VMNF, "s390_vmnf", XREG, XREG, XREG)
1527+
MINI_OP(OP_S390_VMNG, "s390_vmng", XREG, XREG, XREG)
1528+
MINI_OP(OP_S390_VFMINSB, "s390_vfminsb", XREG, XREG, XREG)
1529+
MINI_OP(OP_S390_VFMINDB, "s390_vfmindb", XREG, XREG, XREG)
1530+
MINI_OP(OP_S390_VMXLB, "s390_vmxlb", XREG, XREG, XREG)
1531+
MINI_OP(OP_S390_VMXLH, "s390_vmxlh", XREG, XREG, XREG)
1532+
MINI_OP(OP_S390_VMXLF, "s390_vmxlf", XREG, XREG, XREG)
1533+
MINI_OP(OP_S390_VMXLG, "s390_vmxlg", XREG, XREG, XREG)
1534+
MINI_OP(OP_S390_VMNLB, "s390_vmnlb", XREG, XREG, XREG)
1535+
MINI_OP(OP_S390_VMNLH, "s390_vmnlh", XREG, XREG, XREG)
1536+
MINI_OP(OP_S390_VMNLF, "s390_vmnlf", XREG, XREG, XREG)
1537+
MINI_OP(OP_S390_VMNLG, "s390_vmnlg", XREG, XREG, XREG)
1538+
MINI_OP(OP_S390_VO, "s390_vo", XREG, XREG, XREG)
1539+
MINI_OP(OP_S390_VNO, "s390_vno", XREG, XREG, XREG)
1540+
MINI_OP(OP_S390_VX, "s390_vx", XREG, XREG, XREG)
1541+
MINI_OP(OP_S390_VN, "s390_vn", XREG, XREG, XREG)
1542+
MINI_OP(OP_S390_VNN, "s390_vnn", XREG, XREG, XREG)
1543+
MINI_OP(OP_S390_VSUMB, "s390_vsumb", XREG, XREG, XREG)
1544+
MINI_OP(OP_S390_VSUMH, "s390_vsumh", XREG, XREG, XREG)
1545+
MINI_OP(OP_S390_VSUMQF, "s390_vsumqf", XREG, XREG, XREG)
1546+
MINI_OP(OP_S390_VSUMQG, "s390_vsumqg", XREG, XREG, XREG)
1547+
MINI_OP(OP_S390_VPERM, "s390_vperm", XREG, XREG, XREG)
1548+
MINI_OP(OP_S390_VREPIB, "s390_vrepib", XREG, NONE, NONE)
1549+
MINI_OP(OP_S390_VREPIH, "s390_vrepih", XREG, NONE, NONE)
1550+
MINI_OP(OP_S390_VREPIF, "s390_vrepif", XREG, NONE, NONE)
1551+
MINI_OP(OP_S390_VREPIG, "s390_vrepig", XREG, NONE, NONE)
1552+
MINI_OP(OP_S390_VFSQSB, "s390_vfsqsb", XREG, XREG, NONE)
1553+
MINI_OP(OP_S390_VFSQDB, "s390_vfsqdb", XREG, XREG, NONE)
1554+
MINI_OP(OP_S390_VFCESBS, "s390_vfcesbs", XREG, XREG, XREG)
1555+
MINI_OP(OP_S390_VFCEDBS, "s390_vfcedbs", XREG, XREG, XREG)
1556+
MINI_OP(OP_S390_VFCHSBS, "s390_vfchsbs", XREG, XREG, XREG)
1557+
MINI_OP(OP_S390_VFCHDBS, "s390_vfchdbs", XREG, XREG, XREG)
1558+
MINI_OP(OP_S390_VFCESB, "s390_vfcesb", XREG, XREG, XREG)
1559+
MINI_OP(OP_S390_VFCEDB, "s390_vfcedb", XREG, XREG, XREG)
1560+
MINI_OP(OP_S390_VFCHSB, "s390_vfchsb", XREG, XREG, XREG)
1561+
MINI_OP(OP_S390_VFCHDB, "s390_vfchdb", XREG, XREG, XREG)
1562+
MINI_OP(OP_S390_VCEQBS, "s390_vceqbs", XREG, XREG, XREG)
1563+
MINI_OP(OP_S390_VCEQHS, "s390_vceqhs", XREG, XREG, XREG)
1564+
MINI_OP(OP_S390_VCEQFS, "s390_vceqfs", XREG, XREG, XREG)
1565+
MINI_OP(OP_S390_VCEQGS, "s390_vceqgs", XREG, XREG, XREG)
1566+
MINI_OP(OP_S390_VCEQB, "s390_vceqb", XREG, XREG, XREG)
1567+
MINI_OP(OP_S390_VCEQH, "s390_vceqh", XREG, XREG, XREG)
1568+
MINI_OP(OP_S390_VCEQF, "s390_vceqf", XREG, XREG, XREG)
1569+
MINI_OP(OP_S390_VCEQG, "s390_vceqg", XREG, XREG, XREG)
1570+
MINI_OP(OP_S390_VGMB, "s390_vgmb", XREG, IREG, IREG)
1571+
MINI_OP(OP_S390_VGMH, "s390_vgmh", XREG, IREG, IREG)
1572+
MINI_OP(OP_S390_VGMF, "s390_vgmf", XREG, IREG, IREG)
1573+
MINI_OP(OP_S390_VGMG, "s390_vgmg", XREG, IREG, IREG)
1574+
MINI_OP(OP_S390_VECB, "s390_vecb", XREG, XREG, NONE)
1575+
MINI_OP(OP_S390_VECF, "s390_vecf", XREG, XREG, NONE)
1576+
MINI_OP(OP_S390_VECH, "s390_vech", XREG, XREG, NONE)
1577+
MINI_OP(OP_S390_VECG, "s390_vecg", XREG, XREG, NONE)
1578+
MINI_OP(OP_S390_VECLB, "s390_veclb", XREG, XREG, NONE)
1579+
MINI_OP(OP_S390_VECLF, "s390_veclf", XREG, XREG, NONE)
1580+
MINI_OP(OP_S390_VECLH, "s390_veclh", XREG, XREG, NONE)
1581+
MINI_OP(OP_S390_VECLG, "s390_veclg", XREG, XREG, NONE)
1582+
MINI_OP(OP_S390_VCHBS, "s390_vchbs", XREG, XREG, XREG)
1583+
MINI_OP(OP_S390_VCHHS, "s390_vchhs", XREG, XREG, XREG)
1584+
MINI_OP(OP_S390_VCHFS, "s390_vchfs", XREG, XREG, XREG)
1585+
MINI_OP(OP_S390_VCHGS, "s390_vchgs", XREG, XREG, XREG)
1586+
MINI_OP(OP_S390_VCHB, "s390_vchb", XREG, XREG, XREG)
1587+
MINI_OP(OP_S390_VCHH, "s390_vchh", XREG, XREG, XREG)
1588+
MINI_OP(OP_S390_VCHF, "s390_vchf", XREG, XREG, XREG)
1589+
MINI_OP(OP_S390_VCHG, "s390_vchg", XREG, XREG, XREG)
1590+
MINI_OP(OP_S390_VCHLBS, "s390_vchlbs", XREG, XREG, XREG)
1591+
MINI_OP(OP_S390_VCHLHS, "s390_vchlhs", XREG, XREG, XREG)
1592+
MINI_OP(OP_S390_VCHLFS, "s390_vchlfs", XREG, XREG, XREG)
1593+
MINI_OP(OP_S390_VCHLGS, "s390_vchlgs", XREG, XREG, XREG)
1594+
MINI_OP(OP_S390_VCHLB, "s390_vchlb", XREG, XREG, XREG)
1595+
MINI_OP(OP_S390_VCHLH, "s390_vchlh", XREG, XREG, XREG)
1596+
MINI_OP(OP_S390_VCHLF, "s390_vchlf", XREG, XREG, XREG)
1597+
MINI_OP(OP_S390_VCHLG, "s390_vchlg", XREG, XREG, XREG)
1598+
MINI_OP(OP_S390_VFCHESBS, "s390_vfchesbs", XREG, XREG, XREG)
1599+
MINI_OP(OP_S390_VFCHEDBS, "s390_vfchedbs", XREG, XREG, XREG)
1600+
MINI_OP(OP_S390_VFCHESB, "s390_vfchesb", XREG, XREG, XREG)
1601+
MINI_OP(OP_S390_VFCHEDB, "s390_vfchedb", XREG, XREG, XREG)
1602+
MINI_OP(OP_S390_VLPB, "s390_vlpb", XREG, XREG, NONE)
1603+
MINI_OP(OP_S390_VLPH, "s390_vlph", XREG, XREG, NONE)
1604+
MINI_OP(OP_S390_VLPF, "s390_vlpf", XREG, XREG, NONE)
1605+
MINI_OP(OP_S390_VLPG, "s390_vlpg", XREG, XREG, NONE)
1606+
MINI_OP(OP_S390_VFLPDB, "s390_vflpdb", XREG, XREG, NONE)
1607+
MINI_OP(OP_S390_VFLPSB, "s390_vflpsb", XREG, XREG, NONE)
1608+
MINI_OP(OP_S390_VFLCDB, "s390_vflcdb", XREG, XREG, NONE)
1609+
MINI_OP(OP_S390_VFLCSB, "s390_vflcsb", XREG, XREG, NONE)
1610+
MINI_OP(OP_S390_VPKH, "s390_vpkh", XREG, XREG, XREG)
1611+
MINI_OP(OP_S390_VPKF, "s390_vpkf", XREG, XREG, XREG)
1612+
MINI_OP(OP_S390_VPKG, "s390_vpkg", XREG, XREG, XREG)
1613+
MINI_OP(OP_S390_VLCB, "s390_vlcb", XREG, XREG, NONE)
1614+
MINI_OP(OP_S390_VLCH, "s390_vlch", XREG, XREG, NONE)
1615+
MINI_OP(OP_S390_VLCF, "s390_vlcf", XREG, XREG, NONE)
1616+
MINI_OP(OP_S390_VLCG, "s390_vlcg", XREG, XREG, NONE)
1617+
MINI_OP(OP_S390_VUPHB, "s390_vuphb", XREG, XREG, NONE)
1618+
MINI_OP(OP_S390_VUPHH, "s390_vuphh", XREG, XREG, NONE)
1619+
MINI_OP(OP_S390_VUPHF, "s390_vuphf", XREG, XREG, NONE)
1620+
MINI_OP(OP_S390_VUPLB, "s390_vuplb", XREG, XREG, NONE)
1621+
MINI_OP(OP_S390_VUPLHW, "s390_vuplhw", XREG, XREG, NONE)
1622+
MINI_OP(OP_S390_VUPLF, "s390_vuplf", XREG, XREG, NONE)
1623+
MINI_OP(OP_S390_VUPLHB, "s390_vuplhb", XREG, XREG, NONE)
1624+
MINI_OP(OP_S390_VUPLHH, "s390_vuplhh", XREG, XREG, NONE)
1625+
MINI_OP(OP_S390_VUPLHF, "s390_vuplhf", XREG, XREG, NONE)
1626+
MINI_OP(OP_S390_VUPLLB, "s390_vupllb", XREG, XREG, NONE)
1627+
MINI_OP(OP_S390_VUPLLH, "s390_vupllh", XREG, XREG, NONE)
1628+
MINI_OP(OP_S390_VUPLLF, "s390_vupllf", XREG, XREG, NONE)
1629+
MINI_OP(OP_S390_VFISB, "s390_vfidb", XREG, XREG, NONE)
1630+
MINI_OP(OP_S390_VFIDB, "s390_vfisb", XREG, XREG, NONE)
1631+
MINI_OP(OP_S390_XCOMPARE_XEXTRACT, "s390_xcompare_xextract", IREG, XREG, XREG)
15011632
#endif
15021633

15031634
#if defined(TARGET_ARM64)
@@ -1862,7 +1993,6 @@ MINI_OP(OP_SIMD_LOAD_SCALAR_R8, "simd_load_scalar_r8", XREG, IREG, NONE)
18621993
MINI_OP(OP_SIMD_STORE, "simd_store", NONE, XREG, XREG)
18631994

18641995
#if defined(TARGET_ARM64) || defined(TARGET_AMD64) || defined(TARGET_WASM)
1865-
MINI_OP(OP_ONES_COMPLEMENT, "ones_complement", XREG, XREG, NONE)
18661996
MINI_OP(OP_CVT_FP_UI, "convert_fp_to_ui", XREG, XREG, NONE)
18671997
MINI_OP(OP_CVT_FP_SI, "convert_fp_to_si", XREG, XREG, NONE)
18681998
MINI_OP(OP_CVT_FP_UI_SCALAR, "convert_fp_to_ui_scalar", XREG, XREG, NONE)
@@ -1872,11 +2002,17 @@ MINI_OP(OP_CVT_SI_FP, "convert_si_to_fp", XREG, XREG, NONE)
18722002
MINI_OP(OP_CVT_UI_FP_SCALAR, "convert_ui_to_fp_scalar", XREG, XREG, NONE)
18732003
MINI_OP(OP_CVT_SI_FP_SCALAR, "convert_si_to_fp_scalar", XREG, XREG, NONE)
18742004
/* inst_c1 is one of the MONO_TYPE_ constants */
1875-
MINI_OP(OP_NEGATION, "negate", XREG, XREG, NONE)
18762005
MINI_OP(OP_NEGATION_SCALAR, "negate_scalar", XREG, XREG, NONE)
2006+
#endif // TARGET_ARM64 || TARGET_AMD64 || TARGET_WASM
2007+
2008+
#if defined(TARGET_ARM64) || defined(TARGET_AMD64) || defined(TARGET_WASM) || defined(TARGET_S390X)
2009+
MINI_OP(OP_NEGATION, "negate", XREG, XREG, NONE)
2010+
MINI_OP(OP_ONES_COMPLEMENT, "ones_complement", XREG, XREG, NONE)
18772011
/* Select bits from src2/src3 using src1 */
18782012
MINI_OP3(OP_BSL, "bitwise_select", XREG, XREG, XREG, XREG)
1879-
#endif // TARGET_ARM64 || TARGET_AMD64 || TARGET_WASM
2013+
MINI_OP(OP_VECTOR_ANDN, "vector_andnot", XREG, XREG, XREG)
2014+
MINI_OP(OP_VECTOR_IABS, "vector_integer_abs", XREG, XREG, NONE)
2015+
#endif
18802016

18812017
#if defined(TARGET_RISCV64) || defined(TARGET_RISCV32)
18822018
MINI_OP(OP_RISCV_EXC_BEQ, "riscv_exc_beq", NONE, IREG, IREG)

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)