Mercurial > hg > CbC > CbC_gcc
comparison libgcc/config/s390/32/_fixunsdfdi.c @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | |
children | 04ced10e8804 |
comparison
equal
deleted
inserted
replaced
52:c156f1bd5cd9 | 55:77e2b8dfacca |
---|---|
1 /* Definitions of target machine for GNU compiler, for IBM S/390 | |
2 Copyright (C) 1999, 2000, 2001, 2007, 2008 and 2009 | |
3 Free Software Foundation, Inc. | |
4 Contributed by Hartmut Penner (hpenner@de.ibm.com) and | |
5 Ulrich Weigand (uweigand@de.ibm.com). | |
6 | |
7 This file is part of GCC. | |
8 | |
9 GCC is free software; you can redistribute it and/or modify it under | |
10 the terms of the GNU General Public License as published by the Free | |
11 Software Foundation; either version 3, or (at your option) any later | |
12 version. | |
13 | |
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
17 for more details. | |
18 | |
19 Under Section 7 of GPL version 3, you are granted additional | |
20 permissions described in the GCC Runtime Library Exception, version | |
21 3.1, as published by the Free Software Foundation. | |
22 | |
23 You should have received a copy of the GNU General Public License and | |
24 a copy of the GCC Runtime Library Exception along with this program; | |
25 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
26 <http://www.gnu.org/licenses/>. */ | |
27 | |
28 #define EXPD(fp) (((fp.l.upper) >> 20) & 0x7FF) | |
29 #define EXCESSD 1022 | |
30 #define SIGNBIT 0x80000000 | |
31 #define SIGND(fp) ((fp.l.upper) & SIGNBIT) | |
32 #define MANTD_LL(fp) ((fp.ll & (HIDDEND_LL-1)) | HIDDEND_LL) | |
33 #define FRACD_LL(fp) (fp.ll & (HIDDEND_LL-1)) | |
34 #define HIDDEND_LL ((UDItype_x)1 << 52) | |
35 | |
36 typedef int DItype_x __attribute__ ((mode (DI))); | |
37 typedef unsigned int UDItype_x __attribute__ ((mode (DI))); | |
38 typedef int SItype_x __attribute__ ((mode (SI))); | |
39 typedef unsigned int USItype_x __attribute__ ((mode (SI))); | |
40 | |
41 union double_long { | |
42 double d; | |
43 struct { | |
44 SItype_x upper; | |
45 USItype_x lower; | |
46 } l; | |
47 UDItype_x ll; | |
48 }; | |
49 | |
50 UDItype_x __fixunsdfdi (double a1); | |
51 | |
52 /* convert double to unsigned int */ | |
53 UDItype_x | |
54 __fixunsdfdi (double a1) | |
55 { | |
56 register union double_long dl1; | |
57 register int exp; | |
58 register UDItype_x l; | |
59 | |
60 dl1.d = a1; | |
61 | |
62 /* +/- 0, denormalized, negative */ | |
63 | |
64 if (!EXPD (dl1) || SIGND(dl1)) | |
65 return 0; | |
66 | |
67 exp = EXPD (dl1) - EXCESSD - 53; | |
68 | |
69 /* number < 1 */ | |
70 | |
71 if (exp < -53) | |
72 return 0; | |
73 | |
74 /* NaN */ | |
75 | |
76 if ((EXPD(dl1) == 0x7ff) && (FRACD_LL(dl1) != 0)) /* NaN */ | |
77 return 0x0ULL; | |
78 | |
79 /* Number big number & + inf */ | |
80 | |
81 if (exp >= 12) { | |
82 return 0xFFFFFFFFFFFFFFFFULL; | |
83 } | |
84 | |
85 l = MANTD_LL(dl1); | |
86 | |
87 /* shift down until exp < 12 or l = 0 */ | |
88 if (exp > 0) | |
89 l <<= exp; | |
90 else | |
91 l >>= -exp; | |
92 | |
93 return l; | |
94 } |