#include <riscv_vector.h>
#include "test_v_helpers.h"


namespace test_v_helpers {

uint32_t get_vtype(VSEW sew, VLMUL lmul, bool tail_agnostic,
                   bool mask_agnostic) {
  return (static_cast<int>(lmul) & 0x7) |
          (static_cast<int>(sew) & 0x7) << 3 |
          (tail_agnostic & 0x1) << 6 |
          (mask_agnostic & 0x1) << 7;
}

uint32_t set_vsetvl(VSEW sew, VLMUL lmul, uint32_t avl, bool tail_agnostic, bool mask_agnostic) {
  uint32_t vtype = get_vtype(sew, lmul, tail_agnostic, mask_agnostic);
  uint32_t vl;
  __asm__ volatile(
    "vsetvl %[VL], %[AVL], %[VTYPE]"
    : [VL] "=r" (vl)
    : [AVL] "r" (avl), [VTYPE] "r" (vtype)
  );
  return vl;
}

int set_vsetvl_intrinsic(VSEW sew, VLMUL lmul, uint32_t avl) {
  switch(lmul) {
    case VLMUL::LMUL_M1:
      switch(sew) {
        case VSEW::SEW_E8:
          return vsetvl_e8m1(avl);
          break;
        case VSEW::SEW_E16:
          return vsetvl_e16m1(avl);
          break;
        case VSEW::SEW_E32:
          return vsetvl_e32m1(avl);
          break;
        default:
          return -1;
          break;
      }
      break;
    case VLMUL::LMUL_M2:
      switch(sew) {
        case VSEW::SEW_E8:
          return vsetvl_e8m2(avl);
          break;
        case VSEW::SEW_E16:
          return vsetvl_e16m2(avl);
          break;
        case VSEW::SEW_E32:
          return vsetvl_e32m2(avl);
          break;
        default:
          return -1;
          break;
      }
    case VLMUL::LMUL_M4:
      switch(sew) {
        case VSEW::SEW_E8:
          return vsetvl_e8m4(avl);
          break;
        case VSEW::SEW_E16:
          return vsetvl_e16m4(avl);
          break;
        case VSEW::SEW_E32:
          return vsetvl_e32m4(avl);
          break;
        default:
          return -1;
          break;
      }
      break;
    case VLMUL::LMUL_M8:
      switch(sew) {
        case VSEW::SEW_E8:
          return vsetvl_e8m8(avl);
          break;
        case VSEW::SEW_E16:
          return vsetvl_e16m8(avl);
          break;
        case VSEW::SEW_E32:
          return vsetvl_e32m8(avl);
          break;
        default:
          return -1;
          break;
      }
      break;
    default:
      break;
  }
  return -1;
}

int get_vsetvlmax_intrinsic(VSEW sew, VLMUL lmul) {
  switch(lmul) {
    case VLMUL::LMUL_M1:
      switch(sew) {
        case VSEW::SEW_E8:
          return vsetvlmax_e8m1();
          break;
        case VSEW::SEW_E16:
          return vsetvlmax_e16m1();
          break;
        case VSEW::SEW_E32:
          return vsetvlmax_e32m1();
          break;
        default:
          return -1;
          break;
      }
      break;
    case VLMUL::LMUL_M2:
      switch(sew) {
        case VSEW::SEW_E8:
          return vsetvlmax_e8m2();
          break;
        case VSEW::SEW_E16:
          return vsetvlmax_e16m2();
          break;
        case VSEW::SEW_E32:
          return vsetvlmax_e32m2();
          break;
        default:
          return -1;
          break;
      }
    case VLMUL::LMUL_M4:
      switch(sew) {
        case VSEW::SEW_E8:
          return vsetvlmax_e8m4();
          break;
        case VSEW::SEW_E16:
          return vsetvlmax_e16m4();
          break;
        case VSEW::SEW_E32:
          return vsetvlmax_e32m4();
          break;
        default:
          return -1;
          break;
      }
      break;
    case VLMUL::LMUL_M8:
      switch(sew) {
        case VSEW::SEW_E8:
          return vsetvlmax_e8m8();
          break;
        case VSEW::SEW_E16:
          return vsetvlmax_e16m8();
          break;
        case VSEW::SEW_E32:
          return vsetvlmax_e32m8();
          break;
        default:
          return -1;
          break;
      }
      break;
    default:
      break;
  }
  return -1;
}

int set_vsetvli(VSEW sew, VLMUL lmul, uint32_t avl) {
  uint32_t vl = 0;
  switch(lmul) {
    case VLMUL::LMUL_M1:
      switch(sew) {
          case VSEW::SEW_E8:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e8, m1, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          case VSEW::SEW_E16:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e16, m1, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          case VSEW::SEW_E32:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e32, m1, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          default:
              return 0;
      }
      break;
    case VLMUL::LMUL_M2:
      switch(sew) {
          case VSEW::SEW_E8:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e8, m2, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          case VSEW::SEW_E16:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e16, m2, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          case VSEW::SEW_E32:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e32, m2, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          default:
              return 0;
      }
      break;
    case VLMUL::LMUL_M4:
      switch(sew) {
          case VSEW::SEW_E8:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e8, m4, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          case VSEW::SEW_E16:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e16, m4, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          case VSEW::SEW_E32:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e32, m4, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          default:
              return 0;
      }
      break;
    case VLMUL::LMUL_M8:
      switch(sew) {
          case VSEW::SEW_E8:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e8, m8, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          case VSEW::SEW_E16:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e16, m8, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          case VSEW::SEW_E32:
            __asm__ volatile(
              "vsetvli %[VL], %[AVL], e32, m8, tu, mu"
              : [VL] "=r" (vl)
              : [AVL] "r" (avl)
            );
            break;
          default:
              return 0;
      }
      break;
    default:
      return 0;
  }
  return vl;
}

}
