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