Skip to content

Commit

Permalink
RISC-V __mulsf3: handle exponent increase due to rounding (#2086)
Browse files Browse the repository at this point in the history
  • Loading branch information
Wren6991 authored Nov 23, 2024
1 parent 39a7f97 commit 65d118c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
11 changes: 8 additions & 3 deletions src/rp2_common/pico_float/float_single_hazard3.S
Original file line number Diff line number Diff line change
Expand Up @@ -216,13 +216,10 @@ __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
blez a2, __mulsf_underflow
bge a2, t0, __mulsf_overflow

// Gather sticky bits from low fraction:
snez a1, a1
Expand All @@ -231,13 +228,21 @@ __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:
bge a2, t0, __mulsf_overflow
// 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
12 changes: 12 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,18 @@ 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},
// as above, but overflow on exponent increase -> +inf
{0x3f9fffffu, 0x7f4cccceu, 0x7f800000u},
// subtract 1 ulp from rhs -> largest normal
{0x3f9fffffu, 0x7f4ccccdu, 0x7f7fffffu},
};

#define N_RANDOM_TESTS 1000
Expand Down

0 comments on commit 65d118c

Please sign in to comment.