Skip to content

Commit

Permalink
RISC-V __mulsf3: handle exponent increase due to rounding
Browse files Browse the repository at this point in the history
  • Loading branch information
Wren6991 committed Nov 23, 2024
1 parent 39a7f97 commit a955473
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/rp2_common/pico_float/float_single_hazard3.S
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,6 @@ __mulsf3:
clz a0, a4
sll a4, a4, a0
sub a2, a2, a0
// After normalising we can calculate the final exponent, since rounding
// cannot increase the exponent for multiplication (unlike addition)
add a2, a2, a3
// Subtract redundant bias term (127), add 1 for normalisation correction
addi a2, a2, -126
Expand All @@ -231,13 +229,20 @@ __mulsf3:
bexti a1, a4, 8
add a4, a4, a1
addi a4, a4, 127
// Check carry-out: exponent may increase due to rounding
bgez a4, 2f
1:
// Pack it and ship it
packh a2, a2, a6
slli a2, a2, 23
slli a4, a4, 1
srli a4, a4, 9
add a0, a4, a2
ret
2:
srli a4, a4, 1
addi a2, a2, 1
j 1b

__mulsf_underflow:
// Signed zero
Expand Down
8 changes: 8 additions & 0 deletions test/pico_float_test/pico_float_test_hazard3.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,14 @@ test_t mul_directed_tests[] = {
// 1.25 x 2^-63 x 1.25 x 2^-64 = 0
// (normal inputs with subnormal output, and we claim to be FTZ)
{0x20200000u, 0x1fa00000u, 0x00000000u},
// 1.333333 (rounded down) x 1.5 = 2 - 1 ulp
{0x3faaaaaau, 0x3fc00000u, 0x3fffffffu},
// 1.333333 (rounded down) x (1.5 + 1 ulp) = 2 exactly
{0x3faaaaaau, 0x3fc00001u, 0x40000000u},
// (1.333333 (rounded down) + 1 ulp) x 1.5 = 2 exactly
{0x3faaaaabu, 0x3fc00000u, 0x40000000u},
// (1.25 - 1 ulp) x (0.8 + 1 ulp) = 1 exactly (exponent increases after rounding)
{0x3f9fffffu, 0x3f4cccceu, 0x3f800000u},
};

#define N_RANDOM_TESTS 1000
Expand Down

0 comments on commit a955473

Please sign in to comment.