gcc 3.4 complians about:
include/asm/unaligned.h:66: error: inconsistent operand constraints in an
from linux CVS 2.4 branch. That's:
* Store doubleword ununaligned.
static inline void __stq_u(unsigned long __val, unsigned long long * __addr)
: "=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
I finally decided to punt and write:
static inline void __stq_u(unsigned long long __val, unsigned long long *
*__addr = __val;
Is this OK? Is there a better solution?