From 8daa704ea4c8936eb033317bf2d20d82b3226553 Mon Sep 17 00:00:00 2001 From: Chris Metcalf Date: Fri, 11 May 2012 18:06:42 -0400 Subject: [PATCH] tile: fix broken TLS_GD macros These still corresponded to an older version of the TLS code in the compiler. Now they match the code in gcc 4.7. --- ChangeLog.tile | 4 ++++ sysdeps/tile/tls-macros.h | 58 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/ChangeLog.tile b/ChangeLog.tile index 3c192e9..f2eb35a 100644 --- a/ChangeLog.tile +++ b/ChangeLog.tile @@ -1,5 +1,9 @@ 2012-05-12 Chris Metcalf + * sysdeps/tile/tls-macros.h: Fix buggy TLS_GD, etc., macros. + +2012-05-12 Chris Metcalf + * sysdeps/tile/tilegx/memchr.c: Use new copy_byte() function to efficiently generate a large constant for masking. * sysdeps/tile/tilegx/memset.c: Likewise. diff --git a/sysdeps/tile/tls-macros.h b/sysdeps/tile/tls-macros.h index 9a7e279..25e5375 100644 --- a/sysdeps/tile/tls-macros.h +++ b/sysdeps/tile/tls-macros.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2011 Free Software Foundation, Inc. +/* Copyright (C) 2011-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Chris Metcalf , 2011. @@ -17,13 +17,14 @@ . */ #ifdef __tilegx__ -#define TLS_GD_REL "hw0_last_tls_gd" -#define TLS_IE_REL "hw0_last_tls_ie" -#define LD_TLS "ld_tls" +#define TLS_GD_OFFSET(x) \ + "moveli r0, hw1_last_tls_gd(" #x ")\n\t" \ + "shl16insli r0, r0, hw0_tls_gd(" #x ")\n\t" \ + "addi r0, %1, tls_add(" #x ")\n\t" #else -#define TLS_GD_REL "tls_gd_lo16" -#define TLS_IE_REL "tls_ie_lo16" -#define LD_TLS "lw_tls" +#define TLS_GD_OFFSET(x) \ + "auli r0, %1, tls_gd_ha16(" #x ")\n\t" \ + "addli r0, r0, tls_gd_lo16(" #x ")\n\t" #endif #define TLS_GD(x) \ @@ -31,26 +32,53 @@ int *__retval; \ extern char _GLOBAL_OFFSET_TABLE_[]; \ \ - asm ("addli r0, %1, " TLS_GD_REL "(" #x ")\n\t" \ + asm (TLS_GD_OFFSET(x) \ "jal tls_gd_call(" #x ")\n\t" \ "addi %0, r0, tls_gd_add(" #x ")" : \ - "=r" (__retval) : "r" (_GLOBAL_OFFSET_TABLE_) : \ - "r25", "r26", "r27", "r28", "r29"); \ + "=&r" (__retval) : "r" (_GLOBAL_OFFSET_TABLE_) : \ + "r0", "r25", "r26", "r27", "r28", "r29"); \ __retval; }) /* No special support for LD mode. */ #define TLS_LD TLS_GD +#ifdef __tilegx__ +#define TLS_IE_OFFSET(x) \ + "moveli %0, hw1_last_tls_ie(" #x ")\n\t" \ + "shl16insli %0, %0, hw0_tls_ie(" #x ")\n\t" \ + "addi %0, %1, tls_add(" #x ")\n\t" +#define LD_TLS "ld_tls" +#else +#define TLS_IE_OFFSET(x) \ + "auli %0, %1, tls_ie_ha16(" #x ")\n\t" \ + "addli %0, %0, tls_ie_lo16(" #x ")\n\t" +#define LD_TLS "lw_tls" +#endif + #define TLS_IE(x) \ ({ \ int *__retval; \ extern char _GLOBAL_OFFSET_TABLE_[]; \ \ - asm ("addli %0, %1, " TLS_IE_REL "(" #x ")\n\t" \ - LD_TLS " %0, %0, tls_ie_load(" #x ")\n\t" \ + asm (TLS_IE_OFFSET(x) \ + LD_TLS " %0, %0, tls_ie_load(" #x ")\n\t" \ "add %0, %0, tp" : \ - "=r" (__retval) : "r" (_GLOBAL_OFFSET_TABLE_)); \ + "=&r" (__retval) : "r" (_GLOBAL_OFFSET_TABLE_)); \ __retval; }) -/* No special support for LE mode. */ -#define TLS_LE TLS_IE +#ifdef __tilegx__ +#define _TLS_LE(x) \ + "moveli %0, hw1_last_tls_le(" #x ")\n\t" \ + "shl16insli %0, %0, hw0_tls_le(" #x ")\n\t" \ + "add %0, %0, tp" +#else +#define _TLS_LE(x) \ + "auli %0, tp, tls_le_ha16(" #x ")\n\t" \ + "addli %0, %0, tls_le_lo16(" #x ")\n\t" +#endif + +#define TLS_LE(x) \ + ({ \ + int *__retval; \ + asm (_TLS_LE(x) : "=r" (__retval)); \ + __retval; }) -- 2.7.4