gcc 3.4 complians about: include/asm/unaligned.h:66: error: inconsistent operand constraints in an `asm' from linux CVS 2.4 branch. That's: /* * Store doubleword ununaligned. */ static inline void __stq_u(unsigned long __val, unsigned long long * __addr) { __asm__("usw\t%1, %0\n\t" "usw\t%D1, 4+%0" : "=m" (*__addr) : "r" (__val)); } I was baffled by the "%D1" syntax until Thiemo Seufer pointed out that %D1 assembled to "one register higher than the register chosen for %1". Ooooookay. But gcc complains about a constraint problem. Maybe "r" and "%Dn" don't get along (long)? Anyway... what about __val's type? I would expect that to be "unsigned long long" for -mabi=32. Otherwise will "%D" get what the asm author expected? If I do change it to "unsigned long long" then I get two of the constraint errors. Ooooookay. Anyone got a constraint that means "consecutive register pair"? I finally decided to punt and write: static inline void __stq_u(unsigned long long __val, unsigned long long * __addr) { *__addr = __val; } Is this OK? Is there a better solution? Regards, Brad