about summary refs log tree commit diff
path: root/sysdeps/alpha/reml.S
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2004-09-06 02:01:35 +0000
committerRichard Henderson <rth@redhat.com>2004-09-06 02:01:35 +0000
commitfebcd83655138bcb01b2680e170e6773a1ec813c (patch)
tree28ede43c995a57e82b29bd5fc3fef7112d5a4c20 /sysdeps/alpha/reml.S
parent42d86dd6c0a12373cb1d10b49f7ad2fb6488d364 (diff)
downloadglibc-febcd83655138bcb01b2680e170e6773a1ec813c.tar.gz
glibc-febcd83655138bcb01b2680e170e6773a1ec813c.tar.xz
glibc-febcd83655138bcb01b2680e170e6773a1ec813c.zip
* sysdeps/alpha/div.S: Save and restore FPCR around fp operations. * sysdeps/alpha/divl.S, sysdeps/alpha/divq.S, sysdeps/alpha/divqu.S, sysdeps/alpha/ldiv.S, sysdeps/alpha/reml.S, sysdeps/alpha/remq.S, sysdeps/alpha/remqu.S: Likewise. * sysdeps/alpha/div_libc.h (FRAME): Increase to 64.
2004-09-05  Richard Henderson  <rth@redhat.com>

	* sysdeps/alpha/div.S: Save and restore FPCR around fp operations.
	* sysdeps/alpha/divl.S, sysdeps/alpha/divq.S, sysdeps/alpha/divqu.S,
	sysdeps/alpha/ldiv.S, sysdeps/alpha/reml.S, sysdeps/alpha/remq.S,
	sysdeps/alpha/remqu.S: Likewise.
	* sysdeps/alpha/div_libc.h (FRAME): Increase to 64.
Diffstat (limited to 'sysdeps/alpha/reml.S')
-rw-r--r--sysdeps/alpha/reml.S22
1 files changed, 18 insertions, 4 deletions
diff --git a/sysdeps/alpha/reml.S b/sysdeps/alpha/reml.S
index 1bbb978f66..bfc3be5c3f 100644
--- a/sysdeps/alpha/reml.S
+++ b/sysdeps/alpha/reml.S
@@ -24,7 +24,12 @@
    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
@@ -43,26 +48,35 @@ __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)
-	_ITOFT2	RV, $f0, 16, AT, $f1, 24
+	_ITOFT2	RV, $f0, 24, AT, $f1, 32
 	cvtqt	$f0, $f0
 	cvtqt	$f1, $f1
 	divt/c	$f0, $f1, $f0
 	cvttq/c	$f0, $f0
-	_FTOIT	$f0, RV, 16
+	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