mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	* sysdeps/powerpc/elf/ifunc-sel.h: Moved to ... * sysdeps/powerpc/ifunc-sel.h: ... here. * sysdeps/powerpc/elf/rtld-global-offsets.sym: Moved to ... * sysdeps/powerpc/rtld-global-offsets.sym: ... here.
		
			
				
	
	
		
			47 lines
		
	
	
		
			1011 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1011 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Used by the elf ifunc tests.  */
 | |
| #ifndef ELF_IFUNC_SEL_H
 | |
| #define ELF_IFUNC_SEL_H 1
 | |
| 
 | |
| extern int global;
 | |
| 
 | |
| static inline void *
 | |
| ifunc_sel (int (*f1) (void), int (*f2) (void), int (*f3) (void))
 | |
| {
 | |
|   register void *ret __asm__ ("r3");
 | |
|   __asm__ ("mflr 12\n\t"
 | |
| 	   "bcl 20,31,1f\n"
 | |
| 	   "1:\tmflr 11\n\t"
 | |
| 	   "mtlr 12\n\t"
 | |
| 	   "addis 12,11,global-1b@ha\n\t"
 | |
| 	   "lwz 12,global-1b@l(12)\n\t"
 | |
| 	   "addis %0,11,%2-1b@ha\n\t"
 | |
| 	   "addi %0,%0,%2-1b@l\n\t"
 | |
| 	   "cmpwi 12,1\n\t"
 | |
| 	   "beqlr\n\t"
 | |
| 	   "addis %0,11,%3-1b@ha\n\t"
 | |
| 	   "addi %0,%0,%3-1b@l\n\t"
 | |
| 	   "cmpwi 12,-1\n\t"
 | |
| 	   "beqlr\n\t"
 | |
| 	   "addis %0,11,%4-1b@ha\n\t"
 | |
| 	   "addi %0,%0,%4-1b@l"
 | |
| 	   : "=r" (ret)
 | |
| 	   : "X" (&global), "X" (f1), "X" (f2), "X" (f3));
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static inline void *
 | |
| ifunc_one (int (*f1) (void))
 | |
| {
 | |
|   register void *ret __asm__ ("r3");
 | |
|   __asm__ ("mflr 12\n\t"
 | |
| 	   "bcl 20,31,1f\n"
 | |
| 	   "1:\tmflr %0\n\t"
 | |
| 	   "mtlr 12\n\t"
 | |
| 	   "addis %0,%0,%1-1b@ha\n\t"
 | |
| 	   "addi %0,%0,%1-1b@l"
 | |
| 	   : "=r" (ret)
 | |
| 	   : "X" (f1));
 | |
|   return ret;
 | |
| }
 | |
| #endif
 |