|
From: <sv...@va...> - 2013-06-17 19:04:36
|
florian 2013-06-17 20:04:24 +0100 (Mon, 17 Jun 2013)
New Revision: 13428
Log:
valgrind side changes to support the new IRops introduced
in VEX r2727 (conversion ops between binary floating point and
decimal floating point).
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/mc_translate.c (+18 -9)
===================================================================
--- trunk/memcheck/mc_translate.c 2013-06-17 19:44:15 +01:00 (rev 13427)
+++ trunk/memcheck/mc_translate.c 2013-06-17 20:04:24 +01:00 (rev 13428)
@@ -3437,22 +3437,31 @@
/* I32(rm) x I64/D64 -> D64/I64 */
return mkLazy2(mce, Ity_I64, vatom1, vatom2);
+ case Iop_F32toD32:
+ case Iop_F64toD32:
+ case Iop_F128toD32:
+ case Iop_D32toF32:
+ case Iop_D64toF32:
+ case Iop_D128toF32:
+ /* I32(rm) x F32/F64/F128/D32/D64/D128 -> D32/F32 */
+ return mkLazy2(mce, Ity_I32, vatom1, vatom2);
+
+ case Iop_F32toD64:
case Iop_F64toD64:
+ case Iop_F128toD64:
+ case Iop_D32toF64:
case Iop_D64toF64:
- /* I32(rm) x F64/D64 -> D64/F64 */
+ case Iop_D128toF64:
+ /* I32(rm) x F32/F64/F128/D32/D64/D128 -> D64/F64 */
return mkLazy2(mce, Ity_I64, vatom1, vatom2);
+ case Iop_F32toD128:
case Iop_F64toD128:
- /* I32(rm) x F64 -> D128 */
- return mkLazy2(mce, Ity_I128, vatom1, vatom2);
-
- case Iop_D128toF64:
- /* I32(rm) x D128 -> F64 */
- return mkLazy2(mce, Ity_I64, vatom1, vatom2);
-
case Iop_F128toD128:
+ case Iop_D32toF128:
+ case Iop_D64toF128:
case Iop_D128toF128:
- /* I32(rm) x F128/D128 -> D128/F128 */
+ /* I32(rm) x F32/F64/F128/D32/D64/D128 -> D128/F128 */
return mkLazy2(mce, Ity_I128, vatom1, vatom2);
case Iop_RoundF32toInt:
Modified: trunk/memcheck/tests/vbit-test/util.c (+41 -5)
===================================================================
--- trunk/memcheck/tests/vbit-test/util.c 2013-06-17 19:44:15 +01:00 (rev 13427)
+++ trunk/memcheck/tests/vbit-test/util.c 2013-06-17 20:04:24 +01:00 (rev 13428)
@@ -869,21 +869,57 @@
case Iop_I64UtoD128:
UNARY(Ity_I64, Ity_D128);
+ case Iop_F32toD32:
+ BINARY(ity_RMode, Ity_F32, Ity_D32);
+
+ case Iop_F32toD64:
+ BINARY(ity_RMode, Ity_F32, Ity_D64);
+
+ case Iop_F32toD128:
+ BINARY(ity_RMode, Ity_F32, Ity_D128);
+
+ case Iop_F64toD32:
+ BINARY(ity_RMode, Ity_F64, Ity_D32);
+
case Iop_F64toD64:
BINARY(ity_RMode, Ity_F64, Ity_D64);
- case Iop_D64toF64: /* I64 bit pattern stored in Float register */
- BINARY(ity_RMode, Ity_D64, Ity_F64);
-
case Iop_F64toD128:
BINARY(ity_RMode, Ity_F64, Ity_D128);
- case Iop_D128toF64:
- BINARY(ity_RMode, Ity_D128, Ity_F64);
+ case Iop_F128toD32:
+ BINARY(ity_RMode, Ity_F128, Ity_D32);
+ case Iop_F128toD64:
+ BINARY(ity_RMode, Ity_F128, Ity_D64);
+
case Iop_F128toD128:
BINARY(ity_RMode, Ity_F128, Ity_D128);
+ case Iop_D32toF32:
+ BINARY(ity_RMode, Ity_D32, Ity_F32);
+
+ case Iop_D32toF64:
+ BINARY(ity_RMode, Ity_D32, Ity_F64);
+
+ case Iop_D32toF128:
+ BINARY(ity_RMode, Ity_D32, Ity_F128);
+
+ case Iop_D64toF32:
+ BINARY(ity_RMode, Ity_D64, Ity_F32);
+
+ case Iop_D64toF64:
+ BINARY(ity_RMode, Ity_D64, Ity_F64);
+
+ case Iop_D64toF128:
+ BINARY(ity_RMode, Ity_D64, Ity_F128);
+
+ case Iop_D128toF32:
+ BINARY(ity_RMode, Ity_D128, Ity_F32);
+
+ case Iop_D128toF64:
+ BINARY(ity_RMode, Ity_D128, Ity_F64);
+
case Iop_D128toF128:
BINARY(ity_RMode, Ity_D128, Ity_F128);
Modified: trunk/memcheck/tests/vbit-test/irops.c (+40 -2)
===================================================================
--- trunk/memcheck/tests/vbit-test/irops.c 2013-06-17 19:44:15 +01:00 (rev 13427)
+++ trunk/memcheck/tests/vbit-test/irops.c 2013-06-17 20:04:24 +01:00 (rev 13428)
@@ -509,11 +509,23 @@
{ 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_F32toD32, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_F32toD64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_F32toD128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_F64toD32, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_F64toD64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_F64toD128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_F128toD32, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_F128toD64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_F128toD128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D32toF32, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D32toF64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D32toF128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D64toF32, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_D64toF64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
- { DEFOP(Iop_F64toD128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D64toF128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
+ { DEFOP(Iop_D128toF32, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_D128toF64, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
- { DEFOP(Iop_F128toD128, UNDEF_ALL), .s390x = 1, .ppc64 = 0, .ppc32 = 0 },
{ DEFOP(Iop_D128toF128, 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 },
@@ -984,7 +996,33 @@
rc /= 256;
if (rc != 0) return NULL;
}
+ /* PFPO Iops */
+ case Iop_F32toD32:
+ case Iop_F32toD64:
+ case Iop_F32toD128:
+ case Iop_F64toD32:
+ case Iop_F64toD64:
+ case Iop_F64toD128:
+ case Iop_F128toD32:
+ case Iop_F128toD64:
+ case Iop_F128toD128:
+ case Iop_D32toF32:
+ case Iop_D32toF64:
+ case Iop_D32toF128:
+ case Iop_D64toF32:
+ case Iop_D64toF64:
+ case Iop_D64toF128:
+ case Iop_D128toF32:
+ case Iop_D128toF64:
+ case Iop_D128toF128: {
+ int rc;
+ /* These IROps require the Perform Floating Point Operation facility */
+ rc = system(S390X_FEATURES " s390x-pfpo");
+ // s390x_features returns 1 if feature does not exist
+ rc /= 256;
+ if (rc != 0) return NULL;
}
+ }
return p->s390x ? p : NULL;
#endif
#ifdef __x86_64__
|