On Fri, Apr 08, 2005 at 02:41:58PM -0400, Salyzyn, Mark wrote:
> As long as this is guaranteed on all platforms to do the right thing ...
> paranoid about compiler optimizations. MarkH, this should be an easy
> regroup :-)
Well, let's see.
cpu_to_le32(~0U) -> __cpu_to_le32(~0U) ->
[on little-endian]
((__force __le32)(__u32)(~0U)) -> ((__le32)(__u32)(~0U))
[on big-endian]
((__force __le32)__swab32((~0U))) ->
((__le32)__swab32((~0U))) ->
((__le32) (__builtin_constant_p((__u32)((~0U))) ?
___swab32(((~0U)))
: __fswab32(((~0U))))) ->
((__le32) (__builtin_constant_p((__u32)((~0U))) ?
({
__u32 __x = ((~0U));
((__u32)(
(((__u32)(__x) & (__u32)0x000000ffUL) << 24) |
(((__u32)(__x) & (__u32)0x0000ff00UL) << 8) |
(((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) |
(((__u32)(__x) & (__u32)0xff000000UL) >> 24) ));
})
: __fswab32(((~0U)))))
And that's enough - __builtin_constant_p((__u32)((~0U)) is known at compile
time and is non-zero. The rest is obvious and yes, gcc does understand
that __x is constant and so is the expression above.
IOW, all cpu_to_...(<constant>) will be simplified to constants at compile
time. They will not be _constant_ _expressions_ from C point of view (IOW,
you can't say e.g.
enum {
A = cpu_to_le32(~0U)
};
- that's what __constant_cpu_to_le32() is for), but they certainly will be
evaluated by compiler.
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html