1
0
mirror of https://github.com/antonblanchard/microwatt.git synced 2026-01-13 15:18:09 +00:00

tests/fpu: Add tests for lfs and stfs instructions

This exercises the single-to-double and double-to-single conversions,
including denormalized cases.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
This commit is contained in:
Paul Mackerras 2020-07-02 19:55:30 +10:00
parent 9d285a265c
commit 76ec1a2f0a
3 changed files with 69 additions and 1 deletions

View File

@ -163,6 +163,72 @@ int fpu_test_2(void)
return 0;
}
struct sp_dp_equiv {
unsigned int sp;
unsigned long dp;
} sp_dp_equiv[] = {
{ 0, 0 },
{ 0x80000000, 0x8000000000000000 },
{ 0x7f800000, 0x7ff0000000000000 },
{ 0xff800000, 0xfff0000000000000 },
{ 0x7f812345, 0x7ff02468a0000000 },
{ 0x456789ab, 0x40acf13560000000 },
{ 0x12345678, 0x3a468acf00000000 },
{ 0x00400000, 0x3800000000000000 },
{ 0x00200000, 0x37f0000000000000 },
{ 0x00000002, 0x36b0000000000000 },
{ 0x00000001, 0x36a0000000000000 },
};
int sp_to_dp(long arg)
{
unsigned long dp;
__asm__("lfs 20,0(%0); stfd 20,0(%1)"
: : "b" (&sp_dp_equiv[arg].sp), "b" (&dp) : "memory");
if (dp != sp_dp_equiv[arg].dp) {
print_hex(sp_dp_equiv[arg].sp, 8);
print_string(" ");
print_hex(dp, 16);
print_string(" ");
print_hex(sp_dp_equiv[arg].dp, 16);
print_string(" ");
}
return dp != sp_dp_equiv[arg].dp;
}
int dp_to_sp(long arg)
{
unsigned int sp;
__asm__("lfd 21,0(%0); stfs 21,0(%1)"
: : "b" (&sp_dp_equiv[arg].dp), "b" (&sp) : "memory");
return sp != sp_dp_equiv[arg].sp;
}
int fpu_test_3(void)
{
int i, n, ret;
n = sizeof(sp_dp_equiv) / sizeof(sp_dp_equiv[0]);
enable_fp();
for (i = 0; i < n; ++i) {
ret = trapit(i, sp_to_dp);
if (ret != 0) {
if (ret == 1)
ret += i;
return ret;
}
ret = trapit(i, dp_to_sp);
if (ret != 0) {
if (ret == 1)
ret += i + 0x10000;
return ret;
}
}
return 0;
}
int fail = 0;
void do_test(int num, int (*test)(void))
@ -176,7 +242,7 @@ void do_test(int num, int (*test)(void))
} else {
fail = 1;
print_string("FAIL ");
print_hex(ret, 4);
print_hex(ret, 5);
print_string(" SRR0=");
print_hex(mfspr(SRR0), 16);
print_string(" SRR1=");
@ -191,6 +257,7 @@ int main(void)
do_test(1, fpu_test_1);
do_test(2, fpu_test_2);
do_test(3, fpu_test_3);
return fail;
}

Binary file not shown.

View File

@ -1,2 +1,3 @@
test 01:PASS
test 02:PASS
test 03:PASS