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

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [mips/] [math-emu/] [dp_tint.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/* IEEE754 floating point arithmetic
2
 * double precision: common utilities
3
 */
4
/*
5
 * MIPS floating point support
6
 * Copyright (C) 1994-2000 Algorithmics Ltd.
7
 * http://www.algor.co.uk
8
 *
9
 * ########################################################################
10
 *
11
 *  This program is free software; you can distribute it and/or modify it
12
 *  under the terms of the GNU General Public License (Version 2) as
13
 *  published by the Free Software Foundation.
14
 *
15
 *  This program is distributed in the hope it will be useful, but WITHOUT
16
 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18
 *  for more details.
19
 *
20
 *  You should have received a copy of the GNU General Public License along
21
 *  with this program; if not, write to the Free Software Foundation, Inc.,
22
 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
23
 *
24
 * ########################################################################
25
 */
26
 
27
 
28
#include <linux/kernel.h>
29
#include "ieee754dp.h"
30
 
31
int ieee754dp_tint(ieee754dp x)
32
{
33
        COMPXDP;
34
 
35
        CLEARCX;
36
 
37
        EXPLODEXDP;
38
        FLUSHXDP;
39
 
40
        switch (xc) {
41
        case IEEE754_CLASS_SNAN:
42
        case IEEE754_CLASS_QNAN:
43
        case IEEE754_CLASS_INF:
44
                SETCX(IEEE754_INVALID_OPERATION);
45
                return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x);
46
        case IEEE754_CLASS_ZERO:
47
                return 0;
48
        case IEEE754_CLASS_DNORM:
49
        case IEEE754_CLASS_NORM:
50
                break;
51
        }
52
        if (xe > 31) {
53
                /* Set invalid. We will only use overflow for floating
54
                   point overflow */
55
                SETCX(IEEE754_INVALID_OPERATION);
56
                return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x);
57
        }
58
        /* oh gawd */
59
        if (xe > DP_MBITS) {
60
                xm <<= xe - DP_MBITS;
61
        } else if (xe < DP_MBITS) {
62
                u64 residue;
63
                int round;
64
                int sticky;
65
                int odd;
66
 
67
                if (xe < -1) {
68
                        residue = xm;
69
                        round = 0;
70
                        sticky = residue != 0;
71
                        xm = 0;
72
                }
73
                else {
74
                        residue = xm << (64 - DP_MBITS + xe);
75
                        round = (residue >> 63) != 0;
76
                        sticky = (residue << 1) != 0;
77
                        xm >>= DP_MBITS - xe;
78
                }
79
                /* Note: At this point upper 32 bits of xm are guaranteed
80
                   to be zero */
81
                odd = (xm & 0x1) != 0x0;
82
                switch (ieee754_csr.rm) {
83
                case IEEE754_RN:
84
                        if (round && (sticky || odd))
85
                                xm++;
86
                        break;
87
                case IEEE754_RZ:
88
                        break;
89
                case IEEE754_RU:        /* toward +Infinity */
90
                        if ((round || sticky) && !xs)
91
                                xm++;
92
                        break;
93
                case IEEE754_RD:        /* toward -Infinity */
94
                        if ((round || sticky) && xs)
95
                                xm++;
96
                        break;
97
                }
98
                /* look for valid corner case 0x80000000 */
99
                if ((xm >> 31) != 0 && (xs == 0 || xm != 0x80000000)) {
100
                        /* This can happen after rounding */
101
                        SETCX(IEEE754_INVALID_OPERATION);
102
                        return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x);
103
                }
104
                if (round || sticky)
105
                        SETCX(IEEE754_INEXACT);
106
        }
107
        if (xs)
108
                return -xm;
109
        else
110
                return xm;
111
}
112
 
113
 
114
unsigned int ieee754dp_tuns(ieee754dp x)
115
{
116
        ieee754dp hb = ieee754dp_1e31();
117
 
118
        /* what if x < 0 ?? */
119
        if (ieee754dp_lt(x, hb))
120
                return (unsigned) ieee754dp_tint(x);
121
 
122
        return (unsigned) ieee754dp_tint(ieee754dp_sub(x, hb)) |
123
            ((unsigned) 1 << 31);
124
}

powered by: WebSVN 2.1.0

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