Commit 31ed6226 by Marc Glisse Committed by Marc Glisse

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
parent 0290430b
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> 2012-09-14 Richard Earnshaw <rearnsha@arm.com>
PR target/54516 PR target/54516
......
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> 2012-09-14 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (make_typename_type): Only error out if tf_error is set * decl.c (make_typename_type): Only error out if tf_error is set
......
...@@ -3985,7 +3985,15 @@ cp_build_binary_op (location_t location, ...@@ -3985,7 +3985,15 @@ cp_build_binary_op (location_t location,
Also set SHORT_SHIFT if shifting rightward. */ Also set SHORT_SHIFT if shifting rightward. */
case RSHIFT_EXPR: 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; result_type = type0;
if (TREE_CODE (op1) == INTEGER_CST) if (TREE_CODE (op1) == INTEGER_CST)
...@@ -4014,7 +4022,15 @@ cp_build_binary_op (location_t location, ...@@ -4014,7 +4022,15 @@ cp_build_binary_op (location_t location,
break; break;
case LSHIFT_EXPR: 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; result_type = type0;
if (TREE_CODE (op1) == INTEGER_CST) if (TREE_CODE (op1) == INTEGER_CST)
...@@ -4072,6 +4088,8 @@ cp_build_binary_op (location_t location, ...@@ -4072,6 +4088,8 @@ cp_build_binary_op (location_t location,
case EQ_EXPR: case EQ_EXPR:
case NE_EXPR: case NE_EXPR:
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
goto vector_compare;
if ((complain & tf_warning) if ((complain & tf_warning)
&& (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1))) && (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
warning (OPT_Wfloat_equal, warning (OPT_Wfloat_equal,
...@@ -4314,6 +4332,35 @@ cp_build_binary_op (location_t location, ...@@ -4314,6 +4332,35 @@ cp_build_binary_op (location_t location,
warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour"); 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; build_type = boolean_type_node;
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|| code0 == ENUMERAL_TYPE) || code0 == ENUMERAL_TYPE)
......
...@@ -7771,7 +7771,7 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0) ...@@ -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, return build2_loc (loc, TREE_CODE (op0), type,
TREE_OPERAND (op0, 0), TREE_OPERAND (op0, 0),
TREE_OPERAND (op0, 1)); 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, return build3_loc (loc, COND_EXPR, type, op0,
constant_boolean_node (true, type), constant_boolean_node (true, type),
constant_boolean_node (false, type)); constant_boolean_node (false, type));
...@@ -9829,6 +9829,7 @@ fold_binary_loc (location_t loc, ...@@ -9829,6 +9829,7 @@ fold_binary_loc (location_t loc,
if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
|| code == EQ_EXPR || code == NE_EXPR) || code == EQ_EXPR || code == NE_EXPR)
&& TREE_CODE (type) != VECTOR_TYPE
&& ((truth_value_p (TREE_CODE (arg0)) && ((truth_value_p (TREE_CODE (arg0))
&& (truth_value_p (TREE_CODE (arg1)) && (truth_value_p (TREE_CODE (arg1))
|| (TREE_CODE (arg1) == BIT_AND_EXPR || (TREE_CODE (arg1) == BIT_AND_EXPR
......
...@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa-propagate.h" #include "tree-ssa-propagate.h"
#include "target.h" #include "target.h"
#include "gimple-fold.h" #include "gimple-fold.h"
#include "langhooks.h"
/* Return true when DECL can be referenced from current unit. /* Return true when DECL can be referenced from current unit.
FROM_DECL (if non-null) specify constructor of variable DECL was taken from. FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
...@@ -1692,6 +1693,16 @@ static tree ...@@ -1692,6 +1693,16 @@ static tree
and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b, and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
enum tree_code code2, tree op2a, tree op2b) 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)). */ /* First check for ((x CODE1 y) AND (x CODE2 y)). */
if (operand_equal_p (op1a, op2a, 0) if (operand_equal_p (op1a, op2a, 0)
&& operand_equal_p (op1b, op2b, 0)) && operand_equal_p (op1b, op2b, 0))
...@@ -1699,7 +1710,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b, ...@@ -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. */ /* Result will be either NULL_TREE, or a combined comparison. */
tree t = combine_comparisons (UNKNOWN_LOCATION, tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ANDIF_EXPR, code1, code2, TRUTH_ANDIF_EXPR, code1, code2,
boolean_type_node, op1a, op1b); truth_type, op1a, op1b);
if (t) if (t)
return t; return t;
} }
...@@ -1712,7 +1723,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b, ...@@ -1712,7 +1723,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
tree t = combine_comparisons (UNKNOWN_LOCATION, tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ANDIF_EXPR, code1, TRUTH_ANDIF_EXPR, code1,
swap_tree_comparison (code2), swap_tree_comparison (code2),
boolean_type_node, op1a, op1b); truth_type, op1a, op1b);
if (t) if (t)
return t; return t;
} }
...@@ -2154,6 +2165,16 @@ static tree ...@@ -2154,6 +2165,16 @@ static tree
or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b, or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
enum tree_code code2, tree op2a, tree op2b) 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)). */ /* First check for ((x CODE1 y) OR (x CODE2 y)). */
if (operand_equal_p (op1a, op2a, 0) if (operand_equal_p (op1a, op2a, 0)
&& operand_equal_p (op1b, op2b, 0)) && operand_equal_p (op1b, op2b, 0))
...@@ -2161,7 +2182,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b, ...@@ -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. */ /* Result will be either NULL_TREE, or a combined comparison. */
tree t = combine_comparisons (UNKNOWN_LOCATION, tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ORIF_EXPR, code1, code2, TRUTH_ORIF_EXPR, code1, code2,
boolean_type_node, op1a, op1b); truth_type, op1a, op1b);
if (t) if (t)
return t; return t;
} }
...@@ -2174,7 +2195,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b, ...@@ -2174,7 +2195,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
tree t = combine_comparisons (UNKNOWN_LOCATION, tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ORIF_EXPR, code1, TRUTH_ORIF_EXPR, code1,
swap_tree_comparison (code2), swap_tree_comparison (code2),
boolean_type_node, op1a, op1b); truth_type, op1a, op1b);
if (t) if (t)
return t; return t;
} }
......
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> 2012-09-14 Joseph Myers <joseph@codesourcery.com>
PR c/54103 PR c/54103
......
/* { dg-do run } */
#define vector(elcount, type) \ #define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type __attribute__((vector_size((elcount)*sizeof(type)))) type
...@@ -38,7 +39,7 @@ int main (int argc, char *argv[]) { ...@@ -38,7 +39,7 @@ int main (int argc, char *argv[]) {
vector (4, int) ires; vector (4, int) ires;
int i; 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}; i1 = (vector (4, INT)){0, 3, 2, (INT)-23};
test (4, i0, i1, ires, "%i"); test (4, i0, i1, ires, "%i");
#undef INT #undef INT
...@@ -48,7 +49,7 @@ int main (int argc, char *argv[]) { ...@@ -48,7 +49,7 @@ int main (int argc, char *argv[]) {
vector (4, INT) u0; vector (4, INT) u0;
vector (4, INT) u1; 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}; u1 = (vector (4, INT)){0, 3, 2, (INT)-23};
test (4, u0, u1, ures, "%u"); test (4, u0, u1, ures, "%u");
#undef INT #undef INT
...@@ -59,7 +60,7 @@ int main (int argc, char *argv[]) { ...@@ -59,7 +60,7 @@ int main (int argc, char *argv[]) {
vector (8, SHORT) s1; vector (8, SHORT) s1;
vector (8, short) sres; 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}; s1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
test (8, s0, s1, sres, "%i"); test (8, s0, s1, sres, "%i");
#undef SHORT #undef SHORT
...@@ -69,7 +70,7 @@ int main (int argc, char *argv[]) { ...@@ -69,7 +70,7 @@ int main (int argc, char *argv[]) {
vector (8, SHORT) us1; vector (8, SHORT) us1;
vector (8, short) usres; 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}; us1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
test (8, us0, us1, usres, "%u"); test (8, us0, us1, usres, "%u");
#undef SHORT #undef SHORT
...@@ -79,8 +80,8 @@ int main (int argc, char *argv[]) { ...@@ -79,8 +80,8 @@ int main (int argc, char *argv[]) {
vector (16, CHAR) c1; vector (16, CHAR) c1;
vector (16, signed char) cres; vector (16, signed char) cres;
c0 = (vector (16, CHAR)){argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \ c0 = (vector (16, CHAR)){(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
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, \ c1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
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[]) { ...@@ -92,8 +93,8 @@ int main (int argc, char *argv[]) {
vector (16, CHAR) uc1; vector (16, CHAR) uc1;
vector (16, signed char) ucres; vector (16, signed char) ucres;
uc0 = (vector (16, CHAR)){argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \ uc0 = (vector (16, CHAR)){(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
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, \ uc1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0}; 0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
......
/* { dg-do run } */
/* { dg-options "-Wno-psabi" } */
#define vector(elcount, type) \ #define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type __attribute__((vector_size((elcount)*sizeof(type)))) type
......
/* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) )) #define vector __attribute__((vector_size(sizeof(int)*4) ))
...@@ -16,7 +17,7 @@ static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1}; ...@@ -16,7 +17,7 @@ static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1};
#define TEST(result, expected) \ #define TEST(result, expected) \
do { \ do { \
typeof(result) result1 = result; \ __typeof__(result) result1 = result; \
if(sizeof (result1) != sizeof (expected)) \ if(sizeof (result1) != sizeof (expected)) \
__builtin_abort (); \ __builtin_abort (); \
if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \ if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \
......
/* { dg-do run } */
#define vector(elcount, type) \ #define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type __attribute__((vector_size((elcount)*sizeof(type)))) type
......
/* dg-do run */ /* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) )) #define vector __attribute__((vector_size(sizeof(int)*4) ))
/* Check to make sure that we extract and insert the vector at the same /* Check to make sure that we extract and insert the vector at the same
......
/* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) )) #define vector __attribute__((vector_size(sizeof(int)*4) ))
/* Check to make sure that we extract and insert the vector at the same /* Check to make sure that we extract and insert the vector at the same
......
/* dg-do run */ /* { dg-do run } */
#define vector __attribute__((vector_size(16) )) #define vector __attribute__((vector_size(16) ))
/* Check whether register declaration of vector type still /* Check whether register declaration of vector type still
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-mabi=altivec" { target { { powerpc*-*-linux* } && ilp32 } } } */ /* { dg-options "-mabi=altivec" { target { { powerpc*-*-linux* } && ilp32 } } } */
/* { dg-prune-output "operand types are" } */
#define vector(elcount, type) \ #define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type __attribute__((vector_size((elcount)*sizeof(type)))) type
...@@ -14,6 +15,6 @@ foo (vector (4, int) x, vector (4, float) y) ...@@ -14,6 +15,6 @@ foo (vector (4, int) x, vector (4, float) y)
vector (4, float) f4; vector (4, float) f4;
r4 = x > y; /* { dg-error "comparing vectors with different element types" } */ 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" } */ r8 == r4; /* { dg-error "comparing vectors with different number of elements" } */
} }
/* { 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;
}
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-prune-output "in evaluation of" } */
#define vector(elcount, type) \ #define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type __attribute__((vector_size((elcount)*sizeof(type)))) type
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-prune-output "in evaluation of" } */
#define vector(elcount, type) \ #define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type __attribute__((vector_size((elcount)*sizeof(type)))) type
...@@ -11,7 +12,7 @@ int main (int argc, char *argv[]) { ...@@ -11,7 +12,7 @@ int main (int argc, char *argv[]) {
vint <<= vfloat0; /* { dg-error "nvalid operands to binary <<" } */ vint <<= vfloat0; /* { dg-error "nvalid operands to binary <<" } */
vfloat0 >>= vint; /* { 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; return 0;
} }
......
...@@ -5,11 +5,11 @@ __attribute__((vector_size((elcount)*sizeof(type)))) type ...@@ -5,11 +5,11 @@ __attribute__((vector_size((elcount)*sizeof(type)))) type
int main (int argc, char *argv[]) { 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; short sc;
scalar1 <<= v0; /* { dg-error ".*scalar1.*undeclared" } */ scalar1 <<= v0; /* { dg-error "scalar1.*(undeclared|was not declared)" } */
return 0; return 0;
} }
......
/* { 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment