gfiber / kernel / bruno / 616bfc125d7b2a1eee0344a34b136cb543dad9ef / . / arch / mips / math-emu / sp_fint.c

/* IEEE754 floating point arithmetic | |

* single precision | |

*/ | |

/* | |

* MIPS floating point support | |

* Copyright (C) 1994-2000 Algorithmics Ltd. | |

* | |

* This program is free software; you can distribute it and/or modify it | |

* under the terms of the GNU General Public License (Version 2) as | |

* published by the Free Software Foundation. | |

* | |

* This program is distributed in the hope it will be useful, but WITHOUT | |

* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |

* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |

* for more details. | |

* | |

* You should have received a copy of the GNU General Public License along | |

* with this program; if not, write to the Free Software Foundation, Inc., | |

* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |

*/ | |

#include "ieee754sp.h" | |

union ieee754sp ieee754sp_fint(int x) | |

{ | |

unsigned xm; | |

int xe; | |

int xs; | |

ieee754_clearcx(); | |

if (x == 0) | |

return ieee754sp_zero(0); | |

if (x == 1 || x == -1) | |

return ieee754sp_one(x < 0); | |

if (x == 10 || x == -10) | |

return ieee754sp_ten(x < 0); | |

xs = (x < 0); | |

if (xs) { | |

if (x == (1 << 31)) | |

xm = ((unsigned) 1 << 31); /* max neg can't be safely negated */ | |

else | |

xm = -x; | |

} else { | |

xm = x; | |

} | |

xe = SP_FBITS + 3; | |

if (xm >> (SP_FBITS + 1 + 3)) { | |

/* shunt out overflow bits | |

*/ | |

while (xm >> (SP_FBITS + 1 + 3)) { | |

SPXSRSX1(); | |

} | |

} else { | |

/* normalize in grs extended single precision | |

*/ | |

while ((xm >> (SP_FBITS + 3)) == 0) { | |

xm <<= 1; | |

xe--; | |

} | |

} | |

return ieee754sp_format(xs, xe, xm); | |

} |