Straightforward implementation. libgcc/ChangeLog:
2015-07-22 Uros Bizjak <ubiz...@gmail.com> PR target/66954 * config/i386/cpuinfo.c (enum processor_features): Add FEATURE_AES. (get_available_features): Handle FEATURE_AES. gcc/ChangeLog: 2015-07-22 Uros Bizjak <ubiz...@gmail.com> PR target/66954 * config/i386/i386.c (get_builtin_code_for_version): Add P_AES to enum feature_priority and feature_list. (fold_builtin_cpu): Add F_AES to enum processor_features and isa_names_table. gcc/testsuite/ChangeLog: 2015-07-22 Uros Bizjak <ubiz...@gmail.com> PR target/66954 * g++.dg/ext/mv24.C: New test. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Committed to mainline SVN. Uros.
Index: gcc/config/i386/i386.c =================================================================== --- gcc/config/i386/i386.c (revision 226075) +++ gcc/config/i386/i386.c (working copy) @@ -34611,6 +34611,7 @@ get_builtin_code_for_version (tree decl, tree *pre P_SSE4_2, P_PROC_SSE4_2, P_POPCNT, + P_AES, P_AVX, P_PROC_AVX, P_BMI, @@ -34648,6 +34649,7 @@ get_builtin_code_for_version (tree decl, tree *pre {"sse4.1", P_SSE4_1}, {"sse4.2", P_SSE4_2}, {"popcnt", P_POPCNT}, + {"aes", P_AES}, {"avx", P_AVX}, {"bmi", P_BMI}, {"fma4", P_FMA4}, @@ -35635,6 +35637,7 @@ fold_builtin_cpu (tree fndecl, tree *args) F_AVX512F, F_BMI, F_BMI2, + F_AES, F_MAX }; @@ -35730,7 +35733,8 @@ fold_builtin_cpu (tree fndecl, tree *args) {"avx2", F_AVX2}, {"avx512f",F_AVX512F}, {"bmi", F_BMI}, - {"bmi2", F_BMI2} + {"bmi2", F_BMI2}, + {"aes", F_AES} }; tree __processor_model_type = build_processor_model_struct (); Index: gcc/testsuite/g++.dg/ext/mv24.C =================================================================== --- gcc/testsuite/g++.dg/ext/mv24.C (revision 0) +++ gcc/testsuite/g++.dg/ext/mv24.C (working copy) @@ -0,0 +1,35 @@ +// Test case to check if Multiversioning works for AES + +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-ifunc "" } +// { dg-options "-O2" } + +#include <assert.h> + +// Check if AES feature selection works +int foo () __attribute__((target("default"))); +int foo () __attribute__((target("aes"))); + +int main () +{ + int val = foo (); + + if (__builtin_cpu_supports ("aes")) + assert (val == 1); + else + assert (val == 0); + + return 0; +} + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("aes"))) +foo () +{ + return 1; +} Index: libgcc/config/i386/cpuinfo.c =================================================================== --- libgcc/config/i386/cpuinfo.c (revision 226075) +++ libgcc/config/i386/cpuinfo.c (working copy) @@ -100,7 +100,8 @@ enum processor_features FEATURE_FMA, FEATURE_AVX512F, FEATURE_BMI, - FEATURE_BMI2 + FEATURE_BMI2, + FEATURE_AES }; struct __processor_model @@ -273,6 +274,8 @@ get_available_features (unsigned int ecx, unsigned features |= (1 << FEATURE_SSE2); if (ecx & bit_POPCNT) features |= (1 << FEATURE_POPCNT); + if (ecx & bit_AES) + features |= (1 << FEATURE_AES); if (ecx & bit_SSE3) features |= (1 << FEATURE_SSE3); if (ecx & bit_SSSE3)