[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