From aff4eeac68406d9e68c193b3af21c3f8f708f3f0 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Tue, 11 Aug 2015 19:53:41 +0200 Subject: [PATCH] re PR target/66954 (function multiversioning fails for target "aes") libgcc/ChangeLog: PR target/66954 * config/i386/cpuinfo.c (enum processor_features): Add FEATURE_PCLMUL. (get_available_features): Handle FEATURE_PCLMUL. gcc/ChangeLog: PR target/66954 * config/i386/i386.c (get_builtin_code_for_version): Add P_PCLMUL to enum feature_priority and feature_list. (fold_builtin_cpu): Add F_PCLMUL to enum processor_features and isa_names_table. gcc/testsuite/ChangeLog: PR target/66954 * g++.dg/ext/mv25.C: New test. From-SVN: r226784 --- gcc/ChangeLog | 8 ++++++++ gcc/config/i386/i386.c | 6 +++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ext/mv25.C | 35 +++++++++++++++++++++++++++++++++ libgcc/ChangeLog | 6 ++++++ libgcc/config/i386/cpuinfo.c | 5 ++++- 6 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/mv25.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7e311106e4a..8db5376a13d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-08-11 Uros Bizjak + + PR target/66954 + * config/i386/i386.c (get_builtin_code_for_version): Add P_PCLMUL + to enum feature_priority and feature_list. + (fold_builtin_cpu): Add F_PCLMUL to enum processor_features + and isa_names_table. + 2015-08-11 Yuri Rumyantsev * tree-vect-stmts.c (vectorizable_shift): Add missed test on diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 57d874b87d3..caec21880c3 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -34574,6 +34574,7 @@ get_builtin_code_for_version (tree decl, tree *predicate_list) P_PROC_SSE4_2, P_POPCNT, P_AES, + P_PCLMUL, P_AVX, P_PROC_AVX, P_BMI, @@ -34612,6 +34613,7 @@ get_builtin_code_for_version (tree decl, tree *predicate_list) {"sse4.2", P_SSE4_2}, {"popcnt", P_POPCNT}, {"aes", P_AES}, + {"pclmul", P_PCLMUL}, {"avx", P_AVX}, {"bmi", P_BMI}, {"fma4", P_FMA4}, @@ -35600,6 +35602,7 @@ fold_builtin_cpu (tree fndecl, tree *args) F_BMI, F_BMI2, F_AES, + F_PCLMUL, F_MAX }; @@ -35696,7 +35699,8 @@ fold_builtin_cpu (tree fndecl, tree *args) {"avx512f",F_AVX512F}, {"bmi", F_BMI}, {"bmi2", F_BMI2}, - {"aes", F_AES} + {"aes", F_AES}, + {"pclmul", F_PCLMUL} }; tree __processor_model_type = build_processor_model_struct (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 93cacfb9bf2..5c970e70c8a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-08-11 Uros Bizjak + + PR target/66954 + * g++.dg/ext/mv25.C: New test. + 2015-08-11 Yuri Rumyantsev * gcc.target/i386/avx2-vect-shift.c: New test. diff --git a/gcc/testsuite/g++.dg/ext/mv25.C b/gcc/testsuite/g++.dg/ext/mv25.C new file mode 100644 index 00000000000..fd40eca59a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv25.C @@ -0,0 +1,35 @@ +// Test case to check if Multiversioning works for PCLMUL + +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-ifunc "" } +// { dg-options "-O2" } + +#include + +// Check if PCLMUL feature selection works +int foo () __attribute__((target("default"))); +int foo () __attribute__((target("pclmul"))); + +int main () +{ + int val = foo (); + + if (__builtin_cpu_supports ("pclmul")) + assert (val == 1); + else + assert (val == 0); + + return 0; +} + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("pclmul"))) +foo () +{ + return 1; +} diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 95a10f22348..062bbe924dd 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,9 @@ +2015-08-11 Uros Bizjak + + PR target/66954 + * config/i386/cpuinfo.c (enum processor_features): Add FEATURE_PCLMUL. + (get_available_features): Handle FEATURE_PCLMUL. + 2015-08-10 H.J. Lu * config/i386/cpuinfo.c (get_intel_cpu): Treat model == 0x4f as diff --git a/libgcc/config/i386/cpuinfo.c b/libgcc/config/i386/cpuinfo.c index 57711d01bea..25d85e4bedd 100644 --- a/libgcc/config/i386/cpuinfo.c +++ b/libgcc/config/i386/cpuinfo.c @@ -101,7 +101,8 @@ enum processor_features FEATURE_AVX512F, FEATURE_BMI, FEATURE_BMI2, - FEATURE_AES + FEATURE_AES, + FEATURE_PCLMUL }; struct __processor_model @@ -277,6 +278,8 @@ get_available_features (unsigned int ecx, unsigned int edx, features |= (1 << FEATURE_POPCNT); if (ecx & bit_AES) features |= (1 << FEATURE_AES); + if (ecx & bit_PCLMUL) + features |= (1 << FEATURE_PCLMUL); if (ecx & bit_SSE3) features |= (1 << FEATURE_SSE3); if (ecx & bit_SSSE3) -- 2.30.2