#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 < avl; 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 < avl; 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

