mirror of
https://github.com/mirror/tinycc.git
synced 2025-04-01 12:30:08 +08:00
Fix conversions of subnormals to long double
those need to be normalized when extending from float/double to binary128.
This commit is contained in:
parent
a614269794
commit
2e798523e4
@ -387,7 +387,12 @@ long double __extendsftf2(float f)
|
|||||||
else if (a << 1 >> 24 == 255)
|
else if (a << 1 >> 24 == 255)
|
||||||
x.x1 = (0x7fff000000000000 | aa >> 31 << 63 | aa << 41 >> 16 |
|
x.x1 = (0x7fff000000000000 | aa >> 31 << 63 | aa << 41 >> 16 |
|
||||||
(uint64_t)!!(a << 9) << 47);
|
(uint64_t)!!(a << 9) << 47);
|
||||||
else
|
else if (a << 1 >> 24 == 0) {
|
||||||
|
uint64_t adj = 0;
|
||||||
|
while (!(a << 1 >> 1 >> (23 - adj)))
|
||||||
|
adj++;
|
||||||
|
x.x1 = aa >> 31 << 63 | (16256 - adj + 1) << 48 | aa << adj << 41 >> 16;
|
||||||
|
} else
|
||||||
x.x1 = (aa >> 31 << 63 | ((aa >> 23 & 255) + 16256) << 48 |
|
x.x1 = (aa >> 31 << 63 | ((aa >> 23 & 255) + 16256) << 48 |
|
||||||
aa << 41 >> 16);
|
aa << 41 >> 16);
|
||||||
memcpy(&fx, &x, 16);
|
memcpy(&fx, &x, 16);
|
||||||
@ -406,7 +411,13 @@ long double __extenddftf2(double f)
|
|||||||
else if (a << 1 >> 53 == 2047)
|
else if (a << 1 >> 53 == 2047)
|
||||||
x.x1 = (0x7fff000000000000 | a >> 63 << 63 | a << 12 >> 16 |
|
x.x1 = (0x7fff000000000000 | a >> 63 << 63 | a << 12 >> 16 |
|
||||||
(uint64_t)!!(a << 12) << 47);
|
(uint64_t)!!(a << 12) << 47);
|
||||||
else
|
else if (a << 1 >> 53 == 0) {
|
||||||
|
uint64_t adj = 0;
|
||||||
|
while (!(a << 1 >> 1 >> (52 - adj)))
|
||||||
|
adj++;
|
||||||
|
x.x0 <<= adj;
|
||||||
|
x.x1 = a >> 63 << 63 | (15360 - adj + 1) << 48 | a << adj << 12 >> 16;
|
||||||
|
} else
|
||||||
x.x1 = a >> 63 << 63 | ((a >> 52 & 2047) + 15360) << 48 | a << 12 >> 16;
|
x.x1 = a >> 63 << 63 | ((a >> 52 & 2047) + 15360) << 48 | a << 12 >> 16;
|
||||||
memcpy(&fx, &x, 16);
|
memcpy(&fx, &x, 16);
|
||||||
return fx;
|
return fx;
|
||||||
|
@ -2215,13 +2215,14 @@ double ftab1[3] = { 1.2, 3.4, -5.6 };
|
|||||||
void float_test(void)
|
void float_test(void)
|
||||||
{
|
{
|
||||||
#if !defined(__arm__) || defined(__ARM_PCS_VFP)
|
#if !defined(__arm__) || defined(__ARM_PCS_VFP)
|
||||||
float fa, fb;
|
volatile float fa, fb;
|
||||||
double da, db;
|
volatile double da, db;
|
||||||
int a;
|
int a;
|
||||||
unsigned int b;
|
unsigned int b;
|
||||||
static double nan2 = 0.0/0.0;
|
static double nan2 = 0.0/0.0;
|
||||||
static double inf1 = 1.0/0.0;
|
static double inf1 = 1.0/0.0;
|
||||||
static double inf2 = 1e5000;
|
static double inf2 = 1e5000;
|
||||||
|
volatile LONG_DOUBLE la;
|
||||||
|
|
||||||
printf("sizeof(float) = %d\n", sizeof(float));
|
printf("sizeof(float) = %d\n", sizeof(float));
|
||||||
printf("sizeof(double) = %d\n", sizeof(double));
|
printf("sizeof(double) = %d\n", sizeof(double));
|
||||||
@ -2243,6 +2244,30 @@ void float_test(void)
|
|||||||
db = b;
|
db = b;
|
||||||
printf("db = %f\n", db);
|
printf("db = %f\n", db);
|
||||||
printf("nan != nan = %d, inf1 = %f, inf2 = %f\n", nan2 != nan2, inf1, inf2);
|
printf("nan != nan = %d, inf1 = %f, inf2 = %f\n", nan2 != nan2, inf1, inf2);
|
||||||
|
da = 0x0.88p-1022; /* a subnormal */
|
||||||
|
la = da;
|
||||||
|
printf ("da subnormal = %a\n", da);
|
||||||
|
printf ("da subnormal = %.40g\n", da);
|
||||||
|
printf ("la subnormal = %La\n", la);
|
||||||
|
printf ("la subnormal = %.40Lg\n", la);
|
||||||
|
da /= 2;
|
||||||
|
la = da;
|
||||||
|
printf ("da/2 subnormal = %a\n", da);
|
||||||
|
printf ("da/2 subnormal = %.40g\n", da);
|
||||||
|
printf ("la/2 subnormal = %La\n", la);
|
||||||
|
printf ("la/2 subnormal = %.40Lg\n", la);
|
||||||
|
fa = 0x0.88p-126f; /* a subnormal */
|
||||||
|
la = fa;
|
||||||
|
printf ("fa subnormal = %a\n", fa);
|
||||||
|
printf ("fa subnormal = %.40g\n", fa);
|
||||||
|
printf ("la subnormal = %La\n", la);
|
||||||
|
printf ("la subnormal = %.40Lg\n", la);
|
||||||
|
fa /= 2;
|
||||||
|
la = fa;
|
||||||
|
printf ("fa/2 subnormal = %a\n", fa);
|
||||||
|
printf ("fa/2 subnormal = %.40g\n", fa);
|
||||||
|
printf ("la/2 subnormal = %La\n", la);
|
||||||
|
printf ("la/2 subnormal = %.40Lg\n", la);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user