Trunk has this:

| /* Create an INT_CST node with a CST value zero extended.  */
| 
| static inline tree
| build_int_cstu (tree type, unsigned HOST_WIDE_INT cst)
| {
|   return double_int_to_tree (type, uhwi_to_double_int (cst));
| }

But the comment is misleading because of:

| /* Constructs tree in type TYPE from with value given by CST.  Signedness
|    of CST is assumed to be the same as the signedness of TYPE.  */
| 
| tree
| double_int_to_tree (tree type, double_int cst)
| {
|   /* Size types *are* sign extended.  */
|   bool sign_extended_type = (!TYPE_UNSIGNED (type)
|                            || (TREE_CODE (type) == INTEGER_TYPE
|                                && TYPE_IS_SIZETYPE (type)));
| 
|   cst = double_int_ext (cst, TYPE_PRECISION (type), !sign_extended_type);
| 
|   return build_int_cst_wide (type, cst.low, cst.high);
| }

So for size types, build_int_cstu does not peform zero extension, but
sign extension.

If I don't want sign extension, what function should I use instead?
Should I just call build_int_cst_wide directly?

And is HOST_WIDE_INT guaraunteed to be able to hold 64 bits?  I recall
a discussion were it was said that cross-builds from hosts with narrow
HOST_WIDE_INT to 64 bit targets weren't supported.

Reply via email to