mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			115 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* TLS Access Macros for HP PARISC Linux */
 | |
| 
 | |
| /* HPPA Local Exec TLS access.  */
 | |
| #define TLS_LE(x) \
 | |
|   ({  int * __result;  \
 | |
|       unsigned long __tmp; \
 | |
|       asm ( \
 | |
| 	"  mfctl %%cr27, %1\n" \
 | |
| 	"  addil LR'" #x "-$tls_leoff$, %1\n" \
 | |
| 	"  ldo RR'" #x "-$tls_leoff$(%%r1), %0\n" \
 | |
|         : "=r" (__result), "=r" (__tmp) \
 | |
| 	: \
 | |
| 	: "r1" );  \
 | |
|       __result;  \
 | |
|   })
 | |
| 
 | |
| /* HPPA Initial Exec TLS access.  */
 | |
| #ifdef PIC
 | |
| #  define TLS_IE(x) \
 | |
|   ({  int * __result;  \
 | |
|       unsigned long __tmp, __tmp2; \
 | |
|       asm ( \
 | |
| 	"  mfctl %%cr27, %1\n" \
 | |
| 	"  addil LT'" #x "-$tls_ieoff$, %%r19\n" \
 | |
| 	"  ldw RT'" #x "-$tls_ieoff$(%%r1), %2\n" \
 | |
| 	"  add %1, %2, %0\n" \
 | |
| 	: "=r" (__result), "=r" (__tmp), "=r" (__tmp2) \
 | |
| 	: \
 | |
| 	: "r1" ); \
 | |
|       __result;  \
 | |
|   })
 | |
| #else
 | |
| #  define TLS_IE(x) \
 | |
|   ({  int * __result;  \
 | |
|       unsigned long __tmp, __tmp2; \
 | |
|       asm ( \
 | |
| 	"  mfctl %%cr27, %1\n" \
 | |
| 	"  addil LR'" #x "-$tls_ieoff$, %%r27\n" \
 | |
| 	"  ldw RR'" #x "-$tls_ieoff$(%%r1), %2\n" \
 | |
| 	"  add %1, %2, %0\n" \
 | |
| 	: "=r" (__result), "=r" (__tmp), "=r" (__tmp2) \
 | |
| 	: \
 | |
| 	: "r1" ); \
 | |
|       __result;  \
 | |
|   })
 | |
| #endif
 | |
| 
 | |
| #ifdef PIC
 | |
| /* HPPA Local Dynamic TLS access.  */
 | |
| #  define TLS_LD(x) \
 | |
|   ({  int * __result;  \
 | |
|       asm (  \
 | |
| 	"  copy %%r19, %%r4\n" \
 | |
| 	"  addil LT'" #x "-$tls_ldidx$, %%r19\n" \
 | |
| 	"  bl __tls_get_addr, %%r2\n" \
 | |
| 	"  ldo RT'" #x "-$tls_ldidx$(%%r1), %%r26\n" \
 | |
| 	"  addil LR'" #x "-$tls_dtpoff$, %%r28\n" \
 | |
| 	"  ldo RR'" #x "-$tls_dtpoff$(%%r1), %0\n" \
 | |
| 	"  copy %%r4, %%r19\n" \
 | |
| 	: "=r" (__result) \
 | |
| 	: \
 | |
| 	: "r1", "r2", "r4", "r20", "r21", "r22", "r23", "r24", \
 | |
| 	  "r25", "r26", "r28", "r29", "r31" ); \
 | |
|       __result;  \
 | |
|   })
 | |
| #else
 | |
| #  define TLS_LD(x) \
 | |
|   ({  int * __result;  \
 | |
|       asm (  \
 | |
| 	"  addil LR'" #x "-$tls_ldidx$, %%r27\n" \
 | |
| 	"  bl __tls_get_addr, %%r2\n" \
 | |
| 	"  ldo RR'" #x "-$tls_ldidx$(%%r1), %%r26\n" \
 | |
| 	"  addil LR'" #x "-$tls_dtpoff$, %%r28\n" \
 | |
| 	"  ldo RR'" #x "-$tls_dtpoff$(%%r1), %0\n" \
 | |
| 	: "=r" (__result) \
 | |
| 	: \
 | |
| 	: "r1", "r2", "r20", "r21", "r22", "r23", "r24", \
 | |
| 	  "r25", "r26", "r28", "r29", "r31" ); \
 | |
|       __result;  \
 | |
|   })
 | |
| #endif
 | |
| 
 | |
| /* HPPA General Dynamic TLS access.  */
 | |
| #ifdef PIC
 | |
| #  define TLS_GD(x) \
 | |
|   ({  int * __result;  \
 | |
|       asm (  \
 | |
| 	"  copy %%r19, %%r4\n" \
 | |
|         "  addil LT'" #x "-$tls_gdidx$, %%r19\n" \
 | |
| 	"  bl __tls_get_addr, %%r2\n" \
 | |
| 	"  ldo RT'" #x "-$tls_gdidx$(%%r1), %%r26\n" \
 | |
| 	"  copy %%r28, %0\n" \
 | |
| 	"  copy %%r4, %%r19\n" \
 | |
| 	: "=r" (__result) \
 | |
| 	: \
 | |
| 	: "r1", "r2", "r4", "r20", "r21", "r22", "r23", "r24", \
 | |
| 	  "r25", "r26", "r28", "r29", "r31" ); \
 | |
|       __result;  \
 | |
|   })
 | |
| #else
 | |
| #  define TLS_GD(x) \
 | |
|   ({  int * __result;  \
 | |
|       asm (  \
 | |
|         "  addil LR'" #x "-$tls_gdidx$, %%r27\n" \
 | |
| 	"  bl __tls_get_addr, %%r2\n" \
 | |
| 	"  ldo RR'" #x "-$tls_gdidx$(%%r1), %%r26\n" \
 | |
| 	"  copy %%r28, %0\n" \
 | |
| 	: "=r" (__result) \
 | |
| 	: \
 | |
| 	: "r1", "r2", "r20", "r21", "r22", "r23", "r24", \
 | |
| 	  "r25", "r26", "r28", "r29", "r31" ); \
 | |
|       __result;  \
 | |
|   })
 | |
| #endif
 |