提交 1320a80d 编写于 作者: C Catalin Marinas 提交者: Russell King

[ARM] 3471/1: FTOSI functions should return 0 for NaN

Patch from Catalin Marinas

The NaN case was dealed with by the "exponent >= ... + 32" condition but it
was not setting the value "d" to 0.
Signed-off-by: NKen'ichi Kuromusha <musha@aplix.co.jp>
Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
上级 adeff422
...@@ -588,6 +588,7 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr) ...@@ -588,6 +588,7 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr)
struct vfp_double vdm; struct vfp_double vdm;
u32 d, exceptions = 0; u32 d, exceptions = 0;
int rmode = fpscr & FPSCR_RMODE_MASK; int rmode = fpscr & FPSCR_RMODE_MASK;
int tm;
vfp_double_unpack(&vdm, vfp_get_double(dm)); vfp_double_unpack(&vdm, vfp_get_double(dm));
vfp_double_dump("VDM", &vdm); vfp_double_dump("VDM", &vdm);
...@@ -595,10 +596,14 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr) ...@@ -595,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; d = 0x7fffffff;
if (vdm.sign) if (vdm.sign)
d = ~d; d = ~d;
......
...@@ -632,6 +632,7 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr) ...@@ -632,6 +632,7 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr)
struct vfp_single vsm; struct vfp_single vsm;
u32 d, exceptions = 0; u32 d, exceptions = 0;
int rmode = fpscr & FPSCR_RMODE_MASK; int rmode = fpscr & FPSCR_RMODE_MASK;
int tm;
vfp_single_unpack(&vsm, m); vfp_single_unpack(&vsm, m);
vfp_single_dump("VSM", &vsm); vfp_single_dump("VSM", &vsm);
...@@ -639,10 +640,14 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr) ...@@ -639,10 +640,14 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr)
/* /*
* Do we have a denormalised number? * Do we have a denormalised number?
*/ */
tm = vfp_single_type(&vsm);
if (vfp_single_type(&vsm) & VFP_DENORMAL) if (vfp_single_type(&vsm) & VFP_DENORMAL)
exceptions |= FPSCR_IDC; exceptions |= FPSCR_IDC;
if (vsm.exponent >= 127 + 32) { if (tm & VFP_NAN) {
d = 0;
exceptions |= FPSCR_IOC;
} else if (vsm.exponent >= 127 + 32) {
/* /*
* m >= 2^31-2^7: invalid * m >= 2^31-2^7: invalid
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册