[COMMITTED] hppa: Improve PIC pc-relative instruction sequences

Message ID 99A68D04-81BA-47A7-B659-937E1EDF6E61@bell.net
State Committed
Headers

Commit Message

John David Anglin Dec. 2, 2017, 4:19 p.m. UTC
  The priority level of user code on PA-RISC is always 3.  The "depi" instruction used to clear the priority
level saved in the link register can be eliminated by adjusting the offsets of the following $PIC_pcrel$
instructions.

Tested with no observed regressions.  Committed to trunk.

Dave
--
John David Anglin	dave.anglin@bell.net
2017-12-02  John David Anglin  <danglin@gcc.gnu.org>

	* sysdeps/hppa/dl-fptr.c (elf_machine_resolve): Remove unnecessary
	depi instruction from PIC pc-relative sequence.
	* sysdeps/hppa/dl-fptr.h (ELF_MACHINE_LOAD_ADDRESS): Likewise.
	* sysdeps/hppa/dl-machine.h (elf_machine_dynamic): Likewise.
	(elf_machine_load_address): Likewise.
	(elf_machine_runtime_setup): Likewise.
  

Patch

diff --git a/sysdeps/hppa/dl-fptr.c b/sysdeps/hppa/dl-fptr.c
index 96fd09d192..d2cc413403 100644
--- a/sysdeps/hppa/dl-fptr.c
+++ b/sysdeps/hppa/dl-fptr.c
@@ -329,9 +329,8 @@  elf_machine_resolve (void)
   Elf32_Addr addr;
 
   asm ("b,l     1f,%0\n"
-"	depi	0,31,2,%0\n"
-"1:	addil	L'_dl_runtime_resolve - ($PIC_pcrel$0 - 8),%0\n"
-"	ldo	R'_dl_runtime_resolve - ($PIC_pcrel$0 - 12)(%%r1),%0\n"
+"	addil	L'_dl_runtime_resolve - ($PIC_pcrel$0 - 1),%0\n"
+"1:	ldo	R'_dl_runtime_resolve - ($PIC_pcrel$0 - 5)(%%r1),%0\n"
        : "=r" (addr) : : "r1");
 
   return addr;
diff --git a/sysdeps/hppa/dl-fptr.h b/sysdeps/hppa/dl-fptr.h
index 0cb50524fd..3ed86bb230 100644
--- a/sysdeps/hppa/dl-fptr.h
+++ b/sysdeps/hppa/dl-fptr.h
@@ -31,9 +31,8 @@  extern void _dl_fptr_init (void);
 #define ELF_MACHINE_LOAD_ADDRESS(var, symbol) \
   asm (								\
 "	b,l	1f,%0\n"					\
-"	depi	0,31,2,%0\n"					\
-"1:	addil	L'" #symbol " - ($PIC_pcrel$0 - 8),%0\n"	\
-"	ldo	R'" #symbol " - ($PIC_pcrel$0 - 12)(%%r1),%0\n"	\
+"	addil	L'" #symbol " - ($PIC_pcrel$0 - 1),%0\n"	\
+"1:	ldo	R'" #symbol " - ($PIC_pcrel$0 - 5)(%%r1),%0\n"	\
    : "=&r" (var) : : "r1");
 
 #endif /* !dl_hppa_fptr_h */
diff --git a/sysdeps/hppa/dl-machine.h b/sysdeps/hppa/dl-machine.h
index acfb9fc31f..11ee9ca2eb 100644
--- a/sysdeps/hppa/dl-machine.h
+++ b/sysdeps/hppa/dl-machine.h
@@ -81,10 +81,9 @@  elf_machine_dynamic (void)
 {
   Elf32_Addr dynamic;
 
-  asm ("b,l	1f,%0\n"
-"	depi	0,31,2,%0\n"
-"1:	addil	L'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 8),%0\n"
-"	ldw	R'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 12)(%%r1),%0\n"
+  asm ("bl	1f,%0\n"
+"	addil	L'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 1),%0\n"
+"1:	ldw	R'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 5)(%%r1),%0\n"
        : "=r" (dynamic) : : "r1");
 
   return dynamic;
@@ -100,10 +99,9 @@  elf_machine_load_address (void)
   Elf32_Addr dynamic;
 
   asm (
-"	b,l	1f,%0\n"
-"	depi	0,31,2,%0\n"
-"1:	addil	L'_DYNAMIC - ($PIC_pcrel$0 - 8),%0\n"
-"	ldo	R'_DYNAMIC - ($PIC_pcrel$0 - 12)(%%r1),%0\n"
+"	bl	1f,%0\n"
+"	addil	L'_DYNAMIC - ($PIC_pcrel$0 - 1),%0\n"
+"1:	ldo	R'_DYNAMIC - ($PIC_pcrel$0 - 5)(%%r1),%0\n"
    : "=r" (dynamic) : : "r1");
 
   return dynamic - elf_machine_dynamic ();
@@ -339,14 +337,13 @@  asm (									\
 	   just like a branch reloc.  This sequence gets us the		\
 	   runtime address of _DYNAMIC. */				\
 "	bl	0f,%r19\n"						\
-"	depi	0,31,2,%r19\n"	/* clear priviledge bits */		\
-"0:	addil	L'_DYNAMIC - ($PIC_pcrel$0 - 8),%r19\n"			\
-"	ldo	R'_DYNAMIC - ($PIC_pcrel$0 - 12)(%r1),%r26\n"		\
+"	addil	L'_DYNAMIC - ($PIC_pcrel$0 - 1),%r19\n"			\
+"0:	ldo	R'_DYNAMIC - ($PIC_pcrel$0 - 5)(%r1),%r26\n"		\
 									\
 	/* The link time address is stored in the first entry of the	\
 	   GOT.  */							\
-"	addil	L'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 16),%r19\n"	\
-"	ldw	R'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 20)(%r1),%r20\n" \
+"	addil	L'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 9),%r19\n"	\
+"	ldw	R'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 13)(%r1),%r20\n" \
 									\
 "	sub	%r26,%r20,%r20\n"	/* Calculate load offset */	\
 									\