git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
arch
/
arm
/
vfp
/
vfpdouble.c
diff --git
a/arch/arm/vfp/vfpdouble.c
b/arch/arm/vfp/vfpdouble.c
index
fa3053e
..
009038c
100644
(file)
--- a/
arch/arm/vfp/vfpdouble.c
+++ b/
arch/arm/vfp/vfpdouble.c
@@
-32,6
+32,8
@@
*/
#include <linux/kernel.h>
#include <linux/bitops.h>
*/
#include <linux/kernel.h>
#include <linux/bitops.h>
+
+#include <asm/div64.h>
#include <asm/ptrace.h>
#include <asm/vfp.h>
#include <asm/ptrace.h>
#include <asm/vfp.h>
@@
-195,7
+197,7
@@
u32 vfp_double_normaliseround(int dd, struct vfp_double *vd, u32 fpscr, u32 exce
dd, d, exceptions);
vfp_put_double(dd, d);
}
dd, d, exceptions);
vfp_put_double(dd, d);
}
- return exceptions
& ~VFP_NAN_FLAG
;
+ return exceptions;
}
/*
}
/*
@@
-586,6
+588,7
@@
static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr)
struct vfp_double vdm;
u32 d, exceptions = 0;
int rmode = fpscr & FPSCR_RMODE_MASK;
struct vfp_double vdm;
u32 d, exceptions = 0;
int rmode = fpscr & FPSCR_RMODE_MASK;
+ int tm;
vfp_double_unpack(&vdm, vfp_get_double(dm));
vfp_double_dump("VDM", &vdm);
vfp_double_unpack(&vdm, vfp_get_double(dm));
vfp_double_dump("VDM", &vdm);
@@
-593,10
+596,14
@@
static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr)
/*
* Do we have denormalised number?
*/
/*
* Do we have denormalised number?
*/
- if (vfp_double_type(&vdm) & VFP_DENORMAL)
+ tm = vfp_double_type(&vdm);
+ if (tm & VFP_DENORMAL)
exceptions |= FPSCR_IDC;
exceptions |= FPSCR_IDC;
- if (vdm.exponent >= 1023 + 32) {
+ if (tm & VFP_NAN) {
+ d = 0;
+ exceptions |= FPSCR_IOC;
+ } else if (vdm.exponent >= 1023 + 32) {
d = 0x7fffffff;
if (vdm.sign)
d = ~d;
d = 0x7fffffff;
if (vdm.sign)
d = ~d;
@@
-768,6
+775,9
@@
vfp_double_add(struct vfp_double *vdd, struct vfp_double *vdn,
if ((s64)m_sig < 0) {
vdd->sign = vfp_sign_negate(vdd->sign);
m_sig = -m_sig;
if ((s64)m_sig < 0) {
vdd->sign = vfp_sign_negate(vdd->sign);
m_sig = -m_sig;
+ } else if (m_sig == 0) {
+ vdd->sign = (fpscr & FPSCR_RMODE_MASK) ==
+ FPSCR_ROUND_MINUSINF ? 0x8000 : 0;
}
} else {
m_sig += vdn->significand;
}
} else {
m_sig += vdn->significand;
@@
-1117,9
+1127,9
@@
u32 vfp_double_cpdo(u32 inst, u32 fpscr)
{
u32 op = inst & FOP_MASK;
u32 exceptions = 0;
{
u32 op = inst & FOP_MASK;
u32 exceptions = 0;
- unsigned int dd = vfp_get_
s
d(inst);
- unsigned int dn = vfp_get_
s
n(inst);
- unsigned int dm = vfp_get_
s
m(inst);
+ unsigned int dd = vfp_get_
d
d(inst);
+ unsigned int dn = vfp_get_
d
n(inst);
+ unsigned int dm = vfp_get_
d
m(inst);
unsigned int vecitr, veclen, vecstride;
u32 (*fop)(int, int, s32, u32);
unsigned int vecitr, veclen, vecstride;
u32 (*fop)(int, int, s32, u32);
@@
-1136,7
+1146,7
@@
u32 vfp_double_cpdo(u32 inst, u32 fpscr)
pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride,
(veclen >> FPSCR_LENGTH_BIT) + 1);
pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride,
(veclen >> FPSCR_LENGTH_BIT) + 1);
- fop = (op == FOP_EXT) ? fop_extfns[
dn
] : fop_fns[FOP_TO_IDX(op)];
+ fop = (op == FOP_EXT) ? fop_extfns[
FEXT_TO_IDX(inst)
] : fop_fns[FOP_TO_IDX(op)];
if (!fop)
goto invalid;
if (!fop)
goto invalid;
@@
-1144,17
+1154,13
@@
u32 vfp_double_cpdo(u32 inst, u32 fpscr)
u32 except;
if (op == FOP_EXT)
u32 except;
if (op == FOP_EXT)
- pr_debug("VFP: itr%d (d%u
.%u) = op[%u] (d%u.
%u)\n",
+ pr_debug("VFP: itr%d (d%u
) = op[%u] (d
%u)\n",
vecitr >> FPSCR_LENGTH_BIT,
vecitr >> FPSCR_LENGTH_BIT,
- dd >> 1, dd & 1, dn,
- dm >> 1, dm & 1);
+ dd, dn, dm);
else
else
- pr_debug("VFP: itr%d (d%u
.%u) = (d%u.%u) op[%u] (d%u.
%u)\n",
+ pr_debug("VFP: itr%d (d%u
) = (d%u) op[%u] (d
%u)\n",
vecitr >> FPSCR_LENGTH_BIT,
vecitr >> FPSCR_LENGTH_BIT,
- dd >> 1, dd & 1,
- dn >> 1, dn & 1,
- FOP_TO_IDX(op),
- dm >> 1, dm & 1);
+ dd, dn, FOP_TO_IDX(op), dm);
except = fop(dd, dn, dm, fpscr);
pr_debug("VFP: itr%d: exceptions=%08x\n",
except = fop(dd, dn, dm, fpscr);
pr_debug("VFP: itr%d: exceptions=%08x\n",