mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-12 17:37:08 +08:00
bpabi.S (test_div_by_zero): Make label names consistent between thumb2 and arm mode cases.
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
This commit is contained in:
parent
77d10a1b20
commit
53cfb467cf
@ -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.
|
||||
|
85
gcc/testsuite/gcc.target/arm/divzero.c
Normal file
85
gcc/testsuite/gcc.target/arm/divzero.c
Normal file
@ -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;
|
||||
}
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user