Vector extension test with floating point values
1. Add and change various template files to cover floating point number
instructions.
2. Generate vfadd test case using added and modified template files.
3. Test the generated test cases
3-1. Test "vadd" for back testing (to check our updated template files
work fine with previous test cases):
m springbok && ctest --verbose -R ".*vadd.*" --gtest_color=yes
3-2. Test "vfadd" with our template:
m springbok && ctest --verbose -R ".*vfadd.*" --gtest_color=yes
4. remove "sw/vec/tests/vector_vfadd_test.cpp"
Change-Id: Ieb97934994d815fbe2f0193abf274703a5ae4b3d
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index d15c4fd..05814ca 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,6 +1,15 @@
vec_cc_generated_test(
NAME
+ vfadd
+ TEMPLATE
+ opivv_opivf_test.tpl.cpp
+ LINKOPTS
+ -Xlinker --defsym=__itcm_length__=128K
+)
+
+vec_cc_generated_test(
+ NAME
vsub
TEMPLATE
opivv_opivx_test.tpl.cpp
@@ -392,12 +401,3 @@
LINKOPTS
-Xlinker --defsym=__itcm_length__=128K
)
-
-vec_cc_test(
- NAME
- vector_vfadd_test
- SRCS
- vector_vfadd_test.cpp
- LINKOPTS
- -Xlinker --defsym=__itcm_length__=128K
-)
diff --git a/tests/templates/base_opivf_test.tpl.cpp b/tests/templates/base_opivf_test.tpl.cpp
new file mode 100644
index 0000000..c3e7f09
--- /dev/null
+++ b/tests/templates/base_opivf_test.tpl.cpp
@@ -0,0 +1,83 @@
+<%!
+import vec_test_helpers
+%>\
+<%def name="test_opivf(op_code)">
+namespace ${op_code}_vf_test {
+namespace {
+
+using namespace test_v_helpers;
+
+float src_vector_2[MAXVL_BYTES];
+float dest_vector[MAXVL_BYTES];
+float 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(); }
+};
+<%
+template_helper = vec_test_helpers.VecTemplateHelper(op_code)
+sews = template_helper.get_sews()
+lmuls = template_helper.get_lmuls()
+%>\
+% for sew in sews:
+% for lmul in lmuls:
+<%
+template_helper.sew = sew
+%>\
+${insert_vf_test(template_helper, lmul)}
+%endfor
+%endfor
+
+} // namespace
+} // namespace ${op_code}_vf_test
+</%def>
+
+<%def name="insert_vf_test(template_helper, lmul)">
+<%
+# Initialize the variables for a given test config
+op_code = template_helper.op_code
+sew = template_helper.sew
+ref_opcode = template_helper.get_ref_opcode()
+dest_sew, src2_sew, _, __ = template_helper.get_sew_sizes()
+datatypes = template_helper.get_softrvv_template_data_type()
+var_types = template_helper.get_var_types()
+mnemonic = template_helper.get_mnemonic(
+ vec_test_helpers.VecTemplateHelper.OperandType.SCALAR)
+%>\
+TEST_F(${op_code.capitalize()}Test, ${mnemonic.lower().replace(".","_")}${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<${var_types.dest_type}>(
+ VLMUL::LMUL_M${lmul}, avl,
+ {dest_vector, ref_dest_vector, src_vector_2});
+
+ if (avl > vlmax) {
+ continue;
+ }
+ ${var_types.src2_type} *ptr_vec_2 = reinterpret_cast<${var_types.src2_type} *>(src_vector_2);
+ ${var_types.imm_type} test_val = static_cast<${var_types.imm_type}>(rand());
+ ${var_types.dest_type} *ptr_dest_vec = reinterpret_cast<${var_types.dest_type} *>(dest_vector);
+ ${var_types.dest_type} *ptr_ref_dest_vec = reinterpret_cast<${var_types.dest_type} *>(ref_dest_vector);
+ // set up values to test up to index of the AVL
+ fill_random_vector<${var_types.src2_type}>(ptr_vec_2, avl);
+
+ // Generate reference vector
+ softrvv::${ref_opcode}_vf(ptr_ref_dest_vec, ptr_vec_2, &test_val, avl);
+ // Load vector registers
+ __asm__ volatile("vle${src2_sew}.v v8, (%0)" : : "r"(ptr_vec_2));
+
+ // Run target instruction
+ __asm__ volatile("${mnemonic} v24, v8, %[RS1]" ::[RS1] "f"(test_val));
+
+ // Store result vector register
+ __asm__ volatile("vse${dest_sew}.v v24, (%0)" : : "r"(ptr_dest_vec));
+ // Check vector elements
+ assert_vec_elem_eq<${var_types.dest_type}>(vlmax, dest_vector, ref_dest_vector);
+ }
+}
+</%def>
diff --git a/tests/templates/base_opivv_test.tpl.cpp b/tests/templates/base_opivv_test.tpl.cpp
index a7aba2f..9acb8a7 100644
--- a/tests/templates/base_opivv_test.tpl.cpp
+++ b/tests/templates/base_opivv_test.tpl.cpp
@@ -7,21 +7,29 @@
using namespace test_v_helpers;
-uint8_t src_vector_1[MAXVL_BYTES];
-uint8_t src_vector_2[MAXVL_BYTES];
-uint8_t dest_vector[MAXVL_BYTES];
-uint8_t ref_dest_vector[MAXVL_BYTES];
+<%
+template_helper = vec_test_helpers.VecTemplateHelper(op_code)
+sews = template_helper.get_sews()
+lmuls = template_helper.get_lmuls()
+%>\
+
+% if template_helper.is_floating():
+ float src_vector_1[MAXVL_BYTES];
+ float src_vector_2[MAXVL_BYTES];
+ float dest_vector[MAXVL_BYTES];
+ float ref_dest_vector[MAXVL_BYTES];
+% else:
+ uint8_t src_vector_1[MAXVL_BYTES];
+ uint8_t src_vector_2[MAXVL_BYTES];
+ uint8_t dest_vector[MAXVL_BYTES];
+ uint8_t ref_dest_vector[MAXVL_BYTES];
+% endif
class ${op_code.capitalize()}Test : public ::testing::Test {
protected:
void SetUp() override { zero_vector_registers(); }
void TearDown() override { zero_vector_registers(); }
};
-<%
-template_helper = vec_test_helpers.VecTemplateHelper(op_code)
-sews = template_helper.get_sews()
-lmuls = template_helper.get_lmuls()
-%>\
% for sew in sews:
% for lmul in lmuls:
<%
@@ -46,15 +54,13 @@
var_types = template_helper.get_var_types()
mnemonic = template_helper.get_mnemonic(
vec_test_helpers.VecTemplateHelper.OperandType.VECTOR)
-is_narrowing = template_helper.is_narrowing()
-is_widening = template_helper.is_widening()
%>\
TEST_F(${op_code.capitalize()}Test, ${mnemonic.lower().replace(".","_")}${sew}m${lmul}) {
for (int i = 0; i < AVL_COUNT; i++) {
int32_t avl = AVLS[i];
int vlmax;
int vl;
-% if is_narrowing:
+% if not template_helper.is_floating() and template_helper.is_narrowing():
vector_test_setup<${var_types.src2_type}>(
VLMUL::LMUL_M${lmul}, avl,
{src_vector_2});
@@ -65,7 +71,7 @@
std::tie(vlmax, vl) = vector_test_setup<${var_types.dest_type}>(
VLMUL::LMUL_M${lmul}, avl,
{dest_vector, ref_dest_vector});
-% elif is_widening:
+% elif not template_helper.is_floating() and template_helper.is_widening():
/* When a widening instruction is used sew matches src2 size */
vector_test_setup<${var_types.dest_type}>(
VLMUL::LMUL_M${lmul}, avl,
@@ -80,7 +86,7 @@
/* For non narrowing instructions all vectors have same type*/
std::tie(vlmax, vl) = vector_test_setup<${var_types.dest_type}>(
VLMUL::LMUL_M${lmul}, avl,
- {dest_vector, ref_dest_vector, src_vector_1});
+ {dest_vector, ref_dest_vector, src_vector_1, src_vector_2});
% endif
if (avl > vlmax) {
@@ -98,7 +104,11 @@
memset(ref_dest_vector, 0, MAXVL_BYTES);
// Generate reference vector
- softrvv::${ref_opcode}_vv<${datatypes}>(ptr_ref_dest_vec, ptr_vec_2, ptr_vec_1, avl);
+ % if template_helper.is_floating():
+ softrvv::${ref_opcode}_vv(ptr_ref_dest_vec, ptr_vec_2, ptr_vec_1, avl);
+ % else:
+ softrvv::${ref_opcode}_vv<${datatypes}>(ptr_ref_dest_vec, ptr_vec_2, ptr_vec_1, avl);
+ % endif
// Load vector registers
__asm__ volatile("vle${src1_sew}.v v8, (%0)" : : "r"(ptr_vec_1));
__asm__ volatile("vle${src2_sew}.v v16, (%0)" : : "r"(ptr_vec_2));
diff --git a/tests/templates/opivf_test.tpl.cpp b/tests/templates/opivf_test.tpl.cpp
new file mode 100644
index 0000000..7c64120
--- /dev/null
+++ b/tests/templates/opivf_test.tpl.cpp
@@ -0,0 +1,3 @@
+<%inherit file="base.tpl.cpp"/>\
+<%namespace name="tests_vf" file="base_opivf_test.tpl.cpp"/>\
+${tests_vf.test_opivf(op)}
diff --git a/tests/templates/opivv_opivf_test.tpl.cpp b/tests/templates/opivv_opivf_test.tpl.cpp
new file mode 100644
index 0000000..b1bf4c3
--- /dev/null
+++ b/tests/templates/opivv_opivf_test.tpl.cpp
@@ -0,0 +1,5 @@
+<%inherit file="base.tpl.cpp"/>\
+<%namespace name="tests_vv" file="base_opivv_test.tpl.cpp"/>\
+<%namespace name="tests_vf" file="base_opivf_test.tpl.cpp"/>\
+${tests_vv.test_opivv(op)}
+${tests_vf.test_opivf(op)}
diff --git a/tests/templates/opivv_test.tpl.cpp b/tests/templates/opivv_test.tpl.cpp
new file mode 100644
index 0000000..428a65b
--- /dev/null
+++ b/tests/templates/opivv_test.tpl.cpp
@@ -0,0 +1,3 @@
+<%inherit file="base.tpl.cpp"/>\
+<%namespace name="tests_vv" file="base_opivv_test.tpl.cpp"/>\
+${tests_vv.test_opivv(op)}
diff --git a/tests/vector_vfadd_test.cpp b/tests/vector_vfadd_test.cpp
deleted file mode 100644
index 208cb91..0000000
--- a/tests/vector_vfadd_test.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#include <softrvv.h>
-#include <springbok.h>
-#include <stdio.h>
-
-#include <tuple>
-
-#include "pw_unit_test/framework.h"
-#include "test_v_helpers.h"
-
-namespace vfadd_vv_test
-{
-namespace
-{
-using namespace test_v_helpers;
-
-float src_vector_1[MAXVL_BYTES];
-float src_vector_2[MAXVL_BYTES];
-float dest_vector[MAXVL_BYTES];
-float ref_dest_vector[MAXVL_BYTES];
-
-class VfaddTest : public ::testing::Test {
- protected:
- void SetUp() override { zero_vector_registers(); }
- void TearDown() override { zero_vector_registers(); }
-};
-
-TEST_F(VfaddTest, vfadd_vv32m1) {
- for (int i = 0; i < AVL_COUNT; i++) {
- int32_t avl = AVLS[i];
- int vlmax;
- int vl;
-
- /* For non narrowing instructions all vectors have same type*/
- std::tie(vlmax, vl) = vector_test_setup<int32_t>(
- VLMUL::LMUL_M1, avl,
- {dest_vector, ref_dest_vector, src_vector_1, src_vector_2});
-
- if (avl > vlmax) {
- continue;
- }
-
- float *ptr_vec_1 = reinterpret_cast<float *>(src_vector_1);
- float *ptr_vec_2 = reinterpret_cast<float *>(src_vector_2);
- float *ptr_dest_vec = reinterpret_cast<float *>(dest_vector);
- float *ptr_ref_dest_vec = reinterpret_cast<float *>(ref_dest_vector);
-
- // set up values to test up to index of the AVL
- fill_random_vector<float>(ptr_vec_1, avl);
- fill_random_vector<float>(ptr_vec_2, avl);
-
- // Generate reference vector
- softrvv::vfadd_vv(ptr_ref_dest_vec, ptr_vec_2, ptr_vec_1, avl);
- // Load vector registers
- __asm__ volatile("vle32.v v8, (%0)" : : "r"(ptr_vec_1));
- __asm__ volatile("vle32.v v16, (%0)" : : "r"(ptr_vec_2));
-
- // Run target instruction
- __asm__ volatile("vfadd.vv v24, v16, v8");
-
- // Store result vector register
- __asm__ volatile("vse32.v v24, (%0)" : : "r"(ptr_dest_vec));
- // Check vector elements
- assert_vec_elem_eq<float>(vlmax, dest_vector, ref_dest_vector);
- }
-}
-} // namespace
-} // namespace vfadd_vv_test