aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/m68k/fpu/s_frexp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/m68k/fpu/s_frexp.c')
-rw-r--r--sysdeps/m68k/fpu/s_frexp.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/sysdeps/m68k/fpu/s_frexp.c b/sysdeps/m68k/fpu/s_frexp.c
index 0cdb5778ee..b06141283c 100644
--- a/sysdeps/m68k/fpu/s_frexp.c
+++ b/sysdeps/m68k/fpu/s_frexp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -28,11 +28,28 @@
#define __CONCATX(a,b) __CONCAT(a,b)
float_type
-__CONCATX(__,FUNC) (value, expptr)
- float_type value;
- int *expptr;
+__CONCATX(__,FUNC) (float_type value, int *expptr)
{
- return __m81_u(__CONCATX(__,FUNC))(value, expptr);
+ float_type mantissa, exponent;
+ int iexponent;
+ unsigned long fpsr;
+
+ __asm ("ftst%.x %1\n"
+ "fmove%.l %/fpsr, %0"
+ : "=dm" (fpsr) : "f" (value));
+ if (fpsr & (7 << 24))
+ {
+ /* Not finite or zero. */
+ *expptr = 0;
+ return value;
+ }
+ __asm ("fgetexp%.x %1, %0" : "=f" (exponent) : "f" (value));
+ iexponent = (int) exponent + 1;
+ *expptr = iexponent;
+ __asm ("fscale%.l %2, %0"
+ : "=f" (mantissa)
+ : "0" (value), "dmi" (-iexponent));
+ return mantissa;
}
#define weak_aliasx(a,b) weak_alias(a,b)