#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 vmax_vx_test {
namespace {

using namespace test_v_helpers;

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

class VmaxVxTest : 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(VmaxVxTest, DISABLED_vmax_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);
    const int8_t test_val = 8;

    for (int idx = 0; idx < vl; idx++) {
      ptr_vec_1[idx] = idx;
    }
    __asm__ volatile("vle8.v v8, (%0)" : : "r"(ptr_vec_1));
    __asm__ volatile("vmax.vx v16, v8, %[RS1]" ::[RS1] "r"(test_val));

    for (int idx = 0; idx < vl; idx++) {
      ptr_vec_1[idx] = (ptr_vec_1[idx] > test_val) ? ptr_vec_1[idx] : test_val;
    }

    __asm__ volatile("vse8.v v16, (%0)" : : "r"(ptr_vec_2));
    assert_vec_elem_eq<int8_t>(vlmax, test_vector_1, test_vector_2);
  }
}

#define DEFINE_TEST_VMAX_VX(_SEW_, _LMUL_, TEST_VAL)                           \
  TEST_F(VmaxVxTest, vmax_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;                                \
      for (int idx = 0; idx < vl; idx++) {                                     \
        ptr_vec_1[idx] = idx;                                                  \
      }                                                                        \
      __asm__ volatile("vle" #_SEW_ ".v v8, (%0)" : : "r"(ptr_vec_1));         \
      __asm__ volatile("vmax.vx v16, v8, %[RS1]" ::[RS1] "r"(test_val));       \
      for (int idx = 0; idx < vl; idx++) {                                     \
        ptr_vec_1[idx] =                                                       \
            (ptr_vec_1[idx] > test_val) ? ptr_vec_1[idx] : test_val;           \
      }                                                                        \
      __asm__ volatile("vse" #_SEW_ ".v v16, (%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_VMAX_VX(8, 1, INT8_MIN)
DEFINE_TEST_VMAX_VX(8, 2, INT8_MAX)
DEFINE_TEST_VMAX_VX(8, 4, -1)
DEFINE_TEST_VMAX_VX(8, 8, 2)

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

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

}  // namespace
}  // namespace vmax_vx_test
