}
/* At entry of the nearest common dominator for basic blocks with
- conversions, generate a single
+ conversions/rcp/sqrt/rsqrt/round, generate a single
vxorps %xmmN, %xmmN, %xmmN
for all
vcvtss2sd op, %xmmN, %xmmX
continue;
/* Convert PARTIAL_XMM_UPDATE_TRUE insns, DF -> SF, SF -> DF,
- SI -> SF, SI -> DF, DI -> SF, DI -> DF, to vec_dup and
- vec_merge with subreg. */
+ SI -> SF, SI -> DF, DI -> SF, DI -> DF, sqrt, rsqrt, rcp,
+ round, to vec_dup and vec_merge with subreg. */
rtx src = SET_SRC (set);
rtx dest = SET_DEST (set);
machine_mode dest_mode = GET_MODE (dest);
- machine_mode src_mode = GET_MODE (XEXP (src, 0));
+ bool convert_p = false;
+ switch (GET_CODE (src))
+ {
+ case FLOAT:
+ case FLOAT_EXTEND:
+ case FLOAT_TRUNCATE:
+ case UNSIGNED_FLOAT:
+ convert_p = true;
+ break;
+ default:
+ break;
+ }
+ /* Only hanlde conversion here. */
+ machine_mode src_mode
+ = convert_p ? GET_MODE (XEXP (src, 0)) : VOIDmode;
switch (src_mode)
{
case E_SFmode:
|| !TARGET_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY)
continue;
break;
- default:
+ case E_VOIDmode:
+ gcc_assert (!convert_p);
break;
+ default:
+ gcc_unreachable ();
}
if (!v4sf_const0)