diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-17 05:30:37 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-17 05:30:37 +0000 |
commit | 51d619308377f16a8ff13df95becfe2282198844 (patch) | |
tree | 21b147aea83b41c5c37fba84ea32c18f1c7de253 /gcc/testsuite/c-c++-common | |
parent | 9b39d7e80300d4a7fc3399d0896881027479b72a (diff) | |
download | gcc-51d619308377f16a8ff13df95becfe2282198844.tar.gz |
2012-09-17 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 191371 using svnmerge.
[gcc/]
2012-09-17 Basile Starynkevitch <basile@starynkevitch.net>
{{when merging trunk svn rev 191371}}
* melt-runtime.c (melt_load_module_index): Push an empty slot, not
a null pointer, into melt_modinfvec.
(meltgc_run_c_extension): Push an empty slot, not
a null pointer, into melt_extinfvec.
(melt_really_initialize): Better indentation, and increase maximal
minore size to 32768Kwords. Push an empty slot, not a null
pointer, into melt_modinfvec.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@191373 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/c-c++-common')
-rw-r--r-- | gcc/testsuite/c-c++-common/pr51712.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/torture/vector-compare-1.c | 124 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/torture/vector-compare-2.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/torture/vector-shift.c | 49 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/torture/vector-shift2.c | 60 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/torture/vector-subscript-1.c | 60 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/torture/vector-subscript-2.c | 68 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/torture/vector-subscript-3.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/vector-compare-1.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/vector-compare-2.c | 28 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/vector-compare-3.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/vector-shift.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/vector-shift1.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/vector-shift3.c | 16 |
14 files changed, 540 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/pr51712.c b/gcc/testsuite/c-c++-common/pr51712.c index 4d9eba33afe..69e316d2452 100644 --- a/gcc/testsuite/c-c++-common/pr51712.c +++ b/gcc/testsuite/c-c++-common/pr51712.c @@ -1,6 +1,7 @@ /* PR c/51712 */ /* { dg-do compile } */ /* { dg-options "-Wtype-limits" } */ +/* { dg-additional-options "-fno-short-enums" { target short_enums } } */ enum test_enum { FOO, diff --git a/gcc/testsuite/c-c++-common/torture/vector-compare-1.c b/gcc/testsuite/c-c++-common/torture/vector-compare-1.c new file mode 100644 index 00000000000..4cdfcf718c1 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vector-compare-1.c @@ -0,0 +1,124 @@ +/* { dg-do run } */ +#define vector(elcount, type) \ +__attribute__((vector_size((elcount)*sizeof(type)))) type + +#define check_compare(count, res, i0, i1, op, fmt) \ +do { \ + int __i; \ + for (__i = 0; __i < count; __i ++) { \ + if ((res)[__i] != ((i0)[__i] op (i1)[__i] ? -1 : 0)) \ + { \ + __builtin_printf ("%i != ((" fmt " " #op " " fmt " ? -1 : 0) ", \ + (res)[__i], (i0)[__i], (i1)[__i]); \ + __builtin_abort (); \ + } \ + } \ +} while (0) + +#define test(count, v0, v1, res, fmt); \ +do { \ + res = (v0 > v1); \ + check_compare (count, res, v0, v1, >, fmt); \ + res = (v0 < v1); \ + check_compare (count, res, v0, v1, <, fmt); \ + res = (v0 >= v1); \ + check_compare (count, res, v0, v1, >=, fmt); \ + res = (v0 <= v1); \ + check_compare (count, res, v0, v1, <=, fmt); \ + res = (v0 == v1); \ + check_compare (count, res, v0, v1, ==, fmt); \ + res = (v0 != v1); \ + check_compare (count, res, v0, v1, !=, fmt); \ +} while (0) + + +int main (int argc, char *argv[]) { +#define INT int + vector (4, INT) i0; + vector (4, INT) i1; + vector (4, int) ires; + int i; + + i0 = (vector (4, INT)){(INT)argc, 1, 2, 10}; + i1 = (vector (4, INT)){0, 3, 2, (INT)-23}; + test (4, i0, i1, ires, "%i"); +#undef INT + +#define INT unsigned int + vector (4, int) ures; + vector (4, INT) u0; + vector (4, INT) u1; + + u0 = (vector (4, INT)){(INT)argc, 1, 2, 10}; + u1 = (vector (4, INT)){0, 3, 2, (INT)-23}; + test (4, u0, u1, ures, "%u"); +#undef INT + + +#define SHORT short + vector (8, SHORT) s0; + vector (8, SHORT) s1; + vector (8, short) sres; + + s0 = (vector (8, SHORT)){(SHORT)argc, 1, 2, 10, 6, 87, (SHORT)-5, 2}; + s1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0}; + test (8, s0, s1, sres, "%i"); +#undef SHORT + +#define SHORT unsigned short + vector (8, SHORT) us0; + vector (8, SHORT) us1; + vector (8, short) usres; + + us0 = (vector (8, SHORT)){(SHORT)argc, 1, 2, 10, 6, 87, (SHORT)-5, 2}; + us1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0}; + test (8, us0, us1, usres, "%u"); +#undef SHORT + +#define CHAR signed char + vector (16, CHAR) c0; + vector (16, CHAR) c1; + vector (16, signed char) cres; + + c0 = (vector (16, CHAR)){(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \ + (CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 }; + + c1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \ + 0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0}; + test (16, c0, c1, cres, "%i"); +#undef CHAR + +#define CHAR unsigned char + vector (16, CHAR) uc0; + vector (16, CHAR) uc1; + vector (16, signed char) ucres; + + uc0 = (vector (16, CHAR)){(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \ + (CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 }; + + uc1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \ + 0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0}; + test (16, uc0, uc1, ucres, "%u"); +#undef CHAR +/* Float comparison. */ + vector (4, float) f0; + vector (4, float) f1; + __typeof (f0 == f1) ifres; + + f0 = (vector (4, float)){(float)argc, 1., 2., 10.}; + f1 = (vector (4, float)){0., 3., 2., (float)-23}; + test (4, f0, f1, ifres, "%f"); + +/* Double comparison. */ + vector (2, double) d0; + vector (2, double) d1; + __typeof (d0 == d1) idres; + + d0 = (vector (2, double)){(double)argc, 10.}; + d1 = (vector (2, double)){0., (double)-23}; + test (2, d0, d1, idres, "%f"); + + + return 0; +} + diff --git a/gcc/testsuite/c-c++-common/torture/vector-compare-2.c b/gcc/testsuite/c-c++-common/torture/vector-compare-2.c new file mode 100644 index 00000000000..45453e6b98d --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vector-compare-2.c @@ -0,0 +1,29 @@ +/* { dg-do run } */ +/* { dg-options "-Wno-psabi" } */ +#define vector(elcount, type) \ +__attribute__((vector_size((elcount)*sizeof(type)))) type + +/* Check that constant folding in + these simple cases works. */ +vector (4, int) +foo (vector (4, int) x) +{ + return (x == x) + (x != x) + (x > x) + + (x < x) + (x >= x) + (x <= x); +} + +int +main (int argc, char *argv[]) +{ + vector (4, int) t = {argc, 2, argc, 42}; + vector (4, int) r; + int i; + + r = foo (t); + + for (i = 0; i < 4; i++) + if (r[i] != -3) + __builtin_abort (); + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/torture/vector-shift.c b/gcc/testsuite/c-c++-common/torture/vector-shift.c new file mode 100644 index 00000000000..f690b7c3d6e --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vector-shift.c @@ -0,0 +1,49 @@ +/* { dg-do run } */ + +#define vector __attribute__((vector_size(sizeof(int)*4) )) + +static vector int allones = {1, 1, 1, 1}; +static vector int allzeros = {0, 0, 0, 0}; +static vector int numbers = {0, 1, 2, 3}; +static vector int numbersleftshiftallones = {0, 2, 4, 6}; +static vector int numbersrightshiftallones = {0, 0, 1, 1}; + + +static vector unsigned int uallones = {1, 1, 1, 1}; +static vector unsigned int uallzeros = {0, 0, 0, 0}; +static vector unsigned int unumbers = {0, 1, 2, 3}; +static vector unsigned int unumbersleftshiftallones = {0, 2, 4, 6}; +static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1}; + +#define TEST(result, expected) \ +do { \ + __typeof__(result) result1 = result; \ + if(sizeof (result1) != sizeof (expected)) \ + __builtin_abort (); \ + if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \ + __builtin_abort (); \ +}while (0); + +int main(void) +{ + vector int result; + TEST ((numbers << allzeros), numbers); + TEST ((numbers >> allzeros), numbers); + TEST((numbers << allones), numbersleftshiftallones); + TEST((numbers >> allones), numbersrightshiftallones); + /* Test left shift followed by a right shift, numbers should be back as + numbers are all small numbers and no lose of precision happens. */ + TEST((numbers << allones) >> allones, numbers); + + + + TEST ((unumbers << uallzeros), unumbers); + TEST ((unumbers >> uallzeros), unumbers); + TEST((unumbers << uallones), unumbersleftshiftallones); + TEST((unumbers >> uallones), unumbersrightshiftallones); + /* Test left shift followed by a right shift, numbers should be back as + numbers are all small numbers and no lose of precision happens. */ + TEST((unumbers << uallones) >> uallones, unumbers); + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/torture/vector-shift2.c b/gcc/testsuite/c-c++-common/torture/vector-shift2.c new file mode 100644 index 00000000000..d3a2ef87cd5 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vector-shift2.c @@ -0,0 +1,60 @@ +/* { dg-do run } */ +#define vector(elcount, type) \ +__attribute__((vector_size((elcount)*sizeof(type)))) type + +#define vidx(type, vec, idx) (*((type *) &(vec) + idx)) +#define uint unsigned int + +int main (int argc, char *argv[]) { + vector(4, uint) vuint = { 1, 2, 3, 4}; + vector(4, int) vint0 = { 1, 1, 1, 1}; + vector(4, int) vint1 = {-1, -1, -1, -1}; + + vector(4, int) i1, i2, i3; + vector(4, uint) u1, u2, u3; + + i1 = vint1<< vint0; + + if (vidx(int, i1, 0) != ((int)-1 << (int)1)) + __builtin_abort (); + if (vidx(int, i1, 1) != ((int)-1 << (int)1)) + __builtin_abort (); + if (vidx(int, i1, 2) != ((int)-1 << (int)1)) + __builtin_abort (); + if (vidx(int, i1, 3) != ((int)-1 << (int)1)) + __builtin_abort (); + + u1 = vuint << vint0; + + if (vidx(int, u1, 0) != ((uint)1 << (int)1)) + __builtin_abort (); + if (vidx(int, u1, 1) != ((uint)2 << (int)1)) + __builtin_abort (); + if (vidx(int, u1, 2) != ((uint)3 << (int)1)) + __builtin_abort (); + if (vidx(int, u1, 3) != ((uint)4 << (int)1)) + __builtin_abort (); + + + i2 = vint1 >> vuint; + + if (vidx(int, i2, 0) != ((int)-1 >> (uint)1)) + __builtin_abort (); + if (vidx(int, i2, 1) != ((int)-1 >> (uint)2)) + __builtin_abort (); + if (vidx(int, i2, 2) != ((int)-1 >> (uint)3)) + __builtin_abort (); + if (vidx(int, i2, 3) != ((int)-1 >> (uint)4)) + __builtin_abort (); + + + vint1 >>= vuint; + + vuint <<= vint0; + vuint <<= vint1; + + + return 0; +} + + diff --git a/gcc/testsuite/c-c++-common/torture/vector-subscript-1.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-1.c new file mode 100644 index 00000000000..bb1350ebedc --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-1.c @@ -0,0 +1,60 @@ +/* { dg-do run } */ +#define vector __attribute__((vector_size(sizeof(int)*4) )) + +/* Check to make sure that we extract and insert the vector at the same + location for vector subscripting and that vectors layout are the same + as arrays. */ + +struct TV4 +{ + vector int v; +}; + +typedef struct TV4 MYV4; +static inline int *f(MYV4 *a, int i) +{ + return &(a->v[i]); +} + +static inline MYV4 myfunc2( int x, int y, int z, int w ) +{ + MYV4 temp; + *f(&temp, 0 ) = x; + *f(&temp, 1 ) = y; + *f(&temp, 2 ) = z; + *f(&temp, 3 ) = w; + return temp; +} + +MYV4 val3; + +__attribute__((noinline)) void modify (void) +{ + val3 = myfunc2( 1, 2, 3, 4 ); +} + +int main( int argc, char* argv[] ) +{ + int a[4]; + int i; + + modify(); + + if (*f(&val3, 0 ) != 1) + __builtin_abort (); + if (*f(&val3, 1 ) != 2) + __builtin_abort (); + if (*f(&val3, 2 ) != 3) + __builtin_abort (); + if (*f(&val3, 3 ) != 4) + __builtin_abort (); + + __builtin_memcpy (a, &val3, sizeof(a)); + for(i = 0; i < 4; i++) + if (a[i] != i+1) + __builtin_abort (); + + + return 0; +} + diff --git a/gcc/testsuite/c-c++-common/torture/vector-subscript-2.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-2.c new file mode 100644 index 00000000000..2e4a7488bbe --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-2.c @@ -0,0 +1,68 @@ +/* { dg-do run } */ +#define vector __attribute__((vector_size(sizeof(int)*4) )) + +/* Check to make sure that we extract and insert the vector at the same + location for vector subscripting (with constant indexes) and + that vectors layout are the same as arrays. */ + +struct TV4 +{ + vector int v; +}; + +typedef struct TV4 MYV4; + +static inline MYV4 myfunc2( int x, int y, int z, int w ) +{ + MYV4 temp; + temp.v[0] = x; + temp.v[1] = y; + temp.v[2] = z; + temp.v[3] = w; + return temp; +} +MYV4 val3; +__attribute__((noinline)) void modify (void) +{ + val3 = myfunc2( 1, 2, 3, 4 ); +} +int main( int argc, char* argv[] ) +{ + int a[4]; + int i; + + /* Set up the vector. */ + modify(); + + /* Check the vector via the global variable. */ + if (val3.v[0] != 1) + __builtin_abort (); + if (val3.v[1] != 2) + __builtin_abort (); + if (val3.v[2] != 3) + __builtin_abort (); + if (val3.v[3] != 4) + __builtin_abort (); + + vector int a1 = val3.v; + + /* Check the vector via a local variable. */ + if (a1[0] != 1) + __builtin_abort (); + if (a1[1] != 2) + __builtin_abort (); + if (a1[2] != 3) + __builtin_abort (); + if (a1[3] != 4) + __builtin_abort (); + + __builtin_memcpy(a, &val3, sizeof(a)); + /* Check the vector via copying it to an array. */ + for(i = 0; i < 4; i++) + if (a[i] != i+1) + __builtin_abort (); + + + return 0; +} + diff --git a/gcc/testsuite/c-c++-common/torture/vector-subscript-3.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-3.c new file mode 100644 index 00000000000..bb5c91485d7 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-3.c @@ -0,0 +1,26 @@ +/* { dg-do run } */ +#define vector __attribute__((vector_size(16) )) + +/* Check whether register declaration of vector type still + allow us to subscript this type. */ + +typedef vector short myvec_t; + +struct vec_s { + vector short member; +}; + + +int main () { + register short vector v0 = {1,2,3,4,5,6,7}; + register myvec_t v1 = {1,2,3,4,5,6,7}; + register struct vec_s v2; + + v2.member = v1; + + short r = v0[0] + v1[1] + v2.member[2]; + if (r != 6) + __builtin_abort (); + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/vector-compare-1.c b/gcc/testsuite/c-c++-common/vector-compare-1.c new file mode 100644 index 00000000000..ef99ae472dc --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-compare-1.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-mabi=altivec" { target { { powerpc*-*-linux* } && ilp32 } } } */ +/* { dg-prune-output "operand types are" } */ + +#define vector(elcount, type) \ +__attribute__((vector_size((elcount)*sizeof(type)))) type + +void +foo (vector (4, int) x, vector (4, float) y) +{ + vector (4, int) p4; + vector (4, int) r4; + vector (4, unsigned int) q4; + vector (8, int) r8; + vector (4, float) f4; + + r4 = x > y; /* { dg-error "comparing vectors with different element types" } */ + r8 = (x != p4); /* { dg-error "incompatible types when assigning to type|cannot convert" } */ + r8 == r4; /* { dg-error "comparing vectors with different number of elements" } */ +} diff --git a/gcc/testsuite/c-c++-common/vector-compare-2.c b/gcc/testsuite/c-c++-common/vector-compare-2.c new file mode 100644 index 00000000000..8cbcf0787c4 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-compare-2.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-common" { target hppa*-*-hpux* } } */ +/* { dg-options "-mabi=altivec" { target { { powerpc*-*-linux* } && ilp32 } } } */ + +/* Test if C_MAYBE_CONST are folded correctly when + creating VEC_COND_EXPR. */ + +typedef int vec __attribute__((vector_size(16))); + +vec i,j; +extern vec a, b, c; + +extern int p, q, z; +extern vec foo (int); + +vec +foo (int x) +{ + return foo (p ? q :z) > a; +} + +vec +bar (int x) +{ + return b > foo (p ? q :z); +} + + diff --git a/gcc/testsuite/c-c++-common/vector-compare-3.c b/gcc/testsuite/c-c++-common/vector-compare-3.c new file mode 100644 index 00000000000..d6b0dac7cb9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-compare-3.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef int v4i __attribute__((vector_size(4*sizeof(int)))); + +// fold should not turn (vec_other)(x<y) into (x<y)?vec_other(-1):vec_other(0). + +void use (v4i const *z); + +void +f (v4i *x, v4i *y) +{ + v4i const zz = *x < *y; + use (&zz); +} + +// Optimizations shouldn't introduce a boolean type in there + +void +g (v4i *x, v4i const *y, v4i *z, v4i *t) +{ + *z = *x < *y | *x == *y; + *t = *x < *y & *x > *y; +} + diff --git a/gcc/testsuite/c-c++-common/vector-shift.c b/gcc/testsuite/c-c++-common/vector-shift.c new file mode 100644 index 00000000000..593bb366943 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-shift.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-prune-output "in evaluation of" } */ +#define vector(elcount, type) \ +__attribute__((vector_size((elcount)*sizeof(type)))) type + +int main (int argc, char *argv[]) { + vector(4,char) vchar = {1,2,3,4}; + vector(4, int) vint = {1,1,1,1}; + + vint <<= vchar; /* { dg-error "nvalid operands to binary <<" } */ + vchar >>= vint; /* { dg-error "nvalid operands to binary >>" } */ + + return 0; +} + diff --git a/gcc/testsuite/c-c++-common/vector-shift1.c b/gcc/testsuite/c-c++-common/vector-shift1.c new file mode 100644 index 00000000000..db8035667a9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-shift1.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-prune-output "in evaluation of" } */ +#define vector(elcount, type) \ +__attribute__((vector_size((elcount)*sizeof(type)))) type + +int main (int argc, char *argv[]) { + vector(4, float) vfloat0 = {1., 2., 3., 4.}; + vector(4, float) vfloat1 = {1., 2., 3., 4.}; + + vector(4, int) vint = {1, 1, 1, 1 }; + + vint <<= vfloat0; /* { dg-error "nvalid operands to binary <<" } */ + vfloat0 >>= vint; /* { dg-error "nvalid operands to binary >>" } */ + + vfloat0 <<= vfloat1; /* { dg-error "nvalid operands" } */ + + return 0; +} + diff --git a/gcc/testsuite/c-c++-common/vector-shift3.c b/gcc/testsuite/c-c++-common/vector-shift3.c new file mode 100644 index 00000000000..c26fb8d98ca --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-shift3.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +#define vector(elcount, type) \ +__attribute__((vector_size((elcount)*sizeof(type)))) type + + +int main (int argc, char *argv[]) { + vector(8, short) v0 = {(short)argc,2,3,4,5,6,7}; + short sc; + + + scalar1 <<= v0; /* { dg-error "scalar1.*(undeclared|was not declared)" } */ + + return 0; +} + |