forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.5 KiB
85 lines
1.5 KiB
// SPDX-License-Identifier: GPL-2.0+ |
|
/* |
|
* Copyright (C) 2007 |
|
* Wolfgang Denk, DENX Software Engineering, [email protected]. |
|
*/ |
|
/* |
|
* This file is originally a part of the GCC testsuite. |
|
* Check that certain subnormal numbers (formerly known as denormalized |
|
* numbers) are rounded to within 0.5 ulp. PR other/14354. |
|
*/ |
|
|
|
#include <common.h> |
|
|
|
#include <post.h> |
|
|
|
GNU_FPOST_ATTR |
|
|
|
#if CONFIG_POST & CONFIG_SYS_POST_FPU |
|
|
|
union uf |
|
{ |
|
unsigned int u; |
|
float f; |
|
}; |
|
|
|
static float |
|
u2f (unsigned int v) |
|
{ |
|
union uf u; |
|
u.u = v; |
|
return u.f; |
|
} |
|
|
|
static unsigned int |
|
f2u (float v) |
|
{ |
|
union uf u; |
|
u.f = v; |
|
return u.u; |
|
} |
|
|
|
static int ok = 1; |
|
|
|
static void |
|
tstmul (unsigned int ux, unsigned int uy, unsigned int ur) |
|
{ |
|
float x = u2f (ux); |
|
float y = u2f (uy); |
|
|
|
if (f2u (x * y) != ur) |
|
/* Set a variable rather than aborting here, to simplify tracing when |
|
several computations are wrong. */ |
|
ok = 0; |
|
} |
|
|
|
/* We don't want to make this const and static, or else we risk inlining |
|
causing the test to fold as constants at compile-time. */ |
|
struct |
|
{ |
|
unsigned int p1, p2, res; |
|
} static volatile expected[] = |
|
{ |
|
{0xfff, 0x3f800400, 0xfff}, |
|
{0xf, 0x3fc88888, 0x17}, |
|
{0xf, 0x3f844444, 0xf} |
|
}; |
|
|
|
int fpu_post_test_math7 (void) |
|
{ |
|
unsigned int i; |
|
|
|
for (i = 0; i < ARRAY_SIZE(expected); i++) |
|
{ |
|
tstmul (expected[i].p1, expected[i].p2, expected[i].res); |
|
tstmul (expected[i].p2, expected[i].p1, expected[i].res); |
|
} |
|
|
|
if (!ok) { |
|
post_log ("Error in FPU math7 test\n"); |
|
return -1; |
|
} |
|
return 0; |
|
} |
|
|
|
#endif /* CONFIG_POST & CONFIG_SYS_POST_FPU */
|
|
|