http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52698
--- Comment #2 from H.J. Lu <hjl.tools at gmail dot com> 2012-03-24 15:20:06 UTC --- Created attachment 26974 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=26974 A patch I am testing this patch with diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index a21f2da..586be4b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3181,7 +3181,7 @@ ix86_option_override_internal (bool main_args_p) TARGET_64BIT ? "64" : "32"); } else - ix86_pmode = TARGET_LP64 ? PMODE_DI : PMODE_SI; + ix86_pmode = TARGET_64BIT ? PMODE_DI : PMODE_SI; if (!global_options_set.x_ix86_abi) ix86_abi = DEFAULT_ABI; I will run GCC testsuite as well as glibc build/test. As I indicated before, we can use "mov{l}\t{%%fs:0, %k0|%k0, DWORD PTR fs:0}" to load thread pointer, which is an unsigned integral value with range from 0 to 0xffffffff into both SImode and DImode register. There is no need for zero-extend.