[gcc(refs/users/aoliva/heads/testbase)] RISC-V: Make __divdi3 handle div by zero same as hardware.
Alexandre Oliva
aoliva@gcc.gnu.org
Thu Jun 4 07:31:01 GMT 2020
https://gcc.gnu.org/g:4013baf99c38f7bca06a51f8301e8fb195ccfa33
commit 4013baf99c38f7bca06a51f8301e8fb195ccfa33
Author: Jim Wilson <jimw@sifive.com>
Date: Tue Jun 2 11:19:39 2020 -0700
RISC-V: Make __divdi3 handle div by zero same as hardware.
The ISA manual specifies that divide by zero always returns -1 as the result.
We were failing to do that when the dividend was negative.
Original patch from Virginie Moser.
libgcc/
* config/riscv/div.S (__divdi3): For negative arguments, change bgez
to bgtz.
Diff:
---
libgcc/config/riscv/div.S | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/libgcc/config/riscv/div.S b/libgcc/config/riscv/div.S
index 151f8e273ac..17234324c1e 100644
--- a/libgcc/config/riscv/div.S
+++ b/libgcc/config/riscv/div.S
@@ -107,10 +107,12 @@ FUNC_END (__umoddi3)
/* Handle negative arguments to __divdi3. */
.L10:
neg a0, a0
- bgez a1, .L12 /* Compute __udivdi3(-a0, a1), then negate the result. */
+ /* Zero is handled as a negative so that the result will not be inverted. */
+ bgtz a1, .L12 /* Compute __udivdi3(-a0, a1), then negate the result. */
+
neg a1, a1
- j __udivdi3 /* Compute __udivdi3(-a0, -a1). */
-.L11: /* Compute __udivdi3(a0, -a1), then negate the result. */
+ j __udivdi3 /* Compute __udivdi3(-a0, -a1). */
+.L11: /* Compute __udivdi3(a0, -a1), then negate the result. */
neg a1, a1
.L12:
move t0, ra
More information about the Gcc-cvs
mailing list