Add z14 support and extend z13 support
authorNeale Ferguson <neale@sinenomine.net>
Thu, 31 Aug 2017 20:40:06 +0000 (16:40 -0400)
committerBernhard Urban <bernhard.urban@xamarin.com>
Wed, 6 Sep 2017 10:09:13 +0000 (12:09 +0200)
mono/arch/s390x/s390x-codegen.h
mono/mini/mini-s390x.c
mono/utils/mono-hwcap-s390x.c
mono/utils/mono-hwcap-vars.h

index 695e318267dfcdb054690188fab29f3f710eac11..9c3750e213bc319bb3241a9c7934f59237b520db 100644 (file)
@@ -1131,6 +1131,7 @@ typedef struct {
 #define s390_agf(c, r, x, b, d)                S390_RXY(c, 0xe318, r, x, b, d)
 #define s390_agfi(c, r, v)             S390_RIL_1(c, 0xc28, r, v)
 #define s390_afgr(c, r1, r2)           S390_RRE(c, 0xb918, r1, r2)
+#define s390_agh(c, r, x, b, d)                S390_RXY(c, 0xe338, r, b, d)
 #define s390_aghi(c, r, v)             S390_RI(c, 0xa7b, r, v)
 #define s390_aghik(c, r1, r3, v)       S390_RIE_1(c, 0xecd9, r1, r3, v)
 #define s390_agr(c, r1, r2)            S390_RRE(c, 0xb908, r1, r2)
@@ -1154,6 +1155,7 @@ typedef struct {
 #define s390_algfr(c, r1, r2)          S390_RRE(c, 0xb91a, r1, r2)
 #define s390_alghsik(c, r1, r3, v)     S390_RIE_1(c, 0xecdb, r1, r3, v)
 #define s390_algr(c, r1, r2)           S390_RRE(c, 0xb90a, r1, r2)
+#define s390_algrk(c, r1, r2, r3)      S390_RRF_1(c, 0xb9ea, r1, r2, r3)
 #define s390_algsi(c, d1, b1, i2)      S390_SIY_1(c, 0xeb7e, d1, b1, i2)
 #define s390_alhhhr(c, r1, r2, r3)     S390_RRF_1(c, 0xb9ca, r1, r2, r3)
 #define s390_alhhlr(c, r1, r2, r3)     S390_RRF_1(c, 0xb9da, r1, r2, r3)
@@ -1172,6 +1174,8 @@ typedef struct {
 #define s390_basr(c, r1, r2)           S390_RR(c, 0x0d, r1, r2)
 #define s390_bctr(c, r1, r2)           S390_RR(c, 0x06, r1, r2)
 #define s390_bctrg(c, r1, r2)          S390_RRE(c, 0xb946, r1, r2)
+#define s390_bi(c, x, b, d)            S390_RXY(c, 0xe347, S390_CC_UN, x, b, d)
+#define s390_bic(c, m, x, b, d)                S390_RXY(c, 0xe347, m, x, b, d)
 #define s390_bnzr(c, r)                        S390_RR(c, 0x07, 0x07, r)
 #define s390_bras(c, r, o)             S390_RI(c, 0xa75, r, o)
 #define s390_brasl(c, r, o)            S390_RIL_1(c, 0xc05, r, o)
@@ -1327,11 +1331,13 @@ typedef struct {
 #define s390_lgfi(c, r, v)             S390_RIL_1(c, 0xc01, r, v)
 #define s390_lgfrl(c, r1, d)           S390_RIL_1(c, 0xc4c, r1, d)
 #define s390_lgfr(c, r1, r2)           S390_RRE(c, 0xb914, r1, r2)
+#define s390_lgg(c, r, x, b, d)                S390_RXY(c, 0xe34c, r, x, b, d)
 #define s390_lgh(c, r, x, b, d)                S390_RXY(c, 0xe315, r, x, b, d)
 #define s390_lghi(c, r, v)             S390_RI(c, 0xa79, r, v)
 #define s390_lghr(c, r1, r2)           S390_RRE(c, 0xb907, r1, r2)
 #define s390_lgr(c, r1, r2)            S390_RRE(c, 0xb904, r1, r2)
 #define s390_lgrl(c, r1, d)            S390_RIL_1(c, 0xc48, r1, d)
+#define s390_lgsc(c, r, x, b, d)       S390_RXY(c, 0xe34d, r, x, b, d)
 #define s390_lh(c, r, x, b, d)         S390_RX(c, 0x48, r, x, b, d)
 #define s390_lhr(c, r1, r2)            S390_RRE(c, 0xb927, r1, r2)
 #define s390_lhg(c, r, x, b, d)                S390_RXY(c, 0xe315, r, x, b, d)
@@ -1344,6 +1350,7 @@ typedef struct {
 #define s390_llgfr(c, r1, r2)          S390_RRE(c, 0xb916, r1, r2)
 #define s390_llgh(c, r, x, b, d)       S390_RXY(c, 0xe391, r, x, b, d)
 #define s390_llghr(c, r1, r2)          S390_RRE(c, 0xb985, r1, r2)
+#define s390_llgfsg(c, r, x, b, d)     S390_RXY(c, 0xe348, r, x, b, d)
 #define s390_llhr(c, r1, r2)           S390_RRE(c, 0xb995, r1, r2)
 #define s390_llihf(c, r, v)            S390_RIL_1(c, 0xc0e, r, v)
 #define s390_llihh(c, r, v)            S390_RI(c, 0xa5c, r, v)
@@ -1371,15 +1378,19 @@ typedef struct {
 #define s390_m(c, r, x, b, d)          S390_RX(c, 0x5c, r, x, b, d)
 #define s390_mdbr(c, r1, r2)           S390_RRE(c, 0xb31c, r1, r2)
 #define s390_meebr(c, r1, r2)          S390_RRE(c, 0xb317, r1, r2)
+#define s390_mg(c, r, x, b, d)         S390_RXY(c, 0xe384, r, x, b, d)
+#define s390_mgh(c, r, x, b, d)                S390_RXY(c, 0xe33c, r, x, b, d)
+#define s390_mgrk(c, r1, r2, r3)       S390_RRF_1(c, 0xb9ec, r1, r2, r3)
 #define s390_mfy(c, r, x, b, d)                S390_RXY(c, 0xe35c, r, x, b, d)
 #define s390_mlgr(c, r1, r2)           S390_RRE(c, 0xb986, r1, r2)
 #define s390_mlr(c, r1, r2)            S390_RRE(c, 0xb996, r1, r2)
 #define s390_mr(c, r1, r2)             S390_RR(c, 0x1c, r1, r2)
 #define s390_ms(c, r, x, b, d)         S390_RX(c, 0x71, r, x, b, d)
-#define s390_msi(c, r, v)              S390_RIL_1(c, 0xc21, r, v)
+#define s390_msfi(c, r, v)             S390_RIL_1(c, 0xc20, r, v)
+#define s390_msgfi(c, r, v)            S390_RIL_1(c, 0xc21, r, v)
 #define s390_msgfr(c, r1, r2)          S390_RRE(c, 0xb91c, r1, r2)
-#define s390_msgi(c, r, v)             S390_RIL_1(c, 0xc20, r, v)
 #define s390_msgr(c, r1, r2)           S390_RRE(c, 0xb90c, r1, r2)
+#define s390_msgrkc(c, r1, r2, r3)     S390_RRF_1(c, 0xb9ed, r1, r2, r3)
 #define s390_msr(c, r1, r2)            S390_RRE(c, 0xb252, r1, r2)
 #define s390_mvc(c, l, b1, d1, b2, d2) S390_SS_1(c, 0xd2, l, b1, d1, b2, d2)
 #define s390_mvcl(c, r1, r2)           S390_RR(c, 0x0e, r1, r2)
@@ -1421,6 +1432,7 @@ typedef struct {
 #define s390_sebr(c, r1, r2)           S390_RRE(c, 0xb30b, r1, r2)
 #define s390_sg(c, r, x, b, d)         S390_RXY(c, 0xe309, r, x, b, d)
 #define s390_sgf(c, r, x, b, d)                S390_RXY(c, 0xe319, r, x, b, d)
+#define s390_sgh(c, r, x, b, d)                S390_RXY(c, 0xe339, r, x, b, d)
 #define s390_sgr(c, r1, r2)            S390_RRE(c, 0xb909, r1, r2)
 #define s390_sgrk(c, r1, r2, r3)       S390_RRF_1(c, 0xb9e9, r1, r2, r3)
 #define s390_sl(c, r, x, b, d)         S390_RX(c, 0x5f, r, x, b, d)
@@ -1437,9 +1449,11 @@ typedef struct {
 #define s390_slgfr(c, r1, r2)          S390_RRE(c, 0xb91b, r1, r2)
 #define s390_slgfi(c, r, v)            S390_RIL_1(c, 0xc24, r, v)
 #define s390_slgr(c, r1, r2)           S390_RRE(c, 0xb90b, r1, r2)
+#define s390_slgrk(c, r1, r2, r3)      S390_RRF_1(c, 0xb9eb, r1, r2, r3)
 #define s390_sll(c, r, b, d)           S390_RS_3(c, 0x89, r, b, d) 
 #define s390_sllg(c, r1, r2, b, d)     S390_RSY_1(c, 0xeb0d, r1, r2, b, d) 
 #define s390_slr(c, r1, r2)            S390_RR(c, 0x1f, r1, r2)
+#define s390_slrk(c, r1, r2, r3)       S390_RRF_1(c, 0xb9fb, r1, r2, r3)
 #define s390_sqdbr(c, r1, r2)          S390_RRE(c, 0xb315, r1, r2)
 #define s390_sqebr(c, r1, r2)          S390_RRE(c, 0xb314, r1, r2)
 #define s390_sra(c, r, b, d)           S390_RS_3(c, 0x8a, r, b, d) 
@@ -1447,6 +1461,7 @@ typedef struct {
 #define s390_sr(c, r1, r2)             S390_RR(c, 0x1b, r1, r2)
 #define s390_srda(c, r, b, d)          S390_RS_3(c, 0x8e, r, b, d) 
 #define s390_srdl(c, r, b, d)          S390_RS_3(c, 0x8c, r, b, d) 
+#define s390_srk(c, r1, r2, r3)                S390_RRF_1(c, 0xb9f9, r1, r2, r3)
 #define s390_srl(c, r, b, d)           S390_RS_3(c, 0x88, r, b, d) 
 #define s390_srlg(c, r1, r2, b, d)     S390_RSY_1(c, 0xeb0c, r1, r2, b, d) 
 #define s390_st(c, r, x, b, d)         S390_RX(c, 0x50, r, x, b, d)
@@ -1461,6 +1476,7 @@ typedef struct {
 #define s390_stey(c, r, x, b, d)       S390_RXY(c, 0xed66, r, x, b, d)
 #define s390_stfpc(c, b, d)            S390_S(c, 0xb29c, b, d)
 #define s390_stg(c, r, x, b, d)                S390_RXY(c, 0xe324, r, x, b, d)
+#define s390_stgsc(c, r, x, b, d)      S390_RXY(c, 0xe349, r, x, b, d)
 #define s390_sth(c, r, x, b, d)                S390_RX(c, 0x40, r, x, b, d)
 #define s390_sthy(c, r, x, b, d)       S390_RXY(c, 0xe370, r, x, b, d)
 #define s390_stm(c, r1, r2, b, d)      S390_RS_1(c, 0x90, r1, r2, b, d)
index 8e82dfa0ccabaccba02d16c6d25542d0895fb87d..584813cc4db9caa812d9b5f4c9d75382cb6358f0 100644 (file)
@@ -3717,33 +3717,43 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        if (ins->dreg != ins->sreg1) {
                                s390_lgr  (code, ins->dreg, ins->sreg1);
                        }
-                       if (s390_is_imm16 (ins->inst_imm)) {
-                               s390_lghi (code, s390_r13, ins->inst_imm);
-                       } else if (s390_is_imm32 (ins->inst_imm)) {
-                               s390_lgfi (code, s390_r13, ins->inst_imm);
+                       if ((mono_hwcap_s390x_has_gie) &&
+                           (s390_is_imm32 (ins->inst_imm))) {
+                               s390_msgfi (code, ins->dreg, ins->inst_imm);
                        } else {
-                               S390_SET (code, s390_r13, ins->inst_imm);
+                               if (s390_is_imm16 (ins->inst_imm)) {
+                                       s390_lghi (code, s390_r13, ins->inst_imm);
+                               } else if (s390_is_imm32 (ins->inst_imm)) {
+                                       s390_lgfi (code, s390_r13, ins->inst_imm);
+                               } else {
+                                       S390_SET (code, s390_r13, ins->inst_imm);
+                               }
+                               s390_msgr (code, ins->dreg, s390_r13);
                        }
-                       s390_msgr (code, ins->dreg, s390_r13);
                }
                        break;
                case OP_LMUL_OVF: {
                        short int *o[2];
-                       s390_ltgr (code, s390_r1, ins->sreg1);
-                       s390_jz   (code, 0); CODEPTR(code, o[0]);
-                       s390_ltgr (code, s390_r0, ins->sreg2);
-                       s390_jnz  (code, 6);
-                       s390_lghi (code, s390_r1, 0);
-                       s390_j    (code, 0); CODEPTR(code, o[1]);
-                       s390_xgr  (code, s390_r0, s390_r1);
-                       s390_msgr (code, s390_r1, ins->sreg2);
-                       s390_xgr  (code, s390_r0, s390_r1);
-                       s390_srlg (code, s390_r0, s390_r0, 0, 63);
-                       s390_ltgr (code, s390_r0, s390_r0);
-                       EMIT_COND_SYSTEM_EXCEPTION (S390_CC_NZ, "OverflowException");
-                       PTRSLOT   (code, o[0]); 
-                       PTRSLOT   (code, o[1]);
-                       s390_lgr  (code, ins->dreg, s390_r1);
+                       if (mono_hwcap_s390x_has_mie2) {
+                               s390_msgrkc (code, ins->dreg, ins->sreg1, ins->sreg2);
+                               EMIT_COND_SYSTEM_EXCEPTION (S390_CC_OV, "OverflowException");
+                       } else {
+                               s390_ltgr (code, s390_r1, ins->sreg1);
+                               s390_jz   (code, 0); CODEPTR(code, o[0]);
+                               s390_ltgr (code, s390_r0, ins->sreg2);
+                               s390_jnz  (code, 6);
+                               s390_lghi (code, s390_r1, 0);
+                               s390_j    (code, 0); CODEPTR(code, o[1]);
+                               s390_xgr  (code, s390_r0, s390_r1);
+                               s390_msgr (code, s390_r1, ins->sreg2);
+                               s390_xgr  (code, s390_r0, s390_r1);
+                               s390_srlg (code, s390_r0, s390_r0, 0, 63);
+                               s390_ltgr (code, s390_r0, s390_r0);
+                               EMIT_COND_SYSTEM_EXCEPTION (S390_CC_NZ, "OverflowException");
+                               PTRSLOT   (code, o[0]); 
+                               PTRSLOT   (code, o[1]);
+                               s390_lgr  (code, ins->dreg, s390_r1);
+                       }
                }
                        break;
                case OP_LMUL_OVF_UN: {
@@ -3798,26 +3808,42 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_LADD_OVF:
                case OP_S390_LADD_OVF: {
-                       CHECK_SRCDST_COM;
-                       s390_agr    (code, ins->dreg, src2);
+                       if (mono_hwcap_s390x_has_mlt) {
+                               s390_agrk (code, ins->dreg, ins->sreg1, ins->sreg2);
+                       } else { 
+                               CHECK_SRCDST_COM;
+                               s390_agr    (code, ins->dreg, src2);
+                       }
                        EMIT_COND_SYSTEM_EXCEPTION (S390_CC_OV, "OverflowException");
                }
                        break;
                case OP_LADD_OVF_UN:
                case OP_S390_LADD_OVF_UN: {
-                       CHECK_SRCDST_COM;
-                       s390_algr  (code, ins->dreg, src2);
+                       if (mono_hwcap_s390x_has_mlt) {
+                               s390_algrk (code, ins->dreg, ins->sreg1, ins->sreg2);
+                       } else { 
+                               CHECK_SRCDST_COM;
+                               s390_algr  (code, ins->dreg, src2);
+                       }
                        EMIT_COND_SYSTEM_EXCEPTION (S390_CC_CY, "OverflowException");
                }
                        break;
                case OP_ISUBCC: {
-                       CHECK_SRCDST_NCOM_I;
-                       s390_slgr (code, ins->dreg, src2);
+                       if (mono_hwcap_s390x_has_mlt) {
+                               s390_slgrk (code, ins->dreg, ins->sreg1, ins->sreg2);
+                       } else {
+                               CHECK_SRCDST_NCOM_I;
+                               s390_slgr (code, ins->dreg, src2);
+                       }
                }
                        break;
                case OP_ISUB: {
-                       CHECK_SRCDST_NCOM_I;
-                       s390_sgr  (code, ins->dreg, src2);
+                       if (mono_hwcap_s390x_has_mlt) {
+                               s390_sgrk (code, ins->dreg, ins->sreg1, ins->sreg2);
+                       } else {
+                               CHECK_SRCDST_NCOM_I;
+                               s390_sgr  (code, ins->dreg, src2);
+                       }
                }
                        break;
                case OP_ISBB: {
@@ -3843,24 +3869,37 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_ISUB_OVF:
                case OP_S390_ISUB_OVF: {
-                       CHECK_SRCDST_NCOM;
-                       s390_sr   (code, ins->dreg, src2);
-                       EMIT_COND_SYSTEM_EXCEPTION (S390_CC_OV, "OverflowException");
-                       s390_lgfr (code, ins->dreg, ins->dreg);
+                       if (mono_hwcap_s390x_has_mlt) {
+                               s390_srk (code, ins->dreg, ins->sreg1, ins->sreg2);
+                               EMIT_COND_SYSTEM_EXCEPTION (S390_CC_OV, "OverflowException");
+                       } else { 
+                               CHECK_SRCDST_NCOM;
+                               s390_sr   (code, ins->dreg, src2);
+                               EMIT_COND_SYSTEM_EXCEPTION (S390_CC_OV, "OverflowException");
+                               s390_lgfr (code, ins->dreg, ins->dreg);
+                       }
                }
                        break;
                case OP_ISUB_OVF_UN:
                case OP_S390_ISUB_OVF_UN: {
-                       CHECK_SRCDST_NCOM;
-                       s390_slr  (code, ins->dreg, src2);
+                       if (mono_hwcap_s390x_has_mlt) {
+                               s390_slrk  (code, ins->dreg, ins->sreg1, ins->sreg2);
+                       } else {
+                               CHECK_SRCDST_NCOM;
+                               s390_slr  (code, ins->dreg, src2);
+                       }
                        EMIT_COND_SYSTEM_EXCEPTION (S390_CC_NC, "OverflowException");
                        s390_llgfr(code, ins->dreg, ins->dreg);
                }
                        break;
                case OP_LSUB_OVF:
                case OP_S390_LSUB_OVF: {
-                       CHECK_SRCDST_NCOM;
-                       s390_sgr   (code, ins->dreg, src2);
+                       if (mono_hwcap_s390x_has_mlt) {
+                               s390_sgrk  (code, ins->dreg, ins->sreg1, ins->sreg2);
+                       } else {
+                               CHECK_SRCDST_NCOM;
+                               s390_sgr   (code, ins->dreg, src2);
+                       }
                        EMIT_COND_SYSTEM_EXCEPTION (S390_CC_OV, "OverflowException");
                }
                        break;
index 40318232c2134f68563a10d855b52987092c52e5..f6a6dfa9a5aebce012f9554ca65a196210810611 100644 (file)
@@ -63,7 +63,7 @@ typedef struct {
        uint8_t ee:1;           // 035 - Execute extensions
        uint8_t em:1;           // 036 - Enhanced monitor
        uint8_t fpe:1;          // 037 - Floating point extension
-       uint8_t x001:1;         // 038 - Undefined
+       uint8_t opcf:1;         // 038 - Order-preserving-compression facility
        uint8_t ibm03:1;        // 039 - Assigned to IBM
        uint8_t spp:1;          // 040 - Set program parameters
        uint8_t fpse:1;         // 041 - FP support enhancement
@@ -79,11 +79,11 @@ typedef struct {
        uint8_t ltlb:1;         // 051 - Local TLB clearing
        uint8_t ia:1;           // 052 - Interlocked access
        uint8_t lsoc2:1;        // 053 - Load/store on CC 2
-       uint8_t x002:1;         // 054 - Undefined
+       uint8_t eecf:1;         // 054 - Entropy-encoding compression facility
        uint8_t ibm05:1;        // 055 - Assigned to IBM
        uint8_t x003:1;         // 056 - Undefined
        uint8_t msa5:1;         // 057 - Message security assist 5
-       uint8_t x004:1;         // 058 - Undefined
+       uint8_t mie2:1;         // 058 - Miscellaneous execution facility 2
        uint8_t x005:1;         // 059 - Undefined
        uint8_t x006:1;         // 060 - Undefined
        uint8_t x007:1;         // 061 - Undefined
@@ -110,11 +110,27 @@ typedef struct {
        uint8_t x012[5];        // 088-127 - Undefined
        uint8_t ibm12:1;        // 128 - Assigned to IBM
        uint8_t vec:1;          // 129 - Vector facility
-       uint8_t x013:6;         // 130-135 - Undefined
-       uint8_t x014:6;         // 136-141 - Undefined
+       uint8_t iep:1;          // 130 - Instruction Execution Protection Facility
+       uint8_t sea:1;          // 131 - Side-effect-access Faility
+       uint8_t x013:1;         // 132 - Undefined
+       uint8_t gs:1;           // 133 - Guarded Storage Facility
+       uint8_t vpd:1;          // 134 - Vector Packed Decimal Facility
+       uint8_t ve1:1;          // 135 - Vector Enhancements Facilityty
+       uint8_t x014:2;         // 136-137 - Undefined
+       uint8_t cazm:1;         // 138 - Configuration-z/Architecture-arcitectural -mode Faciliy
+       uint8_t mef:1;          // 139 - Multiple-epoch Facility ture-arcitectural -mode Faciliy
+       uint8_t ibm13:2;        // 140-141 - Assigned to IBM
        uint8_t sccm:1;         // 142 - Store CPU counter multiple
-       uint8_t ibm13:1;        // 143 - Assigned to IBM
-       uint8_t x015[14];       // 144-256 Undefined
+       uint8_t x015:1;         // 143 - Assigned to IBM
+       uint8_t tpei:1;         // 144 - Test Pending External Interrption Facility
+       uint8_t irbm:1;         // 145 - Insert Reference Bits Multiple Facility
+       uint8_t mse8:1;         // 146 - Message Security Assist Extension 8
+       uint8_t ibm14:1;        // 147 - Reserved for IBM use
+       uint8_t x016:4;         // 148-151 - Undefined
+       uint8_t x017[2];        // 152-167 - Undefined
+       uint8_t esac:1;         // 168 - ESA/390 Compatibility Mode Facility
+       uint8_t x018:7;         // 169-175 - Undefined
+       uint8_t x019[10];       // 176-256 Undefined
 } __attribute__ ((__packed__)) __attribute__ ((__aligned__(8))) facilityList_t;
 
 void
@@ -131,9 +147,11 @@ mono_hwcap_arch_init (void)
                : "0", "cc"
        );
 
-       mono_hwcap_s390x_has_fpe = facs.fpe;
-       mono_hwcap_s390x_has_vec = facs.vec;
-       mono_hwcap_s390x_has_mlt = facs.multi;
-       mono_hwcap_s390x_has_ia  = facs.ia;
-       mono_hwcap_s390x_has_gie = facs.gie;
+       mono_hwcap_s390x_has_fpe  = facs.fpe;
+       mono_hwcap_s390x_has_vec  = facs.vec;
+       mono_hwcap_s390x_has_mlt  = facs.multi;
+       mono_hwcap_s390x_has_ia   = facs.ia;
+       mono_hwcap_s390x_has_gie  = facs.gie;
+       mono_hwcap_s390x_has_mie2 = facs.mie2;
+       mono_hwcap_s390x_has_gs   = facs.gs;
 }
index 47ae051428a9050b7596f0b53c37b489a8c4b84e..05f89a34ef93ed73ebab52f971a7b8c8fda88c30 100644 (file)
@@ -38,6 +38,8 @@ MONO_HWCAP_VAR(s390x_has_vec)
 MONO_HWCAP_VAR(s390x_has_mlt)
 MONO_HWCAP_VAR(s390x_has_ia)
 MONO_HWCAP_VAR(s390x_has_gie)
+MONO_HWCAP_VAR(s390x_has_mie2)
+MONO_HWCAP_VAR(s390x_has_gs)
 
 #elif defined (TARGET_SPARC) || defined (TARGET_SPARC64)