Enable checks for illegal vtypes. * Enable tests for illegal lmul/sew combinations. * Mark them as illegal and modify test to check for illegal condition. Change-Id: I5a08460a2a07c1ee643c3f21defde5f9e19886e4
diff --git a/tests/vsetvl_test.cpp b/tests/vsetvl_test.cpp index 0aedb0a..90351c0 100644 --- a/tests/vsetvl_test.cpp +++ b/tests/vsetvl_test.cpp
@@ -12,34 +12,71 @@ using namespace test_v_helpers; const uint64_t VLEN = 512u; +const uint32_t VILL = 0x80000000; #define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) +static inline uint32_t read_vtype() { + uint32_t vtype; + __asm__ volatile("csrr %[VTYPE], vtype" : [VTYPE] "=r"(vtype) :); + return vtype; +} + +static inline bool is_illegal_vtype() { + uint32_t vtype = read_vtype(); + if (vtype & VILL) { + return true; + } + return false; +} + static uint32_t calculate_vl(uint32_t sew, uint32_t avl, float lmul) { uint32_t vlmax = (uint32_t)(VLEN * lmul / sew); return MIN(avl, vlmax); } -static void test_vsetvl(VSEW sew, VLMUL vlmul, uint32_t width, float lmul) { +static void test_vsetvl(VSEW sew, VLMUL vlmul, uint32_t width, float lmul, + bool expect_illegal = false) { size_t vl = 0; for (int i = 0; i < AVL_COUNT; i++) { vl = set_vsetvl_intrinsic(sew, vlmul, AVLS[i]); - EXPECT_EQ(vl, calculate_vl(width, AVLS[i], lmul)); + if (!expect_illegal) { + EXPECT_EQ(vl, calculate_vl(width, AVLS[i], lmul)); + } else { + EXPECT_TRUE(is_illegal_vtype()); + } } for (int i = 0; i < AVL_COUNT; i++) { vl = set_vsetvl(sew, vlmul, AVLS[i], false, false); - EXPECT_EQ(vl, calculate_vl(width, AVLS[i], lmul)); + if (!expect_illegal) { + EXPECT_EQ(vl, calculate_vl(width, AVLS[i], lmul)); + } else { + EXPECT_TRUE(is_illegal_vtype()); + } } for (int i = 0; i < AVL_COUNT; i++) { vl = set_vsetvli(sew, vlmul, AVLS[i]); - EXPECT_EQ(vl, calculate_vl(width, AVLS[i], lmul)); + if (!expect_illegal) { + EXPECT_EQ(vl, calculate_vl(width, AVLS[i], lmul)); + } else { + EXPECT_TRUE(is_illegal_vtype()); + } } vl = set_vsetivli(sew, vlmul); - EXPECT_EQ(vl, calculate_vl(width, AVL_CONST, lmul)); + if (!expect_illegal) { + EXPECT_EQ(vl, calculate_vl(width, AVL_CONST, lmul)); + } else { + EXPECT_TRUE(is_illegal_vtype()); + } } -static void test_vsetvlmax(VSEW sew, VLMUL vlmul, uint32_t width, float lmul) { - EXPECT_EQ(get_vsetvlmax_intrinsic(sew, vlmul), (int)VLEN / width * lmul); +static void test_vsetvlmax(VSEW sew, VLMUL vlmul, uint32_t width, float lmul, + bool expect_illegal = false) { + if (!expect_illegal) { + EXPECT_EQ(get_vsetvlmax_intrinsic(sew, vlmul), (int)VLEN / width * lmul); + } else { + EXPECT_EQ(get_vsetvlmax_intrinsic(sew, vlmul), 0); + } } TEST(VsetvlTest, vsetvl_e8m1) { @@ -102,17 +139,16 @@ test_vsetvl(VSEW::SEW_E16, VLMUL::LMUL_MF2, 16, 0.5); } -// The tests pass on Renode but fail on Qemu. -TEST(VsetvlTest, DISABLED_vsetvl_e8mf8) { - test_vsetvl(VSEW::SEW_E8, VLMUL::LMUL_MF8, 8, 0.125); +TEST(VsetvlTest, vsetvl_e8mf8_vill) { + test_vsetvl(VSEW::SEW_E8, VLMUL::LMUL_MF8, 8, 0.125, true); } -TEST(VsetvlTest, DISABLED_vsetvl_e16m4) { - test_vsetvl(VSEW::SEW_E16, VLMUL::LMUL_MF4, 16, 0.25); +TEST(VsetvlTest, vsetvl_e16mf4_vill) { + test_vsetvl(VSEW::SEW_E16, VLMUL::LMUL_MF4, 16, 0.25, true); } -TEST(VsetvlTest, DISABLED_vsetvl_e32mf2) { - test_vsetvl(VSEW::SEW_E32, VLMUL::LMUL_MF2, 32, 0.5); +TEST(VsetvlTest, vsetvl_e32mf2_vill) { + test_vsetvl(VSEW::SEW_E32, VLMUL::LMUL_MF2, 32, 0.5, true); } TEST(VsetvlTest, vsetvlmax_e8m1) { @@ -175,17 +211,16 @@ test_vsetvlmax(VSEW::SEW_E16, VLMUL::LMUL_MF2, 16, 0.5); } -// The tests pass on Renode but fail on Qemu. -TEST(VsetvlTest, DISABLED_vsetvlmax_e8mf8) { - test_vsetvlmax(VSEW::SEW_E8, VLMUL::LMUL_MF8, 8, 0.125); +TEST(VsetvlTest, vsetvlmax_e8mf8_vill) { + test_vsetvlmax(VSEW::SEW_E8, VLMUL::LMUL_MF8, 8, 0.125, true); } -TEST(VsetvlTest, DISABLED_vsetvlmax_e16m4) { - test_vsetvlmax(VSEW::SEW_E16, VLMUL::LMUL_MF4, 16, 0.25); +TEST(VsetvlTest, vsetvlmax_e16mf4_vill) { + test_vsetvlmax(VSEW::SEW_E16, VLMUL::LMUL_MF4, 16, 0.25, true); } -TEST(VsetvlTest, DISABLED_vsetvlmax_e32mf2) { - test_vsetvlmax(VSEW::SEW_E32, VLMUL::LMUL_MF2, 32, 0.5); +TEST(VsetvlTest, vsetvlmax_e32mf2_vill) { + test_vsetvlmax(VSEW::SEW_E32, VLMUL::LMUL_MF2, 32, 0.5, true); } } // namespace