Commit b109f9f867a793b66217d43ede10c7a47242e270
1 parent
1d6bda35
more native FPU comparison functions - native FPU remainder
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1339 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
110 additions
and
4 deletions
fpu/softfloat-native.c
| @@ -120,10 +120,39 @@ float32 float32_round_to_int( float32 a STATUS_PARAM) | @@ -120,10 +120,39 @@ float32 float32_round_to_int( float32 a STATUS_PARAM) | ||
| 120 | return rintf(a); | 120 | return rintf(a); |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | +float32 float32_rem( float32 a, float32 b STATUS_PARAM) | ||
| 124 | +{ | ||
| 125 | + return remainderf(a, b); | ||
| 126 | +} | ||
| 127 | + | ||
| 123 | float32 float32_sqrt( float32 a STATUS_PARAM) | 128 | float32 float32_sqrt( float32 a STATUS_PARAM) |
| 124 | { | 129 | { |
| 125 | return sqrtf(a); | 130 | return sqrtf(a); |
| 126 | } | 131 | } |
| 132 | +char float32_compare( float32 a, float32 b STATUS_PARAM ) | ||
| 133 | +{ | ||
| 134 | + if (a < b) { | ||
| 135 | + return -1; | ||
| 136 | + } else if (a == b) { | ||
| 137 | + return 0; | ||
| 138 | + } else if (a > b) { | ||
| 139 | + return 1; | ||
| 140 | + } else { | ||
| 141 | + return 2; | ||
| 142 | + } | ||
| 143 | +} | ||
| 144 | +char float32_compare_quiet( float32 a, float32 b STATUS_PARAM ) | ||
| 145 | +{ | ||
| 146 | + if (isless(a, b)) { | ||
| 147 | + return -1; | ||
| 148 | + } else if (a == b) { | ||
| 149 | + return 0; | ||
| 150 | + } else if (isgreater(a, b)) { | ||
| 151 | + return 1; | ||
| 152 | + } else { | ||
| 153 | + return 2; | ||
| 154 | + } | ||
| 155 | +} | ||
| 127 | char float32_is_signaling_nan( float32 a1) | 156 | char float32_is_signaling_nan( float32 a1) |
| 128 | { | 157 | { |
| 129 | float32u u; | 158 | float32u u; |
| @@ -195,10 +224,39 @@ float64 float64_round_to_int( float64 a STATUS_PARAM ) | @@ -195,10 +224,39 @@ float64 float64_round_to_int( float64 a STATUS_PARAM ) | ||
| 195 | #endif | 224 | #endif |
| 196 | } | 225 | } |
| 197 | 226 | ||
| 227 | +float64 float64_rem( float64 a, float64 b STATUS_PARAM) | ||
| 228 | +{ | ||
| 229 | + return remainder(a, b); | ||
| 230 | +} | ||
| 231 | + | ||
| 198 | float64 float64_sqrt( float64 a STATUS_PARAM) | 232 | float64 float64_sqrt( float64 a STATUS_PARAM) |
| 199 | { | 233 | { |
| 200 | return sqrt(a); | 234 | return sqrt(a); |
| 201 | } | 235 | } |
| 236 | +char float64_compare( float64 a, float64 b STATUS_PARAM ) | ||
| 237 | +{ | ||
| 238 | + if (a < b) { | ||
| 239 | + return -1; | ||
| 240 | + } else if (a == b) { | ||
| 241 | + return 0; | ||
| 242 | + } else if (a > b) { | ||
| 243 | + return 1; | ||
| 244 | + } else { | ||
| 245 | + return 2; | ||
| 246 | + } | ||
| 247 | +} | ||
| 248 | +char float64_compare_quiet( float64 a, float64 b STATUS_PARAM ) | ||
| 249 | +{ | ||
| 250 | + if (isless(a, b)) { | ||
| 251 | + return -1; | ||
| 252 | + } else if (a == b) { | ||
| 253 | + return 0; | ||
| 254 | + } else if (isgreater(a, b)) { | ||
| 255 | + return 1; | ||
| 256 | + } else { | ||
| 257 | + return 2; | ||
| 258 | + } | ||
| 259 | +} | ||
| 202 | char float64_is_signaling_nan( float64 a1) | 260 | char float64_is_signaling_nan( float64 a1) |
| 203 | { | 261 | { |
| 204 | float64u u; | 262 | float64u u; |
| @@ -248,10 +306,38 @@ floatx80 floatx80_round_to_int( floatx80 a STATUS_PARAM) | @@ -248,10 +306,38 @@ floatx80 floatx80_round_to_int( floatx80 a STATUS_PARAM) | ||
| 248 | { | 306 | { |
| 249 | return rintl(a); | 307 | return rintl(a); |
| 250 | } | 308 | } |
| 309 | +floatx80 floatx80_rem( floatx80 a, floatx80 b STATUS_PARAM) | ||
| 310 | +{ | ||
| 311 | + return remainderl(a, b); | ||
| 312 | +} | ||
| 251 | floatx80 floatx80_sqrt( floatx80 a STATUS_PARAM) | 313 | floatx80 floatx80_sqrt( floatx80 a STATUS_PARAM) |
| 252 | { | 314 | { |
| 253 | return sqrtl(a); | 315 | return sqrtl(a); |
| 254 | } | 316 | } |
| 317 | +char floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM ) | ||
| 318 | +{ | ||
| 319 | + if (a < b) { | ||
| 320 | + return -1; | ||
| 321 | + } else if (a == b) { | ||
| 322 | + return 0; | ||
| 323 | + } else if (a > b) { | ||
| 324 | + return 1; | ||
| 325 | + } else { | ||
| 326 | + return 2; | ||
| 327 | + } | ||
| 328 | +} | ||
| 329 | +char floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM ) | ||
| 330 | +{ | ||
| 331 | + if (isless(a, b)) { | ||
| 332 | + return -1; | ||
| 333 | + } else if (a == b) { | ||
| 334 | + return 0; | ||
| 335 | + } else if (isgreater(a, b)) { | ||
| 336 | + return 1; | ||
| 337 | + } else { | ||
| 338 | + return 2; | ||
| 339 | + } | ||
| 340 | +} | ||
| 255 | char floatx80_is_signaling_nan( floatx80 a1) | 341 | char floatx80_is_signaling_nan( floatx80 a1) |
| 256 | { | 342 | { |
| 257 | floatx80u u; | 343 | floatx80u u; |
fpu/softfloat-native.h
| @@ -127,7 +127,6 @@ float32 float32_rem( float32, float32 STATUS_PARAM); | @@ -127,7 +127,6 @@ float32 float32_rem( float32, float32 STATUS_PARAM); | ||
| 127 | float32 float32_sqrt( float32 STATUS_PARAM); | 127 | float32 float32_sqrt( float32 STATUS_PARAM); |
| 128 | INLINE char float32_eq( float32 a, float32 b STATUS_PARAM) | 128 | INLINE char float32_eq( float32 a, float32 b STATUS_PARAM) |
| 129 | { | 129 | { |
| 130 | - /* XXX: incorrect because it can raise an exception */ | ||
| 131 | return a == b; | 130 | return a == b; |
| 132 | } | 131 | } |
| 133 | INLINE char float32_le( float32 a, float32 b STATUS_PARAM) | 132 | INLINE char float32_le( float32 a, float32 b STATUS_PARAM) |
| @@ -140,7 +139,7 @@ INLINE char float32_lt( float32 a, float32 b STATUS_PARAM) | @@ -140,7 +139,7 @@ INLINE char float32_lt( float32 a, float32 b STATUS_PARAM) | ||
| 140 | } | 139 | } |
| 141 | INLINE char float32_eq_signaling( float32 a, float32 b STATUS_PARAM) | 140 | INLINE char float32_eq_signaling( float32 a, float32 b STATUS_PARAM) |
| 142 | { | 141 | { |
| 143 | - return a == b; | 142 | + return a <= b && a >= b; |
| 144 | } | 143 | } |
| 145 | INLINE char float32_le_quiet( float32 a, float32 b STATUS_PARAM) | 144 | INLINE char float32_le_quiet( float32 a, float32 b STATUS_PARAM) |
| 146 | { | 145 | { |
| @@ -150,6 +149,13 @@ INLINE char float32_lt_quiet( float32 a, float32 b STATUS_PARAM) | @@ -150,6 +149,13 @@ INLINE char float32_lt_quiet( float32 a, float32 b STATUS_PARAM) | ||
| 150 | { | 149 | { |
| 151 | return isless(a, b); | 150 | return isless(a, b); |
| 152 | } | 151 | } |
| 152 | +INLINE char float32_unordered( float32 a, float32 b STATUS_PARAM) | ||
| 153 | +{ | ||
| 154 | + return isunordered(a, b); | ||
| 155 | + | ||
| 156 | +} | ||
| 157 | +char float32_compare( float32, float32 STATUS_PARAM ); | ||
| 158 | +char float32_compare_quiet( float32, float32 STATUS_PARAM ); | ||
| 153 | char float32_is_signaling_nan( float32 ); | 159 | char float32_is_signaling_nan( float32 ); |
| 154 | 160 | ||
| 155 | INLINE float32 float32_abs(float32 a) | 161 | INLINE float32 float32_abs(float32 a) |
| @@ -213,7 +219,7 @@ INLINE char float64_lt( float64 a, float64 b STATUS_PARAM) | @@ -213,7 +219,7 @@ INLINE char float64_lt( float64 a, float64 b STATUS_PARAM) | ||
| 213 | } | 219 | } |
| 214 | INLINE char float64_eq_signaling( float64 a, float64 b STATUS_PARAM) | 220 | INLINE char float64_eq_signaling( float64 a, float64 b STATUS_PARAM) |
| 215 | { | 221 | { |
| 216 | - return a == b; | 222 | + return a <= b && a >= b; |
| 217 | } | 223 | } |
| 218 | INLINE char float64_le_quiet( float64 a, float64 b STATUS_PARAM) | 224 | INLINE char float64_le_quiet( float64 a, float64 b STATUS_PARAM) |
| 219 | { | 225 | { |
| @@ -224,6 +230,13 @@ INLINE char float64_lt_quiet( float64 a, float64 b STATUS_PARAM) | @@ -224,6 +230,13 @@ INLINE char float64_lt_quiet( float64 a, float64 b STATUS_PARAM) | ||
| 224 | return isless(a, b); | 230 | return isless(a, b); |
| 225 | 231 | ||
| 226 | } | 232 | } |
| 233 | +INLINE char float64_unordered( float64 a, float64 b STATUS_PARAM) | ||
| 234 | +{ | ||
| 235 | + return isunordered(a, b); | ||
| 236 | + | ||
| 237 | +} | ||
| 238 | +char float64_compare( float64, float64 STATUS_PARAM ); | ||
| 239 | +char float64_compare_quiet( float64, float64 STATUS_PARAM ); | ||
| 227 | char float64_is_signaling_nan( float64 ); | 240 | char float64_is_signaling_nan( float64 ); |
| 228 | 241 | ||
| 229 | INLINE float64 float64_abs(float64 a) | 242 | INLINE float64 float64_abs(float64 a) |
| @@ -287,7 +300,7 @@ INLINE char floatx80_lt( floatx80 a, floatx80 b STATUS_PARAM) | @@ -287,7 +300,7 @@ INLINE char floatx80_lt( floatx80 a, floatx80 b STATUS_PARAM) | ||
| 287 | } | 300 | } |
| 288 | INLINE char floatx80_eq_signaling( floatx80 a, floatx80 b STATUS_PARAM) | 301 | INLINE char floatx80_eq_signaling( floatx80 a, floatx80 b STATUS_PARAM) |
| 289 | { | 302 | { |
| 290 | - return a == b; | 303 | + return a <= b && a >= b; |
| 291 | } | 304 | } |
| 292 | INLINE char floatx80_le_quiet( floatx80 a, floatx80 b STATUS_PARAM) | 305 | INLINE char floatx80_le_quiet( floatx80 a, floatx80 b STATUS_PARAM) |
| 293 | { | 306 | { |
| @@ -298,6 +311,13 @@ INLINE char floatx80_lt_quiet( floatx80 a, floatx80 b STATUS_PARAM) | @@ -298,6 +311,13 @@ INLINE char floatx80_lt_quiet( floatx80 a, floatx80 b STATUS_PARAM) | ||
| 298 | return isless(a, b); | 311 | return isless(a, b); |
| 299 | 312 | ||
| 300 | } | 313 | } |
| 314 | +INLINE char floatx80_unordered( floatx80 a, floatx80 b STATUS_PARAM) | ||
| 315 | +{ | ||
| 316 | + return isunordered(a, b); | ||
| 317 | + | ||
| 318 | +} | ||
| 319 | +char floatx80_compare( floatx80, floatx80 STATUS_PARAM ); | ||
| 320 | +char floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM ); | ||
| 301 | char floatx80_is_signaling_nan( floatx80 ); | 321 | char floatx80_is_signaling_nan( floatx80 ); |
| 302 | 322 | ||
| 303 | INLINE floatx80 floatx80_abs(floatx80 a) | 323 | INLINE floatx80 floatx80_abs(floatx80 a) |