Ok, since we ran into so many problems last time around, why don't we
simply be less ambitious.  Perhaps trying to solve so many things all
at once in such a delicate area was a huge mistake. :-)

To that end, let's start with just a LEA64 macro and convert
mpn/sparc64 over to it.

It uses rdpc, therefore it doesn't have to be mindful of PIC thunks
nor having to cater to leaf functions in a special way.

It also doesn't try to use gotdata relocations.

I have my fingers crossed, hoping that this approach has much less
fallout.  But, we'll see. :-)

2013-04-15  David S. Miller  <da...@davemloft.net>

        * mpn/sparc32/sparc-defs.m4 (LEA64): New macro.
        * mpn/sparc64/gcd_1.asm: Use it.
        * mpn/sparc64/ultrasparct3/dive_1.asm: Likewise.
        * mpn/sparc64/ultrasparct3/invert_limb.asm: Likewise.
        * mpn/sparc64/ultrasparct3/mode1o.asm: Likewise.

diff -r 5ea92466ab67 mpn/sparc32/sparc-defs.m4
--- a/mpn/sparc32/sparc-defs.m4 Mon Apr 15 23:00:14 2013 +0200
+++ b/mpn/sparc32/sparc-defs.m4 Mon Apr 15 17:42:20 2013 -0700
@@ -46,4 +46,23 @@
   define(`lzcnt',      ``lzd'  $1, $2')
 ')
 
+dnl  Usage: LEA64(symbol,reg,pic_reg)
+dnl
+dnl  Use whatever 64-bit code sequence is appropriate to load "symbol" into
+dnl  register "reg", potentially using register "pic_reg" to perform the
+dnl  calculations.
+
+define(LEA64,
+m4_assert_numargs(3)
+m4_assert_defined(`HAVE_GOTDATA')
+`ifdef(`PIC',`
+       rd      %pc, %`$2'
+       sethi   %hi(_GLOBAL_OFFSET_TABLE_+4), %`$3'
+       add     %`$3', %lo(_GLOBAL_OFFSET_TABLE_+8), %`$3'
+       add     %`$2', %`$3', %`$3'
+       sethi   %hi(`$1'), %`$2'
+       or      %`$2', %lo(`$1'), %`$2'
+       ldx     [%`$3' + %`$2'], %`$2'',`
+       setx    `$1', %`$3', %`$2'')')
+
 divert
diff -r 5ea92466ab67 mpn/sparc64/gcd_1.asm
--- a/mpn/sparc64/gcd_1.asm     Mon Apr 15 23:00:14 2013 +0200
+++ b/mpn/sparc64/gcd_1.asm     Mon Apr 15 17:42:20 2013 -0700
@@ -94,22 +95,7 @@
 
 L(noreduce):
 
-ifdef(`PIC',`
-       rd      %pc, %g3
-       sethi   %hi(_GLOBAL_OFFSET_TABLE_+4), %g4
-       add     %g4, %lo(_GLOBAL_OFFSET_TABLE_+8), %g4
-       add     %g3, %g4, %g4
-       sethi   %hi(ctz_table), %g1
-       or      %g1, %lo(ctz_table), %g1
-       ldx     [%g4+%g1], %i5
-',`
-       sethi   %hh(ctz_table), %l7
-       or      %l7, %hm(ctz_table), %l7
-       sllx    %l7, 32, %l7
-       sethi   %lm(ctz_table), %g1
-       add     %l7, %g1, %l7
-       or      %l7, %lo(ctz_table), %i5
-')
+       LEA64(ctz_table, i5, g4)
 
        cmp     %o0, 0
        bnz     %xcc, L(mid)
diff -r 5ea92466ab67 mpn/sparc64/ultrasparct3/dive_1.asm
--- a/mpn/sparc64/ultrasparct3/dive_1.asm       Mon Apr 15 23:00:14 2013 +0200
+++ b/mpn/sparc64/ultrasparct3/dive_1.asm       Mon Apr 15 17:42:20 2013 -0700
@@ -54,22 +54,7 @@
        srlx    d, 1, %g1
        and     %g1, 127, %g1
 
-ifdef(`PIC',`
-       rd      %pc, %g3
-       sethi   %hi(_GLOBAL_OFFSET_TABLE_+4), %g4
-       add     %g4, %lo(_GLOBAL_OFFSET_TABLE_+8), %g4
-       add     %g3, %g4, %g4
-       sethi   %hi(binvert_limb_table), %g2
-       or      %g2, %lo(binvert_limb_table), %g2
-       ldx     [%g4+%g2], %g2
-',`
-       sethi   %hh(binvert_limb_table), %g3
-       or      %g3, %hm(binvert_limb_table), %g3
-       sllx    %g3, 32, %g3
-       sethi   %lm(binvert_limb_table), %g2
-       add     %g3, %g2, %g3
-       or      %g3, %lo(binvert_limb_table), %g2
-')
+       LEA64(binvert_limb_table, g2, g4)
        ldub    [%g2+%g1], %g1
        add     %g1, %g1, %g2
        mulx    %g1, %g1, %g1
diff -r 5ea92466ab67 mpn/sparc64/ultrasparct3/invert_limb.asm
--- a/mpn/sparc64/ultrasparct3/invert_limb.asm  Mon Apr 15 23:00:14 2013 +0200
+++ b/mpn/sparc64/ultrasparct3/invert_limb.asm  Mon Apr 15 17:42:20 2013 -0700
@@ -35,25 +35,10 @@
        srlx    d, 55, %g1
        add     %g1, %g1, %g1
 
-ifdef(`PIC',`
-       rd      %pc, %g3
-       sethi   %hi(_GLOBAL_OFFSET_TABLE_+4), %g4
-       add     %g4, %lo(_GLOBAL_OFFSET_TABLE_+8), %g4
-       add     %g3, %g4, %g4
-       sethi   %hi(approx_tab), %g2
-       or      %g2, %lo(approx_tab), %g2
-       ldx     [%g4+%g2], %g2
-       add     %g1, -512, %g1
-',`
-       sethi   %hh(approx_tab-512), %g3
-       or      %g3, %hm(approx_tab-512), %g3
-       sllx    %g3, 32, %g3
-       sethi   %lm(approx_tab-512), %g2
-       add     %g3, %g2, %g3
-       or      %g3, %lo(approx_tab-512), %g2
-')
+       LEA64(approx_tab, g2, g3)
+       sub     %g2, 512, %g2
+       srlx    d, 24, %g4
        lduh    [%g2+%g1], %g3
-       srlx    d, 24, %g4
        add     %g4, 1, %g4
        sllx    %g3, 11, %g2
        add     %g2, -1, %g2
diff -r 5ea92466ab67 mpn/sparc64/ultrasparct3/mode1o.asm
--- a/mpn/sparc64/ultrasparct3/mode1o.asm       Mon Apr 15 23:00:14 2013 +0200
+++ b/mpn/sparc64/ultrasparct3/mode1o.asm       Mon Apr 15 17:42:20 2013 -0700
@@ -41,22 +41,7 @@
        srlx    d, 1, %g1
        and     %g1, 127, %g1
 
-ifdef(`PIC',`
-       rd      %pc, %g3
-       sethi   %hi(_GLOBAL_OFFSET_TABLE_+4), %g4
-       add     %g4, %lo(_GLOBAL_OFFSET_TABLE_+8), %g4
-       add     %g3, %g4, %g4
-       sethi   %hi(binvert_limb_table), %g2
-       or      %g2, %lo(binvert_limb_table), %g2
-       ldx     [%g4+%g2], %g2
-',`
-       sethi   %hh(binvert_limb_table), %g3
-       or      %g3, %hm(binvert_limb_table), %g3
-       sllx    %g3, 32, %g3
-       sethi   %lm(binvert_limb_table), %g2
-       add     %g3, %g2, %g3
-       or      %g3, %lo(binvert_limb_table), %g2
-')
+       LEA64(binvert_limb_table, g2, g4)
        ldub    [%g2+%g1], %g1
        add     %g1, %g1, %g2
        mulx    %g1, %g1, %g1
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
http://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to