Hi there, Can anyone explain why has been chosen that -march=i686 makes the compiler change the normal behaviour, and zero-expand unsigned short parameters into 32-bit registers by all means? E.g. void __attribute(( regparm(2) )) myoutl( d, p ) { asm(" outl %0,(%w1) \n" : : "a" (d), "d" (p) ); } assembled with gcc -Os -fomit-frame-pointer -march=i586 ... gives us outl %eax,(%dx) ret but changing "-march=i686" gives us movzwl %dx,%edx outl %eax,(%dx) ret Is it a bug, or had any developer a good reason to do so? David