When using the recent debian 4.0 build (gcc version 4.0.2 20050806 (prerelease) (Debian 4.0.1-4)) I had some problems with a 64bit kernel.
A cut down test case is: #define BUG_ON(x) asm volatile("tdnei %0,0" : : "r" (x)); static inline int bar(int val) { return val + 1; } int foo; void baz() { BUG_ON(bar(foo)); } gcc 3.4 sign extends before passing it to the inline assembly: .baz: ld 11,[EMAIL PROTECTED](2) lwa 9,0(11) addi 9,9,1 extsw 9,9 tdnei 9,0 But gcc 4.0 has removed the sign extension: .baz: ld 11,[EMAIL PROTECTED](2) lwz 9,0(11) addi 9,9,1 tdnei 9,0 gcc 4.0 does get it right with -fno-inline. -- Summary: Sign extension removed even when inline assembly uses variable Product: gcc Version: 4.0.2 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: anton at samba dot org CC: gcc-bugs at gcc dot gnu dot org GCC target triplet: powerpc64-unknown-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23422