those need to be normalized when extending from float/double to binary128.
Unified · Split
| @@ -387,7 +387,12 @@ long double __extendsftf2(float f) · 386 unmodified lines | |||
| 387 | else if (a << 1 >> 24 == 255) | 387 | else if (a << 1 >> 24 == 255) |
| 388 | x.x1 = (0x7fff000000000000 | aa >> 31 << 63 | aa << 41 >> 16 | | 388 | x.x1 = (0x7fff000000000000 | aa >> 31 << 63 | aa << 41 >> 16 | |
| 389 | (uint64_t)!!(a << 9) << 47); | 389 | (uint64_t)!!(a << 9) << 47); |
| 390 | else | 390 | else if (a << 1 >> 24 == 0) { |
| 391 | uint64_t adj = 0; | ||
| 392 | while (!(a << 1 >> 1 >> (23 - adj))) | ||
| 393 | adj++; | ||
| 394 | x.x1 = aa >> 31 << 63 | (16256 - adj + 1) << 48 | aa << adj << 41 >> 16; | ||
| 395 | } else | ||
| 391 | x.x1 = (aa >> 31 << 63 | ((aa >> 23 & 255) + 16256) << 48 | | 396 | x.x1 = (aa >> 31 << 63 | ((aa >> 23 & 255) + 16256) << 48 | |
| 392 | aa << 41 >> 16); | 397 | aa << 41 >> 16); |
| 393 | memcpy(&fx, &x, 16); | 398 | memcpy(&fx, &x, 16); |
| @@ -406,7 +411,13 @@ long double __extenddftf2(double f) · 12 unmodified lines | |||
| 406 | else if (a << 1 >> 53 == 2047) | 411 | else if (a << 1 >> 53 == 2047) |
| 407 | x.x1 = (0x7fff000000000000 | a >> 63 << 63 | a << 12 >> 16 | | 412 | x.x1 = (0x7fff000000000000 | a >> 63 << 63 | a << 12 >> 16 | |
| 408 | (uint64_t)!!(a << 12) << 47); | 413 | (uint64_t)!!(a << 12) << 47); |
| 409 | else | 414 | else if (a << 1 >> 53 == 0) { |
| 415 | uint64_t adj = 0; | ||
| 416 | while (!(a << 1 >> 1 >> (52 - adj))) | ||
| 417 | adj++; | ||
| 418 | x.x0 <<= adj; | ||
| 419 | x.x1 = a >> 63 << 63 | (15360 - adj + 1) << 48 | a << adj << 12 >> 16; | ||
| 420 | } else | ||
| 410 | x.x1 = a >> 63 << 63 | ((a >> 52 & 2047) + 15360) << 48 | a << 12 >> 16; | 421 | x.x1 = a >> 63 << 63 | ((a >> 52 & 2047) + 15360) << 48 | a << 12 >> 16; |
| 411 | memcpy(&fx, &x, 16); | 422 | memcpy(&fx, &x, 16); |
| 412 | return fx; | 423 | return fx; |
| @@ -2215,13 +2215,14 @@ double ftab1[3] = { 1.2, 3.4, -5.6 }; · 2214 unmodified lines | |||
| 2215 | void float_test(void) | 2215 | void float_test(void) |
| 2216 | { | 2216 | { |
| 2217 | #if !defined(__arm__) || defined(__ARM_PCS_VFP) | 2217 | #if !defined(__arm__) || defined(__ARM_PCS_VFP) |
| 2218 | float fa, fb; | 2218 | volatile float fa, fb; |
| 2219 | double da, db; | 2219 | volatile double da, db; |
| 2220 | int a; | 2220 | int a; |
| 2221 | unsigned int b; | 2221 | unsigned int b; |
| 2222 | static double nan2 = 0.0/0.0; | 2222 | static double nan2 = 0.0/0.0; |
| 2223 | static double inf1 = 1.0/0.0; | 2223 | static double inf1 = 1.0/0.0; |
| 2224 | static double inf2 = 1e5000; | 2224 | static double inf2 = 1e5000; |
| 2225 | volatile LONG_DOUBLE la; | ||
| 2225 | 2226 | ||
| 2226 | printf("sizeof(float) = %d\n", sizeof(float)); | 2227 | printf("sizeof(float) = %d\n", sizeof(float)); |
| 2227 | printf("sizeof(double) = %d\n", sizeof(double)); | 2228 | printf("sizeof(double) = %d\n", sizeof(double)); |
| @@ -2243,6 +2244,30 @@ void float_test(void) · 15 unmodified lines | |||
| 2243 | db = b; | 2244 | db = b; |
| 2244 | printf("db = %f\n", db); | 2245 | printf("db = %f\n", db); |
| 2245 | printf("nan != nan = %d, inf1 = %f, inf2 = %f\n", nan2 != nan2, inf1, inf2); | 2246 | printf("nan != nan = %d, inf1 = %f, inf2 = %f\n", nan2 != nan2, inf1, inf2); |
| 2247 | da = 0x0.88p-1022; /* a subnormal */ | ||
| 2248 | la = da; | ||
| 2249 | printf ("da subnormal = %a\n", da); | ||
| 2250 | printf ("da subnormal = %.40g\n", da); | ||
| 2251 | printf ("la subnormal = %La\n", la); | ||
| 2252 | printf ("la subnormal = %.40Lg\n", la); | ||
| 2253 | da /= 2; | ||
| 2254 | la = da; | ||
| 2255 | printf ("da/2 subnormal = %a\n", da); | ||
| 2256 | printf ("da/2 subnormal = %.40g\n", da); | ||
| 2257 | printf ("la/2 subnormal = %La\n", la); | ||
| 2258 | printf ("la/2 subnormal = %.40Lg\n", la); | ||
| 2259 | fa = 0x0.88p-126f; /* a subnormal */ | ||
| 2260 | la = fa; | ||
| 2261 | printf ("fa subnormal = %a\n", fa); | ||
| 2262 | printf ("fa subnormal = %.40g\n", fa); | ||
| 2263 | printf ("la subnormal = %La\n", la); | ||
| 2264 | printf ("la subnormal = %.40Lg\n", la); | ||
| 2265 | fa /= 2; | ||
| 2266 | la = fa; | ||
| 2267 | printf ("fa/2 subnormal = %a\n", fa); | ||
| 2268 | printf ("fa/2 subnormal = %.40g\n", fa); | ||
| 2269 | printf ("la/2 subnormal = %La\n", la); | ||
| 2270 | printf ("la/2 subnormal = %.40Lg\n", la); | ||
| 2246 | #endif | 2271 | #endif |
| 2247 | } | 2272 | } |
| 2248 | 2273 | ||