]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/alpha/reml.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / alpha / reml.S
index c4eb426c5a2554c0483f3015cd0571a664179a10..1857da98a8ab4603f213f48561b4c42fb1d98999 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2004-2016 Free Software Foundation, Inc.
    Contributed by Richard Henderson  <rth@twiddle.net>
    This file is part of the GNU C Library.
 
@@ -13,9 +13,8 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "div_libc.h"
 
    be clobbered.
 
    The FPU can handle the division for all input values except zero.
-   All we have to do is compute the remainder via multiply-and-subtract.  */
+   All we have to do is compute the remainder via multiply-and-subtract.
+
+   The FPCR save/restore is due to the fact that the EV6 _will_ set FPCR_INE
+   for cvttq/c even without /sui being set.  It will not, however, properly
+   raise the exception, so we don't have to worry about FPCR_INED being clear
+   and so dying by SIGFPE.  */
 
 #ifndef EXTEND
 #define EXTEND(S,D)    sextl S, D
@@ -33,7 +37,7 @@
        .text
        .align  4
        .globl  __reml
-       .type   __reml, @function
+       .type   __reml, @funcnoplt
        .usepv  __reml, no
 
        cfi_startproc
@@ -43,34 +47,36 @@ __reml:
        cfi_def_cfa_offset (FRAME)
        CALL_MCOUNT
        stt     $f0, 0(sp)
-       stt     $f1, 8(sp)
+       excb
        beq     Y, DIVBYZERO
+
+       stt     $f1, 8(sp)
+       stt     $f2, 16(sp)
        cfi_rel_offset ($f0, 0)
        cfi_rel_offset ($f1, 8)
+       cfi_rel_offset ($f2, 16)
+       mf_fpcr $f2
 
        EXTEND  (X, RV)
        EXTEND  (Y, AT)
-       stq     RV, 16(sp)
-       stq     AT, 24(sp)
-
-       ldt     $f0, 16(sp)
-       ldt     $f1, 24(sp)
+       _ITOFT2 RV, $f0, 24, AT, $f1, 32
        cvtqt   $f0, $f0
        cvtqt   $f1, $f1
-
        divt/c  $f0, $f1, $f0
        cvttq/c $f0, $f0
-       stt     $f0, 16(sp)
-       ldq     RV, 16(sp)
+       excb
+       mt_fpcr $f2
+       _FTOIT  $f0, RV, 24
 
        ldt     $f0, 0(sp)
        mull    RV, Y, RV
        ldt     $f1, 8(sp)
+       ldt     $f2, 16(sp)
        lda     sp, FRAME(sp)
        cfi_restore ($f0)
        cfi_restore ($f1)
+       cfi_restore ($f2)
        cfi_def_cfa_offset (0)
-
        subl    X, RV, RV
        ret     $31, (RA), 1