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

#include <bit>
#include <tuple>

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

namespace vadd_vv_test {
namespace {

using namespace test_v_helpers;

uint8_t test_vector_1[MAXVL_BYTES];
uint8_t test_vector_2[MAXVL_BYTES];

class VaddVxTest : public ::testing::Test {
 protected:
  void SetUp() override { zero_vector_registers(); }
  void TearDown() override { zero_vector_registers(); }
};

TEST_F(VaddVxTest, vadd_vv_demo) {
  for (int i = 0; i < AVL_COUNT; i++) {
    int32_t avl = AVLS[i];
    int vlmax;
    int vl;
    std::tie(vlmax, vl) = vector_test_setup<uint8_t>(
        VLMUL::LMUL_M1, avl, test_vector_1, test_vector_2);
    if (avl > vlmax) {
      continue;
    }
    int8_t *ptr_vec_1 = reinterpret_cast<int8_t *>(test_vector_1);
    int8_t *ptr_vec_2 = reinterpret_cast<int8_t *>(test_vector_2);

    // set up values to test up to index of the AVL
    for (int idx = 0; idx < avl; idx++) {
      // restrict values to valid int8_t range
      ptr_vec_1[idx] = idx % (INT8_MAX) + (INT8_MIN);
    }
    __asm__ volatile("vle8.v v8, (%0)" : : "r"(ptr_vec_1));
    __asm__ volatile("vadd.vv v8, v8, v8");
    for (int idx = 0; idx < vl; idx++) {
      ptr_vec_1[idx] =
          ptr_vec_1[idx] + ptr_vec_1[idx];  // restrict values to valid int8
    }
    __asm__ volatile("vse8.v v8, (%0)" : : "r"(ptr_vec_2));
    assert_vec_elem_eq<int8_t>(vlmax, test_vector_1, test_vector_2);
  }
}

#define DEFINE_TEST_VADD_VV(_SEW_, _LMUL_)                                     \
  TEST_F(VaddVxTest, vadd_vv##_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<int##_SEW_##_t>(                 \
          VLMUL::LMUL_M##_LMUL_, avl, test_vector_1, test_vector_2);           \
      if (avl > vlmax) {                                                       \
        continue;                                                              \
      }                                                                        \
      int##_SEW_##_t *ptr_vec_1 =                                              \
          reinterpret_cast<int##_SEW_##_t *>(test_vector_1);                   \
      int##_SEW_##_t *ptr_vec_2 =                                              \
          reinterpret_cast<int##_SEW_##_t *>(test_vector_2);                   \
                                                                               \
      for (long long idx = 0; idx < avl; idx++) {                              \
        ptr_vec_1[idx] = idx % INT##_SEW_##_MAX + INT##_SEW_##_MIN;            \
      }                                                                        \
                                                                               \
      __asm__ volatile("vle" #_SEW_ ".v v8, (%0)" : : "r"(ptr_vec_1));         \
      __asm__ volatile("vadd.vv v8, v8, v8");                                  \
      for (int idx = 0; idx < vl; idx++) {                                     \
        ptr_vec_1[idx] = ptr_vec_1[idx] + ptr_vec_1[idx];                      \
      }                                                                        \
      __asm__ volatile("vse" #_SEW_ ".v v8, (%0)" : : "r"(ptr_vec_2));         \
      assert_vec_elem_eq<int##_SEW_##_t>(vlmax, test_vector_1, test_vector_2); \
    }                                                                          \
  }

// TODO(gkielian): modify macro to permit more than one test per sew/lmul pair
DEFINE_TEST_VADD_VV(8, 1)
DEFINE_TEST_VADD_VV(8, 2)
DEFINE_TEST_VADD_VV(8, 4)
DEFINE_TEST_VADD_VV(8, 8)

DEFINE_TEST_VADD_VV(16, 1)
DEFINE_TEST_VADD_VV(16, 2)
DEFINE_TEST_VADD_VV(16, 4)
DEFINE_TEST_VADD_VV(16, 8)

DEFINE_TEST_VADD_VV(32, 1)
DEFINE_TEST_VADD_VV(32, 2)
DEFINE_TEST_VADD_VV(32, 4)
DEFINE_TEST_VADD_VV(32, 8)

}  // namespace
}  // namespace vadd_vv_test

