|
From: <sv...@va...> - 2013-01-12 22:04:11
|
florian 2013-01-12 22:04:00 +0000 (Sat, 12 Jan 2013)
New Revision: 13224
Log:
Add memcheck support for the IROps added in VEX r2631.
Adapt vbit-tester.
Patch by Maran Pakkirisamy (ma...@li...).
Part of fixing BZ 307113.
Modified files:
trunk/memcheck/mc_translate.c
trunk/memcheck/tests/vbit-test/irops.c
trunk/memcheck/tests/vbit-test/util.c
Modified: trunk/memcheck/tests/vbit-test/util.c (+28 -0)
===================================================================
--- trunk/memcheck/tests/vbit-test/util.c 2013-01-12 19:53:08 +00:00 (rev 13223)
+++ trunk/memcheck/tests/vbit-test/util.c 2013-01-12 22:04:00 +00:00 (rev 13224)
@@ -859,9 +859,16 @@
case Iop_RoundD128toInt:
BINARY(ity_RMode,Ity_D128, Ity_D128);
+ case Iop_I32StoD128:
+ case Iop_I32UtoD128:
+ UNARY(Ity_I32, Ity_D128);
+
case Iop_I64StoD128: /* I64 bit pattern stored in Float register */
UNARY(Ity_D64, Ity_D128);
+ case Iop_I64UtoD128:
+ UNARY(Ity_I64, Ity_D128);
+
case Iop_DPBtoBCD:
case Iop_BCDtoDPB:
UNARY(Ity_I64, Ity_I64);
@@ -870,9 +877,16 @@
case Iop_D128LOtoD64:
UNARY(Ity_D128, Ity_D64);
+ case Iop_D128toI32S:
+ case Iop_D128toI32U:
+ BINARY(ity_RMode, Ity_D128, Ity_I32);
+
case Iop_D128toI64S:
BINARY(ity_RMode, Ity_D128, Ity_D64);
+ case Iop_D128toI64U:
+ BINARY(ity_RMode, Ity_D128, Ity_I64);
+
case Iop_D64HLtoD128:
BINARY(Ity_D64, Ity_D64, Ity_D128);
@@ -883,12 +897,26 @@
case Iop_D64toD32:
BINARY(ity_RMode, Ity_D64, Ity_D32);
+ case Iop_D64toI32S:
+ case Iop_D64toI32U:
+ BINARY(ity_RMode, Ity_D64, Ity_I32);
+
case Iop_D64toI64S:
BINARY(ity_RMode, Ity_D64, Ity_D64);
+ case Iop_D64toI64U:
+ BINARY(ity_RMode, Ity_D64, Ity_I64);
+
+ case Iop_I32StoD64:
+ case Iop_I32UtoD64:
+ UNARY(Ity_I32, Ity_D64);
+
case Iop_I64StoD64: /* I64 bit pattern stored in Float register */
BINARY(ity_RMode, Ity_D64, Ity_D64);
+ case Iop_I64UtoD64:
+ BINARY(ity_RMode, Ity_I64, Ity_D64);
+
case Iop_CmpD64:
case Iop_CmpExpD64:
BINARY(Ity_D64,Ity_D64, Ity_I32);
Modified: trunk/memcheck/tests/vbit-test/irops.c (+24 -0)
===================================================================
--- trunk/memcheck/tests/vbit-test/irops.c 2013-01-12 19:53:08 +00:00 (rev 13223)
+++ trunk/memcheck/tests/vbit-test/irops.c 2013-01-12 22:04:00 +00:00 (rev 13224)
@@ -491,12 +491,24 @@
{ DEFOP(Iop_ShrD128, UNDEF_ALL), .s390x = 0, .ppc64 = 1, .ppc32 = 1 },
{ DEFOP(Iop_D32toD64, UNDEF_ALL), .s390x = 1, .ppc64 = 1, .ppc32 = 1 },
{ DEFOP(Iop_D64toD128, UNDEF_ALL), .s390x = 1, .ppc64 = 1, .ppc32 = 1 },
+ { DEFOP(Iop_I32StoD128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_I32UtoD128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_I64StoD128, UNDEF_ALL), .s390x = 0, .ppc64 = 1, .ppc32 = 1 },
+ { DEFOP(Iop_I64UtoD128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_D64toD32, UNDEF_ALL), .s390x = 1, .ppc64 = 1, .ppc32 = 1 },
{ DEFOP(Iop_D128toD64, UNDEF_ALL), .s390x = 1, .ppc64 = 1, .ppc32 = 1 },
+ { DEFOP(Iop_I32StoD64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_I32UtoD64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_I64StoD64, UNDEF_ALL), .s390x = 0, .ppc64 = 1, .ppc32 = 1 },
+ { DEFOP(Iop_I64UtoD64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D64toI32S, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D64toI32U, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_D64toI64S, UNDEF_ALL), .s390x = 0, .ppc64 = 1, .ppc32 = 1 },
+ { DEFOP(Iop_D64toI64U, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_D128toI64S, UNDEF_ALL), .s390x = 0, .ppc64 = 1, .ppc32 = 1 },
+ { DEFOP(Iop_D128toI64U, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D128toI32S, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D128toI32U, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_RoundD64toInt, UNDEF_ALL), .s390x = 0, .ppc64 = 1, .ppc32 = 1 },
{ DEFOP(Iop_RoundD128toInt, UNDEF_ALL), .s390x = 0, .ppc64 = 1, .ppc32 = 1 },
{ DEFOP(Iop_CmpD64, UNDEF_ALL), .s390x = 1, .ppc64 = 1, .ppc32 = 1 },
@@ -881,6 +893,18 @@
#ifdef __s390x__
#define S390X_FEATURES "../../../tests/s390x_features"
switch (op) {
+ case Iop_I32StoD64: // CDFTR
+ case Iop_I32StoD128: // CXFTR
+ case Iop_I32UtoD64: // CDLFTR
+ case Iop_I32UtoD128: // CXLFTR
+ case Iop_I64UtoD64: // CDLGTR
+ case Iop_I64UtoD128: // CXLGTR
+ case Iop_D64toI32S: // CFDTR
+ case Iop_D128toI32S: // CFXTR
+ case Iop_D64toI64U: // CLGDTR
+ case Iop_D64toI32U: // CLFDTR
+ case Iop_D128toI64U: // CLGXTR
+ case Iop_D128toI32U: // CLFXTR
case Iop_I32UtoF32:
case Iop_I32UtoF64:
case Iop_I32UtoF128:
Modified: trunk/memcheck/mc_translate.c (+14 -2)
===================================================================
--- trunk/memcheck/mc_translate.c 2013-01-12 19:53:08 +00:00 (rev 13223)
+++ trunk/memcheck/mc_translate.c 2013-01-12 22:04:00 +00:00 (rev 13224)
@@ -3305,8 +3305,10 @@
return mkLazy2(mce, Ity_I128, vatom1, vatom2);
case Iop_D64toI64S:
+ case Iop_D64toI64U:
case Iop_I64StoD64:
- /* I32(DFP rm) x I64 -> D64 */
+ case Iop_I64UtoD64:
+ /* I32(DFP rm) x I64/D64 -> D64/I64 */
return mkLazy2(mce, Ity_I64, vatom1, vatom2);
case Iop_RoundF32toInt:
@@ -3328,6 +3330,8 @@
case Iop_F128toI32S: /* IRRoundingMode(I32) x F128 -> signed I32 */
case Iop_F128toI32U: /* IRRoundingMode(I32) x F128 -> unsigned I32 */
case Iop_F128toF32: /* IRRoundingMode(I32) x F128 -> F32 */
+ case Iop_D128toI32S: /* IRRoundingModeDFP(I32) x D128 -> signed I32 */
+ case Iop_D128toI32U: /* IRRoundingModeDFP(I32) x D128 -> unsigned I32 */
return mkLazy2(mce, Ity_I32, vatom1, vatom2);
case Iop_F128toI64S: /* IRRoundingMode(I32) x F128 -> signed I64 */
@@ -3335,6 +3339,7 @@
case Iop_F128toF64: /* IRRoundingMode(I32) x F128 -> F64 */
case Iop_D128toD64: /* IRRoundingModeDFP(I64) x D128 -> D64 */
case Iop_D128toI64S: /* IRRoundingModeDFP(I64) x D128 -> signed I64 */
+ case Iop_D128toI64U: /* IRRoundingModeDFP(I32) x D128 -> unsigned I64 */
return mkLazy2(mce, Ity_I64, vatom1, vatom2);
case Iop_F64HLtoF128:
@@ -3346,7 +3351,9 @@
case Iop_F64toI32S:
case Iop_F64toF32:
case Iop_I64UtoF32:
- /* First arg is I32 (rounding mode), second is F64 (data). */
+ case Iop_D64toI32U:
+ case Iop_D64toI32S:
+ /* First arg is I32 (rounding mode), second is F64/D64 (data). */
return mkLazy2(mce, Ity_I32, vatom1, vatom2);
case Iop_D64toD32:
@@ -3699,7 +3706,10 @@
case Iop_I64UtoF128: /* unsigned I64 -> F128 */
case Iop_F32toF128: /* F32 -> F128 */
case Iop_F64toF128: /* F64 -> F128 */
+ case Iop_I32StoD128: /* signed I64 -> D128 */
case Iop_I64StoD128: /* signed I64 -> D128 */
+ case Iop_I32UtoD128: /* unsigned I32 -> D128 */
+ case Iop_I64UtoD128: /* unsigned I64 -> D128 */
return mkPCastTo(mce, Ity_I128, vatom);
case Iop_F32toF64:
@@ -3714,6 +3724,8 @@
case Iop_RoundF64toF64_ZERO:
case Iop_Clz64:
case Iop_D32toD64:
+ case Iop_I32StoD64:
+ case Iop_I32UtoD64:
case Iop_ExtractExpD64: /* D64 -> I64 */
case Iop_ExtractExpD128: /* D128 -> I64 */
case Iop_ExtractSigD64: /* D64 -> I64 */
|