n-i-bz sys_statx: don't complain if both |filename| and |buf| are NULL.
n-i-bz Fix non-glibc build of test suite with s390x_features
418004 Grail code additions break ppc64.
+418997 s390x: Support Iex_ITE for float and vector types
Release 3.15.0 (12 April 2019)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
insn->variant.cond_move.src = src;
insn->variant.cond_move.dst = dst;
- vassert(size == 1 || size == 2 || size == 4 || size == 8);
+ vassert(size == 1 || size == 2 || size == 4 || size == 8 || size == 16);
return insn;
}
p = buf;
- if (s390_host_has_lsc) {
+ if (s390_host_has_lsc && hregClass(dst) == HRcInt64) {
/* LOCx is not the preferred way to implement an unconditional load. */
if (cond == S390_CC_ALWAYS) goto use_branch_insn;
switch (src.tag) {
case S390_OPND_REG:
- p = s390_emit_LGR(p, hregNumber(dst), hregNumber(src.variant.reg));
+ switch (hregClass(dst)) {
+ case HRcInt64:
+ p = s390_emit_LGR(p, hregNumber(dst), hregNumber(src.variant.reg));
+ break;
+ case HRcFlt64:
+ p = s390_emit_LDR(p, hregNumber(dst), hregNumber(src.variant.reg));
+ break;
+ case HRcVec128:
+ p = s390_emit_VLR(p, hregNumber(dst), hregNumber(src.variant.reg));
+ break;
+ default:
+ goto fail;
+ }
break;
case S390_OPND_AMODE:
+ if (hregClass(dst) != HRcInt64)
+ goto fail;
+
p = s390_emit_load_mem(p, insn->size, hregNumber(dst), src.variant.am);
break;
case S390_OPND_IMMEDIATE: {
+ if (hregClass(dst) != HRcInt64)
+ goto fail;
+
ULong value = src.variant.imm;
UInt r = hregNumber(dst);
return dst;
}
+ /* --------- MULTIPLEX --------- */
+ case Iex_ITE: {
+ IRExpr *cond_expr = expr->Iex.ITE.cond;
+ HReg dst, r0, r1;
+
+ vassert(typeOfIRExpr(env->type_env, cond_expr) == Ity_I1);
+
+ dst = newVRegF(env);
+ r0 = s390_isel_float_expr(env, expr->Iex.ITE.iffalse);
+ r1 = s390_isel_float_expr(env, expr->Iex.ITE.iftrue);
+ size = sizeofIRType(typeOfIRExpr(env->type_env, expr->Iex.ITE.iftrue));
+
+ s390_cc_t cc = s390_isel_cc(env, cond_expr);
+
+ addInstr(env, s390_insn_move(size, dst, r0));
+ addInstr(env, s390_insn_cond_move(size, cc, dst, s390_opnd_reg(r1)));
+ return dst;
+ }
+
default:
goto irreducible;
}
}
}
+ /* --------- MULTIPLEX --------- */
+ case Iex_ITE: {
+ IRExpr *cond_expr = expr->Iex.ITE.cond;
+ HReg dst, r0, r1;
+
+ vassert(typeOfIRExpr(env->type_env, cond_expr) == Ity_I1);
+
+ dst = newVRegV(env);
+ r0 = s390_isel_vec_expr(env, expr->Iex.ITE.iffalse);
+ r1 = s390_isel_vec_expr(env, expr->Iex.ITE.iftrue);
+ size = sizeofIRType(typeOfIRExpr(env->type_env, expr->Iex.ITE.iftrue));
+
+ s390_cc_t cc = s390_isel_cc(env, cond_expr);
+
+ addInstr(env, s390_insn_move(size, dst, r0));
+ addInstr(env, s390_insn_cond_move(size, cc, dst, s390_opnd_reg(r1)));
+ return dst;
+ }
+
default:
goto irreducible;
}