summaryrefslogtreecommitdiff
path: root/testsuite/tests/rts/T16514_c.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/rts/T16514_c.cpp')
-rw-r--r--testsuite/tests/rts/T16514_c.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/testsuite/tests/rts/T16514_c.cpp b/testsuite/tests/rts/T16514_c.cpp
new file mode 100644
index 0000000000..1474741ec0
--- /dev/null
+++ b/testsuite/tests/rts/T16514_c.cpp
@@ -0,0 +1,45 @@
+#include <iostream>
+#include <stdexcept>
+
+extern "C" {
+
+void fn_hs();
+void fn() {
+ fn_hs();
+}
+
+void check(double sqrt2, double sqrt3, double sqrt5,
+ double sqrt8, double sqrt13, double sqrt21) {
+ std::cout << std::fixed << sqrt2 << " " << sqrt3 << " " << sqrt5 << " "
+ << sqrt8 << " " << sqrt13 << " " << sqrt21 << std::endl;
+ if (sqrt2 != 1.41421 || sqrt3 != 1.73205 || sqrt5 != 2.23607 ||
+ sqrt8 != 2.82843 || sqrt13 != 3.60555 || sqrt21 != 4.58258) {
+ throw std::runtime_error("xmm registers have been scratched");
+ }
+}
+
+int test() {
+ try {
+ double sqrt2 = 1.41421;
+ double sqrt3 = 1.73205;
+ double sqrt5 = 2.23607;
+ double sqrt8 = 2.82843;
+ double sqrt13 = 3.60555;
+ double sqrt21 = 4.58258;
+ check(sqrt2, sqrt3, sqrt5, sqrt8, sqrt13, sqrt21);
+ fn();
+ check(sqrt2, sqrt3, sqrt5, sqrt8, sqrt13, sqrt21);
+ try {
+ fn();
+ } catch (const std::exception &) {
+ }
+ check(sqrt2, sqrt3, sqrt5, sqrt8, sqrt13, sqrt21);
+ } catch (const std::exception &e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+ return 0;
+}
+
+} // extern "C"
+