// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

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

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

namespace vle_vse_test {
namespace {

using namespace test_v_helpers;

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

static void vlevse_test(VSEW sew, VLMUL lmul, bool use_intrinsic = false) {
  for (int i = 0; i <= AVL_COUNT; ++i) {
    zero_vector_registers();
    int32_t avl = AVLS[i];
    int vlmax;
    int vl;
    switch (sew) {
      case SEW_E8:
        std::tie(vlmax, vl) = vector_test_setup<uint8_t>(
            lmul, avl, {test_vector_1, test_vector_2});
        break;
      case SEW_E16:
        std::tie(vlmax, vl) = vector_test_setup<uint16_t>(
            lmul, avl, {test_vector_1, test_vector_2});
        break;
      case SEW_E32:
        std::tie(vlmax, vl) = vector_test_setup<uint32_t>(
            lmul, avl, {test_vector_1, test_vector_2});
        break;
      default: {
        LOG_ERROR("Not supported SEW");
        ASSERT_TRUE(false);
        break;
      }
    }

    if (avl > vlmax) {
      continue;
    }
    LOG_DEBUG("vl: %d", vl);

    // load c-array values into vector
    // TODO(gkielian): utilize intrinsics for vle
    if (use_intrinsic) {
    } else {
      switch (sew) {
        case SEW_E8: {
          fill_random_vector<uint8_t>(test_vector_1, vl);
          __asm__ volatile("vle8.v v0, (%0)" : : "r"(test_vector_1));
          __asm__ volatile("vse8.v v0, (%0)" : : "r"(test_vector_2));
          assert_vec_elem_eq<uint8_t>(vl, test_vector_1, test_vector_2);
          break;
        }
        case SEW_E16: {
          fill_random_vector<uint16_t>(
              reinterpret_cast<uint16_t *>(test_vector_1), vl);
          __asm__ volatile("vle16.v v0, (%0)" : : "r"(test_vector_1));
          __asm__ volatile("vse16.v v0, (%0)" : : "r"(test_vector_2));
          assert_vec_elem_eq<uint16_t>(vl, test_vector_1, test_vector_2);
          break;
        }
        case SEW_E32: {
          fill_random_vector<uint32_t>(
              reinterpret_cast<uint32_t *>(test_vector_1), vl);
          __asm__ volatile("vle32.v v0, (%0)" : : "r"(test_vector_1));
          __asm__ volatile("vse32.v v0, (%0)" : : "r"(test_vector_2));
          assert_vec_elem_eq<uint32_t>(vl, test_vector_1, test_vector_2);
          break;
        }
        default:
          break;
      }
    }
  }
}

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

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

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

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

TEST(VleVseTest, vle16vse16_e16m1) {
  vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_M1, false);
}

TEST(VleVseTest, vle16vse16_e16m2) {
  vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_M2, false);
}

TEST(VleVseTest, vle16vse16_e16m4) {
  vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_M4, false);
}

TEST(VleVseTest, vle16vse16_e16m8) {
  vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_M8, false);
}

TEST(VleVseTest, vle32vse32_e32m1) {
  vlevse_test(VSEW::SEW_E32, VLMUL::LMUL_M1, false);
}

TEST(VleVseTest, vle32vse32_e32m2) {
  vlevse_test(VSEW::SEW_E32, VLMUL::LMUL_M2, false);
}

TEST(VleVseTest, vle32vse32_e32m4) {
  vlevse_test(VSEW::SEW_E32, VLMUL::LMUL_M4, false);
}

TEST(VleVseTest, vle32vse32_e32m8) {
  vlevse_test(VSEW::SEW_E32, VLMUL::LMUL_M8, false);
}

TEST(VleVseTest, vle8vse8_e8mf2) { vlevse_test(VSEW::SEW_E8, VLMUL::LMUL_MF2); }

TEST(VleVseTest, vle8vse8_e8mf4) { vlevse_test(VSEW::SEW_E8, VLMUL::LMUL_MF4); }

TEST(VleVseTest, vle16vse16_e16mf2) {
  vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_MF2);
}

}  // namespace
}  // namespace vle_vse_test
