summaryrefslogtreecommitdiff
path: root/sysdeps/hppa
diff options
context:
space:
mode:
authorJohn David Anglin <danglin@gcc.gnu.org>2017-12-02 11:04:16 -0500
committerJohn David Anglin <danglin@gcc.gnu.org>2017-12-02 11:04:16 -0500
commit800a496acbb8c43036b3832460220d4ecbbc22a4 (patch)
tree6b711b1be53e3204c64d2863e827dfc432b46d7b /sysdeps/hppa
parentd17542d235dd6dd4a83d28997f789543417afe11 (diff)
Improve PIC pc-relative instruction sequences on hppa.
* 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.
Diffstat (limited to 'sysdeps/hppa')
-rw-r--r--sysdeps/hppa/dl-fptr.c5
-rw-r--r--sysdeps/hppa/dl-fptr.h5
-rw-r--r--sysdeps/hppa/dl-machine.h23
3 files changed, 14 insertions, 19 deletions
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 */ \
\