summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjorn Granlund <tege@gmplib.org>2012-12-12 22:53:54 +0100
committerTorbjorn Granlund <tege@gmplib.org>2012-12-12 22:53:54 +0100
commit3a6c33c66683940de0d794a447a11f9baddc53c9 (patch)
treedb780e7d75af2f23c637a2ef4686ed53ee6213dd
parentbf98aab7f7c2dfd394cc514d1094bd4c470339ba (diff)
downloadgmp-3a6c33c66683940de0d794a447a11f9baddc53c9.tar.gz
Properly support PIC code in x86_64 code with jump tables.
-rw-r--r--ChangeLog11
-rw-r--r--mpn/x86_64/darwin.m47
-rw-r--r--mpn/x86_64/dos64.m44
-rw-r--r--mpn/x86_64/mod_34lsub1.asm29
-rw-r--r--mpn/x86_64/mullo_basecase.asm33
-rw-r--r--mpn/x86_64/sqr_basecase.asm26
-rw-r--r--mpn/x86_64/x86_64-defs.m44
7 files changed, 75 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index 7fc57b39b..bc0af108c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,16 @@
-2012-12-11 Torbjorn Granlund <tege@gmplib.org>
+2012-12-12 Torbjorn Granlund <tege@gmplib.org>
* Version 5.1.0 released.
+ * mpn/x86_64/x86_64-defs.m4 (JMPENT): New macro.
+ * mpn/x86_64/dos64.m4: Likewise.
+ * mpn/x86_64/darwin.m4: Likewise.
+ * mpn/x86_64/mod_34lsub1.asm: Use JMPENT to properly support PIC.
+ * mpn/x86_64/mullo_basecase.asm: Likewise.
+ * mpn/x86_64/sqr_basecase.asm: Likewise.
+
+2012-12-11 Torbjorn Granlund <tege@gmplib.org>
+
* mpn/x86_64/mod_34lsub1.asm: Try different jump table for the benefit
of broken Apple linkers.
diff --git a/mpn/x86_64/darwin.m4 b/mpn/x86_64/darwin.m4
index c327631e7..d14009694 100644
--- a/mpn/x86_64/darwin.m4
+++ b/mpn/x86_64/darwin.m4
@@ -32,8 +32,13 @@ dnl Simply override the definition in x86_64-defs.m4.
define(`CALL',`call GSYM_PREFIX`'$1')
-define(`JUMPTABSECT', `DATA')
+define(`JUMPTABSECT', `RODATA')
+ifdef(`PIC',
+ `define(`JMPENT',
+ `.set $1_tmp, $1-$2
+ .long $1_tmp')',
+ `define(`JMPENT', `.quad $1')')
dnl Target ABI macros. For Darwin we override IFELF (and leave default for
dnl IFDOS and IFSTD).
diff --git a/mpn/x86_64/dos64.m4 b/mpn/x86_64/dos64.m4
index 74ca5489f..c1ae46c04 100644
--- a/mpn/x86_64/dos64.m4
+++ b/mpn/x86_64/dos64.m4
@@ -24,6 +24,10 @@ define(`LEA',`
define(`JUMPTABSECT', `RODATA')
+ifdef(`PIC',
+ `define(`JMPENT', `.long $1-$2')',
+ `define(`JMPENT', `.quad $1')')
+
dnl Usage: FUNC_ENTRY(nregparmas)
dnl Usage: FUNC_EXIT()
diff --git a/mpn/x86_64/mod_34lsub1.asm b/mpn/x86_64/mod_34lsub1.asm
index 2e69be430..d088381bb 100644
--- a/mpn/x86_64/mod_34lsub1.asm
+++ b/mpn/x86_64/mod_34lsub1.asm
@@ -103,24 +103,27 @@ forloop(i,1,UNROLL-1,`dnl
jnc L(top)
L(end):
-C Handle 0-8 remaining limbs. The switch code here is zany in an attempt to
-C fit the tiny envelope of code that triggers no Apple bugs
lea L(tab)(%rip), %r8
+ifdef(`PIC',
+` movslq 36(%r8,%rsi,4), %r10
+ add %r10, %r8
+ jmp *%r8
+',`
jmp *72(%r8,%rsi,8)
-
+')
JUMPTABSECT
ALIGN(8)
-L(tab): .quad L(0)
- .quad L(1)
- .quad L(2)
- .quad L(3)
- .quad L(4)
- .quad L(5)
- .quad L(6)
- .quad L(7)
- .quad L(8)
-
+L(tab): JMPENT( L(0), L(tab))
+ JMPENT( L(1), L(tab))
+ JMPENT( L(2), L(tab))
+ JMPENT( L(3), L(tab))
+ JMPENT( L(4), L(tab))
+ JMPENT( L(5), L(tab))
+ JMPENT( L(6), L(tab))
+ JMPENT( L(7), L(tab))
+ JMPENT( L(8), L(tab))
TEXT
+
L(6): add (ap), %rax
adc 8(ap), %rcx
adc 16(ap), %rdx
diff --git a/mpn/x86_64/mullo_basecase.asm b/mpn/x86_64/mullo_basecase.asm
index 95ccdb5fc..a066b8256 100644
--- a/mpn/x86_64/mullo_basecase.asm
+++ b/mpn/x86_64/mullo_basecase.asm
@@ -64,23 +64,28 @@ PROLOGUE(mpn_mullo_basecase)
mov (up), %rax C u0
mov (vp_param), %r8 C v0
- lea L(jmptab)(%rip), %r9
+ lea L(tab)(%rip), %r9
+ifdef(`PIC',
+` movslq (%r9,%rcx,4), %r10
+ add %r10, %r9
+ jmp *%r9
+',`
jmp *(%r9,n,8)
+')
JUMPTABSECT
ALIGN(8)
-L(jmptab):
- .quad 0 C not allowed
- .quad L(1) C 1
- .quad L(2) C 2
- .quad L(3) C 3
-C .quad L(0m4) C 4
-C .quad L(1m4) C 5
-C .quad L(2m4) C 6
-C .quad L(3m4) C 7
-C .quad L(0m4) C 8
-C .quad L(1m4) C 9
-C .quad L(2m4) C 10
-C .quad L(3m4) C 11
+L(tab): JMPENT( L(tab), L(tab)) C not allowed
+ JMPENT( L(1), L(tab)) C 1
+ JMPENT( L(2), L(tab)) C 2
+ JMPENT( L(3), L(tab)) C 3
+dnl JMPENT( L(0m4), L(tab)) C 4
+dnl JMPENT( L(1m4), L(tab)) C 5
+dnl JMPENT( L(2m4), L(tab)) C 6
+dnl JMPENT( L(3m4), L(tab)) C 7
+dnl JMPENT( L(0m4), L(tab)) C 8
+dnl JMPENT( L(1m4), L(tab)) C 9
+dnl JMPENT( L(2m4), L(tab)) C 10
+dnl JMPENT( L(3m4), L(tab)) C 11
TEXT
L(1): imul %r8, %rax
diff --git a/mpn/x86_64/sqr_basecase.asm b/mpn/x86_64/sqr_basecase.asm
index 412288131..9c3dd7667 100644
--- a/mpn/x86_64/sqr_basecase.asm
+++ b/mpn/x86_64/sqr_basecase.asm
@@ -99,19 +99,25 @@ PROLOGUE(mpn_sqr_basecase)
mov %r14, (%rsp)
cmovg %r8, %rcx
- lea L(jmptab)(%rip), %rax
+
+ lea L(tab)(%rip), %rax
+ifdef(`PIC',
+` movslq (%rax,%rcx,4), %r10
+ add %r10, %rax
+ jmp *%rax
+',`
jmp *(%rax,%rcx,8)
+')
JUMPTABSECT
ALIGN(8)
-L(jmptab):
- .quad L(4)
- .quad L(1)
- .quad L(2)
- .quad L(3)
- .quad L(0m4)
- .quad L(1m4)
- .quad L(2m4)
- .quad L(3m4)
+L(tab): JMPENT( L(4), L(tab))
+ JMPENT( L(1), L(tab))
+ JMPENT( L(2), L(tab))
+ JMPENT( L(3), L(tab))
+ JMPENT( L(0m4), L(tab))
+ JMPENT( L(1m4), L(tab))
+ JMPENT( L(2m4), L(tab))
+ JMPENT( L(3m4), L(tab))
TEXT
L(1): mov (up), %rax
diff --git a/mpn/x86_64/x86_64-defs.m4 b/mpn/x86_64/x86_64-defs.m4
index 5180ad5d8..870abb6b7 100644
--- a/mpn/x86_64/x86_64-defs.m4
+++ b/mpn/x86_64/x86_64-defs.m4
@@ -187,6 +187,10 @@ ifdef(`PIC',
define(`JUMPTABSECT', `.section .data.rel.ro.local,"aw",@progbits')
+ifdef(`PIC',
+ `define(`JMPENT', `.long $1-$2')',
+ `define(`JMPENT', `.quad $1')')
+
dnl These macros are defined just for DOS64, where they provide calling
dnl sequence glue code.