From: Ramana Radhakrishnan Date: Fri, 15 Jun 2012 16:43:36 +0000 (+0000) Subject: [multiple changes] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9e1a8dd161fc5c077f8497853f237dff486a392c;p=gcc.git [multiple changes] 2012-06-15 Marc Glisse PR c++/51033 * c-typeck.c (c_build_vec_perm_expr): Move to c-family/c-common.c. * c-tree.h (c_build_vec_perm_expr): Move to c-family/c-common.h. cp/ 2012-06-15 Marc Glisse PR c++/51033 * semantics.c (literal_type_p): Handle VECTOR_TYPE. (potential_constant_expression_1): Handle VEC_PERM_EXPR. * parser.c (cp_parser_postfix_expression): Handle RID_BUILTIN_SHUFFLE. c-family 2012-06-15 Marc Glisse PR c++/51033 * c-common.h (c_build_vec_perm_expr): Move decl here. * c-common.c (c_build_vec_perm_expr): Move definition here. 2012-06-15 Ramana Radhakrishnan PR c++/51033 * c-c++-common/torture/vshuf-16.inc: Move from gcc.c-torture/execute/. * c-c++-common/torture/vshuf-2.inc: Likewise. * c-c++-common/torture/vshuf-4.inc: Likewise. * c-c++-common/torture/vshuf-8.inc: Likewise. * c-c++-common/torture/vshuf-main.inc: Likewise. * c-c++-common/torture/vshuf-v16hi.c: Likewise. * c-c++-common/torture/vshuf-v16qi.c: Likewise. * c-c++-common/torture/vshuf-v2df.c: Likewise. * c-c++-common/torture/vshuf-v2di.c: Likewise. * c-c++-common/torture/vshuf-v2sf.c: Likewise. * c-c++-common/torture/vshuf-v2si.c: Likewise. * c-c++-common/torture/vshuf-v4df.c: Likewise. * c-c++-common/torture/vshuf-v4di.c: Likewise. * c-c++-common/torture/vshuf-v4hi.c: Likewise. * c-c++-common/torture/vshuf-v4sf.c: Likewise. * c-c++-common/torture/vshuf-v4si.c: Likewise. * c-c++-common/torture/vshuf-v8hi.c: Likewise. * c-c++-common/torture/vshuf-v8qi.c: Likewise. * c-c++-common/torture/vshuf-v8si.c: Likewise. From-SVN: r188671 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 07598f2da9d..9c473e4ed58 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-06-15 Marc Glisse + + PR c++/51033 + * c-typeck.c (c_build_vec_perm_expr): Move to c-family/c-common.c. + * c-tree.h (c_build_vec_perm_expr): Move to c-family/c-common.h. + 2012-06-15 Georg-Johann Lay * config/avr/avr.c (avr_default_expand_builtin): New function. diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index ac499b359c4..529cc06f84b 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2012-06-15 Marc Glisse + + PR c++/51033 + * c-common.h (c_build_vec_perm_expr): Move decl here. + * c-common.c (c_build_vec_perm_expr): Move definition + here. + 2012-06-06 Steven Bosscher * c.opt (fconserve-space): Turn into a no-op. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 4dd040b5fa5..61d756760e3 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -430,7 +430,7 @@ const struct c_common_resword c_common_reswords[] = { "__bases", RID_BASES, D_CXXONLY }, { "__builtin_choose_expr", RID_CHOOSE_EXPR, D_CONLY }, { "__builtin_complex", RID_BUILTIN_COMPLEX, D_CONLY }, - { "__builtin_shuffle", RID_BUILTIN_SHUFFLE, D_CONLY }, + { "__builtin_shuffle", RID_BUILTIN_SHUFFLE, 0 }, { "__builtin_offsetof", RID_OFFSETOF, 0 }, { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, D_CONLY }, { "__builtin_va_arg", RID_VA_ARG, 0 }, @@ -1950,6 +1950,101 @@ vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note) return false; } +/* Build a VEC_PERM_EXPR if V0, V1 and MASK are not error_mark_nodes + and have vector types, V0 has the same type as V1, and the number of + elements of V0, V1, MASK is the same. + + In case V1 is a NULL_TREE it is assumed that __builtin_shuffle was + called with two arguments. In this case implementation passes the + first argument twice in order to share the same tree code. This fact + could enable the mask-values being twice the vector length. This is + an implementation accident and this semantics is not guaranteed to + the user. */ +tree +c_build_vec_perm_expr (location_t loc, tree v0, tree v1, tree mask) +{ + tree ret; + bool wrap = true; + bool maybe_const = false; + bool two_arguments = false; + + if (v1 == NULL_TREE) + { + two_arguments = true; + v1 = v0; + } + + if (v0 == error_mark_node || v1 == error_mark_node + || mask == error_mark_node) + return error_mark_node; + + if (TREE_CODE (TREE_TYPE (mask)) != VECTOR_TYPE + || TREE_CODE (TREE_TYPE (TREE_TYPE (mask))) != INTEGER_TYPE) + { + error_at (loc, "__builtin_shuffle last argument must " + "be an integer vector"); + return error_mark_node; + } + + if (TREE_CODE (TREE_TYPE (v0)) != VECTOR_TYPE + || TREE_CODE (TREE_TYPE (v1)) != VECTOR_TYPE) + { + error_at (loc, "__builtin_shuffle arguments must be vectors"); + return error_mark_node; + } + + if (TYPE_MAIN_VARIANT (TREE_TYPE (v0)) != TYPE_MAIN_VARIANT (TREE_TYPE (v1))) + { + error_at (loc, "__builtin_shuffle argument vectors must be of " + "the same type"); + return error_mark_node; + } + + if (TYPE_VECTOR_SUBPARTS (TREE_TYPE (v0)) + != TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask)) + && TYPE_VECTOR_SUBPARTS (TREE_TYPE (v1)) + != TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask))) + { + error_at (loc, "__builtin_shuffle number of elements of the " + "argument vector(s) and the mask vector should " + "be the same"); + return error_mark_node; + } + + if (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (v0)))) + != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (mask))))) + { + error_at (loc, "__builtin_shuffle argument vector(s) inner type " + "must have the same size as inner type of the mask"); + return error_mark_node; + } + + if (!c_dialect_cxx ()) + { + /* Avoid C_MAYBE_CONST_EXPRs inside VEC_PERM_EXPR. */ + v0 = c_fully_fold (v0, false, &maybe_const); + wrap &= maybe_const; + + if (two_arguments) + v1 = v0 = save_expr (v0); + else + { + v1 = c_fully_fold (v1, false, &maybe_const); + wrap &= maybe_const; + } + + mask = c_fully_fold (mask, false, &maybe_const); + wrap &= maybe_const; + } + + ret = build3_loc (loc, VEC_PERM_EXPR, TREE_TYPE (v0), v0, v1, mask); + + if (!c_dialect_cxx () && !wrap) + ret = c_wrap_maybe_const (ret, true); + + return ret; +} + /* Like tree.c:get_narrower, but retain conversion from C++0x scoped enum to integral type. */ diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index c8e6ce19577..fea41dd1ed9 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -919,6 +919,7 @@ extern bool lvalue_p (const_tree); extern bool vector_targets_convertible_p (const_tree t1, const_tree t2); extern bool vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note); +extern tree c_build_vec_perm_expr (location_t, tree, tree, tree); extern rtx c_expand_expr (tree, rtx, enum machine_mode, int, rtx *); diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 8541747a339..145df357af9 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -645,7 +645,6 @@ extern tree c_finish_omp_task (location_t, tree, tree); extern tree c_finish_omp_clauses (tree); extern tree c_build_va_arg (location_t, tree, tree); extern tree c_finish_transaction (location_t, tree, int); -extern tree c_build_vec_perm_expr (location_t, tree, tree, tree); /* Set to 0 at beginning of a function definition, set to 1 if a return statement that specifies a return value is seen. */ diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 00747ebc9c3..c2f713eb02d 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2866,98 +2866,6 @@ build_function_call_vec (location_t loc, tree function, VEC(tree,gc) *params, } return require_complete_type (result); } - -/* Build a VEC_PERM_EXPR if V0, V1 and MASK are not error_mark_nodes - and have vector types, V0 has the same type as V1, and the number of - elements of V0, V1, MASK is the same. - - In case V1 is a NULL_TREE it is assumed that __builtin_shuffle was - called with two arguments. In this case implementation passes the - first argument twice in order to share the same tree code. This fact - could enable the mask-values being twice the vector length. This is - an implementation accident and this semantics is not guaranteed to - the user. */ -tree -c_build_vec_perm_expr (location_t loc, tree v0, tree v1, tree mask) -{ - tree ret; - bool wrap = true; - bool maybe_const = false; - bool two_arguments = false; - - if (v1 == NULL_TREE) - { - two_arguments = true; - v1 = v0; - } - - if (v0 == error_mark_node || v1 == error_mark_node - || mask == error_mark_node) - return error_mark_node; - - if (TREE_CODE (TREE_TYPE (mask)) != VECTOR_TYPE - || TREE_CODE (TREE_TYPE (TREE_TYPE (mask))) != INTEGER_TYPE) - { - error_at (loc, "__builtin_shuffle last argument must " - "be an integer vector"); - return error_mark_node; - } - - if (TREE_CODE (TREE_TYPE (v0)) != VECTOR_TYPE - || TREE_CODE (TREE_TYPE (v1)) != VECTOR_TYPE) - { - error_at (loc, "__builtin_shuffle arguments must be vectors"); - return error_mark_node; - } - - if (TYPE_MAIN_VARIANT (TREE_TYPE (v0)) != TYPE_MAIN_VARIANT (TREE_TYPE (v1))) - { - error_at (loc, "__builtin_shuffle argument vectors must be of " - "the same type"); - return error_mark_node; - } - - if (TYPE_VECTOR_SUBPARTS (TREE_TYPE (v0)) - != TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask)) - && TYPE_VECTOR_SUBPARTS (TREE_TYPE (v1)) - != TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask))) - { - error_at (loc, "__builtin_shuffle number of elements of the " - "argument vector(s) and the mask vector should " - "be the same"); - return error_mark_node; - } - - if (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (v0)))) - != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (mask))))) - { - error_at (loc, "__builtin_shuffle argument vector(s) inner type " - "must have the same size as inner type of the mask"); - return error_mark_node; - } - - /* Avoid C_MAYBE_CONST_EXPRs inside VEC_PERM_EXPR. */ - v0 = c_fully_fold (v0, false, &maybe_const); - wrap &= maybe_const; - - if (two_arguments) - v1 = v0 = save_expr (v0); - else - { - v1 = c_fully_fold (v1, false, &maybe_const); - wrap &= maybe_const; - } - - mask = c_fully_fold (mask, false, &maybe_const); - wrap &= maybe_const; - - ret = build3_loc (loc, VEC_PERM_EXPR, TREE_TYPE (v0), v0, v1, mask); - - if (!wrap) - ret = c_wrap_maybe_const (ret, true); - - return ret; -} /* Convert the argument expressions in the vector VALUES to the types in the list TYPELIST. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9d3fdfefa89..d033bcfbf24 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-06-15 Marc Glisse + + PR c++/51033 + * semantics.c (literal_type_p): Handle VECTOR_TYPE. + (potential_constant_expression_1): Handle VEC_PERM_EXPR. + * parser.c (cp_parser_postfix_expression): Handle RID_BUILTIN_SHUFFLE. + 2012-06-09 Jason Merrill * pt.c (tsubst_expr) [TAG_DEFN]: Instantiate local class. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 85e0322e43f..1691f81e429 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5448,6 +5448,44 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, } break; + case RID_BUILTIN_SHUFFLE: + { + VEC(tree,gc)* vec; + unsigned int i; + tree p; + location_t loc = token->location; + + cp_lexer_consume_token (parser->lexer); + vec = cp_parser_parenthesized_expression_list (parser, non_attr, + /*cast_p=*/false, /*allow_expansion_p=*/true, + /*non_constant_p=*/NULL); + if (vec == NULL) + return error_mark_node; + + FOR_EACH_VEC_ELT (tree, vec, i, p) + mark_exp_read (p); + + if (VEC_length (tree, vec) == 2) + return + c_build_vec_perm_expr + (loc, VEC_index (tree, vec, 0), + NULL_TREE, VEC_index (tree, vec, 1)); + + else if (VEC_length (tree, vec) == 3) + return + c_build_vec_perm_expr + (loc, VEC_index (tree, vec, 0), + VEC_index (tree, vec, 1), + VEC_index (tree, vec, 2)); + else + { + error_at (loc, "wrong number of arguments to " + "%<__builtin_shuffle%>"); + return error_mark_node; + } + break; + } + default: { tree type; diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index f8ad2a5884a..ee418616992 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5622,6 +5622,7 @@ bool literal_type_p (tree t) { if (SCALAR_TYPE_P (t) + || TREE_CODE (t) == VECTOR_TYPE || TREE_CODE (t) == REFERENCE_TYPE) return true; if (CLASS_TYPE_P (t)) @@ -8505,6 +8506,7 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) return true; case FMA_EXPR: + case VEC_PERM_EXPR: for (i = 0; i < 3; ++i) if (!potential_constant_expression_1 (TREE_OPERAND (t, i), true, flags)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8678626f8b1..a81b00121ce 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,26 @@ +2012-06-15 Ramana Radhakrishnan + + PR c++/51033 + * c-c++-common/torture/vshuf-16.inc: Move from gcc.c-torture/execute/. + * c-c++-common/torture/vshuf-2.inc: Likewise. + * c-c++-common/torture/vshuf-4.inc: Likewise. + * c-c++-common/torture/vshuf-8.inc: Likewise. + * c-c++-common/torture/vshuf-main.inc: Likewise. + * c-c++-common/torture/vshuf-v16hi.c: Likewise. + * c-c++-common/torture/vshuf-v16qi.c: Likewise. + * c-c++-common/torture/vshuf-v2df.c: Likewise. + * c-c++-common/torture/vshuf-v2di.c: Likewise. + * c-c++-common/torture/vshuf-v2sf.c: Likewise. + * c-c++-common/torture/vshuf-v2si.c: Likewise. + * c-c++-common/torture/vshuf-v4df.c: Likewise. + * c-c++-common/torture/vshuf-v4di.c: Likewise. + * c-c++-common/torture/vshuf-v4hi.c: Likewise. + * c-c++-common/torture/vshuf-v4sf.c: Likewise. + * c-c++-common/torture/vshuf-v4si.c: Likewise. + * c-c++-common/torture/vshuf-v8hi.c: Likewise. + * c-c++-common/torture/vshuf-v8qi.c: Likewise. + * c-c++-common/torture/vshuf-v8si.c: Likewise. + 2012-06-15 Michael Matz * gcc.dg/tree-ssa/vector-4.c: New test. diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-16.inc b/gcc/testsuite/c-c++-common/torture/vshuf-16.inc new file mode 100644 index 00000000000..68f2646d860 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-16.inc @@ -0,0 +1,81 @@ +/* Test fragment for vectors with 16 elements. */ + +#ifndef UNSUPPORTED + +struct S +{ + V in; + VI mask; + V out; +}; + +struct S tests[] = { + { + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, }, + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + }, + { + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + { 0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87, + 0x98, 0xa9, 0xba, 0xcb, 0xdc, 0xed, 0xfe, 0xff }, + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + }, + { + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }, + }, + { + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15 }, + { 1, 3, 5, 7, 9, 11, 13, 15, 2, 4, 6, 8, 10, 12, 14, 16 }, + }, + { + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, + { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }, + }, +}; + +struct S2 +{ + V in1, in2; + VI mask; + V out; +}; + +struct S2 tests2[] = { + { + { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, + { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, + }, + { + { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, + { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, + }, + { + { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, + { 7, 6, 5, 4, 16, 17, 18, 19, 31, 30, 29, 28, 3, 2, 1, 0 }, + { 17, 16, 15, 14, 30, 31, 32, 33, 45, 44, 43, 42, 13, 12, 11, 10 }, + }, + { + { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }, + }, + { + { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, + { 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }, + { 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 }, + }, +}; + +#endif diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-2.inc b/gcc/testsuite/c-c++-common/torture/vshuf-2.inc new file mode 100644 index 00000000000..ef778e59418 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-2.inc @@ -0,0 +1,38 @@ +/* Test fragment for vectors of 2 elements. */ + +#ifndef UNSUPPORTED + +struct S +{ + V in; + VI mask; + V out; +}; + +struct S tests[] = { + { { A, B }, { 0, 1 }, { A, B } }, + { { A, B }, { -16, -1 }, { A, B } }, + { { A, B }, { 1, 0 }, { B, A } }, + { { A, B }, { 0, 0 }, { A, A } }, + { { X, Y }, { 1, 1 }, { Y, Y } }, + { { X, Y }, { 1, 0 }, { Y, X } }, +}; + +struct S2 +{ + V in1, in2; + VI mask; + V out; +}; + +struct S2 tests2[] = { + { { A, B }, { X, Y }, { 0, 1 }, { A, B } }, + { { A, B }, { X, Y }, { 2, 3 }, { X, Y } }, + { { A, B }, { X, Y }, { 0, 2 }, { A, X } }, + { { A, B }, { X, Y }, { 2, 1 }, { X, B } }, + { { A, B }, { X, Y }, { 3, 0 }, { Y, A } }, + { { A, B }, { X, Y }, { 0, 0 }, { A, A } }, + { { A, B }, { X, Y }, { 3, 3 }, { Y, Y } }, +}; + +#endif diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-4.inc b/gcc/testsuite/c-c++-common/torture/vshuf-4.inc new file mode 100644 index 00000000000..d6e6e102295 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-4.inc @@ -0,0 +1,39 @@ +/* Test fragment for vectors of 4 elements. */ + +#ifndef UNSUPPORTED + +struct S +{ + V in; + VI mask; + V out; +}; + +struct S tests[] = { + { { A, B, C, D }, { 0, 1, 2, 3 }, { A, B, C, D }, }, + { { A, B, C, D }, { 0+1*4, 1+2*4, 2+3*4, 3+4*4 }, { A, B, C, D } }, + { { A, B, C, D }, { 3, 2, 1, 0 }, { D, C, B, A } }, + { { A, B, C, D }, { 0, 3, 2, 1 }, { A, D, C, B } }, + { { A, B, C, D }, { 0, 2, 1, 3 }, { A, C, B, D } }, + { { W, X, Y, Z }, { 3, 1, 2, 0 }, { Z, X, Y, W } }, + { { W, X, Y, Z }, { 0, 0, 0, 0 }, { W, W, W, W } }, + { { W, X, Y, Z }, { 1, 2, 1, 2 }, { X, Y, X, Y } }, +}; + +struct S2 +{ + V in1, in2; + VI mask; + V out; +}; + +struct S2 tests2[] = { + { { A, B, C, D }, { W, X, Y, Z }, { 0, 1, 2, 3 }, { A, B, C, D } }, + { { A, B, C, D }, { W, X, Y, Z }, { 4, 5, 6, 7 }, { W, X, Y, Z } }, + { { A, B, C, D }, { W, X, Y, Z }, { 0, 4, 1, 5 }, { A, W, B, X } }, + { { A, B, C, D }, { W, X, Y, Z }, { 0, 7, 4, 3 }, { A, Z, W, D } }, + { { A, B, C, D }, { W, X, Y, Z }, { 0, 0, 0, 0 }, { A, A, A, A } }, + { { A, B, C, D }, { W, X, Y, Z }, { 7, 7, 7, 7 }, { Z, Z, Z, Z } }, +}; + +#endif diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-8.inc b/gcc/testsuite/c-c++-common/torture/vshuf-8.inc new file mode 100644 index 00000000000..e6475226a11 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-8.inc @@ -0,0 +1,101 @@ +/* Test fragment for vectors of 8 elements. */ + +#ifndef UNSUPPORTED + +struct S +{ + V in; + VI mask; + V out; +}; + +struct S tests[] = { + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { A1, B1, C1, D1, E1, F1, G1, H1 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { 0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87 }, + { A1, B1, C1, D1, E1, F1, G1, H1 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { 7, 6, 5, 4, 3, 2, 1, 0 }, + { H1, G1, F1, E1, D1, C1, B1, A1 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { 7, 0, 5, 3, 2, 4, 1, 6 }, + { H1, A1, F1, D1, C1, E1, B1, G1 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { 0, 2, 1, 3, 4, 6, 5, 7 }, + { A1, C1, B1, D1, E1, G1, F1, H1 }, + }, + { + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 3, 1, 2, 0, 7, 5, 6, 4 }, + { D2, B2, C2, A2, H2, F2, G2, E2 }, + }, + { + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 0, 0, 0, 0 }, + { A2, A2, A2, A2, A2, A2, A2, A2 }, + }, + { + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 1, 6, 1, 6, 1, 6, 1, 6 }, + { B2, G2, B2, G2, B2, G2, B2, G2 }, + } +}; + +struct S2 +{ + V in1, in2; + VI mask; + V out; +}; + +struct S2 tests2[] = { + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { A1, B1, C1, D1, E1, F1, G1, H1 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 8, 9, 10, 11, 12, 13, 14, 15 }, + { A2, B2, C2, D2, E2, F2, G2, H2 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 0, 8, 1, 9, 2, 10, 3, 11 }, + { A1, A2, B1, B2, C1, C2, D1, D2 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 0, 15, 4, 11, 12, 3, 7, 8 }, + { A1, H2, E1, D2, E2, D1, H1, A2 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { A1, A1, A1, A1, A1, A1, A1, A1 }, + }, + { + { A1, B1, C1, D1, E1, F1, G1, H1 }, + { A2, B2, C2, D2, E2, F2, G2, H2 }, + { 0x1e, 0x2e, 0x3e, 0x4e, 0x5e, 0x6e, 0x7e, 0x8e }, + { G2, G2, G2, G2, G2, G2, G2, G2 }, + }, +}; + +#endif diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-main.inc b/gcc/testsuite/c-c++-common/torture/vshuf-main.inc new file mode 100644 index 00000000000..8487131b12d --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-main.inc @@ -0,0 +1,26 @@ +/* Driver fragment for __builtin_shuffle of any vector shape. */ + +extern void abort(void); + +int main() +{ +#ifndef UNSUPPORTED + int i; + + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) + { + V r = __builtin_shuffle(tests[i].in, tests[i].mask); + if (__builtin_memcmp(&r, &tests[i].out, sizeof(V)) != 0) + abort(); + } + + for (i = 0; i < sizeof(tests2)/sizeof(tests2[0]); ++i) + { + V r = __builtin_shuffle(tests2[i].in1, tests2[i].in2, tests2[i].mask); + if (__builtin_memcmp(&r, &tests2[i].out, sizeof(V)) != 0) + abort(); + } +#endif + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v16hi.c b/gcc/testsuite/c-c++-common/torture/vshuf-v16hi.c new file mode 100644 index 00000000000..98b329dbf91 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v16hi.c @@ -0,0 +1,5 @@ +typedef unsigned short V __attribute__((vector_size(32))); +typedef V VI; + +#include "vshuf-16.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v16qi.c b/gcc/testsuite/c-c++-common/torture/vshuf-v16qi.c new file mode 100644 index 00000000000..dcd1de1e646 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v16qi.c @@ -0,0 +1,5 @@ +typedef unsigned char V __attribute__((vector_size(16))); +typedef V VI; + +#include "vshuf-16.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v2df.c b/gcc/testsuite/c-c++-common/torture/vshuf-v2df.c new file mode 100644 index 00000000000..e88ec08ddf6 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v2df.c @@ -0,0 +1,15 @@ +#if __SIZEOF_DOUBLE__ == 8 && __SIZEOF_LONG_LONG__ == 8 +typedef double V __attribute__((vector_size(16))); +typedef unsigned long long VI __attribute__((vector_size(16))); +#else +#define UNSUPPORTED +#endif + +#define A 0.69314718055994530942 +#define B 2.7182818284590452354 + +#define X 3.14159265358979323846 +#define Y 1.41421356237309504880 + +#include "vshuf-2.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v2di.c b/gcc/testsuite/c-c++-common/torture/vshuf-v2di.c new file mode 100644 index 00000000000..0985a0de02a --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v2di.c @@ -0,0 +1,15 @@ +#if __SIZEOF_LONG_LONG__ == 8 +typedef unsigned long long V __attribute__((vector_size(16))); +typedef V VI; +#else +#define UNSUPPORTED +#endif + +#define A 0x1112131415161718 +#define B 0x2122232425262728 + +#define X 0xc1c2c3c4c5c6c7c8 +#define Y 0xd1d2d3d4d5d6d7d8 + +#include "vshuf-2.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v2sf.c b/gcc/testsuite/c-c++-common/torture/vshuf-v2sf.c new file mode 100644 index 00000000000..f9c40b22391 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v2sf.c @@ -0,0 +1,21 @@ +#if __SIZEOF_FLOAT__ == 4 +typedef float V __attribute__((vector_size(8))); +# if __SIZEOF_INT__ == 4 +typedef unsigned int VI __attribute__((vector_size(8))); +# elif __SIZEOF_LONG__ == 4 +typedef unsigned long VI __attribute__((vector_size(8))); +# else +# define UNSUPPORTED +# endif +#else +# define UNSUPPORTED +#endif + +#define A 0.69314718055994530942f +#define B 2.7182818284590452354f + +#define X 3.14159265358979323846f +#define Y 1.41421356237309504880f + +#include "vshuf-2.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v2si.c b/gcc/testsuite/c-c++-common/torture/vshuf-v2si.c new file mode 100644 index 00000000000..414743c892f --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v2si.c @@ -0,0 +1,18 @@ +#if __SIZEOF_INT__ == 4 +typedef unsigned int V __attribute__((vector_size(8))); +typedef V VI; +#elif __SIZEOF_LONG__ == 4 +typedef unsigned long V __attribute__((vector_size(8))); +typedef V VI; +#else +#define UNSUPPORTED +#endif + +#define A 0x11121314 +#define B 0x21222324 + +#define X 0xd1d2d3d4 +#define Y 0xe1e2e3e4 + +#include "vshuf-2.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v4df.c b/gcc/testsuite/c-c++-common/torture/vshuf-v4df.c new file mode 100644 index 00000000000..c4030a7dbab --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v4df.c @@ -0,0 +1,19 @@ +#if __SIZEOF_DOUBLE__ == 8 && __SIZEOF_LONG_LONG__ == 8 +typedef double V __attribute__((vector_size(32))); +typedef unsigned long long VI __attribute__((vector_size(32))); +#else +#define UNSUPPORTED +#endif + +#define A 0.69314718055994530942 +#define B 2.7182818284590452354 +#define C 2.30258509299404568402 +#define D 1.4426950408889634074 + +#define W 0.31830988618379067154 +#define X 3.14159265358979323846 +#define Y 1.41421356237309504880 +#define Z 0.70710678118654752440 + +#include "vshuf-4.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v4di.c b/gcc/testsuite/c-c++-common/torture/vshuf-v4di.c new file mode 100644 index 00000000000..a84aebefb6d --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v4di.c @@ -0,0 +1,19 @@ +#if __SIZEOF_LONG_LONG__ == 8 +typedef unsigned long long V __attribute__((vector_size(32))); +typedef V VI; +#else +#define UNSUPPORTED +#endif + +#define A 0x1112131415161718 +#define B 0x2122232425262728 +#define C 0x3132333435363738 +#define D 0x4142434445464748 + +#define W 0xc1c2c3c4c5c6c7c8 +#define X 0xd1d2d3d4d5d6d7d8 +#define Y 0xe1e2e3e4e5e6e7e8 +#define Z 0xf1f2f3f4f5f6f7f8 + +#include "vshuf-4.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v4hi.c b/gcc/testsuite/c-c++-common/torture/vshuf-v4hi.c new file mode 100644 index 00000000000..64a2bb4ac82 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v4hi.c @@ -0,0 +1,15 @@ +typedef unsigned short V __attribute__((vector_size(8))); +typedef V VI; + +#define A 0x1112 +#define B 0x2122 +#define C 0x3132 +#define D 0x4142 + +#define W 0xc1c2 +#define X 0xd1d2 +#define Y 0xe1e2 +#define Z 0xf1f2 + +#include "vshuf-4.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v4sf.c b/gcc/testsuite/c-c++-common/torture/vshuf-v4sf.c new file mode 100644 index 00000000000..283672560a3 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v4sf.c @@ -0,0 +1,25 @@ +#if __SIZEOF_FLOAT__ == 4 +typedef float V __attribute__((vector_size(16))); +# if __SIZEOF_INT__ == 4 +typedef unsigned int VI __attribute__((vector_size(16))); +# elif __SIZEOF_LONG__ == 4 +typedef unsigned long VI __attribute__((vector_size(16))); +# else +# define UNSUPPORTED +# endif +#else +# define UNSUPPORTED +#endif + +#define A 0.69314718055994530942f +#define B 2.7182818284590452354f +#define C 2.30258509299404568402f +#define D 1.4426950408889634074f + +#define W 0.31830988618379067154f +#define X 3.14159265358979323846f +#define Y 1.41421356237309504880f +#define Z 0.70710678118654752440f + +#include "vshuf-4.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v4si.c b/gcc/testsuite/c-c++-common/torture/vshuf-v4si.c new file mode 100644 index 00000000000..289ec1b5016 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v4si.c @@ -0,0 +1,22 @@ +#if __SIZEOF_INT__ == 4 +typedef unsigned int V __attribute__((vector_size(16))); +typedef V VI; +#elif __SIZEOF_LONG__ == 4 +typedef unsigned long V __attribute__((vector_size(16))); +typedef V VI; +#else +# define UNSUPPORTED +#endif + +#define A 0x11121314 +#define B 0x21222324 +#define C 0x31323334 +#define D 0x41424344 + +#define W 0xc1c2c3c4 +#define X 0xd1d2d3d4 +#define Y 0xe1e2e3e4 +#define Z 0xf1f2f3f4 + +#include "vshuf-4.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v8hi.c b/gcc/testsuite/c-c++-common/torture/vshuf-v8hi.c new file mode 100644 index 00000000000..ce442c5d995 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v8hi.c @@ -0,0 +1,23 @@ +typedef unsigned short V __attribute__((vector_size(16))); +typedef V VI; + +#define A1 0x1112 +#define B1 0x2122 +#define C1 0x3132 +#define D1 0x4142 +#define E1 0x5152 +#define F1 0x6162 +#define G1 0x7172 +#define H1 0x8182 + +#define A2 0x9192 +#define B2 0xa1a2 +#define C2 0xb1b2 +#define D2 0xc1c2 +#define E2 0xd1d2 +#define F2 0xe1e2 +#define G2 0xf1f2 +#define H2 0x0102 + +#include "vshuf-8.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v8qi.c b/gcc/testsuite/c-c++-common/torture/vshuf-v8qi.c new file mode 100644 index 00000000000..349ec6db699 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v8qi.c @@ -0,0 +1,23 @@ +typedef unsigned char V __attribute__((vector_size(8))); +typedef V VI; + +#define A1 0x11 +#define B1 0x12 +#define C1 0x13 +#define D1 0x14 +#define E1 0x15 +#define F1 0x16 +#define G1 0x17 +#define H1 0x18 + +#define A2 0xf1 +#define B2 0xf2 +#define C2 0xf3 +#define D2 0xf4 +#define E2 0xf5 +#define F2 0xf6 +#define G2 0xf7 +#define H2 0xf8 + +#include "vshuf-8.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/c-c++-common/torture/vshuf-v8si.c b/gcc/testsuite/c-c++-common/torture/vshuf-v8si.c new file mode 100644 index 00000000000..5b0a2c33e2c --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/vshuf-v8si.c @@ -0,0 +1,30 @@ +#if __SIZEOF_INT__ == 4 +typedef unsigned int V __attribute__((vector_size(32))); +typedef V VI; +#elif __SIZEOF_LONG__ == 4 +typedef unsigned long V __attribute__((vector_size(32))); +typedef V VI; +#else +# define UNSUPPORTED +#endif + +#define A1 0x11121314 +#define B1 0x21222324 +#define C1 0x31323334 +#define D1 0x41424344 +#define E1 0x51525354 +#define F1 0x61626364 +#define G1 0x71727374 +#define H1 0x81828384 + +#define A2 0x91929394 +#define B2 0xa1a2a3a4 +#define C2 0xb1b2b3b4 +#define D2 0xc1c2c3c4 +#define E2 0xd1d2d3d4 +#define F2 0xe1e2e3e4 +#define G2 0xf1f2f3f4 +#define H2 0x01020304 + +#include "vshuf-8.inc" +#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-16.inc b/gcc/testsuite/gcc.c-torture/execute/vshuf-16.inc deleted file mode 100644 index 68f2646d860..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-16.inc +++ /dev/null @@ -1,81 +0,0 @@ -/* Test fragment for vectors with 16 elements. */ - -#ifndef UNSUPPORTED - -struct S -{ - V in; - VI mask; - V out; -}; - -struct S tests[] = { - { - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, }, - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, - }, - { - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, - { 0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87, - 0x98, 0xa9, 0xba, 0xcb, 0xdc, 0xed, 0xfe, 0xff }, - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, - }, - { - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, - { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, - { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }, - }, - { - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, - { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15 }, - { 1, 3, 5, 7, 9, 11, 13, 15, 2, 4, 6, 8, 10, 12, 14, 16 }, - }, - { - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, - { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }, - }, -}; - -struct S2 -{ - V in1, in2; - VI mask; - V out; -}; - -struct S2 tests2[] = { - { - { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, - { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, - }, - { - { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, - { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, - }, - { - { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, - { 7, 6, 5, 4, 16, 17, 18, 19, 31, 30, 29, 28, 3, 2, 1, 0 }, - { 17, 16, 15, 14, 30, 31, 32, 33, 45, 44, 43, 42, 13, 12, 11, 10 }, - }, - { - { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }, - }, - { - { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }, - { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 }, - { 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }, - { 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 }, - }, -}; - -#endif diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-2.inc b/gcc/testsuite/gcc.c-torture/execute/vshuf-2.inc deleted file mode 100644 index ef778e59418..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-2.inc +++ /dev/null @@ -1,38 +0,0 @@ -/* Test fragment for vectors of 2 elements. */ - -#ifndef UNSUPPORTED - -struct S -{ - V in; - VI mask; - V out; -}; - -struct S tests[] = { - { { A, B }, { 0, 1 }, { A, B } }, - { { A, B }, { -16, -1 }, { A, B } }, - { { A, B }, { 1, 0 }, { B, A } }, - { { A, B }, { 0, 0 }, { A, A } }, - { { X, Y }, { 1, 1 }, { Y, Y } }, - { { X, Y }, { 1, 0 }, { Y, X } }, -}; - -struct S2 -{ - V in1, in2; - VI mask; - V out; -}; - -struct S2 tests2[] = { - { { A, B }, { X, Y }, { 0, 1 }, { A, B } }, - { { A, B }, { X, Y }, { 2, 3 }, { X, Y } }, - { { A, B }, { X, Y }, { 0, 2 }, { A, X } }, - { { A, B }, { X, Y }, { 2, 1 }, { X, B } }, - { { A, B }, { X, Y }, { 3, 0 }, { Y, A } }, - { { A, B }, { X, Y }, { 0, 0 }, { A, A } }, - { { A, B }, { X, Y }, { 3, 3 }, { Y, Y } }, -}; - -#endif diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-4.inc b/gcc/testsuite/gcc.c-torture/execute/vshuf-4.inc deleted file mode 100644 index d6e6e102295..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-4.inc +++ /dev/null @@ -1,39 +0,0 @@ -/* Test fragment for vectors of 4 elements. */ - -#ifndef UNSUPPORTED - -struct S -{ - V in; - VI mask; - V out; -}; - -struct S tests[] = { - { { A, B, C, D }, { 0, 1, 2, 3 }, { A, B, C, D }, }, - { { A, B, C, D }, { 0+1*4, 1+2*4, 2+3*4, 3+4*4 }, { A, B, C, D } }, - { { A, B, C, D }, { 3, 2, 1, 0 }, { D, C, B, A } }, - { { A, B, C, D }, { 0, 3, 2, 1 }, { A, D, C, B } }, - { { A, B, C, D }, { 0, 2, 1, 3 }, { A, C, B, D } }, - { { W, X, Y, Z }, { 3, 1, 2, 0 }, { Z, X, Y, W } }, - { { W, X, Y, Z }, { 0, 0, 0, 0 }, { W, W, W, W } }, - { { W, X, Y, Z }, { 1, 2, 1, 2 }, { X, Y, X, Y } }, -}; - -struct S2 -{ - V in1, in2; - VI mask; - V out; -}; - -struct S2 tests2[] = { - { { A, B, C, D }, { W, X, Y, Z }, { 0, 1, 2, 3 }, { A, B, C, D } }, - { { A, B, C, D }, { W, X, Y, Z }, { 4, 5, 6, 7 }, { W, X, Y, Z } }, - { { A, B, C, D }, { W, X, Y, Z }, { 0, 4, 1, 5 }, { A, W, B, X } }, - { { A, B, C, D }, { W, X, Y, Z }, { 0, 7, 4, 3 }, { A, Z, W, D } }, - { { A, B, C, D }, { W, X, Y, Z }, { 0, 0, 0, 0 }, { A, A, A, A } }, - { { A, B, C, D }, { W, X, Y, Z }, { 7, 7, 7, 7 }, { Z, Z, Z, Z } }, -}; - -#endif diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-8.inc b/gcc/testsuite/gcc.c-torture/execute/vshuf-8.inc deleted file mode 100644 index e6475226a11..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-8.inc +++ /dev/null @@ -1,101 +0,0 @@ -/* Test fragment for vectors of 8 elements. */ - -#ifndef UNSUPPORTED - -struct S -{ - V in; - VI mask; - V out; -}; - -struct S tests[] = { - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { A1, B1, C1, D1, E1, F1, G1, H1 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { 0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87 }, - { A1, B1, C1, D1, E1, F1, G1, H1 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { 7, 6, 5, 4, 3, 2, 1, 0 }, - { H1, G1, F1, E1, D1, C1, B1, A1 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { 7, 0, 5, 3, 2, 4, 1, 6 }, - { H1, A1, F1, D1, C1, E1, B1, G1 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { 0, 2, 1, 3, 4, 6, 5, 7 }, - { A1, C1, B1, D1, E1, G1, F1, H1 }, - }, - { - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 3, 1, 2, 0, 7, 5, 6, 4 }, - { D2, B2, C2, A2, H2, F2, G2, E2 }, - }, - { - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 0, 0, 0, 0 }, - { A2, A2, A2, A2, A2, A2, A2, A2 }, - }, - { - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 1, 6, 1, 6, 1, 6, 1, 6 }, - { B2, G2, B2, G2, B2, G2, B2, G2 }, - } -}; - -struct S2 -{ - V in1, in2; - VI mask; - V out; -}; - -struct S2 tests2[] = { - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { A1, B1, C1, D1, E1, F1, G1, H1 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 8, 9, 10, 11, 12, 13, 14, 15 }, - { A2, B2, C2, D2, E2, F2, G2, H2 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 0, 8, 1, 9, 2, 10, 3, 11 }, - { A1, A2, B1, B2, C1, C2, D1, D2 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 0, 15, 4, 11, 12, 3, 7, 8 }, - { A1, H2, E1, D2, E2, D1, H1, A2 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 0, 0, 0, 0, 0, 0, 0, 0 }, - { A1, A1, A1, A1, A1, A1, A1, A1 }, - }, - { - { A1, B1, C1, D1, E1, F1, G1, H1 }, - { A2, B2, C2, D2, E2, F2, G2, H2 }, - { 0x1e, 0x2e, 0x3e, 0x4e, 0x5e, 0x6e, 0x7e, 0x8e }, - { G2, G2, G2, G2, G2, G2, G2, G2 }, - }, -}; - -#endif diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-main.inc b/gcc/testsuite/gcc.c-torture/execute/vshuf-main.inc deleted file mode 100644 index 8487131b12d..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-main.inc +++ /dev/null @@ -1,26 +0,0 @@ -/* Driver fragment for __builtin_shuffle of any vector shape. */ - -extern void abort(void); - -int main() -{ -#ifndef UNSUPPORTED - int i; - - for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) - { - V r = __builtin_shuffle(tests[i].in, tests[i].mask); - if (__builtin_memcmp(&r, &tests[i].out, sizeof(V)) != 0) - abort(); - } - - for (i = 0; i < sizeof(tests2)/sizeof(tests2[0]); ++i) - { - V r = __builtin_shuffle(tests2[i].in1, tests2[i].in2, tests2[i].mask); - if (__builtin_memcmp(&r, &tests2[i].out, sizeof(V)) != 0) - abort(); - } -#endif - - return 0; -} diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v16hi.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v16hi.c deleted file mode 100644 index 98b329dbf91..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v16hi.c +++ /dev/null @@ -1,5 +0,0 @@ -typedef unsigned short V __attribute__((vector_size(32))); -typedef V VI; - -#include "vshuf-16.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v16qi.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v16qi.c deleted file mode 100644 index dcd1de1e646..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v16qi.c +++ /dev/null @@ -1,5 +0,0 @@ -typedef unsigned char V __attribute__((vector_size(16))); -typedef V VI; - -#include "vshuf-16.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v2df.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v2df.c deleted file mode 100644 index e88ec08ddf6..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v2df.c +++ /dev/null @@ -1,15 +0,0 @@ -#if __SIZEOF_DOUBLE__ == 8 && __SIZEOF_LONG_LONG__ == 8 -typedef double V __attribute__((vector_size(16))); -typedef unsigned long long VI __attribute__((vector_size(16))); -#else -#define UNSUPPORTED -#endif - -#define A 0.69314718055994530942 -#define B 2.7182818284590452354 - -#define X 3.14159265358979323846 -#define Y 1.41421356237309504880 - -#include "vshuf-2.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v2di.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v2di.c deleted file mode 100644 index 0985a0de02a..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v2di.c +++ /dev/null @@ -1,15 +0,0 @@ -#if __SIZEOF_LONG_LONG__ == 8 -typedef unsigned long long V __attribute__((vector_size(16))); -typedef V VI; -#else -#define UNSUPPORTED -#endif - -#define A 0x1112131415161718 -#define B 0x2122232425262728 - -#define X 0xc1c2c3c4c5c6c7c8 -#define Y 0xd1d2d3d4d5d6d7d8 - -#include "vshuf-2.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v2sf.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v2sf.c deleted file mode 100644 index f9c40b22391..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v2sf.c +++ /dev/null @@ -1,21 +0,0 @@ -#if __SIZEOF_FLOAT__ == 4 -typedef float V __attribute__((vector_size(8))); -# if __SIZEOF_INT__ == 4 -typedef unsigned int VI __attribute__((vector_size(8))); -# elif __SIZEOF_LONG__ == 4 -typedef unsigned long VI __attribute__((vector_size(8))); -# else -# define UNSUPPORTED -# endif -#else -# define UNSUPPORTED -#endif - -#define A 0.69314718055994530942f -#define B 2.7182818284590452354f - -#define X 3.14159265358979323846f -#define Y 1.41421356237309504880f - -#include "vshuf-2.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v2si.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v2si.c deleted file mode 100644 index 414743c892f..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v2si.c +++ /dev/null @@ -1,18 +0,0 @@ -#if __SIZEOF_INT__ == 4 -typedef unsigned int V __attribute__((vector_size(8))); -typedef V VI; -#elif __SIZEOF_LONG__ == 4 -typedef unsigned long V __attribute__((vector_size(8))); -typedef V VI; -#else -#define UNSUPPORTED -#endif - -#define A 0x11121314 -#define B 0x21222324 - -#define X 0xd1d2d3d4 -#define Y 0xe1e2e3e4 - -#include "vshuf-2.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4df.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v4df.c deleted file mode 100644 index c4030a7dbab..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4df.c +++ /dev/null @@ -1,19 +0,0 @@ -#if __SIZEOF_DOUBLE__ == 8 && __SIZEOF_LONG_LONG__ == 8 -typedef double V __attribute__((vector_size(32))); -typedef unsigned long long VI __attribute__((vector_size(32))); -#else -#define UNSUPPORTED -#endif - -#define A 0.69314718055994530942 -#define B 2.7182818284590452354 -#define C 2.30258509299404568402 -#define D 1.4426950408889634074 - -#define W 0.31830988618379067154 -#define X 3.14159265358979323846 -#define Y 1.41421356237309504880 -#define Z 0.70710678118654752440 - -#include "vshuf-4.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4di.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v4di.c deleted file mode 100644 index a84aebefb6d..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4di.c +++ /dev/null @@ -1,19 +0,0 @@ -#if __SIZEOF_LONG_LONG__ == 8 -typedef unsigned long long V __attribute__((vector_size(32))); -typedef V VI; -#else -#define UNSUPPORTED -#endif - -#define A 0x1112131415161718 -#define B 0x2122232425262728 -#define C 0x3132333435363738 -#define D 0x4142434445464748 - -#define W 0xc1c2c3c4c5c6c7c8 -#define X 0xd1d2d3d4d5d6d7d8 -#define Y 0xe1e2e3e4e5e6e7e8 -#define Z 0xf1f2f3f4f5f6f7f8 - -#include "vshuf-4.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4hi.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v4hi.c deleted file mode 100644 index 64a2bb4ac82..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4hi.c +++ /dev/null @@ -1,15 +0,0 @@ -typedef unsigned short V __attribute__((vector_size(8))); -typedef V VI; - -#define A 0x1112 -#define B 0x2122 -#define C 0x3132 -#define D 0x4142 - -#define W 0xc1c2 -#define X 0xd1d2 -#define Y 0xe1e2 -#define Z 0xf1f2 - -#include "vshuf-4.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4sf.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v4sf.c deleted file mode 100644 index 283672560a3..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4sf.c +++ /dev/null @@ -1,25 +0,0 @@ -#if __SIZEOF_FLOAT__ == 4 -typedef float V __attribute__((vector_size(16))); -# if __SIZEOF_INT__ == 4 -typedef unsigned int VI __attribute__((vector_size(16))); -# elif __SIZEOF_LONG__ == 4 -typedef unsigned long VI __attribute__((vector_size(16))); -# else -# define UNSUPPORTED -# endif -#else -# define UNSUPPORTED -#endif - -#define A 0.69314718055994530942f -#define B 2.7182818284590452354f -#define C 2.30258509299404568402f -#define D 1.4426950408889634074f - -#define W 0.31830988618379067154f -#define X 3.14159265358979323846f -#define Y 1.41421356237309504880f -#define Z 0.70710678118654752440f - -#include "vshuf-4.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4si.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v4si.c deleted file mode 100644 index 289ec1b5016..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v4si.c +++ /dev/null @@ -1,22 +0,0 @@ -#if __SIZEOF_INT__ == 4 -typedef unsigned int V __attribute__((vector_size(16))); -typedef V VI; -#elif __SIZEOF_LONG__ == 4 -typedef unsigned long V __attribute__((vector_size(16))); -typedef V VI; -#else -# define UNSUPPORTED -#endif - -#define A 0x11121314 -#define B 0x21222324 -#define C 0x31323334 -#define D 0x41424344 - -#define W 0xc1c2c3c4 -#define X 0xd1d2d3d4 -#define Y 0xe1e2e3e4 -#define Z 0xf1f2f3f4 - -#include "vshuf-4.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v8hi.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v8hi.c deleted file mode 100644 index ce442c5d995..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v8hi.c +++ /dev/null @@ -1,23 +0,0 @@ -typedef unsigned short V __attribute__((vector_size(16))); -typedef V VI; - -#define A1 0x1112 -#define B1 0x2122 -#define C1 0x3132 -#define D1 0x4142 -#define E1 0x5152 -#define F1 0x6162 -#define G1 0x7172 -#define H1 0x8182 - -#define A2 0x9192 -#define B2 0xa1a2 -#define C2 0xb1b2 -#define D2 0xc1c2 -#define E2 0xd1d2 -#define F2 0xe1e2 -#define G2 0xf1f2 -#define H2 0x0102 - -#include "vshuf-8.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v8qi.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v8qi.c deleted file mode 100644 index 349ec6db699..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v8qi.c +++ /dev/null @@ -1,23 +0,0 @@ -typedef unsigned char V __attribute__((vector_size(8))); -typedef V VI; - -#define A1 0x11 -#define B1 0x12 -#define C1 0x13 -#define D1 0x14 -#define E1 0x15 -#define F1 0x16 -#define G1 0x17 -#define H1 0x18 - -#define A2 0xf1 -#define B2 0xf2 -#define C2 0xf3 -#define D2 0xf4 -#define E2 0xf5 -#define F2 0xf6 -#define G2 0xf7 -#define H2 0xf8 - -#include "vshuf-8.inc" -#include "vshuf-main.inc" diff --git a/gcc/testsuite/gcc.c-torture/execute/vshuf-v8si.c b/gcc/testsuite/gcc.c-torture/execute/vshuf-v8si.c deleted file mode 100644 index 5b0a2c33e2c..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/vshuf-v8si.c +++ /dev/null @@ -1,30 +0,0 @@ -#if __SIZEOF_INT__ == 4 -typedef unsigned int V __attribute__((vector_size(32))); -typedef V VI; -#elif __SIZEOF_LONG__ == 4 -typedef unsigned long V __attribute__((vector_size(32))); -typedef V VI; -#else -# define UNSUPPORTED -#endif - -#define A1 0x11121314 -#define B1 0x21222324 -#define C1 0x31323334 -#define D1 0x41424344 -#define E1 0x51525354 -#define F1 0x61626364 -#define G1 0x71727374 -#define H1 0x81828384 - -#define A2 0x91929394 -#define B2 0xa1a2a3a4 -#define C2 0xb1b2b3b4 -#define D2 0xc1c2c3c4 -#define E2 0xd1d2d3d4 -#define F2 0xe1e2e3e4 -#define G2 0xf1f2f3f4 -#define H2 0x01020304 - -#include "vshuf-8.inc" -#include "vshuf-main.inc"