#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
