>>[оверквотинг удален]
>>int main() {
>>
>> unsigned short int x, y;
>> x = y << 8;
>>return 0;
>>}
>
>во freebsd i386 htons это __byte_swap_word
> и аргумент до int нигде по дороге не расширяется При -O0 это
extern uint16_t htons (uint16_t __hostshort);
но при -O2 и более это тоже макрось __swap_16(x), и далее __bswap_constant_16(__x)
<in.h>
#ifdef __OPTIMIZE__
# if __BYTE_ORDER == __BIG_ENDIAN
...
# define htons(x) (x)
# else
# if __BYTE_ORDER == __LITTLE_ENDIAN
...
# define htohs(x) __bswap_16 (x)
в <bits/byteswap.h>
/* Swap bytes in 16 bit value. */
#define __bswap_constant_16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
# define __bswap_16(x) \
(__extension__ \
({ register unsigned short int __v, __x = (x); \
if (__builtin_constant_p (__x)) \
__v = __bswap_constant_16 (__x); \
else \
__asm__ ("rorw $8, %w0" \
: "=r" (__v) \
: "0" (__x) \
: "cc"); \
__v; }))
if (__builtin_constant_p (__x))
Где живёт __builtin_constant_p не нашёл
-fno-builtn не помогает, чтоб до asm дошло дело.