]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
s390: floating-point-extension facility related cleanups (BZ 509562)
authorFlorian Krohm <flo2030@eich-krohm.de>
Sun, 23 Nov 2025 22:51:53 +0000 (22:51 +0000)
committerFlorian Krohm <flo2030@eich-krohm.de>
Sun, 23 Nov 2025 22:54:18 +0000 (22:54 +0000)
The floating-point-extension facility is always present on the supported
machines.
- Remove s390_host_has_fpext and VEX_HWCAPS_S390X_FPEXT
- Remove EmWarn_S390X_fpext_rounding and EmFail_S390X_fpext
- Remove testscases none/tests/s390x/fpext_fail and fpext_warn
- Update tests/s390x_features.c and memcheck/tests/vbit-test

Part of fixing https://bugs.kde.org/show_bug.cgi?id=509562

27 files changed:
.gitignore
VEX/priv/guest_s390_toIR.c
VEX/priv/host_s390_defs.c
VEX/priv/host_s390_defs.h
VEX/priv/host_s390_isel.c
VEX/priv/main_main.c
VEX/pub/libvex.h
VEX/pub/libvex_emnote.h
coregrind/m_machine.c
memcheck/tests/vbit-test/irops.c
none/tests/s390x/Makefile.am
none/tests/s390x/bfp-XxC.vgtest
none/tests/s390x/bfp-convert.vgtest
none/tests/s390x/bfp-emit.vgtest
none/tests/s390x/bfp-fpc.vgtest
none/tests/s390x/dfp-XiC.vgtest
none/tests/s390x/dfp-XxC.vgtest
none/tests/s390x/dfpext.vgtest
none/tests/s390x/fpext_fail.c [deleted file]
none/tests/s390x/fpext_fail.stderr.exp [deleted file]
none/tests/s390x/fpext_fail.stdout.exp [deleted file]
none/tests/s390x/fpext_fail.vgtest [deleted file]
none/tests/s390x/fpext_warn.c [deleted file]
none/tests/s390x/fpext_warn.stderr.exp [deleted file]
none/tests/s390x/fpext_warn.stdout.exp [deleted file]
none/tests/s390x/fpext_warn.vgtest [deleted file]
tests/s390x_features.c

index cfd8c7bd8f38910a51c4727616a8ac7d53c474c3..a9cb60c965d37b0e1d9e0e6c3b10282aea614209 100644 (file)
 /none/tests/s390x/cu14_1
 /none/tests/s390x/cu41
 /none/tests/s390x/ecag
-/none/tests/s390x/fpext_warn
-/none/tests/s390x/fpext_fail
 /none/tests/s390x/bfp-306054
 /none/tests/s390x/bfp-arith
 /none/tests/s390x/bfp-load
index 5693fd9c190cbec791404f4bd2e9519b0bad9f40..42bf5ad816fc58f5a5f987cdc1ddd2b81c71c375 100644 (file)
@@ -11269,7 +11269,7 @@ s390_irgen_SRNM(IRTemp op2addr)
    UInt input_mask, fpc_mask;
 
    input_mask = 3;
-   fpc_mask = s390_host_has_fpext ? 7 : 3;
+   fpc_mask = 7;
 
    put_fpc_w0(binop(Iop_Or32,
                     binop(Iop_And32, get_fpc_w0(), mkU32(~fpc_mask)),
@@ -11284,11 +11284,6 @@ s390_irgen_SRNMB(UChar b2, UShort d2)
    /* Can only check at IR generation time when b2 == 0 */
    if (b2 == 0) {
       s390_insn_assert("srnmb", d2 <= 3 || d2 == 7);  // valid rounding mode
-      /* d2 == 7 requires fpext */
-      if (d2 == 7 && ! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-         return "srnmb";
-      }
    }
    IRTemp op2addr = newTemp(Ity_I64);
 
@@ -11448,11 +11443,7 @@ s390_irgen_ADB(UChar r1, IRTemp op2addr)
 static const HChar *
 s390_irgen_CEFBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
-      emulation_warning(EmWarn_S390X_fpext_rounding);
-      m3 = S390_BFP_ROUND_PER_FPC;
-   }
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
    s390_insn_assert("cefbra", is_valid_rounding_mode(m3));
 
@@ -11469,7 +11460,7 @@ static const HChar *
 s390_irgen_CDFBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cdfbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op2 = newTemp(Ity_I32);
@@ -11483,11 +11474,7 @@ s390_irgen_CDFBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 static const HChar *
 s390_irgen_CEGBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
-      emulation_warning(EmWarn_S390X_fpext_rounding);
-      m3 = S390_BFP_ROUND_PER_FPC;
-   }
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
    s390_insn_assert("cegbra", is_valid_rounding_mode(m3));
 
@@ -11503,11 +11490,7 @@ s390_irgen_CEGBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 static const HChar *
 s390_irgen_CDGBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
-      emulation_warning(EmWarn_S390X_fpext_rounding);
-      m3 = S390_BFP_ROUND_PER_FPC;
-   }
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
    s390_insn_assert("cdgbra", is_valid_rounding_mode(m3));
 
