vsetvl: Add test for vsetvl in asm.

Change-Id: Ie372c934fbcf292c73539de9b778a28d3523cda4
diff --git a/test_v_helpers/include/test_v_helpers.h b/test_v_helpers/include/test_v_helpers.h
index bb83f51..ef1236e 100644
--- a/test_v_helpers/include/test_v_helpers.h
+++ b/test_v_helpers/include/test_v_helpers.h
@@ -18,7 +18,7 @@
 
 enum VLMUL {
 
-/* // Fractional LMUL not supported by our compiler
+/* // Fractional LMUL not supported by our intrinsic compiler
   LMUL_MF8 = 5,
   LMUL_MF4 = 6,
   LMUL_MF2 = 7,
@@ -29,6 +29,11 @@
   LMUL_M8 = 3,
 };
 
+uint32_t get_vtype(VSEW sew, VLMUL lmul, bool tail_agnostic, bool mask_agnostic);
+
+// vsetvl  rd, rs1, rs2      # rd = new vl, rs1 = AVL, rs2 = new vtype value
+uint32_t set_vsetvl(VSEW sew, VLMUL lmul, uint32_t avl, bool tail_agnostic, bool mask_agnostic);
+
 int set_vsetvl_intrinsic(VSEW sew, VLMUL lmul, uint32_t avl);
 
 int get_vsetvlmax_intrinsic(VSEW sew, VLMUL lmul);
diff --git a/test_v_helpers/test_v_helpers.cpp b/test_v_helpers/test_v_helpers.cpp
index d092069..a98f217 100644
--- a/test_v_helpers/test_v_helpers.cpp
+++ b/test_v_helpers/test_v_helpers.cpp
@@ -4,6 +4,25 @@
 
 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:
diff --git a/test_vsetvl/test_vsetvl.cpp b/test_vsetvl/test_vsetvl.cpp
index d57a163..6ae44d8 100644
--- a/test_vsetvl/test_vsetvl.cpp
+++ b/test_vsetvl/test_vsetvl.cpp
@@ -32,6 +32,10 @@
     size_t vl = set_vsetvl_intrinsic(sew, vlmul, AVLS[i]);
     EXPECT_EQ(vl, calculate_vl(width, AVLS[i], lmul));
   }
+  for (int i = 0; i < AVL_COUNT; i++) {
+    uint32_t vl = set_vsetvl(sew, vlmul, AVLS[i], false, false);
+    EXPECT_EQ(vl, calculate_vl(width, AVLS[i], lmul));
+  }
 }
 
 static void test_vsetvlmax(VSEW sew, VLMUL vlmul, uint32_t width, float lmul) {