diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2024-05-01 05:15:17 -0700 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2024-05-03 06:35:19 +0200 |
commit | 764b583a36e90929e119530bcda20e978d3e63d8 (patch) | |
tree | 763f65a13d8415f320a8a523519f00c03ef9758b | |
parent | 71e7a6feeca4ccc1bcb8c8469f0a7152ac936474 (diff) |
xtensa: add FDPIC-specific TLS macro variants
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
-rw-r--r-- | test/tls/tls-macros-xtensa.h | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/test/tls/tls-macros-xtensa.h b/test/tls/tls-macros-xtensa.h index 90fc726..6b2621c 100644 --- a/test/tls/tls-macros-xtensa.h +++ b/test/tls/tls-macros-xtensa.h @@ -22,6 +22,78 @@ : "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15"); \ __l; }) #elif defined(__XTENSA_CALL0_ABI__) +#ifdef __FDPIC__ +#define TLS_GD(x) \ + ({ int *__l; \ + int __t; \ + extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \ + __asm__ ("movi %[tmp], " #x "@GOTTLSDESC\n\t" \ + ".reloc ., R_XTENSA_TLS_ARG, " #x "\n\t" \ + "add a2, %[tmp], %[got]\n\t" \ + ".reloc ., R_XTENSA_TLS_FUNCDESC, " #x "\n\t" \ + "l32i %[tmp], a2, 0\n\t" \ + "mov a12, a11\n\t" \ + ".reloc ., R_XTENSA_TLS_GOT, " #x "\n\t" \ + "l32i a11, %[tmp], 4\n\t" \ + ".reloc ., R_XTENSA_TLS_FUNC, " #x "\n\t" \ + "_l32i %[tmp], %[tmp], 0\n\t" \ + ".reloc ., R_XTENSA_TLS_CALL, " #x "\n\t" \ + "callx0 %[tmp]\n\t" \ + "mov a11, a12\n\t" \ + "mov %[res], a2\n\t" \ + : [res] "=r" (__l), [tmp] "=&r" (__t) \ + : [got] "r" (_GLOBAL_OFFSET_TABLE_) \ + : "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\ + __l; }) + +#define TLS_LD(x) \ + ({ int *__l; \ + int __t; \ + extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \ + __asm__ ("movi %[tmp], _TLS_MODULE_BASE_@GOTTLSDESC\n\t" \ + ".reloc ., R_XTENSA_TLS_ARG, _TLS_MODULE_BASE_\n\t" \ + "add a2, %[tmp], %[got]\n\t" \ + ".reloc ., R_XTENSA_TLS_FUNCDESC, _TLS_MODULE_BASE_\n\t"\ + "l32i %[tmp], a2, 0\n\t" \ + "mov a12, a11\n\t" \ + ".reloc ., R_XTENSA_TLS_GOT, _TLS_MODULE_BASE_\n\t" \ + "l32i a11, %[tmp], 4\n\t" \ + ".reloc ., R_XTENSA_TLS_FUNC, _TLS_MODULE_BASE_\n\t" \ + "_l32i %[tmp], %[tmp], 0\n\t" \ + ".reloc ., R_XTENSA_TLS_CALL, _TLS_MODULE_BASE_\n\t" \ + "callx0 %[tmp]\n\t" \ + "mov a11, a12\n\t" \ + "movi %[res], " #x "@DTPOFF\n\t" \ + "add %[res], %[res], a2\n\t" \ + : [res] "=r" (__l), [tmp] "=&r" (__t) \ + : [got] "r" (_GLOBAL_OFFSET_TABLE_) \ + : "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\ + __l; }) + +#define TLS_IE(x) \ + ({ int *__l; \ + int __t; \ + extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \ + __asm__ ("movi %[tmp], " #x "@GOTTPOFF\n\t" \ + ".reloc ., R_XTENSA_TLS_TPOFF_PTR, " #x "\n\t" \ + "add %[tmp], %[tmp], %[got]\n\t" \ + ".reloc ., R_XTENSA_TLS_TPOFF_LOAD, " #x "\n\t" \ + "l32i %[tmp], %[tmp], 0\n\t" \ + "rur %[res], threadptr\n\t" \ + "add %[res], %[res], %[tmp]\n\t" \ + : [res] "=r" (__l), [tmp] "=&r" (__t) \ + : [got] "r" (_GLOBAL_OFFSET_TABLE_)); \ + __l; }) + +#define TLS_LE(x) \ + ({ int *__l; \ + int __t; \ + __asm__ ("rur %0, threadptr\n\t" \ + "movi %1, " #x "@TPOFF\n\t" \ + "add %0, %0, %1\n\t" \ + : "=r" (__l), "=r" (__t) ); \ + __l; }) +#else #define TLS_GD(x) \ ({ int *__l; \ __asm__ ("movi a0, " #x "@TLSFUNC\n\t" \ @@ -44,10 +116,12 @@ : \ : "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11");\ __l; }) +#endif #else #error Unsupported Xtensa ABI #endif +#ifndef __FDPIC__ #define TLS_IE(x) TLS_LE(x) #define TLS_LE(x) \ @@ -57,5 +131,5 @@ "movi %1, " #x "@TPOFF\n\t" \ "add %0, %0, %1\n\t" \ : "=r" (__l), "=r" (__t) ); \ - __l; }); \ - + __l; }) +#endif |