diff options
Diffstat (limited to 'externals/biscuit/tests/src/assembler_rvf_tests.cpp')
-rw-r--r-- | externals/biscuit/tests/src/assembler_rvf_tests.cpp | 1085 |
1 files changed, 1085 insertions, 0 deletions
diff --git a/externals/biscuit/tests/src/assembler_rvf_tests.cpp b/externals/biscuit/tests/src/assembler_rvf_tests.cpp new file mode 100644 index 00000000..1fe177a8 --- /dev/null +++ b/externals/biscuit/tests/src/assembler_rvf_tests.cpp @@ -0,0 +1,1085 @@ +#include <catch/catch.hpp> + +#include <biscuit/assembler.hpp> + +#include "assembler_test_utils.hpp" + +using namespace biscuit; + +TEST_CASE("FADD.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FADD_H(f31, f7, f26, RMode::RNE); + REQUIRE(value == 0x05A38FD3); + + as.RewindBuffer(); + + as.FADD_H(f31, f7, f26, RMode::RMM); + REQUIRE(value == 0x05A3CFD3); + + as.RewindBuffer(); + + as.FADD_H(f31, f7, f26, RMode::DYN); + REQUIRE(value == 0x05A3FFD3); +} + +TEST_CASE("FADD.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FADD_S(f31, f7, f26, RMode::RNE); + REQUIRE(value == 0x01A38FD3); + + as.RewindBuffer(); + + as.FADD_S(f31, f7, f26, RMode::RMM); + REQUIRE(value == 0x01A3CFD3); + + as.RewindBuffer(); + + as.FADD_S(f31, f7, f26, RMode::DYN); + REQUIRE(value == 0x01A3FFD3); +} + +TEST_CASE("FCLASS.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCLASS_H(x31, f7); + REQUIRE(value == 0xE4039FD3); + + as.RewindBuffer(); + + as.FCLASS_H(x7, f31); + REQUIRE(value == 0xE40F93D3); +} + +TEST_CASE("FCLASS.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCLASS_S(x31, f7); + REQUIRE(value == 0xE0039FD3); + + as.RewindBuffer(); + + as.FCLASS_S(x7, f31); + REQUIRE(value == 0xE00F93D3); +} + +TEST_CASE("FCVT.D.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_D_H(f31, f7, RMode::RNE); + REQUIRE(value == 0x42238FD3); + + as.RewindBuffer(); + + as.FCVT_D_H(f31, f7, RMode::RMM); + REQUIRE(value == 0x4223CFD3); + + as.RewindBuffer(); + + as.FCVT_D_H(f31, f7, RMode::DYN); + REQUIRE(value == 0x4223FFD3); +} + +TEST_CASE("FCVT.H.D", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_H_D(f31, f7, RMode::RNE); + REQUIRE(value == 0x44138FD3); + + as.RewindBuffer(); + + as.FCVT_H_D(f31, f7, RMode::RMM); + REQUIRE(value == 0x4413CFD3); + + as.RewindBuffer(); + + as.FCVT_H_D(f31, f7, RMode::DYN); + REQUIRE(value == 0x4413FFD3); +} + +TEST_CASE("FCVT.H.Q", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_H_Q(f31, f7, RMode::RNE); + REQUIRE(value == 0x44338FD3); + + as.RewindBuffer(); + + as.FCVT_H_Q(f31, f7, RMode::RMM); + REQUIRE(value == 0x4433CFD3); + + as.RewindBuffer(); + + as.FCVT_H_Q(f31, f7, RMode::DYN); + REQUIRE(value == 0x4433FFD3); +} + +TEST_CASE("FCVT.H.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_H_S(f31, f7, RMode::RNE); + REQUIRE(value == 0x44038FD3); + + as.RewindBuffer(); + + as.FCVT_H_S(f31, f7, RMode::RMM); + REQUIRE(value == 0x4403CFD3); + + as.RewindBuffer(); + + as.FCVT_H_S(f31, f7, RMode::DYN); + REQUIRE(value == 0x4403FFD3); +} + +TEST_CASE("FCVT.Q.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_Q_H(f31, f7, RMode::RNE); + REQUIRE(value == 0x46238FD3); + + as.RewindBuffer(); + + as.FCVT_Q_H(f31, f7, RMode::RMM); + REQUIRE(value == 0x4623CFD3); + + as.RewindBuffer(); + + as.FCVT_Q_H(f31, f7, RMode::DYN); + REQUIRE(value == 0x4623FFD3); +} + +TEST_CASE("FCVT.S.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_S_H(f31, f7, RMode::RNE); + REQUIRE(value == 0x40238FD3); + + as.RewindBuffer(); + + as.FCVT_S_H(f31, f7, RMode::RMM); + REQUIRE(value == 0x4023CFD3); + + as.RewindBuffer(); + + as.FCVT_S_H(f31, f7, RMode::DYN); + REQUIRE(value == 0x4023FFD3); +} + +TEST_CASE("FCVT.H.W", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_H_W(f31, x7, RMode::RNE); + REQUIRE(value == 0xD4038FD3); + + as.RewindBuffer(); + + as.FCVT_H_W(f31, x7, RMode::RMM); + REQUIRE(value == 0xD403CFD3); + + as.RewindBuffer(); + + as.FCVT_H_W(f31, x7, RMode::DYN); + REQUIRE(value == 0xD403FFD3); +} + +TEST_CASE("FCVT.S.W", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_S_W(f31, x7, RMode::RNE); + REQUIRE(value == 0xD0038FD3); + + as.RewindBuffer(); + + as.FCVT_S_W(f31, x7, RMode::RMM); + REQUIRE(value == 0xD003CFD3); + + as.RewindBuffer(); + + as.FCVT_S_W(f31, x7, RMode::DYN); + REQUIRE(value == 0xD003FFD3); +} + +TEST_CASE("FCVT.H.WU", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_H_WU(f31, x7, RMode::RNE); + REQUIRE(value == 0xD4138FD3); + + as.RewindBuffer(); + + as.FCVT_H_WU(f31, x7, RMode::RMM); + REQUIRE(value == 0xD413CFD3); + + as.RewindBuffer(); + + as.FCVT_H_WU(f31, x7, RMode::DYN); + REQUIRE(value == 0xD413FFD3); +} + +TEST_CASE("FCVT.S.WU", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_S_WU(f31, x7, RMode::RNE); + REQUIRE(value == 0xD0138FD3); + + as.RewindBuffer(); + + as.FCVT_S_WU(f31, x7, RMode::RMM); + REQUIRE(value == 0xD013CFD3); + + as.RewindBuffer(); + + as.FCVT_S_WU(f31, x7, RMode::DYN); + REQUIRE(value == 0xD013FFD3); +} + +TEST_CASE("FCVT.L.H", "[rv64f]") { + uint32_t value = 0; + auto as = MakeAssembler64(value); + + as.FCVT_L_H(x31, f7, RMode::RNE); + REQUIRE(value == 0xC4238FD3); + + as.RewindBuffer(); + + as.FCVT_L_H(x31, f7, RMode::RMM); + REQUIRE(value == 0xC423CFD3); + + as.RewindBuffer(); + + as.FCVT_L_H(x31, f7, RMode::DYN); + REQUIRE(value == 0xC423FFD3); +} + +TEST_CASE("FCVT.L.S", "[rv64f]") { + uint32_t value = 0; + auto as = MakeAssembler64(value); + + as.FCVT_L_S(x31, f7, RMode::RNE); + REQUIRE(value == 0xC0238FD3); + + as.RewindBuffer(); + + as.FCVT_L_S(x31, f7, RMode::RMM); + REQUIRE(value == 0xC023CFD3); + + as.RewindBuffer(); + + as.FCVT_L_S(x31, f7, RMode::DYN); + REQUIRE(value == 0xC023FFD3); +} + +TEST_CASE("FCVT.LU.H", "[rv64f]") { + uint32_t value = 0; + auto as = MakeAssembler64(value); + + as.FCVT_LU_H(x31, f7, RMode::RNE); + REQUIRE(value == 0xC4338FD3); + + as.RewindBuffer(); + + as.FCVT_LU_H(x31, f7, RMode::RMM); + REQUIRE(value == 0xC433CFD3); + + as.RewindBuffer(); + + as.FCVT_LU_H(x31, f7, RMode::DYN); + REQUIRE(value == 0xC433FFD3); +} + +TEST_CASE("FCVT.LU.S", "[rv64f]") { + uint32_t value = 0; + auto as = MakeAssembler64(value); + + as.FCVT_LU_S(x31, f7, RMode::RNE); + REQUIRE(value == 0xC0338FD3); + + as.RewindBuffer(); + + as.FCVT_LU_S(x31, f7, RMode::RMM); + REQUIRE(value == 0xC033CFD3); + + as.RewindBuffer(); + + as.FCVT_LU_S(x31, f7, RMode::DYN); + REQUIRE(value == 0xC033FFD3); +} + +TEST_CASE("FCVT.H.L", "[rv64f]") { + uint32_t value = 0; + auto as = MakeAssembler64(value); + + as.FCVT_H_L(f31, x7, RMode::RNE); + REQUIRE(value == 0xD4238FD3); + + as.RewindBuffer(); + + as.FCVT_H_L(f31, x7, RMode::RMM); + REQUIRE(value == 0xD423CFD3); + + as.RewindBuffer(); + + as.FCVT_H_L(f31, x7, RMode::DYN); + REQUIRE(value == 0xD423FFD3); +} + +TEST_CASE("FCVT.S.L", "[rv64f]") { + uint32_t value = 0; + auto as = MakeAssembler64(value); + + as.FCVT_S_L(f31, x7, RMode::RNE); + REQUIRE(value == 0xD0238FD3); + + as.RewindBuffer(); + + as.FCVT_S_L(f31, x7, RMode::RMM); + REQUIRE(value == 0xD023CFD3); + + as.RewindBuffer(); + + as.FCVT_S_L(f31, x7, RMode::DYN); + REQUIRE(value == 0xD023FFD3); +} + +TEST_CASE("FCVT.H.LU", "[rv64f]") { + uint32_t value = 0; + auto as = MakeAssembler64(value); + + as.FCVT_H_LU(f31, x7, RMode::RNE); + REQUIRE(value == 0xD4338FD3); + + as.RewindBuffer(); + + as.FCVT_H_LU(f31, x7, RMode::RMM); + REQUIRE(value == 0xD433CFD3); + + as.RewindBuffer(); + + as.FCVT_H_LU(f31, x7, RMode::DYN); + REQUIRE(value == 0xD433FFD3); +} + +TEST_CASE("FCVT.S.LU", "[rv64f]") { + uint32_t value = 0; + auto as = MakeAssembler64(value); + + as.FCVT_S_LU(f31, x7, RMode::RNE); + REQUIRE(value == 0xD0338FD3); + + as.RewindBuffer(); + + as.FCVT_S_LU(f31, x7, RMode::RMM); + REQUIRE(value == 0xD033CFD3); + + as.RewindBuffer(); + + as.FCVT_S_LU(f31, x7, RMode::DYN); + REQUIRE(value == 0xD033FFD3); +} + +TEST_CASE("FCVT.W.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_W_H(x31, f7, RMode::RNE); + REQUIRE(value == 0xC4038FD3); + + as.RewindBuffer(); + + as.FCVT_W_H(x31, f7, RMode::RMM); + REQUIRE(value == 0xC403CFD3); + + as.RewindBuffer(); + + as.FCVT_W_H(x31, f7, RMode::DYN); + REQUIRE(value == 0xC403FFD3); +} + +TEST_CASE("FCVT.W.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_W_S(x31, f7, RMode::RNE); + REQUIRE(value == 0xC0038FD3); + + as.RewindBuffer(); + + as.FCVT_W_S(x31, f7, RMode::RMM); + REQUIRE(value == 0xC003CFD3); + + as.RewindBuffer(); + + as.FCVT_W_S(x31, f7, RMode::DYN); + REQUIRE(value == 0xC003FFD3); +} + +TEST_CASE("FCVT.WU.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_WU_H(x31, f7, RMode::RNE); + REQUIRE(value == 0xC4138FD3); + + as.RewindBuffer(); + + as.FCVT_WU_H(x31, f7, RMode::RMM); + REQUIRE(value == 0xC413CFD3); + + as.RewindBuffer(); + + as.FCVT_WU_H(x31, f7, RMode::DYN); + REQUIRE(value == 0xC413FFD3); +} + +TEST_CASE("FCVT.WU.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FCVT_WU_S(x31, f7, RMode::RNE); + REQUIRE(value == 0xC0138FD3); + + as.RewindBuffer(); + + as.FCVT_WU_S(x31, f7, RMode::RMM); + REQUIRE(value == 0xC013CFD3); + + as.RewindBuffer(); + + as.FCVT_WU_S(x31, f7, RMode::DYN); + REQUIRE(value == 0xC013FFD3); +} + +TEST_CASE("FDIV.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FDIV_H(f31, f7, f26, RMode::RNE); + REQUIRE(value == 0x1DA38FD3); + + as.RewindBuffer(); + + as.FDIV_H(f31, f7, f26, RMode::RMM); + REQUIRE(value == 0x1DA3CFD3); + + as.RewindBuffer(); + + as.FDIV_H(f31, f7, f26, RMode::DYN); + REQUIRE(value == 0x1DA3FFD3); +} + +TEST_CASE("FDIV.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FDIV_S(f31, f7, f26, RMode::RNE); + REQUIRE(value == 0x19A38FD3); + + as.RewindBuffer(); + + as.FDIV_S(f31, f7, f26, RMode::RMM); + REQUIRE(value == 0x19A3CFD3); + + as.RewindBuffer(); + + as.FDIV_S(f31, f7, f26, RMode::DYN); + REQUIRE(value == 0x19A3FFD3); +} + +TEST_CASE("FEQ.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FEQ_H(x31, f7, f26); + REQUIRE(value == 0xA5A3AFD3); + + as.RewindBuffer(); + + as.FEQ_H(x31, f26, f7); + REQUIRE(value == 0xA47D2FD3); +} + +TEST_CASE("FEQ.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FEQ_S(x31, f7, f26); + REQUIRE(value == 0xA1A3AFD3); + + as.RewindBuffer(); + + as.FEQ_S(x31, f26, f7); + REQUIRE(value == 0xA07D2FD3); +} + +TEST_CASE("FLE.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FLE_H(x31, f7, f26); + REQUIRE(value == 0xA5A38FD3); + + as.RewindBuffer(); + + as.FLE_H(x31, f26, f7); + REQUIRE(value == 0xA47D0FD3); +} + +TEST_CASE("FLE.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FLE_S(x31, f7, f26); + REQUIRE(value == 0xA1A38FD3); + + as.RewindBuffer(); + + as.FLE_S(x31, f26, f7); + REQUIRE(value == 0xA07D0FD3); +} + +TEST_CASE("FLH", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FLH(f15, 1024, x31); + REQUIRE(value == 0x400F9787); + + as.RewindBuffer(); + + as.FLH(f15, 1536, x31); + REQUIRE(value == 0x600F9787); + + as.RewindBuffer(); + + as.FLH(f15, -1, x31); + REQUIRE(value == 0xFFFF9787); +} + +TEST_CASE("FLT.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FLT_H(x31, f7, f26); + REQUIRE(value == 0xA5A39FD3); + + as.RewindBuffer(); + + as.FLT_H(x31, f26, f7); + REQUIRE(value == 0xA47D1FD3); +} + +TEST_CASE("FLT.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FLT_S(x31, f7, f26); + REQUIRE(value == 0xA1A39FD3); + + as.RewindBuffer(); + + as.FLT_S(x31, f26, f7); + REQUIRE(value == 0xA07D1FD3); +} + +TEST_CASE("FLW", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FLW(f15, 1024, x31); + REQUIRE(value == 0x400FA787); + + as.RewindBuffer(); + + as.FLW(f15, 1536, x31); + REQUIRE(value == 0x600FA787); + + as.RewindBuffer(); + + as.FLW(f15, -1, x31); + REQUIRE(value == 0xFFFFA787); +} + +TEST_CASE("FMADD.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMADD_H(f15, f31, f7, f26, RMode::RNE); + REQUIRE(value == 0xD47F87C3); + + as.RewindBuffer(); + + as.FMADD_H(f15, f31, f7, f26, RMode::RMM); + REQUIRE(value == 0xD47FC7C3); + + as.RewindBuffer(); + + as.FMADD_H(f15, f31, f7, f26, RMode::DYN); + REQUIRE(value == 0xD47FF7C3); +} + +TEST_CASE("FMADD.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMADD_S(f15, f31, f7, f26, RMode::RNE); + REQUIRE(value == 0xD07F87C3); + + as.RewindBuffer(); + + as.FMADD_S(f15, f31, f7, f26, RMode::RMM); + REQUIRE(value == 0xD07FC7C3); + + as.RewindBuffer(); + + as.FMADD_S(f15, f31, f7, f26, RMode::DYN); + REQUIRE(value == 0xD07FF7C3); +} + +TEST_CASE("FMAX.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMAX_H(f31, f7, f26); + REQUIRE(value == 0x2DA39FD3); + + as.RewindBuffer(); + + as.FMAX_H(f31, f31, f31); + REQUIRE(value == 0x2DFF9FD3); +} + +TEST_CASE("FMAX.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMAX_S(f31, f7, f26); + REQUIRE(value == 0x29A39FD3); + + as.RewindBuffer(); + + as.FMAX_S(f31, f31, f31); + REQUIRE(value == 0x29FF9FD3); +} + +TEST_CASE("FMIN.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMIN_H(f31, f7, f26); + REQUIRE(value == 0x2DA38FD3); + + as.RewindBuffer(); + + as.FMIN_H(f31, f31, f31); + REQUIRE(value == 0x2DFF8FD3); +} + +TEST_CASE("FMIN.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMIN_S(f31, f7, f26); + REQUIRE(value == 0x29A38FD3); + + as.RewindBuffer(); + + as.FMIN_S(f31, f31, f31); + REQUIRE(value == 0x29FF8FD3); +} + +TEST_CASE("FMSUB.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMSUB_H(f15, f31, f7, f26, RMode::RNE); + REQUIRE(value == 0xD47F87C7); + + as.RewindBuffer(); + + as.FMSUB_H(f15, f31, f7, f26, RMode::RMM); + REQUIRE(value == 0xD47FC7C7); + + as.RewindBuffer(); + + as.FMSUB_H(f15, f31, f7, f26, RMode::DYN); + REQUIRE(value == 0xD47FF7C7); +} + +TEST_CASE("FMSUB.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMSUB_S(f15, f31, f7, f26, RMode::RNE); + REQUIRE(value == 0xD07F87C7); + + as.RewindBuffer(); + + as.FMSUB_S(f15, f31, f7, f26, RMode::RMM); + REQUIRE(value == 0xD07FC7C7); + + as.RewindBuffer(); + + as.FMSUB_S(f15, f31, f7, f26, RMode::DYN); + REQUIRE(value == 0xD07FF7C7); +} + +TEST_CASE("FMUL.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMUL_H(f31, f7, f26, RMode::RNE); + REQUIRE(value == 0x15A38FD3); + + as.RewindBuffer(); + + as.FMUL_H(f31, f7, f26, RMode::RMM); + REQUIRE(value == 0x15A3CFD3); + + as.RewindBuffer(); + + as.FMUL_H(f31, f7, f26, RMode::DYN); + REQUIRE(value == 0x15A3FFD3); +} + +TEST_CASE("FMUL.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMUL_S(f31, f7, f26, RMode::RNE); + REQUIRE(value == 0x11A38FD3); + + as.RewindBuffer(); + + as.FMUL_S(f31, f7, f26, RMode::RMM); + REQUIRE(value == 0x11A3CFD3); + + as.RewindBuffer(); + + as.FMUL_S(f31, f7, f26, RMode::DYN); + REQUIRE(value == 0x11A3FFD3); +} + +TEST_CASE("FMV.H.X", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMV_H_X(f31, x7); + REQUIRE(value == 0xF4038FD3); + + as.RewindBuffer(); + + as.FMV_H_X(f7, x31); + REQUIRE(value == 0xF40F83D3); +} + +TEST_CASE("FMV.W.X", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMV_W_X(f31, x7); + REQUIRE(value == 0xF0038FD3); + + as.RewindBuffer(); + + as.FMV_W_X(f7, x31); + REQUIRE(value == 0xF00F83D3); +} + +TEST_CASE("FMV.X.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMV_X_H(x31, f7); + REQUIRE(value == 0xE4038FD3); + + as.RewindBuffer(); + + as.FMV_X_H(x7, f31); + REQUIRE(value == 0xE40F83D3); +} + +TEST_CASE("FMV.X.W", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FMV_X_W(x31, f7); + REQUIRE(value == 0xE0038FD3); + + as.RewindBuffer(); + + as.FMV_X_W(x7, f31); + REQUIRE(value == 0xE00F83D3); +} + +TEST_CASE("FNMADD.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FNMADD_H(f15, f31, f7, f26, RMode::RNE); + REQUIRE(value == 0xD47F87CF); + + as.RewindBuffer(); + + as.FNMADD_H(f15, f31, f7, f26, RMode::RMM); + REQUIRE(value == 0xD47FC7CF); + + as.RewindBuffer(); + + as.FNMADD_H(f15, f31, f7, f26, RMode::DYN); + REQUIRE(value == 0xD47FF7CF); +} + +TEST_CASE("FNMADD.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FNMADD_S(f15, f31, f7, f26, RMode::RNE); + REQUIRE(value == 0xD07F87CF); + + as.RewindBuffer(); + + as.FNMADD_S(f15, f31, f7, f26, RMode::RMM); + REQUIRE(value == 0xD07FC7CF); + + as.RewindBuffer(); + + as.FNMADD_S(f15, f31, f7, f26, RMode::DYN); + REQUIRE(value == 0xD07FF7CF); +} + +TEST_CASE("FNMSUB.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FNMSUB_H(f15, f31, f7, f26, RMode::RNE); + REQUIRE(value == 0xD47F87CB); + + as.RewindBuffer(); + + as.FNMSUB_H(f15, f31, f7, f26, RMode::RMM); + REQUIRE(value == 0xD47FC7CB); + + as.RewindBuffer(); + + as.FNMSUB_H(f15, f31, f7, f26, RMode::DYN); + REQUIRE(value == 0xD47FF7CB); +} + +TEST_CASE("FNMSUB.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FNMSUB_S(f15, f31, f7, f26, RMode::RNE); + REQUIRE(value == 0xD07F87CB); + + as.RewindBuffer(); + + as.FNMSUB_S(f15, f31, f7, f26, RMode::RMM); + REQUIRE(value == 0xD07FC7CB); + + as.RewindBuffer(); + + as.FNMSUB_S(f15, f31, f7, f26, RMode::DYN); + REQUIRE(value == 0xD07FF7CB); +} + +TEST_CASE("FSGNJ.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSGNJ_H(f31, f7, f26); + REQUIRE(value == 0x25A38FD3); + + as.RewindBuffer(); + + as.FSGNJ_H(f31, f31, f31); + REQUIRE(value == 0x25FF8FD3); +} + +TEST_CASE("FSGNJ.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSGNJ_S(f31, f7, f26); + REQUIRE(value == 0x21A38FD3); + + as.RewindBuffer(); + + as.FSGNJ_S(f31, f31, f31); + REQUIRE(value == 0x21FF8FD3); +} + +TEST_CASE("FSGNJN.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSGNJN_H(f31, f7, f26); + REQUIRE(value == 0x25A39FD3); + + as.RewindBuffer(); + + as.FSGNJN_H(f31, f31, f31); + REQUIRE(value == 0x25FF9FD3); +} + +TEST_CASE("FSGNJN.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSGNJN_S(f31, f7, f26); + REQUIRE(value == 0x21A39FD3); + + as.RewindBuffer(); + + as.FSGNJN_S(f31, f31, f31); + REQUIRE(value == 0x21FF9FD3); +} + +TEST_CASE("FSGNJX.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSGNJX_H(f31, f7, f26); + REQUIRE(value == 0x25A3AFD3); + + as.RewindBuffer(); + + as.FSGNJX_H(f31, f31, f31); + REQUIRE(value == 0x25FFAFD3); +} + +TEST_CASE("FSGNJX.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSGNJX_S(f31, f7, f26); + REQUIRE(value == 0x21A3AFD3); + + as.RewindBuffer(); + + as.FSGNJX_S(f31, f31, f31); + REQUIRE(value == 0x21FFAFD3); +} + +TEST_CASE("FSH", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSH(f31, 1024, x15); + REQUIRE(value == 0x41F79027); + + as.RewindBuffer(); + + as.FSH(f31, 1536, x15); + REQUIRE(value == 0x61F79027); + + as.RewindBuffer(); + + as.FSH(f31, -1, x15); + REQUIRE(value == 0xFFF79FA7); +} + +TEST_CASE("FSQRT.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSQRT_H(f31, f7, RMode::RNE); + REQUIRE(value == 0x5C038FD3); + + as.RewindBuffer(); + + as.FSQRT_H(f31, f7, RMode::RMM); + REQUIRE(value == 0x5C03CFD3); + + as.RewindBuffer(); + + as.FSQRT_H(f31, f7, RMode::DYN); + REQUIRE(value == 0x5C03FFD3); +} + +TEST_CASE("FSQRT.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSQRT_S(f31, f7, RMode::RNE); + REQUIRE(value == 0x58038FD3); + + as.RewindBuffer(); + + as.FSQRT_S(f31, f7, RMode::RMM); + REQUIRE(value == 0x5803CFD3); + + as.RewindBuffer(); + + as.FSQRT_S(f31, f7, RMode::DYN); + REQUIRE(value == 0x5803FFD3); +} + +TEST_CASE("FSUB.H", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSUB_H(f31, f7, f26, RMode::RNE); + REQUIRE(value == 0x0DA38FD3); + + as.RewindBuffer(); + + as.FSUB_H(f31, f7, f26, RMode::RMM); + REQUIRE(value == 0x0DA3CFD3); + + as.RewindBuffer(); + + as.FSUB_H(f31, f7, f26, RMode::DYN); + REQUIRE(value == 0x0DA3FFD3); +} + +TEST_CASE("FSUB.S", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSUB_S(f31, f7, f26, RMode::RNE); + REQUIRE(value == 0x09A38FD3); + + as.RewindBuffer(); + + as.FSUB_S(f31, f7, f26, RMode::RMM); + REQUIRE(value == 0x09A3CFD3); + + as.RewindBuffer(); + + as.FSUB_S(f31, f7, f26, RMode::DYN); + REQUIRE(value == 0x09A3FFD3); +} + +TEST_CASE("FSW", "[rv32f]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FSW(f31, 1024, x15); + REQUIRE(value == 0x41F7A027); + + as.RewindBuffer(); + + as.FSW(f31, 1536, x15); + REQUIRE(value == 0x61F7A027); + + as.RewindBuffer(); + + as.FSW(f31, -1, x15); + REQUIRE(value == 0xFFF7AFA7); +} |