diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/ext/mv2.C')
-rw-r--r-- | gcc/testsuite/g++.dg/ext/mv2.C | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/ext/mv2.C b/gcc/testsuite/g++.dg/ext/mv2.C new file mode 100644 index 0000000000..869e99b4fa --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv2.C @@ -0,0 +1,118 @@ +/* Test case to check if Multiversioning chooses the correct + dispatching order when versions are for various ISAs. */ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O2" } */ + +#include <assert.h> + +/* Default version. */ +int foo () __attribute__ ((target ("default"))); +/* The dispatch checks should be in the exact reverse order of the + declarations below. */ +int foo () __attribute__ ((target ("mmx"))); +int foo () __attribute__ ((target ("sse"))); +int foo () __attribute__ ((target ("sse2"))); +int foo () __attribute__ ((target ("sse3"))); +int foo () __attribute__ ((target ("ssse3"))); +int foo () __attribute__ ((target ("sse4.1"))); +int foo () __attribute__ ((target ("sse4.2"))); +int foo () __attribute__ ((target ("popcnt"))); +int foo () __attribute__ ((target ("avx"))); +int foo () __attribute__ ((target ("avx2"))); + +int main () +{ + int val = foo (); + + if (__builtin_cpu_supports ("avx2")) + assert (val == 1); + else if (__builtin_cpu_supports ("avx")) + assert (val == 2); + else if (__builtin_cpu_supports ("popcnt")) + assert (val == 3); + else if (__builtin_cpu_supports ("sse4.2")) + assert (val == 4); + else if (__builtin_cpu_supports ("sse4.1")) + assert (val == 5); + else if (__builtin_cpu_supports ("ssse3")) + assert (val == 6); + else if (__builtin_cpu_supports ("sse3")) + assert (val == 7); + else if (__builtin_cpu_supports ("sse2")) + assert (val == 8); + else if (__builtin_cpu_supports ("sse")) + assert (val == 9); + else if (__builtin_cpu_supports ("mmx")) + assert (val == 10); + else + assert (val == 0); + + return 0; +} + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("mmx"))) +foo () +{ + return 10; +} + +int __attribute__ ((target("sse"))) +foo () +{ + return 9; +} + +int __attribute__ ((target("sse2"))) +foo () +{ + return 8; +} + +int __attribute__ ((target("sse3"))) +foo () +{ + return 7; +} + +int __attribute__ ((target("ssse3"))) +foo () +{ + return 6; +} + +int __attribute__ ((target("sse4.1"))) +foo () +{ + return 5; +} + +int __attribute__ ((target("sse4.2"))) +foo () +{ + return 4; +} + +int __attribute__ ((target("popcnt"))) +foo () +{ + return 3; +} + +int __attribute__ ((target("avx"))) +foo () +{ + return 2; +} + +int __attribute__ ((target("avx2"))) +foo () +{ + return 1; +} |