aboutsummaryrefslogtreecommitdiffhomepage
path: root/externals/biscuit/tests/src/assembler_rvd_tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/biscuit/tests/src/assembler_rvd_tests.cpp')
-rw-r--r--externals/biscuit/tests/src/assembler_rvd_tests.cpp528
1 files changed, 528 insertions, 0 deletions
diff --git a/externals/biscuit/tests/src/assembler_rvd_tests.cpp b/externals/biscuit/tests/src/assembler_rvd_tests.cpp
new file mode 100644
index 00000000..789df61d
--- /dev/null
+++ b/externals/biscuit/tests/src/assembler_rvd_tests.cpp
@@ -0,0 +1,528 @@
+#include <catch/catch.hpp>
+
+#include <biscuit/assembler.hpp>
+
+#include "assembler_test_utils.hpp"
+
+using namespace biscuit;
+
+TEST_CASE("FADD.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FADD_D(f31, f7, f26, RMode::RNE);
+ REQUIRE(value == 0x03A38FD3);
+
+ as.RewindBuffer();
+
+ as.FADD_D(f31, f7, f26, RMode::RMM);
+ REQUIRE(value == 0x03A3CFD3);
+
+ as.RewindBuffer();
+
+ as.FADD_D(f31, f7, f26, RMode::DYN);
+ REQUIRE(value == 0x03A3FFD3);
+}
+
+TEST_CASE("FCLASS.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FCLASS_D(x31, f7);
+ REQUIRE(value == 0xE2039FD3);
+
+ as.RewindBuffer();
+
+ as.FCLASS_D(x7, f31);
+ REQUIRE(value == 0xE20F93D3);
+}
+
+TEST_CASE("FCVT.D.S", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FCVT_D_S(f31, f7, RMode::RNE);
+ REQUIRE(value == 0x42038FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_S(f31, f7, RMode::RMM);
+ REQUIRE(value == 0x4203CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_S(f31, f7, RMode::DYN);
+ REQUIRE(value == 0x4203FFD3);
+}
+
+TEST_CASE("FCVT.D.W", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FCVT_D_W(f31, x7, RMode::RNE);
+ REQUIRE(value == 0xD2038FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_W(f31, x7, RMode::RMM);
+ REQUIRE(value == 0xD203CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_W(f31, x7, RMode::DYN);
+ REQUIRE(value == 0xD203FFD3);
+}
+
+TEST_CASE("FCVT.D.WU", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FCVT_D_WU(f31, x7, RMode::RNE);
+ REQUIRE(value == 0xD2138FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_WU(f31, x7, RMode::RMM);
+ REQUIRE(value == 0xD213CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_WU(f31, x7, RMode::DYN);
+ REQUIRE(value == 0xD213FFD3);
+}
+
+TEST_CASE("FCVT.L.D", "[rv64d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler64(value);
+
+ as.FCVT_L_D(x31, f7, RMode::RNE);
+ REQUIRE(value == 0xC2238FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_L_D(x31, f7, RMode::RMM);
+ REQUIRE(value == 0xC223CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_L_D(x31, f7, RMode::DYN);
+ REQUIRE(value == 0xC223FFD3);
+}
+
+TEST_CASE("FCVT.LU.D", "[rv64d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler64(value);
+
+ as.FCVT_LU_D(x31, f7, RMode::RNE);
+ REQUIRE(value == 0xC2338FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_LU_D(x31, f7, RMode::RMM);
+ REQUIRE(value == 0xC233CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_LU_D(x31, f7, RMode::DYN);
+ REQUIRE(value == 0xC233FFD3);
+}
+
+TEST_CASE("FCVT.D.L", "[rv64d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler64(value);
+
+ as.FCVT_D_L(f31, x7, RMode::RNE);
+ REQUIRE(value == 0xD2238FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_L(f31, x7, RMode::RMM);
+ REQUIRE(value == 0xD223CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_L(f31, x7, RMode::DYN);
+ REQUIRE(value == 0xD223FFD3);
+}
+
+TEST_CASE("FCVT.D.LU", "[rv64d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler64(value);
+
+ as.FCVT_D_LU(f31, x7, RMode::RNE);
+ REQUIRE(value == 0xD2338FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_LU(f31, x7, RMode::RMM);
+ REQUIRE(value == 0xD233CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_D_LU(f31, x7, RMode::DYN);
+ REQUIRE(value == 0xD233FFD3);
+}
+
+TEST_CASE("FCVT.W.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FCVT_W_D(x31, f7, RMode::RNE);
+ REQUIRE(value == 0xC2038FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_W_D(x31, f7, RMode::RMM);
+ REQUIRE(value == 0xC203CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_W_D(x31, f7, RMode::DYN);
+ REQUIRE(value == 0xC203FFD3);
+}
+
+TEST_CASE("FCVT.WU.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FCVT_WU_D(x31, f7, RMode::RNE);
+ REQUIRE(value == 0xC2138FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_WU_D(x31, f7, RMode::RMM);
+ REQUIRE(value == 0xC213CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_WU_D(x31, f7, RMode::DYN);
+ REQUIRE(value == 0xC213FFD3);
+}
+
+TEST_CASE("FCVT.S.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FCVT_S_D(f31, f7, RMode::RNE);
+ REQUIRE(value == 0x40138FD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_S_D(f31, f7, RMode::RMM);
+ REQUIRE(value == 0x4013CFD3);
+
+ as.RewindBuffer();
+
+ as.FCVT_S_D(f31, f7, RMode::DYN);
+ REQUIRE(value == 0x4013FFD3);
+}
+
+TEST_CASE("FDIV.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FDIV_D(f31, f7, f26, RMode::RNE);
+ REQUIRE(value == 0x1BA38FD3);
+
+ as.RewindBuffer();
+
+ as.FDIV_D(f31, f7, f26, RMode::RMM);
+ REQUIRE(value == 0x1BA3CFD3);
+
+ as.RewindBuffer();
+
+ as.FDIV_D(f31, f7, f26, RMode::DYN);
+ REQUIRE(value == 0x1BA3FFD3);
+}
+
+TEST_CASE("FEQ.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FEQ_D(x31, f7, f26);
+ REQUIRE(value == 0xA3A3AFD3);
+
+ as.RewindBuffer();
+
+ as.FEQ_D(x31, f26, f7);
+ REQUIRE(value == 0xA27D2FD3);
+}
+
+TEST_CASE("FLE.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FLE_D(x31, f7, f26);
+ REQUIRE(value == 0xA3A38FD3);
+
+ as.RewindBuffer();
+
+ as.FLE_D(x31, f26, f7);
+ REQUIRE(value == 0xA27D0FD3);
+}
+
+TEST_CASE("FLT.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FLT_D(x31, f7, f26);
+ REQUIRE(value == 0xA3A39FD3);
+
+ as.RewindBuffer();
+
+ as.FLT_D(x31, f26, f7);
+ REQUIRE(value == 0xA27D1FD3);
+}
+
+TEST_CASE("FLD", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FLD(f15, 1024, x31);
+ REQUIRE(value == 0x400FB787);
+
+ as.RewindBuffer();
+
+ as.FLD(f15, 1536, x31);
+ REQUIRE(value == 0x600FB787);
+
+ as.RewindBuffer();
+
+ as.FLD(f15, -1, x31);
+ REQUIRE(value == 0xFFFFB787);
+}
+
+TEST_CASE("FMADD.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FMADD_D(f15, f31, f7, f26, RMode::RNE);
+ REQUIRE(value == 0xD27F87C3);
+
+ as.RewindBuffer();
+
+ as.FMADD_D(f15, f31, f7, f26, RMode::RMM);
+ REQUIRE(value == 0xD27FC7C3);
+
+ as.RewindBuffer();
+
+ as.FMADD_D(f15, f31, f7, f26, RMode::DYN);
+ REQUIRE(value == 0xD27FF7C3);
+}
+
+TEST_CASE("FMAX.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FMAX_D(f31, f7, f26);
+ REQUIRE(value == 0x2BA39FD3);
+
+ as.RewindBuffer();
+
+ as.FMAX_D(f31, f31, f31);
+ REQUIRE(value == 0x2BFF9FD3);
+}
+
+TEST_CASE("FMIN.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FMIN_D(f31, f7, f26);
+ REQUIRE(value == 0x2BA38FD3);
+
+ as.RewindBuffer();
+
+ as.FMIN_D(f31, f31, f31);
+ REQUIRE(value == 0x2BFF8FD3);
+}
+
+TEST_CASE("FMSUB.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FMSUB_D(f15, f31, f7, f26, RMode::RNE);
+ REQUIRE(value == 0xD27F87C7);
+
+ as.RewindBuffer();
+
+ as.FMSUB_D(f15, f31, f7, f26, RMode::RMM);
+ REQUIRE(value == 0xD27FC7C7);
+
+ as.RewindBuffer();
+
+ as.FMSUB_D(f15, f31, f7, f26, RMode::DYN);
+ REQUIRE(value == 0xD27FF7C7);
+}
+
+TEST_CASE("FMUL.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FMUL_D(f31, f7, f26, RMode::RNE);
+ REQUIRE(value == 0x13A38FD3);
+
+ as.RewindBuffer();
+
+ as.FMUL_D(f31, f7, f26, RMode::RMM);
+ REQUIRE(value == 0x13A3CFD3);
+
+ as.RewindBuffer();
+
+ as.FMUL_D(f31, f7, f26, RMode::DYN);
+ REQUIRE(value == 0x13A3FFD3);
+}
+
+TEST_CASE("FMV.D.X", "[rv64d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler64(value);
+
+ as.FMV_D_X(f31, x7);
+ REQUIRE(value == 0xF2038FD3);
+
+ as.RewindBuffer();
+
+ as.FMV_D_X(f7, x31);
+ REQUIRE(value == 0xF20F83D3);
+}
+
+TEST_CASE("FMV.X.D", "[rv64d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler64(value);
+
+ as.FMV_X_D(x31, f7);
+ REQUIRE(value == 0xE2038FD3);
+
+ as.RewindBuffer();
+
+ as.FMV_X_D(x7, f31);
+ REQUIRE(value == 0xE20F83D3);
+}
+
+TEST_CASE("FNMADD.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FNMADD_D(f15, f31, f7, f26, RMode::RNE);
+ REQUIRE(value == 0xD27F87CF);
+
+ as.RewindBuffer();
+
+ as.FNMADD_D(f15, f31, f7, f26, RMode::RMM);
+ REQUIRE(value == 0xD27FC7CF);
+
+ as.RewindBuffer();
+
+ as.FNMADD_D(f15, f31, f7, f26, RMode::DYN);
+ REQUIRE(value == 0xD27FF7CF);
+}
+
+TEST_CASE("FNMSUB.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FNMSUB_D(f15, f31, f7, f26, RMode::RNE);
+ REQUIRE(value == 0xD27F87CB);
+
+ as.RewindBuffer();
+
+ as.FNMSUB_D(f15, f31, f7, f26, RMode::RMM);
+ REQUIRE(value == 0xD27FC7CB);
+
+ as.RewindBuffer();
+
+ as.FNMSUB_D(f15, f31, f7, f26, RMode::DYN);
+ REQUIRE(value == 0xD27FF7CB);
+}
+
+TEST_CASE("FSGNJ.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FSGNJ_D(f31, f7, f26);
+ REQUIRE(value == 0x23A38FD3);
+
+ as.RewindBuffer();
+
+ as.FSGNJ_D(f31, f31, f31);
+ REQUIRE(value == 0x23FF8FD3);
+}
+
+TEST_CASE("FSGNJN.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FSGNJN_D(f31, f7, f26);
+ REQUIRE(value == 0x23A39FD3);
+
+ as.RewindBuffer();
+
+ as.FSGNJN_D(f31, f31, f31);
+ REQUIRE(value == 0x23FF9FD3);
+}
+
+TEST_CASE("FSGNJX.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FSGNJX_D(f31, f7, f26);
+ REQUIRE(value == 0x23A3AFD3);
+
+ as.RewindBuffer();
+
+ as.FSGNJX_D(f31, f31, f31);
+ REQUIRE(value == 0x23FFAFD3);
+}
+
+TEST_CASE("FSQRT.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FSQRT_D(f31, f7, RMode::RNE);
+ REQUIRE(value == 0x5A038FD3);
+
+ as.RewindBuffer();
+
+ as.FSQRT_D(f31, f7, RMode::RMM);
+ REQUIRE(value == 0x5A03CFD3);
+
+ as.RewindBuffer();
+
+ as.FSQRT_D(f31, f7, RMode::DYN);
+ REQUIRE(value == 0x5A03FFD3);
+}
+
+TEST_CASE("FSUB.D", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FSUB_D(f31, f7, f26, RMode::RNE);
+ REQUIRE(value == 0x0BA38FD3);
+
+ as.RewindBuffer();
+
+ as.FSUB_D(f31, f7, f26, RMode::RMM);
+ REQUIRE(value == 0x0BA3CFD3);
+
+ as.RewindBuffer();
+
+ as.FSUB_D(f31, f7, f26, RMode::DYN);
+ REQUIRE(value == 0x0BA3FFD3);
+}
+
+TEST_CASE("FSD", "[rv32d]") {
+ uint32_t value = 0;
+ auto as = MakeAssembler32(value);
+
+ as.FSD(f31, 1024, x15);
+ REQUIRE(value == 0x41F7B027);
+
+ as.RewindBuffer();
+
+ as.FSD(f31, 1536, x15);
+ REQUIRE(value == 0x61F7B027);
+
+ as.RewindBuffer();
+
+ as.FSD(f31, -1, x15);
+ REQUIRE(value == 0xFFF7BFA7);
+}