#include <riscv_vector.h>
#include <springbok_intrinsics.h>
#include <stddef.h>

#include "pw_unit_test/framework.h"
#include "test_v_helpers.h"

namespace vle_vse_test {
namespace {

using namespace test_v_helpers;

const int VLEN = 512u;
const int LMUL_MAX = 8u;
const int MAXVL_BYTES = VLEN / sizeof(uint8_t) * LMUL_MAX;
const int AVL_STEP = 4;

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

static void vle8vse8_test(VSEW sew, VLMUL lmul, bool use_intrinsic) {
  int vlmax = get_vsetvlmax_intrinsic(sew, lmul);

  for (int avl = 0; avl <= vlmax; avl += AVL_STEP) {
    // clear arrays
    memset(test_vector_1, 0, MAXVL_BYTES);
    memset(test_vector_2, 0, MAXVL_BYTES);
    int vl = set_vsetvl_intrinsic(sew, lmul, avl);
    EXPECT_EQ(avl, vl);
    uint8_t *dest = (uint8_t *)test_vector_1;
    for (int idx = 0; idx < vl; idx++) {
      dest[idx] = idx;
    }

    // load c-array values into vector
    // TODO(gkielian): utilize intrinsics for vle
    if (use_intrinsic) {
    } else {
      __asm__ volatile("vle8.v v0, (%0)" : : "r"(test_vector_1));

      // 2) store the vector back into memory (into result c-array)
      __asm__ volatile("vse8.v v0, (%0)" : : "r"(test_vector_2));
    }
    for (int idx = 0; idx < MAXVL_BYTES; idx++) {
      ASSERT_EQ(test_vector_1[idx], test_vector_2[idx]);
    }
  }
}

TEST(VleVseTest, vle8vse8_e8m1) {
  vle8vse8_test(VSEW::SEW_E8, VLMUL::LMUL_M1, false);
}

TEST(VleVseTest, vle8vse8_e8m2) {
  vle8vse8_test(VSEW::SEW_E8, VLMUL::LMUL_M2, false);
}

TEST(VleVseTest, vle8vse8_e8m4) {
  vle8vse8_test(VSEW::SEW_E8, VLMUL::LMUL_M4, false);
}

TEST(VleVseTest, vle8vse8_e8m8) {
  vle8vse8_test(VSEW::SEW_E8, VLMUL::LMUL_M8, false);
}

}  // namespace
}  // namespace vle_vse_test