@@ -11523,168 +11506,133 @@ s390_irgen_CDGBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 static const HChar *
 s390_irgen_CELFBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("celfbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("celfbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op2 = newTemp(Ity_I32);
+   IRTemp op2 = newTemp(Ity_I32);
 
-      assign(op2, get_gpr_w1(r2));
-      put_fpr_w0(r1, binop(Iop_I32UtoF32, mkexpr(encode_bfp_rounding_mode(m3)),
-                           mkexpr(op2)));
-   }
+   assign(op2, get_gpr_w1(r2));
+   put_fpr_w0(r1, binop(Iop_I32UtoF32, mkexpr(encode_bfp_rounding_mode(m3)),
+                        mkexpr(op2)));
    return "celfbr";
 }
 
 static const HChar *
 s390_irgen_CDLFBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("cdlfbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("cdlfbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op2 = newTemp(Ity_I32);
+   IRTemp op2 = newTemp(Ity_I32);
 
-      assign(op2, get_gpr_w1(r2));
-      put_fpr_dw0(r1, unop(Iop_I32UtoF64, mkexpr(op2)));
-   }
+   assign(op2, get_gpr_w1(r2));
+   put_fpr_dw0(r1, unop(Iop_I32UtoF64, mkexpr(op2)));
    return "cdlfbr";
 }
 
 static const HChar *
 s390_irgen_CELGBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("celgbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("celgbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op2 = newTemp(Ity_I64);
+   IRTemp op2 = newTemp(Ity_I64);
 
-      assign(op2, get_gpr_dw0(r2));
-      put_fpr_w0(r1, binop(Iop_I64UtoF32, mkexpr(encode_bfp_rounding_mode(m3)),
-                           mkexpr(op2)));
-   }
+   assign(op2, get_gpr_dw0(r2));
+   put_fpr_w0(r1, binop(Iop_I64UtoF32, mkexpr(encode_bfp_rounding_mode(m3)),
+                        mkexpr(op2)));
    return "celgbr";
 }
 
 static const HChar *
 s390_irgen_CDLGBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("cdlgbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("cdlgbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op2 = newTemp(Ity_I64);
+   IRTemp op2 = newTemp(Ity_I64);
 
-      assign(op2, get_gpr_dw0(r2));
-      put_fpr_dw0(r1, binop(Iop_I64UtoF64,
-                            mkexpr(encode_bfp_rounding_mode(m3)),
-                            mkexpr(op2)));
-   }
+   assign(op2, get_gpr_dw0(r2));
+   put_fpr_dw0(r1, binop(Iop_I64UtoF64,
+                         mkexpr(encode_bfp_rounding_mode(m3)),
+                         mkexpr(op2)));
    return "cdlgbr";
 }
 
 static const HChar *
 s390_irgen_CLFEBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("clfebr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("clfebr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op = newTemp(Ity_F32);
-      IRTemp result = newTemp(Ity_I32);
-      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
+   IRTemp op = newTemp(Ity_F32);
+   IRTemp result = newTemp(Ity_I32);
+   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
 
-      assign(op, get_fpr_w0(r2));
-      assign(result, binop(Iop_F32toI32U, mkexpr(rounding_mode),
-                           mkexpr(op)));
-      put_gpr_w1(r1, mkexpr(result));
-      s390_cc_thunk_putFZ(S390_CC_OP_BFP_32_TO_UINT_32, op, rounding_mode);
-   }
+   assign(op, get_fpr_w0(r2));
+   assign(result, binop(Iop_F32toI32U, mkexpr(rounding_mode), mkexpr(op)));
+   put_gpr_w1(r1, mkexpr(result));
+   s390_cc_thunk_putFZ(S390_CC_OP_BFP_32_TO_UINT_32, op, rounding_mode);
    return "clfebr";
 }
 
 static const HChar *
 s390_irgen_CLFDBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("clfdbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("clfdbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op = newTemp(Ity_F64);
-      IRTemp result = newTemp(Ity_I32);
-      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
+   IRTemp op = newTemp(Ity_F64);
+   IRTemp result = newTemp(Ity_I32);
+   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
 
-      assign(op, get_fpr_dw0(r2));
-      assign(result, binop(Iop_F64toI32U, mkexpr(rounding_mode),
-                           mkexpr(op)));
-      put_gpr_w1(r1, mkexpr(result));
-      s390_cc_thunk_putFZ(S390_CC_OP_BFP_64_TO_UINT_32, op, rounding_mode);
-   }
+   assign(op, get_fpr_dw0(r2));
+   assign(result, binop(Iop_F64toI32U, mkexpr(rounding_mode), mkexpr(op)));
+   put_gpr_w1(r1, mkexpr(result));
+   s390_cc_thunk_putFZ(S390_CC_OP_BFP_64_TO_UINT_32, op, rounding_mode);
    return "clfdbr";
 }
 
 static const HChar *
 s390_irgen_CLGEBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("clgebr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("clgebr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op = newTemp(Ity_F32);
-      IRTemp result = newTemp(Ity_I64);
-      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
+   IRTemp op = newTemp(Ity_F32);
+   IRTemp result = newTemp(Ity_I64);
+   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
 
-      assign(op, get_fpr_w0(r2));
-      assign(result, binop(Iop_F32toI64U, mkexpr(rounding_mode),
-                           mkexpr(op)));
-      put_gpr_dw0(r1, mkexpr(result));
-      s390_cc_thunk_putFZ(S390_CC_OP_BFP_32_TO_UINT_64, op, rounding_mode);
-   }
+   assign(op, get_fpr_w0(r2));
+   assign(result, binop(Iop_F32toI64U, mkexpr(rounding_mode), mkexpr(op)));
+   put_gpr_dw0(r1, mkexpr(result));
+   s390_cc_thunk_putFZ(S390_CC_OP_BFP_32_TO_UINT_64, op, rounding_mode);
    return "clgebr";
 }
 
 static const HChar *
 s390_irgen_CLGDBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("clgdbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("clgdbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op = newTemp(Ity_F64);
-      IRTemp result = newTemp(Ity_I64);
-      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
+   IRTemp op = newTemp(Ity_F64);
+   IRTemp result = newTemp(Ity_I64);
+   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
 
-      assign(op, get_fpr_dw0(r2));
-      assign(result, binop(Iop_F64toI64U, mkexpr(rounding_mode),
-                           mkexpr(op)));
-      put_gpr_dw0(r1, mkexpr(result));
-      s390_cc_thunk_putFZ(S390_CC_OP_BFP_64_TO_UINT_64, op, rounding_mode);
-   }
+   assign(op, get_fpr_dw0(r2));
+   assign(result, binop(Iop_F64toI64U, mkexpr(rounding_mode),
+                        mkexpr(op)));
+   put_gpr_dw0(r1, mkexpr(result));
+   s390_cc_thunk_putFZ(S390_CC_OP_BFP_64_TO_UINT_64, op, rounding_mode);
    return "clgdbr";
 }
 
@@ -11692,7 +11640,7 @@ static const HChar *
 s390_irgen_CFEBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cfebra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op = newTemp(Ity_F32);
@@ -11712,7 +11660,7 @@ static const HChar *
 s390_irgen_CFDBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cfdbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op = newTemp(Ity_F64);
@@ -11732,7 +11680,7 @@ static const HChar *
 s390_irgen_CGEBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cgebra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op = newTemp(Ity_F32);
@@ -11752,7 +11700,7 @@ static const HChar *
 s390_irgen_CGDBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cgdbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op = newTemp(Ity_F64);
@@ -11909,11 +11857,7 @@ s390_irgen_LDEB(UChar r1, IRTemp op2addr)
 static const HChar *
 s390_irgen_LEDBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
-      emulation_warning(EmWarn_S390X_fpext_rounding);
-      m3 = S390_BFP_ROUND_PER_FPC;
-   }
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
    s390_insn_assert("ledbra", is_valid_rounding_mode(m3));
 
@@ -12078,11 +12022,6 @@ s390_irgen_ADTRA(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D64);
       IRTemp rounding_mode;
 
-      if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_dw0(r2));
       assign(op2, get_dpr_dw0(r3));
@@ -12109,11 +12048,6 @@ s390_irgen_AXTRA(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D128);
       IRTemp rounding_mode;
 
-      if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_pair(r2));
       assign(op2, get_dpr_pair(r3));
@@ -12172,7 +12106,7 @@ s390_irgen_CDFTR(UChar m3 __attribute__((unused)),
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (s390_host_has_fpext && (m4 & 0x4) != 0)
+      if ((m4 & 0x4) != 0)
          emulation_warning(EmWarn_S390X_XxC_not_zero);
       IRTemp op2 = newTemp(Ity_I32);
 
@@ -12190,7 +12124,7 @@ s390_irgen_CXFTR(UChar m3 __attribute__((unused)),
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
       s390_insn_assert("cxftr", is_valid_fpr_pair(r1));
-      if (s390_host_has_fpext && (m4 & 0x4) != 0)
+      if ((m4 & 0x4) != 0)
          emulation_warning(EmWarn_S390X_XxC_not_zero);
 
       IRTemp op2 = newTemp(Ity_I32);
@@ -12209,11 +12143,7 @@ s390_irgen_CDGTRA(UChar m3, UChar m4, UChar r1, UChar r2)
    } else {
       IRTemp op2 = newTemp(Ity_I64);
 
-      if (! s390_host_has_fpext && m3 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m3 = S390_DFP_ROUND_PER_FPC_0;
-      }
-      if (s390_host_has_fpext && (m4 & 0x4) != 0)
+      if ((m4 & 0x4) != 0)
          emulation_warning(EmWarn_S390X_XxC_not_zero);
 
       assign(op2, get_gpr_dw0(r2));
@@ -12231,7 +12161,7 @@ s390_irgen_CXGTRA(UChar m3 __attribute__((unused)),
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
       s390_insn_assert("cxgtra", is_valid_fpr_pair(r1));
-      if (s390_host_has_fpext && (m4 & 0x4) != 0)
+      if ((m4 & 0x4) != 0)
          emulation_warning(EmWarn_S390X_XxC_not_zero);
 
       IRTemp op2 = newTemp(Ity_I64);
@@ -12252,16 +12182,12 @@ s390_irgen_CDLFTR(UChar m3 __attribute__((unused)),
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-         IRTemp op2 = newTemp(Ity_I32);
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+      IRTemp op2 = newTemp(Ity_I32);
 
-         assign(op2, get_gpr_w1(r2));
-         put_dpr_dw0(r1, unop(Iop_I32UtoD64, mkexpr(op2)));
-      }
+      assign(op2, get_gpr_w1(r2));
+      put_dpr_dw0(r1, unop(Iop_I32UtoD64, mkexpr(op2)));
    }
    return "cdlftr";
 }
@@ -12273,18 +12199,14 @@ s390_irgen_CXLFTR(UChar m3 __attribute__((unused)),
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         s390_insn_assert("cxlftr", is_valid_fpr_pair(r1));
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
+      s390_insn_assert("cxlftr", is_valid_fpr_pair(r1));
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-         IRTemp op2 = newTemp(Ity_I32);
+      IRTemp op2 = newTemp(Ity_I32);
 
-         assign(op2, get_gpr_w1(r2));
-         put_dpr_pair(r1, unop(Iop_I32UtoD128, mkexpr(op2)));
-      }
+      assign(op2, get_gpr_w1(r2));
+      put_dpr_pair(r1, unop(Iop_I32UtoD128, mkexpr(op2)));
    }
    return "cxlftr";
 }
