From f2166d326cb2432dd4c99aec60d9e02f9ce1a00e Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Sat, 20 Sep 2025 15:19:33 +1000 Subject: [PATCH] tests/fpu: Add a test for result writing being suppressed When an arithmetic instruction generates an invalid operation exception or a divide by zero exception, and that exception is enabled in the FPSCR, the writing of the result to the destination register should be suppressed, leaving whatever value was last written in the destination. Add a check that this occurs correctly, for the cases of square root of a negative number (invalid operation exception) and division by zero (zero divide exception). Signed-off-by: Paul Mackerras --- tests/fpu/fpu.c | 44 +++++++++++++++++++++++++++++++++++++ tests/test_fpu.bin | Bin 32896 -> 32896 bytes tests/test_fpu.console_out | 1 + 3 files changed, 45 insertions(+) diff --git a/tests/fpu/fpu.c b/tests/fpu/fpu.c index c13110f..5e45038 100644 --- a/tests/fpu/fpu.c +++ b/tests/fpu/fpu.c @@ -1795,6 +1795,49 @@ int fpu_test_26(void) return trapit(0, test26); } +/* Check for enabled invalid exception suppressing write of result */ +int test27(long arg) +{ + unsigned long operands[4]; + unsigned long result; + + operands[0] = 0xabcd1234ef895670; + operands[1] = 0xbff0000000000000; + operands[2] = 0xef895670abcd1234; + operands[3] = 0; + set_fpscr(FPS_VE); + asm("lfd 3,0(%0); isync; lfd 4,8(%0); lfd 3,16(%0); fsqrt 3,4; stfd 3,0(%1)" + : : "b" (&operands), "b" (&result) : "memory"); + if (result != 0xef895670abcd1234) { + if (result == 0x7ffc000000000000) + return 1; + if (result == 0xabcd1234ef895670) + return 2; + print_hex(result, 16, " "); + return 3; + } + + set_fpscr(FPS_ZE); + asm("lfd 3,0(%0); isync; lfd 4,8(%0); lfd 5,24(%0); lfd 3,16(%0); fdiv 3,4,5; stfd 3,0(%1)" + : : "b" (&operands), "b" (&result) : "memory"); + if (result != 0xef895670abcd1234) { + if (result == 0x7ffc000000000000) + return 4; + if (result == 0xabcd1234ef895670) + return 5; + print_hex(result, 16, " "); + return 6; + } + + return 0; +} + +int fpu_test_27(void) +{ + enable_fp(); + return trapit(0, test27); +} + int fail = 0; void do_test(int num, int (*test)(void)) @@ -1846,6 +1889,7 @@ int main(void) do_test(24, fpu_test_24); do_test(25, fpu_test_25); do_test(26, fpu_test_26); + do_test(27, fpu_test_27); return fail; } diff --git a/tests/test_fpu.bin b/tests/test_fpu.bin index 24878af7125b68dfa588e23782443a3a7f773f65..b2a293c223beb4f42d028d6301a081fde8194082 100755 GIT binary patch delta 4903 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 boIluARg31XnlDhl@HTC%jy!0p{+;80r>D;E diff --git a/tests/test_fpu.console_out b/tests/test_fpu.console_out index 987a633..6913d7e 100644 --- a/tests/test_fpu.console_out +++ b/tests/test_fpu.console_out @@ -24,3 +24,4 @@ test 23:PASS test 24:PASS test 25:PASS test 26:PASS +test 27:PASS