OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libm/] [common/] [sf_rint.c] - Blame information for rev 822

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/* sf_rint.c -- float version of s_rint.c.
2
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3
 */
4
 
5
/*
6
 * ====================================================
7
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8
 *
9
 * Developed at SunPro, a Sun Microsystems, Inc. business.
10
 * Permission to use, copy, modify, and distribute this
11
 * software is freely granted, provided that this notice
12
 * is preserved.
13
 * ====================================================
14
 */
15
 
16
#include "fdlibm.h"
17
 
18
#ifdef __STDC__
19
static const float
20
#else
21
static float
22
#endif
23
TWO23[2]={
24
  8.3886080000e+06, /* 0x4b000000 */
25
 -8.3886080000e+06, /* 0xcb000000 */
26
};
27
 
28
#ifdef __STDC__
29
        float rintf(float x)
30
#else
31
        float rintf(x)
32
        float x;
33
#endif
34
{
35
        __int32_t i0,j0,sx;
36
        __uint32_t i,i1,ix;
37
        float t;
38
        volatile float w;
39
        GET_FLOAT_WORD(i0,x);
40
        sx = (i0>>31)&1;
41
        ix = (i0&0x7fffffff);
42
        j0 = (ix>>23)-0x7f;
43
        if(j0<23) {
44
            if(FLT_UWORD_IS_ZERO(ix))
45
                return x;
46
            if(j0<0) {
47
                i1 = (i0&0x07fffff);
48
                i0 &= 0xfff00000;
49
                i0 |= ((i1|-i1)>>9)&0x400000;
50
                SET_FLOAT_WORD(x,i0);
51
                w = TWO23[sx]+x;
52
                t =  w-TWO23[sx];
53
                GET_FLOAT_WORD(i0,t);
54
                SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
55
                return t;
56
            } else {
57
                i = (0x007fffff)>>j0;
58
                if((i0&i)==0) return x; /* x is integral */
59
                i>>=1;
60
                if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0);
61
            }
62
        } else {
63
            if(!FLT_UWORD_IS_FINITE(ix)) return x+x; /* inf or NaN */
64
            else
65
              return x;         /* x is integral */
66
        }
67
        SET_FLOAT_WORD(x,i0);
68
        w = TWO23[sx]+x;
69
        return w-TWO23[sx];
70
}
71
 
72
#ifdef _DOUBLE_IS_32BITS
73
 
74
#ifdef __STDC__
75
        double rint(double x)
76
#else
77
        double rint(x)
78
        double x;
79
#endif
80
{
81
        return (double) rintf((float) x);
82
}
83
 
84
#endif /* defined(_DOUBLE_IS_32BITS) */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.