Constant folding is the process of simplifying constant expressions at compile time.
With constant folding support, i = 1 * 2 * 3 * 4 * 5; is calculated at compile time, i = 120.
#include <endian.h> typedef unsigned long long uint64; typedef unsigned long uint32; typedef union { uint64 big; uint32 small[2]; }long_long; #define HTONLL01(x) ({long_long i; i.small[0] = htonl((uint32)(x>>32)); \ i.small[1] = htonl((uint32)x); x = i.big;}) #if __BYTE_ORDER == __BIG_ENDIAN # define HTONLL02(x) (x) #else # if __BYTE_ORDER == __LITTLE_ENDIAN # define HTONLL02(x) (((uint64)htonl((uint32)x))<<32 | htonl((uint32)(x>>32))) # endif #endif From "/usr/include/bits/byteswap.h" /* Swap bytes in 64 bit value. */ #define __bswap_constant_64(x) \ ( (((x) & 0xff00000000000000ull) >> 56) \ | (((x) & 0x00ff000000000000ull) >> 40) \ | (((x) & 0x0000ff0000000000ull) >> 24) \ | (((x) & 0x000000ff00000000ull) >> 8) \ | (((x) & 0x00000000ff000000ull) << 8) \ | (((x) & 0x0000000000ff0000ull) << 24) \ | (((x) & 0x000000000000ff00ull) << 40) \ | (((x) & 0x00000000000000ffull) << 56)) # define __bswap_64(x) \ (__extension__ \ ({ union { __extension__ unsigned long long int __ll; \ unsigned long int __l[2]; } __w, __r; \ if (__builtin_constant_p (x)) \ __r.__ll = __bswap_constant_64 (x); \ else \ { \ __w.__ll = (x); \ __r.__l[0] = __bswap_32 (__w.__l[1]); \ __r.__l[1] = __bswap_32 (__w.__l[0]); \ } \ __r.__ll; }))Reference:
http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/
http://en.wikipedia.org/wiki/Constant_folding
No comments:
Post a Comment