@@ -12295,18 +12217,14 @@ s390_irgen_CDLGTR(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-         IRTemp op2 = newTemp(Ity_I64);
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+      IRTemp op2 = newTemp(Ity_I64);
 
-         assign(op2, get_gpr_dw0(r2));
-         put_dpr_dw0(r1, binop(Iop_I64UtoD64,
-                               mkexpr(encode_dfp_rounding_mode(m3)),
-                               mkexpr(op2)));
-      }
+      assign(op2, get_gpr_dw0(r2));
+      put_dpr_dw0(r1, binop(Iop_I64UtoD64,
+                            mkexpr(encode_dfp_rounding_mode(m3)),
+                            mkexpr(op2)));
    }
    return "cdlgtr";
 }
@@ -12318,18 +12236,14 @@ s390_irgen_CXLGTR(UChar m3 __attribute__((unused)),
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         s390_insn_assert("cxlgtr", is_valid_fpr_pair(r1));
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
+      s390_insn_assert("cxlgtr", is_valid_fpr_pair(r1));
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-         IRTemp op2 = newTemp(Ity_I64);
+      IRTemp op2 = newTemp(Ity_I64);
 
-         assign(op2, get_gpr_dw0(r2));
-         put_dpr_pair(r1, unop(Iop_I64UtoD128, mkexpr(op2)));
-      }
+      assign(op2, get_gpr_dw0(r2));
+      put_dpr_pair(r1, unop(Iop_I64UtoD128, mkexpr(op2)));
    }
    return "cxlgtr";
 }
@@ -12340,21 +12254,17 @@ s390_irgen_CFDTR(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-         IRTemp op = newTemp(Ity_D64);
-         IRTemp result = newTemp(Ity_I32);
-         IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
-
-         assign(op, get_dpr_dw0(r2));
-         assign(result, binop(Iop_D64toI32S, mkexpr(rounding_mode),
-                              mkexpr(op)));
-         put_gpr_w1(r1, mkexpr(result));
-         s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_INT_32, op, rounding_mode);
-      }
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+      IRTemp op = newTemp(Ity_D64);
+      IRTemp result = newTemp(Ity_I32);
+      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
+
+      assign(op, get_dpr_dw0(r2));
+      assign(result, binop(Iop_D64toI32S, mkexpr(rounding_mode),
+                           mkexpr(op)));
+      put_gpr_w1(r1, mkexpr(result));
+      s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_INT_32, op, rounding_mode);
    }
    return "cfdtr";
 }
@@ -12365,24 +12275,20 @@ s390_irgen_CFXTR(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         s390_insn_assert("cfxtr", is_valid_fpr_pair(r2));
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-
-         IRTemp op = newTemp(Ity_D128);
-         IRTemp result = newTemp(Ity_I32);
-         IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
-
-         assign(op, get_dpr_pair(r2));
-         assign(result, binop(Iop_D128toI32S, mkexpr(rounding_mode),
-                              mkexpr(op)));
-         put_gpr_w1(r1, mkexpr(result));
-         s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_INT_32, op,
-                                 rounding_mode);
-      }
+      s390_insn_assert("cfxtr", is_valid_fpr_pair(r2));
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+
+      IRTemp op = newTemp(Ity_D128);
+      IRTemp result = newTemp(Ity_I32);
+      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
+
+      assign(op, get_dpr_pair(r2));
+      assign(result, binop(Iop_D128toI32S, mkexpr(rounding_mode),
+                           mkexpr(op)));
+      put_gpr_w1(r1, mkexpr(result));
+      s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_INT_32, op,
+                              rounding_mode);
    }
    return "cfxtr";
 }
@@ -12393,18 +12299,14 @@ s390_irgen_CGDTRA(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-         IRTemp op = newTemp(Ity_D64);
-         IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
-
-         assign(op, get_dpr_dw0(r2));
-         put_gpr_dw0(r1, binop(Iop_D64toI64S, mkexpr(rounding_mode), mkexpr(op)));
-         s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_INT_64, op, rounding_mode);
-      }
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+      IRTemp op = newTemp(Ity_D64);
+      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
+
+      assign(op, get_dpr_dw0(r2));
+      put_gpr_dw0(r1, binop(Iop_D64toI64S, mkexpr(rounding_mode), mkexpr(op)));
+      s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_INT_64, op, rounding_mode);
    }
    return "cgdtra";
 }
@@ -12415,20 +12317,16 @@ s390_irgen_CGXTRA(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         s390_insn_assert("cgxtra", is_valid_fpr_pair(r2));
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
+      s390_insn_assert("cgxtra", is_valid_fpr_pair(r2));
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-         IRTemp op = newTemp(Ity_D128);
-         IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
+      IRTemp op = newTemp(Ity_D128);
+      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
 
-         assign(op, get_dpr_pair(r2));
-         put_gpr_dw0(r1, binop(Iop_D128toI64S, mkexpr(rounding_mode), mkexpr(op)));
-         s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_INT_64, op, rounding_mode);
-      }
+      assign(op, get_dpr_pair(r2));
+      put_gpr_dw0(r1, binop(Iop_D128toI64S, mkexpr(rounding_mode), mkexpr(op)));
+      s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_INT_64, op, rounding_mode);
    }
    return "cgxtra";
 }
@@ -12484,21 +12382,17 @@ s390_irgen_CLFDTR(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-         IRTemp op = newTemp(Ity_D64);
-         IRTemp result = newTemp(Ity_I32);
-         IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
-
-         assign(op, get_dpr_dw0(r2));
-         assign(result, binop(Iop_D64toI32U, mkexpr(rounding_mode),
-                              mkexpr(op)));
-         put_gpr_w1(r1, mkexpr(result));
-         s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_UINT_32, op, rounding_mode);
-      }
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+      IRTemp op = newTemp(Ity_D64);
+      IRTemp result = newTemp(Ity_I32);
+      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
+
+      assign(op, get_dpr_dw0(r2));
+      assign(result, binop(Iop_D64toI32U, mkexpr(rounding_mode),
+                           mkexpr(op)));
+      put_gpr_w1(r1, mkexpr(result));
+      s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_UINT_32, op, rounding_mode);
    }
    return "clfdtr";
 }
@@ -12509,24 +12403,20 @@ s390_irgen_CLFXTR(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         s390_insn_assert("clfxtr", is_valid_fpr_pair(r2));
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-
-         IRTemp op = newTemp(Ity_D128);
-         IRTemp result = newTemp(Ity_I32);
-         IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
-
-         assign(op, get_dpr_pair(r2));
-         assign(result, binop(Iop_D128toI32U, mkexpr(rounding_mode),
-                              mkexpr(op)));
-         put_gpr_w1(r1, mkexpr(result));
-         s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_UINT_32, op,
-                                 rounding_mode);
-      }
+      s390_insn_assert("clfxtr", is_valid_fpr_pair(r2));
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+
+      IRTemp op = newTemp(Ity_D128);
+      IRTemp result = newTemp(Ity_I32);
+      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
+
+      assign(op, get_dpr_pair(r2));
+      assign(result, binop(Iop_D128toI32U, mkexpr(rounding_mode),
+                           mkexpr(op)));
+      put_gpr_w1(r1, mkexpr(result));
+      s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_UINT_32, op,
+                              rounding_mode);
    }
    return "clfxtr";
 }
@@ -12537,21 +12427,17 @@ s390_irgen_CLGDTR(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-         IRTemp op = newTemp(Ity_D64);
-         IRTemp result = newTemp(Ity_I64);
-         IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
-
-         assign(op, get_dpr_dw0(r2));
-         assign(result, binop(Iop_D64toI64U, mkexpr(rounding_mode),
-                              mkexpr(op)));
-         put_gpr_dw0(r1, mkexpr(result));
-         s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_UINT_64, op, rounding_mode);
-      }
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+      IRTemp op = newTemp(Ity_D64);
+      IRTemp result = newTemp(Ity_I64);
+      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
+
+      assign(op, get_dpr_dw0(r2));
+      assign(result, binop(Iop_D64toI64U, mkexpr(rounding_mode),
+                           mkexpr(op)));
+      put_gpr_dw0(r1, mkexpr(result));
+      s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_UINT_64, op, rounding_mode);
    }
    return "clgdtr";
 }
