#include <riscv_vector.h>
#include <springbok.h>
#include <stdio.h>
#include <stdlib.h>

#include "pw_unit_test/framework.h"
#include "softrvv.h"

namespace softrvv_vadd_test {
namespace {

int32_t src1[] = {2, 4, 6, 8, 10};
int32_t src2[] = {1, 2, 3, 4, 5};
int32_t rs1 = 2;
const uint32_t AVL_CONST = sizeof(src1)/sizeof(src1[0]);
int32_t dest[AVL_CONST];


int32_t ref_vv[] = {1, 2, 3, 4, 5};
int32_t ref_vx[] = {0, 2, 4, 6, 8};

int32_t ref_r_vx[] = {0, -2, -4, -6, -8};

class SoftRvvVsubTest : public ::testing::Test {
 protected:
  void SetUp() override { memset(dest, 0, sizeof(dest)); }
};

TEST_F(SoftRvvVsubTest, VV) {
  softrvv::vsub_vv<int32_t>(dest, src1, src2, AVL_CONST);
  ASSERT_EQ(memcmp(dest, ref_vv, sizeof(dest)), 0);
}

TEST_F(SoftRvvVsubTest, VX) {
  softrvv::vsub_vx<int32_t>(dest, src1, &rs1, AVL_CONST);
  ASSERT_EQ(memcmp(dest, ref_vx, sizeof(dest)), 0);
}

TEST_F(SoftRvvVsubTest, RVX) {
  softrvv::vrsub_vx<int32_t>(dest, src1, &rs1, AVL_CONST);
  ASSERT_EQ(memcmp(dest, ref_r_vx, sizeof(dest)), 0);
}

}  // namespace
}  // namespace softrvv_vsub_test
