From 24f68831d25bad739a6fe167a58b5b4c0c3cbf9a Mon Sep 17 00:00:00 2001 From: Carl Love Date: Wed, 29 Apr 2020 10:23:11 -0500 Subject: [PATCH] pr94833, fix vec_first_match_index for nulls gcc/ChangeLog 2020-04-30 Carl Love PR target/94833 * config/rs6000/vsx.md (define_expand): Fix instruction generation for first_match_index_. * testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c (main): Add additional test cases with zero vector elements. --- gcc/ChangeLog | 8 ++ gcc/config/rs6000/vsx.md | 4 +- .../powerpc/builtins-8-p9-runnable.c | 118 ++++++++++++++++++ 3 files changed, 128 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4082217fd35..51b5b6c908d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2020-05-18 Carl Love + + PR target/94833 + * config/rs6000/vsx.md (define_expand): Fix instruction generation for + first_match_index_. + * testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c (main): Add + additional test cases with zero vector elements. + 2020-05-18 Uroš Bizjak PR target/95169 diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index 62b4f612bb1..2a28215ac5b 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -4835,8 +4835,8 @@ rtx cmp_result = gen_reg_rtx (mode); rtx not_result = gen_reg_rtx (mode); - emit_insn (gen_vcmpnez (cmp_result, operands[1], - operands[2])); + emit_insn (gen_vcmpne (cmp_result, operands[1], + operands[2])); emit_insn (gen_one_cmpl2 (not_result, cmp_result)); sh = GET_MODE_SIZE (GET_MODE_INNER (mode)) / 2; diff --git a/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c b/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c index b2f7dc855e8..19457eebfc4 100644 --- a/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c +++ b/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c @@ -103,6 +103,31 @@ int main() { The element index in natural element order is returned for the first match or the number of elements if there is no match. */ /* char */ + char_src1 = (vector signed char) { 0x40, 0, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40 }; + + char_src2 = (vector signed char) {0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; + expected_result = 1; + + result = vec_first_match_index (char_src1, char_src2); + +#ifdef DEBUG2 + print_signed_char("src1", char_src1); + print_signed_char("src2", char_src2); + printf(" vec_first_match_index = %d\n\n", result); +#endif + + if (result != expected_result) +#ifdef DEBUG + printf("Error: char first match result (%d) does not match expected result (%d)\n", + result, expected_result); +#else + abort(); +#endif + char_src1 = (vector signed char) {-1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; char_src2 = (vector signed char) {-1, 2, 3, 20, -5, 6, 7, 8, @@ -367,6 +392,50 @@ int main() { The element index in BE order is returned for the first mismatch or the number of elements if there is no match. */ /* char */ + char_src1 = (vector signed char) {1, 2, 0, 4, -5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16}; + char_src2 = (vector signed char) {1, 2, 0, 20, -5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16}; + expected_result = 3; + + result = vec_first_mismatch_index (char_src1, char_src2); + +#ifdef DEBUG2 + print_signed_char("src1", char_src1); + print_signed_char("src2", char_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + + if (result != expected_result) +#ifdef DEBUG + printf("Error: char first mismatch result (%d) does not match expected result (%d)\n", + result, expected_result); +#else + abort(); +#endif + + char_src1 = (vector signed char) {0, 2, 3, 4, -5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16}; + char_src2 = (vector signed char) {0, 2, 3, 20, -5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16}; + expected_result = 3; + + result = vec_first_mismatch_index (char_src1, char_src2); + +#ifdef DEBUG2 + print_signed_char("src1", char_src1); + print_signed_char("src2", char_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + + if (result != expected_result) +#ifdef DEBUG + printf("Error: char first mismatch result (%d) does not match expected result (%d)\n", + result, expected_result); +#else + abort(); +#endif + char_src1 = (vector signed char) {-1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; char_src2 = (vector signed char) {-1, 2, 3, 20, -5, 6, 7, 8, @@ -673,6 +742,33 @@ int main() { The element index in BE order is returned for the first match or the number of elements if there is no match. */ /* char */ + char_src1 = (vector signed char) { 0x40, 0, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40 }; + + char_src2 = (vector signed char) { 0x41, 0, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x40, + 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40 }; + expected_result = 1; + + result = vec_first_match_or_eos_index (char_src1, char_src2); + +#ifdef DEBUG2 + print_signed_char("src1", char_src1); + print_signed_char("src2", char_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + + if (result != expected_result) +#ifdef DEBUG + printf("Error: char first match result (%d) does not match expected result (%d)\n", + result, expected_result); +#else + abort(); +#endif + char_src1 = (vector signed char) {-1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; char_src2 = (vector signed char) {-1, 2, 3, 20, -5, 6, 7, 8, @@ -1065,6 +1161,28 @@ int main() { The element index in BE order is returned for the first mismatch or the number of elements if there is no match. */ /* char */ + char_src1 = (vector signed char) {1, 2, 0, 4, -5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16}; + char_src2 = (vector signed char) {1, 2, 0, 20, -5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16}; + expected_result = 2; + + result = vec_first_mismatch_or_eos_index (char_src1, char_src2); + +#ifdef DEBUG2 + print_signed_char("src1", char_src1); + print_signed_char("src2", char_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + + if (result != expected_result) +#ifdef DEBUG + printf("Error: char first mismatch or EOS result (%d) does not match expected result (%d)\n", + result, expected_result); +#else + abort(); +#endif + char_src1 = (vector signed char) {-1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; char_src2 = (vector signed char) {-1, 2, 3, 20, -5, 6, 7, 8, -- 2.30.2