@@ -12562,24 +12448,20 @@ s390_irgen_CLGXTR(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      if (! s390_host_has_fpext) {
-         emulation_failure(EmFail_S390X_fpext);
-      } else {
-         s390_insn_assert("clgxtr", is_valid_fpr_pair(r2));
-         if ((m4 & 0x4) != 0)
-            emulation_warning(EmWarn_S390X_XxC_not_zero);
-
-         IRTemp op = newTemp(Ity_D128);
-         IRTemp result = newTemp(Ity_I64);
-         IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
-
-         assign(op, get_dpr_pair(r2));
-         assign(result, binop(Iop_D128toI64U, mkexpr(rounding_mode),
-                              mkexpr(op)));
-         put_gpr_dw0(r1, mkexpr(result));
-         s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_UINT_64, op,
-                                 rounding_mode);
-      }
+      s390_insn_assert("clgxtr", is_valid_fpr_pair(r2));
+      if ((m4 & 0x4) != 0)
+         emulation_warning(EmWarn_S390X_XxC_not_zero);
+
+      IRTemp op = newTemp(Ity_D128);
+      IRTemp result = newTemp(Ity_I64);
+      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
+
+      assign(op, get_dpr_pair(r2));
+      assign(result, binop(Iop_D128toI64U, mkexpr(rounding_mode),
+                           mkexpr(op)));
+      put_gpr_dw0(r1, mkexpr(result));
+      s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_UINT_64, op,
+                              rounding_mode);
    }
    return "clgxtr";
 }
@@ -12595,11 +12477,6 @@ s390_irgen_DDTRA(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D64);
       IRTemp rounding_mode;
 
-      if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_dw0(r2));
       assign(op2, get_dpr_dw0(r3));
@@ -12625,11 +12502,6 @@ s390_irgen_DXTRA(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D128);
       IRTemp rounding_mode;
 
-      if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_pair(r2));
       assign(op2, get_dpr_pair(r3));
@@ -12770,15 +12642,9 @@ s390_irgen_LDXTR(UChar m3, UChar m4, UChar r1, UChar r2)
       s390_insn_assert("ldxtr", is_valid_fpr_pair(r1));
       s390_insn_assert("ldxtr", is_valid_fpr_pair(r2));
 
-      /* If fpext is not installed and m3 is in 1:7,
-         rounding mode performed is unpredictable */
-      if (! s390_host_has_fpext && m3 > 0 && m3 < 8) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m3 = S390_DFP_ROUND_PER_FPC_0;
-      }
       if ((m4 & 0x8) != 0)
          emulation_warning(EmWarn_S390X_XiC_not_zero);
-      if (s390_host_has_fpext && (m4 & 0x4) != 0)
+      if ((m4 & 0x4) != 0)
          emulation_warning(EmWarn_S390X_XxC_not_zero);
       IRTemp result = newTemp(Ity_D64);
 
@@ -12795,15 +12661,9 @@ s390_irgen_LEDTR(UChar m3, UChar m4, UChar r1, UChar r2)
    if (! s390_host_has_dfp) {
       emulation_failure(EmFail_S390X_DFP_insn);
    } else {
-      /* If fpext is not installed and m3 is in 1:7,
-         rounding mode performed is unpredictable */
-      if (! s390_host_has_fpext && m3 > 0 && m3 < 8) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m3 = S390_DFP_ROUND_PER_FPC_0;
-      }
       if ((m4 & 0x8) != 0)
          emulation_warning(EmWarn_S390X_XiC_not_zero);
-      if (s390_host_has_fpext && (m4 & 0x4) != 0)
+      if ((m4 & 0x4) != 0)
          emulation_warning(EmWarn_S390X_XxC_not_zero);
       IRTemp op = newTemp(Ity_D64);
 
@@ -12858,11 +12718,6 @@ s390_irgen_MDTRA(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D64);
       IRTemp rounding_mode;
 
-      if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_dw0(r2));
       assign(op2, get_dpr_dw0(r3));
@@ -12888,11 +12743,6 @@ s390_irgen_MXTRA(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D128);
       IRTemp rounding_mode;
 
-      if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_pair(r2));
       assign(op2, get_dpr_pair(r3));
@@ -12914,13 +12764,6 @@ s390_irgen_QADTR(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D64);
       IRTemp rounding_mode;
 
-      /* If fpext is not installed and m4 is in 1:7,
-         rounding mode performed is unpredictable */
-      if (! s390_host_has_fpext && m4 > 0 && m4 < 8) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_dw0(r2));
       assign(op2, get_dpr_dw0(r3));
@@ -12946,13 +12789,6 @@ s390_irgen_QAXTR(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D128);
       IRTemp rounding_mode;
 
-      /* If fpext is not installed and m4 is in 1:7,
-         rounding mode performed is unpredictable */
-      if (! s390_host_has_fpext && m4 > 0 && m4 < 8) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_pair(r2));
       assign(op2, get_dpr_pair(r3));
@@ -12974,13 +12810,6 @@ s390_irgen_RRDTR(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D64);
       IRTemp rounding_mode;
 
-      /* If fpext is not installed and m4 is in 1:7,
-         rounding mode performed is unpredictable */
-      if (! s390_host_has_fpext && m4 > 0 && m4 < 8) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_gpr_b7(r2));
       assign(op2, get_dpr_dw0(r3));
@@ -13005,13 +12834,6 @@ s390_irgen_RRXTR(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D128);
       IRTemp rounding_mode;
 
-      /* If fpext is not installed and m4 is in 1:7,
-         rounding mode performed is unpredictable */
-      if (! s390_host_has_fpext && m4 > 0 && m4 < 8) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_gpr_b7(r2));
       assign(op2, get_dpr_pair(r3));
@@ -13033,11 +12855,6 @@ s390_irgen_SDTRA(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D64);
       IRTemp rounding_mode;
 
-      if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_dw0(r2));
       assign(op2, get_dpr_dw0(r3));
@@ -13064,11 +12881,6 @@ s390_irgen_SXTRA(UChar r3, UChar m4, UChar r1, UChar r2)
       IRTemp result = newTemp(Ity_D128);
       IRTemp rounding_mode;
 
-      if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
-         emulation_warning(EmWarn_S390X_fpext_rounding);
-         m4 = S390_DFP_ROUND_PER_FPC_0;
-      }
-
       rounding_mode = encode_dfp_rounding_mode(m4);
       assign(op1, get_dpr_pair(r2));
       assign(op2, get_dpr_pair(r3));
