#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(); }
};

// Below is a demo Test for convenient debugging
// Currently disabled, so remove "DISABLED_" prefix to enable this test
TEST_F(VaddVxTest, DISABLED_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

