Add MACC tests.

- Removed leftover debug code in templates.
- Added vnmsac test
- Remove refuse in test/CMakeLists.txt

Change-Id: Id6d35703b3020b685fcd5061c71d19b5d8bdbca9
diff --git a/softrvv/include/softrvv.h b/softrvv/include/softrvv.h
index f9b2ea5..887769d 100644
--- a/softrvv/include/softrvv.h
+++ b/softrvv/include/softrvv.h
@@ -15,6 +15,7 @@
 #include "softrvv_vfmin.h"
 #include "softrvv_vfmul.h"
 #include "softrvv_vfsub.h"
+#include "softrvv_vmacc.h"
 #include "softrvv_vmax.h"
 #include "softrvv_vmfeq.h"
 #include "softrvv_vmfge.h"
diff --git a/softrvv/include/softrvv_vmacc.h b/softrvv/include/softrvv_vmacc.h
new file mode 100644
index 0000000..f87aec6
--- /dev/null
+++ b/softrvv/include/softrvv_vmacc.h
@@ -0,0 +1,40 @@
+#ifndef SOFTRVV_VMACC_H
+#define SOFTRVV_VMACC_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+namespace softrvv {
+
+template <typename T1, typename T2>
+void vmacc_vx(T1 *vd, const T2 *rs1, const T2 *vs2, int32_t avl) {
+  for (int32_t idx = 0; idx < avl; idx++) {
+     vd[idx] = (*rs1 * vs2[idx]) + vd[idx];
+  }
+}
+
+template <typename T1, typename T2>
+void vmacc_vv(T1 *vd, T2 *vs1, const T2 *vs2, int32_t avl) {
+  for (int32_t idx = 0; idx < avl; idx++) {
+     vd[idx] = (vs1[idx] * vs2[idx]) + vd[idx];
+  }
+}
+
+template <typename T1, typename T2>
+void vnmsac_vv(T1 *vd, T2 *vs1, const T2 *vs2, int32_t avl) {
+  for (int32_t idx = 0; idx < avl; idx++) {
+     vd[idx] = -(vs1[idx] * vs2[idx]) + vd[idx];
+  }
+}
+
+template <typename T1, typename T2>
+void vnmsac_vx(T1 *vd, const T2 *rs1, const T2 *vs2, int32_t avl) {
+  for (int32_t idx = 0; idx < avl; idx++) {
+     vd[idx] = -(*rs1 * vs2[idx]) + vd[idx];
+  }
+}
+
+
+}  // namespace softrvv
+
+#endif  // SOFTRVV_VMACC_H
diff --git a/softrvv/tests/CMakeLists.txt b/softrvv/tests/CMakeLists.txt
index 6d3d482..9441381 100644
--- a/softrvv/tests/CMakeLists.txt
+++ b/softrvv/tests/CMakeLists.txt
@@ -331,3 +331,14 @@
    -Xlinker --defsym=__itcm_length__=128K
 )
 
