diff options
author | joseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2012-07-31 15:30:38 +0000 |
---|---|---|
committer | joseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2012-07-31 15:30:38 +0000 |
commit | dd3105b347f432016fcdc1abd472c3717f557c9e (patch) | |
tree | cbaaecdaa1d3ad240177c9040f7f46c1387716ce /libc/sysdeps/powerpc/powerpc64/tls-macros.h | |
parent | 20f73aac36c2b2c240dcc379d5117488fe44960c (diff) | |
download | eglibc2-dd3105b347f432016fcdc1abd472c3717f557c9e.tar.gz |
Merge changes between r19464 and r19920 from /fsf/trunk.
git-svn-id: svn://svn.eglibc.org/trunk@19921 7b3dc134-2b1b-0410-93df-9e9f96275f8d
Diffstat (limited to 'libc/sysdeps/powerpc/powerpc64/tls-macros.h')
-rw-r--r-- | libc/sysdeps/powerpc/powerpc64/tls-macros.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/libc/sysdeps/powerpc/powerpc64/tls-macros.h b/libc/sysdeps/powerpc/powerpc64/tls-macros.h new file mode 100644 index 000000000..198215d5f --- /dev/null +++ b/libc/sysdeps/powerpc/powerpc64/tls-macros.h @@ -0,0 +1,46 @@ +/* Include sysdeps/powerpc/tls-macros.h for __TLS_CALL_CLOBBERS */ +#include_next "tls-macros.h" + +/* PowerPC64 Local Exec TLS access. */ +#define TLS_LE(x) \ + ({ int * __result; \ + asm ("addis %0,13," #x "@tprel@ha\n\t" \ + "addi %0,%0," #x "@tprel@l" \ + : "=b" (__result) ); \ + __result; \ + }) +/* PowerPC64 Initial Exec TLS access. */ +#define TLS_IE(x) \ + ({ int * __result; \ + asm ("ld %0," #x "@got@tprel(2)\n\t" \ + "add %0,%0," #x "@tls" \ + : "=r" (__result) ); \ + __result; \ + }) +#ifdef HAVE_ASM_GLOBAL_DOT_NAME +# define __TLS_GET_ADDR ".__tls_get_addr" +#else +# define __TLS_GET_ADDR "__tls_get_addr" +#endif +/* PowerPC64 Local Dynamic TLS access. */ +#define TLS_LD(x) \ + ({ int * __result; \ + asm ("addi 3,2," #x "@got@tlsld\n\t" \ + "bl " __TLS_GET_ADDR "\n\t" \ + "nop \n\t" \ + "addis %0,3," #x "@dtprel@ha\n\t" \ + "addi %0,%0," #x "@dtprel@l" \ + : "=b" (__result) : \ + : "3", __TLS_CALL_CLOBBERS); \ + __result; \ + }) +/* PowerPC64 General Dynamic TLS access. */ +#define TLS_GD(x) \ + ({ register int *__result __asm__ ("r3"); \ + asm ("addi 3,2," #x "@got@tlsgd\n\t" \ + "bl " __TLS_GET_ADDR "\n\t" \ + "nop " \ + : "=r" (__result) : \ + : __TLS_CALL_CLOBBERS); \ + __result; \ + }) |