Add memcheck support for the IROps added in VEX r2631.

Adapt vbit-tester.
Patch by Maran Pakkirisamy (maranp@linux.vnet.ibm.com).
Part of fixing BZ 307113.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13224
This commit is contained in:
Florian Krohm 2013-01-12 22:04:00 +00:00
parent 739ae0bcb6
commit ee6b67bd79
3 changed files with 66 additions and 2 deletions

View File

@ -3305,8 +3305,10 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce,
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 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce,
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 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce,
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 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce,
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 @@ IRExpr* expr2vbits_Unop ( MCEnv* mce, IROp op, IRAtom* atom )
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 @@ IRExpr* expr2vbits_Unop ( MCEnv* mce, IROp op, IRAtom* atom )
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 */

View File

@ -491,12 +491,24 @@ static irop_t irops[] = {
{ 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 @@ get_irop(IROp op)
#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:

View File

@ -859,9 +859,16 @@ typeof_primop(IROp op, IRType *t_dst, IRType *t_arg1, IRType *t_arg2,
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 @@ typeof_primop(IROp op, IRType *t_dst, IRType *t_arg1, IRType *t_arg2,
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 @@ typeof_primop(IROp op, IRType *t_dst, IRType *t_arg1, IRType *t_arg2,
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);