+vec_cc_test(
+  NAME
+    softrvv_vmacc
+  SRCS
+    softrvv_vmacc_test.cpp
+  DEPS
+    softrvv
+  LINKOPTS
+   -Xlinker --defsym=__itcm_length__=128K
+)
+
diff --git a/softrvv/tests/softrvv_vmacc_test.cpp b/softrvv/tests/softrvv_vmacc_test.cpp
new file mode 100644
index 0000000..ed784d5
--- /dev/null
+++ b/softrvv/tests/softrvv_vmacc_test.cpp
@@ -0,0 +1,71 @@
+#include <riscv_vector.h>
+#include <springbok.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "pw_unit_test/framework.h"
+#include "softrvv.h"
+
+namespace softrvv_vmacc_test {
+namespace {
+
+class SoftRvvVmaccTest : public ::testing::Test {
+ protected:
+  void SetUp() override { }
+};
+
+class SoftRvvVnmsacTest : public ::testing::Test {
+ protected:
+  void SetUp() override { }
+};
+
+// Integer multiply-add, overwrite addend
+// vmacc.vv vd, vs1, vs2, vm    # vd[i] = +(vs1[i] * vs2[i]) + vd[i]
+uint32_t vmacvv_vs1[] = {1, 1, 128,  64,  0};
+uint32_t vmacvv_vs2[] = {0, 1,   1,   2, 32};
+const uint32_t vmacvv_kAVL = sizeof(vmacvv_vs2) / sizeof(vmacvv_vs2[0]);
+uint32_t vmacvv_vd[] =  {0, 1,   2,   4,  8};
+int32_t vmacvv_ref[] =  {0, 2, 130, 132,  8};
+TEST_F(SoftRvvVmaccTest, VV) {
+  softrvv::vmacc_vv<uint32_t>(vmacvv_vd, vmacvv_vs1, vmacvv_vs2, vmacvv_kAVL);
+  ASSERT_EQ(memcmp(vmacvv_vd, vmacvv_ref, sizeof(vmacvv_vd)), 0);
+}
+
+// Integer multiply-add, overwrite addend
+// vmacc.vx vd, rs1, vs2, vm    # vd[i] = +(x[rs1] * src2[i]) + vd[i]
+uint32_t vmaccvx_rs1[] = {170};
+uint32_t vmaccvx_vs2[] = {0, 1,   1,   2, 32};
+const uint32_t vmaccvx_kAVL = sizeof(vmaccvx_vs2) / sizeof(vmaccvx_vs2[0]);
+uint32_t vmaccvx_vd[] =  {0, 1,   2,   4,  8};
+int32_t vmaccvx_ref[] =  {0, 171, 172, 344,  5448};
+TEST_F(SoftRvvVmaccTest, VX) {
+    softrvv::vmacc_vx<uint32_t>(vmaccvx_vd, vmaccvx_rs1, vmaccvx_vs2, vmaccvx_kAVL);
+    ASSERT_EQ(memcmp(vmaccvx_vd, vmaccvx_ref, sizeof(vmaccvx_vd)), 0);
+}
+
+// Integer multiply-sub, overwrite minuend
+// vnmsac.vv vd, vs1, vs2, vm    # vd[i] = -(vs1[i] * vs2[i]) + vd[i]
+uint32_t vnmsacvv_vs1[] = {220,  24,  1234,   150,     1386};
+uint32_t vnmsacvv_vs2[] = {  1,   2,     2,    10,     1000};
+const uint32_t vnmsacvv_kAVL = sizeof(vnmsacvv_vs2) / sizeof(vnmsacvv_vs2[0]);
+uint32_t vnmsacvv_vd[] =  {  0,  10,    10,  1000,        1};
+int32_t vnmsacvv_ref[] = {-220, -38, -2458,  -500, -1385999};
+TEST_F(SoftRvvVnmsacTest, VV) {
+  softrvv::vnmsac_vv<uint32_t>(vnmsacvv_vd, vnmsacvv_vs1, vnmsacvv_vs2, vnmsacvv_kAVL);
+  ASSERT_EQ(memcmp(vnmsacvv_vd, vnmsacvv_ref, sizeof(vnmsacvv_ref)), 0);
+}
+
+// Integer multiply-sub, overwrite minuend
+// vnmsac.vx vd, rs1, vs2, vm    # vd[i] = -(x[rs1] * vs2[i]) + vd[i]
+uint32_t vnmsacvx_rs1[] = {170};
+uint32_t vnmsacvx_vs2[] = {  1, 2, 2, 10, 1000};
+const uint32_t vnmsacvx_kAVL = sizeof(vnmsacvx_vs2) / sizeof(vnmsacvx_vs2[0]);
+uint32_t vnmsacvx_vd[] = {170, 350, 10, 0, 0};
+int32_t vnmsacvx_ref[] = {0, 10, -330, -1700, -170000};
+TEST_F(SoftRvvVnmsacTest, VX) {
+    softrvv::vnmsac_vx<uint32_t>(vnmsacvx_vd, vnmsacvx_rs1, vnmsacvx_vs2, vnmsacvx_kAVL);
+    ASSERT_EQ(memcmp(vnmsacvx_vd, vnmsacvx_ref, sizeof(vnmsacvx_ref)), 0);
+}
+
+}  // namespace
+}  // namespace softrvv_vmacc_test
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 4214281..e51930f 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 vec_cc_generated_test(
   NAME
     vfadd