#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_vx_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 non-macro version of the test for more convenient debugging.
// Remove the "DISABLED_" prefix to enable this test for debugging.
TEST_F(VaddVxTest, DISABLED_vadd_vx_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);
    int8_t test_val = 8;
    __asm__ volatile("vadd.vx v8, v8, %[RS1]" ::[RS1] "r"(test_val));
    for (int i = 0; i < vl; i++) {
      ptr_vec_1[i] = test_val;
    }
    __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_VX(_SEW_, _LMUL_, TEST_VAL)                           \
  TEST_F(VaddVxTest, vadd_vx##_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);                   \
      const int##_SEW_##_t test_val = TEST_VAL;                                \
      __asm__ volatile("vadd.vx v8, v8, %[RS1]" ::[RS1] "r"(test_val));        \
      for (int i = 0; i < vl; i++) {                                           \
        ptr_vec_1[i] = test_val;                                               \
      }                                                                        \
      __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_VX(8, 1, INT8_MIN)
DEFINE_TEST_VADD_VX(8, 2, INT8_MAX)
DEFINE_TEST_VADD_VX(8, 4, -1)
DEFINE_TEST_VADD_VX(8, 8, 2)

DEFINE_TEST_VADD_VX(16, 1, INT16_MIN)
DEFINE_TEST_VADD_VX(16, 2, INT16_MAX)
DEFINE_TEST_VADD_VX(16, 4, -1)
DEFINE_TEST_VADD_VX(16, 8, 2)

DEFINE_TEST_VADD_VX(32, 1, INT32_MIN)
DEFINE_TEST_VADD_VX(32, 2, INT32_MAX)
DEFINE_TEST_VADD_VX(32, 4, -1)
DEFINE_TEST_VADD_VX(32, 8, 2)

}  // namespace
}  // namespace vadd_vx_test

