Add vzext and vsext tests. Change-Id: Id89ababab60effe35dc14e24467c330a7c3d26b5
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4cd5d32..b98912a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt
@@ -83,6 +83,24 @@ -Xlinker --defsym=__itcm_length__=128K ) +vec_cc_generated_test( + NAME + vsext + OPFMT + VXUNARY0 + LINKOPTS + -Xlinker --defsym=__itcm_length__=128K +) + +vec_cc_generated_test( + NAME + vzext + OPFMT + VXUNARY0 + LINKOPTS + -Xlinker --defsym=__itcm_length__=128K +) + vec_cc_test( NAME vsetvl_test @@ -125,4 +143,3 @@ TIMEOUT 40 ) -
diff --git a/tests/scripts/generate_vector_tests.py b/tests/scripts/generate_vector_tests.py index b3e002d..47f39fd 100644 --- a/tests/scripts/generate_vector_tests.py +++ b/tests/scripts/generate_vector_tests.py
@@ -27,6 +27,7 @@ 'OPIVV':'opivv_test.tpl.cpp', 'OPIVI':'opivi_test.tpl.cpp', 'OPIVX':'opivx_test.tpl.cpp', + 'VXUNARY0':'vxunary0_test.tpl.cpp' } parser.add_argument('--instruction-format',
diff --git a/tests/templates/vxunary0_test.tpl.cpp b/tests/templates/vxunary0_test.tpl.cpp new file mode 100644 index 0000000..b43e968 --- /dev/null +++ b/tests/templates/vxunary0_test.tpl.cpp
@@ -0,0 +1,57 @@ +<%inherit file="base.tpl.cpp"/>\ + +namespace ${op_code}_test { +namespace { + +using namespace test_v_helpers; + +uint8_t src_vector_1[MAXVL_BYTES]; +uint8_t dest_vector[MAXVL_BYTES]; +uint8_t ref_dest_vector[MAXVL_BYTES]; + +class ${op_code.capitalize()}Test : public ::testing::Test { + protected: + void SetUp() override { zero_vector_registers(); } + void TearDown() override { zero_vector_registers(); } +}; +% for fraction, sew in [(4, 32), (2, 16)]: +% for lmul in [1, 2, 4, 8]: +<% +sign_type = "u" if "z" in op_code else "" +src_type = "%sint%d_t" % (sign_type, sew/fraction) +dest_type = "%sint%d_t" % (sign_type, sew) +%>\ +TEST_F(${op_code.capitalize()}Test, VF${fraction}e${sew}m${lmul}) { + for (int i = 0; i < AVL_COUNT; i++) { + int32_t avl = AVLS[i]; + int vlmax; + int vl; + std::tie(vlmax, vl) = vector_test_setup<${dest_type}>( + VLMUL::LMUL_M${lmul}, avl, + {src_vector_1, dest_vector, ref_dest_vector}); + if (avl > vlmax) { + continue; + } + ${src_type} *ptr_vec_1 = reinterpret_cast<${src_type} *>(src_vector_1); + ${dest_type} *ptr_dest_vec = reinterpret_cast<${dest_type} *>(dest_vector); + ${dest_type} *ptr_ref_dest_vec = reinterpret_cast<${dest_type} *>(ref_dest_vector); + fill_random_vector<${src_type}>(ptr_vec_1, avl); + memset(dest_vector, 0, sizeof(dest_vector)); + memset(ref_dest_vector, 0, sizeof(ref_dest_vector)); + softrvv::${op_code}_v<${dest_type}, ${src_type}>(ptr_ref_dest_vec, ptr_vec_1, avl); + // Load vector registers + __asm__ volatile("vle${sew//fraction}.v v8, (%0)" : : "r"(ptr_vec_1)); + + // Run target instruction + __asm__ volatile("${op_code}.vf${fraction} v24, v8" ::); + + // Store result vector register + __asm__ volatile("vse${sew}.v v24, (%0)" : : "r"(ptr_dest_vec)); + // Check vector elements + assert_vec_elem_eq<${dest_type}>(vlmax, dest_vector, ref_dest_vector); + } +} +%endfor +%endfor +} // namespace +} // namespace ${op_code}_test