From 294689c43b0989478659a616ab6a92d85156976c Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Fri, 15 Jul 2011 09:43:05 +0000 Subject: weak-call.c: New test. * gcc.target/tic6x/weak-call.c: New test. * gcc.target/tic6x/fpcmp.c: New test. * gcc.target/tic6x/fpdiv.c: New test. * gcc.target/tic6x/rotdi16-scan.c: New test. * gcc.target/tic6x/ffssi.c: New test. * gcc.target/tic6x/fpdiv-lib.c: New test. * gcc.target/tic6x/cold-lc.c: New test. * gcc.target/tic6x/longcalls.c: New test. * gcc.target/tic6x/abi-align-1.c: New test. * gcc.target/tic6x/fpcmp-finite.c: New test. * gcc.target/tic6x/rotdi16.c: New test. * gcc.target/tic6x/bswapl.c: New test. * gcc.target/tic6x/ffsdi.c: New test. * gcc.target/tic6x/tic6x.exp: New file. * gcc/testsuite/gcc.target/tic6x/builtins/arith24.c: New test. * gcc/testsuite/gcc.target/tic6x/builtins/smpy.c: New test. * gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c: New test. * gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c: New test. * gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c: New test. * gcc/testsuite/gcc.target/tic6x/builtins/extclr.c: New test * gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp: New file. * gcc.target/tic6x/builtin-math-7.c: New test, adapted from gcc.dg. * lib/target-supports.exp (chck_profiling_available): Not on tic6x. (check_effective_target_ti_c67x, check_effective_target_ti_c64xp): New functions. * gcc.c-torture/execute/20101011-1.c: Add a condition for __TMS320C6X__. * gcc.dg/20020312-2.c: Likewise. * gcc.dg/pr27095.c: Handle tic6x like hppa. * gcc.dg/torture/pr37868.c: Skip on tic6x. * gcc.dg/torture/builtin-math-7.c: Likewise. From-SVN: r176310 --- gcc/testsuite/ChangeLog | 34 ++++++++ gcc/testsuite/gcc.c-torture/execute/20101011-1.c | 3 + gcc/testsuite/gcc.dg/20020312-2.c | 2 + gcc/testsuite/gcc.dg/pr27095.c | 5 +- gcc/testsuite/gcc.dg/torture/builtin-math-7.c | 1 + gcc/testsuite/gcc.dg/torture/pr37868.c | 2 +- gcc/testsuite/gcc.target/tic6x/abi-align-1.c | 19 +++++ gcc/testsuite/gcc.target/tic6x/bswapl.c | 13 +++ gcc/testsuite/gcc.target/tic6x/builtin-math-7.c | 94 ++++++++++++++++++++++ gcc/testsuite/gcc.target/tic6x/builtins/arith24.c | 83 +++++++++++++++++++ .../gcc.target/tic6x/builtins/c6x-builtins.exp | 25 ++++++ gcc/testsuite/gcc.target/tic6x/builtins/extclr.c | 36 +++++++++ gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c | 47 +++++++++++ gcc/testsuite/gcc.target/tic6x/builtins/smpy.c | 20 +++++ gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c | 19 +++++ gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c | 26 ++++++ gcc/testsuite/gcc.target/tic6x/cold-lc.c | 21 +++++ gcc/testsuite/gcc.target/tic6x/ffsdi.c | 19 +++++ gcc/testsuite/gcc.target/tic6x/ffssi.c | 18 +++++ gcc/testsuite/gcc.target/tic6x/fpcmp-finite.c | 24 ++++++ gcc/testsuite/gcc.target/tic6x/fpcmp.c | 24 ++++++ gcc/testsuite/gcc.target/tic6x/fpdiv-lib.c | 15 ++++ gcc/testsuite/gcc.target/tic6x/fpdiv.c | 15 ++++ gcc/testsuite/gcc.target/tic6x/longcalls.c | 27 +++++++ gcc/testsuite/gcc.target/tic6x/rotdi16-scan.c | 16 ++++ gcc/testsuite/gcc.target/tic6x/rotdi16.c | 14 ++++ gcc/testsuite/gcc.target/tic6x/tic6x.exp | 62 ++++++++++++++ gcc/testsuite/gcc.target/tic6x/weak-call.c | 17 ++++ gcc/testsuite/lib/target-supports.exp | 20 +++++ 29 files changed, 718 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.target/tic6x/abi-align-1.c create mode 100644 gcc/testsuite/gcc.target/tic6x/bswapl.c create mode 100644 gcc/testsuite/gcc.target/tic6x/builtin-math-7.c create mode 100644 gcc/testsuite/gcc.target/tic6x/builtins/arith24.c create mode 100644 gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp create mode 100644 gcc/testsuite/gcc.target/tic6x/builtins/extclr.c create mode 100644 gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c create mode 100644 gcc/testsuite/gcc.target/tic6x/builtins/smpy.c create mode 100644 gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c create mode 100644 gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c create mode 100644 gcc/testsuite/gcc.target/tic6x/cold-lc.c create mode 100644 gcc/testsuite/gcc.target/tic6x/ffsdi.c create mode 100644 gcc/testsuite/gcc.target/tic6x/ffssi.c create mode 100644 gcc/testsuite/gcc.target/tic6x/fpcmp-finite.c create mode 100644 gcc/testsuite/gcc.target/tic6x/fpcmp.c create mode 100644 gcc/testsuite/gcc.target/tic6x/fpdiv-lib.c create mode 100644 gcc/testsuite/gcc.target/tic6x/fpdiv.c create mode 100644 gcc/testsuite/gcc.target/tic6x/longcalls.c create mode 100644 gcc/testsuite/gcc.target/tic6x/rotdi16-scan.c create mode 100644 gcc/testsuite/gcc.target/tic6x/rotdi16.c create mode 100644 gcc/testsuite/gcc.target/tic6x/tic6x.exp create mode 100644 gcc/testsuite/gcc.target/tic6x/weak-call.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3dfa812..10d7e56 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,37 @@ +2011-07-15 Bernd Schmidt + + * gcc.target/tic6x/weak-call.c: New test. + * gcc.target/tic6x/fpcmp.c: New test. + * gcc.target/tic6x/fpdiv.c: New test. + * gcc.target/tic6x/rotdi16-scan.c: New test. + * gcc.target/tic6x/ffssi.c: New test. + * gcc.target/tic6x/fpdiv-lib.c: New test. + * gcc.target/tic6x/cold-lc.c: New test. + * gcc.target/tic6x/longcalls.c: New test. + * gcc.target/tic6x/abi-align-1.c: New test. + * gcc.target/tic6x/fpcmp-finite.c: New test. + * gcc.target/tic6x/rotdi16.c: New test. + * gcc.target/tic6x/bswapl.c: New test. + * gcc.target/tic6x/ffsdi.c: New test. + * gcc.target/tic6x/tic6x.exp: New file. + * gcc/testsuite/gcc.target/tic6x/builtins/arith24.c: New test. + * gcc/testsuite/gcc.target/tic6x/builtins/smpy.c: New test. + * gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c: New test. + * gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c: New test. + * gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c: New test. + * gcc/testsuite/gcc.target/tic6x/builtins/extclr.c: New test + * gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp: New file. + * gcc.target/tic6x/builtin-math-7.c: New test, adapted from gcc.dg. + * lib/target-supports.exp (chck_profiling_available): Not on tic6x. + (check_effective_target_ti_c67x, check_effective_target_ti_c64xp): + New functions. + * gcc.c-torture/execute/20101011-1.c: Add a condition for + __TMS320C6X__. + * gcc.dg/20020312-2.c: Likewise. + * gcc.dg/pr27095.c: Handle tic6x like hppa. + * gcc.dg/torture/pr37868.c: Skip on tic6x. + * gcc.dg/torture/builtin-math-7.c: Likewise. + 2011-07-14 Andrew Pinski PR tree-opt/49309 diff --git a/gcc/testsuite/gcc.c-torture/execute/20101011-1.c b/gcc/testsuite/gcc.c-torture/execute/20101011-1.c index 7180e68..f3247c2 100644 --- a/gcc/testsuite/gcc.c-torture/execute/20101011-1.c +++ b/gcc/testsuite/gcc.c-torture/execute/20101011-1.c @@ -12,6 +12,9 @@ #elif defined (__sh__) /* On SH division by zero does not trap. */ # define DO_TEST 0 +#elif defined (__TMS320C6X__) + /* On TI C6X division by zero does not trap. */ +# define DO_TEST 0 #elif defined (__mips__) && !defined(__linux__) /* MIPS divisions do trap by default, but libgloss targets do not intercept the trap and raise a SIGFPE. The same is probably diff --git a/gcc/testsuite/gcc.dg/20020312-2.c b/gcc/testsuite/gcc.dg/20020312-2.c index 0689636..0b3178f 100644 --- a/gcc/testsuite/gcc.dg/20020312-2.c +++ b/gcc/testsuite/gcc.dg/20020312-2.c @@ -64,6 +64,8 @@ extern void abort (void); # define PIC_REG "12" #elif defined(__sparc__) # define PIC_REG "l7" +#elif defined(__TMS320C6X__) +# define PIC_REG "B14" #elif defined(__v850) /* No pic register. */ #elif defined(__vax__) diff --git a/gcc/testsuite/gcc.dg/pr27095.c b/gcc/testsuite/gcc.dg/pr27095.c index 8e72771..b88d390 100644 --- a/gcc/testsuite/gcc.dg/pr27095.c +++ b/gcc/testsuite/gcc.dg/pr27095.c @@ -16,10 +16,11 @@ main (int argc, char **argv) memset (x, argc, strlen (x)); return 0; } -/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen" { target { ! { powerpc*-*-darwin* hppa*-*-hpux* ia64-*-hpux* alpha*-*-* spu-*-* } } } } } */ +/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen" { target { ! { powerpc*-*-darwin* hppa*-*-hpux* ia64-*-hpux* alpha*-*-* spu-*-* tic6x-*-* } } } } } */ /* hppa*-*-hpux* has an IMPORT statement for strlen (plus the branch). */ /* *-*-darwin* has something similar. */ -/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target hppa*-*-hpux* } } } */ +/* tic6x emits a comment at the point where the delayed branch happens. */ +/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target hppa*-*-hpux* tic6x-*-* } } } */ /* { dg-final { scan-assembler-not "(?n)bl L_strlen\(.*\n\)+.*bl L_strlen" { target powerpc*-*-darwin* } } } */ /* ia64-*-hpux* has a global statement, a type statement, and the branch. */ /* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target ia64-*-hpux* } } } */ diff --git a/gcc/testsuite/gcc.dg/torture/builtin-math-7.c b/gcc/testsuite/gcc.dg/torture/builtin-math-7.c index 8fe89158..754d3f0 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-math-7.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-math-7.c @@ -5,6 +5,7 @@ Origin: Kaveh R. Ghazi, August 13, 2009. */ /* { dg-do run } */ +/* { dg-skip-if "" { tic6x-*-* } "*" "" } */ /* { dg-add-options ieee } */ /* { dg-require-effective-target large_double } */ diff --git a/gcc/testsuite/gcc.dg/torture/pr37868.c b/gcc/testsuite/gcc.dg/torture/pr37868.c index c5df71b..c1b7a2b 100644 --- a/gcc/testsuite/gcc.dg/torture/pr37868.c +++ b/gcc/testsuite/gcc.dg/torture/pr37868.c @@ -1,6 +1,6 @@ /* { dg-do run } */ /* { dg-options "-fno-strict-aliasing" } */ -/* { dg-skip-if "unaligned access" { sparc*-*-* sh*-*-* } "*" "" } */ +/* { dg-skip-if "unaligned access" { sparc*-*-* sh*-*-* tic6x-*-* } "*" "" } */ extern void abort (void); #if (__SIZEOF_INT__ <= 2) diff --git a/gcc/testsuite/gcc.target/tic6x/abi-align-1.c b/gcc/testsuite/gcc.target/tic6x/abi-align-1.c new file mode 100644 index 0000000..963c2f6 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/abi-align-1.c @@ -0,0 +1,19 @@ +/* { dg-do run } */ + +/* common */ +char c; +/* arrays must be 8 byte aligned, regardless of size */ +char c_ary[1]; + +/* data */ +char d = 1; +char d_ary[1] = {1}; + +int main () +{ + if (((unsigned long)&c_ary[0] & 7) != 0) + return 1; + if (((unsigned long)&d_ary[0] & 7) != 0) + return 1; + return 0; +} diff --git a/gcc/testsuite/gcc.target/tic6x/bswapl.c b/gcc/testsuite/gcc.target/tic6x/bswapl.c new file mode 100644 index 0000000..18d6bce --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/bswapl.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=c64x+" } */ +/* { dg-final { scan-assembler-not "call" } } */ + +int foo (int x) +{ + return __builtin_bswap32 (x); +} + +long long bar (long long x) +{ + return __builtin_bswap64 (x); +} diff --git a/gcc/testsuite/gcc.target/tic6x/builtin-math-7.c b/gcc/testsuite/gcc.target/tic6x/builtin-math-7.c new file mode 100644 index 0000000..a7deea3 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/builtin-math-7.c @@ -0,0 +1,94 @@ +/* Copyright (C) 2009 Free Software Foundation. + + Verify that folding of complex mul and div work correctly. + TI C6X specific version, reduced by two tests that fails due to the + use of implicit -freciprocal-math. + + Origin: Kaveh R. Ghazi, August 13, 2009. */ + +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-add-options ieee } */ + +extern void link_error(int); + +/* Evaluate this expression at compile-time. */ +#define COMPILETIME_TESTIT(TYPE,X,OP,Y,RES) do { \ + if ((_Complex TYPE)(X) OP (_Complex TYPE)(Y) != (_Complex TYPE)(RES)) \ + link_error(__LINE__); \ +} while (0) + +/* Use this error function for cases which only evaluate at + compile-time when optimizing. */ +#ifdef __OPTIMIZE__ +# define ERROR_FUNC(X) link_error(X) +#else +# define ERROR_FUNC(X) __builtin_abort() +#endif + +/* Evaluate this expression at compile-time using static initializers. */ +#define STATICINIT_TESTIT(TYPE,X,OP,Y,RES) do { \ + static const _Complex TYPE foo = (_Complex TYPE)(X) OP (_Complex TYPE)(Y); \ + if (foo != (_Complex TYPE)(RES)) \ + ERROR_FUNC (__LINE__); \ +} while (0) + +/* Evaluate this expression at runtime. */ +#define RUNTIME_TESTIT(TYPE,X,OP,Y,RES) do { \ + volatile _Complex TYPE foo; \ + foo = (_Complex TYPE)(X); \ + foo OP##= (_Complex TYPE)(Y); \ + if (foo != (_Complex TYPE)(RES)) \ + __builtin_abort(); \ +} while (0) + +/* Evaluate this expression at compile-time and runtime. */ +#define TESTIT(TYPE,X,OP,Y,RES) do { \ + STATICINIT_TESTIT(TYPE,X,OP,Y,RES); \ + COMPILETIME_TESTIT(TYPE,X,OP,Y,RES); \ + RUNTIME_TESTIT(TYPE,X,OP,Y,RES); \ +} while (0) + +/* Either the real or imaginary parts should be infinity. */ +#define TEST_ONE_PART_INF(VAL) do { \ + static const _Complex double foo = (VAL); \ + if (! __builtin_isinf(__real foo) && ! __builtin_isinf(__imag foo)) \ + ERROR_FUNC (__LINE__); \ + if (! __builtin_isinf(__real (VAL)) && ! __builtin_isinf(__imag (VAL))) \ + __builtin_abort(); \ +} while (0) + +int main() +{ + /* Test some regular finite values. */ + TESTIT (double, 3.+4.i, *, 2, 6+8i); + TESTIT (double, 3.+4.i, /, 2, 1.5+2i); + TESTIT (int, 3+4i, *, 2, 6+8i); + TESTIT (int, 3+4i, /, 2, 1+2i); + + TESTIT (double, 3.+4.i, *, 2+5i, -14+23i); + TESTIT (int, 3+4i, *, 2+5i, -14+23i); + TESTIT (int, 30+40i, /, 5i, 8-6i); + TESTIT (int, 14+6i, /, 7+3i, 2); + TESTIT (int, 8+24i, /, 4+12i, 2); + + /* Test for accuracy. */ + COMPILETIME_TESTIT (double, + (1 + __DBL_EPSILON__ + 1i), + *, + (1 - __DBL_EPSILON__ + 1i), + -4.93038065763132378382330353301741393545754021943139377981e-32+2i); + + /* This becomes (NaN + iInf). */ +#define VAL1 ((_Complex double)__builtin_inf() * 1i) + + /* Test some C99 Annex G special cases. */ + TEST_ONE_PART_INF ((VAL1) * (VAL1)); + TEST_ONE_PART_INF ((_Complex double)1 / (_Complex double)0); + TEST_ONE_PART_INF ((VAL1) / (_Complex double)1); + + RUNTIME_TESTIT (double, 1, /, VAL1, 0); + STATICINIT_TESTIT (double, 1, /, VAL1, 0); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/tic6x/builtins/arith24.c b/gcc/testsuite/gcc.target/tic6x/builtins/arith24.c new file mode 100644 index 0000000..5e52284 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/builtins/arith24.c @@ -0,0 +1,83 @@ +/* { dg-require-effective-target ti_c64xp } */ + +#include + +extern void abort (void); + +typedef short __v2hi __attribute ((vector_size(4))); + +int a = 0x5000d000; +int b = 0xc0002000; +int c = 0x40009000; +int d = 0x80000001; +int e = 0x50002001; +int f = 0xc0008000; + +int a4 = 0x50d03080; +int b4 = 0xc020f080; +int c4 = 0xc0202080; +int d4 = 0x50003080; +int e4 = 0xc0202180; + +int main () +{ + int v; + long long vll; + + v = _add2 (a, b); + if (v != 0x1000f000) + abort (); + v = _sub2 (a, b); + if (v != 0x9000b000) + abort (); + v = _sub2 (b, a); + if (v != 0x70005000) + abort (); + + v = _add4 (a4, b4); + if (v != 0x10f02000) + abort (); + v = _sub4 (a4, b4); + if (v != 0x90b04000) + abort (); + v = _saddu4 (a4, c4); + if (v != 0xfff050ff) + abort (); + + v = _sadd2 (a, b); + if (v != 0x1000f000) + abort (); + v = _sadd2 (a, c); + if (v != 0x7fff8000) + abort (); + + v = _ssub2 (a, b); + if (v != 0x7fffb000) + abort (); + v = _ssub2 (b, a); + if (v != 0x80005000) + abort (); + + vll = _smpy2ll (a, b); + if (vll != 0xd8000000f4000000ll) + abort (); + vll = _smpy2ll (d, d); + if (vll != 0x7fffffff00000002ll) + abort (); + + v = _avg2 (b, e); + if (v != 0x08002001) + abort (); + v = _avgu4 (d4, e4); + if (v != 0x88102980) + abort (); + + v = _abs2 (a); + if (v != 0x50003000) + abort (); + v = _abs2 (f); + if (v != 0x40007fff) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp b/gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp new file mode 100644 index 0000000..123dfde --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp @@ -0,0 +1,25 @@ +# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# . + +# GCC testsuite that uses the `c-torture.exp' driver, looping over +# optimization options. + +load_lib gcc-dg.exp + +dg-init +gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] "" +dg-finish + diff --git a/gcc/testsuite/gcc.target/tic6x/builtins/extclr.c b/gcc/testsuite/gcc.target/tic6x/builtins/extclr.c new file mode 100644 index 0000000..e8e2139 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/builtins/extclr.c @@ -0,0 +1,36 @@ +#include + +extern void abort (void); + +#define N 4 + +int vals[N] = { 0, 0xffffffff, 0x89abcdef, 0xdeadbeef }; + +int main () +{ + int i; + for (i = 0; i < N; i++) + { + int shf1, shf2; + int v = vals[i]; + unsigned int uv = v; + + for (shf1 = 0; shf1 < 32; shf1++) + for (shf2 = 0; shf2 < 32; shf2++) + { + int r = (shf1 << 5) | shf2; + if (shf2 > shf1) + { + unsigned int mask = (1u << (shf2 - shf1) << 1) - 1; + mask <<= shf1; + if (_clrr (v, r) != (v & ~mask)) + abort (); + } + if (_extr (v, r) != v << shf1 >> shf2) + abort (); + if (_extru (v, r) != uv << shf1 >> shf2) + abort (); + } + } + return 0; +} diff --git a/gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c b/gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c new file mode 100644 index 0000000..4ea3570 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c @@ -0,0 +1,47 @@ +#include + +extern void abort (void); + +int a1 = 0x50000000; +int b1 = 0xc0000000; +int c1 = 0x40000000; +int a2 = 0xd0000000; +int b2 = 0x20000000; +int c2 = 0x90000000; +int d = 0x80000000; + +int main () +{ + if (_sadd (a1, b1) != 0x10000000) + abort (); + if (_sadd (a2, b2) != 0xf0000000) + abort (); + if (_sadd (a1, c1) != 0x7fffffff) + abort (); + if (_sadd (a2, c2) != 0x80000000) + abort (); + + if (_ssub (a1, b1) != 0x7fffffff) + abort (); + if (_ssub (a2, b2) != 0xb0000000) + abort (); + if (_ssub (b1, a1) != 0x80000000) + abort (); + if (_ssub (b2, a2) != 0x50000000) + abort (); + + if (_abs (a1) != 0x50000000) + abort (); + if (_abs (b1) != 0x40000000) + abort (); + if (_abs (d) != 0x7fffffff) + abort (); + + if (_sshl (a1, 1) != 0x7fffffff + || _sshl (b2, 1) != 0x40000000 + || _sshl (a2, 1) != 0xa0000000 + || _sshl (a2, 4) != 0x80000000) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/tic6x/builtins/smpy.c b/gcc/testsuite/gcc.target/tic6x/builtins/smpy.c new file mode 100644 index 0000000..15a9930 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/builtins/smpy.c @@ -0,0 +1,20 @@ +#include + +extern void abort (void); + +int a1 = 0x5000; +int b1 = 0xc000; +int a2 = 0xd000; +int b2 = 0x2000; +int c = 0x8000; +int main () +{ + if (_smpy (a1, b1) != 0xd8000000) + abort (); + if (_smpy (a2, b2) != 0xf4000000) + abort (); + if (_smpy (c, c) != 0x7fffffff) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c b/gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c new file mode 100644 index 0000000..c8864da --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c @@ -0,0 +1,19 @@ +#include +extern void abort (void); + +int a1 = 0x50000000; +int b1 = 0xc0000000; +int a2 = 0xd0000000; +int b2 = 0x20000000; +int c = 0x80000000; +int main () +{ + if (_smpyh (a1, b1) != 0xd8000000) + abort (); + if (_smpyh (a2, b2) != 0xf4000000) + abort (); + if (_smpyh (c, c) != 0x7fffffff) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c b/gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c new file mode 100644 index 0000000..92a5043 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c @@ -0,0 +1,26 @@ +#include + +extern void abort (void); + +int a1 = 0x5000; +int b1 = 0xc0000000; +int a2 = 0xd000; +int b2 = 0x20000000; +int c = 0x8000; +int main () +{ + if (_smpylh (a1, b1) != 0xd8000000) + abort (); + if (_smpylh (a2, b2) != 0xf4000000) + abort (); + if (_smpylh (c, 0x80000000) != 0x7fffffff) + abort (); + if (_smpyhl (b1, a1) != 0xd8000000) + abort (); + if (_smpyhl (b2, a2) != 0xf4000000) + abort (); + if (_smpyhl (0x80000000, c) != 0x7fffffff) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/tic6x/cold-lc.c b/gcc/testsuite/gcc.target/tic6x/cold-lc.c new file mode 100644 index 0000000..6793f36 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/cold-lc.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mlong-calls" } */ + +extern void dump_stack (void) __attribute__ ((__cold__)); +struct thread_info { + struct task_struct *task; +}; +extern struct thread_info *current_thread_info (void); + +void dump_stack (void) +{ + unsigned long stack; + show_stack ((current_thread_info ()->task), &stack); +} + +void die (char *str, void *fp, int nr) +{ + dump_stack (); + while (1); +} + diff --git a/gcc/testsuite/gcc.target/tic6x/ffsdi.c b/gcc/testsuite/gcc.target/tic6x/ffsdi.c new file mode 100644 index 0000000..6f61be5 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/ffsdi.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target ti_c64xp } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-not "call" } } */ + +long long foo (long long x) +{ + return __builtin_ffsll (x); +} + +long long bar (long long x) +{ + return __builtin_clzll (x); +} + +long long baz (long long x) +{ + return __builtin_ctzll (x); +} diff --git a/gcc/testsuite/gcc.target/tic6x/ffssi.c b/gcc/testsuite/gcc.target/tic6x/ffssi.c new file mode 100644 index 0000000..bb83512 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/ffssi.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=c64x+" } */ +/* { dg-final { scan-assembler-not "call" } } */ + +int foo (int x) +{ + return __builtin_ffsl (x); +} + +int bar (int x) +{ + return __builtin_clzl (x); +} + +int baz (int x) +{ + return __builtin_ctzl (x); +} diff --git a/gcc/testsuite/gcc.target/tic6x/fpcmp-finite.c b/gcc/testsuite/gcc.target/tic6x/fpcmp-finite.c new file mode 100644 index 0000000..d7f3016 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/fpcmp-finite.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target ti_c67x } */ +/* { dg-options "-O2 -ffinite-math-only" } */ +/* { dg-final { scan-assembler-not "cmpeq" } } */ + +double gedf (double x, double y) +{ + return x >= y; +} + +double ledf (double x, double y) +{ + return x <= y; +} + +float gesf (float x, float y) +{ + return x >= y; +} + +float lesf (float x, float y) +{ + return x <= y; +} diff --git a/gcc/testsuite/gcc.target/tic6x/fpcmp.c b/gcc/testsuite/gcc.target/tic6x/fpcmp.c new file mode 100644 index 0000000..25eaff4 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/fpcmp.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target ti_c67x } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-times "cmpeq.p" 4 } } */ + +double gedf (double x, double y) +{ + return x >= y; +} + +double ledf (double x, double y) +{ + return x <= y; +} + +float gesf (float x, float y) +{ + return x >= y; +} + +float lesf (float x, float y) +{ + return x <= y; +} diff --git a/gcc/testsuite/gcc.target/tic6x/fpdiv-lib.c b/gcc/testsuite/gcc.target/tic6x/fpdiv-lib.c new file mode 100644 index 0000000..b138865 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/fpdiv-lib.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target ti_c67x } */ +/* { dg-options "-O2 -fno-reciprocal-math" } */ +/* { dg-final { scan-assembler-not "rcpdp" } } */ +/* { dg-final { scan-assembler-not "rcpsp" } } */ + +double f (double x, double y) +{ + return x / y; +} + +float g (float x, float y) +{ + return x / y; +} diff --git a/gcc/testsuite/gcc.target/tic6x/fpdiv.c b/gcc/testsuite/gcc.target/tic6x/fpdiv.c new file mode 100644 index 0000000..e547fb4 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/fpdiv.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target ti_c67x } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler "rcpdp" } } */ +/* { dg-final { scan-assembler "rcpsp" } } */ + +double f (double x, double y) +{ + return x / y; +} + +float g (float x, float y) +{ + return x / y; +} diff --git a/gcc/testsuite/gcc.target/tic6x/longcalls.c b/gcc/testsuite/gcc.target/tic6x/longcalls.c new file mode 100644 index 0000000..273433c --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/longcalls.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mlong-calls" } */ +/* { dg-final { scan-assembler-times "\\tcall\[p\]*\[\\t ]*.s" 3 } } */ +/* { dg-final { scan-assembler "call\[p\]*\[\\t ]*.s.\[\\t ]*.f" } } */ +/* { dg-final { scan-assembler-not "call\[p\]*\[\\t ]*.s.\[\\t ]*.g" } } */ +/* { dg-final { scan-assembler-not "call\[p\]*\[\\t ]*.s.\[\\t ]*.h" } } */ + +int x; + +static __attribute__ ((noinline)) void f () +{ + x = 5; +} + +extern void g (); + +static __attribute__ ((noinline)) __attribute__((section(".init.text"))) void h () +{ + x = 5; +} + +int bar () +{ + f (); + g (); + h (); +} diff --git a/gcc/testsuite/gcc.target/tic6x/rotdi16-scan.c b/gcc/testsuite/gcc.target/tic6x/rotdi16-scan.c new file mode 100644 index 0000000..4d7816c --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/rotdi16-scan.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target ti_c64xp } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler "dpackx" } } */ + +#include + +unsigned long long z = 0x012389ab4567cdefull; + +int main () +{ + unsigned long long z2 = (z << 48) | (z >> 16); + if (z2 != 0xcdef012389ab4567ull) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.target/tic6x/rotdi16.c b/gcc/testsuite/gcc.target/tic6x/rotdi16.c new file mode 100644 index 0000000..33b052a --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/rotdi16.c @@ -0,0 +1,14 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include + +unsigned long long z = 0x012389ab4567cdefull; + +int main () +{ + unsigned long long z2 = (z << 48) | (z >> 16); + if (z2 != 0xcdef012389ab4567ull) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.target/tic6x/tic6x.exp b/gcc/testsuite/gcc.target/tic6x/tic6x.exp new file mode 100644 index 0000000..f9d1c7a --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/tic6x.exp @@ -0,0 +1,62 @@ +# Copyright (C) 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# . + +# GCC testsuite that uses the `dg.exp' driver. + +if ![istarget tic6x-*-*] then { + return +} + +# Load support procs. +load_lib gcc-dg.exp + +# Like dg-options, but treats certain C6X-specific options specially: +# +# -march=* +# Select the target architecture. Skip the test if the multilib +# flags force a different arch. +proc dg-c6x-options {args} { + upvar dg-extra-tool-flags extra_tool_flags + upvar dg-do-what do_what + + set multilib_arch "" + set arch "" + + foreach flag [target_info multilib_flags] { + regexp "^-march=(.*)" $flag dummy multilib_arch + } + + set flags [lindex $args 1] + + foreach flag $flags { + regexp "^-march=(.*)" $flag dummy arch + } + + if {$multilib_arch == "" || $multilib_cpu == $arch} { + set extra_tool_flags $flags + } else { + set do_what [list [lindex $do_what 0] "N" "P"] + } +} + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] "" "" + +# All done. +dg-finish diff --git a/gcc/testsuite/gcc.target/tic6x/weak-call.c b/gcc/testsuite/gcc.target/tic6x/weak-call.c new file mode 100644 index 0000000..9be9304 --- /dev/null +++ b/gcc/testsuite/gcc.target/tic6x/weak-call.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-not "call\[\\t ]*.s.\[\\t ]*.f" } } */ +/* { dg-final { scan-assembler-not "call\[\\t ]*.s.\[\\t ]*.g" } } */ + +extern void f () __attribute__ ((weak)); +extern void g () __attribute__ ((weak)) __attribute__ ((noinline)); + +void g () +{ +} + +int main () +{ + f (); + g (); +} diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index e981608..2131185 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -568,6 +568,7 @@ proc check_profiling_available { test_what } { || [istarget powerpc-*-eabi*] || [istarget powerpc-*-elf] || [istarget rx-*-*] + || [istarget tic6x-*-elf] || [istarget xstormy16-*] || [istarget xtensa*-*-elf] || [istarget *-*-netware*] @@ -1398,6 +1399,25 @@ proc check_effective_target_broken_cplxf_arg { } { }] } +# Return 1 is this is a TI C6X target supporting C67X instructions +proc check_effective_target_ti_c67x { } { + return [check_no_compiler_messages ti_c67x assembly { + #if !defined(_TMS320C6700) + #error FOO + #endif + }] +} + +# Return 1 is this is a TI C6X target supporting C64X+ instructions +proc check_effective_target_ti_c64xp { } { + return [check_no_compiler_messages ti_c64xp assembly { + #if !defined(_TMS320C6400_PLUS) + #error FOO + #endif + }] +} + + proc check_alpha_max_hw_available { } { return [check_runtime alpha_max_hw_available { int main() { return __builtin_alpha_amask(1<<8) != 0; } -- cgit v1.1