History

Fix conversions of subnormals to long double

those need to be normalized when extending from float/double to binary128.

Michael Matz committed 6 years ago

Commit 2e798521 parent a6142692 files · +40 −4Browse files

Unified · Split

2 files
  1. lib/lib-arm64.c +13 −2
  2. tests/tcctest.c +27 −2
lib/lib-arm64.c+13−2
@@ -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 else390 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 else414 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;
tests/tcctest.c+27−2
@@ -2215,13 +2215,14 @@ double ftab1[3] = { 1.2, 3.4, -5.6 }; · 2214 unmodified lines
2215void float_test(void)2215void 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#endif2271#endif
2247}2272}
2248 2273

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t