[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: Ken'ichi Kuromusha <musha@aplix.co.jp> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
committed by
Russell King
parent
adeff42236
commit
1320a80d1d
@ -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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user