summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/ext/mv17.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/ext/mv17.C')
-rw-r--r--gcc/testsuite/g++.dg/ext/mv17.C93
1 files changed, 93 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/ext/mv17.C b/gcc/testsuite/g++.dg/ext/mv17.C
new file mode 100644
index 0000000000..87c13246ed
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/mv17.C
@@ -0,0 +1,93 @@
+// Test case to check if Multiversioning works for BMI and BMI2.
+
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-ifunc "" }
+// { dg-options "-O2" }
+
+#include <assert.h>
+
+// Check BMI feature selection works
+int foo () __attribute__((target("default")));
+int foo () __attribute__((target("bmi")));
+int foo () __attribute__((target("bmi2")));
+
+// Check specialized versions for archs with BMI is chosen over generic BMI versions.
+int bar () __attribute__((target("default")));
+int bar () __attribute__((target("bmi")));
+int bar () __attribute__((target("bmi2")));
+int bar () __attribute__((target("arch=btver2")));
+int bar () __attribute__((target("arch=haswell")));
+
+int main ()
+{
+ int val = foo ();
+
+ if (__builtin_cpu_supports ("bmi2"))
+ assert (val == 2);
+ else if (__builtin_cpu_supports ("bmi"))
+ assert (val == 1);
+ else
+ assert (val == 0);
+
+ val = bar ();
+
+ if (__builtin_cpu_is ("btver2"))
+ assert (val == 5);
+ else if (__builtin_cpu_is ("haswell"))
+ assert (val == 6);
+ else if (__builtin_cpu_supports ("bmi2"))
+ assert (val == 2);
+ else if (__builtin_cpu_supports ("bmi"))
+ assert (val == 1);
+ else
+ assert (val == 0);
+
+ return 0;
+}
+
+int __attribute__ ((target("default")))
+foo ()
+{
+ return 0;
+}
+
+int __attribute__ ((target("bmi")))
+foo ()
+{
+ return 1;
+}
+int __attribute__ ((target("bmi2")))
+foo ()
+{
+ return 2;
+}
+
+int __attribute__ ((target("default")))
+bar ()
+{
+ return 0;
+}
+
+int __attribute__ ((target("bmi")))
+bar ()
+{
+ return 1;
+}
+int __attribute__ ((target("bmi2")))
+bar ()
+{
+ return 2;
+}
+
+int __attribute__ ((target("arch=btver2")))
+bar ()
+{
+ return 5;
+}
+
+int __attribute__ ((target("arch=haswell")))
+bar ()
+{
+ return 6;
+}
+