Hi,
My target has 16bit chars.
What I am seeing is that in a memset call, the call is not inlined by
GCC whenever fill value is bigger than host char.
This seems to be due to the code (GCC 4.6.5) in target_char_cast
(builtins.c), called from expand_builtin_memset_args:
static int
target_char_cast (tree cst, char *p)
{
unsigned HOST_WIDE_INT val, hostval;
if (TREE_CODE (cst) != INTEGER_CST
|| CHAR_TYPE_SIZE > HOST_BITS_PER_WIDE_INT)
return 1;
val = TREE_INT_CST_LOW (cst);
if (CHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT)
val &= (((unsigned HOST_WIDE_INT) 1) << CHAR_TYPE_SIZE) - 1;
hostval = val;
if (HOST_BITS_PER_CHAR < HOST_BITS_PER_WIDE_INT)
hostval &= (((unsigned HOST_WIDE_INT) 1) << HOST_BITS_PER_CHAR) - 1;
if (val != hostval)
return 1;
*p = hostval;
return 0;
}
This requires the tree cst variable to fit in target char (which makes
sense) and in host char (which doesn't make sense).
Why would the fill value in a memset call be required to fit in a host
char?
Cheers,
--
PMatos