summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-25 21:40:42 +0000
committerbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-25 21:40:42 +0000
commit18505bd77751011885939799391222ff6db80368 (patch)
treef7df6afd9db14aa950c9c9b048ad71b53f89a3e5
parentd9d4638365948713497fa256eda3314d81281057 (diff)
downloadgcc-18505bd77751011885939799391222ff6db80368.tar.gz
* config/xtensa/lib1funcs.asm (__udivsi3, __divsi3): Throw an exception
for divide-by-zero. (__umodsi3, __modsi3): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124165 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/xtensa/lib1funcs.asm35
2 files changed, 34 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9dbd3276761..c4cfa5cbd21 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-04-25 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/lib1funcs.asm (__udivsi3, __divsi3): Throw an exception
+ for divide-by-zero.
+ (__umodsi3, __modsi3): Likewise.
+
2007-04-25 Dirk Mueller <dmueller@suse.de>
* c-typeck.c (build_compound_expr): Annotate warning()
diff --git a/gcc/config/xtensa/lib1funcs.asm b/gcc/config/xtensa/lib1funcs.asm
index 5b4f8c84917..6db2a7d7239 100644
--- a/gcc/config/xtensa/lib1funcs.asm
+++ b/gcc/config/xtensa/lib1funcs.asm
@@ -1,5 +1,6 @@
/* Assembly functions for the Xtensa version of libgcc1.
- Copyright (C) 2001, 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007
+ Free Software Foundation, Inc.
Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
This file is part of GCC.
@@ -530,7 +531,11 @@ __udivsi3:
leaf_return
.Lerror:
- /* just return 0; could throw an exception */
+ /* Divide by zero: Use an illegal instruction to force an exception.
+ The subsequent "DIV0" string can be recognized by the exception
+ handler to identify the real cause of the exception. */
+ ill
+ .ascii "DIV0"
.Lreturn0:
movi a2, 0
@@ -597,7 +602,11 @@ __divsi3:
leaf_return
.Lerror:
- /* just return 0; could throw an exception */
+ /* Divide by zero: Use an illegal instruction to force an exception.
+ The subsequent "DIV0" string can be recognized by the exception
+ handler to identify the real cause of the exception. */
+ ill
+ .ascii "DIV0"
.Lreturn0:
movi a2, 0
@@ -645,10 +654,16 @@ __umodsi3:
leaf_return
.Lle_one:
- /* The divisor is either 0 or 1, so just return 0.
- Someday we may want to throw an exception if the divisor is 0. */
+ beqz a3, .Lerror
movi a2, 0
leaf_return
+
+.Lerror:
+ /* Divide by zero: Use an illegal instruction to force an exception.
+ The subsequent "DIV0" string can be recognized by the exception
+ handler to identify the real cause of the exception. */
+ ill
+ .ascii "DIV0"
.size __umodsi3,.-__umodsi3
#endif /* L_umodsi3 */
@@ -697,10 +712,16 @@ __modsi3:
leaf_return
.Lle_one:
- /* udivisor is either 0 or 1, so just return 0.
- Someday we may want to throw an exception if udivisor is 0. */
+ beqz a3, .Lerror
movi a2, 0
leaf_return
+
+.Lerror:
+ /* Divide by zero: Use an illegal instruction to force an exception.
+ The subsequent "DIV0" string can be recognized by the exception
+ handler to identify the real cause of the exception. */
+ ill
+ .ascii "DIV0"
.size __modsi3,.-__modsi3
#endif /* L_modsi3 */