| #include "riscv/riscv_fp_host.h" |
| |
| #include <cstdint> |
| #include <ios> |
| |
| #include "googlemock/include/gmock/gmock.h" |
| #include "mpact/sim/generic/instruction.h" |
| |
| namespace { |
| |
| using ::mpact::sim::generic::Instruction; |
| using ::mpact::sim::riscv::GetHostFloatingPointInterface; |
| using ::mpact::sim::riscv::HostFloatingPointInterface; |
| using ::mpact::sim::riscv::ScopedFPStatus; |
| |
| class RiscVFPHostTest : public testing::Test { |
| protected: |
| RiscVFPHostTest() { |
| host_fp_interface_ = GetHostFloatingPointInterface(); |
| instruction_ = new Instruction(0x1000, nullptr); |
| instruction_->set_size(4); |
| } |
| |
| ~RiscVFPHostTest() override { |
| delete host_fp_interface_; |
| delete instruction_; |
| } |
| |
| HostFloatingPointInterface *host_fp_interface_; |
| Instruction *instruction_; |
| }; |
| |
| static float sum = 0.0; |
| |
| static void simple_add(const Instruction *inst) { sum += 1.0; } |
| |
| TEST_F(RiscVFPHostTest, SetGetCsr) { |
| // Run through all the different values of the csr status bits. |
| for (uint32_t i = 0; i < (1 << 5); i++) { |
| host_fp_interface_->SetRiscVFcsr(i); |
| EXPECT_EQ(host_fp_interface_->GetRiscVFcsr(), i) << std::hex << i; |
| } |
| } |
| |
| TEST_F(RiscVFPHostTest, CheckCsrIsPreserved) { |
| // Execute a simple add instruction (which will not modify the status bits). |
| // Make sure the status bits stay the same. |
| for (uint32_t status = 0; status < (1 << 5); status++) { |
| // Rounding mode is round-to-nearest. |
| host_fp_interface_->SetRiscVFcsr(status); |
| instruction_->set_semantic_function(&simple_add); |
| { |
| ScopedFPStatus set_fp_status(host_fp_interface_); |
| instruction_->Execute(nullptr); |
| } |
| EXPECT_EQ(host_fp_interface_->GetRiscVFcsr(), status) << std::hex << status; |
| } |
| } |
| |
| } // namespace |