~jderose/ubuntu/raring/qemu/vde-again

« back to all changes in this revision

Viewing changes to fpu/softfloat-specialize.h

Tags: upstream-0.9.0+20070816
ImportĀ upstreamĀ versionĀ 0.9.0+20070816

Show diffs side-by-side

added added

removed removed

Lines of Context:
61
61
/*----------------------------------------------------------------------------
62
62
| The pattern for a default generated single-precision NaN.
63
63
*----------------------------------------------------------------------------*/
 
64
#if defined(TARGET_MIPS) || defined(TARGET_HPPA)
 
65
#define float32_default_nan 0xFF800000
 
66
#else
64
67
#define float32_default_nan 0xFFC00000
 
68
#endif
65
69
 
66
70
/*----------------------------------------------------------------------------
67
71
| Returns 1 if the single-precision floating-point value `a' is a NaN;
70
74
 
71
75
int float32_is_nan( float32 a )
72
76
{
73
 
 
74
 
    return ( 0xFF000000 < (bits32) ( a<<1 ) );
75
 
 
 
77
#if defined(TARGET_MIPS) || defined(TARGET_HPPA)
 
78
    return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF );
 
79
#else
 
80
    return ( 0xFF800000 <= (bits32) ( a<<1 ) );
 
81
#endif
76
82
}
77
83
 
78
84
/*----------------------------------------------------------------------------
82
88
 
83
89
int float32_is_signaling_nan( float32 a )
84
90
{
85
 
 
 
91
#if defined(TARGET_MIPS) || defined(TARGET_HPPA)
 
92
    return ( 0xFF800000 <= (bits32) ( a<<1 ) );
 
93
#else
86
94
    return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF );
87
 
 
 
95
#endif
88
96
}
89
97
 
90
98
/*----------------------------------------------------------------------------
131
139
    aIsSignalingNaN = float32_is_signaling_nan( a );
132
140
    bIsNaN = float32_is_nan( b );
133
141
    bIsSignalingNaN = float32_is_signaling_nan( b );
 
142
#if defined(TARGET_MIPS) || defined(TARGET_HPPA)
 
143
    a &= ~0x00400000;
 
144
    b &= ~0x00400000;
 
145
#else
134
146
    a |= 0x00400000;
135
147
    b |= 0x00400000;
 
148
#endif
136
149
    if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
137
150
    if ( aIsSignalingNaN ) {
138
151
        if ( bIsSignalingNaN ) goto returnLargerSignificand;
154
167
/*----------------------------------------------------------------------------
155
168
| The pattern for a default generated double-precision NaN.
156
169
*----------------------------------------------------------------------------*/
 
170
#if defined(TARGET_MIPS) || defined(TARGET_HPPA)
 
171
#define float64_default_nan LIT64( 0xFFF0000000000000 )
 
172
#else
157
173
#define float64_default_nan LIT64( 0xFFF8000000000000 )
 
174
#endif
158
175
 
159
176
/*----------------------------------------------------------------------------
160
177
| Returns 1 if the double-precision floating-point value `a' is a NaN;
163
180
 
164
181
int float64_is_nan( float64 a )
165
182
{
166
 
 
167
 
    return ( LIT64( 0xFFE0000000000000 ) < (bits64) ( a<<1 ) );
168
 
 
 
183
#if defined(TARGET_MIPS) || defined(TARGET_HPPA)
 
184
    return
 
185
           ( ( ( a>>51 ) & 0xFFF ) == 0xFFE )
 
186
        && ( a & LIT64( 0x0007FFFFFFFFFFFF ) );
 
187
#else
 
188
    return ( LIT64( 0xFFF0000000000000 ) <= (bits64) ( a<<1 ) );
 
189
#endif
169
190
}
170
191
 
171
192
/*----------------------------------------------------------------------------
175
196
 
176
197
int float64_is_signaling_nan( float64 a )
177
198
{
178
 
 
 
199
#if defined(TARGET_MIPS) || defined(TARGET_HPPA)
 
200
    return ( LIT64( 0xFFF0000000000000 ) <= (bits64) ( a<<1 ) );
 
201
#else
179
202
    return
180
203
           ( ( ( a>>51 ) & 0xFFF ) == 0xFFE )
181
204
        && ( a & LIT64( 0x0007FFFFFFFFFFFF ) );
182
 
 
 
205
#endif
183
206
}
184
207
 
185
208
/*----------------------------------------------------------------------------
229
252
    aIsSignalingNaN = float64_is_signaling_nan( a );
230
253
    bIsNaN = float64_is_nan( b );
231
254
    bIsSignalingNaN = float64_is_signaling_nan( b );
 
255
#if defined(TARGET_MIPS) || defined(TARGET_HPPA)
 
256
    a &= ~LIT64( 0x0008000000000000 );
 
257
    b &= ~LIT64( 0x0008000000000000 );
 
258
#else
232
259
    a |= LIT64( 0x0008000000000000 );
233
260
    b |= LIT64( 0x0008000000000000 );
 
261
#endif
234
262
    if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
235
263
    if ( aIsSignalingNaN ) {
236
264
        if ( bIsSignalingNaN ) goto returnLargerSignificand;