From: Torbjorn Granlund <t...@gmplib.org>
Date: Wed, 10 Apr 2013 14:35:13 +0200

> Please use LEA* instead of LOAD_SYMBOL*, since that's what we use
> elsewhere.  (OK, LEA might be a misnomer, but a well-established one in
> and outside of GMP.)

Ok.

> I assume your broad testing covers every modified file.  Do you have an
> idea of whether that is true.

I rechecked everything and the one case I missed was supersparc-*

Even the current tree has a build problem of the supersparc target
with current tools due to combination of a bug in gcc specs handling
and new binutils enforcements of setting the cpu ABI correctly.

The issue is that gcc doesn't specify at least "v8" in the assembler
invocations when -mcpu=supersparc is given so binutils complains when
it sees integer multiply and divide instructions since it defaults to
v7.

I'll get those bugs sorted out, but at least gcc-4.6 and gcc-4.7 have
this problem, and have had them for some time, so I think we should
work around it.  A workaround that works is to pass "-mcpu=v8
-mcpu=supersparc" instead of just plain "-mcpu=supersparc"

For the sake of evaluating this LEA patch, I forced this CFLAGS by
hand on the make command line to make sure my LEA patches didn't
introduce any new problems.

> Whn testing shared libs, I have found that libtool sometimes prefers an
> instaled version to the newly compiled version.  That happens more often
> with 32-bit libs on 64-bit systems, since libtool doesn't set
> LD_32_LIBRARY_PATH.  Please make sure the shared builds' libraries have
> actually been tested.

I've verified that this works as intended.  LD_32_LIBRARY_PATH seems
to be a FreeBSD invention.

> That patch looks good to me, apart from the LEA issue.
> 
> Once you have addressed that, I would like to commit this to the main

Here is the new version, thanks:

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

        * acinclude.m4 (GMP_ASM_SPARC_GOTDATA,
        GMP_ASM_SPARC_SHARED_THUNKS): New feature tests.
        * configure.ac: Call GMP_ASM_SPARC_GOTDATA and
        GMP_ASM_SPARC_SHARED_THUNKS on sparc.
        * mpn/sparc32/sparc-defs.m4 (LEA, LEA_LEAF, LEA_THUNK): New
        macros.
        * mpn/sparc32/udiv.asm: Convert over to LEA, LEA_LEAF, and
        LEA_THUNK.
        * mpn/sparc32/v8/addmul_1.asm: Likewise.
        * mpn/sparc32/v8/mul_1.asm: Likewise.
        * mpn/sparc32/v8/supersparc/udiv.asm: Likewise.
        * mpn/sparc32/v8/udiv.asm: Likewise.
        * mpn/sparc64/gcd_1.asm: Likewise.
        * mpn/sparc64/ultrasparct3/dive_1.asm: Likewise.
        * mpn/sparc64/ultrasparct3/invert_limb.asm: Likewise.
        * mpn/sparc64/ultrasparct3/mode1o.asm: Likewise.
        * mpn/sparc32/v9/sqr_diagonal.asm: Likewise and use INT32.

diff -r a51d8e63e08e acinclude.m4
--- a/acinclude.m4      Tue Apr 09 15:05:39 2013 +0200
+++ b/acinclude.m4      Wed Apr 10 10:01:13 2013 -0700
@@ -3090,6 +3090,57 @@
 ])
 
 
