about summary refs log tree commit diff
path: root/REORG.TODO/sysdeps/nios2/tls-macros.h
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/sysdeps/nios2/tls-macros.h')
-rw-r--r--REORG.TODO/sysdeps/nios2/tls-macros.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/nios2/tls-macros.h b/REORG.TODO/sysdeps/nios2/tls-macros.h
new file mode 100644
index 0000000000..7029530e46
--- /dev/null
+++ b/REORG.TODO/sysdeps/nios2/tls-macros.h
@@ -0,0 +1,46 @@
+#define TLS_LE(x)					\
+  ({ int *__result;					\
+     asm ("addi %0, r23, %%tls_le(" #x ")"		\
+	  : "=r" (__result));		                \
+     __result; })
+
+#define TLS_IE(x)					\
+  ({ int *__result;					\
+     int __tmp;                                         \
+     asm ("nextpc %0 ; "                                \
+          "1: movhi %1, %%hiadj(_gp_got - 1b) ; "	\
+          "addi %1, %1, %%lo(_gp_got - 1b) ; "		\
+          "add %0, %0, %1 ; "                           \
+          "ldw %1, %%tls_ie(" #x ")(%0) ; "        	\
+	  "add %1, r23, %1"              		\
+          : "=&r" (__tmp), "=&r" (__result));           \
+     __result; })
+
+#define TLS_LD(x)					\
+  ({ char *__result;					\
+     char *__result2;                                   \
+     int *__result3;                                    \
+     int __tmp;                                         \
+     extern void *__tls_get_addr (void *);		\
+     asm ("nextpc %0 ; "                                \
+          "1: movhi %1, %%hiadj(_gp_got - 1b) ; "	\
+          "addi %1, %1, %%lo(_gp_got - 1b) ; "		\
+          "add %0, %0, %1 ; "                           \
+          "addi %0, %0, %%tls_ldm(" #x ")"              \
+          : "=r" (__result), "=r" (__tmp));             \
+     __result2 = (char *)__tls_get_addr (__result);	\
+     asm ("addi %0, %1, %%tls_ldo(" #x ")"              \
+	  : "=r" (__result3) : "r" (__result2));        \
+     __result3; })
+
+#define TLS_GD(x)					\
+  ({ int *__result;					\
+     int __tmp;                                         \
+     extern void *__tls_get_addr (void *);		\
+     asm ("nextpc %0 ; "                                \
+          "1: movhi %1, %%hiadj(_gp_got - 1b) ; "	\
+          "addi %1, %1, %%lo(_gp_got - 1b) ; "		\
+          "add %0, %0, %1 ; "                           \
+          "addi %0, %0, %%tls_gd(" #x ")"		\
+	  : "=r" (__result), "=r" (__tmp));		\
+     (int *)__tls_get_addr (__result); })