| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include <zxtest/zxtest.h> |
| |
| namespace { |
| |
| double fpu_test_loop(long ex_loops, long factor) { |
| double ev[4] = {1.0, -1.0, -1.0, -1.0}; |
| double t = 0.49999975; |
| |
| const long inner = 120 * factor; |
| |
| for (int ix = 0; ix < ex_loops; ix++) { |
| for (int iz = 0; iz < inner; iz++) { |
| ev[0] = (ev[0] + ev[1] + ev[2] - ev[3]) * t; |
| ev[1] = (ev[0] + ev[1] - ev[2] + ev[3]) * t; |
| ev[2] = (ev[0] - ev[1] + ev[2] + ev[3]) * t; |
| ev[3] = (-ev[0] + ev[1] + ev[2] + ev[3]) * t; |
| } |
| t = 1.0 - t; |
| } |
| return ev[3]; |
| } |
| |
| // This is a floating point computation that takes longer than one |
| // quantum. It is meant to test the code that handles saving and |
| // restoring the floating point registers, in particular for ARM. |
| // For reference, with the parameters below it takes about 500ms |
| // to complete in the arm-qemu-kvm bots. |
| TEST(FPUTest, LongComputeLoop) { |
| auto result = fpu_test_loop(5, 100); |
| char result_str[64] = {}; |
| sprintf(result_str, "%3.18f", result); |
| ASSERT_STREQ(result_str, "-1.123982548697285422"); |
| } |
| |
| } // namespace |