s390: Add support for the "convert from/to logical" instruction family.
A few (7) new IROps are introduced.
Patch by Christian Borntraeger (borntraeger@de.ibm.com).
Fixes bugzilla #274695.
git-svn-id: svn://svn.valgrind.org/vex/trunk@2496 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/host_s390_isel.c b/priv/host_s390_isel.c
index 8b673fa..abfd2a6 100644
--- a/priv/host_s390_isel.c
+++ b/priv/host_s390_isel.c
@@ -913,10 +913,16 @@
case Iop_F32toI32S: bfpop = S390_BFP_F32_TO_I32; goto do_convert;
case Iop_F32toI64S: bfpop = S390_BFP_F32_TO_I64; goto do_convert;
+ case Iop_F32toI32U: bfpop = S390_BFP_F32_TO_U32; goto do_convert;
+ case Iop_F32toI64U: bfpop = S390_BFP_F32_TO_U64; goto do_convert;
case Iop_F64toI32S: bfpop = S390_BFP_F64_TO_I32; goto do_convert;
case Iop_F64toI64S: bfpop = S390_BFP_F64_TO_I64; goto do_convert;
+ case Iop_F64toI32U: bfpop = S390_BFP_F64_TO_U32; goto do_convert;
+ case Iop_F64toI64U: bfpop = S390_BFP_F64_TO_U64; goto do_convert;
case Iop_F128toI32S: bfpop = S390_BFP_F128_TO_I32; goto do_convert_128;
case Iop_F128toI64S: bfpop = S390_BFP_F128_TO_I64; goto do_convert_128;
+ case Iop_F128toI32U: bfpop = S390_BFP_F128_TO_U32; goto do_convert_128;
+ case Iop_F128toI64U: bfpop = S390_BFP_F128_TO_U64; goto do_convert_128;
do_convert: {
s390_round_t rounding_mode;
@@ -1672,6 +1678,8 @@
case Iop_AbsF128: bfpop = S390_BFP_ABS; goto float128_opnd;
case Iop_I32StoF128: bfpop = S390_BFP_I32_TO_F128; goto convert_int;
case Iop_I64StoF128: bfpop = S390_BFP_I64_TO_F128; goto convert_int;
+ case Iop_I32UtoF128: bfpop = S390_BFP_U32_TO_F128; goto convert_int;
+ case Iop_I64UtoF128: bfpop = S390_BFP_U64_TO_F128; goto convert_int;
case Iop_F32toF128: bfpop = S390_BFP_F32_TO_F128; goto convert_float;
case Iop_F64toF128: bfpop = S390_BFP_F64_TO_F128; goto convert_float;
default:
@@ -1887,8 +1895,12 @@
break;
case Iop_I32StoF32: bfpop = S390_BFP_I32_TO_F32; break;
+ case Iop_I32UtoF32: bfpop = S390_BFP_U32_TO_F32; break;
case Iop_I64StoF32: bfpop = S390_BFP_I64_TO_F32; break;
case Iop_I64StoF64: bfpop = S390_BFP_I64_TO_F64; break;
+ case Iop_I64UtoF32: bfpop = S390_BFP_U64_TO_F32; break;
+ case Iop_I64UtoF64: bfpop = S390_BFP_U64_TO_F64; break;
+
default:
goto irreducible;
@@ -1972,13 +1984,14 @@
case Iop_AbsF32:
case Iop_AbsF64: bfpop = S390_BFP_ABS; break;
case Iop_I32StoF64: bfpop = S390_BFP_I32_TO_F64; break;
+ case Iop_I32UtoF64: bfpop = S390_BFP_U32_TO_F64; break;
case Iop_F32toF64: bfpop = S390_BFP_F32_TO_F64; break;
default:
goto irreducible;
}
/* Process operand */
- if (op == Iop_I32StoF64)
+ if (op == Iop_I32StoF64 || op == Iop_I32UtoF64)
h1 = s390_isel_int_expr(env, left);
else if (bfpop == S390_BFP_NABS)
h1 = s390_isel_float_expr(env, left->Iex.Unop.arg);