]> sourceware.org Git - glibc.git/commitdiff
longlong: add SH FDPIC support
authorAndrew Stubbs <ams@codesourcery.com>
Tue, 27 Oct 2015 13:36:47 +0000 (13:36 +0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 7 Jan 2016 22:27:32 +0000 (17:27 -0500)
ChangeLog
stdlib/longlong.h

index ce42df8ce682548d13e173a3251780df1a315010..bb445a480fde4a52e464ac4cacaa0013a565c380 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-01-07  Daniel Jacobowitz  <dan@codesourcery.com>
+           Joseph Myers  <joseph@codesourcery.com>
+           Mark Shinwell  <shinwell@codesourcery.com>
+           Andrew Stubbs  <ams@codesourcery.com>
+           Rich Felker <dalias@libc.org>
+
+       * longlong.h (udiv_qrnnd): Add FDPIC compatible version for SH.
+
 2016-01-07  Richard Henderson  <rth@redhat.com>
 
        * longlong.h [__alpha] (umul_ppmm): Disable for c++.
index 1bc3e659d0e14630c54c20dd45aee937f3275d7d..4c8d131b9ec01b28cfc6b37c45c9d831c47d17b0 100644 (file)
@@ -1102,6 +1102,33 @@ extern UDItype __umulsidi3 (USItype, USItype);
 /* This is the same algorithm as __udiv_qrnnd_c.  */
 #define UDIV_NEEDS_NORMALIZATION 1
 
+#ifdef __FDPIC__
+/* FDPIC needs a special version of the asm fragment to extract the
+   code address from the function descriptor. __udiv_qrnnd_16 is
+   assumed to be local and not to use the GOT, so loading r12 is
+   not needed. */
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  do {                                                                 \
+    extern UWtype __udiv_qrnnd_16 (UWtype, UWtype)                     \
+                       __attribute__ ((visibility ("hidden")));        \
+    /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */ \
+    __asm__ (                                                          \
+       "mov%M4 %4,r5\n"                                                \
+"      swap.w  %3,r4\n"                                                \
+"      swap.w  r5,r6\n"                                                \
+"      mov.l   @%5,r2\n"                                               \
+"      jsr     @r2\n"                                                  \
+"      shll16  r6\n"                                                   \
+"      swap.w  r4,r4\n"                                                \
+"      mov.l   @%5,r2\n"                                               \
+"      jsr     @r2\n"                                                  \
+"      swap.w  r1,%0\n"                                                \
+"      or      r1,%0"                                                  \
+       : "=r" (q), "=&z" (r)                                           \
+       : "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16)          \
+       : "r1", "r2", "r4", "r5", "r6", "pr", "t");                     \
+  } while (0)
+#else
 #define udiv_qrnnd(q, r, n1, n0, d) \
   do {                                                                 \
     extern UWtype __udiv_qrnnd_16 (UWtype, UWtype)                     \
@@ -1121,6 +1148,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
        : "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16)          \
        : "r1", "r2", "r4", "r5", "r6", "pr", "t");                     \
   } while (0)
+#endif /* __FDPIC__  */
 
 #define UDIV_TIME 80
 
This page took 0.169313 seconds and 5 git commands to generate.