re PR c++/54427 (Expose more vector extensions)
2012-09-14 Marc Glisse <marc.glisse@inria.fr> PR c++/54427 gcc/ChangeLog * fold-const.c (fold_unary_loc): Disable for VECTOR_TYPE. (fold_binary_loc): Likewise. * gimple-fold.c (and_comparisons_1): Handle VECTOR_TYPE. (or_comparisons_1): Likewise. gcc/cp/ChangeLog * typeck.c (cp_build_binary_op) [LSHIFT_EXPR, RSHIFT_EXPR, EQ_EXPR, NE_EXPR, LE_EXPR, GE_EXPR, LT_EXPR, GT_EXPR]: Handle VECTOR_TYPE. gcc/testsuite/ChangeLog * g++.dg/other/vector-compare.C: New testcase. * gcc/testsuite/c-c++-common/vector-compare-3.c: New testcase. * gcc.dg/vector-shift.c: Move ... * c-c++-common/vector-shift.c: ... here. * gcc.dg/vector-shift1.c: Move ... * c-c++-common/vector-shift1.c: ... here. * gcc.dg/vector-shift3.c: Move ... * c-c++-common/vector-shift3.c: ... here. * gcc.dg/vector-compare-1.c: Move ... * c-c++-common/vector-compare-1.c: ... here. * gcc.dg/vector-compare-2.c: Move ... * c-c++-common/vector-compare-2.c: ... here. * gcc.c-torture/execute/vector-compare-1.c: Move ... * c-c++-common/torture/vector-compare-1.c: ... here. * gcc.c-torture/execute/vector-compare-2.x: Delete. * gcc.c-torture/execute/vector-compare-2.c: Move ... * c-c++-common/torture/vector-compare-2.c: ... here. * gcc.c-torture/execute/vector-shift.c: Move ... * c-c++-common/torture/vector-shift.c: ... here. * gcc.c-torture/execute/vector-shift2.c: Move ... * c-c++-common/torture/vector-shift2.c: ... here. * gcc.c-torture/execute/vector-subscript-1.c: Move ... * c-c++-common/torture/vector-subscript-1.c: ... here. * gcc.c-torture/execute/vector-subscript-2.c: Move ... * c-c++-common/torture/vector-subscript-2.c: ... here. * gcc.c-torture/execute/vector-subscript-3.c: Move ... * c-c++-common/torture/vector-subscript-3.c: ... here. From-SVN: r191308
This commit is contained in:
parent
0290430b75
commit
31ed622658
21 changed files with 206 additions and 24 deletions
|
@ -1,3 +1,11 @@
|
|||
2012-09-14 Marc Glisse <marc.glisse@inria.fr>
|
||||
|
||||
PR c++/54427
|
||||
* fold-const.c (fold_unary_loc): Disable for VECTOR_TYPE.
|
||||
(fold_binary_loc): Likewise.
|
||||
* gimple-fold.c (and_comparisons_1): Handle VECTOR_TYPE.
|
||||
(or_comparisons_1): Likewise.
|
||||
|
||||
2012-09-14 Richard Earnshaw <rearnsha@arm.com>
|
||||
|
||||
PR target/54516
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2012-09-14 Marc Glisse <marc.glisse@inria.fr>
|
||||
|
||||
PR c++/54427
|
||||
* typeck.c (cp_build_binary_op) [LSHIFT_EXPR, RSHIFT_EXPR, EQ_EXPR,
|
||||
NE_EXPR, LE_EXPR, GE_EXPR, LT_EXPR, GT_EXPR]: Handle VECTOR_TYPE.
|
||||
|
||||
2012-09-14 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
* decl.c (make_typename_type): Only error out if tf_error is set
|
||||
|
|
|
@ -3985,7 +3985,15 @@ cp_build_binary_op (location_t location,
|
|||
Also set SHORT_SHIFT if shifting rightward. */
|
||||
|
||||
case RSHIFT_EXPR:
|
||||
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
|
||||
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
|
||||
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
|
||||
&& TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
|
||||
&& TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))
|
||||
{
|
||||
result_type = type0;
|
||||
converted = 1;
|
||||
}
|
||||
else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
|
||||
{
|
||||
result_type = type0;
|
||||
if (TREE_CODE (op1) == INTEGER_CST)
|
||||
|
@ -4014,7 +4022,15 @@ cp_build_binary_op (location_t location,
|
|||
break;
|
||||
|
||||
case LSHIFT_EXPR:
|
||||
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
|
||||
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
|
||||
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
|
||||
&& TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
|
||||
&& TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))
|
||||
{
|
||||
result_type = type0;
|
||||
converted = 1;
|
||||
}
|
||||
else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
|
||||
{
|
||||
result_type = type0;
|
||||
if (TREE_CODE (op1) == INTEGER_CST)
|
||||
|
@ -4072,6 +4088,8 @@ cp_build_binary_op (location_t location,
|
|||
|
||||
case EQ_EXPR:
|
||||
case NE_EXPR:
|
||||
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
|
||||
goto vector_compare;
|
||||
if ((complain & tf_warning)
|
||||
&& (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
|
||||
warning (OPT_Wfloat_equal,
|
||||
|
@ -4314,6 +4332,35 @@ cp_build_binary_op (location_t location,
|
|||
warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
|
||||
}
|
||||
|
||||
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
|
||||
{
|
||||
vector_compare:
|
||||
tree intt;
|
||||
if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
|
||||
TREE_TYPE (type1)))
|
||||
{
|
||||
error_at (location, "comparing vectors with different "
|
||||
"element types");
|
||||
inform (location, "operand types are %qT and %qT", type0, type1);
|
||||
return error_mark_node;
|
||||
}
|
||||
|
||||
if (TYPE_VECTOR_SUBPARTS (type0) != TYPE_VECTOR_SUBPARTS (type1))
|
||||
{
|
||||
error_at (location, "comparing vectors with different "
|
||||
"number of elements");
|
||||
inform (location, "operand types are %qT and %qT", type0, type1);
|
||||
return error_mark_node;
|
||||
}
|
||||
|
||||
/* Always construct signed integer vector type. */
|
||||
intt = c_common_type_for_size (GET_MODE_BITSIZE
|
||||
(TYPE_MODE (TREE_TYPE (type0))), 0);
|
||||
result_type = build_opaque_vector_type (intt,
|
||||
TYPE_VECTOR_SUBPARTS (type0));
|
||||
converted = 1;
|
||||
break;
|
||||
}
|
||||
build_type = boolean_type_node;
|
||||
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|
||||
|| code0 == ENUMERAL_TYPE)
|
||||
|
|
|
@ -7771,7 +7771,7 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
|
|||
return build2_loc (loc, TREE_CODE (op0), type,
|
||||
TREE_OPERAND (op0, 0),
|
||||
TREE_OPERAND (op0, 1));
|
||||
else if (!INTEGRAL_TYPE_P (type))
|
||||
else if (!INTEGRAL_TYPE_P (type) && TREE_CODE (type) != VECTOR_TYPE)
|
||||
return build3_loc (loc, COND_EXPR, type, op0,
|
||||
constant_boolean_node (true, type),
|
||||
constant_boolean_node (false, type));
|
||||
|
@ -9829,6 +9829,7 @@ fold_binary_loc (location_t loc,
|
|||
|
||||
if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
|
||||
|| code == EQ_EXPR || code == NE_EXPR)
|
||||
&& TREE_CODE (type) != VECTOR_TYPE
|
||||
&& ((truth_value_p (TREE_CODE (arg0))
|
||||
&& (truth_value_p (TREE_CODE (arg1))
|
||||
|| (TREE_CODE (arg1) == BIT_AND_EXPR
|
||||
|
|
|
@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see
|
|||
#include "tree-ssa-propagate.h"
|
||||
#include "target.h"
|
||||
#include "gimple-fold.h"
|
||||
#include "langhooks.h"
|
||||
|
||||
/* Return true when DECL can be referenced from current unit.
|
||||
FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
|
||||
|
@ -1692,6 +1693,16 @@ static tree
|
|||
and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
|
||||
enum tree_code code2, tree op2a, tree op2b)
|
||||
{
|
||||
tree truth_type = boolean_type_node;
|
||||
if (TREE_CODE (TREE_TYPE (op1a)) == VECTOR_TYPE)
|
||||
{
|
||||
tree vec_type = TREE_TYPE (op1a);
|
||||
tree elem = lang_hooks.types.type_for_size
|
||||
(GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vec_type))), 0);
|
||||
truth_type = build_opaque_vector_type (elem,
|
||||
TYPE_VECTOR_SUBPARTS (vec_type));
|
||||
}
|
||||
|
||||
/* First check for ((x CODE1 y) AND (x CODE2 y)). */
|
||||
if (operand_equal_p (op1a, op2a, 0)
|
||||
&& operand_equal_p (op1b, op2b, 0))
|
||||
|
@ -1699,7 +1710,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
|
|||
/* Result will be either NULL_TREE, or a combined comparison. */
|
||||
tree t = combine_comparisons (UNKNOWN_LOCATION,
|
||||
TRUTH_ANDIF_EXPR, code1, code2,
|
||||
boolean_type_node, op1a, op1b);
|
||||
truth_type, op1a, op1b);
|
||||
if (t)
|
||||
return t;
|
||||
}
|
||||
|
@ -1712,7 +1723,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
|
|||
tree t = combine_comparisons (UNKNOWN_LOCATION,
|
||||
TRUTH_ANDIF_EXPR, code1,
|
||||
swap_tree_comparison (code2),
|
||||
boolean_type_node, op1a, op1b);
|
||||
truth_type, op1a, op1b);
|
||||
if (t)
|
||||
return t;
|
||||
}
|
||||
|
@ -2154,6 +2165,16 @@ static tree
|
|||
or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
|
||||
enum tree_code code2, tree op2a, tree op2b)
|
||||
{
|
||||
tree truth_type = boolean_type_node;
|
||||
if (TREE_CODE (TREE_TYPE (op1a)) == VECTOR_TYPE)
|
||||
{
|
||||
tree vec_type = TREE_TYPE (op1a);
|
||||
tree elem = lang_hooks.types.type_for_size
|
||||
(GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vec_type))), 0);
|
||||
truth_type = build_opaque_vector_type (elem,
|
||||
TYPE_VECTOR_SUBPARTS (vec_type));
|
||||
}
|
||||
|
||||
/* First check for ((x CODE1 y) OR (x CODE2 y)). */
|
||||
if (operand_equal_p (op1a, op2a, 0)
|
||||
&& operand_equal_p (op1b, op2b, 0))
|
||||
|
@ -2161,7 +2182,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
|
|||
/* Result will be either NULL_TREE, or a combined comparison. */
|
||||
tree t = combine_comparisons (UNKNOWN_LOCATION,
|
||||
TRUTH_ORIF_EXPR, code1, code2,
|
||||
boolean_type_node, op1a, op1b);
|
||||
truth_type, op1a, op1b);
|
||||
if (t)
|
||||
return t;
|
||||
}
|
||||
|
@ -2174,7 +2195,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
|
|||
tree t = combine_comparisons (UNKNOWN_LOCATION,
|
||||
TRUTH_ORIF_EXPR, code1,
|
||||
swap_tree_comparison (code2),
|
||||
boolean_type_node, op1a, op1b);
|
||||
truth_type, op1a, op1b);
|
||||
if (t)
|
||||
return t;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,34 @@
|
|||
2012-09-14 Marc Glisse <marc.glisse@inria.fr>
|
||||
|
||||
PR c++/54427
|
||||
* g++.dg/other/vector-compare.C: New testcase.
|
||||
* gcc/testsuite/c-c++-common/vector-compare-3.c: New testcase.
|
||||
* gcc.dg/vector-shift.c: Move ...
|
||||
* c-c++-common/vector-shift.c: ... here.
|
||||
* gcc.dg/vector-shift1.c: Move ...
|
||||
* c-c++-common/vector-shift1.c: ... here.
|
||||
* gcc.dg/vector-shift3.c: Move ...
|
||||
* c-c++-common/vector-shift3.c: ... here.
|
||||
* gcc.dg/vector-compare-1.c: Move ...
|
||||
* c-c++-common/vector-compare-1.c: ... here.
|
||||
* gcc.dg/vector-compare-2.c: Move ...
|
||||
* c-c++-common/vector-compare-2.c: ... here.
|
||||
* gcc.c-torture/execute/vector-compare-1.c: Move ...
|
||||
* c-c++-common/torture/vector-compare-1.c: ... here.
|
||||
* gcc.c-torture/execute/vector-compare-2.x: Delete.
|
||||
* gcc.c-torture/execute/vector-compare-2.c: Move ...
|
||||
* c-c++-common/torture/vector-compare-2.c: ... here.
|
||||
* gcc.c-torture/execute/vector-shift.c: Move ...
|
||||
* c-c++-common/torture/vector-shift.c: ... here.
|
||||
* gcc.c-torture/execute/vector-shift2.c: Move ...
|
||||
* c-c++-common/torture/vector-shift2.c: ... here.
|
||||
* gcc.c-torture/execute/vector-subscript-1.c: Move ...
|
||||
* c-c++-common/torture/vector-subscript-1.c: ... here.
|
||||
* gcc.c-torture/execute/vector-subscript-2.c: Move ...
|
||||
* c-c++-common/torture/vector-subscript-2.c: ... here.
|
||||
* gcc.c-torture/execute/vector-subscript-3.c: Move ...
|
||||
* c-c++-common/torture/vector-subscript-3.c: ... here.
|
||||
|
||||
2012-09-14 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
PR c/54103
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* { dg-do run } */
|
||||
#define vector(elcount, type) \
|
||||
__attribute__((vector_size((elcount)*sizeof(type)))) type
|
||||
|
||||
|
@ -38,7 +39,7 @@ int main (int argc, char *argv[]) {
|
|||
vector (4, int) ires;
|
||||
int i;
|
||||
|
||||
i0 = (vector (4, INT)){argc, 1, 2, 10};
|
||||
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
|
||||
|
@ -48,7 +49,7 @@ int main (int argc, char *argv[]) {
|
|||
vector (4, INT) u0;
|
||||
vector (4, INT) u1;
|
||||
|
||||
u0 = (vector (4, INT)){argc, 1, 2, 10};
|
||||
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
|
||||
|
@ -59,7 +60,7 @@ int main (int argc, char *argv[]) {
|
|||
vector (8, SHORT) s1;
|
||||
vector (8, short) sres;
|
||||
|
||||
s0 = (vector (8, SHORT)){argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
|
||||
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
|
||||
|
@ -69,7 +70,7 @@ int main (int argc, char *argv[]) {
|
|||
vector (8, SHORT) us1;
|
||||
vector (8, short) usres;
|
||||
|
||||
us0 = (vector (8, SHORT)){argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
|
||||
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
|
||||
|
@ -79,8 +80,8 @@ int main (int argc, char *argv[]) {
|
|||
vector (16, CHAR) c1;
|
||||
vector (16, signed char) cres;
|
||||
|
||||
c0 = (vector (16, CHAR)){argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
|
||||
argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
|
||||
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};
|
||||
|
@ -92,8 +93,8 @@ int main (int argc, char *argv[]) {
|
|||
vector (16, CHAR) uc1;
|
||||
vector (16, signed char) ucres;
|
||||
|
||||
uc0 = (vector (16, CHAR)){argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
|
||||
argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
|
||||
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};
|
|
@ -1,3 +1,5 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-Wno-psabi" } */
|
||||
#define vector(elcount, type) \
|
||||
__attribute__((vector_size((elcount)*sizeof(type)))) type
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
/* { dg-do run } */
|
||||
|
||||
#define vector __attribute__((vector_size(sizeof(int)*4) ))
|
||||
|
||||
|
@ -16,7 +17,7 @@ static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1};
|
|||
|
||||
#define TEST(result, expected) \
|
||||
do { \
|
||||
typeof(result) result1 = result; \
|
||||
__typeof__(result) result1 = result; \
|
||||
if(sizeof (result1) != sizeof (expected)) \
|
||||
__builtin_abort (); \
|
||||
if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \
|
|
@ -1,3 +1,4 @@
|
|||
/* { dg-do run } */
|
||||
#define vector(elcount, type) \
|
||||
__attribute__((vector_size((elcount)*sizeof(type)))) type
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
/* dg-do run */
|
||||
/* { 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
|
|
@ -1,3 +1,4 @@
|
|||
/* { 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
|
|
@ -1,4 +1,4 @@
|
|||
/* dg-do run */
|
||||
/* { dg-do run } */
|
||||
#define vector __attribute__((vector_size(16) ))
|
||||
|
||||
/* Check whether register declaration of vector type still
|
|
@ -1,5 +1,6 @@
|
|||
/* { 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
|
||||
|
@ -14,6 +15,6 @@ foo (vector (4, int) x, vector (4, float) y)
|
|||
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" } */
|
||||
r8 = (x != p4); /* { dg-error "incompatible types when assigning to type|cannot convert" } */
|
||||
r8 == r4; /* { dg-error "comparing vectors with different number of elements" } */
|
||||
}
|
25
gcc/testsuite/c-c++-common/vector-compare-3.c
Normal file
25
gcc/testsuite/c-c++-common/vector-compare-3.c
Normal file
|
@ -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;
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-prune-output "in evaluation of" } */
|
||||
#define vector(elcount, type) \
|
||||
__attribute__((vector_size((elcount)*sizeof(type)))) type
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-prune-output "in evaluation of" } */
|
||||
#define vector(elcount, type) \
|
||||
__attribute__((vector_size((elcount)*sizeof(type)))) type
|
||||
|
||||
|
@ -11,7 +12,7 @@ int main (int argc, char *argv[]) {
|
|||
vint <<= vfloat0; /* { dg-error "nvalid operands to binary <<" } */
|
||||
vfloat0 >>= vint; /* { dg-error "nvalid operands to binary >>" } */
|
||||
|
||||
vfloat0 <<= vfloat1; /* { dg-error "nvalid operands to binary <<" } */
|
||||
vfloat0 <<= vfloat1; /* { dg-error "nvalid operands" } */
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -5,11 +5,11 @@ __attribute__((vector_size((elcount)*sizeof(type)))) type
|
|||
|
||||
|
||||
int main (int argc, char *argv[]) {
|
||||
vector(8, short) v0 = {argc,2,3,4,5,6,7};
|
||||
vector(8, short) v0 = {(short)argc,2,3,4,5,6,7};
|
||||
short sc;
|
||||
|
||||
|
||||
scalar1 <<= v0; /* { dg-error ".*scalar1.*undeclared" } */
|
||||
scalar1 <<= v0; /* { dg-error "scalar1.*(undeclared|was not declared)" } */
|
||||
|
||||
return 0;
|
||||
}
|
36
gcc/testsuite/g++.dg/other/vector-compare.C
Normal file
36
gcc/testsuite/g++.dg/other/vector-compare.C
Normal file
|
@ -0,0 +1,36 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-std=gnu++11 -Wall" } */
|
||||
|
||||
// Check that we can compare vector types that really are the same through
|
||||
// typedefs.
|
||||
|
||||
typedef float v4f __attribute__((vector_size(4*sizeof(float))));
|
||||
|
||||
template <class T> void eat (T&&) {}
|
||||
|
||||
template <class T, int n>
|
||||
struct Vec
|
||||
{
|
||||
typedef T type __attribute__((vector_size(4*sizeof(T))));
|
||||
|
||||
template <class U>
|
||||
static void fun (type const& t, U& u) { eat (t > u); }
|
||||
};
|
||||
|
||||
long long
|
||||
f (v4f *x, v4f const *y)
|
||||
{
|
||||
return ((*x < *y) | (*x <= *y))[2];
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
v4f x = {0,1,2,3};
|
||||
Vec<const volatile float,4>::type f = {-1,5,2,3.1};
|
||||
auto c = (x == f) == (x >= x);
|
||||
eat (c[3]);
|
||||
Vec<const volatile float,4>::fun (f, x);
|
||||
Vec<const volatile float,4>::fun (x, f);
|
||||
Vec<const volatile float,4>::fun (f, f);
|
||||
Vec<const volatile float,4>::fun (x, x);
|
||||
}
|
|
@ -1,2 +0,0 @@
|
|||
set additional_flags "-Wno-psabi"
|
||||
return 0
|
Loading…
Add table
Reference in a new issue