+dnl  GMP_ASM_SPARC_GOTDATA
+dnl  ----------------------
+dnl  Determine whether the assembler accepts gotdata relocations.
+dnl
+dnl  See also mpn/sparc32/sparc-defs.m4 which uses the result of this test.
+
+AC_DEFUN([GMP_ASM_SPARC_GOTDATA],
+[AC_REQUIRE([GMP_ASM_TEXT])
+AC_CACHE_CHECK([if the assembler accepts gotdata relocations],
+               gmp_cv_asm_sparc_gotdata,
+[GMP_TRY_ASSEMBLE(
+[      $gmp_cv_asm_text
+       .text
+       sethi   %gdop_hix22(symbol), %g1
+       or      %g1, %gdop_lox10(symbol), %g1
+],
+[gmp_cv_asm_sparc_gotdata=yes],
+[gmp_cv_asm_sparc_gotdata=no])])
+
+GMP_DEFINE_RAW(["define(<HAVE_GOTDATA>,<$gmp_cv_asm_sparc_gotdata>)"])
+])
+
+
+dnl  GMP_ASM_SPARC_SHARED_THUNKS
+dnl  ----------------------
+dnl  Determine whether the assembler supports all of the features
+dnl  necessary in order to emit shared PIC thunks on sparc.
+dnl
+dnl  See also mpn/sparc32/sparc-defs.m4 which uses the result of this test.
+
+AC_DEFUN([GMP_ASM_SPARC_SHARED_THUNKS],
+[AC_REQUIRE([GMP_ASM_TEXT])
+AC_CACHE_CHECK([if the assembler can support shared PIC thunks],
+               gmp_cv_asm_sparc_shared_thunks,
+[GMP_TRY_ASSEMBLE(
+[      $gmp_cv_asm_text
+       .section        
.text.__sparc_get_pc_thunk.l7,"axG",@progbits,__sparc_get_pc_thunk.l7,comdat
+       .weak   __sparc_get_pc_thunk.l7
+       .hidden __sparc_get_pc_thunk.l7
+       .type   __sparc_get_pc_thunk.l7, #function
+__sparc_get_pc_thunk.l7:
+       jmp     %o7+8
+        add    %o7, %l7, %l7
+],
+[gmp_cv_asm_sparc_shared_thunks=yes],
+[gmp_cv_asm_sparc_shared_thunks=no])])
+
+GMP_DEFINE_RAW(["define(<HAVE_SHARED_THUNKS>,<$gmp_cv_asm_sparc_shared_thunks>)"])
+])
+
+
 dnl  GMP_C_ATTRIBUTE_CONST
 dnl  ---------------------
 
diff -r a51d8e63e08e configure.ac
--- a/configure.ac      Tue Apr 09 15:05:39 2013 +0200
+++ b/configure.ac      Wed Apr 10 10:01:13 2013 -0700
@@ -3483,12 +3483,14 @@
     power*-*-aix*)
       GMP_INCLUDE_MPN(powerpc32/aix.m4)
       ;;
-    sparcv9*-*-* | ultrasparc*-*-* | sparc64-*-*)
+    *sparc*-*-*)
       case $ABI in
         64)
           GMP_ASM_SPARC_REGISTER
           ;;
       esac
+      GMP_ASM_SPARC_GOTDATA
+      GMP_ASM_SPARC_SHARED_THUNKS
       ;;
     X86_PATTERN | X86_64_PATTERN)
       GMP_ASM_ALIGN_FILL_0x90
diff -r a51d8e63e08e mpn/sparc32/sparc-defs.m4
--- a/mpn/sparc32/sparc-defs.m4 Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc32/sparc-defs.m4 Wed Apr 10 10:01:13 2013 -0700
@@ -35,6 +35,100 @@
 `ifelse(HAVE_REGISTER,yes,
 `.register `$1',`$2'')')
 
