#include <stdlib.h>

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

// Test for vl{1,2,8}re{8,16,32}.v and vs{1,2,8}r{8,16,32}.v instructions.
namespace vlnr_vsnr_test {
namespace {

using namespace test_v_helpers;

uint8_t test_vector_1[MAXVL_BYTES];
uint8_t reference_vector_1[MAXVL_BYTES];

enum VNF { NF1 = 0, NF2 = 1, NF4 = 2, NF8 = 3 };

class VlnrVsnrTest : public ::testing::Test {
 public:
  void vsr_test(VSEW sew, VNF nf);

 protected:
  void SetUp() override { zero_vector_registers(); }
  void TearDown() override { zero_vector_registers(); }
};

void VlnrVsnrTest::vsr_test(VSEW sew, VNF nf) {
  int avl = get_vsetvlmax_intrinsic(SEW_E8, LMUL_M1);
  int vlmax;
  int vl;
  int nf_val = 1 << nf;

  std::tie(vlmax, vl) = vector_test_setup<uint8_t>(
      LMUL_M1, avl, {test_vector_1, reference_vector_1});
  fill_random_vector<uint8_t>(reinterpret_cast<uint8_t *>(reference_vector_1),
                              avl * nf_val);
  switch (nf) {
    case NF1: {
      switch (sew) {
        case SEW_E8:
          __asm__ volatile(
              "vl1r.v v25, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        case SEW_E16:
          __asm__ volatile(
              "vl1re16.v v25, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        case SEW_E32:
          __asm__ volatile(
              "vl1re32.v v25, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        default:
          break;
      }
      __asm__ volatile("vs1r.v v25, (%[REG])" ::[REG] "r"(test_vector_1));
      break;
    }
    case NF2: {
      switch (sew) {
        case SEW_E8:
          __asm__ volatile(
              "vl2r.v v26, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        case SEW_E16:
          __asm__ volatile(
              "vl2re16.v v26, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        case SEW_E32:
          __asm__ volatile(
              "vl2re32.v v26, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        default:
          break;
      }
      __asm__ volatile("vs2r.v v26, (%[REG])" ::[REG] "r"(test_vector_1));
      break;
    }
    case NF4: {
      switch (sew) {
        case SEW_E8:
          __asm__ volatile(
              "vl4r.v v28, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        case SEW_E16:
          __asm__ volatile(
              "vl4re16.v v28, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        case SEW_E32:
          __asm__ volatile(
              "vl4re32.v v28, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        default:
          break;
      }
      __asm__ volatile("vs4r.v v28, (%[REG])" ::[REG] "r"(test_vector_1));
      break;
    }
    case NF8: {
      switch (sew) {
        case SEW_E8:
          __asm__ volatile(
              "vl8r.v v0, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        case SEW_E16:
          __asm__ volatile(
              "vl8re16.v v0, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        case SEW_E32:
          __asm__ volatile(
              "vl8re32.v v0, (%[REG])" ::[REG] "r"(reference_vector_1));
          break;
        default:
          break;
      }
      __asm__ volatile("vs8r.v v0, (%[REG])" ::[REG] "r"(test_vector_1));
      break;
    }
  }
  assert_vec_elem_eq<uint8_t>(avl * nf_val, test_vector_1, reference_vector_1);
}

TEST_F(VlnrVsnrTest, vl1re8_vs1r) { vsr_test(SEW_E8, NF1); }

TEST_F(VlnrVsnrTest, vl2re8_vs2r) { vsr_test(SEW_E8, NF2); }

TEST_F(VlnrVsnrTest, vl4re8_vs4r) { vsr_test(SEW_E8, NF4); }

TEST_F(VlnrVsnrTest, vl8re8_vs8r) { vsr_test(SEW_E8, NF8); }

TEST_F(VlnrVsnrTest, vl1re16_vs1r) { vsr_test(SEW_E16, NF1); }

TEST_F(VlnrVsnrTest, vl2re16_vs2r) { vsr_test(SEW_E16, NF2); }

TEST_F(VlnrVsnrTest, vl4re16_vs4r) { vsr_test(SEW_E16, NF4); }

TEST_F(VlnrVsnrTest, vl8re16_vs8r) { vsr_test(SEW_E16, NF8); }

TEST_F(VlnrVsnrTest, vl1re32_vs1r) { vsr_test(SEW_E32, NF1); }

TEST_F(VlnrVsnrTest, vl2re32_vs2r) { vsr_test(SEW_E32, NF2); }

TEST_F(VlnrVsnrTest, vl4re32_vs4r) { vsr_test(SEW_E32, NF4); }

TEST_F(VlnrVsnrTest, vl8re32_vs8r) { vsr_test(SEW_E32, NF8); }

}  // namespace
}  // namespace vlnr_vsnr_test
