|
From: <sv...@va...> - 2013-03-12 01:31:34
|
florian 2013-03-12 01:31:24 +0000 (Tue, 12 Mar 2013)
New Revision: 2696
Log:
s390: Support the SRNMT instruction.
Patch by Maran Pakkirisamy (ma...@li...).
Part of fixing BZ 307113.
Modified files:
trunk/priv/guest_s390_toIR.c
Modified: trunk/priv/guest_s390_toIR.c (+21 -1)
===================================================================
--- trunk/priv/guest_s390_toIR.c 2013-03-06 08:34:04 +00:00 (rev 2695)
+++ trunk/priv/guest_s390_toIR.c 2013-03-12 01:31:24 +00:00 (rev 2696)
@@ -8555,7 +8555,26 @@
s390_format_S_RD(s390_irgen_SRNMB, b2, d2);
}
+/* Wrapper to validate the parameter as in SRNMB is not required, as all
+ the 8 values in op2addr[61:63] correspond to a valid DFP rounding mode */
+static const HChar *
+s390_irgen_SRNMT(IRTemp op2addr)
+{
+ UInt input_mask, fpc_mask;
+ input_mask = 7;
+ fpc_mask = 0x70;
+
+ /* fpc[25:27] <- op2addr[61:63]
+ fpc = (fpc & ~(0x70)) | ((op2addr & 7) << 4) */
+ put_fpc_w0(binop(Iop_Or32, binop(Iop_And32, get_fpc_w0(), mkU32(~fpc_mask)),
+ binop(Iop_Shl32, binop(Iop_And32,
+ unop(Iop_64to32, mkexpr(op2addr)),
+ mkU32(input_mask)), mkU8(4))));
+ return "srnmt";
+}
+
+
static const HChar *
s390_irgen_SFPC(UChar r1)
{
@@ -13976,7 +13995,8 @@
case 0xb2b2: /* LPSWE */ goto unimplemented;
case 0xb2b8: s390_irgen_srnmb_wrapper(ovl.fmt.S.b2, ovl.fmt.S.d2);
goto ok;
- case 0xb2b9: /* SRNMT */ goto unimplemented;
+ case 0xb2b9: s390_format_S_RD(s390_irgen_SRNMT, ovl.fmt.S.b2, ovl.fmt.S.d2);
+ goto ok;
case 0xb2bd: /* LFAS */ goto unimplemented;
case 0xb2e0: /* SCCTR */ goto unimplemented;
case 0xb2e1: /* SPCTR */ goto unimplemented;
|