+dnl  Usage: LEA(symbol,reg,pic_reg)
+dnl
+dnl  Use whatever code sequence is appropriate to load "symbol" into register
+dnl  "reg", potentially using register "pic_reg" to perform the calculations.
+dnl  This takes into consideration things like PIC, whether we are generating
+dnl  64-bit code, etc.
+
+define(LEA,
+m4_assert_numargs(3)
+m4_assert_defined(`HAVE_GOTDATA')
+`ifdef(`PIC',`
+ifelse(HAVE_GOTDATA,yes,`
+       sethi   %hi(_GLOBAL_OFFSET_TABLE_-4), %`$3'
+       call    __sparc_get_pc_thunk.`$3'
+        or     %`$3', %lo(_GLOBAL_OFFSET_TABLE_+4), %`$3'
+99:    sethi   %gdop_hix22(`$1'), %`$2'
+       xor     %`$2', %gdop_lox10(`$1'), %`$2'
+ifdef(`HAVE_ABI_64',`
+       ldx     [%`$3' + %`$2'], %`$2', %gdop(`$1')',`
+       ld      [%`$3' + %`$2'], %`$2', %gdop(`$1')')',`
+       sethi   %hi(_GLOBAL_OFFSET_TABLE_-4), %`$3'
+       call    __sparc_get_pc_thunk.`$3'
+        or     %`$3', %lo(_GLOBAL_OFFSET_TABLE_+4), %`$3'
+99:    sethi   %hi(`$1'), %`$2'
+       or      %`$2', %lo(`$1'), %`$2'
+ifdef(`HAVE_ABI_64',`
+       ldx     [%`$3' + %`$2'], %`$2'',`
+       ld      [%`$3' + %`$2'], %`$2'')')',`
+ifdef(`HAVE_ABI_64',`
+       setx    `$1', %`$3', %`$2'',`
+       set     `$1', %`$2'')')')
+
+dnl  Usage: LEA_LEAF(symbol,reg,pic_reg)
+dnl
+dnl  Exactly the same as LEA except that it works in a leaf function.
+dnl  Specifically, when generating PIC code, it makes sure to preserve the %o7
+dnl  register.
+
+define(LEA_LEAF,
+m4_assert_numargs(3)
+m4_assert_defined(`HAVE_GOTDATA')
+`ifdef(`PIC',`
+ifelse(HAVE_GOTDATA,yes,`
+       sethi   %hi(_GLOBAL_OFFSET_TABLE_-4), %`$3'
+       mov     %o7, %`$2'
+       call    __sparc_get_pc_thunk.`$3'
+        or     %`$3', %lo(_GLOBAL_OFFSET_TABLE_+4), %`$3'
+99:    mov     %`$2', %o7
+       sethi   %gdop_hix22(`$1'), %`$2'
+       xor     %`$2', %gdop_lox10(`$1'), %`$2'
+ifdef(`HAVE_ABI_64',`
+       ldx     [%`$3' + %`$2'], %`$2', %gdop(`$1')',`
+       ld      [%`$3' + %`$2'], %`$2', %gdop(`$1')')',`
+       sethi   %hi(_GLOBAL_OFFSET_TABLE_-4), %`$3'
+       mov     %o7, %`$2'
+       call    __sparc_get_pc_thunk.`$3'
+        or     %`$3', %lo(_GLOBAL_OFFSET_TABLE_+4), %`$3'
+99:    mov     %`$2', %o7
+       sethi   %hi(`$1'), %`$2'
+       or      %`$2', %lo(`$1'), %`$2'
+ifdef(`HAVE_ABI_64',`
+       ldx     [%`$3' + %`$2'], %`$2'',`
+       ld      [%`$3' + %`$2'], %`$2'')')',`
+ifdef(`HAVE_ABI_64',`
+       setx    `$1', %`$3', %`$2'',`
+       set     `$1', %`$2'')')')
+
+dnl  Usage: LEA_THUNK(pic_reg)
+dnl
+dnl  Files that make use of LEA and LEA_LEAF must emit a PIC thunk using
+dnl  LEA_THUNK.  The "pic_reg" argument given must exactly the same as the
+dnl  one given to the LEA LEA_LEAF invocations.
+dnl
+dnl  If multiple PIC registers are used in invocations of LEA and LEA_LEAF then
+dnl  multiple thunks needs to be emitted, one for each PIC register used.
+
+define(LEA_THUNK,
+m4_assert_numargs(1)
+m4_assert_defined(`HAVE_SHARED_THUNKS')
+`ifdef(`PIC',`
+ifelse(HAVE_SHARED_THUNKS,yes,`
+       .section        
.text.__sparc_get_pc_thunk.`$1',"axG",@progbits,__sparc_get_pc_thunk.`$1',comdat
+       .weak   __sparc_get_pc_thunk.`$1'
+       .hidden __sparc_get_pc_thunk.`$1'
+       .type   __sparc_get_pc_thunk.`$1', #function
+__sparc_get_pc_thunk.`$1':
+       jmp     %o7+8
+        add    %o7, %`$1', %`$1'
+       TEXT
+',`
+       TEXT
+__sparc_get_pc_thunk.`$1':
+       retl
+        add    %o7, %`$1', %`$1'')')')
 
 C Testing mechanism for running newer code on older processors
 ifdef(`FAKE_T3',`
diff -r a51d8e63e08e mpn/sparc32/udiv.asm
--- a/mpn/sparc32/udiv.asm      Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc32/udiv.asm      Wed Apr 10 10:01:13 2013 -0700
@@ -28,13 +28,7 @@
 C d            i3
 
 ASM_START()
-
-ifdef(`PIC',
-`      TEXT
-L(getpc):
-       retl
-       nop')
-
+       LEA_THUNK(l7)
        TEXT
        ALIGN(8)
 L(C0): .double 0r4294967296
@@ -45,11 +39,8 @@
        st      %i1,[%fp-8]
        ld      [%fp-8],%f10
 
-ifdef(`PIC',
-`L(pc):        call    L(getpc)                C put address of this insn in 
%o7
-       ldd     [%o7+L(C0)-L(pc)],%f8',
-`      sethi   %hi(L(C0)),%o7
-       ldd     [%o7+%lo(L(C0))],%f8')
+       LEA(L(C0),l0,l7)
+       ldd     [%l0], %f8
 
        fitod   %f10,%f4
        cmp     %i1,0
@@ -75,10 +66,8 @@
 L(250):
        fdivd   %f2,%f4,%f2
 
-ifdef(`PIC',
-`      ldd     [%o7+L(C1)-L(pc)],%f4',
-`      sethi   %hi(L(C1)),%o7
-       ldd     [%o7+%lo(L(C1))],%f4')
+       LEA(L(C1),l0,l7)
+       ldd     [%l0], %f4
 
        fcmped  %f2,%f4
        nop
diff -r a51d8e63e08e mpn/sparc32/v8/addmul_1.asm
--- a/mpn/sparc32/v8/addmul_1.asm       Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc32/v8/addmul_1.asm       Wed Apr 10 10:01:13 2013 -0700
@@ -28,21 +28,15 @@
 C s2_limb      o3
 
 ASM_START()
+       LEA_THUNK(g4)
+       TEXT
 PROLOGUE(mpn_addmul_1)
        orcc    %g0,%g0,%g2
        ld      [%o1+0],%o4     C 1
 
        sll     %o2,4,%g1
        and     %g1,(4-1)<<4,%g1
-ifdef(`PIC',
-`      mov     %o7,%g4         C Save return address register
-0:     call    1f
-       add     %o7,L(1)-0b,%g3
-1:     mov     %g4,%o7         C Restore return address register
-',
-`      sethi   %hi(L(1)),%g3
-       or      %g3,%lo(L(1)),%g3
-')
+       LEA_LEAF(L(1),g3,g4)
        jmp     %g3+%g1
        nop
 L(1):
diff -r a51d8e63e08e mpn/sparc32/v8/mul_1.asm
--- a/mpn/sparc32/v8/mul_1.asm  Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc32/v8/mul_1.asm  Wed Apr 10 10:01:13 2013 -0700
@@ -28,18 +28,12 @@
 C s2_limb      o3
 
 ASM_START()
+       LEA_THUNK(g4)
+       TEXT
 PROLOGUE(mpn_mul_1)
        sll     %o2,4,%g1
        and     %g1,(4-1)<<4,%g1
-ifdef(`PIC',
-`      mov     %o7,%g4         C Save return address register
-0:     call    1f
-       add     %o7,L(1)-0b,%g3
-1:     mov     %g4,%o7         C Restore return address register
-',
-`      sethi   %hi(L(1)),%g3
-       or      %g3,%lo(L(1)),%g3
-')
+       LEA_LEAF(L(1),g3,g4)
        jmp     %g3+%g1
        ld      [%o1+0],%o4     C 1
 L(1):
diff -r a51d8e63e08e mpn/sparc32/v8/supersparc/udiv.asm
--- a/mpn/sparc32/v8/supersparc/udiv.asm        Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc32/v8/supersparc/udiv.asm        Wed Apr 10 10:01:13 2013 -0700
@@ -29,28 +29,18 @@
 C d            i3
 
 ASM_START()
-
-ifdef(`PIC',
-`      TEXT
-L(getpc):
-       retl
-       nop')
-
+       LEA_THUNK(l7)
        TEXT
        ALIGN(8)
 L(C0): .double 0r4294967296
 L(C1): .double 0r2147483648
-
 PROLOGUE(mpn_udiv_qrnnd)
        save    %sp,-104,%sp
        st      %i1,[%fp-8]
        ld      [%fp-8],%f10
 
-ifdef(`PIC',
-`L(pc):        call    L(getpc)                C put address of this insn in 
%o7
-       ldd     [%o7+L(C0)-L(pc)],%f8',
-`      sethi   %hi(L(C0)),%o7
-       ldd     [%o7+%lo(L(C0))],%f8')
+       LEA(L(C0),l0,l7)
+       ldd     [%l0], %f8
 
        fitod   %f10,%f4
        cmp     %i1,0
@@ -76,10 +66,8 @@
 L(250):
        fdivd   %f2,%f4,%f2
 
-ifdef(`PIC',
-`      ldd     [%o7+L(C1)-L(pc)],%f4',
-`      sethi   %hi(L(C1)),%o7
-       ldd     [%o7+%lo(L(C1))],%f4')
+       LEA(L(C1),l0,l7)
+       ldd     [%l0], %f4
 
        fcmped  %f2,%f4
        nop
diff -r a51d8e63e08e mpn/sparc32/v8/udiv.asm
--- a/mpn/sparc32/v8/udiv.asm   Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc32/v8/udiv.asm   Wed Apr 10 10:01:13 2013 -0700
@@ -29,28 +29,18 @@
 C d            i3
 
 ASM_START()
-
-ifdef(`PIC',
-`      TEXT
-L(getpc):
-       retl
-       nop')
-
+       LEA_THUNK(l7)
        TEXT
        ALIGN(8)
 L(C0): .double 0r4294967296
 L(C1): .double 0r2147483648
-
 PROLOGUE(mpn_udiv_qrnnd)
        save    %sp,-104,%sp
        st      %i1,[%fp-8]
        ld      [%fp-8],%f10
 
-ifdef(`PIC',
-`L(pc):        call    L(getpc)                C put address of this insn in 
%o7
-       ldd     [%o7+L(C0)-L(pc)],%f8',
-`      sethi   %hi(L(C0)),%o7
-       ldd     [%o7+%lo(L(C0))],%f8')
+       LEA(L(C0),l0,l7)
+       ldd     [%l0], %f8
 
        fitod   %f10,%f4
        cmp     %i1,0
@@ -76,10 +66,8 @@
 L(250):
        fdivd   %f2,%f4,%f2
 
-ifdef(`PIC',
-`      ldd     [%o7+L(C1)-L(pc)],%f4',
-`      sethi   %hi(L(C1)),%o7
-       ldd     [%o7+%lo(L(C1))],%f4')
+       LEA(L(C1),l0,l7)
+       ldd     [%l0], %f4
 
        fcmped  %f2,%f4
        nop
diff -r a51d8e63e08e mpn/sparc32/v9/sqr_diagonal.asm
--- a/mpn/sparc32/v9/sqr_diagonal.asm   Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc32/v9/sqr_diagonal.asm   Wed Apr 10 10:01:13 2013 -0700
@@ -73,20 +73,14 @@
 define(`fanop',`fitod %f12,%f10')      dnl  A quasi nop running in the FA pipe
 
 ASM_START()
-
+       LEA_THUNK(l7)
        TEXT
-       ALIGN(4)
-.Lnoll:
-       .word   0
-
+       INT32(noll, 0)
 PROLOGUE(mpn_sqr_diagonal)
        save    %sp,-256,%sp
 
-ifdef(`PIC',
-`.Lpc: rd      %pc,%o7
-       ld      [%o7+.Lnoll-.Lpc],%f8',
-`      sethi   %hi(.Lnoll),%g1
-       ld      [%g1+%lo(.Lnoll)],%f8')
+       LEA(L(noll),l0,l7)
+       ld      [%l0], %f8
 
        sethi   %hi(0xffff0000),%g5
        add     %i1,-8,%i1
diff -r a51d8e63e08e mpn/sparc64/gcd_1.asm
--- a/mpn/sparc64/gcd_1.asm     Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc64/gcd_1.asm     Wed Apr 10 10:01:13 2013 -0700
@@ -58,6 +58,8 @@
 ASM_START()
        REGISTER(%g2,#scratch)
        REGISTER(%g3,#scratch)
+       LEA_THUNK(l7)
+       TEXT
 PROLOGUE(mpn_gcd_1)
        save    %sp, -192, %sp
        ldx     [up+0], %g1             C U low limb
@@ -93,22 +95,7 @@
         mov    0, %o3
 
 L(noreduce):
-
-ifdef(`PIC',`
-       sethi   %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
-       call    L(LGETPC0)
-       add     %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
-       sethi   %hi(ctz_table), %g1
-       or      %g1, %lo(ctz_table), %g1
-       ldx     [%l7+%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
-')
+       LEA(ctz_table,i5,l7)
 
        cmp     %o0, 0
        bnz     %xcc, L(mid)
@@ -135,10 +122,4 @@
 L(shift_alot):
        b       L(mid)
         and    %o0, MASK, %g3          C
-
-ifdef(`PIC',`
-L(LGETPC0):
-       retl
-       add     %o7, %l7, %l7
-')
 EPILOGUE()
diff -r a51d8e63e08e mpn/sparc64/ultrasparct3/dive_1.asm
--- a/mpn/sparc64/ultrasparct3/dive_1.asm       Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc64/ultrasparct3/dive_1.asm       Wed Apr 10 10:01:13 2013 -0700
@@ -36,6 +36,8 @@
 ASM_START()
        REGISTER(%g2,#scratch)
        REGISTER(%g3,#scratch)
+       LEA_THUNK(l7)
+       TEXT
 PROLOGUE(mpn_divexact_1)
        save    %sp, -176, %sp
        cmp     %i2, 1
@@ -54,23 +56,7 @@
        srlx    d, 1, %g1
        and     %g1, 127, %g1
 
-ifdef(`PIC',`
-C      save    %sp, -192, %sp
-       sethi   %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
-       call    L(GETPC0)
-       add     %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
-       sethi   %hi(binvert_limb_table), %g2
-       or      %g2, %lo(binvert_limb_table), %g2
-       ldx     [%l7+%g2], %g2
-C      restore
-',`
-       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
-')
+       LEA(binvert_limb_table,g2,l7)
        ldub    [%g2+%g1], %g1
        add     %g1, %g1, %g2
        mulx    %g1, %g1, %g1
@@ -131,10 +117,4 @@
 
        return  %i7+8
         nop
-
-ifdef(`PIC',`
-L(GETPC0):
-       retl
-       add     %o7, %l7, %l7
-')
 EPILOGUE()
diff -r a51d8e63e08e mpn/sparc64/ultrasparct3/invert_limb.asm
--- a/mpn/sparc64/ultrasparct3/invert_limb.asm  Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc64/ultrasparct3/invert_limb.asm  Wed Apr 10 10:01:13 2013 -0700
@@ -31,11 +31,13 @@
 ASM_START()
        REGISTER(%g2,#scratch)
        REGISTER(%g3,#scratch)
+       LEA_THUNK(g3)
+       TEXT
 PROLOGUE(mpn_invert_limb)
        srlx    d, 55, %g1
        add     %g1, %g1, %g1
-       sethi   %hi(approx_tab-512), %g2
-       or      %g2, %lo(approx_tab-512), %g2
+       LEA_LEAF(approx_tab,g2,g3)
+       sub     %g2, 512, %g2
        lduh    [%g2+%g1], %g3
        srlx    d, 24, %g4
        add     %g4, 1, %g4
diff -r a51d8e63e08e mpn/sparc64/ultrasparct3/mode1o.asm
--- a/mpn/sparc64/ultrasparct3/mode1o.asm       Tue Apr 09 15:05:39 2013 +0200
+++ b/mpn/sparc64/ultrasparct3/mode1o.asm       Wed Apr 10 10:01:13 2013 -0700
@@ -37,27 +37,13 @@
 ASM_START()
        REGISTER(%g2,#scratch)
        REGISTER(%g3,#scratch)
+       LEA_THUNK(g3)
+       TEXT
 PROLOGUE(mpn_modexact_1c_odd)
        srlx    d, 1, %g1
        and     %g1, 127, %g1
 
-ifdef(`PIC',`
-       save    %sp, -192, %sp
-       sethi   %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
-       call    L(GETPC0)
-       add     %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
-       sethi   %hi(binvert_limb_table), %g2
-       or      %g2, %lo(binvert_limb_table), %g2
-       ldx     [%l7+%g2], %g2
-       restore
-',`
-       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
-')
+       LEA_LEAF(binvert_limb_table,g2,g3)
        ldub    [%g2+%g1], %g1
        add     %g1, %g1, %g2
        mulx    %g1, %g1, %g1
@@ -84,10 +70,4 @@
 
        retl
         mov    cy, %o0
-
-ifdef(`PIC',`
-L(GETPC0):
-       retl
-       add     %o7, %l7, %l7
-')
 EPILOGUE()
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
http://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to