const HChar *mnm = irgen(m3, m4, r1, r2);
if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
- S390_DISASM(MNM(mnm), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
+ S390_DISASM(XMNM(mnm, fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
+}
+
+static void
+s390_format_RRF_UUFF2(const HChar *(*irgen)(UChar m3, UChar m4, UChar r1,
+ UChar r2),
+ UChar m3, UChar m4, UChar r1, UChar r2)
+{
+ const HChar *mnm = irgen(m3, m4, r1, r2);
+
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
+ S390_DISASM(XMNM(mnm, fp_convt_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
}
static void
const HChar *mnm = irgen(r3, m4, r1, r2);
if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
- S390_DISASM(MNM(mnm), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
+ S390_DISASM(XMNM(mnm, adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
}
static void
}
static const HChar *
-s390_irgen_LEDBR(UChar m3, UChar m4 __attribute__((unused)),
- UChar r1, UChar r2)
+s390_irgen_LEDBRA(UChar m3, UChar m4 __attribute__((unused)),
+ UChar r1, UChar r2)
{
if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
emulation_warning(EmWarn_S390X_fpext_rounding);
put_fpr_w0(r1, binop(Iop_F64toF32, mkexpr(encode_bfp_rounding_mode(m3)),
mkexpr(op)));
- return "ledbr";
+ return "ledbra";
}
static const HChar *
s390_cc_thunk_putF(S390_CC_OP_DFP_RESULT_64, result);
put_dpr_dw0(r1, mkexpr(result));
}
- return (m4 == 0) ? "adtr" : "adtra";
+ return "adtra";
}
static const HChar *
}
static const HChar *
-s390_irgen_LDXBR(UChar m3, UChar m4 __attribute__((unused)),
- UChar r1, UChar r2)
+s390_irgen_LDXBRA(UChar m3, UChar m4 __attribute__((unused)),
+ UChar r1, UChar r2)
{
if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
emulation_warning(EmWarn_S390X_fpext_rounding);
get_fpr_pair(r2)));
put_fpr_dw0(r1, mkexpr(result));
- return "ldxbr";
+ return "ldxbra";
}
static const HChar *
-s390_irgen_LEXBR(UChar m3, UChar m4 __attribute__((unused)),
- UChar r1, UChar r2)
+s390_irgen_LEXBRA(UChar m3, UChar m4 __attribute__((unused)),
+ UChar r1, UChar r2)
{
if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
emulation_warning(EmWarn_S390X_fpext_rounding);
get_fpr_pair(r2)));
put_fpr_w0(r1, mkexpr(result));
- return "lexbr";
+ return "lexbra";
}
static const HChar *
RRE_r2(ovl)); goto ok;
case 0xb343: s390_format_RRE_FF(s390_irgen_LCXBR, RRE_r1(ovl),
RRE_r2(ovl)); goto ok;
- case 0xb344: s390_format_RRF_UUFF(s390_irgen_LEDBR, RRF2_m3(ovl),
- RRF2_m4(ovl), RRF2_r1(ovl),
- RRF2_r2(ovl)); goto ok;
- case 0xb345: s390_format_RRF_UUFF(s390_irgen_LDXBR, RRF2_m3(ovl),
+ case 0xb344: s390_format_RRF_UUFF(s390_irgen_LEDBRA, RRF2_m3(ovl),
RRF2_m4(ovl), RRF2_r1(ovl),
RRF2_r2(ovl)); goto ok;
- case 0xb346: s390_format_RRF_UUFF(s390_irgen_LEXBR, RRF2_m3(ovl),
+ case 0xb345: s390_format_RRF_UUFF(s390_irgen_LDXBRA, RRF2_m3(ovl),
RRF2_m4(ovl), RRF2_r1(ovl),
RRF2_r2(ovl)); goto ok;
- case 0xb347: s390_format_RRF_UUFF(s390_irgen_FIXBRA, RRF2_m3(ovl),
+ case 0xb346: s390_format_RRF_UUFF(s390_irgen_LEXBRA, RRF2_m3(ovl),
RRF2_m4(ovl), RRF2_r1(ovl),
RRF2_r2(ovl)); goto ok;
+ case 0xb347: s390_format_RRF_UUFF2(s390_irgen_FIXBRA, RRF2_m3(ovl),
+ RRF2_m4(ovl), RRF2_r1(ovl),
+ RRF2_r2(ovl)); goto ok;
case 0xb348: s390_format_RRE_FF(s390_irgen_KXBR, RRE_r1(ovl),
RRE_r2(ovl)); goto ok;
case 0xb349: s390_format_RRE_FF(s390_irgen_CXBR, RRE_r1(ovl),
case 0xb350: /* TBEDR */ goto unimplemented;
case 0xb351: /* TBDR */ goto unimplemented;
case 0xb353: /* DIEBR */ goto unimplemented;
- case 0xb357: s390_format_RRF_UUFF(s390_irgen_FIEBRA, RRF2_m3(ovl),
- RRF2_m4(ovl), RRF2_r1(ovl),
- RRF2_r2(ovl)); goto ok;
+ case 0xb357: s390_format_RRF_UUFF2(s390_irgen_FIEBRA, RRF2_m3(ovl),
+ RRF2_m4(ovl), RRF2_r1(ovl),
+ RRF2_r2(ovl)); goto ok;
case 0xb358: /* THDER */ goto unimplemented;
case 0xb359: /* THDR */ goto unimplemented;
case 0xb35b: /* DIDBR */ goto unimplemented;
- case 0xb35f: s390_format_RRF_UUFF(s390_irgen_FIDBRA, RRF2_m3(ovl),
- RRF2_m4(ovl), RRF2_r1(ovl),
- RRF2_r2(ovl)); goto ok;
+ case 0xb35f: s390_format_RRF_UUFF2(s390_irgen_FIDBRA, RRF2_m3(ovl),
+ RRF2_m4(ovl), RRF2_r1(ovl),
+ RRF2_r2(ovl)); goto ok;
case 0xb360: /* LPXR */ goto unimplemented;
case 0xb361: /* LNXR */ goto unimplemented;
case 0xb362: /* LTXR */ goto unimplemented;
vassert(m4 == 0);
vassert(m3 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m3 == 0)
- S390_DISASM(MNM("ledbr"), FPR(r1), FPR(r2));
- else
- S390_DISASM(MNM("ledbra"), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("ledbra", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
return emit_RRF2(p, 0xb3440000, m3, m4, r1, r2);
}
vassert(m4 == 0);
vassert(m3 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m3 == 0)
- S390_DISASM(MNM("ldxbr"), FPR(r1), FPR(r2));
- else
- S390_DISASM(MNM("ldxbra"), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("ldxbra", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
return emit_RRF2(p, 0xb3450000, m3, m4, r1, r2);
}
vassert(m4 == 0);
vassert(m3 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m3 == 0)
- S390_DISASM(MNM("lexbr"), FPR(r1), FPR(r2));
- else
- S390_DISASM(MNM("lexbra"), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("lexbra", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
return emit_RRF2(p, 0xb3460000, m3, m4, r1, r2);
}
{
vassert(m3 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("fiebr"), FPR(r1), UINT(m3), FPR(r2));
- else
- S390_DISASM(MNM("fiebra"), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("fiebra", fp_convt_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
return emit_RRF2(p, 0xb3570000, m3, m4, r1, r2);
}
{
vassert(m3 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("fidbr"), FPR(r1), UINT(m3), FPR(r2));
- else
- S390_DISASM(MNM("fidbra"), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("fidbra", fp_convt_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
return emit_RRF2(p, 0xb35f0000, m3, m4, r1, r2);
}
{
vassert(m3 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("fixbr"), FPR(r1), UINT(m3), FPR(r2));
- else
- S390_DISASM(MNM("fixbra"), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("fixbra", fp_convt_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
return emit_RRF2(p, 0xb3470000, m3, m4, r1, r2);
}
{
vassert(s390_host_has_dfp);
vassert(m4 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("adtr"), FPR(r1), FPR(r2), FPR(r3));
- else
- S390_DISASM(MNM("adtra"), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("adtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
return emit_RRF4(p, 0xb3d20000, r3, m4, r1, r2);
}
{
vassert(s390_host_has_dfp);
vassert(m4 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("axtr"), FPR(r1), FPR(r2), FPR(r3));
- else
- S390_DISASM(MNM("axtra"), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("axtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
return emit_RRF4(p, 0xb3da0000, r3, m4, r1, r2);
}
{
vassert(s390_host_has_dfp);
vassert(m4 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("ddtr"), FPR(r1), FPR(r2), FPR(r3));
- else
- S390_DISASM(MNM("ddtra"), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("ddtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
return emit_RRF4(p, 0xb3d10000, r3, m4, r1, r2);
}
{
vassert(s390_host_has_dfp);
vassert(m4 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("dxtr"), FPR(r1), FPR(r2), FPR(r3));
- else
- S390_DISASM(MNM("dxtra"), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("dxtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
return emit_RRF4(p, 0xb3d90000, r3, m4, r1, r2);
}
vassert(s390_host_has_fpext || m3 < 1 || m3 > 7);
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
- S390_DISASM(MNM("ledtr"), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
+ S390_DISASM(XMNM("ledtr", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
return emit_RRF2(p, 0xb3d50000, m3, m4, r1, r2);
}
vassert(s390_host_has_fpext || m3 < 1 || m3 > 7);
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
- S390_DISASM(MNM("ldxtr"), FPR(r1), UINT(m3), FPR(r2), UINT(m4));
+ S390_DISASM(XMNM("ldxtr", fp_convf_disasm), FPR(r1), MASK(m3), FPR(r2), MASK(m4));
return emit_RRF2(p, 0xb3dd0000, m3, m4, r1, r2);
}
{
vassert(s390_host_has_dfp);
vassert(m4 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("mdtr"), FPR(r1), FPR(r2), FPR(r3));
- else
- S390_DISASM(MNM("mdtra"), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("mdtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
return emit_RRF4(p, 0xb3d00000, r3, m4, r1, r2);
}
{
vassert(s390_host_has_dfp);
vassert(m4 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("mxtr"), FPR(r1), FPR(r2), FPR(r3));
- else
- S390_DISASM(MNM("mxtra"), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("mxtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
return emit_RRF4(p, 0xb3d80000, r3, m4, r1, r2);
}
{
vassert(s390_host_has_dfp);
vassert(m4 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("sdtr"), FPR(r1), FPR(r2), FPR(r3));
- else
- S390_DISASM(MNM("sdtra"), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("sdtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
return emit_RRF4(p, 0xb3d30000, r3, m4, r1, r2);
}
{
vassert(s390_host_has_dfp);
vassert(m4 == 0 || s390_host_has_fpext);
- if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) {
- if (m4 == 0)
- S390_DISASM(MNM("sxtr"), FPR(r1), FPR(r2), FPR(r3));
- else
- S390_DISASM(MNM("sxtra"), FPR(r1), FPR(r2), FPR(r3), UINT(m4));
- }
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ S390_DISASM(XMNM("sxtra", adtra_like_disasm), FPR(r1), FPR(r2), FPR(r3), MASK(m4));
return emit_RRF4(p, 0xb3db0000, r3, m4, r1, r2);
}