case Ity_I32:
put_vr_qw(v1, unop(Iop_Dup32x4, o2));
break;
- case Ity_I64:
- put_vr_qw(v1, binop(Iop_64HLtoV128, o2, o2));
+ case Ity_I64: {
+ IRTemp val = newTemp(Ity_I64);
+ assign(val, o2);
+ put_vr_qw(v1, binop(Iop_64HLtoV128, mkexpr(val), mkexpr(val)));
break;
+ }
default:
ppIRType(o2type);
vpanic("s390_vr_fill: invalid IRType");
}
case Iop_64HLtoV128:
- reg1 = s390_isel_int_expr(env, arg1);
- reg2 = s390_isel_int_expr(env, arg2);
-
- addInstr(env, s390_insn_vec_binop(size, S390_VEC_INIT_FROM_GPRS,
- dst, reg1, reg2));
-
+ if (arg1->tag == Iex_RdTmp && arg2->tag == Iex_RdTmp &&
+ arg1->Iex.RdTmp.tmp == arg2->Iex.RdTmp.tmp) {
+ s390_opnd_RMI src = s390_isel_int_expr_RMI(env, arg1);
+ addInstr(env, s390_insn_unop(8, S390_VEC_DUPLICATE, dst, src));
+ } else {
+ reg1 = s390_isel_int_expr(env, arg1);
+ reg2 = s390_isel_int_expr(env, arg2);
+ addInstr(env, s390_insn_vec_binop(size, S390_VEC_INIT_FROM_GPRS,
+ dst, reg1, reg2));
+ }
return dst;
default: