On Sat, 13 Nov 2010, Valeriy E. Ushakov wrote: > #define htole64(x) \
[blah] > > // just to exercise it a bit > struct s { > uint64_t foo[12]; > }; > > uint64_t > foo(struct s *s) > { > return s->foo[10] + htole64(s->foo[11]); > } > > > compiles to pretty sane: > > foo: > ldx [%o0+80], %g1 > ldxa [%o0+88] ASI_LITLE, %o0 > jmp %o7+8 > add %o0, %g1, %o0 Rather than continue this discussion deeper down the rathole, I just want make sure people understand what I'm trying to say which doesn't appear to be the case from the responses. This could work, with the proper constraints, in most cases, for letoh64() where you marshall in. It does not work to marshall out a value, where you neeed a macro of the form: #define htole64(x, v) (*(x)) = bswap64(v) void foo(struct s *s, uint64_t v) { htole64(&(s->foo[10]), s->foo[11]); } (Assembly language implemenation left to the user.) As for modifying gcc, I have long conemplated adding some sort of pragma or storage specifier extension to the language so specific data structures can indicate they are in a specific endianness. However, that would be a heck of a lot of work for what is probably very little gain and change the language's syntax so the code would no longer be standard ANSI or ISO C. Eduardo