On Wed, Jul 27, 2011 at 11:52 PM, Uros Bizjak <ubiz...@gmail.com> wrote: > On Thu, Jul 28, 2011 at 4:55 AM, H.J. Lu <hongjiu...@intel.com> wrote: >> TLS on X32 is almost identical to TLS on x86-64. The only difference is >> x32 address space is 32bit. That means TLS symbols can be in either >> SImode or DImode with upper 32bit zero. This patch updates >> tls_global_dynamic_64 to support x32. OK for trunk? > >> 2011-07-27 H.J. Lu <hongjiu...@intel.com> >> >> PR target/47715 >> * config/i386/i386.md (PTR64): New. >> (*tls_global_dynamic_64): Rename to ... >> (*tls_global_dynamic_64_<mode>): This. Put PTR64 on operand 1. >> (tls_global_dynamic_64): Rename to ... >> (tls_global_dynamic_64_<mode>): This. Put PTR64 on operand 1. >> * config/i386/i386.c (legitimize_tls_address): Updated. > > Just remove mode check, so: > > (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")] > > at both sites. > > - fputs (ASM_BYTE "0x66\n", asm_out_file); > + if (!TARGET_X32) > + fputs (ASM_BYTE "0x66\n", asm_out_file); > > Are you sure? There are some scary comments in binutils that these > sequences have to be written _exactly_ as shown to enable certain > linker relaxations w.r.t. TLS relocs.
That is true. I updated those scary comments in binutils for x32 :-). Since x32 is 32bit, we can use 32bit move instructions instead 64bit. We don't need REX prefix in x32. Now those scary comments read: /* Check transition from GD access model. For 64bit, only .byte 0x66; leaq foo@tlsgd(%rip), %rdi .word 0x6666; rex64; call __tls_get_addr can transit to different access model. For 32bit, only leaq foo@tlsgd(%rip), %rdi .word 0x6666; rex64; call __tls_get_addr can transit to different access model. */ The difference is one less 0x66 byte. -- H.J.