summaryrefslogtreecommitdiff
path: root/cipher/cast5-amd64.S
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2017-05-13 18:35:30 +0300
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2017-05-18 20:09:45 +0300
commitff02fca39c83bcf30c79368611ac65e273e77f6c (patch)
tree19b0f476a0284d4ca2fe0ad6624f0f76ddfed52b /cipher/cast5-amd64.S
parent434d4f2af39033fc626044ba9a060da298522293 (diff)
downloadlibgcrypt-ff02fca39c83bcf30c79368611ac65e273e77f6c.tar.gz
cast5-amd64: use 64-bit relocation with large PIC memory model
* cipher/cast5-amd64.S [__code_model_large__] (GET_EXTERN_POINTER): New. -- Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/cast5-amd64.S')
-rw-r--r--cipher/cast5-amd64.S15
1 files changed, 14 insertions, 1 deletions
diff --git a/cipher/cast5-amd64.S b/cipher/cast5-amd64.S
index 608fb64e..c04015a2 100644
--- a/cipher/cast5-amd64.S
+++ b/cipher/cast5-amd64.S
@@ -26,7 +26,20 @@
#if defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS) || !defined(__PIC__)
# define GET_EXTERN_POINTER(name, reg) movabsq $name, reg
#else
-# define GET_EXTERN_POINTER(name, reg) movq name@GOTPCREL(%rip), reg
+# ifdef __code_model_large__
+# define GET_EXTERN_POINTER(name, reg) \
+ pushq %r15; \
+ pushq %r14; \
+ 1: leaq 1b(%rip), reg; \
+ movabsq $_GLOBAL_OFFSET_TABLE_-1b, %r14; \
+ movabsq $name@GOT, %r15; \
+ addq %r14, reg; \
+ popq %r14; \
+ movq (reg, %r15), reg; \
+ popq %r15;
+# else
+# define GET_EXTERN_POINTER(name, reg) movq name@GOTPCREL(%rip), reg
+# endif
#endif
#ifdef HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS