bpabi.S (test_div_by_zero): Make label names consistent between thumb2 and arm mode...
authorSandra Loosemore <sandra@codesourcery.com>
Tue, 17 Feb 2015 17:39:22 +0000 (12:39 -0500)
committerSandra Loosemore <sandra@gcc.gnu.org>
Tue, 17 Feb 2015 17:39:22 +0000 (12:39 -0500)
2015-02-17  Sandra Loosemore  <sandra@codesourcery.com>

libgcc/
* config/arm/bpabi.S (test_div_by_zero): Make label names
consistent between thumb2 and arm mode cases.  Separate the
signed comparison on the high word of the numerator from the
unsigned comparison on the low word.
* config/arm/bpabi-v6m.S (test_div_by_zero): Similarly separate
signed comparison.

gcc/testsuite/
* gcc.target/arm/divzero.c: New test case.

From-SVN: r220765

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/divzero.c [new file with mode: 0644]
libgcc/ChangeLog
libgcc/config/arm/bpabi-v6m.S
libgcc/config/arm/bpabi.S

index 1864240b52f285887879cb793a62d7acc6fd5a87..9a2bb4b88fbe3f5808e6ff5367b5b36f632ec8ca 100644 (file)
@@ -1,3 +1,7 @@
+2015-02-17  Sandra Loosemore  <sandra@codesourcery.com>
+
+       * gcc.target/arm/divzero.c: New test case.
+
 2015-02-17  Tom de Vries  <tom@codesourcery.com>
 
        * gcc.target/x86_64/abi/callabi/vaarg-6.c: New test.
diff --git a/gcc/testsuite/gcc.target/arm/divzero.c b/gcc/testsuite/gcc.target/arm/divzero.c
new file mode 100644 (file)
index 0000000..7d398a5
--- /dev/null
@@ -0,0 +1,85 @@
+/* { dg-require-effective-target arm_eabi } */
+/* { dg-options "" } */
+/* { dg-do run } */
+
+/* Check that long long divmod functions pass the right argument to
+   __aeabi_ldiv0 on divide by zero.  */
+
+#ifdef DEBUGME
+#include <stdio.h>
+#else
+extern void abort (void);
+#endif
+
+/* Override div zero handler and simply return the provided value.  */
+long long __aeabi_ldiv0 (long long r)
+{
+  return r;
+}
+
+long long lldiv (long long a, long long b)
+{
+  return a / b;
+}
+
+unsigned long long ulldiv (unsigned long long a, unsigned long long b)
+{
+  return a / b;
+}
+
+void check (long long num, long long expected)
+{
+  long long res = lldiv (num, 0LL);
+  if (res != expected)
+#ifdef DEBUGME
+    {
+      printf ("num=%08X:%08X\n", (unsigned)(num >> 32), (unsigned)num);
+      printf ("res=%08X:%08X\n", (unsigned)(res >> 32), (unsigned)res);
+    }
+#else
+    abort ();
+#endif
+}
+
+void ucheck (unsigned long long num, unsigned long long expected)
+{
+  unsigned long long res = ulldiv (num, 0ULL);
+  if (res != expected)
+#ifdef DEBUGME
+    {
+      printf ("num=%08X:%08X\n", (unsigned)(num >> 32), (unsigned)num);
+      printf ("res=%08X:%08X\n", (unsigned)(res >> 32), (unsigned)res);
+    }
+#else
+    abort ();
+#endif
+}
+
+#define POS_BIG 0x7fffffffffffffffLL
+#define NEG_BIG 0x8000000000000000LL
+#define UNS_BIG 0xffffffffffffffffULL
+
+int main ()
+{
+  check (0LL, 0LL);
+  check (1LL, POS_BIG);
+  check (0x000000007fffffffLL, POS_BIG);
+  check (0x00000000ffffffffLL, POS_BIG);
+  check (0x0000000100000000LL, POS_BIG);
+  check (POS_BIG, POS_BIG);
+  check (-1LL, NEG_BIG);
+  check (-0x000000007fffffffLL, NEG_BIG);
+  check (-0x00000000ffffffffLL, NEG_BIG);
+  check (-0x0000000100000000LL, NEG_BIG);
+  check (NEG_BIG, NEG_BIG);
+
+  ucheck (0ULL, 0ULL);
+  ucheck (1ULL, UNS_BIG);
+  ucheck (0x000000007fffffffULL, UNS_BIG);
+  ucheck (0x00000000ffffffffULL, UNS_BIG);
+  ucheck (0x0000000100000000ULL, UNS_BIG);
+  ucheck ((unsigned long long)POS_BIG, UNS_BIG);
+  ucheck (UNS_BIG, UNS_BIG);
+
+  return 0;
+}
index 0bff7ef3b06f9c09da77afe60a1c9ecd35c94222..e05ba785f06ff3bcaf5cab44dade36956f5f5343 100644 (file)
@@ -1,3 +1,12 @@
+2015-02-17  Sandra Loosemore  <sandra@codesourcery.com>
+
+       * config/arm/bpabi.S (test_div_by_zero): Make label names
+       consistent between thumb2 and arm mode cases.  Separate the
+       signed comparison on the high word of the numerator from the
+       unsigned comparison on the low word.
+       * config/arm/bpabi-v6m.S (test_div_by_zero): Similarly separate
+       signed comparison.
+
 2015-02-17  Joseph Myers  <joseph@codesourcery.com>
 
        * config/nvptx/realloc.c: Include <stddef.h> instead of <stdlib.h>
index 0a3289367df0dc7ac425bbd1b2758dd261e1932a..a1e164032a08d04f7e8be80094d3b054b4e8bed4 100644 (file)
@@ -85,19 +85,21 @@ FUNC_START aeabi_ulcmp
        cmp     yyl, #0
        bne     7f
        cmp     xxh, #0
+       .ifc    \signed, unsigned
        bne     2f
        cmp     xxl, #0
 2:
-       .ifc    \signed, unsigned
        beq     3f
        mov     xxh, #0
        mvn     xxh, xxh                @ 0xffffffff
        mov     xxl, xxh
 3:
        .else
-       beq     5f
        blt     6f
-       mov     xxl, #0
+       bgt     4f
+       cmp     xxl, #0
+       beq     5f
+4:     mov     xxl, #0
        mvn     xxl, xxl                @ 0xffffffff
        lsr     xxh, xxl, #1            @ 0x7fffffff
        b       5f
index 4cb3d1728b9c5c823a243483601ef564453a04eb..f2d990d9a7bb5c42f21c68977906936a72b0c68d 100644 (file)
@@ -80,26 +80,29 @@ ARM_FUNC_START aeabi_ulcmp
 /* Tail-call to divide-by-zero handlers which may be overridden by the user,
    so unwinding works properly.  */
 #if defined(__thumb2__)
-       cbnz    yyh, 1f
-       cbnz    yyl, 1f
+       cbnz    yyh, 2f
+       cbnz    yyl, 2f
        cmp     xxh, #0
+       .ifc \signed, unsigned
        do_it   eq
        cmpeq   xxl, #0
-       .ifc \signed, unsigned
-       beq     2f
-       mov     xxh, #0xffffffff
-       mov     xxl, xxh
-2:
+       do_it   ne, t
+       movne   xxh, #0xffffffff
+       movne   xxl, #0xffffffff
        .else
-       do_it   lt, t
+       do_it   lt, tt
        movlt   xxl, #0
        movlt   xxh, #0x80000000
-       do_it   gt, t
-       movgt   xxh, #0x7fffffff
-       movgt   xxl, #0xffffffff
+       blt     1f
+       do_it   eq
+       cmpeq   xxl, #0
+       do_it   ne, t
+       movne   xxh, #0x7fffffff
+       movne   xxl, #0xffffffff
        .endif
+1:     
        b       SYM (__aeabi_ldiv0) __PLT__
-1:
+2:
 #else
        /* Note: Thumb-1 code calls via an ARM shim on processors which
           support ARM mode.  */
@@ -107,16 +110,19 @@ ARM_FUNC_START aeabi_ulcmp
        cmpeq   yyl, #0
        bne     2f
        cmp     xxh, #0
-       cmpeq   xxl, #0
        .ifc \signed, unsigned
+       cmpeq   xxl, #0
        movne   xxh, #0xffffffff
        movne   xxl, #0xffffffff
        .else
        movlt   xxh, #0x80000000
        movlt   xxl, #0
-       movgt   xxh, #0x7fffffff
-       movgt   xxl, #0xffffffff
+       blt     1f
+       cmpeq   xxl, #0
+       movne   xxh, #0x7fffffff
+       movne   xxl, #0xffffffff
        .endif
+1:
        b       SYM (__aeabi_ldiv0) __PLT__
 2:
 #endif