| /* Test case to check if Multiversioning chooses the correct |
| dispatching order when versions are for various ISAs. */ |
| /* { dg-do run } */ |
| /* { 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 foo () __attribute__ ((target ("avx512f"))); |
| |
| int main () |
| { |
| int val = foo (); |
| |
| if (__builtin_cpu_supports ("avx512f")) |
| assert (val == 11); |
| else if (__builtin_cpu_supports ("avx2")) |
| assert (val == 10); |
| else if (__builtin_cpu_supports ("avx")) |
| assert (val == 9); |
| else if (__builtin_cpu_supports ("popcnt")) |
| assert (val == 8); |
| else if (__builtin_cpu_supports ("sse4.2")) |
| assert (val == 7); |
| else if (__builtin_cpu_supports ("sse4.1")) |
| assert (val == 6); |
| else if (__builtin_cpu_supports ("ssse3")) |
| assert (val == 5); |
| else if (__builtin_cpu_supports ("sse3")) |
| assert (val == 4); |
| else if (__builtin_cpu_supports ("sse2")) |
| assert (val == 3); |
| else if (__builtin_cpu_supports ("sse")) |
| assert (val == 2); |
| else if (__builtin_cpu_supports ("mmx")) |
| assert (val == 1); |
| else |
| assert (val == 0); |
| |
| return 0; |
| } |
| |
| int __attribute__ ((target("default"))) |
| foo () |
| { |
| return 0; |
| } |
| |
| int __attribute__ ((target("mmx"))) |
| foo () |
| { |
| return 1; |
| } |
| |
| int __attribute__ ((target("sse"))) |
| foo () |
| { |
| return 2; |
| } |
| |
| int __attribute__ ((target("sse2"))) |
| foo () |
| { |
| return 3; |
| } |
| |
| int __attribute__ ((target("sse3"))) |
| foo () |
| { |
| return 4; |
| } |
| |
| int __attribute__ ((target("ssse3"))) |
| foo () |
| { |
| return 5; |
| } |
| |
| int __attribute__ ((target("sse4.1"))) |
| foo () |
| { |
| return 6; |
| } |
| |
| int __attribute__ ((target("sse4.2"))) |
| foo () |
| { |
| return 7; |
| } |
| |
| int __attribute__ ((target("popcnt"))) |
| foo () |
| { |
| return 8; |
| } |
| |
| int __attribute__ ((target("avx"))) |
| foo () |
| { |
| return 9; |
| } |
| |
| int __attribute__ ((target("avx2"))) |
| foo () |
| { |
| return 10; |
| } |
| |
| int __attribute__ ((target("avx512f"))) |
| foo () |
| { |
| return 11; |
| } |