@@ -14896,7 +14708,7 @@ s390_irgen_CXFBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cxfbra", is_valid_fpr_pair(r1));
    s390_insn_assert("cxfbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op2 = newTemp(Ity_I32);
@@ -14910,19 +14722,15 @@ s390_irgen_CXFBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 static const HChar *
 s390_irgen_CXLFBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("cxlfbr", is_valid_fpr_pair(r1));
-      s390_insn_assert("cxlfbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("cxlfbr", is_valid_fpr_pair(r1));
+   s390_insn_assert("cxlfbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op2 = newTemp(Ity_I32);
+   IRTemp op2 = newTemp(Ity_I32);
 
-      assign(op2, get_gpr_w1(r2));
-      put_fpr_pair(r1, unop(Iop_I32UtoF128, mkexpr(op2)));
-   }
+   assign(op2, get_gpr_w1(r2));
+   put_fpr_pair(r1, unop(Iop_I32UtoF128, mkexpr(op2)));
    return "cxlfbr";
 }
 
@@ -14932,7 +14740,7 @@ s390_irgen_CXGBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cxgbra", is_valid_fpr_pair(r1));
    s390_insn_assert("cxgbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op2 = newTemp(Ity_I64);
@@ -14946,19 +14754,15 @@ s390_irgen_CXGBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 static const HChar *
 s390_irgen_CXLGBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("cxlgbr", is_valid_fpr_pair(r1));
-      s390_insn_assert("cxlgbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("cxlgbr", is_valid_fpr_pair(r1));
+   s390_insn_assert("cxlgbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op2 = newTemp(Ity_I64);
+   IRTemp op2 = newTemp(Ity_I64);
 
-      assign(op2, get_gpr_dw0(r2));
-      put_fpr_pair(r1, unop(Iop_I64UtoF128, mkexpr(op2)));
-   }
+   assign(op2, get_gpr_dw0(r2));
+   put_fpr_pair(r1, unop(Iop_I64UtoF128, mkexpr(op2)));
    return "cxlgbr";
 }
 
@@ -14967,7 +14771,7 @@ s390_irgen_CFXBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cfxbra", is_valid_fpr_pair(r2));
    s390_insn_assert("cfxbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op = newTemp(Ity_F128);
@@ -14986,24 +14790,20 @@ s390_irgen_CFXBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 static const HChar *
 s390_irgen_CLFXBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("clfxbr", is_valid_fpr_pair(r2));
-      s390_insn_assert("clfxbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("clfxbr", is_valid_fpr_pair(r2));
+   s390_insn_assert("clfxbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op = newTemp(Ity_F128);
-      IRTemp result = newTemp(Ity_I32);
-      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
+   IRTemp op = newTemp(Ity_F128);
+   IRTemp result = newTemp(Ity_I32);
+   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
 
-      assign(op, get_fpr_pair(r2));
-      assign(result, binop(Iop_F128toI32U, mkexpr(rounding_mode),
-                           mkexpr(op)));
-      put_gpr_w1(r1, mkexpr(result));
-      s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_128_TO_UINT_32, op, rounding_mode);
-   }
+   assign(op, get_fpr_pair(r2));
+   assign(result, binop(Iop_F128toI32U, mkexpr(rounding_mode),
+                        mkexpr(op)));
+   put_gpr_w1(r1, mkexpr(result));
+   s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_128_TO_UINT_32, op, rounding_mode);
    return "clfxbr";
 }
 
@@ -15013,7 +14813,7 @@ s390_irgen_CGXBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("cgxbra", is_valid_fpr_pair(r2));
    s390_insn_assert("cgxbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp op = newTemp(Ity_F128);
@@ -15032,25 +14832,21 @@ s390_irgen_CGXBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 static const HChar *
 s390_irgen_CLGXBR(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext) {
-      emulation_failure(EmFail_S390X_fpext);
-   } else {
-      s390_insn_assert("clgxbr", is_valid_fpr_pair(r2));
-      s390_insn_assert("clgxbr", is_valid_rounding_mode(m3));
-      if ((m4 & 0x4) != 0)
-         emulation_warning(EmWarn_S390X_XxC_not_zero);
+   s390_insn_assert("clgxbr", is_valid_fpr_pair(r2));
+   s390_insn_assert("clgxbr", is_valid_rounding_mode(m3));
+   if ((m4 & 0x4) != 0)
+      emulation_warning(EmWarn_S390X_XxC_not_zero);
 
-      IRTemp op = newTemp(Ity_F128);
-      IRTemp result = newTemp(Ity_I64);
-      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
+   IRTemp op = newTemp(Ity_F128);
+   IRTemp result = newTemp(Ity_I64);
+   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
 
-      assign(op, get_fpr_pair(r2));
-      assign(result, binop(Iop_F128toI64U, mkexpr(rounding_mode),
-                           mkexpr(op)));
-      put_gpr_dw0(r1, mkexpr(result));
-      s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_128_TO_UINT_64, op,
-                              rounding_mode);
-   }
+   assign(op, get_fpr_pair(r2));
+   assign(result, binop(Iop_F128toI64U, mkexpr(rounding_mode),
+                        mkexpr(op)));
+   put_gpr_dw0(r1, mkexpr(result));
+   s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_128_TO_UINT_64, op,
+                           rounding_mode);
    return "clgxbr";
 }
 
