On Thu, Apr 28, 2016 at 01:36:30PM +0300, Ilya Enkovich wrote:
> @@ -3145,11 +3168,25 @@ scalar_chain::compute_convert_gain ()
> || GET_CODE (src) == IOR
> || GET_CODE (src) == XOR
> || GET_CODE (src) == AND)
> - gain += ix86_cost->add;
> + {
> + gain += ix86_cost->add;
> + if (CONST_INT_P (XEXP (src, 0)))
> + gain -= scalar_chain::vector_const_cost (XEXP (src, 0));
> + if (CONST_INT_P (XEXP (src, 1)))
> + gain -= scalar_chain::vector_const_cost (XEXP (src, 1));
> + }
> else if (GET_CODE (src) == COMPARE)
> {
> /* Assume comparison cost is the same. */
> }
> + else if (GET_CODE (src) == CONST_INT)
> + {
> + if (REG_P (dst))
> + gain += COSTS_N_INSNS (2);
> + else if (MEM_P (dst))
> + gain += 2 * ix86_cost->int_store[2] - ix86_cost->sse_store[1];
> + gain -= scalar_chain::vector_const_cost (src);
> + }
> else
> gcc_unreachable ();
Where does the 2 come from? Is it that the STV pass right now supports only
2 * wordsize modes? Also, I don't think we should treat equally constants
that fit into the 32-bit immediates and constants that don't, the latter,
when movabsq needs to be used, are more costly.
Jakub