Move test_v_helper library to top level.

* Add test_v_helper lib as dependency to softrvv.
* Move test_v_helper library to top-level for use by softrvv.
* Move assert_vec_elem_eq and assert_vec_mask_eq into header for easier reuse.

Change-Id: I5b82520be802309dddfd5e529cee1c6cc9568723
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5fb669e..3dbdb92 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,6 +40,7 @@
 add_subdirectory(pw_unit_test_demo)
 
 enable_testing()
+add_subdirectory(test_v_helpers)
 add_subdirectory(softrvv)
 add_subdirectory(tests)
 
diff --git a/softrvv/tests/templates/base.tpl.cpp b/softrvv/tests/templates/base.tpl.cpp
index bf3e1db..586cfff 100644
--- a/softrvv/tests/templates/base.tpl.cpp
+++ b/softrvv/tests/templates/base.tpl.cpp
@@ -19,4 +19,8 @@
 
 #include "pw_unit_test/framework.h"
 #include "softrvv.h"
+#include "test_v_helpers.h"
+
+using namespace test_v_helpers;
+
 ${self.body()}
diff --git a/softrvv/tests/templates/opivv_opivx_test.tpl.cpp b/softrvv/tests/templates/opivv_opivx_test.tpl.cpp
index 1586eb6..4625ebc 100644
--- a/softrvv/tests/templates/opivv_opivx_test.tpl.cpp
+++ b/softrvv/tests/templates/opivv_opivx_test.tpl.cpp
@@ -11,28 +11,6 @@
 namespace softrvv_${template_helper.op_code}_test {
 namespace {
 ${insert_variable_init(template_helper, src2, src1, rs1, ref_vv, ref_vx)}
-template <typename T>
-void assert_vec_elem_eq(int avl, void *test_vector_1, void *test_vector_2) {
-  T *ptr_vec_1 = reinterpret_cast<T *>(test_vector_1);
-  T *ptr_vec_2 = reinterpret_cast<T *>(test_vector_2);
-  for (int idx = 0; idx < avl; idx++) {
-    ASSERT_EQ(ptr_vec_1[idx], ptr_vec_2[idx]);
-  }
-}
-
-template <typename T>
-void assert_vec_mask_eq(int avl, void *test_vector_1, void *test_vector_2) {
-  uint32_t *ptr_vec_1 = reinterpret_cast<uint32_t *>(test_vector_1);
-  uint32_t *ptr_vec_2 = reinterpret_cast<uint32_t *>(test_vector_2);
-  for (int idx = 0; idx < avl; idx++) {
-    const int bits_in_element = sizeof(uint32_t) * 8;
-    int eidx = idx / bits_in_element;
-    int epos = idx % bits_in_element;
-    uint32_t *e1 = ptr_vec_1 + eidx;
-    uint32_t *e2 = ptr_vec_2 + eidx;
-    ASSERT_EQ(*e1 & (1 << epos), *e2 & (1 << epos));
-  }
-}
 
 class SoftRvv${template_helper.op_code.capitalize()}Test : public ::testing::Test {
  protected:
diff --git a/test_v_helpers/CMakeLists.txt b/test_v_helpers/CMakeLists.txt
new file mode 100644
index 0000000..62f7e65
--- /dev/null
+++ b/test_v_helpers/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.10)
+enable_language(ASM)
+
+add_library(test_v_helpers
+	test_v_helpers.cpp)
+
+target_include_directories(test_v_helpers PUBLIC include)
+target_link_libraries(test_v_helpers PUBLIC pw_unit_test)
+
+target_compile_options(test_v_helpers PUBLIC
+      ${VEC_DEFAULT_COPTS}
+)
diff --git a/tests/include/test_v_helpers.h b/test_v_helpers/include/test_v_helpers.h
similarity index 79%
rename from tests/include/test_v_helpers.h
rename to test_v_helpers/include/test_v_helpers.h
index 7189b72..ba28e43 100644
--- a/tests/include/test_v_helpers.h
+++ b/test_v_helpers/include/test_v_helpers.h
@@ -72,6 +72,21 @@
 }
 
 template <typename T>
+void assert_vec_mask_eq(int avl, void *test_vector_1, void *test_vector_2) {
+  const unsigned int bw_required = std::__bit_width(sizeof(T)* 8);
+  const unsigned int shift = bw_required - 1;
+  T *ptr_vec_1 = reinterpret_cast<T *>(test_vector_1);
+  T *ptr_vec_2 = reinterpret_cast<T *>(test_vector_2);
+  for (int idx = 0; idx < avl; idx++) {
+    unsigned int element_idx = idx >> shift;  // Eqivalent to idx / (sizeof(T) * 8)
+    unsigned int element_pos = idx & ~(element_idx << shift); // Equivalent to idx % (sizeof(T) * 8)
+    T *e1 = ptr_vec_1 + element_idx;
+    T *e2 = ptr_vec_2 + element_idx;
+    ASSERT_EQ(*e1 & (1 << element_pos), *e2 & (1 << element_pos));
+  }
+}
+
+template <typename T>
 static std::tuple<int, int> vector_test_setup(
     VLMUL lmul, int32_t avl, const std::initializer_list<void *> &vec_list) {
   // Clear all vector registers
diff --git a/tests/test_v_helpers.cpp b/test_v_helpers/test_v_helpers.cpp
similarity index 100%
rename from tests/test_v_helpers.cpp
rename to test_v_helpers/test_v_helpers.cpp
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index fc3db8d..2230dd1 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,16 +1,3 @@
-cmake_minimum_required(VERSION 3.10)
-enable_language(ASM)
-
-add_library(test_v_helpers
-	test_v_helpers.cpp)
-
-target_include_directories(test_v_helpers PUBLIC include)
-target_link_libraries(test_v_helpers PUBLIC pw_unit_test)
-
-target_compile_options(test_v_helpers PUBLIC
-      ${VEC_DEFAULT_COPTS}
-)
-
 vec_cc_generated_test(
   NAME
     vsub