blob: a98f217204b36c6673af7ad40c8e2fd8dddf1c65 [file] [log] [blame]
#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;
}
}