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

Reply via email to