GCC Maintainers: The Power 9 builtins first_match_index, first_match_or_eos_index, first_mismatch_index, first_mismatch_or_eos_index work for LE only. The following patch adds BE support to each of the builtins. Additional debug print statements were added to the test case to aid in verifying the results.
The patch was tested on: powerpc64le-unknown-linux-gnu (Power 8 LE) powerpc64le-unknown-linux-gnu (Power 9 LE) powerpc64-unknown-linux-gnu (Power 8 BE) With no regressions. Currently, there are no Power 9 BE systems to test the patch on. The test file was compiled on a Power 8 BE system and then the generated binary file was examined via objdump to see that the desired instruction was generated. Please let me know if the patch looks OK for GCC mainline. Carl Love --------------------------------------------------------------------- gcc/ChangeLog: 2018-06-04 Carl Love <c...@us.ibm.com> * gcc/config/rs6000/vsx.md (first_match_index_<mode>): Calculate index using natureal element order. (first_match_or_eos_index_<mode>): Calculate index using natural element order. (first_match_index_<mode>): Calculate index using natural element order. (first_match_or_eos_index_<mode>): Calculate index using natural order. (define_insn vclzlsbb): Change to define_insn vclzlsbb_<mode>. for BE and LE modes. * gcc/config/rs6000/rs6000-c.c: Rename P9V_BUILTIN_VCLZLSBB, P9V_BUILTIN_VCLZLSBB_V16QI. * gcc/config/rs6000/rs6000-builtin.def: Make VCLZLSBB mode specific. gcc/testsuite/ChangeLog: 2018-06-04 Carl Love <c...@us.ibm.com> * gcc.target/powerpc/builtins-8-p9-runnable.c: Add additional debug print statements. Fix a few formating issues. * gcc.target/powerpc/vsu/vec-cntlz-lsbb-2.c (dg-error): Update expected error message. --- gcc/config/rs6000/rs6000-builtin.def | 4 +- gcc/config/rs6000/rs6000-c.c | 4 +- gcc/config/rs6000/vsx.md | 62 ++- .../gcc.target/powerpc/builtins-8-p9-runnable.c | 503 ++++++++++++++++++++- .../gcc.target/powerpc/vsu/vec-cntlz-lsbb-2.c | 2 +- 5 files changed, 543 insertions(+), 32 deletions(-) diff --git a/gcc/config/rs6000/rs6000-builtin.def b/gcc/config/rs6000/rs6000-builtin.def index 5503893..779f8a3 100644 --- a/gcc/config/rs6000/rs6000-builtin.def +++ b/gcc/config/rs6000/rs6000-builtin.def @@ -2194,7 +2194,9 @@ BU_P9V_64BIT_AV_X (STXVL, "stxvl", MISC) BU_P9V_64BIT_AV_X (XST_LEN_R, "xst_len_r", MISC) /* 1 argument vector functions added in ISA 3.0 (power9). */ -BU_P9V_AV_1 (VCLZLSBB, "vclzlsbb", CONST, vclzlsbb) +BU_P9V_AV_1 (VCLZLSBB_V16QI, "vclzlsbb_v16qi", CONST, vclzlsbb_v16qi) +BU_P9V_AV_1 (VCLZLSBB_V8HI, "vclzlsbb_v8hi", CONST, vclzlsbb_v8hi) +BU_P9V_AV_1 (VCLZLSBB_V4SI, "vclzlsbb_v4si", CONST, vclzlsbb_v4si) BU_P9V_AV_1 (VCTZLSBB_V16QI, "vctzlsbb_v16qi", CONST, vctzlsbb_v16qi) BU_P9V_AV_1 (VCTZLSBB_V8HI, "vctzlsbb_v8hi", CONST, vctzlsbb_v8hi) BU_P9V_AV_1 (VCTZLSBB_V4SI, "vctzlsbb_v4si", CONST, vctzlsbb_v4si) diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c index 6cf5537..948d387 100644 --- a/gcc/config/rs6000/rs6000-c.c +++ b/gcc/config/rs6000/rs6000-c.c @@ -5451,9 +5451,9 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { RS6000_BTI_bool_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, - { P9V_BUILTIN_VEC_VCLZLSBB, P9V_BUILTIN_VCLZLSBB, + { P9V_BUILTIN_VEC_VCLZLSBB, P9V_BUILTIN_VCLZLSBB_V16QI, RS6000_BTI_INTSI, RS6000_BTI_V16QI, 0, 0 }, - { P9V_BUILTIN_VEC_VCLZLSBB, P9V_BUILTIN_VCLZLSBB, + { P9V_BUILTIN_VEC_VCLZLSBB, P9V_BUILTIN_VCLZLSBB_V16QI, RS6000_BTI_INTSI, RS6000_BTI_unsigned_V16QI, 0, 0 }, { P9V_BUILTIN_VEC_VCTZLSBB, P9V_BUILTIN_VCTZLSBB_V16QI, diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index 58796ff..36a6312 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -4723,7 +4723,8 @@ "vcmpnez<VSX_EXTRACT_WIDTH>. %0,%1,%2" [(set_attr "type" "vecsimple")]) -;; Return first position of match between vectors +;; Return first position of match between vectors using natural order +;; for both LE and BE execution modes. (define_expand "first_match_index_<mode>" [(match_operand:SI 0 "register_operand") (unspec:SI [(match_operand:VSX_EXTRACT_I 1 "register_operand") @@ -4743,17 +4744,26 @@ sh = GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) / 2; if (<MODE>mode == V16QImode) - emit_insn (gen_vctzlsbb_<mode> (operands[0], not_result)); + { + if (!BYTES_BIG_ENDIAN) + emit_insn (gen_vctzlsbb_<mode> (operands[0], not_result)); + else + emit_insn (gen_vclzlsbb_<mode> (operands[0], not_result)); + } else { rtx tmp = gen_reg_rtx (SImode); - emit_insn (gen_vctzlsbb_<mode> (tmp, not_result)); + if (!BYTES_BIG_ENDIAN) + emit_insn (gen_vctzlsbb_<mode> (tmp, not_result)); + else + emit_insn (gen_vclzlsbb_<mode> (tmp, not_result)); emit_insn (gen_ashrsi3 (operands[0], tmp, GEN_INT (sh))); } DONE; }) -;; Return first position of match between vectors or end of string (EOS) +;; Return first position of match between vectors or end of string (EOS) using +;; natural element order for both LE and BE execution modes. (define_expand "first_match_or_eos_index_<mode>" [(match_operand:SI 0 "register_operand") (unspec: SI [(match_operand:VSX_EXTRACT_I 1 "register_operand") @@ -4785,17 +4795,26 @@ sh = GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) / 2; if (<MODE>mode == V16QImode) - emit_insn (gen_vctzlsbb_<mode> (operands[0], result)); + { + if (!BYTES_BIG_ENDIAN) + emit_insn (gen_vctzlsbb_<mode> (operands[0], result)); + else + emit_insn (gen_vclzlsbb_<mode> (operands[0], result)); + } else { rtx tmp = gen_reg_rtx (SImode); - emit_insn (gen_vctzlsbb_<mode> (tmp, result)); + if (!BYTES_BIG_ENDIAN) + emit_insn (gen_vctzlsbb_<mode> (tmp, result)); + else + emit_insn (gen_vclzlsbb_<mode> (tmp, result)); emit_insn (gen_ashrsi3 (operands[0], tmp, GEN_INT (sh))); } DONE; }) -;; Return first position of mismatch between vectors +;; Return first position of mismatch between vectors using natural +;; element order for both LE and BE execution modes. (define_expand "first_mismatch_index_<mode>" [(match_operand:SI 0 "register_operand") (unspec: SI [(match_operand:VSX_EXTRACT_I 1 "register_operand") @@ -4811,17 +4830,26 @@ sh = GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) / 2; if (<MODE>mode == V16QImode) - emit_insn (gen_vctzlsbb_<mode> (operands[0], cmp_result)); + { + if (!BYTES_BIG_ENDIAN) + emit_insn (gen_vctzlsbb_<mode> (operands[0], cmp_result)); + else + emit_insn (gen_vclzlsbb_<mode> (operands[0], cmp_result)); + } else { rtx tmp = gen_reg_rtx (SImode); - emit_insn (gen_vctzlsbb_<mode> (tmp, cmp_result)); + if (!BYTES_BIG_ENDIAN) + emit_insn (gen_vctzlsbb_<mode> (tmp, cmp_result)); + else + emit_insn (gen_vclzlsbb_<mode> (tmp, cmp_result)); emit_insn (gen_ashrsi3 (operands[0], tmp, GEN_INT (sh))); } DONE; }) ;; Return first position of mismatch between vectors or end of string (EOS) +;; using natural element order for both LE and BE execution modes. (define_expand "first_mismatch_or_eos_index_<mode>" [(match_operand:SI 0 "register_operand") (unspec: SI [(match_operand:VSX_EXTRACT_I 1 "register_operand") @@ -4856,11 +4884,19 @@ sh = GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) / 2; if (<MODE>mode == V16QImode) - emit_insn (gen_vctzlsbb_<mode> (operands[0], result)); + { + if (!BYTES_BIG_ENDIAN) + emit_insn (gen_vctzlsbb_<mode> (operands[0], result)); + else + emit_insn (gen_vclzlsbb_<mode> (operands[0], result)); + } else { rtx tmp = gen_reg_rtx (SImode); - emit_insn (gen_vctzlsbb_<mode> (tmp, result)); + if (!BYTES_BIG_ENDIAN) + emit_insn (gen_vctzlsbb_<mode> (tmp, result)); + else + emit_insn (gen_vclzlsbb_<mode> (tmp, result)); emit_insn (gen_ashrsi3 (operands[0], tmp, GEN_INT (sh))); } DONE; @@ -5040,10 +5076,10 @@ [(set_attr "type" "vecsimple")]) ;; Vector Count Leading Zero Least-Significant Bits Byte -(define_insn "vclzlsbb" +(define_insn "vclzlsbb_<mode>" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI - [(match_operand:V16QI 1 "altivec_register_operand" "v")] + [(match_operand:VSX_EXTRACT_I 1 "altivec_register_operand" "v")] UNSPEC_VCLZLSBB))] "TARGET_P9_VECTOR" "vclzlsbb %0,%1" 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 9ec338d..158de5e 100644 --- a/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c +++ b/gcc/testsuite/gcc.target/powerpc/builtins-8-p9-runnable.c @@ -10,8 +10,84 @@ #include <stdio.h> #endif +#ifdef DEBUG2 +#include <stdio.h> +#endif + + void abort (void); +#ifdef DEBUG2 +void print_signed_char (char *name, vector signed char src) +{ + int i; + + for (i = 0; i < 8; i++) + printf("%s[%d] = %d, ", name, i, src[i]); + + printf("\n"); + + for (i = 8; i < 15; i++) + printf("%s[%d] = %d, ", name, i, src[i]); + + printf("%s[%d] = %d\n", name, 15, src[i]); +} + +void print_unsigned_char (char *name, vector unsigned char src) +{ + int i; + + for (i = 0; i < 8; i++) + printf("%s[%d] = %d, ", name, i, src[i]); + + printf("\n"); + + for (i = 8; i < 15; i++) + printf("%s[%d] = %d, ", name, i, src[i]); + + printf("%s[%d] = %d\n", name, 15, src[i]); +} + +void print_signed_short_int (char *name, vector signed short int src) +{ + int i; + + for (i = 0; i < 7; i++) + printf("%s[%d] = %d, ", name, i, src[i]); + + printf("%s[%d] = %d\n", name, 7, src[i]); +} + +void print_unsigned_short_int (char *name, vector unsigned short int src) +{ + int i; + + for (i = 0; i < 7; i++) + printf("%s[%d] = %d, ", name, i, src[i]); + + printf("%s[%d] = %d\n", name, 7, src[i]); +} + +void print_signed_int (char *name, vector signed int src) +{ + int i; + + for (i = 0; i < 3; i++) + printf("%s[%d] = %d, ", name, i, src[i]); + + printf("%s[%d] = %d\n", name, 3, src[i]); +} + +void print_unsigned_int (char *name, vector unsigned int src) +{ + int i; + + for (i = 0; i < 3; i++) + printf("%s[%d] = %d, ", name, i, src[i]); + + printf("%s[%d] = %d\n", name, 3, src[i]); +} +#endif int main() { @@ -24,7 +100,9 @@ int main() { unsigned int result, expected_result; - /* Tests for: vec_first_match_index() */ + /* Tests for: vec_first_match_index() + 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) {-1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; @@ -34,6 +112,12 @@ int main() { 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", @@ -50,6 +134,12 @@ int main() { 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", @@ -66,6 +156,12 @@ int main() { result = vec_first_match_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first match result (%d) does not match expected result (%d)\n", @@ -82,6 +178,12 @@ int main() { result = vec_first_match_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first match result (%d) does not match expected result (%d)\n", @@ -98,6 +200,12 @@ int main() { result = vec_first_match_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first match result (%d) does not match expected result (%d)\n", @@ -113,6 +221,12 @@ int main() { result = vec_first_match_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first match result (%d) does not match expected result (%d)\n", @@ -128,6 +242,12 @@ int main() { result = vec_first_match_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first match result (%d) does not match expected result (%d)\n", @@ -145,6 +265,12 @@ int main() { result = vec_first_match_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first match result (%d) does not match expected result (%d)\n", @@ -161,6 +287,12 @@ int main() { result = vec_first_match_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first match result (%d) does not match expected result (%d)\n", @@ -176,6 +308,12 @@ int main() { result = vec_first_match_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first match result (%d) does not match expected result (%d)\n", @@ -191,6 +329,12 @@ int main() { result = vec_first_match_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uint first match result (%d) does not match expected result (%d)\n", @@ -206,6 +350,12 @@ int main() { result = vec_first_match_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_match_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uint first match result (%d) does not match expected result (%d)\n", @@ -214,7 +364,9 @@ int main() { abort(); #endif - /* Tests for: vec_first_mismatch_index() */ + /* Tests for: vec_first_mismatch_index() + 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, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; @@ -224,6 +376,12 @@ int main() { 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", @@ -240,6 +398,12 @@ int main() { 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", @@ -256,6 +420,12 @@ int main() { result = vec_first_mismatch_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first mismatch result (%d) does not match expected result (%d)\n", @@ -272,10 +442,16 @@ int main() { result = vec_first_mismatch_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first mismatch result (%d) does not match expected result (%d)\n", - result, expected_result); + result, expected_result); #else abort(); #endif @@ -288,6 +464,12 @@ int main() { result = vec_first_mismatch_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first mismatch result (%d) does not match expected result (%d)\n", @@ -304,6 +486,12 @@ int main() { result = vec_first_mismatch_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first mismatch result (%d) does not match expected result (%d)\n", @@ -319,6 +507,12 @@ int main() { result = vec_first_mismatch_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first mismatch result (%d) does not match expected result (%d)\n", @@ -334,6 +528,12 @@ int main() { result = vec_first_mismatch_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first mismatch result (%d) does not match expected result (%d)\n", @@ -349,6 +549,12 @@ int main() { result = vec_first_mismatch_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first mismatch result (%d) does not match expected result (%d)\n", @@ -365,6 +571,12 @@ int main() { result = vec_first_mismatch_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first mismatch result (%d) does not match expected result (%d)\n", @@ -380,6 +592,12 @@ int main() { result = vec_first_mismatch_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first mismatch result (%d) does not match expected result (%d)\n", @@ -395,6 +613,12 @@ int main() { result = vec_first_mismatch_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first mismatch result (%d) does not match expected result (%d)\n", @@ -410,6 +634,12 @@ int main() { result = vec_first_mismatch_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uint first mismatch result (%d) does not match expected result (%d)\n", @@ -425,7 +655,14 @@ int main() { result = vec_first_mismatch_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_mismatch_index = %d\n\n", result); +#endif + if (result != expected_result) + #ifdef DEBUG printf("Error: uint first mismatch result (%d) does not match expected result (%d)\n", result, expected_result); @@ -433,7 +670,9 @@ int main() { abort(); #endif - /* Tests for: vec_first_match_or_eos_index() */ + /* Tests for: vec_first_match_or_eos_index() + 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) {-1, 2, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; @@ -443,6 +682,12 @@ int main() { 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", @@ -459,6 +704,12 @@ int main() { 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_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: char first match or EOS result (%d) does not match expected result (%d)\n", @@ -475,12 +726,18 @@ int main() { 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 or EOS result (%d) does not match expected result (%d)\n", result, expected_result); #else - abort(); + abort(); #endif uchar_src1 = (vector unsigned char) {1, 2, 3, 4, 5, 6, 7, 8, @@ -491,6 +748,12 @@ int main() { result = vec_first_match_or_eos_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first match or EOS result (%d) does not match expected result (%d)\n", @@ -507,6 +770,12 @@ int main() { result = vec_first_match_or_eos_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first match or EOS result (%d) does not match expected result (%d)\n", @@ -523,6 +792,12 @@ int main() { result = vec_first_match_or_eos_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first match or EOS result (%d) does not match expected result (%d)\n", @@ -538,6 +813,12 @@ int main() { result = vec_first_match_or_eos_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first match or EOS result (%d) does not match expected result (%d)\n", @@ -553,6 +834,12 @@ int main() { result = vec_first_match_or_eos_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first match or EOS result (%d) does not match expected result (%d)\n", @@ -568,6 +855,12 @@ int main() { result = vec_first_match_or_eos_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first match or EOS result (%d) does not match expected result (%d)\n", @@ -583,6 +876,12 @@ int main() { result = vec_first_match_or_eos_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first match or EOS result (%d) does not match expected result (%d)\n", @@ -600,6 +899,12 @@ int main() { result = vec_first_match_or_eos_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first match or EOS result (%d) does not match expected result (%d)\n", @@ -616,10 +921,16 @@ int main() { result = vec_first_match_or_eos_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG - printf("Error: ushort int first match or EOS result (%d) does not match expected result (%d)\n", - result, expected_result); + printf("Error: ushort int first match or EOS result (%d) does not match expected result (%d)\n", + result, expected_result); #else abort(); #endif @@ -632,6 +943,12 @@ int main() { result = vec_first_match_or_eos_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first match or EOS result (%d) does not match expected result (%d)\n", @@ -647,6 +964,12 @@ int main() { result = vec_first_match_or_eos_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first match or EOS result (%d) does not match expected result (%d)\n", @@ -662,10 +985,16 @@ int main() { result = vec_first_match_or_eos_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG - printf("Error: int first match or EOS result (%d) does not match expected result (%d)\n", - result, expected_result); + printf("Error: int first match or EOS result (%d) does not match expected result (%d)\n", + result, expected_result); #else abort(); #endif @@ -677,6 +1006,12 @@ int main() { result = vec_first_match_or_eos_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uint first match or EOS result (%d) does not match expected result (%d)\n", @@ -692,6 +1027,12 @@ int main() { result = vec_first_match_or_eos_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uint first match or EOS result (%d) does not match expected result (%d)\n", @@ -707,6 +1048,12 @@ int main() { result = vec_first_match_or_eos_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_match_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uint first match or EOS result (%d) does not match expected result (%d)\n", @@ -715,7 +1062,9 @@ int main() { abort(); #endif - /* Tests for: vec_first_mismatch_or_eos_index() */ + /* Tests for: vec_first_mismatch_or_eos_index() + 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, 3, 4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; @@ -725,6 +1074,12 @@ int main() { 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", @@ -741,6 +1096,12 @@ int main() { 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", @@ -757,6 +1118,12 @@ int main() { 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", @@ -773,12 +1140,18 @@ int main() { result = vec_first_mismatch_or_eos_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first mismatch or EOS result (%d) does not match expected result (%d)\n", result, expected_result); #else - abort(); + abort(); #endif uchar_src1 = (vector unsigned char) {2, 3, 4, 5, 6, 7, 8, 9, @@ -789,6 +1162,12 @@ int main() { result = vec_first_mismatch_or_eos_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -805,6 +1184,12 @@ int main() { result = vec_first_mismatch_or_eos_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -821,6 +1206,12 @@ int main() { result = vec_first_mismatch_or_eos_index (uchar_src1, uchar_src2); +#ifdef DEBUG2 + print_unsigned_char("src1", uchar_src1); + print_unsigned_char("src2", uchar_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: uchar first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -837,6 +1228,12 @@ int main() { result = vec_first_mismatch_or_eos_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -852,6 +1249,12 @@ int main() { result = vec_first_mismatch_or_eos_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -867,6 +1270,12 @@ int main() { result = vec_first_mismatch_or_eos_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -882,6 +1291,12 @@ int main() { result = vec_first_mismatch_or_eos_index (short_src1, short_src2); +#ifdef DEBUG2 + print_signed_short_int("src1", short_src1); + print_signed_short_int("src2", short_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: short int first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -897,6 +1312,12 @@ int main() { result = vec_first_mismatch_or_eos_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -912,7 +1333,13 @@ int main() { result = vec_first_mismatch_or_eos_index (ushort_src1, ushort_src2); - if (result != expected_result) +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first mismatch or EOS result (%d) does not match expected result (%d)\n", result, expected_result); @@ -927,6 +1354,12 @@ int main() { result = vec_first_mismatch_or_eos_index (ushort_src1, ushort_src2); +#ifdef DEBUG2 + print_unsigned_short_int("src1", ushort_src1); + print_unsigned_short_int("src2", ushort_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: ushort int first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -943,6 +1376,12 @@ int main() { result = vec_first_mismatch_or_eos_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first mismatch or EOS result (%d) does not match expected result (%d)\n", @@ -958,6 +1397,12 @@ int main() { result = vec_first_mismatch_or_eos_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first mismatch result (%d) does not match expected result (%d)\n", @@ -973,6 +1418,12 @@ int main() { result = vec_first_mismatch_or_eos_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG printf("Error: int first mismatch result (%d) does not match expected result (%d)\n", @@ -988,6 +1439,11 @@ int main() { result = vec_first_mismatch_or_eos_index (int_src1, int_src2); +#ifdef DEBUG2 + print_signed_int("src1", int_src1); + print_signed_int("src2", int_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif if (result != expected_result) #ifdef DEBUG printf("Error: int first mismatch result (%d) does not match expected result (%d)\n", @@ -1003,9 +1459,14 @@ int main() { result = vec_first_mismatch_or_eos_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif if (result != expected_result) #ifdef DEBUG - printf("Error: uint first mismatch result (%d) does not match expected result (%d)\n", + printf("Error: uint first mismatch or eos index result (%d) does not match expected result (%d)\n", result, expected_result); #else abort(); @@ -1018,9 +1479,15 @@ int main() { result = vec_first_mismatch_or_eos_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG - printf("Error: uint first mismatch result (%d) does not match expected result (%d)\n", + printf("Error: uint first mismatch or eos index result (%d) does not match expected result (%d)\n", result, expected_result); #else abort(); @@ -1033,9 +1500,15 @@ int main() { result = vec_first_mismatch_or_eos_index (uint_src1, uint_src2); +#ifdef DEBUG2 + print_unsigned_int("src1", uint_src1); + print_unsigned_int("src2", uint_src2); + printf("vec_first_mismatch_or_eos_index = %d\n\n", result); +#endif + if (result != expected_result) #ifdef DEBUG - printf("Error: uint first mismatch result (%d) does not match expected result (%d)\n", + printf("Error: uint first mismatch or eos index result (%d) does not match expected result (%d)\n", result, expected_result); #else abort(); diff --git a/gcc/testsuite/gcc.target/powerpc/vsu/vec-cntlz-lsbb-2.c b/gcc/testsuite/gcc.target/powerpc/vsu/vec-cntlz-lsbb-2.c index 32633e3..119ef98 100644 --- a/gcc/testsuite/gcc.target/powerpc/vsu/vec-cntlz-lsbb-2.c +++ b/gcc/testsuite/gcc.target/powerpc/vsu/vec-cntlz-lsbb-2.c @@ -10,5 +10,5 @@ count_leading_zero_byte_bits (vector unsigned char *arg1_p) { vector unsigned char arg_1 = *arg1_p; - return __builtin_vec_vclzlsbb (arg_1); /* { dg-error "builtin function '__builtin_altivec_vclzlsbb' requires the '-mcpu=power9' option" } */ + return __builtin_vec_vclzlsbb (arg_1); /* { dg-error "builtin function '__builtin_altivec_vclzlsbb_v16qi' requires the '-mcpu=power9' option" } */ } -- 2.7.4