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)),
/* 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);
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));
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);
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));
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));
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";
}
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);
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);
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);
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);
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));
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));
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));
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);
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);
} 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));
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);
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";
}
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";
}
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";
}
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";
}
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";
}
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";
}
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";
}
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";
}
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";
}
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";
}
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";
}
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";
}
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));
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));
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);
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);
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));
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));
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));
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));
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));
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));
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));
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));
{
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);
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";
}
{
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);
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";
}
{
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);
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";
}
{
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);
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";
}
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);
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);
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);
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));
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));
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);
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
{
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));
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));
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));
{
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));
{
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));
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));
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));
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));
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));