@@ -15160,7 +14956,7 @@ static const HChar *
 s390_irgen_FIEBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("fiebra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp result = newTemp(Ity_F32);
@@ -15176,7 +14972,7 @@ static const HChar *
 s390_irgen_FIDBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
    s390_insn_assert("fidbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp result = newTemp(Ity_F64);
@@ -15194,7 +14990,7 @@ s390_irgen_FIXBRA(UChar m3, UChar m4, UChar r1, UChar r2)
    s390_insn_assert("fixbra", is_valid_fpr_pair(r1));
    s390_insn_assert("fixbra", is_valid_fpr_pair(r2));
    s390_insn_assert("fixbra", is_valid_rounding_mode(m3));
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
 
    IRTemp result = newTemp(Ity_F128);
@@ -15287,11 +15083,7 @@ s390_irgen_LPXBR(UChar r1, UChar r2)
 static const HChar *
 s390_irgen_LDXBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
-      emulation_warning(EmWarn_S390X_fpext_rounding);
-      m3 = S390_BFP_ROUND_PER_FPC;
-   }
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
    s390_insn_assert("ldxbra", is_valid_fpr_pair(r1));
    s390_insn_assert("ldxbra", is_valid_fpr_pair(r2));
@@ -15309,11 +15101,7 @@ s390_irgen_LDXBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 static const HChar *
 s390_irgen_LEXBRA(UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
-      emulation_warning(EmWarn_S390X_fpext_rounding);
-      m3 = S390_BFP_ROUND_PER_FPC;
-   }
-   if (s390_host_has_fpext && (m4 & 0x4) != 0)
+   if ((m4 & 0x4) != 0)
       emulation_warning(EmWarn_S390X_XxC_not_zero);
    s390_insn_assert("lexbra", is_valid_fpr_pair(r1));
    s390_insn_assert("lexbra", is_valid_fpr_pair(r2));
@@ -19462,10 +19250,6 @@ s390_vector_fp_convert(IROp op, IRType fromType, IRType toType, Bool rounding,
       IRExpr* argument = get_vr(v2, fromType, i * sourceIndexScaleFactor);
       IRExpr* result;
       if (rounding) {
-         if (!s390_host_has_fpext && m5 != S390_BFP_ROUND_PER_FPC) {
-            emulation_warning(EmWarn_S390X_fpext_rounding);
-            m5 = S390_BFP_ROUND_PER_FPC;
-         }
          result = binop(op,
                         mkexpr(encode_bfp_rounding_mode(m5)),
                         argument);
index 9389364da8e8234da2425e7fa32ab018e1d52572..6f5191124c7814a073f0e9df085f02d53a3b5840 100644 (file)
@@ -3941,7 +3941,6 @@ static UChar *
 s390_emit_CEFBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cefbra", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -3954,7 +3953,6 @@ static UChar *
 s390_emit_CDFBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cdfbra", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -3967,7 +3965,6 @@ static UChar *
 s390_emit_CXFBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cxfbra", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -3980,7 +3977,6 @@ static UChar *
 s390_emit_CEGBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cegbra", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -3993,7 +3989,6 @@ static UChar *
 s390_emit_CDGBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cdgbra", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4006,7 +4001,6 @@ static UChar *
 s390_emit_CXGBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cxgbra", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4019,7 +4013,6 @@ static UChar *
 s390_emit_CELFBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("celfbr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4032,7 +4025,6 @@ static UChar *
 s390_emit_CDLFBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cdlfbr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4045,7 +4037,6 @@ static UChar *
 s390_emit_CXLFBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cxlfbr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4058,7 +4049,6 @@ static UChar *
 s390_emit_CELGBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("celgbr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4071,7 +4061,6 @@ static UChar *
 s390_emit_CDLGBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cdlgbr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4084,7 +4073,6 @@ static UChar *
 s390_emit_CXLGBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cxlgbr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4097,7 +4085,6 @@ static UChar *
 s390_emit_CLFEBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clfebr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4110,7 +4097,6 @@ static UChar *
 s390_emit_CLFDBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clfdbr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4123,7 +4109,6 @@ static UChar *
 s390_emit_CLFXBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clfxbr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4136,7 +4121,6 @@ static UChar *
 s390_emit_CLGEBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clgebr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4149,7 +4133,6 @@ static UChar *
 s390_emit_CLGDBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clgdbr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4162,7 +4145,6 @@ static UChar *
 s390_emit_CLGXBR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clgxbr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4385,7 +4367,6 @@ static UChar *
 s390_emit_LEDBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("ledbra", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4398,7 +4379,6 @@ static UChar *
 s390_emit_LDXBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("ldxbra", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4411,7 +4391,6 @@ static UChar *
 s390_emit_LEXBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("lexbra", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4423,8 +4402,6 @@ s390_emit_LEXBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 static UChar *
 s390_emit_FIEBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   vassert(m3 == 0 || s390_host_has_fpext);
-
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("fiebra", fp_convt_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
 
@@ -4435,8 +4412,6 @@ s390_emit_FIEBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 static UChar *
 s390_emit_FIDBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   vassert(m3 == 0 || s390_host_has_fpext);
-
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("fidbra", fp_convt_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
 
@@ -4447,8 +4422,6 @@ s390_emit_FIDBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 static UChar *
 s390_emit_FIXBRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
-   vassert(m3 == 0 || s390_host_has_fpext);
-
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("fixbra", fp_convt_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
 
@@ -4590,7 +4563,6 @@ static UChar *
 s390_emit_ADTRA(UChar *p, UChar r3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
-   vassert(m4 == 0 || s390_host_has_fpext);
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("adtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
 
@@ -4602,7 +4574,6 @@ static UChar *
 s390_emit_AXTRA(UChar *p, UChar r3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
-   vassert(m4 == 0 || s390_host_has_fpext);
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("axtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
 
@@ -4637,7 +4608,6 @@ s390_emit_CDGTRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
    vassert(m4 == 0);
-   vassert(m3 == 0 || s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cdgtra", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4667,7 +4637,6 @@ s390_emit_CDFTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cdftr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4681,7 +4650,6 @@ s390_emit_CXFTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cxftr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4695,7 +4663,6 @@ s390_emit_CDLFTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cdlftr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4709,7 +4676,6 @@ s390_emit_CXLFTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cxlftr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4723,7 +4689,6 @@ s390_emit_CDLGTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cdlgtr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4737,7 +4702,6 @@ s390_emit_CXLGTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cxlgtr", fp_convf_disasm), FPR(r1), MASK(m3), GPR(r2), MASK(m4));
@@ -4771,7 +4735,6 @@ s390_emit_CFDTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cfdtr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4785,7 +4748,6 @@ s390_emit_CFXTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cfxtr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4799,7 +4761,6 @@ s390_emit_CGDTRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext || m3 < 1 || m3 > 7);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cgdtra", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4813,7 +4774,6 @@ s390_emit_CGXTRA(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext || m3 < 1 || m3 > 7);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("cgxtra", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4827,7 +4787,6 @@ s390_emit_CLFDTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clfdtr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4841,7 +4800,6 @@ s390_emit_CLFXTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clfxtr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4855,7 +4813,6 @@ s390_emit_CLGDTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clgdtr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4869,7 +4826,6 @@ s390_emit_CLGXTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(m4 == 0);
    vassert(s390_host_has_dfp);
-   vassert(s390_host_has_fpext);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("clgxtr", fp_convt_disasm), GPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -4882,7 +4838,6 @@ static UChar *
 s390_emit_DDTRA(UChar *p, UChar r3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
-   vassert(m4 == 0 || s390_host_has_fpext);
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("ddtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
 
@@ -4894,7 +4849,6 @@ static UChar *
 s390_emit_DXTRA(UChar *p, UChar r3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
-   vassert(m4 == 0 || s390_host_has_fpext);
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("dxtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
 
@@ -4989,7 +4943,6 @@ s390_emit_LEDTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext || m3 < 1 || m3 > 7);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("ledtr", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -5003,7 +4956,6 @@ s390_emit_LDXTR(UChar *p, UChar m3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
    vassert(m4 == 0);
-   vassert(s390_host_has_fpext || m3 < 1 || m3 > 7);
 
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("ldxtr", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
@@ -5016,7 +4968,6 @@ static UChar *
 s390_emit_MDTRA(UChar *p, UChar r3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
-   vassert(m4 == 0 || s390_host_has_fpext);
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("mdtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
 
@@ -5028,7 +4979,6 @@ static UChar *
 s390_emit_MXTRA(UChar *p, UChar r3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
-   vassert(m4 == 0 || s390_host_has_fpext);
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("mxtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
 
@@ -5105,7 +5055,6 @@ static UChar *
 s390_emit_SDTRA(UChar *p, UChar r3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
-   vassert(m4 == 0 || s390_host_has_fpext);
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("sdtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
 
@@ -5117,7 +5066,6 @@ static UChar *
 s390_emit_SXTRA(UChar *p, UChar r3, UChar m4, UChar r1, UChar r2)
 {
    vassert(s390_host_has_dfp);
-   vassert(m4 == 0 || s390_host_has_fpext);
    if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
       S390_DISASM(XMNM("sxtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
 
index eaf8a29bfec15619157a698dcc7a2fd7833bf2b6..89ebfc7472c594c2ad29df20d5a2deb38b1af06f 100644 (file)
@@ -930,8 +930,6 @@ extern UInt s390_host_hwcaps;
                       (s390_host_hwcaps & (VEX_HWCAPS_S390X_ETF2))
 #define s390_host_has_etf3 \
                       (s390_host_hwcaps & (VEX_HWCAPS_S390X_ETF3))
-#define s390_host_has_fpext \
-                      (s390_host_hwcaps & (VEX_HWCAPS_S390X_FPEXT))
 #define s390_host_has_lsc \
                       (s390_host_hwcaps & (VEX_HWCAPS_S390X_LSC))
 #define s390_host_has_pfpo \
index 8f87cc239484e178bb78f92a1afc96d5fc093d7c..a0d9b75373bf3c29e719067de97ce4d617c7e606 100644 (file)
@@ -2392,12 +2392,7 @@ s390_isel_float128_expr_wrk(HReg *dst_hi, HReg *dst_lo, ISelEnv *env,
          irrm = expr->Iex.Binop.arg1;
          left = expr->Iex.Binop.arg2;
          
-         if (s390_host_has_fpext) {
-            rm = get_bfp_rounding_mode(env, irrm);
-         } else {
-            set_bfp_rounding_mode_in_fpc(env, irrm);
-            rm = S390_BFP_ROUND_PER_FPC;
-         }
+         rm = get_bfp_rounding_mode(env, irrm);
 
          s390_isel_float128_expr(&op_hi, &op_lo, env, left);
          /* operand --> (f4, f6) */
@@ -2677,12 +2672,7 @@ s390_isel_float_expr_wrk(ISelEnv *env, IRExpr *expr)
          /* convert-from-fixed and load-rounded have a rounding mode field
             when the floating point extension facility is installed. */
          dst = newVRegF(env);
-         if (s390_host_has_fpext) {
-            rounding_mode = get_bfp_rounding_mode(env, irrm);
-         } else {
-            set_bfp_rounding_mode_in_fpc(env, irrm);
-            rounding_mode = S390_BFP_ROUND_PER_FPC;
-         }
+         rounding_mode = get_bfp_rounding_mode(env, irrm);
          addInstr(env, s390_insn_bfp_convert(size, conv, dst, h1,
                                              rounding_mode));
          return dst;
@@ -2753,14 +2743,7 @@ s390_isel_float_expr_wrk(ISelEnv *env, IRExpr *expr)
 
          /* result --> (f12, f14) */
 
-         /* load-rounded has a rounding mode field when the floating point
-            extension facility is installed. */
-         if (s390_host_has_fpext) {
-            rounding_mode = get_bfp_rounding_mode(env, irrm);
-         } else {
-            set_bfp_rounding_mode_in_fpc(env, irrm);
-            rounding_mode = S390_BFP_ROUND_PER_FPC;
-         }
+         rounding_mode = get_bfp_rounding_mode(env, irrm);
 
          addInstr(env, s390_insn_bfp128_convert_from(size, conv, f12, f14,
                                                      f13, f15, rounding_mode));
@@ -2974,15 +2957,7 @@ s390_isel_dfp128_expr_wrk(HReg *dst_hi, HReg *dst_lo, ISelEnv *env,
          addInstr(env, s390_insn_move(8, f12, op2_hi));
          addInstr(env, s390_insn_move(8, f14, op2_lo));
 
-         /* DFP arithmetic ops take rounding mode only when fpext is
-            installed. But, DFP quantize operation takes rm irrespective
-            of fpext facility . */
-         if (s390_host_has_fpext || op == Iop_QuantizeD128) {
-            rounding_mode = get_dfp_rounding_mode(env, irrm);
-         } else {
-            set_dfp_rounding_mode_in_fpc(env, irrm);
-            rounding_mode = S390_DFP_ROUND_PER_FPC_0;
-         }
+         rounding_mode = get_dfp_rounding_mode(env, irrm);
          addInstr(env, s390_insn_dfp128_binop(16, dfpop, f13, f15, f9, f11,
                                               f12, f14, rounding_mode));
          /* Move result to virtual destination register */
@@ -3294,15 +3269,9 @@ s390_isel_dfp_expr_wrk(ISelEnv *env, IRExpr *expr)
 
       convert: {
             s390_dfp_round_t rounding_mode;
-            /* convert-from-fixed and load-rounded have a rounding mode field
-               when the floating point extension facility is installed. */
+
             dst = newVRegF(env);
-            if (s390_host_has_fpext) {
-               rounding_mode = get_dfp_rounding_mode(env, irrm);
-            } else {
-               set_dfp_rounding_mode_in_fpc(env, irrm);
-               rounding_mode = S390_DFP_ROUND_PER_FPC_0;
-            }
+            rounding_mode = get_dfp_rounding_mode(env, irrm);
             addInstr(env, s390_insn_dfp_convert(size, conv, dst, h1,
                                                 rounding_mode));
             return dst;
@@ -3368,14 +3337,7 @@ s390_isel_dfp_expr_wrk(ISelEnv *env, IRExpr *expr)
 
          /* result --> (f12, f14) */
  
-         /* load-rounded has a rounding mode field when the floating point
-            extension facility is installed. */
-         if (s390_host_has_fpext) {
-            rounding_mode = get_dfp_rounding_mode(env, irrm);
-         } else {
-            set_dfp_rounding_mode_in_fpc(env, irrm);
-            rounding_mode = S390_DFP_ROUND_PER_FPC_0;
-         }
+         rounding_mode = get_dfp_rounding_mode(env, irrm);
          addInstr(env, s390_insn_dfp128_convert_from(size, conv, f12, f14,
                                                      f13, f15, rounding_mode));
          dst = newVRegF(env);
@@ -3495,15 +3457,7 @@ s390_isel_dfp_expr_wrk(ISelEnv *env, IRExpr *expr)
          op2  = s390_isel_dfp_expr(env, left);  /* Process 1st operand */
          op3  = s390_isel_dfp_expr(env, right); /* Process 2nd operand */
          dst  = newVRegF(env);
-         /* DFP arithmetic ops take rounding mode only when fpext is
-            installed. But, DFP quantize operation takes rm irrespective
-            of fpext facility . */
-         if (s390_host_has_fpext || dfpop == S390_DFP_QUANTIZE) {
-            rounding_mode = get_dfp_rounding_mode(env, irrm);
-         } else {
-            set_dfp_rounding_mode_in_fpc(env, irrm);
-            rounding_mode = S390_DFP_ROUND_PER_FPC_0;
-         }
+         rounding_mode = get_dfp_rounding_mode(env, irrm);
          addInstr(env, s390_insn_dfp_binop(size, dfpop, dst, op2, op3,
                                            rounding_mode));
          return dst;
index 917411558672f00fee8b95b43e80a5b0d09278e9..9a12eebad0ca976ca0f403a9f3de61975654fd62 100644 (file)
@@ -1536,11 +1536,6 @@ const HChar* LibVEX_EmNote_string ( VexEmNote ew )
         return "PPC64 function redirection stack overflow";
      case EmWarn_PPC64_redir_underflow:
         return "PPC64 function redirection stack underflow";
-     case EmWarn_S390X_fpext_rounding:
-        return "The specified rounding mode cannot be supported. That\n"
-               "  feature requires the floating point extension facility\n"
-               "  which is not available on this host. Continuing using\n"
-               "  the rounding mode from FPC. Results may differ!";
      case EmWarn_S390X_XxC_not_zero:
         return "Encountered an insn with the IEEE-inexact-exception control\n"
                "  (XxC) bit set to 1. This is not supported. Continuing anyway.\n"
@@ -1553,10 +1548,6 @@ const HChar* LibVEX_EmNote_string ( VexEmNote ew )
         return "Instruction pfpo is not supported on this host";
      case EmFail_S390X_DFP_insn:
         return "DFP instructions are not supported on this host";
-     case EmFail_S390X_fpext:
-        return "Encountered an instruction that requires the floating "
-               "point extension facility.\n"
-               "  That facility is not available on this host";
      case EmFail_S390X_invalid_PFPO_rounding_mode:
         return "The rounding mode in GPR 0 for the PFPO instruction"
                " is invalid";
@@ -1927,7 +1918,6 @@ static const HChar* show_hwcaps_s390x ( UInt hwcaps )
       { VEX_HWCAPS_S390X_FGX,   "fgx" },
       { VEX_HWCAPS_S390X_ETF2,  "etf2" },
       { VEX_HWCAPS_S390X_ETF3,  "etf3" },
-      { VEX_HWCAPS_S390X_FPEXT, "fpext" },
       { VEX_HWCAPS_S390X_LSC,   "lsc" },
       { VEX_HWCAPS_S390X_PFPO,  "pfpo" },
       { VEX_HWCAPS_S390X_VX,    "vx" },
index 46001f1050a46acc17befca21a712f8cc04181f2..8ff333bc4669e419c8d3c2e583075a0f5d23308d 100644 (file)
@@ -168,7 +168,6 @@ typedef
 #define VEX_HWCAPS_S390X_FGX   (1<<10)  /* FPR-GR transfer facility */
 #define VEX_HWCAPS_S390X_ETF2  (1<<11)  /* ETF2-enhancement facility */
 #define VEX_HWCAPS_S390X_ETF3  (1<<13)  /* ETF3-enhancement facility */
-#define VEX_HWCAPS_S390X_FPEXT (1<<15)  /* Floating point extension facility */
 #define VEX_HWCAPS_S390X_LSC   (1<<16)  /* Conditional load/store facility */
 #define VEX_HWCAPS_S390X_PFPO  (1<<17)  /* Perform floating point ops facility */
 #define VEX_HWCAPS_S390X_VX    (1<<18)  /* Vector facility */
@@ -190,7 +189,6 @@ typedef
                                 VEX_HWCAPS_S390X_GIE   | \
                                 VEX_HWCAPS_S390X_DFP   | \
                                 VEX_HWCAPS_S390X_FGX   | \
-                                VEX_HWCAPS_S390X_FPEXT | \
                                 VEX_HWCAPS_S390X_LSC   | \
                                 VEX_HWCAPS_S390X_ETF3  | \
                                 VEX_HWCAPS_S390X_ETF2  | \
index ea452970afb3ae3a9d274e7ffe87b01000125218..fc2053125fe0cb070507239b286a9dd9385e6dd4 100644 (file)
@@ -84,11 +84,6 @@ typedef
       EmWarn_PPC64_redir_overflow,
       EmWarn_PPC64_redir_underflow,
 
-      /* insn specifies a rounding mode other than "according to FPC"
-         which requires the floating point extension facility. But that
-         facility is not available on this host */
-      EmWarn_S390X_fpext_rounding,
-
       /* Various BFP insns have an M4 field containing the
          IEEE-inexact-exception (XxC) control bit. That bit cannot me modelled
          in VEX and is expected to be zero. */
@@ -105,10 +100,6 @@ typedef
       /* DFP insns are not supported on this host */
       EmFail_S390X_DFP_insn,
 
-      /* insn needs floating point extension facility which is not
-         available on this host */
-      EmFail_S390X_fpext,
-
       /* GPR 0 contains invalid rounding mode for PFPO instruction */
       EmFail_S390X_invalid_PFPO_rounding_mode,
 
index 711538c07c4e360eea6807cad6f34fcfb501043e..a1fa59351c04658c33f94a0c55d7eaf22b74ad9f 100644 (file)
@@ -1528,11 +1528,6 @@ Bool VG_(machine_get_hwcaps)( void )
 #  include "libvex_s390x_common.h"
 
    {
-     /* Instruction set detection code borrowed from ppc above. */
-     vki_sigset_t          saved_set, tmp_set;
-     vki_sigaction_fromK_t saved_sigill_act;
-     vki_sigaction_toK_t     tmp_sigill_act;
-
      Int i, model;
 
      /* If the model is "unknown" don't treat this as an error. Assume
@@ -1576,7 +1571,6 @@ Bool VG_(machine_get_hwcaps)( void )
         { False,  41,  VEX_HWCAPS_S390X_FGX,   "FGX"   },
         { False,  24,  VEX_HWCAPS_S390X_ETF2,  "ETF2"  },
         { False,  30,  VEX_HWCAPS_S390X_ETF3,  "ETF3"  },
-        { False,  37,  VEX_HWCAPS_S390X_FPEXT, "FPEXT" },
         { False,  45,  VEX_HWCAPS_S390X_LSC,   "LSC"   },
         { False,  44,  VEX_HWCAPS_S390X_PFPO,  "PFPO"  },
         { False, 129,  VEX_HWCAPS_S390X_VX,    "VX"    },
index 46af4fa97b515d9917544255fc0eb667d2b35c98..e3e06d7c780ac6d479b3a61a4f315bc3a7b94d2a 100644 (file)
@@ -1234,14 +1234,7 @@ get_irop(IROp op)
          case Iop_F64toI32U:
          case Iop_F64toI64U:
          case Iop_F128toI32U:
-         case Iop_F128toI64U: {
-            /* These IROps require the floating point extension facility */
-            rc = system(S390X_FEATURES " s390x-fpext");
-            // s390x_features returns 1 if feature does not exist
-            rc /= 256;
-            if (rc != 0) return NULL;
-         }
-         break;
+         case Iop_F128toI64U:
          /* PFPO Iops */
          case Iop_F32toD32:
          case Iop_F32toD64:
index 8ce7e048b35632e3cbe462814cbd177215b1c0bb..66b60a8682d17b7f8c261e9dae8ee37209af513e 100644 (file)
@@ -8,7 +8,7 @@ INSN_TESTS = clc clcle cvb cvd icm lpr lam_stam xc mvst add sub mul \
              op_exception stck stckf stcke stfle cksm mvcl clcl troo \
              trto trot trtt tr tre cij cgij clij clgij crj cgrj clrj clgrj \
              cs csg cds cdsg cu21 cu21_1 cu24 cu24_1 cu42 cu12 cu12_1 \
-             ex_sig ex_clone cu14 cu14_1 cu41 ecag fpext_warn fpext_fail \
+             ex_sig ex_clone cu14 cu14_1 cu41 ecag \
              bfp-fpc bfp-306054 \
              bfp-muldiv comp-1 comp-2 exrl tmll tm stmg \
             ex clst mvc test_fork test_sig rxsbg popcnt \
index af289c94ad4975461c34d0b70cb43427ff795f9f..5ff2ac16884d6b0c825238d4c72937c429e05edb 100644 (file)
@@ -1,3 +1,2 @@
-prereq: ../../../tests/s390x_features s390x-fpext
 prog: /bin/true
 post: ./emwarn-gen.pl --bfp-XxC
index 11cd11c5275714de7351e050289e4cc25f24aacb..693e0d0f8b51d32efff38220c02bb81ccd260056 100644 (file)
@@ -1,2 +1 @@
 prog: bfp-convert
-prereq: ../../../tests/s390x_features s390x-fpext
index 4bfcbac22833876be24ec5b91b85185f3bf6f16e..3ab61ff6e94d5b70a8d85eed5832bddf2d339146 100644 (file)
@@ -1,3 +1,2 @@
-prereq: ../../../tests/s390x_features s390x-fpext
 prog: /bin/true
 post: ./bfp-emit.pl
index d7306a2e324d6b33c5118226cbf5999aa0b49236..b8463d0f7f5b442cfb36778dc02b06fcbd1fa2ca 100644 (file)
@@ -1,2 +1 @@
 prog: bfp-fpc
-prereq: ../../../tests/s390x_features s390x-fpext
index bea81fbee89e6a4fed444da4e2560f211372a589..6f4b2d0fd52ef7bc922753abd28360f1fa97ec76 100644 (file)
@@ -1,3 +1,3 @@
-prereq: ../../../tests/s390x_features s390x-fpext && ../../../tests/s390x_features s390x-dfp
+prereq: ../../../tests/s390x_features s390x-dfp
 prog: /bin/true
 post: ./emwarn-gen.pl --dfp-XiC
index 681c300a125a4b9d46970ce2634b1825442cbedb..76cd8072641b9d8f6bd3c0bd431a2abdb1bd589d 100644 (file)
@@ -1,3 +1,3 @@
-prereq: ../../../tests/s390x_features s390x-fpext && ../../../tests/s390x_features s390x-dfp
+prereq: ../../../tests/s390x_features s390x-dfp
 prog: /bin/true
 post: ./emwarn-gen.pl --dfp-XxC
index ced73e53f740747e96f1ac835aba26bfc68eb663..9cca691585a1695b4a010b59878e85a3cce7cb4b 100644 (file)
@@ -1,2 +1,2 @@
 prog: dfpext
-prereq: test -e dfpext && ../../../tests/s390x_features s390x-dfp && ../../../tests/s390x_features s390x-fpext
+prereq: test -e dfpext && ../../../tests/s390x_features s390x-dfp
diff --git a/none/tests/s390x/fpext_fail.c b/none/tests/s390x/fpext_fail.c
deleted file mode 100644 (file)
index 9de7a8e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-int main(void)
-{
-   float val = 0.0f;
-   __asm__ volatile ("celfbr 1,5,%[f0],0" : : [f0]"f"(val) : "cc", "r1");
-   return 0;
-}
diff --git a/none/tests/s390x/fpext_fail.stderr.exp b/none/tests/s390x/fpext_fail.stderr.exp
deleted file mode 100644 (file)
index ec1a3be..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-
-Emulation fatal error -- Valgrind cannot continue:
-  Encountered an instruction that requires the floating point extension facility.
-  That facility is not available on this host
-   at 0x........: main (fpext.c:136)
-
-Valgrind has to exit now.  Sorry.
-
diff --git a/none/tests/s390x/fpext_fail.stdout.exp b/none/tests/s390x/fpext_fail.stdout.exp
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/none/tests/s390x/fpext_fail.vgtest b/none/tests/s390x/fpext_fail.vgtest
deleted file mode 100644 (file)
index 48e8c59..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-prog: fpext_fail
-prereq: test -e fpext_fail && ../../../tests/s390x_features '!s390x-fpext'
diff --git a/none/tests/s390x/fpext_warn.c b/none/tests/s390x/fpext_warn.c
deleted file mode 100644 (file)
index cc4bd76..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include "opcodes.h"
-
-/* Test that emulation warnings appear when the floating point
-   extension facility is not installed and the opcode specifies
-   a rounding mode other than 0. */
-int
-main(void)
-{
-   printf("before\n");
-   __asm__ volatile ( CEGBRA(1,0,0,0) : : : "cc", "memory");
-   __asm__ volatile ( CEFBRA(3,0,0,0) : : : "cc", "memory");
-   __asm__ volatile ( CDGBRA(4,0,0,0) : : : "cc", "memory");
-
-   /* Note: an emulation warning is expected for the following
-      insn but none is given. The reason is that at most 3 warnings
-      of a given kind will be issued - and we already had three. */
-   __asm__ volatile ( CEFBRA(5,0,0,0) : : : "cc", "memory");
-
-   printf("after\n");
-   return 0;
-}
diff --git a/none/tests/s390x/fpext_warn.stderr.exp b/none/tests/s390x/fpext_warn.stderr.exp
deleted file mode 100644 (file)
index 0dd3bff..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Emulation warning: unsupported action:
-  The specified rounding mode cannot be supported. That
-  feature requires the floating point extension facility
-  which is not available on this host. Continuing using
-  the rounding mode from FPC. Results may differ!
-   at 0x........: main (fpext_warn.c:11)
-Emulation warning: unsupported action:
-  The specified rounding mode cannot be supported. That
-  feature requires the floating point extension facility
-  which is not available on this host. Continuing using
-  the rounding mode from FPC. Results may differ!
-   at 0x........: main (fpext_warn.c:12)
-Emulation warning: unsupported action:
-  The specified rounding mode cannot be supported. That
-  feature requires the floating point extension facility
-  which is not available on this host. Continuing using
-  the rounding mode from FPC. Results may differ!
-   at 0x........: main (fpext_warn.c:13)
-
diff --git a/none/tests/s390x/fpext_warn.stdout.exp b/none/tests/s390x/fpext_warn.stdout.exp
deleted file mode 100644 (file)
index eecca90..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-before
-after
diff --git a/none/tests/s390x/fpext_warn.vgtest b/none/tests/s390x/fpext_warn.vgtest
deleted file mode 100644 (file)
index 6900df9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-prog: fpext_warn
-prereq: ../../../tests/s390x_features '!s390x-fpext'
-vgopts: --show-emwarns=yes
index 1dda2f01f0ac8d7384e3eea1e94c6be519d55e64..560fbb843bcca76edb4839097ab2033d50986564 100644 (file)
@@ -237,8 +237,6 @@ static int go(char *feature, char *cpu)
       match = facilities[0] & FAC_BIT(35);
    } else if (strcmp(feature, "s390x-etf3") == 0 ) {
       match = facilities[0] & FAC_BIT(30);
-   } else if (strcmp(feature, "s390x-fpext") == 0 ) {
-      match = facilities[0] & FAC_BIT(37);
    } else if (strcmp(feature, "s390x-dfp") == 0 ) {
       match = facilities[0] & FAC_BIT(42);
    } else if (strcmp(feature, "s390x-pfpo") == 0 ) {