1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "gtest/gtest.h"
18 
19 #include <malloc.h>  // memalign
20 #include <sys/mman.h>
21 #include <unistd.h>
22 
23 #include <algorithm>  // copy_n, fill_n
24 #include <cfenv>
25 #include <csignal>
26 #include <cstdint>
27 #include <cstring>
28 #include <memory>
29 
30 #include "berberis/base/bit_util.h"
31 #include "berberis/base/checks.h"
32 #include "berberis/guest_os_primitives/guest_thread.h"
33 #include "berberis/guest_state/guest_addr.h"
34 #include "berberis/guest_state/guest_state.h"
35 #include "berberis/interpreter/riscv64/interpreter.h"
36 #include "berberis/intrinsics/guest_cpu_flags.h"       // GuestModeFromHostRounding
37 #include "berberis/intrinsics/guest_rounding_modes.h"  // ScopedRoundingMode
38 #include "berberis/intrinsics/simd_register.h"
39 #include "berberis/intrinsics/vector_intrinsics.h"
40 #include "berberis/runtime_primitives/memory_region_reservation.h"
41 
42 #include "../faulty_memory_accesses.h"
43 
44 namespace berberis {
45 
46 namespace {
47 
48 #if defined(__i386__)
49 constexpr size_t kRegIP = REG_EIP;
50 #elif defined(__x86_64__)
51 constexpr size_t kRegIP = REG_RIP;
52 #else
53 #error "Unsupported arch"
54 #endif
55 
56 bool sighandler_called = false;
57 
FaultHandler(int,siginfo_t *,void * ctx)58 void FaultHandler(int /* sig */, siginfo_t* /* info */, void* ctx) {
59   ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(ctx);
60   static_assert(sizeof(void*) == sizeof(greg_t), "Unsupported type sizes");
61   void* fault_addr = reinterpret_cast<void*>(ucontext->uc_mcontext.gregs[kRegIP]);
62   void* recovery_addr = FindFaultyMemoryAccessRecoveryAddrForTesting(fault_addr);
63   sighandler_called = true;
64   CHECK(recovery_addr);
65   ucontext->uc_mcontext.gregs[kRegIP] = reinterpret_cast<greg_t>(recovery_addr);
66 }
67 
68 class ScopedFaultySigaction {
69  public:
ScopedFaultySigaction()70   ScopedFaultySigaction() {
71     struct sigaction sa;
72     sa.sa_flags = SA_SIGINFO;
73     sigemptyset(&sa.sa_mask);
74     sa.sa_sigaction = FaultHandler;
75     CHECK_EQ(sigaction(SIGSEGV, &sa, &old_sa_), 0);
76   }
77 
~ScopedFaultySigaction()78   ~ScopedFaultySigaction() { CHECK_EQ(sigaction(SIGSEGV, &old_sa_, nullptr), 0); }
79 
80  private:
81   struct sigaction old_sa_;
82 };
83 
84 //  Interpreter decodes the size itself, but we need to accept this template parameter to share
85 //  tests with translators.
86 template <uint8_t kInsnSize = 4>
RunOneInstruction(ThreadState * state,GuestAddr stop_pc)87 bool RunOneInstruction(ThreadState* state, GuestAddr stop_pc) {
88   InterpretInsn(state);
89   return state->cpu.insn_addr == stop_pc;
90 }
91 
92 class Riscv64InterpreterTest : public ::testing::Test {
93  public:
94   // Non-Compressed Instructions.
Riscv64InterpreterTest()95   Riscv64InterpreterTest()
96       : state_{
97             .cpu = {.vtype = uint64_t{1} << 63, .frm = intrinsics::GuestModeFromHostRounding()}} {}
98 
InterpretFence(uint32_t insn_bytes)99   void InterpretFence(uint32_t insn_bytes) {
100     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
101     InterpretInsn(&state_);
102   }
103 
104   // Vector instructions.
105   template <typename ElementType>
TestFPExceptions(uint32_t insn_bytes)106   void TestFPExceptions(uint32_t insn_bytes) {
107     // Install the following arguments: NaN, 1.0, 1.0, NaN.
108     // Then try to mask out NaNs with vstart, vl, and mask.
109     state_.cpu.v[24] = state_.cpu.v[16] = state_.cpu.v[8] =
110         SIMD128Register{__v2du{0x7ff4'0000'0000'0000, 0x3ff0'0000'0000'0000}}.Get<__uint128_t>();
111     state_.cpu.v[25] = state_.cpu.v[17] = state_.cpu.v[9] =
112         SIMD128Register{__v2du{0x3ff0'0000'0000'0000, 0x7ff4'0000'0000'0000}}.Get<__uint128_t>();
113     state_.cpu.v[26] = state_.cpu.v[18] = state_.cpu.v[10] = SIMD128Register{
114         __v4su{
115             0x7fa0'0000, 0x3f80'0000, 0x3f80'0000, 0x7fa0'0000}}.Get<__uint128_t>();
116     state_.cpu.f[1] = 0xffff'ffff'3f80'0000;
117     state_.cpu.f[2] = 0x3ff0'0000'0000'0000;
118     ;
119     state_.cpu.vtype = (BitUtilLog2(sizeof(ElementType)) << 3) | /*vlmul=*/1;
120     // First clear exceptions and execute the instruction with vstart = 0, vl = 4.
121     // This should produce FE_INVALID with most floating point instructions.
122     EXPECT_EQ(feclearexcept(FE_ALL_EXCEPT), 0);
123     state_.cpu.vstart = 0;
124     state_.cpu.vl = 4;
125     state_.cpu.v[0] = 0b1111;
126     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
127     EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
128     EXPECT_TRUE(bool(fetestexcept(FE_ALL_EXCEPT)));
129     // Mask NaNs using vstart and vl.
130     EXPECT_EQ(feclearexcept(FE_ALL_EXCEPT), 0);
131     state_.cpu.vstart = 1;
132     state_.cpu.vl = 3;
133     state_.cpu.v[0] = 0b1111;
134     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
135     EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
136     EXPECT_FALSE(bool(fetestexcept(FE_ALL_EXCEPT)));
137     // Mask NaNs using mask.
138     EXPECT_EQ(feclearexcept(FE_ALL_EXCEPT), 0);
139     state_.cpu.vstart = 0;
140     state_.cpu.vl = 4;
141     state_.cpu.v[0] = 0b0110;
142     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
143     EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
144     EXPECT_FALSE(bool(fetestexcept(FE_ALL_EXCEPT)));
145   }
146 
147   template <size_t kNFfields>
TestVlXreXX(uint32_t insn_bytes)148   void TestVlXreXX(uint32_t insn_bytes) {
149     const auto kUndisturbedValue = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
150     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
151     SetXReg<1>(state_.cpu, ToGuestAddr(&kVectorComparisonSource));
152     for (size_t index = 0; index < 8; index++) {
153       state_.cpu.v[8 + index] = kUndisturbedValue;
154     }
155     EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
156     for (size_t index = 0; index < 8; index++) {
157       EXPECT_EQ(state_.cpu.v[8 + index],
158                 (index >= kNFfields
159                      ? kUndisturbedValue
160                      : SIMD128Register{kVectorComparisonSource[index]}.Get<__uint128_t>()));
161     }
162   }
163 
164   template <typename ElementType, size_t kNFfields, size_t kLmul>
VlxsegXeiXX(uint32_t insn_bytes,const ElementType::BaseType (& expected_results)[kNFfields * kLmul][static_cast<int> (sizeof (SIMD128Register)/sizeof (ElementType))])165   void VlxsegXeiXX(
166       uint32_t insn_bytes,
167       const ElementType::BaseType (&expected_results)[kNFfields * kLmul][static_cast<int>(
168           sizeof(SIMD128Register) / sizeof(ElementType))]) {
169     VlxsegXeiXX<ElementType, UInt8, kNFfields, kLmul>(insn_bytes, expected_results);
170     VlxsegXeiXX<ElementType, UInt8, kNFfields, kLmul>(insn_bytes | 0x8000000, expected_results);
171     VlxsegXeiXX<ElementType, UInt16, kNFfields, kLmul>(insn_bytes | 0x5000, expected_results);
172     VlxsegXeiXX<ElementType, UInt16, kNFfields, kLmul>(insn_bytes | 0x8005000, expected_results);
173     VlxsegXeiXX<ElementType, UInt32, kNFfields, kLmul>(insn_bytes | 0x6000, expected_results);
174     VlxsegXeiXX<ElementType, UInt32, kNFfields, kLmul>(insn_bytes | 0x8006000, expected_results);
175     VlxsegXeiXX<ElementType, UInt64, kNFfields, kLmul>(insn_bytes | 0x7000, expected_results);
176     VlxsegXeiXX<ElementType, UInt64, kNFfields, kLmul>(insn_bytes | 0x8007000, expected_results);
177   }
178 
179   template <typename DataElementType, typename IndexElementType, size_t kNFfields, size_t kLmul>
VlxsegXeiXX(uint32_t insn_bytes,const DataElementType::BaseType (& expected_results)[kNFfields * kLmul][static_cast<int> (sizeof (SIMD128Register)/sizeof (DataElementType))])180   void VlxsegXeiXX(
181       uint32_t insn_bytes,
182       const DataElementType::BaseType (&expected_results)[kNFfields * kLmul][static_cast<int>(
183           sizeof(SIMD128Register) / sizeof(DataElementType))]) {
184     constexpr size_t kElementsCount = sizeof(SIMD128Register) / sizeof(IndexElementType);
185     constexpr size_t kTotalElements =
186         sizeof(SIMD128Register) / sizeof(DataElementType) * kLmul * kNFfields;
187     // If we need more indexes than may fit into 8 vector registers then such operation is
188     // impossible on RISC-V and we should skip that combination.
189     if constexpr (sizeof(IndexElementType) * kTotalElements <= sizeof(SIMD128Register) * 8) {
190       TestVectorLoad<DataElementType, kNFfields, kLmul>(insn_bytes, expected_results, [this] {
191         for (size_t reg_no = 0; reg_no < AlignUp<kElementsCount>(kTotalElements) / kElementsCount;
192              ++reg_no) {
193           SIMD128Register index_register;
194           for (size_t index = 0; index < kElementsCount; ++index) {
195             index_register.Set(IndexElementType{static_cast<typename IndexElementType::BaseType>(
196                                    kPermutedIndexes[index + reg_no * kElementsCount] *
197                                    sizeof(DataElementType) * kNFfields)},
198                                index);
199           }
200           state_.cpu.v[16 + reg_no] = index_register.Get<__uint128_t>();
201         }
202       });
203     }
204   }
205 
206   template <typename ElementType, size_t kNFfields, size_t kLmul>
TestVlsegXeXX(uint32_t insn_bytes,const ElementType::BaseType (& expected_results)[kNFfields * kLmul][static_cast<int> (16/sizeof (ElementType))])207   void TestVlsegXeXX(
208       uint32_t insn_bytes,
209       const ElementType::BaseType (
210           &expected_results)[kNFfields * kLmul][static_cast<int>(16 / sizeof(ElementType))]) {
211     TestVectorLoad<ElementType, kNFfields, kLmul>(insn_bytes, expected_results, [] {});
212     // Turn Vector Unit-Stride Segment Loads and Stores into Fault-Only-First Load.
213     TestVectorLoad<ElementType, kNFfields, kLmul>(insn_bytes | 0x1000000, expected_results, [] {});
214   }
215 
216   template <typename ElementType, size_t kNFfields, size_t kLmul>
TestVlssegXeXX(uint32_t insn_bytes,uint64_t stride,const ElementType::BaseType (& expected_results)[kNFfields * kLmul][static_cast<int> (16/sizeof (ElementType))])217   void TestVlssegXeXX(
218       uint32_t insn_bytes,
219       uint64_t stride,
220       const ElementType::BaseType (
221           &expected_results)[kNFfields * kLmul][static_cast<int>(16 / sizeof(ElementType))]) {
222     TestVectorLoad<ElementType, kNFfields, kLmul>(
223         insn_bytes, expected_results, [stride, this] { SetXReg<2>(state_.cpu, stride); });
224   }
225 
226   template <typename ElementType, size_t kNFfields, size_t kLmul, typename ExtraCPUInitType>
TestVectorLoad(uint32_t insn_bytes,const ElementType::BaseType (& expected_results)[kNFfields * kLmul][static_cast<int> (16/sizeof (ElementType))],ExtraCPUInitType ExtraCPUInit)227   void TestVectorLoad(
228       uint32_t insn_bytes,
229       const ElementType::BaseType (
230           &expected_results)[kNFfields * kLmul][static_cast<int>(16 / sizeof(ElementType))],
231       ExtraCPUInitType ExtraCPUInit) {
232     constexpr int kElementsCount = static_cast<int>(16 / sizeof(ElementType));
233     const auto kUndisturbedValue = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
234     for (uint8_t vstart = 0; vstart <= kElementsCount * kLmul; ++vstart) {
235       for (uint8_t vl = 0; vl <= kElementsCount * kLmul; ++vl) {
236         for (uint8_t vta = 0; vta < 2; ++vta) {
237           // Handle three masking cases:
238           //   no masking (vma == 0), agnostic (vma == 1), undisturbed (vma == 2)
239           for (uint8_t vma = 0; vma < 3; ++vma) {
240             state_.cpu.vtype = (vma & 1) << 7 | (vta << 6) |
241                                (BitUtilLog2(sizeof(ElementType)) << 3) | BitUtilLog2(kLmul);
242             state_.cpu.vstart = vstart;
243             state_.cpu.vl = vl;
244             uint32_t insn_bytes_with_vm = insn_bytes;
245             // If masking is supposed to be disabled then we need to set vm bit (#25).
246             if (!vma) {
247               insn_bytes_with_vm |= (1 << 25);
248             }
249             state_.cpu.insn_addr = ToGuestAddr(&insn_bytes_with_vm);
250             SetXReg<1>(state_.cpu, ToGuestAddr(&kVectorCalculationsSource));
251             state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
252             for (size_t index = 0; index < 8; index++) {
253               state_.cpu.v[8 + index] = kUndisturbedValue;
254             }
255             ExtraCPUInit();
256             EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
257             EXPECT_EQ(state_.cpu.vstart, 0);
258             EXPECT_EQ(state_.cpu.vl, vl);
259             for (size_t field = 0; field < kNFfields; field++) {
260               for (size_t index = 0; index < kLmul; index++) {
261                 for (size_t element = 0; element < kElementsCount; ++element) {
262                   ElementType expected_element;
263                   if (vstart >= vl) {
264                     // When vstart ⩾ vl, there are no body elements, and no elements are updated in
265                     // any destinationvector register group, including that no tail elements are
266                     // updated with agnostic values.
267                     expected_element =
268                         SIMD128Register{kUndisturbedResult}.Get<ElementType>(element);
269                   } else if (element + index * kElementsCount < std::min(vstart, vl)) {
270                     // Elements before vstart are undisturbed if vstart is less than vl.
271                     expected_element =
272                         SIMD128Register{kUndisturbedResult}.Get<ElementType>(element);
273                   } else if (element + index * kElementsCount >= vl) {
274                     // Element after vl have to be processed with vta policy.
275                     if (vta == 1) {
276                       expected_element = ~ElementType{0};
277                     } else {
278                       expected_element =
279                           SIMD128Register{kUndisturbedResult}.Get<ElementType>(element);
280                     }
281                   } else if (vma &&
282                              (~(state_.cpu.v[0]) >> (element + index * kElementsCount)) & 1) {
283                     // If element is inactive it's processed with vma policy.
284                     if (vma == 1) {
285                       expected_element = ~ElementType{0};
286                     } else {
287                       expected_element =
288                           SIMD128Register{kUndisturbedResult}.Get<ElementType>(element);
289                     }
290                   } else {
291                     expected_element =
292                         ElementType{expected_results[index + field * kLmul][element]};
293                   }
294                   EXPECT_EQ(
295                       SIMD128Register{state_.cpu.v[8 + index + field * kLmul]}.Get<ElementType>(
296                           element),
297                       expected_element);
298                 }
299               }
300             }
301             for (size_t index = kNFfields * kLmul; index < 8; index++) {
302               EXPECT_EQ(state_.cpu.v[8 + index], kUndisturbedValue);
303             }
304           }
305         }
306       }
307     }
308   }
309 
TestVlm(uint32_t insn_bytes,__v16qu expected_results)310   void TestVlm(uint32_t insn_bytes, __v16qu expected_results) {
311     const auto kUndisturbedValue = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
312     // Vlm.v is special form of normal vector load which mostly ignores vtype.
313     // The only bit that it honors is vill: https://github.com/riscv/riscv-v-spec/pull/877
314     // Verify that changes to vtype don't affect the execution (but vstart and vl do).
315     for (uint8_t sew = 0; sew < 4; ++sew) {
316       for (uint8_t vlmul = 0; vlmul < 4; ++vlmul) {
317         const uint8_t kElementsCount = (16 >> sew) << vlmul;
318         for (uint8_t vstart = 0; vstart <= kElementsCount; ++vstart) {
319           for (uint8_t vl = 0; vl <= kElementsCount; ++vl) {
320             const uint8_t kVlmVl = AlignUp<CHAR_BIT>(vl) / CHAR_BIT;
321             for (uint8_t vta = 0; vta < 2; ++vta) {
322               for (uint8_t vma = 0; vma < 2; ++vma) {
323                 state_.cpu.vtype = (vma << 7) | (vta << 6) | (sew << 3) | vlmul;
324                 state_.cpu.vstart = vstart;
325                 state_.cpu.vl = vl;
326                 state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
327                 SetXReg<1>(state_.cpu, ToGuestAddr(&kVectorCalculationsSource));
328                 state_.cpu.v[8] = kUndisturbedValue;
329                 EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
330                 EXPECT_EQ(state_.cpu.vstart, 0);
331                 EXPECT_EQ(state_.cpu.vl, vl);
332                 for (size_t element = 0; element < 16; ++element) {
333                   UInt8 expected_element;
334                   if (element < vstart || vstart >= kVlmVl) {
335                     expected_element = SIMD128Register{kUndisturbedResult}.Get<UInt8>(element);
336                   } else if (element >= kVlmVl) {
337                     expected_element = ~UInt8{0};
338                   } else {
339                     expected_element = UInt8{expected_results[element]};
340                   }
341                   EXPECT_EQ(SIMD128Register{state_.cpu.v[8]}.Get<UInt8>(element), expected_element);
342                 }
343               }
344             }
345           }
346         }
347       }
348     }
349   }
350 
351   template <typename ElementType, size_t kNFfields, size_t kLmul, size_t kResultSize>
VsxsegXeiXX(uint32_t insn_bytes,const uint64_t (& expected_results)[kResultSize])352   void VsxsegXeiXX(uint32_t insn_bytes, const uint64_t (&expected_results)[kResultSize]) {
353     VsxsegXeiXX<ElementType, UInt8, kNFfields, kLmul>(insn_bytes, expected_results);
354     VsxsegXeiXX<ElementType, UInt8, kNFfields, kLmul>(insn_bytes | 0x8000000, expected_results);
355     VsxsegXeiXX<ElementType, UInt16, kNFfields, kLmul>(insn_bytes | 0x5000, expected_results);
356     VsxsegXeiXX<ElementType, UInt16, kNFfields, kLmul>(insn_bytes | 0x8005000, expected_results);
357     VsxsegXeiXX<ElementType, UInt32, kNFfields, kLmul>(insn_bytes | 0x6000, expected_results);
358     VsxsegXeiXX<ElementType, UInt32, kNFfields, kLmul>(insn_bytes | 0x8006000, expected_results);
359     VsxsegXeiXX<ElementType, UInt64, kNFfields, kLmul>(insn_bytes | 0x7000, expected_results);
360     VsxsegXeiXX<ElementType, UInt64, kNFfields, kLmul>(insn_bytes | 0x8007000, expected_results);
361   }
362 
363   template <typename DataElementType,
364             typename IndexElementType,
365             size_t kNFfields,
366             size_t kLmul,
367             size_t kResultSize>
VsxsegXeiXX(uint32_t insn_bytes,const uint64_t (& expected_results)[kResultSize])368   void VsxsegXeiXX(uint32_t insn_bytes, const uint64_t (&expected_results)[kResultSize]) {
369     constexpr size_t kElementsCount = sizeof(SIMD128Register) / sizeof(IndexElementType);
370     constexpr size_t kTotalElements =
371         sizeof(SIMD128Register) / sizeof(DataElementType) * kLmul * kNFfields;
372     // If we need more indexes than may fit into 8 vector registers then such operation is
373     // impossible on RISC-V and we should skip that combination.
374     if constexpr (sizeof(IndexElementType) * kTotalElements <= sizeof(SIMD128Register) * 8) {
375       TestVectorStore<DataElementType, kNFfields, kLmul>(insn_bytes, expected_results, [this] {
376         for (size_t reg_no = 0; reg_no < AlignUp<kElementsCount>(kTotalElements) / kElementsCount;
377              ++reg_no) {
378           SIMD128Register index_register;
379           for (size_t index = 0; index < kElementsCount; ++index) {
380             index_register.Set(IndexElementType{static_cast<typename IndexElementType::BaseType>(
381                                    kPermutedIndexes[index + reg_no * kElementsCount] *
382                                    sizeof(DataElementType) * kNFfields)},
383                                index);
384           }
385           state_.cpu.v[16 + reg_no] = index_register.Get<__uint128_t>();
386         }
387       });
388     }
389   }
390 
391   template <typename ElementType, size_t kNFfields, size_t kLmul, size_t kResultSize>
TestVssegXeXX(uint32_t insn_bytes,const uint64_t (& expected_results)[kResultSize])392   void TestVssegXeXX(uint32_t insn_bytes, const uint64_t (&expected_results)[kResultSize]) {
393     TestVectorStore<ElementType, kNFfields, kLmul>(insn_bytes, expected_results, [] {});
394   }
395 
396   template <typename ElementType, size_t kNFfields, size_t kLmul, size_t kResultSize>
TestVsssegXeXX(uint32_t insn_bytes,uint64_t stride,const uint64_t (& expected_results)[kResultSize])397   void TestVsssegXeXX(uint32_t insn_bytes,
398                       uint64_t stride,
399                       const uint64_t (&expected_results)[kResultSize]) {
400     TestVectorStore<ElementType, kNFfields, kLmul>(
401         insn_bytes, expected_results, [stride, this] { SetXReg<2>(state_.cpu, stride); });
402   }
403 
404   template <typename ElementType,
405             size_t kNFfields,
406             size_t kLmul,
407             size_t kResultSize,
408             typename ExtraCPUInitType>
TestVectorStore(uint32_t insn_bytes,const uint64_t (& expected_results)[kResultSize],ExtraCPUInitType ExtraCPUInit)409   void TestVectorStore(uint32_t insn_bytes,
410                        const uint64_t (&expected_results)[kResultSize],
411                        ExtraCPUInitType ExtraCPUInit) {
412     constexpr size_t kElementsCount = 16 / sizeof(ElementType);
413     const SIMD128Register kUndisturbedValue = SIMD128Register{kUndisturbedResult};
414     state_.cpu.vtype = (BitUtilLog2(sizeof(ElementType)) << 3) | BitUtilLog2(kLmul);
415     state_.cpu.vstart = 0;
416     state_.cpu.vl = kElementsCount * kLmul;
417     // First verify that store works with no inactive elements and no masking.
418     uint32_t insn_bytes_with_vm = insn_bytes | (1 << 25);
419     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes_with_vm);
420     SetXReg<1>(state_.cpu, ToGuestAddr(&store_area_));
421     for (size_t index = 0; index < 8; ++index) {
422       state_.cpu.v[8 + index] =
423           SIMD128Register{kVectorCalculationsSource[index]}.Get<__uint128_t>();
424     }
425     for (uint64_t& element : store_area_) {
426       element = kUndisturbedResult[0];
427     }
428     ExtraCPUInit();
429     EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
430     for (size_t index = 0; index < std::size(store_area_); ++index) {
431       if (index >= std::size(expected_results)) {
432         EXPECT_EQ(store_area_[index], static_cast<uint64_t>(kUndisturbedResult[0]));
433       } else {
434         EXPECT_EQ(store_area_[index], expected_results[index]);
435       }
436     }
437     // Most vector instruction apply masks to *target* operands which means we may apply the exact
438     // same, well-tested logic to verify how they work. But store instructions apply masks to *data
439     // source* operand which makes generation of expected target problematic (especially for
440     // complicated store with segments and strides and/or indexes). To sidestep the issue we are
441     // first testing that full version with all elements active works (above) and then reuse it to
442     // verify that `vstart`, `vl` ������ `mask` operands work as expected. This wouldn't work if some
443     // elements are overlapping, but these instructions, while technically permitted, already are
444     // allowed to produce many possible different results, thus we are not testing them.
445     for (uint8_t vstart = 0; vstart <= kElementsCount * kLmul; ++vstart) {
446       for (uint8_t vl = 0; vl <= kElementsCount * kLmul; ++vl) {
447         for (uint8_t vta = 0; vta < 2; ++vta) {
448           // Handle three masking cases:
449           //   no masking (vma == 0), agnostic (vma == 1), undisturbed (vma == 2)
450           // Note: vta and vma settings are ignored by store instructions, we are just verifying
451           // this is what actually happens.
452           for (uint8_t vma = 0; vma < 3; ++vma) {
453             // Use instruction in the mode tested above to generate expected results.
454             state_.cpu.vtype = (BitUtilLog2(sizeof(ElementType)) << 3) | BitUtilLog2(kLmul);
455             state_.cpu.vstart = 0;
456             state_.cpu.vl = kElementsCount * kLmul;
457             state_.cpu.insn_addr = ToGuestAddr(&insn_bytes_with_vm);
458             decltype(store_area_) expected_store_area;
459             SetXReg<1>(state_.cpu, ToGuestAddr(&expected_store_area));
460             for (size_t index = 0; index < kLmul; ++index) {
461               for (size_t field = 0; field < kNFfields; ++field) {
462                 SIMD128Register register_value =
463                     SIMD128Register{kVectorCalculationsSource[index + field * kLmul]};
464                 if (vma) {
465                   auto ApplyMask = [&register_value, &kUndisturbedValue, index](auto mask) {
466                     register_value =
467                         (register_value & mask[index]) | (kUndisturbedValue & ~mask[index]);
468                   };
469                   if constexpr (sizeof(ElementType) == sizeof(Int8)) {
470                     ApplyMask(kMaskInt8);
471                   } else if constexpr (sizeof(ElementType) == sizeof(Int16)) {
472                     ApplyMask(kMaskInt16);
473                   } else if constexpr (sizeof(ElementType) == sizeof(Int32)) {
474                     ApplyMask(kMaskInt32);
475                   } else if constexpr (sizeof(ElementType) == sizeof(Int64)) {
476                     ApplyMask(kMaskInt64);
477                   } else {
478                     static_assert(kDependentTypeFalse<ElementType>);
479                   }
480                 }
481                 if (vstart > kElementsCount * index) {
482                   for (size_t prefix_id = 0;
483                        prefix_id < std::min(kElementsCount, vstart - kElementsCount * index);
484                        ++prefix_id) {
485                     register_value.Set(kUndisturbedValue.Get<ElementType>(0), prefix_id);
486                   }
487                 }
488                 if (vl <= kElementsCount * index) {
489                   register_value = kUndisturbedValue.Get<__uint128_t>();
490                 } else if (vl < kElementsCount * (index + 1)) {
491                   for (size_t suffix_id = vl - kElementsCount * index; suffix_id < kElementsCount;
492                        ++suffix_id) {
493                     register_value.Set(kUndisturbedValue.Get<ElementType>(0), suffix_id);
494                   }
495                 }
496                 state_.cpu.v[8 + index + field * kLmul] = register_value.Get<__uint128_t>();
497               }
498             }
499             for (uint64_t& element : expected_store_area) {
500               element = kUndisturbedResult[0];
501             }
502             ExtraCPUInit();
503             EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
504             // Now execute instruction with mode that we want to actually test.
505             state_.cpu.vtype = (vma & 1) << 7 | (vta << 6) |
506                                (BitUtilLog2(sizeof(ElementType)) << 3) | BitUtilLog2(kLmul);
507             state_.cpu.vstart = vstart;
508             state_.cpu.vl = vl;
509             uint32_t insn_bytes_with_vm = insn_bytes;
510             // If masking is supposed to be disabled then we need to set vm bit (#25).
511             if (!vma) {
512               insn_bytes_with_vm |= (1 << 25);
513             }
514             state_.cpu.insn_addr = ToGuestAddr(&insn_bytes_with_vm);
515             SetXReg<1>(state_.cpu, ToGuestAddr(&store_area_));
516             state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
517             for (size_t index = 0; index < 8; ++index) {
518               state_.cpu.v[8 + index] =
519                   SIMD128Register{kVectorCalculationsSource[index]}.Get<__uint128_t>();
520             }
521             for (uint64_t& element : store_area_) {
522               element = kUndisturbedResult[0];
523             }
524             ExtraCPUInit();
525             EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
526             for (size_t index = 0; index < std::size(store_area_); ++index) {
527               EXPECT_EQ(store_area_[index], expected_store_area[index]);
528             }
529           }
530         }
531       }
532     }
533   }
534 
TestVsm(uint32_t insn_bytes,__v16qu expected_results)535   void TestVsm(uint32_t insn_bytes, __v16qu expected_results) {
536     const auto kUndisturbedValue = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
537     // Vlm.v is special form of normal vector load which mostly ignores vtype.
538     // The only bit that it honors is vill: https://github.com/riscv/riscv-v-spec/pull/877
539     // Verify that changes to vtype don't affect the execution (but vstart and vl do).
540     for (uint8_t sew = 0; sew < 4; ++sew) {
541       for (uint8_t vlmul = 0; vlmul < 4; ++vlmul) {
542         const uint8_t kElementsCount = (16 >> sew) << vlmul;
543         for (uint8_t vstart = 0; vstart <= kElementsCount; ++vstart) {
544           for (uint8_t vl = 0; vl <= kElementsCount; ++vl) {
545             const uint8_t kVlmVl = AlignUp<CHAR_BIT>(vl) / CHAR_BIT;
546             for (uint8_t vta = 0; vta < 2; ++vta) {
547               for (uint8_t vma = 0; vma < 2; ++vma) {
548                 state_.cpu.vtype = (vma << 7) | (vta << 6) | (sew << 3) | vlmul;
549                 state_.cpu.vstart = vstart;
550                 state_.cpu.vl = vl;
551                 state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
552                 SetXReg<1>(state_.cpu, ToGuestAddr(&store_area_));
553                 store_area_[0] = kUndisturbedResult[0];
554                 store_area_[1] = kUndisturbedResult[1];
555                 state_.cpu.v[8] = SIMD128Register{kVectorCalculationsSource[0]}.Get<__uint128_t>();
556                 EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
557                 EXPECT_EQ(state_.cpu.vstart, 0);
558                 EXPECT_EQ(state_.cpu.vl, vl);
559                 SIMD128Register memory_result =
560                     SIMD128Register{__v2du{store_area_[0], store_area_[1]}};
561                 for (size_t element = 0; element < 16; ++element) {
562                   UInt8 expected_element;
563                   if (element < vstart || element >= kVlmVl) {
564                     expected_element = SIMD128Register{kUndisturbedResult}.Get<UInt8>(element);
565                   } else {
566                     expected_element = UInt8{expected_results[element]};
567                   }
568                   EXPECT_EQ(memory_result.Get<UInt8>(element), expected_element);
569                 }
570               }
571             }
572           }
573         }
574       }
575     }
576   }
577 
578   // Vector instructions.
TestVleXXff(uint32_t insn_bytes,uint8_t loadable_bytes,uint8_t vsew,uint8_t expected_vl,bool fail_on_first=false)579   void TestVleXXff(uint32_t insn_bytes,
580                    uint8_t loadable_bytes,
581                    uint8_t vsew,
582                    uint8_t expected_vl,
583                    bool fail_on_first = false) {
584     ScopedFaultySigaction scoped_sa;
585     sighandler_called = false;
586     char* buffer;
587     const size_t kPageSize = sysconf(_SC_PAGE_SIZE);
588     buffer = (char*)memalign(kPageSize, 2 * kPageSize);
589     mprotect(buffer, kPageSize * 2, PROT_WRITE);
590     char* p = buffer + kPageSize - loadable_bytes;
591     std::memcpy(p, &kVectorCalculationsSource[0], 128);
592     mprotect(buffer + kPageSize, kPageSize, PROT_NONE);
593 
594     auto [vlmax, vtype] = intrinsics::Vsetvl(~0ULL, (vsew << 3) | 3);
595     state_.cpu.vstart = 0;
596     state_.cpu.vl = vlmax;
597     state_.cpu.vtype = vtype;
598     insn_bytes = insn_bytes | (1 << 25);
599     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
600     SetXReg<1>(state_.cpu, ToGuestAddr(p));
601 
602     if (fail_on_first) {
603       EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr));
604     } else {
605       EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
606     }
607     if (loadable_bytes < 128) {
608       EXPECT_TRUE(sighandler_called);
609     } else {
610       EXPECT_FALSE(sighandler_called);
611     }
612     EXPECT_EQ(state_.cpu.vl, expected_vl);
613   }
614 
615   // Vector instructions.
TestVleXX(uint32_t insn_bytes,const __v16qu (& expected_result_int8)[8],const __v8hu (& expected_result_int16)[8],const __v4su (& expected_result_int32)[8],const __v2du (& expected_result_int64)[8],uint8_t veew,const __v2du (& source)[16])616   void TestVleXX(uint32_t insn_bytes,
617                  const __v16qu (&expected_result_int8)[8],
618                  const __v8hu (&expected_result_int16)[8],
619                  const __v4su (&expected_result_int32)[8],
620                  const __v2du (&expected_result_int64)[8],
621                  uint8_t veew,
622                  const __v2du (&source)[16]) {
623     auto Verify = [this, &source](uint32_t insn_bytes,
624                                   uint8_t vsew,
625                                   uint8_t veew,
626                                   uint8_t vlmul_max,
627                                   const auto& expected_result,
628                                   auto mask) {
629       state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
630       for (uint8_t vlmul = 0; vlmul < vlmul_max; ++vlmul) {
631         int vemul = SignExtend<3>(vlmul);
632         vemul += vsew;  // Multiply by SEW.
633         vemul -= veew;  // Divide by EEW.
634         if (vemul < -3 || vemul > 3) {
635           // Incompatible vlmul
636           continue;
637         }
638 
639         for (uint8_t vta = 0; vta < 2; ++vta) {
640           for (uint8_t vma = 0; vma < 2; ++vma) {
641             auto [vlmax, vtype] =
642                 intrinsics::Vsetvl(~0ULL, (vma << 7) | (vta << 6) | (vsew << 3) | vlmul);
643             if (vlmax == 0) {
644               continue;
645             }
646             // Test vstart/vl changes with only with vemul == 2 (4 registers)
647             if (vemul == 2) {
648               state_.cpu.vstart = vlmax / 8;
649               state_.cpu.vl = (vlmax * 5) / 8;
650             } else {
651               state_.cpu.vstart = 0;
652               state_.cpu.vl = vlmax;
653             }
654             state_.cpu.vtype = vtype;
655 
656             // Set expected_result vector registers into 0b01010101… pattern.
657             for (size_t index = 0; index < 8; ++index) {
658               state_.cpu.v[8 + index] = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
659             }
660             state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
661             SetXReg<1>(state_.cpu, ToGuestAddr(&source));
662             EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
663             // Values for inactive elements (i.e. corresponding mask bit is 0).
664             const size_t n = std::size(source);
665             __m128i expected_inactive[n];
666             std::fill_n(expected_inactive, n, (vma ? kAgnosticResult : kUndisturbedResult));
667             if (vemul >= 0) {
668               for (size_t index = 0; index < 1 << vemul; ++index) {
669                 if (index == 0 && vemul == 2) {
670                   EXPECT_EQ(state_.cpu.v[8 + index],
671                             SIMD128Register{
672                                 (kUndisturbedResult & kFractionMaskInt8[3]) |
673                                 (expected_result[index] & mask[index] & ~kFractionMaskInt8[3]) |
674                                 (expected_inactive[index] & ~mask[index] & ~kFractionMaskInt8[3])}
675                                 .Get<__uint128_t>());
676                 } else if (index == 2 && vemul == 2) {
677                   EXPECT_EQ(
678                       state_.cpu.v[8 + index],
679                       SIMD128Register{
680                           (expected_result[index] & mask[index] & kFractionMaskInt8[3]) |
681                           (expected_inactive[index] & ~mask[index] & kFractionMaskInt8[3]) |
682                           ((vta ? kAgnosticResult : kUndisturbedResult) & ~kFractionMaskInt8[3])}
683                           .Get<__uint128_t>());
684                 } else if (index == 3 && vemul == 2 && vta) {
685                   EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{kAgnosticResult});
686                 } else if (index == 3 && vemul == 2) {
687                   EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{kUndisturbedResult});
688                 } else {
689                   EXPECT_EQ(state_.cpu.v[8 + index],
690                             SIMD128Register{(expected_result[index] & mask[index]) |
691                                             (expected_inactive[index] & ~mask[index])}
692                                 .Get<__uint128_t>());
693                 }
694               }
695 
696             } else {
697               EXPECT_EQ(state_.cpu.v[8],
698                         SIMD128Register{
699                             (expected_result[0] & mask[0] & kFractionMaskInt8[(vemul + 4)]) |
700                             (expected_inactive[0] & ~mask[0] & kFractionMaskInt8[(vemul + 4)]) |
701                             ((vta ? kAgnosticResult : kUndisturbedResult) &
702                              ~kFractionMaskInt8[(vemul + 4)])}
703                             .Get<__uint128_t>());
704             }
705           }
706         }
707       }
708     };
709     switch (veew) {
710       case 0:
711         Verify(insn_bytes | (1 << 25), veew, veew, 8, expected_result_int8, kNoMask);
712         Verify(insn_bytes, veew, veew, 8, expected_result_int8, kMaskInt8);
713         break;
714       case 1:
715         Verify(insn_bytes | (1 << 25), veew, veew, 8, expected_result_int16, kNoMask);
716         Verify(insn_bytes, veew, veew, 8, expected_result_int16, kMaskInt16);
717         break;
718       case 2:
719         Verify(insn_bytes | (1 << 25), veew, veew, 8, expected_result_int32, kNoMask);
720         Verify(insn_bytes, veew, veew, 8, expected_result_int32, kMaskInt32);
721         break;
722       case 3:
723         Verify(insn_bytes | (1 << 25), veew, veew, 8, expected_result_int64, kNoMask);
724         Verify(insn_bytes, veew, veew, 8, expected_result_int64, kMaskInt64);
725         break;
726       default:
727         break;
728     }
729   }
730 
731   // Vector instructions.
TestVseXX(uint32_t insn_bytes,const __v16qu (& expected_result_int8)[8],const __v8hu (& expected_result_int16)[8],const __v4su (& expected_result_int32)[8],const __v2du (& expected_result_int64)[8],uint8_t veew,const __v2du (& source)[16])732   void TestVseXX(uint32_t insn_bytes,
733                  const __v16qu (&expected_result_int8)[8],
734                  const __v8hu (&expected_result_int16)[8],
735                  const __v4su (&expected_result_int32)[8],
736                  const __v2du (&expected_result_int64)[8],
737                  uint8_t veew,
738                  const __v2du (&source)[16]) {
739     auto Verify = [this, &source](uint32_t insn_bytes,
740                                   uint8_t vsew,
741                                   uint8_t veew,
742                                   uint8_t vlmul_max,
743                                   const auto& expected_result,
744                                   auto mask) {
745       SIMD128Register expected_result_in_register;
746       state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
747       for (uint8_t vlmul = 0; vlmul < vlmul_max; ++vlmul) {
748         int vemul = SignExtend<3>(vlmul);
749         vemul += vsew;  // Multiply by SEW.
750         vemul -= veew;  // Divide by EEW.
751         if (vemul < -3 || vemul > 3) {
752           // Incompatible vlmul
753           continue;
754         }
755 
756         for (uint8_t vma = 0; vma < 2; ++vma) {
757           auto [vlmax, vtype] = intrinsics::Vsetvl(~0ULL, (vma << 7) | (vsew << 3) | vlmul);
758           if (vlmax == 0) {
759             continue;
760           }
761           // Test vstart/vl changes with only with vemul == 2 (4 registers)
762           if (vemul == 2) {
763             state_.cpu.vstart = vlmax / 8;
764             state_.cpu.vl = (vlmax * 5) / 8;
765           } else {
766             state_.cpu.vstart = 0;
767             state_.cpu.vl = vlmax;
768           }
769           state_.cpu.vtype = vtype;
770 
771           state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
772           SetXReg<1>(state_.cpu, ToGuestAddr(&store_area_));
773           for (size_t index = 0; index < 8; index++) {
774             state_.cpu.v[8 + index] = SIMD128Register{source[index]}.Get<__uint128_t>();
775             store_area_[index * 2] = kUndisturbedResult[0];
776             store_area_[index * 2 + 1] = kUndisturbedResult[1];
777           }
778           EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
779           // Values for inactive elements (i.e. corresponding mask bit is 0).
780           const size_t n = std::size(source);
781           __m128i expected_inactive[n];
782           std::fill_n(expected_inactive, n, kUndisturbedResult);
783           if (vemul >= 0) {
784             for (size_t index = 0; index < 1 << vemul; ++index) {
785               if (index == 0 && vemul == 2) {
786                 expected_result_in_register = SIMD128Register{
787                     (kUndisturbedResult & kFractionMaskInt8[3]) |
788                     (expected_result[index] & mask[index] & ~kFractionMaskInt8[3]) |
789                     (expected_inactive[index] & ~mask[index] & ~kFractionMaskInt8[3])};
790               } else if (index == 2 && vemul == 2) {
791                 expected_result_in_register = SIMD128Register{
792                     (expected_result[index] & mask[index] & kFractionMaskInt8[3]) |
793                     (expected_inactive[index] & ~mask[index] & kFractionMaskInt8[3]) |
794                     ((kUndisturbedResult) & ~kFractionMaskInt8[3])};
795               } else if (index == 3 && vemul == 2) {
796                 expected_result_in_register = SIMD128Register{kUndisturbedResult};
797               } else {
798                 expected_result_in_register =
799                     SIMD128Register{(expected_result[index] & mask[index]) |
800                                     (expected_inactive[index] & ~mask[index])};
801               }
802 
803               EXPECT_EQ(store_area_[index * 2], expected_result_in_register.Get<uint64_t>(0));
804               EXPECT_EQ(store_area_[index * 2 + 1], expected_result_in_register.Get<uint64_t>(1));
805             }
806 
807           } else {
808             expected_result_in_register =
809                 SIMD128Register{(expected_result[0] & mask[0] & kFractionMaskInt8[(vemul + 4)]) |
810                                 (expected_inactive[0] & ~mask[0] & kFractionMaskInt8[(vemul + 4)]) |
811                                 ((kUndisturbedResult) & ~kFractionMaskInt8[(vemul + 4)])};
812             EXPECT_EQ(store_area_[0], expected_result_in_register.Get<uint64_t>(0));
813             EXPECT_EQ(store_area_[1], expected_result_in_register.Get<uint64_t>(1));
814           }
815         }
816       }
817     };
818     switch (veew) {
819       case 0:
820         Verify(insn_bytes | (1 << 25), veew, veew, 8, expected_result_int8, kNoMask);
821         Verify(insn_bytes, veew, veew, 8, expected_result_int8, kMaskInt8);
822         break;
823       case 1:
824         Verify(insn_bytes | (1 << 25), veew, veew, 8, expected_result_int16, kNoMask);
825         Verify(insn_bytes, veew, veew, 8, expected_result_int16, kMaskInt16);
826         break;
827       case 2:
828         Verify(insn_bytes | (1 << 25), veew, veew, 8, expected_result_int32, kNoMask);
829         Verify(insn_bytes, veew, veew, 8, expected_result_int32, kMaskInt32);
830         break;
831       case 3:
832         Verify(insn_bytes | (1 << 25), veew, veew, 8, expected_result_int64, kNoMask);
833         Verify(insn_bytes, veew, veew, 8, expected_result_int64, kMaskInt64);
834         break;
835       default:
836         break;
837     }
838   }
839 
840   template <int kNFfields>
TestVmvXr(uint32_t insn_bytes)841   void TestVmvXr(uint32_t insn_bytes) {
842     TestVmvXr<Int8, kNFfields>(insn_bytes);
843     TestVmvXr<Int16, kNFfields>(insn_bytes);
844     TestVmvXr<Int32, kNFfields>(insn_bytes);
845     TestVmvXr<Int64, kNFfields>(insn_bytes);
846   }
847 
848   template <typename ElementType, int kNFfields>
TestVmvXr(uint32_t insn_bytes)849   void TestVmvXr(uint32_t insn_bytes) {
850     // Note that VmvXr actually DOES depend on vtype, contrary to what RISC-V V 1.0 manual says:
851     //   https://github.com/riscv/riscv-v-spec/pull/872
852     state_.cpu.vtype = BitUtilLog2(sizeof(ElementType)) << 3;
853     state_.cpu.vl = 0;
854     constexpr int kElementsCount = static_cast<int>(sizeof(SIMD128Register) / sizeof(ElementType));
855     for (int vstart = 0; vstart <= kElementsCount * kNFfields; ++vstart) {
856       state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
857       state_.cpu.vstart = vstart;
858       for (size_t index = 0; index < 16; ++index) {
859         state_.cpu.v[8 + index] =
860             SIMD128Register{kVectorComparisonSource[index]}.Get<__uint128_t>();
861       }
862       EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
863       for (int index = 0; index < 8; ++index) {
864         SIMD128Register expected_state{kVectorComparisonSource[index]};
865         SIMD128Register source_value{kVectorComparisonSource[index + 8]};
866         if ((vstart < kElementsCount * kNFfields) && index < kNFfields) {
867           // The usual property that no elements are written if vstart >= vl does not apply to these
868           // instructions. Instead, no elements are written if vstart >= evl.
869           for (int element_index = 0; element_index < kElementsCount; ++element_index) {
870             if (element_index + index * kElementsCount >= vstart) {
871               expected_state.Set(source_value.Get<ElementType>(element_index), element_index);
872             }
873           }
874         }
875         EXPECT_EQ(state_.cpu.v[8 + index], expected_state.Get<__uint128_t>());
876       }
877       EXPECT_EQ(state_.cpu.vstart, 0);
878     }
879   }
880 
881   template <typename ElementType>
TestVfmvfs(uint32_t insn_bytes,uint64_t expected_result)882   void TestVfmvfs(uint32_t insn_bytes, uint64_t expected_result) {
883     state_.cpu.vtype = BitUtilLog2(sizeof(ElementType)) << 3;
884     state_.cpu.vstart = 0;
885     state_.cpu.vl = 0;
886     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
887     state_.cpu.v[8] = SIMD128Register{kVectorCalculationsSource[0]}.Get<__uint128_t>();
888     SetFReg<1>(state_.cpu, 0x5555'5555'5555'5555);
889     EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
890     EXPECT_EQ(GetFReg<1>(state_.cpu), expected_result);
891   }
892 
893   template <typename ElementType>
TestVfmvsf(uint32_t insn_bytes,uint64_t boxed_value,ElementType unboxed_value)894   void TestVfmvsf(uint32_t insn_bytes, uint64_t boxed_value, ElementType unboxed_value) {
895     for (uint8_t vstart = 0; vstart < 2; ++vstart) {
896       for (uint8_t vl = 0; vl < 2; ++vl) {
897         for (uint8_t vta = 0; vta < 2; ++vta) {
898           state_.cpu.vtype = (vta << 6) | (BitUtilLog2(sizeof(ElementType)) << 3);
899           state_.cpu.vstart = vstart;
900           state_.cpu.vl = vl;
901           state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
902           state_.cpu.v[8] = SIMD128Register{kVectorCalculationsSource[0]}.Get<__uint128_t>();
903           SetFReg<1>(state_.cpu, boxed_value);
904           EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
905           if (vstart == 0 && vl != 0) {
906             SIMD128Register expected_result =
907                 vta ? ~SIMD128Register{} : SIMD128Register{kVectorCalculationsSource[0]};
908             expected_result.Set<ElementType>(unboxed_value, 0);
909             EXPECT_EQ(state_.cpu.v[8], expected_result);
910           } else {
911             EXPECT_EQ(state_.cpu.v[8],
912                       SIMD128Register{kVectorCalculationsSource[0]}.Get<__uint128_t>());
913           }
914         }
915       }
916     }
917   }
918 
919   template <typename ElementType>
TestVmvsx(uint32_t insn_bytes)920   void TestVmvsx(uint32_t insn_bytes) {
921     for (uint8_t vstart = 0; vstart < 2; ++vstart) {
922       for (uint8_t vl = 0; vl < 2; ++vl) {
923         for (uint8_t vta = 0; vta < 2; ++vta) {
924           state_.cpu.vtype = (vta << 6) | (BitUtilLog2(sizeof(ElementType)) << 3);
925           state_.cpu.vstart = vstart;
926           state_.cpu.vl = vl;
927           state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
928           state_.cpu.v[8] = SIMD128Register{kVectorCalculationsSource[0]}.Get<__uint128_t>();
929           SetXReg<1>(state_.cpu, 0x5555'5555'5555'5555);
930           EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
931           if (vstart == 0 && vl != 0) {
932             SIMD128Register expected_result =
933                 vta ? ~SIMD128Register{} : SIMD128Register{kVectorCalculationsSource[0]};
934             expected_result.Set<ElementType>(MaybeTruncateTo<ElementType>(0x5555'5555'5555'5555),
935                                              0);
936             EXPECT_EQ(state_.cpu.v[8], expected_result);
937           } else {
938             EXPECT_EQ(state_.cpu.v[8],
939                       SIMD128Register{kVectorCalculationsSource[0]}.Get<__uint128_t>());
940           }
941         }
942       }
943     }
944   }
945 
946   template <typename ElementType>
TestVmvxs(uint32_t insn_bytes,uint64_t expected_result)947   void TestVmvxs(uint32_t insn_bytes, uint64_t expected_result) {
948     state_.cpu.vtype = BitUtilLog2(sizeof(ElementType)) << 3;
949     state_.cpu.vstart = 0;
950     state_.cpu.vl = 0;
951     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
952     state_.cpu.v[8] = SIMD128Register{kVectorCalculationsSource[0]}.Get<__uint128_t>();
953     SetXReg<1>(state_.cpu, 0x5555'5555'5555'5555);
954     EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
955     EXPECT_EQ(GetXReg<1>(state_.cpu), expected_result);
956   }
957 
958   template <size_t kNFfields>
TestVsX(uint32_t insn_bytes)959   void TestVsX(uint32_t insn_bytes) {
960     state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
961     SetXReg<1>(state_.cpu, ToGuestAddr(&store_area_));
962     for (size_t index = 0; index < 8; index++) {
963       state_.cpu.v[8 + index] = SIMD128Register{kVectorComparisonSource[index]}.Get<__uint128_t>();
964       store_area_[index * 2] = kUndisturbedResult[0];
965       store_area_[index * 2 + 1] = kUndisturbedResult[1];
966     }
967     EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
968     for (size_t index = 0; index < 8; index++) {
969       EXPECT_EQ(
970           store_area_[index * 2],
971           (index >= kNFfields ? kUndisturbedResult[0]
972                               : SIMD128Register{kVectorComparisonSource[index]}.Get<uint64_t>(0)));
973       EXPECT_EQ(
974           store_area_[index * 2 + 1],
975           (index >= kNFfields ? kUndisturbedResult[1]
976                               : SIMD128Register{kVectorComparisonSource[index]}.Get<uint64_t>(1)));
977     }
978   }
979 
TestVectorRegisterGather(uint32_t insn_bytes,const __v16qu (& expected_result_int8)[8],const __v8hu (& expected_result_int16)[8],const __v4su (& expected_result_int32)[8],const __v2du (& expected_result_int64)[8],const uint8_t vlmul,const __v2du (& source)[16])980   void TestVectorRegisterGather(uint32_t insn_bytes,
981                                 const __v16qu (&expected_result_int8)[8],
982                                 const __v8hu (&expected_result_int16)[8],
983                                 const __v4su (&expected_result_int32)[8],
984                                 const __v2du (&expected_result_int64)[8],
985                                 const uint8_t vlmul,
986                                 const __v2du (&source)[16]) {
987     auto Verify = [this, &source, &vlmul](
988                       uint32_t insn_bytes, uint8_t vsew, const auto& expected_result, auto mask) {
989       // Mask register is, unconditionally, v0, and we need 8, 16, or 24 to handle full 8-registers
990       // inputs thus we use v8..v15 for destination and place sources into v16..v23 and v24..v31.
991       state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
992       for (size_t index = 0; index < 8; ++index) {
993         state_.cpu.v[16 + index] = SIMD128Register{source[index]}.Get<__uint128_t>();
994       }
995 
996       for (uint8_t vta = 0; vta < 2; ++vta) {
997         for (uint8_t vma = 0; vma < 2; ++vma) {
998           auto [vlmax, vtype] =
999               intrinsics::Vsetvl(~0ULL, (vma << 7) | (vta << 6) | (vsew << 3) | vlmul);
1000           // Incompatible vsew and vlmax. Skip it.
1001           if (vlmax == 0) {
1002             continue;
1003           }
1004 
1005           // Make sure indexes in src2 fall within vlmax.
1006           uint64_t src2_mask{0};
1007           const size_t kElementSize = 8 << vsew;
1008           const uint64_t kIndexMask = (1 << BitUtilLog2(vlmax)) - 1;
1009           for (uint8_t index = 0; index < 64 / kElementSize; index++) {
1010             src2_mask |= kIndexMask << (kElementSize * index);
1011           }
1012           for (size_t index = 0; index < 8; ++index) {
1013             __v2du masked_register = {source[8 + index][0] & src2_mask, source[8 + index][1]};
1014             state_.cpu.v[24 + index] = SIMD128Register{masked_register}.Get<__uint128_t>();
1015           }
1016           SetXReg<1>(state_.cpu, 0xaaaa'aaaa'aaaa'aaaaULL & kIndexMask);
1017 
1018           // To make tests quick enough we don't test vstart and vl change with small register
1019           // sets. Only with vlmul == 2 (4 registers) we set vstart and vl to skip half of
1020           // first
1021           // register and half of last register.
1022           if (vlmul == 2) {
1023             state_.cpu.vstart = vlmax / 8;
1024             state_.cpu.vl = (vlmax * 5) / 8;
1025           } else {
1026             state_.cpu.vstart = 0;
1027             state_.cpu.vl = vlmax;
1028           }
1029           state_.cpu.vtype = vtype;
1030 
1031           // Set expected_result vector registers into 0b01010101… pattern.
1032           for (size_t index = 0; index < 8; ++index) {
1033             state_.cpu.v[8 + index] = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
1034           }
1035 
1036           state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
1037           EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
1038 
1039           // Values for inactive elements (i.e. corresponding mask bit is 0).
1040           const size_t n = std::size(source) * 2;
1041           __m128i expected_inactive[n];
1042           // For most instructions, follow basic inactive processing rules based on vma flag.
1043           std::fill_n(expected_inactive, n, (vma ? kAgnosticResult : kUndisturbedResult));
1044 
1045           if (vlmul < 4) {
1046             for (size_t index = 0; index < 1 << vlmul; ++index) {
1047               if (index == 0 && vlmul == 2) {
1048                 EXPECT_EQ(state_.cpu.v[8 + index],
1049                           SIMD128Register{
1050                               (kUndisturbedResult & kFractionMaskInt8[3]) |
1051                               (expected_result[index] & mask[index] & ~kFractionMaskInt8[3]) |
1052                               (expected_inactive[index] & ~mask[index] & ~kFractionMaskInt8[3])}
1053                               .Get<__uint128_t>());
1054               } else if (index == 2 && vlmul == 2) {
1055                 EXPECT_EQ(
1056                     state_.cpu.v[8 + index],
1057                     SIMD128Register{
1058                         (expected_result[index] & mask[index] & kFractionMaskInt8[3]) |
1059                         (expected_inactive[index] & ~mask[index] & kFractionMaskInt8[3]) |
1060                         ((vta ? kAgnosticResult : kUndisturbedResult) & ~kFractionMaskInt8[3])}
1061                         .Get<__uint128_t>());
1062               } else if (index == 3 && vlmul == 2 && vta) {
1063                 EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{kAgnosticResult});
1064               } else if (index == 3 && vlmul == 2) {
1065                 EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{kUndisturbedResult});
1066               } else {
1067                 EXPECT_EQ(state_.cpu.v[8 + index],
1068                           SIMD128Register{(expected_result[index] & mask[index]) |
1069                                           (expected_inactive[index] & ~mask[index])}
1070                               .Get<__uint128_t>());
1071               }
1072             }
1073           } else {
1074             EXPECT_EQ(
1075                 state_.cpu.v[8],
1076                 SIMD128Register{
1077                     (expected_result[0] & mask[0] & kFractionMaskInt8[vlmul - 4]) |
1078                     (expected_inactive[0] & ~mask[0] & kFractionMaskInt8[vlmul - 4]) |
1079                     ((vta ? kAgnosticResult : kUndisturbedResult) & ~kFractionMaskInt8[vlmul - 4])}
1080                     .Get<__uint128_t>());
1081           }
1082 
1083           if (vlmul == 2) {
1084             // Every vector instruction must set vstart to 0, but shouldn't touch vl.
1085             EXPECT_EQ(state_.cpu.vstart, 0);
1086             EXPECT_EQ(state_.cpu.vl, (vlmax * 5) / 8);
1087           }
1088         }
1089       }
1090     };
1091     Verify(insn_bytes, 0, expected_result_int8, kMaskInt8);
1092     Verify(insn_bytes | (1 << 25), 0, expected_result_int8, kNoMask);
1093     Verify(insn_bytes, 1, expected_result_int16, kMaskInt16);
1094     Verify(insn_bytes | (1 << 25), 1, expected_result_int16, kNoMask);
1095     Verify(insn_bytes, 2, expected_result_int32, kMaskInt32);
1096     Verify(insn_bytes | (1 << 25), 2, expected_result_int32, kNoMask);
1097     Verify(insn_bytes, 3, expected_result_int64, kMaskInt64);
1098     Verify(insn_bytes | (1 << 25), 3, expected_result_int64, kNoMask);
1099   }
1100 
TestVectorFloatInstruction(uint32_t insn_bytes,const UInt32x4Tuple (& expected_result_int32)[8],const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16])1101   void TestVectorFloatInstruction(uint32_t insn_bytes,
1102                                   const UInt32x4Tuple (&expected_result_int32)[8],
1103                                   const UInt64x2Tuple (&expected_result_int64)[8],
1104                                   const __v2du (&source)[16]) {
1105     TestVectorInstruction<TestVectorInstructionKind::kFloat, TestVectorInstructionMode::kDefault>(
1106         insn_bytes, source, expected_result_int32, expected_result_int64);
1107   }
1108 
TestVectorInstruction(uint32_t insn_bytes,const UInt8x16Tuple (& expected_result_int8)[8],const UInt16x8Tuple (& expected_result_int16)[8],const UInt32x4Tuple (& expected_result_int32)[8],const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16])1109   void TestVectorInstruction(uint32_t insn_bytes,
1110                              const UInt8x16Tuple (&expected_result_int8)[8],
1111                              const UInt16x8Tuple (&expected_result_int16)[8],
1112                              const UInt32x4Tuple (&expected_result_int32)[8],
1113                              const UInt64x2Tuple (&expected_result_int64)[8],
1114                              const __v2du (&source)[16]) {
1115     TestVectorInstruction<TestVectorInstructionKind::kInteger, TestVectorInstructionMode::kDefault>(
1116         insn_bytes,
1117         source,
1118         expected_result_int8,
1119         expected_result_int16,
1120         expected_result_int32,
1121         expected_result_int64);
1122   }
1123 
TestVectorMergeFloatInstruction(uint32_t insn_bytes,const UInt32x4Tuple (& expected_result_int32)[8],const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16])1124   void TestVectorMergeFloatInstruction(uint32_t insn_bytes,
1125                                        const UInt32x4Tuple (&expected_result_int32)[8],
1126                                        const UInt64x2Tuple (&expected_result_int64)[8],
1127                                        const __v2du (&source)[16]) {
1128     TestVectorInstruction<TestVectorInstructionKind::kFloat, TestVectorInstructionMode::kVMerge>(
1129         insn_bytes, source, expected_result_int32, expected_result_int64);
1130   }
1131 
TestVectorMergeInstruction(uint32_t insn_bytes,const UInt8x16Tuple (& expected_result_int8)[8],const UInt16x8Tuple (& expected_result_int16)[8],const UInt32x4Tuple (& expected_result_int32)[8],const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16])1132   void TestVectorMergeInstruction(uint32_t insn_bytes,
1133                                   const UInt8x16Tuple (&expected_result_int8)[8],
1134                                   const UInt16x8Tuple (&expected_result_int16)[8],
1135                                   const UInt32x4Tuple (&expected_result_int32)[8],
1136                                   const UInt64x2Tuple (&expected_result_int64)[8],
1137                                   const __v2du (&source)[16]) {
1138     TestVectorInstruction<TestVectorInstructionKind::kInteger, TestVectorInstructionMode::kVMerge>(
1139         insn_bytes,
1140         source,
1141         expected_result_int8,
1142         expected_result_int16,
1143         expected_result_int32,
1144         expected_result_int64);
1145   }
1146 
TestWideningVectorFloatInstruction(uint32_t insn_bytes,const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16],__m128i dst_result=kUndisturbedResult)1147   void TestWideningVectorFloatInstruction(uint32_t insn_bytes,
1148                                           const UInt64x2Tuple (&expected_result_int64)[8],
1149                                           const __v2du (&source)[16],
1150                                           __m128i dst_result = kUndisturbedResult) {
1151     TestVectorInstructionInternal<TestVectorInstructionKind::kFloat,
1152                                   TestVectorInstructionMode::kWidening>(
1153         insn_bytes, dst_result, source, expected_result_int64);
1154   }
1155 
TestWideningVectorFloatInstruction(uint32_t insn_bytes,const UInt32x4Tuple (& expected_result_int32)[8],const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16])1156   void TestWideningVectorFloatInstruction(uint32_t insn_bytes,
1157                                           const UInt32x4Tuple (&expected_result_int32)[8],
1158                                           const UInt64x2Tuple (&expected_result_int64)[8],
1159                                           const __v2du (&source)[16]) {
1160     TestVectorInstruction<TestVectorInstructionKind::kFloat, TestVectorInstructionMode::kWidening>(
1161         insn_bytes, source, expected_result_int32, expected_result_int64);
1162   }
1163 
1164   enum class TestVectorInstructionKind { kInteger, kFloat };
1165   enum class TestVectorInstructionMode { kDefault, kWidening, kNarrowing, kVMerge };
1166 
1167   template <TestVectorInstructionKind kTestVectorInstructionKind,
1168             TestVectorInstructionMode kTestVectorInstructionMode,
1169             typename... ExpectedResultType>
TestVectorInstruction(uint32_t insn_bytes,const __v2du (& source)[16],const ExpectedResultType &...expected_result)1170   void TestVectorInstruction(uint32_t insn_bytes,
1171                              const __v2du (&source)[16],
1172                              const ExpectedResultType&... expected_result) {
1173     TestVectorInstructionInternal<kTestVectorInstructionKind, kTestVectorInstructionMode>(
1174         insn_bytes, kUndisturbedResult, source, expected_result...);
1175   }
1176 
1177   template <TestVectorInstructionKind kTestVectorInstructionKind,
1178             TestVectorInstructionMode kTestVectorInstructionMode,
1179             typename... ExpectedResultType>
TestVectorInstructionInternal(uint32_t insn_bytes,__m128i dst_result,const __v2du (& source)[16],const ExpectedResultType &...expected_result)1180   void TestVectorInstructionInternal(uint32_t insn_bytes,
1181                                      __m128i dst_result,
1182                                      const __v2du (&source)[16],
1183                                      const ExpectedResultType&... expected_result) {
1184     auto Verify = [this, &source, dst_result](uint32_t insn_bytes,
1185                                               uint8_t vsew,
1186                                               uint8_t vlmul_max,
1187                                               const auto& expected_result,
1188                                               auto mask) {
1189       // Mask register is, unconditionally, v0, and we need 8, 16, or 24 to handle full 8-registers
1190       // inputs thus we use v8..v15 for destination and place sources into v16..v23 and v24..v31.
1191       state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
1192       for (size_t index = 0; index < std::size(source); ++index) {
1193         state_.cpu.v[16 + index] = SIMD128Register{source[index]}.Get<__uint128_t>();
1194       }
1195       if (kTestVectorInstructionKind == TestVectorInstructionKind::kInteger) {
1196         // Set x1 for vx instructions.
1197         SetXReg<1>(state_.cpu, 0xaaaa'aaaa'aaaa'aaaa);
1198       } else {
1199         // We only support Float32/Float64 for float instructions, but there are conversion
1200         // instructions that work with double width floats.
1201         // These instructions never use float registers though and thus we don't need to store
1202         // anything into f1 register, if they are used.
1203         // For Float32/Float64 case we load 5.625 of the appropriate type into f1.
1204         ASSERT_LE(vsew, 3);
1205         if (vsew == 2) {
1206           SetFReg<1>(state_.cpu, 0xffff'ffff'40b4'0000);  // float 5.625
1207         } else if (vsew == 3) {
1208           SetFReg<1>(state_.cpu, 0x4016'8000'0000'0000);  // double 5.625
1209         }
1210       }
1211       for (uint8_t vlmul = 0; vlmul < vlmul_max; ++vlmul) {
1212         if constexpr (kTestVectorInstructionMode == TestVectorInstructionMode::kNarrowing ||
1213                       kTestVectorInstructionMode == TestVectorInstructionMode::kWidening) {
1214           // Incompatible vlmul for narrowing.
1215           if (vlmul == 3) {
1216             continue;
1217           }
1218         }
1219         for (uint8_t vta = 0; vta < 2; ++vta) {
1220           for (uint8_t vma = 0; vma < 2; ++vma) {
1221             auto [vlmax, vtype] =
1222                 intrinsics::Vsetvl(~0ULL, (vma << 7) | (vta << 6) | (vsew << 3) | vlmul);
1223             // Incompatible vsew and vlmax. Skip it.
1224             if (vlmax == 0) {
1225               continue;
1226             }
1227             uint8_t emul =
1228                 (vlmul + (kTestVectorInstructionMode == TestVectorInstructionMode::kWidening)) &
1229                 0b111;
1230 
1231             // To make tests quick enough we don't test vstart and vl change with small register
1232             // sets. Only with vlmul == 2 (4 registers) we set vstart and vl to skip half of first
1233             // register, last register and half of next-to last register.
1234             // Don't use vlmul == 3 because that one may not be supported if instruction widens the
1235             // result.
1236             if (emul == 2) {
1237               state_.cpu.vstart = vlmax / 8;
1238               state_.cpu.vl = (vlmax * 5) / 8;
1239             } else {
1240               state_.cpu.vstart = 0;
1241               state_.cpu.vl = vlmax;
1242             }
1243             state_.cpu.vtype = vtype;
1244 
1245             // Set expected_result vector registers into 0b01010101… pattern.
1246             for (size_t index = 0; index < 8; ++index) {
1247               state_.cpu.v[8 + index] = SIMD128Register{dst_result}.Get<__uint128_t>();
1248             }
1249 
1250             state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
1251             EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
1252 
1253             // Values for inactive elements (i.e. corresponding mask bit is 0).
1254             __m128i expected_inactive[8];
1255             if constexpr (kTestVectorInstructionMode == TestVectorInstructionMode::kVMerge) {
1256               // vs2 is the start of the source vector register group.
1257               // Note: copy_n input/output args are backwards compared to fill_n below.
1258               std::copy_n(source, 8, expected_inactive);
1259             } else {
1260               // For most instructions, follow basic inactive processing rules based on vma flag.
1261               std::fill_n(expected_inactive, 8, (vma ? kAgnosticResult : dst_result));
1262             }
1263 
1264             if (emul < 4) {
1265               for (size_t index = 0; index < 1 << emul; ++index) {
1266                 if (index == 0 && emul == 2) {
1267                   EXPECT_EQ(state_.cpu.v[8 + index],
1268                             ((dst_result & kFractionMaskInt8[3]) |
1269                              (SIMD128Register{expected_result[index]} & mask[index] &
1270                               ~kFractionMaskInt8[3]) |
1271                              (expected_inactive[index] & ~mask[index] & ~kFractionMaskInt8[3]))
1272                                 .template Get<__uint128_t>());
1273                 } else if (index == 2 && emul == 2) {
1274                   EXPECT_EQ(state_.cpu.v[8 + index],
1275                             ((SIMD128Register{expected_result[index]} & mask[index] &
1276                               kFractionMaskInt8[3]) |
1277                              (expected_inactive[index] & ~mask[index] & kFractionMaskInt8[3]) |
1278                              ((vta ? kAgnosticResult : dst_result) & ~kFractionMaskInt8[3]))
1279                                 .template Get<__uint128_t>());
1280                 } else if (index == 3 && emul == 2 && vta) {
1281                   EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{kAgnosticResult});
1282                 } else if (index == 3 && emul == 2) {
1283                   EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{dst_result});
1284                 } else {
1285                   EXPECT_EQ(state_.cpu.v[8 + index],
1286                             ((SIMD128Register{expected_result[index]} & mask[index]) |
1287                              ((expected_inactive[index] & ~mask[index])))
1288                                 .template Get<__uint128_t>());
1289                 }
1290               }
1291             } else {
1292               EXPECT_EQ(
1293                   state_.cpu.v[8],
1294                   ((SIMD128Register{expected_result[0]} & mask[0] & kFractionMaskInt8[emul - 4]) |
1295                    (expected_inactive[0] & ~mask[0] & kFractionMaskInt8[emul - 4]) |
1296                    ((vta ? kAgnosticResult : dst_result) & ~kFractionMaskInt8[emul - 4]))
1297                       .template Get<__uint128_t>());
1298             }
1299 
1300             if (emul == 2) {
1301               // Every vector instruction must set vstart to 0, but shouldn't touch vl.
1302               EXPECT_EQ(state_.cpu.vstart, 0);
1303               EXPECT_EQ(state_.cpu.vl, (vlmax * 5) / 8);
1304             }
1305           }
1306         }
1307       }
1308     };
1309 
1310     // Some instructions don't support use of mask register, but in these instructions bit
1311     // #25 is set.  This function doesn't support these. Verify that vm bit is not set.
1312     EXPECT_EQ(insn_bytes & (1 << 25), 0U);
1313     // Every insruction is tested with vm bit not set (and mask register used) and with vm bit
1314     // set (and mask register is not used).
1315     ((Verify(insn_bytes,
1316              BitUtilLog2(sizeof(std::remove_cvref_t<decltype(std::get<0>(expected_result[0]))>)) -
1317                  (kTestVectorInstructionMode == TestVectorInstructionMode::kWidening),
1318              8,
1319              expected_result,
1320              MaskForElem<std::remove_cvref_t<decltype(std::get<0>(expected_result[0]))>>()),
1321       Verify((insn_bytes &
1322               ~(0x01f00000 * (kTestVectorInstructionMode == TestVectorInstructionMode::kVMerge))) |
1323                  (1 << 25),
1324              BitUtilLog2(sizeof(std::remove_cvref_t<decltype(std::get<0>(expected_result[0]))>)) -
1325                  (kTestVectorInstructionMode == TestVectorInstructionMode::kWidening),
1326              8,
1327              expected_result,
1328              kNoMask)),
1329      ...);
1330   }
1331 
TestVectorMaskInstruction(uint8_t max_vstart,intrinsics::InactiveProcessing vma,uint32_t insn_bytes,const __v2du expected_result)1332   void TestVectorMaskInstruction(uint8_t max_vstart,
1333                                  intrinsics::InactiveProcessing vma,
1334                                  uint32_t insn_bytes,
1335                                  const __v2du expected_result) {
1336     // Mask instructions don't look on vtype directly, but they still require valid one because it
1337     // affects vlmax;
1338     auto [vlmax, vtype] = intrinsics::Vsetvl(~0ULL, 3 | (static_cast<uint8_t>(vma) << 7));
1339     // We need mask with a few bits set for Vmsₓf instructions.  Inverse of normal kMask works.
1340     const __uint128_t mask = SIMD128Register{~kMask}.Get<__uint128_t>();
1341     const __uint128_t undisturbed = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
1342     const __uint128_t src1 = SIMD128Register{kVectorCalculationsSourceLegacy[0]}.Get<__uint128_t>();
1343     const __uint128_t src2 = SIMD128Register{kVectorCalculationsSourceLegacy[8]}.Get<__uint128_t>();
1344     const __uint128_t expected = SIMD128Register{expected_result}.Get<__uint128_t>();
1345     state_.cpu.vtype = vtype;
1346     for (uint8_t vl = 0; vl <= vlmax; ++vl) {
1347       state_.cpu.vl = vl;
1348       for (uint8_t vstart = 0; vstart <= max_vstart; ++vstart) {
1349         state_.cpu.vstart = vstart;
1350         // Set expected_result vector registers into 0b01010101… pattern.
1351         state_.cpu.v[0] = mask;
1352         state_.cpu.v[8] = undisturbed;
1353         state_.cpu.v[16] = src1;
1354         state_.cpu.v[24] = src2;
1355 
1356         state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
1357         EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
1358 
1359         for (uint8_t bit_pos = 0; bit_pos < 128; ++bit_pos) {
1360           __uint128_t bit = __uint128_t{1} << bit_pos;
1361           // When vstart ⩾ vl, there are no body elements, and no elements are updated in any
1362           // destinationvector register group, including that no tail elements are updated with
1363           // agnostic values.
1364           if (bit_pos < vstart || vstart >= vl) {
1365             EXPECT_EQ(state_.cpu.v[8] & bit, undisturbed & bit);
1366           } else if (bit_pos >= vl) {
1367             EXPECT_EQ(state_.cpu.v[8] & bit, bit);
1368           } else {
1369             EXPECT_EQ(state_.cpu.v[8] & bit, expected & bit);
1370           }
1371         }
1372       }
1373     }
1374   }
1375 
1376   template <typename ElementType>
MaskForElem()1377   auto MaskForElem() {
1378     if constexpr (std::is_same_v<ElementType, uint8_t>) {
1379       return kMaskInt8;
1380     } else if constexpr (std::is_same_v<ElementType, uint16_t>) {
1381       return kMaskInt16;
1382     } else if constexpr (std::is_same_v<ElementType, uint32_t>) {
1383       return kMaskInt32;
1384     } else if constexpr (std::is_same_v<ElementType, uint64_t>) {
1385       return kMaskInt64;
1386     } else {
1387       static_assert(kDependentTypeFalse<ElementType>);
1388     }
1389   }
1390 
TestVectorMaskTargetInstruction(uint32_t insn_bytes,const uint32_t expected_result_int32,const uint16_t expected_result_int64,const __v2du (& source)[16])1391   void TestVectorMaskTargetInstruction(uint32_t insn_bytes,
1392                                        const uint32_t expected_result_int32,
1393                                        const uint16_t expected_result_int64,
1394                                        const __v2du (&source)[16]) {
1395     TestVectorMaskTargetInstruction(
1396         insn_bytes, source, expected_result_int32, expected_result_int64);
1397   }
1398 
TestVectorMaskTargetInstruction(uint32_t insn_bytes,const UInt8x16Tuple (& expected_result_int8),const uint64_t expected_result_int16,const uint32_t expected_result_int32,const uint16_t expected_result_int64,const __v2du (& source)[16])1399   void TestVectorMaskTargetInstruction(uint32_t insn_bytes,
1400                                        const UInt8x16Tuple(&expected_result_int8),
1401                                        const uint64_t expected_result_int16,
1402                                        const uint32_t expected_result_int32,
1403                                        const uint16_t expected_result_int64,
1404                                        const __v2du (&source)[16]) {
1405     TestVectorMaskTargetInstruction(insn_bytes,
1406                                     source,
1407                                     expected_result_int8,
1408                                     expected_result_int16,
1409                                     expected_result_int32,
1410                                     expected_result_int64);
1411   }
1412 
1413   template <typename... ExpectedResultType>
TestVectorMaskTargetInstruction(uint32_t insn_bytes,const __v2du (& source)[16],const ExpectedResultType (&...expected_result))1414   void TestVectorMaskTargetInstruction(uint32_t insn_bytes,
1415                                        const __v2du (&source)[16],
1416                                        const ExpectedResultType(&... expected_result)) {
1417     auto Verify = [this, &source](
1418                       uint32_t insn_bytes, uint8_t vsew, const auto& expected_result, auto mask) {
1419       // Mask register is, unconditionally, v0, and we need 8, 16, or 24 to handle full 8-registers
1420       // inputs thus we use v8..v15 for destination and place sources into v16..v23 and v24..v31.
1421       state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
1422       for (size_t index = 0; index < std::size(source); ++index) {
1423         state_.cpu.v[16 + index] = SIMD128Register{source[index]}.Get<__uint128_t>();
1424       }
1425       // Set x1 for vx instructions.
1426       SetXReg<1>(state_.cpu, 0xaaaa'aaaa'aaaa'aaaa);
1427       // Set f1 for vf instructions.
1428       if (vsew == 2) {
1429         SetFReg<1>(state_.cpu, 0xffff'ffff'40b4'0000);  // float 5.625
1430       } else if (vsew == 3) {
1431         SetFReg<1>(state_.cpu, 0x4016'8000'0000'0000);  // double 5.625
1432       }
1433       for (uint8_t vlmul = 0; vlmul < 8; ++vlmul) {
1434         for (uint8_t vta = 0; vta < 2; ++vta) {  // vta should be ignored but we test both values!
1435           for (uint8_t vma = 0; vma < 2; ++vma) {
1436             auto [vlmax, vtype] =
1437                 intrinsics::Vsetvl(~0ULL, (vma << 7) | (vta << 6) | (vsew << 3) | vlmul);
1438             // Incompatible vsew and vlmax. Skip it.
1439             if (vlmax == 0) {
1440               continue;
1441             }
1442 
1443             // To make tests quick enough we don't test vstart and vl change with small register
1444             // sets. Only with vlmul == 2 (4 registers) we set vstart and vl to skip half of first
1445             // register, last register and half of next-to last register.
1446             // Don't use vlmul == 3 because that one may not be supported if instruction widens the
1447             // result.
1448             if (vlmul == 2) {
1449               state_.cpu.vstart = vlmax / 8;
1450               state_.cpu.vl = (vlmax * 5) / 8;
1451             } else {
1452               state_.cpu.vstart = 0;
1453               state_.cpu.vl = vlmax;
1454             }
1455             state_.cpu.vtype = vtype;
1456 
1457             // Set expected_result vector registers into 0b01010101… pattern.
1458             for (size_t index = 0; index < 8; ++index) {
1459               state_.cpu.v[8 + index] = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
1460             }
1461 
1462             state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
1463             EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
1464 
1465             SIMD128Register expected_result_in_register(expected_result);
1466             if (vma == 0) {
1467               expected_result_in_register = (expected_result_in_register & SIMD128Register{mask}) |
1468                                             (kUndisturbedResult & ~SIMD128Register{mask});
1469             } else {
1470               expected_result_in_register = expected_result_in_register | ~SIMD128Register{mask};
1471             }
1472             // Mask registers are always processing tail like vta is set.
1473             if (vlmax != 128)
1474               expected_result_in_register |= std::get<0>(
1475                   intrinsics::MakeBitmaskFromVl((vlmul == 2) ? (vlmax * 5) / 8 : vlmax));
1476             if (vlmul == 2) {
1477               const auto [start_mask] = intrinsics::MakeBitmaskFromVl(vlmax / 8);
1478               expected_result_in_register = (SIMD128Register{kUndisturbedResult} & ~start_mask) |
1479                                             (expected_result_in_register & start_mask);
1480             }
1481             EXPECT_EQ(state_.cpu.v[8], expected_result_in_register);
1482 
1483             if (vlmul == 2) {
1484               // Every vector instruction must set vstart to 0, but shouldn't touch vl.
1485               EXPECT_EQ(state_.cpu.vstart, 0);
1486               EXPECT_EQ(state_.cpu.vl, (vlmax * 5) / 8);
1487             }
1488           }
1489         }
1490       }
1491     };
1492 
1493     ((Verify(insn_bytes,
1494              BitUtilLog2(sizeof(SIMD128Register) / sizeof(ExpectedResultType)),
1495              expected_result,
1496              kMask),
1497       Verify(insn_bytes | (1 << 25),
1498              BitUtilLog2(sizeof(SIMD128Register) / sizeof(ExpectedResultType)),
1499              expected_result,
1500              kNoMask[0])),
1501      ...);
1502   }
1503 
TestVectorCarryInstruction(uint32_t insn_bytes,const UInt8x16Tuple (& expected_result_int8)[8],const UInt16x8Tuple (& expected_result_int16)[8],const UInt32x4Tuple (& expected_result_int32)[8],const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16])1504   void TestVectorCarryInstruction(uint32_t insn_bytes,
1505                                   const UInt8x16Tuple (&expected_result_int8)[8],
1506                                   const UInt16x8Tuple (&expected_result_int16)[8],
1507                                   const UInt32x4Tuple (&expected_result_int32)[8],
1508                                   const UInt64x2Tuple (&expected_result_int64)[8],
1509                                   const __v2du (&source)[16]) {
1510     auto Verify = [this, &source](uint32_t insn_bytes, uint8_t vsew, const auto& expected_result) {
1511       __m128i dst_result = kUndisturbedResult;
1512 
1513       // Set mask register
1514       state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
1515 
1516       // Set source registers
1517       for (size_t index = 0; index < std::size(source); ++index) {
1518         state_.cpu.v[16 + index] = SIMD128Register{source[index]}.Get<__uint128_t>();
1519       }
1520 
1521       // Set x1 for vx instructions.
1522       SetXReg<1>(state_.cpu, 0xaaaa'aaaa'aaaa'aaaa);
1523 
1524       for (uint8_t vlmul = 0; vlmul < 8; ++vlmul) {
1525         for (uint8_t vta = 0; vta < 2; ++vta) {
1526           uint8_t vma = 0;
1527           auto [vlmax, vtype] =
1528               intrinsics::Vsetvl(~0ULL, (vma << 7) | (vta << 6) | (vsew << 3) | vlmul);
1529           // Incompatible vsew and vlmax. Skip it.
1530           if (vlmax == 0) {
1531             continue;
1532           }
1533           uint8_t emul = vlmul & 0b111;
1534 
1535           // To make tests quick enough we don't test vstart and vl change with small register
1536           // sets. Only with vlmul == 2 (4 registers) we set vstart and vl to skip half of first
1537           // register, last register and half of next-to last register.
1538           // Don't use vlmul == 3 because that one may not be supported if instruction widens the
1539           // result.
1540           if (vlmul == 2) {
1541             state_.cpu.vstart = vlmax / 8;
1542             state_.cpu.vl = (vlmax * 5) / 8;
1543           } else {
1544             state_.cpu.vstart = 0;
1545             state_.cpu.vl = vlmax;
1546           }
1547           state_.cpu.vtype = vtype;
1548 
1549           // Set expected_result vector registers into 0b01010101… pattern.
1550           for (size_t index = 0; index < 8; ++index) {
1551             state_.cpu.v[8 + index] = SIMD128Register{dst_result}.Get<__uint128_t>();
1552           }
1553 
1554           state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
1555           EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
1556 
1557           if (emul < 4) {
1558             for (size_t index = 0; index < 1 << emul; ++index) {
1559               if (index == 0 && emul == 2) {
1560                 EXPECT_EQ(state_.cpu.v[8 + index],
1561                           ((dst_result & kFractionMaskInt8[3]) |
1562                            (SIMD128Register{expected_result[index]} & ~kFractionMaskInt8[3]))
1563                               .template Get<__uint128_t>());
1564               } else if (index == 2 && emul == 2) {
1565                 EXPECT_EQ(state_.cpu.v[8 + index],
1566                           ((SIMD128Register{expected_result[index]} & kFractionMaskInt8[3]) |
1567                            ((vta ? kAgnosticResult : dst_result) & ~kFractionMaskInt8[3]))
1568                               .template Get<__uint128_t>());
1569               } else if (index == 3 && emul == 2 && vta) {
1570                 EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{kAgnosticResult});
1571               } else if (index == 3 && emul == 2) {
1572                 EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{dst_result});
1573               } else {
1574                 EXPECT_EQ(state_.cpu.v[8 + index],
1575                           (SIMD128Register{expected_result[index]}).template Get<__uint128_t>());
1576               }
1577             }
1578           } else {
1579             EXPECT_EQ(state_.cpu.v[8],
1580                       ((SIMD128Register{expected_result[0]} & kFractionMaskInt8[emul - 4]) |
1581                        ((vta ? kAgnosticResult : dst_result) & ~kFractionMaskInt8[emul - 4]))
1582                           .template Get<__uint128_t>());
1583           }
1584 
1585           if (emul == 2) {
1586             // Every vector instruction must set vstart to 0, but shouldn't touch vl.
1587             EXPECT_EQ(state_.cpu.vstart, 0);
1588             EXPECT_EQ(state_.cpu.vl, (vlmax * 5) / 8);
1589           }
1590         }
1591       }
1592     };
1593 
1594     // Some instructions don't support use of mask register, but in these instructions bit
1595     // #25 is set.  This function doesn't support these. Verify that vm bit is not set.
1596     EXPECT_EQ(insn_bytes & (1 << 25), 0U);
1597 
1598     Verify(insn_bytes, 0, expected_result_int8);
1599     Verify(insn_bytes, 1, expected_result_int16);
1600     Verify(insn_bytes, 2, expected_result_int32);
1601     Verify(insn_bytes, 3, expected_result_int64);
1602   }
1603 
TestVXmXXsInstruction(uint32_t insn_bytes,const uint64_t (& expected_result_no_mask)[129],const uint64_t (& expected_result_with_mask)[129],const __v2du source)1604   void TestVXmXXsInstruction(uint32_t insn_bytes,
1605                             const uint64_t (&expected_result_no_mask)[129],
1606                             const uint64_t (&expected_result_with_mask)[129],
1607                             const __v2du source) {
1608     auto Verify = [this, &source](uint32_t insn_bytes,
1609                                   const uint64_t (&expected_result)[129]) {
1610       state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
1611 
1612       auto [vlmax, vtype] = intrinsics::Vsetvl(~0ULL, 3);
1613       state_.cpu.vtype = vtype;
1614       state_.cpu.vstart = 0;
1615       state_.cpu.v[16] = SIMD128Register{source}.Get<__uint128_t>();
1616 
1617       for (uint8_t vl = 0; vl <= vlmax; ++vl) {
1618         state_.cpu.vl = vl;
1619         SetXReg<1>(state_.cpu, 0xaaaa'aaaa'aaaa'aaaa);
1620 
1621         state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
1622         EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
1623         EXPECT_EQ(GetXReg<1>(state_.cpu), expected_result[vl]) << std::to_string(vl);
1624       }
1625     };
1626 
1627     Verify(insn_bytes, expected_result_with_mask);
1628     Verify(insn_bytes | (1 << 25), expected_result_no_mask);
1629   }
1630 
TestVectorFloatPermutationInstruction(uint32_t insn_bytes,const UInt32x4Tuple (& expected_result_int32)[8],const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16],uint8_t vlmul,uint64_t skip=0,bool ignore_vma_for_last=false,bool last_elem_is_f1=false)1631   void TestVectorFloatPermutationInstruction(uint32_t insn_bytes,
1632                                              const UInt32x4Tuple (&expected_result_int32)[8],
1633                                              const UInt64x2Tuple (&expected_result_int64)[8],
1634                                              const __v2du (&source)[16],
1635                                              uint8_t vlmul,
1636                                              uint64_t skip = 0,
1637                                              bool ignore_vma_for_last = false,
1638                                              bool last_elem_is_f1 = false) {
1639     TestVectorPermutationInstruction<TestVectorInstructionKind::kFloat>(insn_bytes,
1640                                                                         source,
1641                                                                         vlmul,
1642                                                                         skip,
1643                                                                         ignore_vma_for_last,
1644                                                                         last_elem_is_f1,
1645                                                                         /* regx1 */ 0x0,
1646                                                                         expected_result_int32,
1647                                                                         expected_result_int64);
1648   }
1649 
TestVectorPermutationInstruction(uint32_t insn_bytes,const UInt8x16Tuple (& expected_result_int8)[8],const UInt16x8Tuple (& expected_result_int16)[8],const UInt32x4Tuple (& expected_result_int32)[8],const UInt64x2Tuple (& expected_result_int64)[8],const __v2du (& source)[16],uint8_t vlmul,uint64_t regx1=0x0,uint64_t skip=0,bool ignore_vma_for_last=false,bool last_elem_is_x1=false)1650   void TestVectorPermutationInstruction(uint32_t insn_bytes,
1651                                         const UInt8x16Tuple (&expected_result_int8)[8],
1652                                         const UInt16x8Tuple (&expected_result_int16)[8],
1653                                         const UInt32x4Tuple (&expected_result_int32)[8],
1654                                         const UInt64x2Tuple (&expected_result_int64)[8],
1655                                         const __v2du (&source)[16],
1656                                         uint8_t vlmul,
1657                                         uint64_t regx1 = 0x0,
1658                                         uint64_t skip = 0,
1659                                         bool ignore_vma_for_last = false,
1660                                         bool last_elem_is_x1 = false) {
1661     TestVectorPermutationInstruction<TestVectorInstructionKind::kInteger>(insn_bytes,
1662                                                                           source,
1663                                                                           vlmul,
1664                                                                           skip,
1665                                                                           ignore_vma_for_last,
1666                                                                           last_elem_is_x1,
1667                                                                           regx1,
1668                                                                           expected_result_int8,
1669                                                                           expected_result_int16,
1670                                                                           expected_result_int32,
1671                                                                           expected_result_int64);
1672   }
1673 
1674   // Unlike regular arithmetic instructions, the result of a permutation
1675   // instruction depends also on vlmul.  Also, the vslideup specs mention that
1676   // the destination vector remains unchanged the first |offset| elements (in
1677   // effect, the offset acts akin to vstart), in those cases skip can be used
1678   // to specify how many elements' mask will be skipped (counting from the
1679   // beginning, should be the same as the offset).
1680   //
1681   // If |ignore_vma_for_last| is true, an inactive element at vl-1 will be
1682   // treated as if vma=0 (Undisturbed).
1683   // If |last_elem_is_reg1| is true, the last element of the vector in
1684   // expected_result (that is, at vl-1) will be expected to be the same as
1685   // |regx1| when VL < VMAX and said element is active.
1686   template <TestVectorInstructionKind kTestVectorInstructionKind,
1687             typename... ExpectedResultType,
1688             size_t... kResultsCount>
TestVectorPermutationInstruction(uint32_t insn_bytes,const __v2du (& source)[16],uint8_t vlmul,uint64_t skip,bool ignore_vma_for_last,bool last_elem_is_reg1,uint64_t regx1,const ExpectedResultType &...expected_result)1689   void TestVectorPermutationInstruction(uint32_t insn_bytes,
1690                                         const __v2du (&source)[16],
1691                                         uint8_t vlmul,
1692                                         uint64_t skip,
1693                                         bool ignore_vma_for_last,
1694                                         bool last_elem_is_reg1,
1695                                         uint64_t regx1,
1696                                         const ExpectedResultType&... expected_result) {
1697     auto Verify = [this, &source, vlmul, regx1, skip, ignore_vma_for_last, last_elem_is_reg1](
1698                       uint32_t insn_bytes,
1699                       uint8_t vsew,
1700                       const auto& expected_result_raw,
1701                       auto mask) {
1702       // Mask register is, unconditionally, v0, and we need 8, 16, or 24 to handle full 8-registers
1703       // inputs thus we use v8..v15 for destination and place sources into v16..v23 and v24..v31.
1704       state_.cpu.v[0] = SIMD128Register{kMask}.Get<__uint128_t>();
1705       for (size_t index = 0; index < std::size(source); ++index) {
1706         state_.cpu.v[16 + index] = SIMD128Register{source[index]}.Get<__uint128_t>();
1707       }
1708 
1709       if constexpr (kTestVectorInstructionKind == TestVectorInstructionKind::kFloat) {
1710         UNUSED(regx1);
1711         // We only support Float32/Float64 for float instructions, but there are conversion
1712         // instructions that work with double width floats.
1713         // These instructions never use float registers though and thus we don't need to store
1714         // anything into f1 register, if they are used.
1715         // For Float32/Float64 case we load 5.625 of the appropriate type into f1.
1716         ASSERT_LE(vsew, 3);
1717         if (vsew == 2) {
1718           SetFReg<1>(state_.cpu, 0xffff'ffff'40b4'0000);  // float 5.625
1719         } else if (vsew == 3) {
1720           SetFReg<1>(state_.cpu, 0x4016'8000'0000'0000);  // double 5.625
1721         }
1722       } else {
1723         // Set x1 for vx instructions.
1724         SetXReg<1>(state_.cpu, regx1);
1725       }
1726 
1727       const size_t kElementSize = 1 << vsew;
1728       size_t num_regs = 1 << vlmul;
1729       if (vlmul > 3) {
1730         num_regs = 1;
1731       }
1732       // Values for which the mask is not applied due to being before the offset when doing
1733       // vslideup.
1734       SIMD128Register skip_mask[num_regs];
1735       int64_t toskip = skip;
1736       for (size_t index = 0; index < num_regs && toskip > 0; ++index) {
1737         size_t skip_bits = toskip * kElementSize * 8;
1738         skip_mask[index] =
1739             ~std::get<0>(intrinsics::MakeBitmaskFromVl(skip_bits > 128 ? 128 : skip_bits));
1740         toskip -= 16 / kElementSize;
1741       }
1742 
1743       for (uint8_t vta = 0; vta < 2; ++vta) {
1744         for (uint8_t vma = 0; vma < 2; ++vma) {
1745           auto [vlmax, vtype] =
1746               intrinsics::Vsetvl(~0ULL, (vma << 7) | (vta << 6) | (vsew << 3) | vlmul);
1747           // Incompatible vsew and vlmax. Skip it.
1748           if (vlmax == 0) {
1749             continue;
1750           }
1751 
1752           // To make tests quick enough we don't test vstart and vl change with small register
1753           // sets. Only with vlmul == 2 (4 registers) we set vstart and vl to skip half of first
1754           // register, last register and half of next-to last register.
1755           // Don't use vlmul == 3 because that one may not be supported if instruction widens the
1756           // result.
1757           if (vlmul == 2) {
1758             state_.cpu.vstart = vlmax / 8;
1759             state_.cpu.vl = (vlmax * 5) / 8;
1760           } else {
1761             state_.cpu.vstart = 0;
1762             state_.cpu.vl = vlmax;
1763           }
1764           state_.cpu.vtype = vtype;
1765 
1766           // Set dst vector registers into 0b01010101… pattern.
1767           for (size_t index = 0; index < 8; ++index) {
1768             state_.cpu.v[8 + index] = SIMD128Register{kUndisturbedResult}.Get<__uint128_t>();
1769           }
1770 
1771           state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
1772           EXPECT_TRUE(RunOneInstruction(&state_, state_.cpu.insn_addr + 4));
1773 
1774           const size_t n = std::size(source);
1775           // Values for inactive elements (i.e. corresponding mask bit is 0).
1776           __m128i expected_inactive[n];
1777           // For most instructions, follow basic inactive processing rules based on vma flag.
1778           std::fill_n(expected_inactive, n, (vma ? kAgnosticResult : kUndisturbedResult));
1779 
1780           const size_t kElementsPerRegister = 16 / kElementSize;
1781           const size_t last_reg = (state_.cpu.vl - 1) / kElementsPerRegister;
1782           const size_t last_elem = (state_.cpu.vl - 1) % kElementsPerRegister;
1783           const auto [mask_for_vl] = intrinsics::MakeBitmaskFromVl(last_elem * kElementSize * 8);
1784           if (vma && ignore_vma_for_last) {
1785             // Set expected value for inactive element at vl-1 to Undisturbed.
1786             expected_inactive[last_reg] =
1787                 ((expected_inactive[last_reg] & ~mask_for_vl) | (kUndisturbedResult & mask_for_vl))
1788                     .Get<__m128i>();
1789           }
1790 
1791           SIMD128Register expected_result[std::size(expected_result_raw)];
1792           for (size_t index = 0; index < std::size(expected_result_raw); ++index) {
1793             expected_result[index] = SIMD128Register{expected_result_raw[index]};
1794           }
1795 
1796           if (vlmul == 2 && last_elem_is_reg1) {
1797             switch (kElementSize) {
1798               case 1:
1799                 expected_result[last_reg].template Set<uint8_t>(
1800                     static_cast<uint8_t>(GetXReg<1>(state_.cpu)), last_elem);
1801                 break;
1802               case 2:
1803                 expected_result[last_reg].template Set<uint16_t>(
1804                     static_cast<uint16_t>(GetXReg<1>(state_.cpu)), last_elem);
1805                 break;
1806               case 4:
1807                 if constexpr (kTestVectorInstructionKind == TestVectorInstructionKind::kFloat) {
1808                   expected_result[last_reg].template Set<uint32_t>(
1809                       static_cast<uint32_t>(GetFReg<1>(state_.cpu)), last_elem);
1810                 } else {
1811                   expected_result[last_reg].template Set<uint32_t>(
1812                       static_cast<uint32_t>(GetXReg<1>(state_.cpu)), last_elem);
1813                 }
1814                 break;
1815               case 8:
1816                 if constexpr (kTestVectorInstructionKind == TestVectorInstructionKind::kFloat) {
1817                   expected_result[last_reg].template Set<uint64_t>(
1818                       static_cast<uint64_t>(GetFReg<1>(state_.cpu)), last_elem);
1819                 } else {
1820                   expected_result[last_reg].template Set<uint64_t>(
1821                       static_cast<uint64_t>(GetXReg<1>(state_.cpu)), last_elem);
1822                 }
1823                 break;
1824               default:
1825                 FAIL() << "Element size is " << kElementSize;
1826             }
1827           }
1828 
1829           if (vlmul < 4) {
1830             for (size_t index = 0; index < num_regs; ++index) {
1831               if (index == 0 && vlmul == 2) {
1832                 EXPECT_EQ(
1833                     state_.cpu.v[8 + index],
1834                     SIMD128Register{(kUndisturbedResult & kFractionMaskInt8[3]) |
1835                                     (expected_result[index] & (mask[index] | skip_mask[index]) &
1836                                      ~kFractionMaskInt8[3]) |
1837                                     (expected_inactive[index] & ~mask[index] & ~skip_mask[index] &
1838                                      ~kFractionMaskInt8[3])}
1839                         .Get<__uint128_t>());
1840               } else if (index == 2 && vlmul == 2) {
1841                 EXPECT_EQ(
1842                     state_.cpu.v[8 + index],
1843                     SIMD128Register{
1844                         (expected_result[index] & (mask[index] | skip_mask[index]) &
1845                          kFractionMaskInt8[3]) |
1846                         (expected_inactive[index] & ~mask[index] & ~skip_mask[index] &
1847                          kFractionMaskInt8[3]) |
1848                         ((vta ? kAgnosticResult : kUndisturbedResult) & ~kFractionMaskInt8[3])}
1849                         .Get<__uint128_t>());
1850               } else if (index == 3 && vlmul == 2 && vta) {
1851                 EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{kAgnosticResult});
1852               } else if (index == 3 && vlmul == 2) {
1853                 EXPECT_EQ(state_.cpu.v[8 + index], SIMD128Register{kUndisturbedResult});
1854               } else {
1855                 EXPECT_EQ(
1856                     state_.cpu.v[8 + index],
1857                     SIMD128Register{(expected_result[index] & (mask[index] | skip_mask[index])) |
1858                                     (expected_inactive[index] & ~(mask[index] | skip_mask[index]))}
1859                         .Get<__uint128_t>());
1860               }
1861             }
1862           } else {
1863             __uint128_t v8 = state_.cpu.v[8];
1864             SIMD128Register affected_part{expected_result[0] &
1865                                           (mask[0] & kFractionMaskInt8[vlmul - 4] | skip_mask[0])};
1866             SIMD128Register masked_part{expected_inactive[0] & ~mask[0] & ~skip_mask[0] &
1867                                         kFractionMaskInt8[vlmul - 4]};
1868             SIMD128Register tail_part{(vta ? kAgnosticResult : kUndisturbedResult) &
1869                                       ~kFractionMaskInt8[vlmul - 4]};
1870 
1871             EXPECT_EQ(v8, (affected_part | masked_part | tail_part).Get<__uint128_t>());
1872           }
1873 
1874           if (vlmul == 2) {
1875             // Every vector instruction must set vstart to 0, but shouldn't touch vl.
1876             EXPECT_EQ(state_.cpu.vstart, 0);
1877             EXPECT_EQ(state_.cpu.vl, (vlmax * 5) / 8);
1878           }
1879         }
1880       }
1881     };
1882 
1883     // Test with and without masking enabled.
1884     (Verify(insn_bytes,
1885             BitUtilLog2(sizeof(std::remove_cvref_t<decltype(std::get<0>(expected_result[0]))>)),
1886             expected_result,
1887             MaskForElem<std::remove_cvref_t<decltype(std::get<0>(expected_result[0]))>>()),
1888      ...);
1889     (Verify(insn_bytes | (1 << 25),
1890             BitUtilLog2(sizeof(std::remove_cvref_t<decltype(std::get<0>(expected_result[0]))>)),
1891             expected_result,
1892             kNoMask),
1893      ...);
1894   }
1895 
1896  protected:
1897   static constexpr __v2du kVectorCalculationsSource[16] = {
1898       {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
1899       {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
1900       {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
1901       {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938},
1902       {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
1903       {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
1904       {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
1905       {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978},
1906 
1907       {0x9e0c'9a09'9604'9200, 0x8e1c'8a18'8614'8211},
1908       {0xbe2c'ba29'b624'b220, 0xae3c'aa38'a634'a231},
1909       {0xde4c'da49'd644'd240, 0xce5c'ca58'c654'c251},
1910       {0xfe6c'fa69'f664'f260, 0xee7c'ea78'e674'e271},
1911       {0x1e8c'1a89'1684'1280, 0x0e9c'0a98'0694'0291},
1912       {0x3eac'3aa9'36a4'32a0, 0x2ebc'2ab8'26b4'22b1},
1913       {0x5ecc'5ac9'56c4'52c0, 0x4edc'4ad8'46d4'42d1},
1914       {0x7eec'7ae9'76e4'72e0, 0x6efc'6af8'66f4'62f1},
1915   };
1916 
1917   static constexpr __v2du kVfClassSource[16] = {
1918       {0x8000'0000'0000'0000, 0x8e1c'8a18'8614'8211},
1919       {0x0000'0000'0000'0000, 0xae3c'aa38'a634'a231},
1920       {0x7ff0'0000'0000'0000, 0xff80'0000'7f80'0000},
1921       {0xfff0'0000'0000'0000, 0xee7c'ea78'e674'e271},
1922       {0x1e8c'1a89'1684'1280, 0x0e9c'0a98'0694'0291},
1923       {0x3eac'3aa9'36a4'32a0, 0x2ebc'2ab8'26b4'22b1},
1924       {0x5ecc'5ac9'56c4'52c0, 0x4edc'4ad8'46d4'42d1},
1925       {0x7fb7'ffff'7fb7'ffff, 0x7ff7'ffff'ffff'ffff},
1926 
1927       {0x8000'0000'0000'0000, 0x8e1c'8a18'8614'8211},
1928       {0x0000'0000'0000'0000, 0xae3c'aa38'a634'a231},
1929       {0x7ff0'0000'0000'0000, 0xff80'0000'7f80'0000},
1930       {0xfff0'0000'0000'0000, 0xee7c'ea78'e674'e271},
1931       {0x1e8c'1a89'1684'1280, 0x0e9c'0a98'0694'0291},
1932       {0x3eac'3aa9'36a4'32a0, 0x2ebc'2ab8'26b4'22b1},
1933       {0x5ecc'5ac9'56c4'52c0, 0x4edc'4ad8'46d4'42d1},
1934       {0x7fb7'ffff'7fb7'ffff, 0x7ff7'ffff'ffff'ffff},
1935   };
1936 
1937   static constexpr __v2du kVectorCalculationsSourceLegacy[16] = {
1938       {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
1939       {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
1940       {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
1941       {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938},
1942       {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
1943       {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
1944       {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
1945       {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978},
1946 
1947       {0x0e0c'0a09'0604'0200, 0x1e1c'1a18'1614'1211},
1948       {0x2e2c'2a29'2624'2220, 0x3e3c'3a38'3634'3231},
1949       {0x4e4c'4a49'4644'4240, 0x5e5c'5a58'5654'5251},
1950       {0x6e6c'6a69'6664'6260, 0x7e7c'7a78'7674'7271},
1951       {0x8e8c'8a89'8684'8280, 0x9e9c'9a98'9694'9291},
1952       {0xaeac'aaa9'a6a4'a2a0, 0xbebc'bab8'b6b4'b2b1},
1953       {0xcecc'cac9'c6c4'c2c0, 0xdedc'dad8'd6d4'd2d1},
1954       {0xeeec'eae9'e6e4'e2e0, 0xfefc'faf8'f6f4'f2f1},
1955   };
1956 
1957   static constexpr __v2du kVectorComparisonSource[16] = {
1958       {0xf005'f005'f005'f005, 0xffff'ffff'4040'4040},
1959       {0xffff'ffff'40b4'40b4, 0xffff'ffff'40b4'0000},
1960       {0x4016'4016'4016'4016, 0x4016'8000'0000'0000},
1961       {0xaaaa'aaaa'aaaa'aaaa, 0x1111'1111'1111'1111},
1962       {0xfff4'fff4'fff4'fff4, 0xfff6'fff6'fff6'fff6},
1963       {0xfff8'fff8'fff4'fff4, 0xfff5'fff5'fff5'fff5},
1964       {0xa9bb'bbbb'a9bb'bbbb, 0xa9bb'bbbb'a9bb'bbbb},
1965       {0xa9a9'a9a9'a9a9'a9a9, 0xa9a9'a9a9'a9a9'a9a9},
1966 
1967       {0xf005'f005'f005'f005, 0xffff'ffff'4040'4040},
1968       {0x1111'1111'1111'1111, 0x1111'1111'1111'1111},
1969       {0xfff1'fff1'fff1'fff1, 0xfff1'fff1'fff1'fff1},
1970       {0x6e6c'6a69'6664'6260, 0x7e7c'7a78'7674'7271},
1971       {0x8e8c'8a89'8684'8280, 0x9e9c'9a98'9694'9291},
1972       {0xaeac'aaa9'a6a4'a2a0, 0xbebc'bab8'b6b4'b2b1},
1973       {0xcecc'cac9'c6c4'c2c0, 0xdedc'dad8'd6d4'd2d1},
1974       {0xeeec'eae9'e6e4'e2e0, 0xfefc'faf8'f6f4'f2f1},
1975   };
1976 
1977   // Mask in form suitable for storing in v0 and use in v0.t form.
1978   static constexpr __v2du kMask = {0xd5ad'd6b5'ad6b'b5ad, 0x6af7'57bb'deed'7bb5};
1979   // Mask used with vsew = 0 (8bit) elements.
1980   static constexpr __v16qu kMaskInt8[8] = {
1981       {255, 0, 255, 255, 0, 255, 0, 255, 255, 0, 255, 0, 255, 255, 0, 255},
1982       {255, 255, 0, 255, 0, 255, 255, 0, 255, 0, 255, 255, 0, 255, 0, 255},
1983       {255, 0, 255, 0, 255, 255, 0, 255, 0, 255, 255, 0, 255, 0, 255, 255},
1984       {255, 0, 255, 255, 0, 255, 0, 255, 255, 0, 255, 0, 255, 0, 255, 255},
1985       {255, 0, 255, 0, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0},
1986       {255, 0, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0, 255, 255},
1987       {255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0, 255, 0, 255, 0},
1988       {255, 255, 255, 0, 255, 255, 255, 255, 0, 255, 0, 255, 0, 255, 255, 0},
1989   };
1990   // Mask used with vsew = 1 (16bit) elements.
1991   static constexpr __v8hu kMaskInt16[8] = {
1992       {0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff},
1993       {0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff},
1994       {0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000},
1995       {0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff},
1996       {0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff},
1997       {0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff},
1998       {0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff},
1999       {0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff},
2000   };
2001   // Mask used with vsew = 2 (32bit) elements.
2002   static constexpr __v4su kMaskInt32[8] = {
2003       {0xffff'ffff, 0x0000'0000, 0xffff'ffff, 0xffff'ffff},
2004       {0x0000'0000, 0xffff'ffff, 0x0000'0000, 0xffff'ffff},
2005       {0xffff'ffff, 0x0000'0000, 0xffff'ffff, 0x0000'0000},
2006       {0xffff'ffff, 0xffff'ffff, 0x0000'0000, 0xffff'ffff},
2007       {0xffff'ffff, 0xffff'ffff, 0x0000'0000, 0xffff'ffff},
2008       {0x0000'0000, 0xffff'ffff, 0xffff'ffff, 0x0000'0000},
2009       {0xffff'ffff, 0x0000'0000, 0xffff'ffff, 0xffff'ffff},
2010       {0x0000'0000, 0xffff'ffff, 0x0000'0000, 0xffff'ffff},
2011   };
2012   // Mask used with vsew = 3 (64bit) elements.
2013   static constexpr __v2du kMaskInt64[8] = {
2014       {0xffff'ffff'ffff'ffff, 0x0000'0000'0000'0000},
2015       {0xffff'ffff'ffff'ffff, 0xffff'ffff'ffff'ffff},
2016       {0x0000'0000'0000'0000, 0xffff'ffff'ffff'ffff},
2017       {0x0000'0000'0000'0000, 0xffff'ffff'ffff'ffff},
2018       {0xffff'ffff'ffff'ffff, 0x0000'0000'0000'0000},
2019       {0xffff'ffff'ffff'ffff, 0x0000'0000'0000'0000},
2020       {0xffff'ffff'ffff'ffff, 0xffff'ffff'ffff'ffff},
2021       {0x0000'0000'0000'0000, 0xffff'ffff'ffff'ffff},
2022   };
2023   // To verify operations without masking.
2024   static constexpr __v16qu kNoMask[8] = {
2025       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
2026       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
2027       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
2028       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
2029       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
2030       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
2031       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
2032       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
2033   };
2034   // Half of sub-register lmul.
2035   static constexpr __v16qu kFractionMaskInt8[5] = {
2036       {255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},        // Half of ⅛ reg = ¹⁄₁₆
2037       {255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},      // Half of ¼ reg = ⅛
2038       {255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // Half of ½ reg = ¼
2039       {255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0},  // Half of full reg = ½
2040       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},  // Full reg
2041   };
2042   // Agnostic result is -1 on RISC-V, not 0.
2043   static constexpr __m128i kAgnosticResult = {-1, -1};
2044   // Undisturbed result is put in registers v8, v9, …, v15 and is expected to get read back.
2045   static constexpr __m128i kUndisturbedResult = {0x5555'5555'5555'5555, 0x5555'5555'5555'5555};
2046   // Note: permutation of indexes here is not entirely random. First 32 indexes are limited to 31
2047   // maximum and first 64 indexes are limited to 63. That way we can guarantee that 8byte elements
2048   // and 4byte elements wouldn't need to access area outside of our 256-byte buffer.
2049   static constexpr uint8_t kPermutedIndexes[128] = {
2050       1,   0,   3,  2,   7,   5,   4,   6,   9,   14,  15,  11,  13,  12, 8,  10,  30,  31,  17,
2051       22,  18,  26, 25,  19,  29,  28,  16,  21,  27,  24,  20,  23,  44, 50, 52,  34,  61,  38,
2052       54,  43,  42, 63,  57,  40,  36,  46,  39,  47,  35,  41,  62,  59, 60, 51,  55,  53,  33,
2053       32,  58,  49, 56,  37,  45,  48,  124, 92,  78,  101, 114, 89,  75, 64, 98,  112, 111, 118,
2054       121, 102, 73, 105, 109, 68,  103, 72,  110, 79,  119, 96,  123, 85, 90, 126, 66,  69,  120,
2055       97,  113, 76, 100, 67,  125, 117, 65,  84,  104, 122, 71,  81,  99, 70, 91,  86,  115, 127,
2056       77,  107, 74, 93,  80,  106, 87,  94,  83,  95,  116, 108, 82,  88};
2057 
2058   // Store area for store instructions.  We need at least 16 uint64_t to handle 8×128bit registers,
2059   // plus 2× of that to test strided instructions.
2060   alignas(16) uint64_t store_area_[32];
2061 
2062   ThreadState state_;
2063 };
2064 
2065 #define TESTSUITE Riscv64InterpretInsnTest
2066 #define TESTING_INTERPRETER
2067 
2068 #include "berberis/test_utils/insn_tests_riscv64-inl.h"
2069 
2070 #undef TESTING_INTERPRETER
2071 #undef TESTSUITE
2072 
2073 // Tests for Non-Compressed Instructions.
2074 
TEST_F(Riscv64InterpreterTest,FenceInstructions)2075 TEST_F(Riscv64InterpreterTest, FenceInstructions) {
2076   // Fence
2077   InterpretFence(0x0ff0000f);
2078   // FenceTso
2079   InterpretFence(0x8330000f);
2080 
2081   // FenceI explicitly not supported.
2082 }
2083 
TEST_F(Riscv64InterpreterTest,SyscallWrite)2084 TEST_F(Riscv64InterpreterTest, SyscallWrite) {
2085   const char message[] = "Hello";
2086   // Prepare a pipe to write to.
2087   int pipefd[2];
2088   ASSERT_EQ(0, pipe(pipefd));
2089 
2090   // Only ecall instruction needs guest thread, since it involves pending signals manipulations.
2091   std::unique_ptr<GuestThread, decltype(&GuestThread::Destroy)> guest_thread(
2092       GuestThread::CreateForTest(&state_), GuestThread::Destroy);
2093   state_.thread = guest_thread.get();
2094 
2095   // SYS_write
2096   SetXReg<17>(state_.cpu, 0x40);
2097   // File descriptor
2098   SetXReg<10>(state_.cpu, pipefd[1]);
2099   // String
2100   SetXReg<11>(state_.cpu, bit_cast<uint64_t>(&message[0]));
2101   // Size
2102   SetXReg<12>(state_.cpu, sizeof(message));
2103 
2104   uint32_t insn_bytes = 0x00000073;
2105   state_.cpu.insn_addr = ToGuestAddr(&insn_bytes);
2106   InterpretInsn(&state_);
2107 
2108   // Check number of bytes written.
2109   EXPECT_EQ(GetXReg<10>(state_.cpu), sizeof(message));
2110 
2111   // Check the message was written to the pipe.
2112   char buf[sizeof(message)] = {};
2113   ssize_t read_size = read(pipefd[0], &buf, sizeof(buf));
2114   EXPECT_NE(read_size, -1);
2115   EXPECT_EQ(0, strcmp(message, buf));
2116   close(pipefd[0]);
2117   close(pipefd[1]);
2118 }
2119 
TEST_F(Riscv64InterpreterTest,TestFPExceptions)2120 TEST_F(Riscv64InterpreterTest, TestFPExceptions) {
2121   // Keep the same sort as Section 19 "Vector Instruction Listing".
2122   TestFPExceptions<intrinsics::Float32>(0x012d1557);  // Vfadd.vv v10, v18, v26, v0.t
2123   TestFPExceptions<intrinsics::Float64>(0x010c1457);  // Vfadd.vv v8, v16, v24, v0.t
2124   TestFPExceptions<intrinsics::Float32>(0x0120d557);  // Vfadd.vf v10, v18, f1, v0.t
2125   TestFPExceptions<intrinsics::Float64>(0x01015457);  // Vfadd.vf v8, v16, f2, v0.t
2126   TestFPExceptions<intrinsics::Float32>(0x092d1557);  // Vfsub.vv v10, v18, v26, v0.t
2127   TestFPExceptions<intrinsics::Float64>(0x090c1457);  // Vfsub.vv v8, v16, v24, v0.t
2128   TestFPExceptions<intrinsics::Float32>(0x0920d557);  // Vfsub.vf v10, v18, f1, v0.t
2129   TestFPExceptions<intrinsics::Float64>(0x09015457);  // Vfsub.vf v8, v16, f2, v0.t
2130   TestFPExceptions<intrinsics::Float32>(0x812d1557);  // Vfdiv.vv v10, v18, v26, v0.t
2131   TestFPExceptions<intrinsics::Float64>(0x810c1457);  // Vfdiv.vv v8, v16, v24, v0.t
2132   TestFPExceptions<intrinsics::Float32>(0x8120d557);  // Vfdiv.vf v10, v18, f1, v0.t
2133   TestFPExceptions<intrinsics::Float64>(0x81015457);  // Vfdiv.vf v8, v16, f2, v0.t
2134   TestFPExceptions<intrinsics::Float32>(0x912d1557);  // Vfmul.vv v10, v18, v26, v0.t
2135   TestFPExceptions<intrinsics::Float64>(0x910c1457);  // Vfmul.vv v8, v16, v24, v0.t
2136   TestFPExceptions<intrinsics::Float32>(0x9120d557);  // Vfmul.vf v10, v18, f1, v0.t
2137   TestFPExceptions<intrinsics::Float64>(0x91015457);  // Vfmul.vf v8, v16, f2, v0.t
2138   TestFPExceptions<intrinsics::Float32>(0x9d20d557);  // Vfrsub.vf v10, v18, f1, v0.t
2139   TestFPExceptions<intrinsics::Float64>(0x9d015457);  // Vfrsub.vf v8, v16, f2, v0.t
2140 }
2141 
TEST_F(Riscv64InterpreterTest,TestVlXreXX)2142 TEST_F(Riscv64InterpreterTest, TestVlXreXX) {
2143   TestVlXreXX<1>(0x2808407);   // vl1re8.v v8, (x1)
2144   TestVlXreXX<2>(0x22808407);  // vl2re8.v v8, (x1)
2145   TestVlXreXX<4>(0x62808407);  // vl4re8.v v8, (x1)
2146   TestVlXreXX<8>(0xe2808407);  // vl8re8.v v8, (x1)
2147 
2148   TestVlXreXX<1>(0x280d407);   // vl1re16.v v8, (x1)
2149   TestVlXreXX<2>(0x2280d407);  // vl2re16.v v8, (x1)
2150   TestVlXreXX<4>(0x6280d407);  // vl4re16.v v8, (x1)
2151   TestVlXreXX<8>(0xe280d407);  // vl8re16.v v8, (x1)
2152 
2153   TestVlXreXX<1>(0x280e407);   // vl1re32.v v8, (x1)
2154   TestVlXreXX<2>(0x2280e407);  // vl2re32.v v8, (x1)
2155   TestVlXreXX<4>(0x6280e407);  // vl4re32.v v8, (x1)
2156   TestVlXreXX<8>(0xe280e407);  // vl8re32.v v8, (x1)
2157 
2158   TestVlXreXX<1>(0x280f407);   // vl1re64.v v8, (x1)
2159   TestVlXreXX<2>(0x2280f407);  // vl2re64.v v8, (x1)
2160   TestVlXreXX<4>(0x6280f407);  // vl4re64.v v8, (x1)
2161   TestVlXreXX<8>(0xe280f407);  // vl8re64.v v8, (x1)
2162 }
2163 
TEST_F(Riscv64InterpreterTest,TestVmXr)2164 TEST_F(Riscv64InterpreterTest, TestVmXr) {
2165   TestVmvXr<1>(0x9f003457);  // Vmv1r.v v8, v16
2166   TestVmvXr<2>(0x9f00b457);  // Vmv2r.v v8, v16
2167   TestVmvXr<4>(0x9f01b457);  // Vmv4r.v v8, v16
2168   TestVmvXr<8>(0x9f03b457);  // Vmv8r.v v8, v16
2169 }
2170 
TEST_F(Riscv64InterpreterTest,TestVfrsqrt7)2171 TEST_F(Riscv64InterpreterTest, TestVfrsqrt7) {
2172   TestVectorFloatInstruction(0x4d821457,  // Vfrsqrt7.v v8, v24, v0.t
2173                              {{0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000},
2174                               {0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000},
2175                               {0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000},
2176                               {0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000},
2177                               {0x53fb'8000, 0x4ff4'8000, 0x5bed'8000, 0x57e7'8000},
2178                               {0x43e2'0000, 0x3fdc'8000, 0x4bd7'8000, 0x47d3'0000},
2179                               {0x33ce'8000, 0x2fca'8000, 0x3bc6'8000, 0x37c3'0000},
2180                               {0x23bf'8000, 0x1fbc'8000, 0x2bb9'0000, 0x27b6'8000}},
2181                              {{0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000},
2182                               {0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000},
2183                               {0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000},
2184                               {0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000},
2185                               {0x50a1'1000'0000'0000, 0x5898'3000'0000'0000},
2186                               {0x4091'1000'0000'0000, 0x4888'2000'0000'0000},
2187                               {0x3081'0000'0000'0000, 0x3878'1000'0000'0000},
2188                               {0x2071'0000'0000'0000, 0x2868'0000'0000'0000}},
2189                              kVectorCalculationsSource);
2190 }
2191 
TEST_F(Riscv64InterpreterTest,TestVfclass)2192 TEST_F(Riscv64InterpreterTest, TestVfclass) {
2193   TestVectorFloatInstruction(0x4d881457,  // Vfclass.v v8, v24, v0.t
2194                              {{0x0000'0010, 0x0000'0008, 0x0000'0002, 0x0000'0002},
2195                               {0x0000'0010, 0x0000'0010, 0x0000'0002, 0x0000'0002},
2196                               {0x0000'0010, 0x0000'0200, 0x0000'0080, 0x0000'0001},
2197                               {0x0000'0010, 0x0000'0200, 0x0000'0002, 0x0000'0002},
2198                               {0x0000'0040, 0x0000'0040, 0x0000'0040, 0x0000'0040},
2199                               {0x0000'0040, 0x0000'0040, 0x0000'0040, 0x0000'0040},
2200                               {0x0000'0040, 0x0000'0040, 0x0000'0040, 0x0000'0040},
2201                               {0x0000'0100, 0x0000'0100, 0x0000'0200, 0x0000'0200}},
2202                              {{0x0000'0000'0000'0008, 0x0000'0000'0000'0002},
2203                               {0x0000'0000'0000'0010, 0x0000'0000'0000'0002},
2204                               {0x0000'0000'0000'0080, 0x0000'0000'0000'0002},
2205                               {0x0000'0000'0000'0001, 0x0000'0000'0000'0002},
2206                               {0x0000'0000'0000'0040, 0x0000'0000'0000'0040},
2207                               {0x0000'0000'0000'0040, 0x0000'0000'0000'0040},
2208                               {0x0000'0000'0000'0040, 0x0000'0000'0000'0040},
2209                               {0x0000'0000'0000'0040, 0x0000'0000'0000'0100}},
2210                              kVfClassSource);
2211 }
2212 
TEST_F(Riscv64InterpreterTest,TestVfmvfs)2213 TEST_F(Riscv64InterpreterTest, TestVfmvfs) {
2214   TestVfmvfs<intrinsics::Float32>(0x428010d7, 0xffff'ffff'8302'8100);  // Vfmv.f.s f1, v8
2215   TestVfmvfs<intrinsics::Float64>(0x428010d7, 0x8706'8504'8302'8100);  // Vfmv.f.s f1, v8
2216 }
2217 
TEST_F(Riscv64InterpreterTest,TestVfmvsf)2218 TEST_F(Riscv64InterpreterTest, TestVfmvsf) {
2219   TestVfmvsf<intrinsics::Float32>(0x4200d457,  // Vfmv.s.f v8, f1
2220                                   0xffff'ffff'40b4'0000,
2221                                   intrinsics::Float32{5.625f});
2222   TestVfmvsf<intrinsics::Float64>(0x4200d457,  // Vfmv.s.f v8, f1
2223                                   0x4016'8000'0000'0000,
2224                                   intrinsics::Float64{5.625});
2225 }
2226 
TEST_F(Riscv64InterpreterTest,TestVmvsx)2227 TEST_F(Riscv64InterpreterTest, TestVmvsx) {
2228   TestVmvsx<Int8>(0x4200e457);   // Vmv.s.x v8, x1
2229   TestVmvsx<Int16>(0x4200e457);  // Vmv.s.x v8, x1
2230   TestVmvsx<Int32>(0x4200e457);  // Vmv.s.x v8, x1
2231   TestVmvsx<Int64>(0x4200e457);  // Vmv.s.x v8, x1
2232 }
2233 
TEST_F(Riscv64InterpreterTest,TestVmvxs)2234 TEST_F(Riscv64InterpreterTest, TestVmvxs) {
2235   TestVmvxs<Int8>(0x428020d7, 0);                       // Vmv.x.s x1, v8
2236   TestVmvxs<Int16>(0x428020d7, 0xffff'ffff'ffff'8100);  // Vmv.x.s x1, v8
2237   TestVmvxs<Int32>(0x428020d7, 0xffff'ffff'8302'8100);  // Vmv.x.s x1, v8
2238   TestVmvxs<Int64>(0x428020d7, 0x8706'8504'8302'8100);  // Vmv.x.s x1, v8
2239 }
2240 
TEST_F(Riscv64InterpreterTest,TestVsX)2241 TEST_F(Riscv64InterpreterTest, TestVsX) {
2242   TestVsX<1>(0x2808427);   // vs1r.v v8, (x1)
2243   TestVsX<2>(0x22808427);  // vs2r.v v8, (x1)
2244   TestVsX<4>(0x62808427);  // vs4r.v v8, (x1)
2245   TestVsX<8>(0xe2808427);  // vs8r.v v8, (x1)
2246 }
2247 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew8_vlmul1)2248 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew8_vlmul1) {
2249   VlxsegXeiXX<UInt8, 1, 1>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2250                            {{129, 0, 131, 2, 135, 133, 4, 6, 137, 14, 143, 139, 141, 12, 8, 10}});
2251 }
2252 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew8_vlmul2)2253 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew8_vlmul2) {
2254   VlxsegXeiXX<UInt8, 1, 2>(
2255       0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2256       {{129, 0, 131, 2, 135, 133, 4, 6, 137, 14, 143, 139, 141, 12, 8, 10},
2257        {30, 159, 145, 22, 18, 26, 153, 147, 157, 28, 16, 149, 155, 24, 20, 151}});
2258 }
2259 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew8_vlmul4)2260 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew8_vlmul4) {
2261   VlxsegXeiXX<UInt8, 1, 4>(
2262       0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2263       {{129, 0, 131, 2, 135, 133, 4, 6, 137, 14, 143, 139, 141, 12, 8, 10},
2264        {30, 159, 145, 22, 18, 26, 153, 147, 157, 28, 16, 149, 155, 24, 20, 151},
2265        {44, 50, 52, 34, 189, 38, 54, 171, 42, 191, 185, 40, 36, 46, 167, 175},
2266        {163, 169, 62, 187, 60, 179, 183, 181, 161, 32, 58, 177, 56, 165, 173, 48}});
2267 }
2268 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew8_vlmul8)2269 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew8_vlmul8) {
2270   VlxsegXeiXX<UInt8, 1, 8>(
2271       0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2272       {{129, 0, 131, 2, 135, 133, 4, 6, 137, 14, 143, 139, 141, 12, 8, 10},
2273        {30, 159, 145, 22, 18, 26, 153, 147, 157, 28, 16, 149, 155, 24, 20, 151},
2274        {44, 50, 52, 34, 189, 38, 54, 171, 42, 191, 185, 40, 36, 46, 167, 175},
2275        {163, 169, 62, 187, 60, 179, 183, 181, 161, 32, 58, 177, 56, 165, 173, 48},
2276        {124, 92, 78, 229, 114, 217, 203, 64, 98, 112, 239, 118, 249, 102, 201, 233},
2277        {237, 68, 231, 72, 110, 207, 247, 96, 251, 213, 90, 126, 66, 197, 120, 225},
2278        {241, 76, 100, 195, 253, 245, 193, 84, 104, 122, 199, 209, 227, 70, 219, 86},
2279        {243, 255, 205, 235, 74, 221, 80, 106, 215, 94, 211, 223, 116, 108, 82, 88}});
2280 }
2281 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew8_vlmul1)2282 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew8_vlmul1) {
2283   VlxsegXeiXX<UInt8, 2, 1>(
2284       0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2285       {{2, 0, 6, 4, 14, 10, 8, 12, 18, 28, 30, 22, 26, 24, 16, 20},
2286        {131, 129, 135, 133, 143, 139, 137, 141, 147, 157, 159, 151, 155, 153, 145, 149}});
2287 }
2288 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew8_vlmul2)2289 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew8_vlmul2) {
2290   VlxsegXeiXX<UInt8, 2, 2>(
2291       0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2292       {{2, 0, 6, 4, 14, 10, 8, 12, 18, 28, 30, 22, 26, 24, 16, 20},
2293        {60, 62, 34, 44, 36, 52, 50, 38, 58, 56, 32, 42, 54, 48, 40, 46},
2294        {131, 129, 135, 133, 143, 139, 137, 141, 147, 157, 159, 151, 155, 153, 145, 149},
2295        {189, 191, 163, 173, 165, 181, 179, 167, 187, 185, 161, 171, 183, 177, 169, 175}});
2296 }
2297 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew8_vlmul4)2298 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew8_vlmul4) {
2299   VlxsegXeiXX<UInt8, 2, 4>(
2300       0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2301       {{2, 0, 6, 4, 14, 10, 8, 12, 18, 28, 30, 22, 26, 24, 16, 20},
2302        {60, 62, 34, 44, 36, 52, 50, 38, 58, 56, 32, 42, 54, 48, 40, 46},
2303        {88, 100, 104, 68, 122, 76, 108, 86, 84, 126, 114, 80, 72, 92, 78, 94},
2304        {70, 82, 124, 118, 120, 102, 110, 106, 66, 64, 116, 98, 112, 74, 90, 96},
2305        {131, 129, 135, 133, 143, 139, 137, 141, 147, 157, 159, 151, 155, 153, 145, 149},
2306        {189, 191, 163, 173, 165, 181, 179, 167, 187, 185, 161, 171, 183, 177, 169, 175},
2307        {217, 229, 233, 197, 251, 205, 237, 215, 213, 255, 243, 209, 201, 221, 207, 223},
2308        {199, 211, 253, 247, 249, 231, 239, 235, 195, 193, 245, 227, 241, 203, 219, 225}});
2309 }
2310 
TEST_F(Riscv64InterpreterTest,TestVlxseg3eiXX_sew8_vlmul1)2311 TEST_F(Riscv64InterpreterTest, TestVlxseg3eiXX_sew8_vlmul1) {
2312   VlxsegXeiXX<UInt8, 3, 1>(
2313       0x45008407,  // Vluxseg3ei8.v v8, (x1), v16, v0.t
2314       {{131, 0, 137, 6, 149, 143, 12, 18, 155, 42, 173, 161, 167, 36, 24, 30},
2315        {4, 129, 10, 135, 22, 16, 141, 147, 28, 171, 46, 34, 40, 165, 153, 159},
2316        {133, 2, 139, 8, 151, 145, 14, 20, 157, 44, 175, 163, 169, 38, 26, 32}});
2317 }
2318 
TEST_F(Riscv64InterpreterTest,TestVlxseg3eiXX_sew8_vlmul2)2319 TEST_F(Riscv64InterpreterTest, TestVlxseg3eiXX_sew8_vlmul2) {
2320   VlxsegXeiXX<UInt8, 3, 2>(
2321       0x45008407,  // Vluxseg3ei8.v v8, (x1), v16, v0.t
2322       {{131, 0, 137, 6, 149, 143, 12, 18, 155, 42, 173, 161, 167, 36, 24, 30},
2323        {90, 221, 179, 66, 54, 78, 203, 185, 215, 84, 48, 191, 209, 72, 60, 197},
2324        {4, 129, 10, 135, 22, 16, 141, 147, 28, 171, 46, 34, 40, 165, 153, 159},
2325        {219, 94, 52, 195, 183, 207, 76, 58, 88, 213, 177, 64, 82, 201, 189, 70},
2326        {133, 2, 139, 8, 151, 145, 14, 20, 157, 44, 175, 163, 169, 38, 26, 32},
2327        {92, 223, 181, 68, 56, 80, 205, 187, 217, 86, 50, 193, 211, 74, 62, 199}});
2328 }
2329 
TEST_F(Riscv64InterpreterTest,TestVlxseg4eiXX_sew8_vlmul1)2330 TEST_F(Riscv64InterpreterTest, TestVlxseg4eiXX_sew8_vlmul1) {
2331   VlxsegXeiXX<UInt8, 4, 1>(
2332       0x65008407,  // Vluxseg4ei8.v v8, (x1), v16, v0.t
2333       {{4, 0, 12, 8, 28, 20, 16, 24, 36, 56, 60, 44, 52, 48, 32, 40},
2334        {133, 129, 141, 137, 157, 149, 145, 153, 165, 185, 189, 173, 181, 177, 161, 169},
2335        {6, 2, 14, 10, 30, 22, 18, 26, 38, 58, 62, 46, 54, 50, 34, 42},
2336        {135, 131, 143, 139, 159, 151, 147, 155, 167, 187, 191, 175, 183, 179, 163, 171}});
2337 }
2338 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew4_vlmul2)2339 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew4_vlmul2) {
2340   VlxsegXeiXX<UInt8, 4, 2>(
2341       0x65008407,  // Vluxseg4ei8.v v8, (x1), v16, v0.t
2342       {{4, 0, 12, 8, 28, 20, 16, 24, 36, 56, 60, 44, 52, 48, 32, 40},
2343        {120, 124, 68, 88, 72, 104, 100, 76, 116, 112, 64, 84, 108, 96, 80, 92},
2344        {133, 129, 141, 137, 157, 149, 145, 153, 165, 185, 189, 173, 181, 177, 161, 169},
2345        {249, 253, 197, 217, 201, 233, 229, 205, 245, 241, 193, 213, 237, 225, 209, 221},
2346        {6, 2, 14, 10, 30, 22, 18, 26, 38, 58, 62, 46, 54, 50, 34, 42},
2347        {122, 126, 70, 90, 74, 106, 102, 78, 118, 114, 66, 86, 110, 98, 82, 94},
2348        {135, 131, 143, 139, 159, 151, 147, 155, 167, 187, 191, 175, 183, 179, 163, 171},
2349        {251, 255, 199, 219, 203, 235, 231, 207, 247, 243, 195, 215, 239, 227, 211, 223}});
2350 }
2351 
TEST_F(Riscv64InterpreterTest,TestVlxseg5eiXX_sew8)2352 TEST_F(Riscv64InterpreterTest, TestVlxseg5eiXX_sew8) {
2353   VlxsegXeiXX<UInt8, 5, 1>(
2354       0x85008407,  // Vluxseg5ei8.v v8, (x1), v16, v0.t
2355       {{133, 0, 143, 10, 163, 153, 20, 30, 173, 70, 203, 183, 193, 60, 40, 50},
2356        {6, 129, 16, 139, 36, 26, 149, 159, 46, 199, 76, 56, 66, 189, 169, 179},
2357        {135, 2, 145, 12, 165, 155, 22, 32, 175, 72, 205, 185, 195, 62, 42, 52},
2358        {8, 131, 18, 141, 38, 28, 151, 161, 48, 201, 78, 58, 68, 191, 171, 181},
2359        {137, 4, 147, 14, 167, 157, 24, 34, 177, 74, 207, 187, 197, 64, 44, 54}});
2360 }
2361 
TEST_F(Riscv64InterpreterTest,TestVlxseg6eiXX_sew8)2362 TEST_F(Riscv64InterpreterTest, TestVlxseg6eiXX_sew8) {
2363   VlxsegXeiXX<UInt8, 6, 1>(
2364       0xa5008407,  // Vluxseg6ei8.v v8, (x1), v16, v0.t
2365       {{6, 0, 18, 12, 42, 30, 24, 36, 54, 84, 90, 66, 78, 72, 48, 60},
2366        {135, 129, 147, 141, 171, 159, 153, 165, 183, 213, 219, 195, 207, 201, 177, 189},
2367        {8, 2, 20, 14, 44, 32, 26, 38, 56, 86, 92, 68, 80, 74, 50, 62},
2368        {137, 131, 149, 143, 173, 161, 155, 167, 185, 215, 221, 197, 209, 203, 179, 191},
2369        {10, 4, 22, 16, 46, 34, 28, 40, 58, 88, 94, 70, 82, 76, 52, 64},
2370        {139, 133, 151, 145, 175, 163, 157, 169, 187, 217, 223, 199, 211, 205, 181, 193}});
2371 }
2372 
TEST_F(Riscv64InterpreterTest,TestVlxseg7eiXX_sew8)2373 TEST_F(Riscv64InterpreterTest, TestVlxseg7eiXX_sew8) {
2374   VlxsegXeiXX<UInt8, 7, 1>(
2375       0xc5008407,  // Vluxseg7ei8.v v8, (x1), v16, v0.t
2376       {{135, 0, 149, 14, 177, 163, 28, 42, 191, 98, 233, 205, 219, 84, 56, 70},
2377        {8, 129, 22, 143, 50, 36, 157, 171, 64, 227, 106, 78, 92, 213, 185, 199},
2378        {137, 2, 151, 16, 179, 165, 30, 44, 193, 100, 235, 207, 221, 86, 58, 72},
2379        {10, 131, 24, 145, 52, 38, 159, 173, 66, 229, 108, 80, 94, 215, 187, 201},
2380        {139, 4, 153, 18, 181, 167, 32, 46, 195, 102, 237, 209, 223, 88, 60, 74},
2381        {12, 133, 26, 147, 54, 40, 161, 175, 68, 231, 110, 82, 96, 217, 189, 203},
2382        {141, 6, 155, 20, 183, 169, 34, 48, 197, 104, 239, 211, 225, 90, 62, 76}});
2383 }
2384 
TEST_F(Riscv64InterpreterTest,TestVlxseg8eiXX_sew8)2385 TEST_F(Riscv64InterpreterTest, TestVlxseg8eiXX_sew8) {
2386   VlxsegXeiXX<UInt8, 8, 1>(
2387       0xe5008407,  // Vluxseg8ei8.v v8, (x1), v16, v0.t
2388       {{8, 0, 24, 16, 56, 40, 32, 48, 72, 112, 120, 88, 104, 96, 64, 80},
2389        {137, 129, 153, 145, 185, 169, 161, 177, 201, 241, 249, 217, 233, 225, 193, 209},
2390        {10, 2, 26, 18, 58, 42, 34, 50, 74, 114, 122, 90, 106, 98, 66, 82},
2391        {139, 131, 155, 147, 187, 171, 163, 179, 203, 243, 251, 219, 235, 227, 195, 211},
2392        {12, 4, 28, 20, 60, 44, 36, 52, 76, 116, 124, 92, 108, 100, 68, 84},
2393        {141, 133, 157, 149, 189, 173, 165, 181, 205, 245, 253, 221, 237, 229, 197, 213},
2394        {14, 6, 30, 22, 62, 46, 38, 54, 78, 118, 126, 94, 110, 102, 70, 86},
2395        {143, 135, 159, 151, 191, 175, 167, 183, 207, 247, 255, 223, 239, 231, 199, 215}});
2396 }
2397 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew16_vlmul1)2398 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew16_vlmul1) {
2399   VlxsegXeiXX<UInt16, 1, 1>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2400                             {{0x8302, 0x8100, 0x8706, 0x8504, 0x8f0e, 0x8b0a, 0x8908, 0x8d0c}});
2401 }
2402 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew16_vlmul2)2403 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew16_vlmul2) {
2404   VlxsegXeiXX<UInt16, 1, 2>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2405                             {{0x8302, 0x8100, 0x8706, 0x8504, 0x8f0e, 0x8b0a, 0x8908, 0x8d0c},
2406                              {0x9312, 0x9d1c, 0x9f1e, 0x9716, 0x9b1a, 0x9918, 0x9110, 0x9514}});
2407 }
2408 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew16_vlmul4)2409 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew16_vlmul4) {
2410   VlxsegXeiXX<UInt16, 1, 4>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2411                             {{0x8302, 0x8100, 0x8706, 0x8504, 0x8f0e, 0x8b0a, 0x8908, 0x8d0c},
2412                              {0x9312, 0x9d1c, 0x9f1e, 0x9716, 0x9b1a, 0x9918, 0x9110, 0x9514},
2413                              {0xbd3c, 0xbf3e, 0xa322, 0xad2c, 0xa524, 0xb534, 0xb332, 0xa726},
2414                              {0xbb3a, 0xb938, 0xa120, 0xab2a, 0xb736, 0xb130, 0xa928, 0xaf2e}});
2415 }
2416 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew16_vlmul8)2417 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew16_vlmul8) {
2418   VlxsegXeiXX<UInt16, 1, 8>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2419                             {{0x8302, 0x8100, 0x8706, 0x8504, 0x8f0e, 0x8b0a, 0x8908, 0x8d0c},
2420                              {0x9312, 0x9d1c, 0x9f1e, 0x9716, 0x9b1a, 0x9918, 0x9110, 0x9514},
2421                              {0xbd3c, 0xbf3e, 0xa322, 0xad2c, 0xa524, 0xb534, 0xb332, 0xa726},
2422                              {0xbb3a, 0xb938, 0xa120, 0xab2a, 0xb736, 0xb130, 0xa928, 0xaf2e},
2423                              {0xd958, 0xe564, 0xe968, 0xc544, 0xfb7a, 0xcd4c, 0xed6c, 0xd756},
2424                              {0xd554, 0xff7e, 0xf372, 0xd150, 0xc948, 0xdd5c, 0xcf4e, 0xdf5e},
2425                              {0xc746, 0xd352, 0xfd7c, 0xf776, 0xf978, 0xe766, 0xef6e, 0xeb6a},
2426                              {0xc342, 0xc140, 0xf574, 0xe362, 0xf170, 0xcb4a, 0xdb5a, 0xe160}});
2427 }
2428 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew16_vlmul1)2429 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew16_vlmul1) {
2430   VlxsegXeiXX<UInt16, 2, 1>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2431                             {{0x8504, 0x8100, 0x8d0c, 0x8908, 0x9d1c, 0x9514, 0x9110, 0x9918},
2432                              {0x8706, 0x8302, 0x8f0e, 0x8b0a, 0x9f1e, 0x9716, 0x9312, 0x9b1a}});
2433 }
2434 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew16_vlmul2)2435 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew16_vlmul2) {
2436   VlxsegXeiXX<UInt16, 2, 2>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2437                             {{0x8504, 0x8100, 0x8d0c, 0x8908, 0x9d1c, 0x9514, 0x9110, 0x9918},
2438                              {0xa524, 0xb938, 0xbd3c, 0xad2c, 0xb534, 0xb130, 0xa120, 0xa928},
2439                              {0x8706, 0x8302, 0x8f0e, 0x8b0a, 0x9f1e, 0x9716, 0x9312, 0x9b1a},
2440                              {0xa726, 0xbb3a, 0xbf3e, 0xaf2e, 0xb736, 0xb332, 0xa322, 0xab2a}});
2441 }
2442 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew16_vlmul4)2443 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew16_vlmul4) {
2444   VlxsegXeiXX<UInt16, 2, 4>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2445                             {{0x8504, 0x8100, 0x8d0c, 0x8908, 0x9d1c, 0x9514, 0x9110, 0x9918},
2446                              {0xa524, 0xb938, 0xbd3c, 0xad2c, 0xb534, 0xb130, 0xa120, 0xa928},
2447                              {0xf978, 0xfd7c, 0xc544, 0xd958, 0xc948, 0xe968, 0xe564, 0xcd4c},
2448                              {0xf574, 0xf170, 0xc140, 0xd554, 0xed6c, 0xe160, 0xd150, 0xdd5c},
2449                              {0x8706, 0x8302, 0x8f0e, 0x8b0a, 0x9f1e, 0x9716, 0x9312, 0x9b1a},
2450                              {0xa726, 0xbb3a, 0xbf3e, 0xaf2e, 0xb736, 0xb332, 0xa322, 0xab2a},
2451                              {0xfb7a, 0xff7e, 0xc746, 0xdb5a, 0xcb4a, 0xeb6a, 0xe766, 0xcf4e},
2452                              {0xf776, 0xf372, 0xc342, 0xd756, 0xef6e, 0xe362, 0xd352, 0xdf5e}});
2453 }
2454 
TEST_F(Riscv64InterpreterTest,TestVlxseg3eiXX_sew16_vlmul1)2455 TEST_F(Riscv64InterpreterTest, TestVlxseg3eiXX_sew16_vlmul1) {
2456   VlxsegXeiXX<UInt16, 3, 1>(0x45008407,  // Vluxseg3ei8.v v8, (x1), v16, v0.t
2457                             {{0x8706, 0x8100, 0x9312, 0x8d0c, 0xab2a, 0x9f1e, 0x9918, 0xa524},
2458                              {0x8908, 0x8302, 0x9514, 0x8f0e, 0xad2c, 0xa120, 0x9b1a, 0xa726},
2459                              {0x8b0a, 0x8504, 0x9716, 0x9110, 0xaf2e, 0xa322, 0x9d1c, 0xa928}});
2460 }
2461 
TEST_F(Riscv64InterpreterTest,TestVlxseg3eiXX_sew16_vlmul2)2462 TEST_F(Riscv64InterpreterTest, TestVlxseg3eiXX_sew16_vlmul2) {
2463   VlxsegXeiXX<UInt16, 3, 2>(0x45008407,  // Vluxseg3ei8.v v8, (x1), v16, v0.t
2464                             {{0x8706, 0x8100, 0x9312, 0x8d0c, 0xab2a, 0x9f1e, 0x9918, 0xa524},
2465                              {0xb736, 0xd554, 0xdb5a, 0xc342, 0xcf4e, 0xc948, 0xb130, 0xbd3c},
2466                              {0x8908, 0x8302, 0x9514, 0x8f0e, 0xad2c, 0xa120, 0x9b1a, 0xa726},
2467                              {0xb938, 0xd756, 0xdd5c, 0xc544, 0xd150, 0xcb4a, 0xb332, 0xbf3e},
2468                              {0x8b0a, 0x8504, 0x9716, 0x9110, 0xaf2e, 0xa322, 0x9d1c, 0xa928},
2469                              {0xbb3a, 0xd958, 0xdf5e, 0xc746, 0xd352, 0xcd4c, 0xb534, 0xc140}});
2470 }
2471 
TEST_F(Riscv64InterpreterTest,TestVlxseg4eiXX_sew16_vlmul1)2472 TEST_F(Riscv64InterpreterTest, TestVlxseg4eiXX_sew16_vlmul1) {
2473   VlxsegXeiXX<UInt16, 4, 1>(0x65008407,  // Vluxseg4ei8.v v8, (x1), v16, v0.t
2474                             {{0x8908, 0x8100, 0x9918, 0x9110, 0xb938, 0xa928, 0xa120, 0xb130},
2475                              {0x8b0a, 0x8302, 0x9b1a, 0x9312, 0xbb3a, 0xab2a, 0xa322, 0xb332},
2476                              {0x8d0c, 0x8504, 0x9d1c, 0x9514, 0xbd3c, 0xad2c, 0xa524, 0xb534},
2477                              {0x8f0e, 0x8706, 0x9f1e, 0x9716, 0xbf3e, 0xaf2e, 0xa726, 0xb736}});
2478 }
2479 
TEST_F(Riscv64InterpreterTest,TestVlxseg4eiXX_sew16_vlmul2)2480 TEST_F(Riscv64InterpreterTest, TestVlxseg4eiXX_sew16_vlmul2) {
2481   VlxsegXeiXX<UInt16, 4, 2>(0x65008407,  // Vluxseg4ei8.v v8, (x1), v16, v0.t
2482                             {{0x8908, 0x8100, 0x9918, 0x9110, 0xb938, 0xa928, 0xa120, 0xb130},
2483                              {0xc948, 0xf170, 0xf978, 0xd958, 0xe968, 0xe160, 0xc140, 0xd150},
2484                              {0x8b0a, 0x8302, 0x9b1a, 0x9312, 0xbb3a, 0xab2a, 0xa322, 0xb332},
2485                              {0xcb4a, 0xf372, 0xfb7a, 0xdb5a, 0xeb6a, 0xe362, 0xc342, 0xd352},
2486                              {0x8d0c, 0x8504, 0x9d1c, 0x9514, 0xbd3c, 0xad2c, 0xa524, 0xb534},
2487                              {0xcd4c, 0xf574, 0xfd7c, 0xdd5c, 0xed6c, 0xe564, 0xc544, 0xd554},
2488                              {0x8f0e, 0x8706, 0x9f1e, 0x9716, 0xbf3e, 0xaf2e, 0xa726, 0xb736},
2489                              {0xcf4e, 0xf776, 0xff7e, 0xdf5e, 0xef6e, 0xe766, 0xc746, 0xd756}});
2490 }
2491 
TEST_F(Riscv64InterpreterTest,TestVlxseg5eiXX_sew16)2492 TEST_F(Riscv64InterpreterTest, TestVlxseg5eiXX_sew16) {
2493   VlxsegXeiXX<UInt16, 5, 1>(0x85008407,  // Vluxseg5ei8.v v8, (x1), v16, v0.t
2494                             {{0x8b0a, 0x8100, 0x9f1e, 0x9514, 0xc746, 0xb332, 0xa928, 0xbd3c},
2495                              {0x8d0c, 0x8302, 0xa120, 0x9716, 0xc948, 0xb534, 0xab2a, 0xbf3e},
2496                              {0x8f0e, 0x8504, 0xa322, 0x9918, 0xcb4a, 0xb736, 0xad2c, 0xc140},
2497                              {0x9110, 0x8706, 0xa524, 0x9b1a, 0xcd4c, 0xb938, 0xaf2e, 0xc342},
2498                              {0x9312, 0x8908, 0xa726, 0x9d1c, 0xcf4e, 0xbb3a, 0xb130, 0xc544}});
2499 }
2500 
TEST_F(Riscv64InterpreterTest,TestVlxseg6eiXX_sew16)2501 TEST_F(Riscv64InterpreterTest, TestVlxseg6eiXX_sew16) {
2502   VlxsegXeiXX<UInt16, 6, 1>(0xa5008407,  // Vluxseg6ei8.v v8, (x1), v16, v0.t
2503                             {{0x8d0c, 0x8100, 0xa524, 0x9918, 0xd554, 0xbd3c, 0xb130, 0xc948},
2504                              {0x8f0e, 0x8302, 0xa726, 0x9b1a, 0xd756, 0xbf3e, 0xb332, 0xcb4a},
2505                              {0x9110, 0x8504, 0xa928, 0x9d1c, 0xd958, 0xc140, 0xb534, 0xcd4c},
2506                              {0x9312, 0x8706, 0xab2a, 0x9f1e, 0xdb5a, 0xc342, 0xb736, 0xcf4e},
2507                              {0x9514, 0x8908, 0xad2c, 0xa120, 0xdd5c, 0xc544, 0xb938, 0xd150},
2508                              {0x9716, 0x8b0a, 0xaf2e, 0xa322, 0xdf5e, 0xc746, 0xbb3a, 0xd352}});
2509 }
2510 
TEST_F(Riscv64InterpreterTest,TestVlxseg7eiXX_sew16)2511 TEST_F(Riscv64InterpreterTest, TestVlxseg7eiXX_sew16) {
2512   VlxsegXeiXX<UInt16, 7, 1>(0xc5008407,  // Vluxseg7ei8.v v8, (x1), v16, v0.t
2513                             {{0x8f0e, 0x8100, 0xab2a, 0x9d1c, 0xe362, 0xc746, 0xb938, 0xd554},
2514                              {0x9110, 0x8302, 0xad2c, 0x9f1e, 0xe564, 0xc948, 0xbb3a, 0xd756},
2515                              {0x9312, 0x8504, 0xaf2e, 0xa120, 0xe766, 0xcb4a, 0xbd3c, 0xd958},
2516                              {0x9514, 0x8706, 0xb130, 0xa322, 0xe968, 0xcd4c, 0xbf3e, 0xdb5a},
2517                              {0x9716, 0x8908, 0xb332, 0xa524, 0xeb6a, 0xcf4e, 0xc140, 0xdd5c},
2518                              {0x9918, 0x8b0a, 0xb534, 0xa726, 0xed6c, 0xd150, 0xc342, 0xdf5e},
2519                              {0x9b1a, 0x8d0c, 0xb736, 0xa928, 0xef6e, 0xd352, 0xc544, 0xe160}});
2520 }
2521 
TEST_F(Riscv64InterpreterTest,TestVlxseg8eiXX_sew16)2522 TEST_F(Riscv64InterpreterTest, TestVlxseg8eiXX_sew16) {
2523   VlxsegXeiXX<UInt16, 8, 1>(0xe5008407,  // Vluxseg8ei8.v v8, (x1), v16, v0.t
2524                             {{0x9110, 0x8100, 0xb130, 0xa120, 0xf170, 0xd150, 0xc140, 0xe160},
2525                              {0x9312, 0x8302, 0xb332, 0xa322, 0xf372, 0xd352, 0xc342, 0xe362},
2526                              {0x9514, 0x8504, 0xb534, 0xa524, 0xf574, 0xd554, 0xc544, 0xe564},
2527                              {0x9716, 0x8706, 0xb736, 0xa726, 0xf776, 0xd756, 0xc746, 0xe766},
2528                              {0x9918, 0x8908, 0xb938, 0xa928, 0xf978, 0xd958, 0xc948, 0xe968},
2529                              {0x9b1a, 0x8b0a, 0xbb3a, 0xab2a, 0xfb7a, 0xdb5a, 0xcb4a, 0xeb6a},
2530                              {0x9d1c, 0x8d0c, 0xbd3c, 0xad2c, 0xfd7c, 0xdd5c, 0xcd4c, 0xed6c},
2531                              {0x9f1e, 0x8f0e, 0xbf3e, 0xaf2e, 0xff7e, 0xdf5e, 0xcf4e, 0xef6e}});
2532 }
2533 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew32_vlmul1)2534 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew32_vlmul1) {
2535   VlxsegXeiXX<UInt32, 1, 1>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2536                             {{0x8706'8504, 0x8302'8100, 0x8f0e'8d0c, 0x8b0a'8908}});
2537 }
2538 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew32_vlmul2)2539 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew32_vlmul2) {
2540   VlxsegXeiXX<UInt32, 1, 2>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2541                             {{0x8706'8504, 0x8302'8100, 0x8f0e'8d0c, 0x8b0a'8908},
2542                              {0x9f1e'9d1c, 0x9716'9514, 0x9312'9110, 0x9b1a'9918}});
2543 }
2544 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew32_vlmul4)2545 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew32_vlmul4) {
2546   VlxsegXeiXX<UInt32, 1, 4>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2547                             {{0x8706'8504, 0x8302'8100, 0x8f0e'8d0c, 0x8b0a'8908},
2548                              {0x9f1e'9d1c, 0x9716'9514, 0x9312'9110, 0x9b1a'9918},
2549                              {0xa726'a524, 0xbb3a'b938, 0xbf3e'bd3c, 0xaf2e'ad2c},
2550                              {0xb736'b534, 0xb332'b130, 0xa322'a120, 0xab2a'a928}});
2551 }
2552 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew32_vlmul8)2553 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew32_vlmul8) {
2554   VlxsegXeiXX<UInt32, 1, 8>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2555                             {{0x8706'8504, 0x8302'8100, 0x8f0e'8d0c, 0x8b0a'8908},
2556                              {0x9f1e'9d1c, 0x9716'9514, 0x9312'9110, 0x9b1a'9918},
2557                              {0xa726'a524, 0xbb3a'b938, 0xbf3e'bd3c, 0xaf2e'ad2c},
2558                              {0xb736'b534, 0xb332'b130, 0xa322'a120, 0xab2a'a928},
2559                              {0xfb7a'f978, 0xff7e'fd7c, 0xc746'c544, 0xdb5a'd958},
2560                              {0xcb4a'c948, 0xeb6a'e968, 0xe766'e564, 0xcf4e'cd4c},
2561                              {0xf776'f574, 0xf372'f170, 0xc342'c140, 0xd756'd554},
2562                              {0xef6e'ed6c, 0xe362'e160, 0xd352'd150, 0xdf5e'dd5c}});
2563 }
2564 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew32_vlmul1)2565 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew32_vlmul1) {
2566   VlxsegXeiXX<UInt32, 2, 1>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2567                             {{0x8b0a'8908, 0x8302'8100, 0x9b1a'9918, 0x9312'9110},
2568                              {0x8f0e'8d0c, 0x8706'8504, 0x9f1e'9d1c, 0x9716'9514}});
2569 }
2570 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew32_vlmul2)2571 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew32_vlmul2) {
2572   VlxsegXeiXX<UInt32, 2, 2>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2573                             {{0x8b0a'8908, 0x8302'8100, 0x9b1a'9918, 0x9312'9110},
2574                              {0xbb3a'b938, 0xab2a'a928, 0xa322'a120, 0xb332'b130},
2575                              {0x8f0e'8d0c, 0x8706'8504, 0x9f1e'9d1c, 0x9716'9514},
2576                              {0xbf3e'bd3c, 0xaf2e'ad2c, 0xa726'a524, 0xb736'b534}});
2577 }
2578 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew32_vlmul4)2579 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew32_vlmul4) {
2580   VlxsegXeiXX<UInt32, 2, 4>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2581                             {{0x8b0a'8908, 0x8302'8100, 0x9b1a'9918, 0x9312'9110},
2582                              {0xbb3a'b938, 0xab2a'a928, 0xa322'a120, 0xb332'b130},
2583                              {0xcb4a'c948, 0xf372'f170, 0xfb7a'f978, 0xdb5a'd958},
2584                              {0xeb6a'e968, 0xe362'e160, 0xc342'c140, 0xd352'd150},
2585                              {0x8f0e'8d0c, 0x8706'8504, 0x9f1e'9d1c, 0x9716'9514},
2586                              {0xbf3e'bd3c, 0xaf2e'ad2c, 0xa726'a524, 0xb736'b534},
2587                              {0xcf4e'cd4c, 0xf776'f574, 0xff7e'fd7c, 0xdf5e'dd5c},
2588                              {0xef6e'ed6c, 0xe766'e564, 0xc746'c544, 0xd756'd554}});
2589 }
2590 
TEST_F(Riscv64InterpreterTest,TestVlxseg3eiXX_sew32_vlmul1)2591 TEST_F(Riscv64InterpreterTest, TestVlxseg3eiXX_sew32_vlmul1) {
2592   VlxsegXeiXX<UInt32, 3, 1>(0x45008407,  // Vluxseg3ei8.v v8, (x1), v16, v0.t
2593                             {{0x8f0e'8d0c, 0x8302'8100, 0xa726'a524, 0x9b1a'9918},
2594                              {0x9312'9110, 0x8706'8504, 0xab2a'a928, 0x9f1e'9d1c},
2595                              {0x9716'9514, 0x8b0a'8908, 0xaf2e'ad2c, 0xa322'a120}});
2596 }
2597 
TEST_F(Riscv64InterpreterTest,TestVlxseg3eiXX_sew32_vlmul2)2598 TEST_F(Riscv64InterpreterTest, TestVlxseg3eiXX_sew32_vlmul2) {
2599   VlxsegXeiXX<UInt32, 3, 2>(0x45008407,  // Vluxseg3ei8.v v8, (x1), v16, v0.t
2600                             {{0x8f0e'8d0c, 0x8302'8100, 0xa726'a524, 0x9b1a'9918},
2601                              {0xd756'd554, 0xbf3e'bd3c, 0xb332'b130, 0xcb4a'c948},
2602                              {0x9312'9110, 0x8706'8504, 0xab2a'a928, 0x9f1e'9d1c},
2603                              {0xdb5a'd958, 0xc342'c140, 0xb736'b534, 0xcf4e'cd4c},
2604                              {0x9716'9514, 0x8b0a'8908, 0xaf2e'ad2c, 0xa322'a120},
2605                              {0xdf5e'dd5c, 0xc746'c544, 0xbb3a'b938, 0xd352'd150}});
2606 }
2607 
TEST_F(Riscv64InterpreterTest,TestVlxseg4eiXX_sew32_vlmul1)2608 TEST_F(Riscv64InterpreterTest, TestVlxseg4eiXX_sew32_vlmul1) {
2609   VlxsegXeiXX<UInt32, 4, 1>(0x65008407,  // Vluxseg4ei8.v v8, (x1), v16, v0.t
2610                             {{0x9312'9110, 0x8302'8100, 0xb332'b130, 0xa322'a120},
2611                              {0x9716'9514, 0x8706'8504, 0xb736'b534, 0xa726'a524},
2612                              {0x9b1a'9918, 0x8b0a'8908, 0xbb3a'b938, 0xab2a'a928},
2613                              {0x9f1e'9d1c, 0x8f0e'8d0c, 0xbf3e'bd3c, 0xaf2e'ad2c}});
2614 }
2615 
TEST_F(Riscv64InterpreterTest,TestVlxseg4eiXX_sew32_vlmul2)2616 TEST_F(Riscv64InterpreterTest, TestVlxseg4eiXX_sew32_vlmul2) {
2617   VlxsegXeiXX<UInt32, 4, 2>(0x65008407,  // Vluxseg4ei8.v v8, (x1), v16, v0.t
2618                             {{0x9312'9110, 0x8302'8100, 0xb332'b130, 0xa322'a120},
2619                              {0xf372'f170, 0xd352'd150, 0xc342'c140, 0xe362'e160},
2620                              {0x9716'9514, 0x8706'8504, 0xb736'b534, 0xa726'a524},
2621                              {0xf776'f574, 0xd756'd554, 0xc746'c544, 0xe766'e564},
2622                              {0x9b1a'9918, 0x8b0a'8908, 0xbb3a'b938, 0xab2a'a928},
2623                              {0xfb7a'f978, 0xdb5a'd958, 0xcb4a'c948, 0xeb6a'e968},
2624                              {0x9f1e'9d1c, 0x8f0e'8d0c, 0xbf3e'bd3c, 0xaf2e'ad2c},
2625                              {0xff7e'fd7c, 0xdf5e'dd5c, 0xcf4e'cd4c, 0xef6e'ed6c}});
2626 }
2627 
TEST_F(Riscv64InterpreterTest,TestVlxseg5eiXX_sew32)2628 TEST_F(Riscv64InterpreterTest, TestVlxseg5eiXX_sew32) {
2629   VlxsegXeiXX<UInt32, 5, 1>(0x85008407,  // Vluxseg5ei8.v v8, (x1), v16, v0.t
2630                             {{0x9716'9514, 0x8302'8100, 0xbf3e'bd3c, 0xab2a'a928},
2631                              {0x9b1a'9918, 0x8706'8504, 0xc342'c140, 0xaf2e'ad2c},
2632                              {0x9f1e'9d1c, 0x8b0a'8908, 0xc746'c544, 0xb332'b130},
2633                              {0xa322'a120, 0x8f0e'8d0c, 0xcb4a'c948, 0xb736'b534},
2634                              {0xa726'a524, 0x9312'9110, 0xcf4e'cd4c, 0xbb3a'b938}});
2635 }
2636 
TEST_F(Riscv64InterpreterTest,TestVlxseg6eiXX_sew32)2637 TEST_F(Riscv64InterpreterTest, TestVlxseg6eiXX_sew32) {
2638   VlxsegXeiXX<UInt32, 6, 1>(0xa5008407,  // Vluxseg6ei8.v v8, (x1), v16, v0.t
2639                             {{0x9b1a'9918, 0x8302'8100, 0xcb4a'c948, 0xb332'b130},
2640                              {0x9f1e'9d1c, 0x8706'8504, 0xcf4e'cd4c, 0xb736'b534},
2641                              {0xa322'a120, 0x8b0a'8908, 0xd352'd150, 0xbb3a'b938},
2642                              {0xa726'a524, 0x8f0e'8d0c, 0xd756'd554, 0xbf3e'bd3c},
2643                              {0xab2a'a928, 0x9312'9110, 0xdb5a'd958, 0xc342'c140},
2644                              {0xaf2e'ad2c, 0x9716'9514, 0xdf5e'dd5c, 0xc746'c544}});
2645 }
2646 
TEST_F(Riscv64InterpreterTest,TestVlxseg7eiXX_sew32)2647 TEST_F(Riscv64InterpreterTest, TestVlxseg7eiXX_sew32) {
2648   VlxsegXeiXX<UInt32, 7, 1>(0xc5008407,  // Vluxseg7ei8.v v8, (x1), v16, v0.t
2649                             {{0x9f1e'9d1c, 0x8302'8100, 0xd756'd554, 0xbb3a'b938},
2650                              {0xa322'a120, 0x8706'8504, 0xdb5a'd958, 0xbf3e'bd3c},
2651                              {0xa726'a524, 0x8b0a'8908, 0xdf5e'dd5c, 0xc342'c140},
2652                              {0xab2a'a928, 0x8f0e'8d0c, 0xe362'e160, 0xc746'c544},
2653                              {0xaf2e'ad2c, 0x9312'9110, 0xe766'e564, 0xcb4a'c948},
2654                              {0xb332'b130, 0x9716'9514, 0xeb6a'e968, 0xcf4e'cd4c},
2655                              {0xb736'b534, 0x9b1a'9918, 0xef6e'ed6c, 0xd352'd150}});
2656 }
2657 
TEST_F(Riscv64InterpreterTest,TestVlxseg8eiXX_sew32)2658 TEST_F(Riscv64InterpreterTest, TestVlxseg8eiXX_sew32) {
2659   VlxsegXeiXX<UInt32, 8, 1>(0xe5008407,  // Vluxseg8ei8.v v8, (x1), v16, v0.t
2660                             {{0xa322'a120, 0x8302'8100, 0xe362'e160, 0xc342'c140},
2661                              {0xa726'a524, 0x8706'8504, 0xe766'e564, 0xc746'c544},
2662                              {0xab2a'a928, 0x8b0a'8908, 0xeb6a'e968, 0xcb4a'c948},
2663                              {0xaf2e'ad2c, 0x8f0e'8d0c, 0xef6e'ed6c, 0xcf4e'cd4c},
2664                              {0xb332'b130, 0x9312'9110, 0xf372'f170, 0xd352'd150},
2665                              {0xb736'b534, 0x9716'9514, 0xf776'f574, 0xd756'd554},
2666                              {0xbb3a'b938, 0x9b1a'9918, 0xfb7a'f978, 0xdb5a'd958},
2667                              {0xbf3e'bd3c, 0x9f1e'9d1c, 0xff7e'fd7c, 0xdf5e'dd5c}});
2668 }
2669 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew64_vlmul1)2670 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew64_vlmul1) {
2671   VlxsegXeiXX<UInt64, 1, 1>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2672                             {{0x8f0e'8d0c'8b0a'8908, 0x8706'8504'8302'8100}});
2673 }
2674 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew64_vlmul2)2675 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew64_vlmul2) {
2676   VlxsegXeiXX<UInt64, 1, 2>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2677                             {{0x8f0e'8d0c'8b0a'8908, 0x8706'8504'8302'8100},
2678                              {0x9f1e'9d1c'9b1a'9918, 0x9716'9514'9312'9110}});
2679 }
2680 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew64_vlmul4)2681 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew64_vlmul4) {
2682   VlxsegXeiXX<UInt64, 1, 4>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2683                             {{0x8f0e'8d0c'8b0a'8908, 0x8706'8504'8302'8100},
2684                              {0x9f1e'9d1c'9b1a'9918, 0x9716'9514'9312'9110},
2685                              {0xbf3e'bd3c'bb3a'b938, 0xaf2e'ad2c'ab2a'a928},
2686                              {0xa726'a524'a322'a120, 0xb736'b534'b332'b130}});
2687 }
2688 
TEST_F(Riscv64InterpreterTest,TestVlxeiXX_sew64_vlmul8)2689 TEST_F(Riscv64InterpreterTest, TestVlxeiXX_sew64_vlmul8) {
2690   VlxsegXeiXX<UInt64, 1, 8>(0x05008407,  // Vluxei8.v v8, (x1), v16, v0.t
2691                             {{0x8f0e'8d0c'8b0a'8908, 0x8706'8504'8302'8100},
2692                              {0x9f1e'9d1c'9b1a'9918, 0x9716'9514'9312'9110},
2693                              {0xbf3e'bd3c'bb3a'b938, 0xaf2e'ad2c'ab2a'a928},
2694                              {0xa726'a524'a322'a120, 0xb736'b534'b332'b130},
2695                              {0xcf4e'cd4c'cb4a'c948, 0xf776'f574'f372'f170},
2696                              {0xff7e'fd7c'fb7a'f978, 0xdf5e'dd5c'db5a'd958},
2697                              {0xef6e'ed6c'eb6a'e968, 0xe766'e564'e362'e160},
2698                              {0xc746'c544'c342'c140, 0xd756'd554'd352'd150}});
2699 }
2700 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew64_vlmul1)2701 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew64_vlmul1) {
2702   VlxsegXeiXX<UInt64, 2, 1>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2703                             {{0x9716'9514'9312'9110, 0x8706'8504'8302'8100},
2704                              {0x9f1e'9d1c'9b1a'9918, 0x8f0e'8d0c'8b0a'8908}});
2705 }
2706 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew64_vlmul2)2707 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew64_vlmul2) {
2708   VlxsegXeiXX<UInt64, 2, 2>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2709                             {{0x9716'9514'9312'9110, 0x8706'8504'8302'8100},
2710                              {0xb736'b534'b332'b130, 0xa726'a524'a322'a120},
2711                              {0x9f1e'9d1c'9b1a'9918, 0x8f0e'8d0c'8b0a'8908},
2712                              {0xbf3e'bd3c'bb3a'b938, 0xaf2e'ad2c'ab2a'a928}});
2713 }
2714 
TEST_F(Riscv64InterpreterTest,TestVlxseg2eiXX_sew64_vlmul4)2715 TEST_F(Riscv64InterpreterTest, TestVlxseg2eiXX_sew64_vlmul4) {
2716   VlxsegXeiXX<UInt64, 2, 4>(0x25008407,  // Vluxseg2ei8.v v8, (x1), v16, v0.t
2717                             {{0x9716'9514'9312'9110, 0x8706'8504'8302'8100},
2718                              {0xb736'b534'b332'b130, 0xa726'a524'a322'a120},
2719                              {0xf776'f574'f372'f170, 0xd756'd554'd352'd150},
2720                              {0xc746'c544'c342'c140, 0xe766'e564'e362'e160},
2721                              {0x9f1e'9d1c'9b1a'9918, 0x8f0e'8d0c'8b0a'8908},
2722                              {0xbf3e'bd3c'bb3a'b938, 0xaf2e'ad2c'ab2a'a928},
2723                              {0xff7e'fd7c'fb7a'f978, 0xdf5e'dd5c'db5a'd958},
2724                              {0xcf4e'cd4c'cb4a'c948, 0xef6e'ed6c'eb6a'e968}});
2725 }
2726 
TEST_F(Riscv64InterpreterTest,TestVlxseg3eiXX_sew64_vlmul1)2727 TEST_F(Riscv64InterpreterTest, TestVlxseg3eiXX_sew64_vlmul1) {
2728   VlxsegXeiXX<UInt64, 3, 1>(0x45008407,  // Vluxseg3ei8.v v8, (x1), v16, v0.t
2729                             {{0x9f1e'9d1c'9b1a'9918, 0x8706'8504'8302'8100},
2730                              {0xa726'a524'a322'a120, 0x8f0e'8d0c'8b0a'8908},
2731                              {0xaf2e'ad2c'ab2a'a928, 0x9716'9514'9312'9110}});
2732 }
2733 
TEST_F(Riscv64InterpreterTest,TestVlxseg3eiXX_sew64_vlmul2)2734 TEST_F(Riscv64InterpreterTest, TestVlxseg3eiXX_sew64_vlmul2) {
2735   VlxsegXeiXX<UInt64, 3, 2>(0x45008407,  // Vluxseg3ei8.v v8, (x1), v16, v0.t
2736                             {{0x9f1e'9d1c'9b1a'9918, 0x8706'8504'8302'8100},
2737                              {0xcf4e'cd4c'cb4a'c948, 0xb736'b534'b332'b130},
2738                              {0xa726'a524'a322'a120, 0x8f0e'8d0c'8b0a'8908},
2739                              {0xd756'd554'd352'd150, 0xbf3e'bd3c'bb3a'b938},
2740                              {0xaf2e'ad2c'ab2a'a928, 0x9716'9514'9312'9110},
2741                              {0xdf5e'dd5c'db5a'd958, 0xc746'c544'c342'c140}});
2742 }
2743 
TEST_F(Riscv64InterpreterTest,TestVlxseg4eiXX_sew64_vlmul1)2744 TEST_F(Riscv64InterpreterTest, TestVlxseg4eiXX_sew64_vlmul1) {
2745   VlxsegXeiXX<UInt64, 4, 1>(0x65008407,  // Vluxseg4ei8.v v8, (x1), v16, v0.t
2746                             {{0xa726'a524'a322'a120, 0x8706'8504'8302'8100},
2747                              {0xaf2e'ad2c'ab2a'a928, 0x8f0e'8d0c'8b0a'8908},
2748                              {0xb736'b534'b332'b130, 0x9716'9514'9312'9110},
2749                              {0xbf3e'bd3c'bb3a'b938, 0x9f1e'9d1c'9b1a'9918}});
2750 }
2751 
TEST_F(Riscv64InterpreterTest,TestVlxseg4eiXX_sew64_vlmul2)2752 TEST_F(Riscv64InterpreterTest, TestVlxseg4eiXX_sew64_vlmul2) {
2753   VlxsegXeiXX<UInt64, 4, 2>(0x65008407,  // Vluxseg4ei8.v v8, (x1), v16, v0.t
2754                             {{0xa726'a524'a322'a120, 0x8706'8504'8302'8100},
2755                              {0xe766'e564'e362'e160, 0xc746'c544'c342'c140},
2756                              {0xaf2e'ad2c'ab2a'a928, 0x8f0e'8d0c'8b0a'8908},
2757                              {0xef6e'ed6c'eb6a'e968, 0xcf4e'cd4c'cb4a'c948},
2758                              {0xb736'b534'b332'b130, 0x9716'9514'9312'9110},
2759                              {0xf776'f574'f372'f170, 0xd756'd554'd352'd150},
2760                              {0xbf3e'bd3c'bb3a'b938, 0x9f1e'9d1c'9b1a'9918},
2761                              {0xff7e'fd7c'fb7a'f978, 0xdf5e'dd5c'db5a'd958}});
2762 }
2763 
TEST_F(Riscv64InterpreterTest,TestVlxseg5eiXX_sew64)2764 TEST_F(Riscv64InterpreterTest, TestVlxseg5eiXX_sew64) {
2765   VlxsegXeiXX<UInt64, 5, 1>(0x85008407,  // Vluxseg5ei8.v v8, (x1), v16, v0.t
2766                             {{0xaf2e'ad2c'ab2a'a928, 0x8706'8504'8302'8100},
2767                              {0xb736'b534'b332'b130, 0x8f0e'8d0c'8b0a'8908},
2768                              {0xbf3e'bd3c'bb3a'b938, 0x9716'9514'9312'9110},
2769                              {0xc746'c544'c342'c140, 0x9f1e'9d1c'9b1a'9918},
2770                              {0xcf4e'cd4c'cb4a'c948, 0xa726'a524'a322'a120}});
2771 }
2772 
TEST_F(Riscv64InterpreterTest,TestVlxseg6eiXX_sew64)2773 TEST_F(Riscv64InterpreterTest, TestVlxseg6eiXX_sew64) {
2774   VlxsegXeiXX<UInt64, 6, 1>(0xa5008407,  // Vluxseg6ei8.v v8, (x1), v16, v0.t
2775                             {{0xb736'b534'b332'b130, 0x8706'8504'8302'8100},
2776                              {0xbf3e'bd3c'bb3a'b938, 0x8f0e'8d0c'8b0a'8908},
2777                              {0xc746'c544'c342'c140, 0x9716'9514'9312'9110},
2778                              {0xcf4e'cd4c'cb4a'c948, 0x9f1e'9d1c'9b1a'9918},
2779                              {0xd756'd554'd352'd150, 0xa726'a524'a322'a120},
2780                              {0xdf5e'dd5c'db5a'd958, 0xaf2e'ad2c'ab2a'a928}});
2781 }
2782 
TEST_F(Riscv64InterpreterTest,TestVlxseg7eiXX_sew64)2783 TEST_F(Riscv64InterpreterTest, TestVlxseg7eiXX_sew64) {
2784   VlxsegXeiXX<UInt64, 7, 1>(0xc5008407,  // Vluxseg7ei8.v v8, (x1), v16, v0.t
2785                             {{0xbf3e'bd3c'bb3a'b938, 0x8706'8504'8302'8100},
2786                              {0xc746'c544'c342'c140, 0x8f0e'8d0c'8b0a'8908},
2787                              {0xcf4e'cd4c'cb4a'c948, 0x9716'9514'9312'9110},
2788                              {0xd756'd554'd352'd150, 0x9f1e'9d1c'9b1a'9918},
2789                              {0xdf5e'dd5c'db5a'd958, 0xa726'a524'a322'a120},
2790                              {0xe766'e564'e362'e160, 0xaf2e'ad2c'ab2a'a928},
2791                              {0xef6e'ed6c'eb6a'e968, 0xb736'b534'b332'b130}});
2792 }
2793 
TEST_F(Riscv64InterpreterTest,TestVlxseg8eiXX_sew64)2794 TEST_F(Riscv64InterpreterTest, TestVlxseg8eiXX_sew64) {
2795   VlxsegXeiXX<UInt64, 8, 1>(0xe5008407,  // Vluxseg8ei8.v v8, (x1), v16, v0.t
2796                             {{0xc746'c544'c342'c140, 0x8706'8504'8302'8100},
2797                              {0xcf4e'cd4c'cb4a'c948, 0x8f0e'8d0c'8b0a'8908},
2798                              {0xd756'd554'd352'd150, 0x9716'9514'9312'9110},
2799                              {0xdf5e'dd5c'db5a'd958, 0x9f1e'9d1c'9b1a'9918},
2800                              {0xe766'e564'e362'e160, 0xa726'a524'a322'a120},
2801                              {0xef6e'ed6c'eb6a'e968, 0xaf2e'ad2c'ab2a'a928},
2802                              {0xf776'f574'f372'f170, 0xb736'b534'b332'b130},
2803                              {0xff7e'fd7c'fb7a'f978, 0xbf3e'bd3c'bb3a'b938}});
2804 }
2805 
TEST_F(Riscv64InterpreterTest,TestVle8_vlmul1)2806 TEST_F(Riscv64InterpreterTest, TestVle8_vlmul1) {
2807   TestVlsegXeXX<UInt8, 1, 1>(0x000008407,  // vlse8.v v8, (x1), v0.t
2808                              {{0, 129, 2, 131, 4, 133, 6, 135, 8, 137, 10, 139, 12, 141, 14, 143}});
2809 }
2810 
TEST_F(Riscv64InterpreterTest,TestVle8_vlmul2)2811 TEST_F(Riscv64InterpreterTest, TestVle8_vlmul2) {
2812   TestVlsegXeXX<UInt8, 1, 2>(
2813       0x000008407,  // vlse8.v v8, (x1), v0.t
2814       {{0, 129, 2, 131, 4, 133, 6, 135, 8, 137, 10, 139, 12, 141, 14, 143},
2815        {16, 145, 18, 147, 20, 149, 22, 151, 24, 153, 26, 155, 28, 157, 30, 159}});
2816 }
2817 
TEST_F(Riscv64InterpreterTest,TestVle8_vlmul4)2818 TEST_F(Riscv64InterpreterTest, TestVle8_vlmul4) {
2819   TestVlsegXeXX<UInt8, 1, 4>(
2820       0x000008407,  // vlse8.v v8, (x1), v0.t
2821       {{0, 129, 2, 131, 4, 133, 6, 135, 8, 137, 10, 139, 12, 141, 14, 143},
2822        {16, 145, 18, 147, 20, 149, 22, 151, 24, 153, 26, 155, 28, 157, 30, 159},
2823        {32, 161, 34, 163, 36, 165, 38, 167, 40, 169, 42, 171, 44, 173, 46, 175},
2824        {48, 177, 50, 179, 52, 181, 54, 183, 56, 185, 58, 187, 60, 189, 62, 191}});
2825 }
2826 
TEST_F(Riscv64InterpreterTest,TestVle8_vlmul8)2827 TEST_F(Riscv64InterpreterTest, TestVle8_vlmul8) {
2828   TestVlsegXeXX<UInt8, 1, 8>(
2829       0x000008407,  // vlse8.v v8, (x1), v0.t
2830       {{0, 129, 2, 131, 4, 133, 6, 135, 8, 137, 10, 139, 12, 141, 14, 143},
2831        {16, 145, 18, 147, 20, 149, 22, 151, 24, 153, 26, 155, 28, 157, 30, 159},
2832        {32, 161, 34, 163, 36, 165, 38, 167, 40, 169, 42, 171, 44, 173, 46, 175},
2833        {48, 177, 50, 179, 52, 181, 54, 183, 56, 185, 58, 187, 60, 189, 62, 191},
2834        {64, 193, 66, 195, 68, 197, 70, 199, 72, 201, 74, 203, 76, 205, 78, 207},
2835        {80, 209, 82, 211, 84, 213, 86, 215, 88, 217, 90, 219, 92, 221, 94, 223},
2836        {96, 225, 98, 227, 100, 229, 102, 231, 104, 233, 106, 235, 108, 237, 110, 239},
2837        {112, 241, 114, 243, 116, 245, 118, 247, 120, 249, 122, 251, 124, 253, 126, 255}});
2838 }
2839 
TEST_F(Riscv64InterpreterTest,TestVlseg2e8_vlmul1)2840 TEST_F(Riscv64InterpreterTest, TestVlseg2e8_vlmul1) {
2841   TestVlsegXeXX<UInt8, 2, 1>(
2842       0x20008407,  // vlseg2e8.v v8, (x1), v0.t
2843       {{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30},
2844        {129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159}});
2845 }
2846 
TEST_F(Riscv64InterpreterTest,TestVlseg2e8_vlmul2)2847 TEST_F(Riscv64InterpreterTest, TestVlseg2e8_vlmul2) {
2848   TestVlsegXeXX<UInt8, 2, 2>(
2849       0x20008407,  // vlseg2e8.v v8, (x1), v0.t
2850       {{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30},
2851        {32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62},
2852        {129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159},
2853        {161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191}});
2854 }
2855 
TEST_F(Riscv64InterpreterTest,TestVlseg2e8_vlmul4)2856 TEST_F(Riscv64InterpreterTest, TestVlseg2e8_vlmul4) {
2857   TestVlsegXeXX<UInt8, 2, 4>(
2858       0x20008407,  // vlseg2e8.v v8, (x1), v0.t
2859       {{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30},
2860        {32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62},
2861        {64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94},
2862        {96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126},
2863        {129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159},
2864        {161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191},
2865        {193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223},
2866        {225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255}});
2867 }
2868 
TEST_F(Riscv64InterpreterTest,TestVlseg3e8_vlmul1)2869 TEST_F(Riscv64InterpreterTest, TestVlseg3e8_vlmul1) {
2870   TestVlsegXeXX<UInt8, 3, 1>(
2871       0x40008407,  // vlseg3e8.v v8, (x1), v0.t
2872       {{0, 131, 6, 137, 12, 143, 18, 149, 24, 155, 30, 161, 36, 167, 42, 173},
2873        {129, 4, 135, 10, 141, 16, 147, 22, 153, 28, 159, 34, 165, 40, 171, 46},
2874        {2, 133, 8, 139, 14, 145, 20, 151, 26, 157, 32, 163, 38, 169, 44, 175}});
2875 }
2876 
TEST_F(Riscv64InterpreterTest,TestVlseg3e8_vlmul2)2877 TEST_F(Riscv64InterpreterTest, TestVlseg3e8_vlmul2) {
2878   TestVlsegXeXX<UInt8, 3, 2>(
2879       0x40008407,  // vlseg3e8.v v8, (x1), v0.t
2880       {{0, 131, 6, 137, 12, 143, 18, 149, 24, 155, 30, 161, 36, 167, 42, 173},
2881        {48, 179, 54, 185, 60, 191, 66, 197, 72, 203, 78, 209, 84, 215, 90, 221},
2882        {129, 4, 135, 10, 141, 16, 147, 22, 153, 28, 159, 34, 165, 40, 171, 46},
2883        {177, 52, 183, 58, 189, 64, 195, 70, 201, 76, 207, 82, 213, 88, 219, 94},
2884        {2, 133, 8, 139, 14, 145, 20, 151, 26, 157, 32, 163, 38, 169, 44, 175},
2885        {50, 181, 56, 187, 62, 193, 68, 199, 74, 205, 80, 211, 86, 217, 92, 223}});
2886 }
2887 
TEST_F(Riscv64InterpreterTest,TestVlseg4e8_vlmul1)2888 TEST_F(Riscv64InterpreterTest, TestVlseg4e8_vlmul1) {
2889   TestVlsegXeXX<UInt8, 4, 1>(
2890       0x60008407,  // vlseg4e8.v v8, (x1), v0.t
2891       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
2892        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189},
2893        {2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62},
2894        {131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191}});
2895 }
2896 
TEST_F(Riscv64InterpreterTest,TestVlseg4e8_vlmul2)2897 TEST_F(Riscv64InterpreterTest, TestVlseg4e8_vlmul2) {
2898   TestVlsegXeXX<UInt8, 4, 2>(
2899       0x60008407,  // vlseg4e8.v v8, (x1), v0.t
2900       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
2901        {64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124},
2902        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189},
2903        {193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 233, 237, 241, 245, 249, 253},
2904        {2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62},
2905        {66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126},
2906        {131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191},
2907        {195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255}});
2908 }
2909 
TEST_F(Riscv64InterpreterTest,TestVlseg5e8)2910 TEST_F(Riscv64InterpreterTest, TestVlseg5e8) {
2911   TestVlsegXeXX<UInt8, 5, 1>(
2912       0x80008407,  // vlseg5e8.v v8, (x1), v0.t
2913       {{0, 133, 10, 143, 20, 153, 30, 163, 40, 173, 50, 183, 60, 193, 70, 203},
2914        {129, 6, 139, 16, 149, 26, 159, 36, 169, 46, 179, 56, 189, 66, 199, 76},
2915        {2, 135, 12, 145, 22, 155, 32, 165, 42, 175, 52, 185, 62, 195, 72, 205},
2916        {131, 8, 141, 18, 151, 28, 161, 38, 171, 48, 181, 58, 191, 68, 201, 78},
2917        {4, 137, 14, 147, 24, 157, 34, 167, 44, 177, 54, 187, 64, 197, 74, 207}});
2918 }
2919 
TEST_F(Riscv64InterpreterTest,TestVlseg6e8)2920 TEST_F(Riscv64InterpreterTest, TestVlseg6e8) {
2921   TestVlsegXeXX<UInt8, 6, 1>(
2922       0xa0008407,  // vlseg6e8.v v8, (x1), v0.t
2923       {{0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90},
2924        {129, 135, 141, 147, 153, 159, 165, 171, 177, 183, 189, 195, 201, 207, 213, 219},
2925        {2, 8, 14, 20, 26, 32, 38, 44, 50, 56, 62, 68, 74, 80, 86, 92},
2926        {131, 137, 143, 149, 155, 161, 167, 173, 179, 185, 191, 197, 203, 209, 215, 221},
2927        {4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 64, 70, 76, 82, 88, 94},
2928        {133, 139, 145, 151, 157, 163, 169, 175, 181, 187, 193, 199, 205, 211, 217, 223}});
2929 }
2930 
TEST_F(Riscv64InterpreterTest,TestVlseg7e8)2931 TEST_F(Riscv64InterpreterTest, TestVlseg7e8) {
2932   TestVlsegXeXX<UInt8, 7, 1>(
2933       0xc0008407,  // vlseg7e8.v v8, (x1), v0.t
2934       {{0, 135, 14, 149, 28, 163, 42, 177, 56, 191, 70, 205, 84, 219, 98, 233},
2935        {129, 8, 143, 22, 157, 36, 171, 50, 185, 64, 199, 78, 213, 92, 227, 106},
2936        {2, 137, 16, 151, 30, 165, 44, 179, 58, 193, 72, 207, 86, 221, 100, 235},
2937        {131, 10, 145, 24, 159, 38, 173, 52, 187, 66, 201, 80, 215, 94, 229, 108},
2938        {4, 139, 18, 153, 32, 167, 46, 181, 60, 195, 74, 209, 88, 223, 102, 237},
2939        {133, 12, 147, 26, 161, 40, 175, 54, 189, 68, 203, 82, 217, 96, 231, 110},
2940        {6, 141, 20, 155, 34, 169, 48, 183, 62, 197, 76, 211, 90, 225, 104, 239}});
2941 }
2942 
TEST_F(Riscv64InterpreterTest,TestVlseg8e8)2943 TEST_F(Riscv64InterpreterTest, TestVlseg8e8) {
2944   TestVlsegXeXX<UInt8, 8, 1>(
2945       0xe0008407,  // vlseg8e8.v v8, (x1), v0.t
2946       {{0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120},
2947        {129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249},
2948        {2, 10, 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, 122},
2949        {131, 139, 147, 155, 163, 171, 179, 187, 195, 203, 211, 219, 227, 235, 243, 251},
2950        {4, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124},
2951        {133, 141, 149, 157, 165, 173, 181, 189, 197, 205, 213, 221, 229, 237, 245, 253},
2952        {6, 14, 22, 30, 38, 46, 54, 62, 70, 78, 86, 94, 102, 110, 118, 126},
2953        {135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 255}});
2954 }
2955 
TEST_F(Riscv64InterpreterTest,TestVle16_vlmul1)2956 TEST_F(Riscv64InterpreterTest, TestVle16_vlmul1) {
2957   TestVlsegXeXX<UInt16, 1, 1>(0x000d407,  // vle16.v v8, (x1), v0.t
2958                               {{0x8100, 0x8302, 0x8504, 0x8706, 0x8908, 0x8b0a, 0x8d0c, 0x8f0e}});
2959 }
2960 
TEST_F(Riscv64InterpreterTest,TestVle16_vlmul2)2961 TEST_F(Riscv64InterpreterTest, TestVle16_vlmul2) {
2962   TestVlsegXeXX<UInt16, 1, 2>(0x000d407,  // vle16.v v8, (x1), v0.t
2963                               {{0x8100, 0x8302, 0x8504, 0x8706, 0x8908, 0x8b0a, 0x8d0c, 0x8f0e},
2964                                {0x9110, 0x9312, 0x9514, 0x9716, 0x9918, 0x9b1a, 0x9d1c, 0x9f1e}});
2965 }
2966 
TEST_F(Riscv64InterpreterTest,TestVle16_vlmul4)2967 TEST_F(Riscv64InterpreterTest, TestVle16_vlmul4) {
2968   TestVlsegXeXX<UInt16, 1, 4>(0x000d407,  // vle16.v v8, (x1), v0.t
2969                               {{0x8100, 0x8302, 0x8504, 0x8706, 0x8908, 0x8b0a, 0x8d0c, 0x8f0e},
2970                                {0x9110, 0x9312, 0x9514, 0x9716, 0x9918, 0x9b1a, 0x9d1c, 0x9f1e},
2971                                {0xa120, 0xa322, 0xa524, 0xa726, 0xa928, 0xab2a, 0xad2c, 0xaf2e},
2972                                {0xb130, 0xb332, 0xb534, 0xb736, 0xb938, 0xbb3a, 0xbd3c, 0xbf3e}});
2973 }
2974 
TEST_F(Riscv64InterpreterTest,TestVle16_vlmul8)2975 TEST_F(Riscv64InterpreterTest, TestVle16_vlmul8) {
2976   TestVlsegXeXX<UInt16, 1, 8>(0x000d407,  // vle16.v v8, (x1), v0.t
2977                               {{0x8100, 0x8302, 0x8504, 0x8706, 0x8908, 0x8b0a, 0x8d0c, 0x8f0e},
2978                                {0x9110, 0x9312, 0x9514, 0x9716, 0x9918, 0x9b1a, 0x9d1c, 0x9f1e},
2979                                {0xa120, 0xa322, 0xa524, 0xa726, 0xa928, 0xab2a, 0xad2c, 0xaf2e},
2980                                {0xb130, 0xb332, 0xb534, 0xb736, 0xb938, 0xbb3a, 0xbd3c, 0xbf3e},
2981                                {0xc140, 0xc342, 0xc544, 0xc746, 0xc948, 0xcb4a, 0xcd4c, 0xcf4e},
2982                                {0xd150, 0xd352, 0xd554, 0xd756, 0xd958, 0xdb5a, 0xdd5c, 0xdf5e},
2983                                {0xe160, 0xe362, 0xe564, 0xe766, 0xe968, 0xeb6a, 0xed6c, 0xef6e},
2984                                {0xf170, 0xf372, 0xf574, 0xf776, 0xf978, 0xfb7a, 0xfd7c, 0xff7e}});
2985 }
2986 
TEST_F(Riscv64InterpreterTest,TestVlseg2e16_vlmul1)2987 TEST_F(Riscv64InterpreterTest, TestVlseg2e16_vlmul1) {
2988   TestVlsegXeXX<UInt16, 2, 1>(0x2000d407,  // vlseg2e16.v v8, (x1), v0.t
2989                               {{0x8100, 0x8504, 0x8908, 0x8d0c, 0x9110, 0x9514, 0x9918, 0x9d1c},
2990                                {0x8302, 0x8706, 0x8b0a, 0x8f0e, 0x9312, 0x9716, 0x9b1a, 0x9f1e}});
2991 }
2992 
TEST_F(Riscv64InterpreterTest,TestVlseg2e16_vlmul2)2993 TEST_F(Riscv64InterpreterTest, TestVlseg2e16_vlmul2) {
2994   TestVlsegXeXX<UInt16, 2, 2>(0x2000d407,  // vlseg2e16.v v8, (x1), v0.t
2995                               {{0x8100, 0x8504, 0x8908, 0x8d0c, 0x9110, 0x9514, 0x9918, 0x9d1c},
2996                                {0xa120, 0xa524, 0xa928, 0xad2c, 0xb130, 0xb534, 0xb938, 0xbd3c},
2997                                {0x8302, 0x8706, 0x8b0a, 0x8f0e, 0x9312, 0x9716, 0x9b1a, 0x9f1e},
2998                                {0xa322, 0xa726, 0xab2a, 0xaf2e, 0xb332, 0xb736, 0xbb3a, 0xbf3e}});
2999 }
3000 
TEST_F(Riscv64InterpreterTest,TestVlseg2e16_vlmul4)3001 TEST_F(Riscv64InterpreterTest, TestVlseg2e16_vlmul4) {
3002   TestVlsegXeXX<UInt16, 2, 4>(0x2000d407,  // vlseg2e16.v v8, (x1), v0.t
3003                               {{0x8100, 0x8504, 0x8908, 0x8d0c, 0x9110, 0x9514, 0x9918, 0x9d1c},
3004                                {0xa120, 0xa524, 0xa928, 0xad2c, 0xb130, 0xb534, 0xb938, 0xbd3c},
3005                                {0xc140, 0xc544, 0xc948, 0xcd4c, 0xd150, 0xd554, 0xd958, 0xdd5c},
3006                                {0xe160, 0xe564, 0xe968, 0xed6c, 0xf170, 0xf574, 0xf978, 0xfd7c},
3007                                {0x8302, 0x8706, 0x8b0a, 0x8f0e, 0x9312, 0x9716, 0x9b1a, 0x9f1e},
3008                                {0xa322, 0xa726, 0xab2a, 0xaf2e, 0xb332, 0xb736, 0xbb3a, 0xbf3e},
3009                                {0xc342, 0xc746, 0xcb4a, 0xcf4e, 0xd352, 0xd756, 0xdb5a, 0xdf5e},
3010                                {0xe362, 0xe766, 0xeb6a, 0xef6e, 0xf372, 0xf776, 0xfb7a, 0xff7e}});
3011 }
3012 
TEST_F(Riscv64InterpreterTest,TestVlseg3e16_vlmul1)3013 TEST_F(Riscv64InterpreterTest, TestVlseg3e16_vlmul1) {
3014   TestVlsegXeXX<UInt16, 3, 1>(0x4000d407,  // vlseg3e16.v v8, (x1), v0.t
3015                               {{0x8100, 0x8706, 0x8d0c, 0x9312, 0x9918, 0x9f1e, 0xa524, 0xab2a},
3016                                {0x8302, 0x8908, 0x8f0e, 0x9514, 0x9b1a, 0xa120, 0xa726, 0xad2c},
3017                                {0x8504, 0x8b0a, 0x9110, 0x9716, 0x9d1c, 0xa322, 0xa928, 0xaf2e}});
3018 }
3019 
TEST_F(Riscv64InterpreterTest,TestVlseg3e16_vlmul2)3020 TEST_F(Riscv64InterpreterTest, TestVlseg3e16_vlmul2) {
3021   TestVlsegXeXX<UInt16, 3, 2>(0x4000d407,  // vlseg3e16.v v8, (x1), v0.t
3022                               {{0x8100, 0x8706, 0x8d0c, 0x9312, 0x9918, 0x9f1e, 0xa524, 0xab2a},
3023                                {0xb130, 0xb736, 0xbd3c, 0xc342, 0xc948, 0xcf4e, 0xd554, 0xdb5a},
3024                                {0x8302, 0x8908, 0x8f0e, 0x9514, 0x9b1a, 0xa120, 0xa726, 0xad2c},
3025                                {0xb332, 0xb938, 0xbf3e, 0xc544, 0xcb4a, 0xd150, 0xd756, 0xdd5c},
3026                                {0x8504, 0x8b0a, 0x9110, 0x9716, 0x9d1c, 0xa322, 0xa928, 0xaf2e},
3027                                {0xb534, 0xbb3a, 0xc140, 0xc746, 0xcd4c, 0xd352, 0xd958, 0xdf5e}});
3028 }
3029 
TEST_F(Riscv64InterpreterTest,TestVlseg4e16_vlmul1)3030 TEST_F(Riscv64InterpreterTest, TestVlseg4e16_vlmul1) {
3031   TestVlsegXeXX<UInt16, 4, 1>(0x6000d407,  // vlseg4e16.v v8, (x1), v0.t
3032                               {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3033                                {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a},
3034                                {0x8504, 0x8d0c, 0x9514, 0x9d1c, 0xa524, 0xad2c, 0xb534, 0xbd3c},
3035                                {0x8706, 0x8f0e, 0x9716, 0x9f1e, 0xa726, 0xaf2e, 0xb736, 0xbf3e}});
3036 }
3037 
TEST_F(Riscv64InterpreterTest,TestVlseg4e16_vlmul2)3038 TEST_F(Riscv64InterpreterTest, TestVlseg4e16_vlmul2) {
3039   TestVlsegXeXX<UInt16, 4, 2>(0x6000d407,  // vlseg4e16.v v8, (x1), v0.t
3040                               {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3041                                {0xc140, 0xc948, 0xd150, 0xd958, 0xe160, 0xe968, 0xf170, 0xf978},
3042                                {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a},
3043                                {0xc342, 0xcb4a, 0xd352, 0xdb5a, 0xe362, 0xeb6a, 0xf372, 0xfb7a},
3044                                {0x8504, 0x8d0c, 0x9514, 0x9d1c, 0xa524, 0xad2c, 0xb534, 0xbd3c},
3045                                {0xc544, 0xcd4c, 0xd554, 0xdd5c, 0xe564, 0xed6c, 0xf574, 0xfd7c},
3046                                {0x8706, 0x8f0e, 0x9716, 0x9f1e, 0xa726, 0xaf2e, 0xb736, 0xbf3e},
3047                                {0xc746, 0xcf4e, 0xd756, 0xdf5e, 0xe766, 0xef6e, 0xf776, 0xff7e}});
3048 }
3049 
TEST_F(Riscv64InterpreterTest,TestVlseg5e16)3050 TEST_F(Riscv64InterpreterTest, TestVlseg5e16) {
3051   TestVlsegXeXX<UInt16, 5, 1>(0x8000d407,  // vlseg5e16.v v8, (x1), v0.t
3052                               {{0x8100, 0x8b0a, 0x9514, 0x9f1e, 0xa928, 0xb332, 0xbd3c, 0xc746},
3053                                {0x8302, 0x8d0c, 0x9716, 0xa120, 0xab2a, 0xb534, 0xbf3e, 0xc948},
3054                                {0x8504, 0x8f0e, 0x9918, 0xa322, 0xad2c, 0xb736, 0xc140, 0xcb4a},
3055                                {0x8706, 0x9110, 0x9b1a, 0xa524, 0xaf2e, 0xb938, 0xc342, 0xcd4c},
3056                                {0x8908, 0x9312, 0x9d1c, 0xa726, 0xb130, 0xbb3a, 0xc544, 0xcf4e}});
3057 }
3058 
TEST_F(Riscv64InterpreterTest,TestVlseg6e16)3059 TEST_F(Riscv64InterpreterTest, TestVlseg6e16) {
3060   TestVlsegXeXX<UInt16, 6, 1>(0xa000d407,  // vlseg6e16.v v8, (x1), v0.t
3061                               {{0x8100, 0x8d0c, 0x9918, 0xa524, 0xb130, 0xbd3c, 0xc948, 0xd554},
3062                                {0x8302, 0x8f0e, 0x9b1a, 0xa726, 0xb332, 0xbf3e, 0xcb4a, 0xd756},
3063                                {0x8504, 0x9110, 0x9d1c, 0xa928, 0xb534, 0xc140, 0xcd4c, 0xd958},
3064                                {0x8706, 0x9312, 0x9f1e, 0xab2a, 0xb736, 0xc342, 0xcf4e, 0xdb5a},
3065                                {0x8908, 0x9514, 0xa120, 0xad2c, 0xb938, 0xc544, 0xd150, 0xdd5c},
3066                                {0x8b0a, 0x9716, 0xa322, 0xaf2e, 0xbb3a, 0xc746, 0xd352, 0xdf5e}});
3067 }
3068 
TEST_F(Riscv64InterpreterTest,TestVlseg7e16)3069 TEST_F(Riscv64InterpreterTest, TestVlseg7e16) {
3070   TestVlsegXeXX<UInt16, 7, 1>(0xc000d407,  // vlseg7e16.v v8, (x1), v0.t
3071                               {{0x8100, 0x8f0e, 0x9d1c, 0xab2a, 0xb938, 0xc746, 0xd554, 0xe362},
3072                                {0x8302, 0x9110, 0x9f1e, 0xad2c, 0xbb3a, 0xc948, 0xd756, 0xe564},
3073                                {0x8504, 0x9312, 0xa120, 0xaf2e, 0xbd3c, 0xcb4a, 0xd958, 0xe766},
3074                                {0x8706, 0x9514, 0xa322, 0xb130, 0xbf3e, 0xcd4c, 0xdb5a, 0xe968},
3075                                {0x8908, 0x9716, 0xa524, 0xb332, 0xc140, 0xcf4e, 0xdd5c, 0xeb6a},
3076                                {0x8b0a, 0x9918, 0xa726, 0xb534, 0xc342, 0xd150, 0xdf5e, 0xed6c},
3077                                {0x8d0c, 0x9b1a, 0xa928, 0xb736, 0xc544, 0xd352, 0xe160, 0xef6e}});
3078 }
3079 
TEST_F(Riscv64InterpreterTest,TestVlseg8e16)3080 TEST_F(Riscv64InterpreterTest, TestVlseg8e16) {
3081   TestVlsegXeXX<UInt16, 8, 1>(0xe000d407,  // vlseg8e16.v v8, (x1), v0.t
3082                               {{0x8100, 0x9110, 0xa120, 0xb130, 0xc140, 0xd150, 0xe160, 0xf170},
3083                                {0x8302, 0x9312, 0xa322, 0xb332, 0xc342, 0xd352, 0xe362, 0xf372},
3084                                {0x8504, 0x9514, 0xa524, 0xb534, 0xc544, 0xd554, 0xe564, 0xf574},
3085                                {0x8706, 0x9716, 0xa726, 0xb736, 0xc746, 0xd756, 0xe766, 0xf776},
3086                                {0x8908, 0x9918, 0xa928, 0xb938, 0xc948, 0xd958, 0xe968, 0xf978},
3087                                {0x8b0a, 0x9b1a, 0xab2a, 0xbb3a, 0xcb4a, 0xdb5a, 0xeb6a, 0xfb7a},
3088                                {0x8d0c, 0x9d1c, 0xad2c, 0xbd3c, 0xcd4c, 0xdd5c, 0xed6c, 0xfd7c},
3089                                {0x8f0e, 0x9f1e, 0xaf2e, 0xbf3e, 0xcf4e, 0xdf5e, 0xef6e, 0xff7e}});
3090 }
3091 
TEST_F(Riscv64InterpreterTest,TestVle32_vlmul1)3092 TEST_F(Riscv64InterpreterTest, TestVle32_vlmul1) {
3093   TestVlsegXeXX<UInt32, 1, 1>(0x000e407,  // vle32.v v8, (x1), v0.t
3094                               {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c}});
3095 }
3096 
TEST_F(Riscv64InterpreterTest,TestVle32_vlmul2)3097 TEST_F(Riscv64InterpreterTest, TestVle32_vlmul2) {
3098   TestVlsegXeXX<UInt32, 1, 2>(0x000e407,  // vle32.v v8, (x1), v0.t
3099                               {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c},
3100                                {0x9312'9110, 0x9716'9514, 0x9b1a'9918, 0x9f1e'9d1c}});
3101 }
3102 
TEST_F(Riscv64InterpreterTest,TestVle32_vlmul4)3103 TEST_F(Riscv64InterpreterTest, TestVle32_vlmul4) {
3104   TestVlsegXeXX<UInt32, 1, 4>(0x000e407,  // vle32.v v8, (x1), v0.t
3105                               {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c},
3106                                {0x9312'9110, 0x9716'9514, 0x9b1a'9918, 0x9f1e'9d1c},
3107                                {0xa322'a120, 0xa726'a524, 0xab2a'a928, 0xaf2e'ad2c},
3108                                {0xb332'b130, 0xb736'b534, 0xbb3a'b938, 0xbf3e'bd3c}});
3109 }
3110 
TEST_F(Riscv64InterpreterTest,TestVle32_vlmul8)3111 TEST_F(Riscv64InterpreterTest, TestVle32_vlmul8) {
3112   TestVlsegXeXX<UInt32, 1, 8>(0x000e407,  // vle32.v v8, (x1), v0.t
3113                               {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c},
3114                                {0x9312'9110, 0x9716'9514, 0x9b1a'9918, 0x9f1e'9d1c},
3115                                {0xa322'a120, 0xa726'a524, 0xab2a'a928, 0xaf2e'ad2c},
3116                                {0xb332'b130, 0xb736'b534, 0xbb3a'b938, 0xbf3e'bd3c},
3117                                {0xc342'c140, 0xc746'c544, 0xcb4a'c948, 0xcf4e'cd4c},
3118                                {0xd352'd150, 0xd756'd554, 0xdb5a'd958, 0xdf5e'dd5c},
3119                                {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
3120                                {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}});
3121 }
3122 
TEST_F(Riscv64InterpreterTest,TestVlseg2e32_vlmul1)3123 TEST_F(Riscv64InterpreterTest, TestVlseg2e32_vlmul1) {
3124   TestVlsegXeXX<UInt32, 2, 1>(0x2000e407,  // vlseg2e32.v v8, (x1), v0.t
3125                               {{0x8302'8100, 0x8b0a'8908, 0x9312'9110, 0x9b1a'9918},
3126                                {0x8706'8504, 0x8f0e'8d0c, 0x9716'9514, 0x9f1e'9d1c}});
3127 }
3128 
TEST_F(Riscv64InterpreterTest,TestVlseg2e32_vlmul2)3129 TEST_F(Riscv64InterpreterTest, TestVlseg2e32_vlmul2) {
3130   TestVlsegXeXX<UInt32, 2, 2>(0x2000e407,  // vlseg2e32.v v8, (x1), v0.t
3131                               {{0x8302'8100, 0x8b0a'8908, 0x9312'9110, 0x9b1a'9918},
3132                                {0xa322'a120, 0xab2a'a928, 0xb332'b130, 0xbb3a'b938},
3133                                {0x8706'8504, 0x8f0e'8d0c, 0x9716'9514, 0x9f1e'9d1c},
3134                                {0xa726'a524, 0xaf2e'ad2c, 0xb736'b534, 0xbf3e'bd3c}});
3135 }
3136 
TEST_F(Riscv64InterpreterTest,TestVlseg2e32_vlmul4)3137 TEST_F(Riscv64InterpreterTest, TestVlseg2e32_vlmul4) {
3138   TestVlsegXeXX<UInt32, 2, 4>(0x2000e407,  // vlseg2e32.v v8, (x1), v0.t
3139                               {{0x8302'8100, 0x8b0a'8908, 0x9312'9110, 0x9b1a'9918},
3140                                {0xa322'a120, 0xab2a'a928, 0xb332'b130, 0xbb3a'b938},
3141                                {0xc342'c140, 0xcb4a'c948, 0xd352'd150, 0xdb5a'd958},
3142                                {0xe362'e160, 0xeb6a'e968, 0xf372'f170, 0xfb7a'f978},
3143                                {0x8706'8504, 0x8f0e'8d0c, 0x9716'9514, 0x9f1e'9d1c},
3144                                {0xa726'a524, 0xaf2e'ad2c, 0xb736'b534, 0xbf3e'bd3c},
3145                                {0xc746'c544, 0xcf4e'cd4c, 0xd756'd554, 0xdf5e'dd5c},
3146                                {0xe766'e564, 0xef6e'ed6c, 0xf776'f574, 0xff7e'fd7c}});
3147 }
3148 
TEST_F(Riscv64InterpreterTest,TestVlseg3e32_vlmul1)3149 TEST_F(Riscv64InterpreterTest, TestVlseg3e32_vlmul1) {
3150   TestVlsegXeXX<UInt32, 3, 1>(0x4000e407,  // vlseg3e32.v v8, (x1), v0.t
3151                               {{0x8302'8100, 0x8f0e'8d0c, 0x9b1a'9918, 0xa726'a524},
3152                                {0x8706'8504, 0x9312'9110, 0x9f1e'9d1c, 0xab2a'a928},
3153                                {0x8b0a'8908, 0x9716'9514, 0xa322'a120, 0xaf2e'ad2c}});
3154 }
3155 
TEST_F(Riscv64InterpreterTest,TestVlseg3e32_vlmul2)3156 TEST_F(Riscv64InterpreterTest, TestVlseg3e32_vlmul2) {
3157   TestVlsegXeXX<UInt32, 3, 2>(0x4000e407,  // vlseg3e32.v v8, (x1), v0.t
3158                               {{0x8302'8100, 0x8f0e'8d0c, 0x9b1a'9918, 0xa726'a524},
3159                                {0xb332'b130, 0xbf3e'bd3c, 0xcb4a'c948, 0xd756'd554},
3160                                {0x8706'8504, 0x9312'9110, 0x9f1e'9d1c, 0xab2a'a928},
3161                                {0xb736'b534, 0xc342'c140, 0xcf4e'cd4c, 0xdb5a'd958},
3162                                {0x8b0a'8908, 0x9716'9514, 0xa322'a120, 0xaf2e'ad2c},
3163                                {0xbb3a'b938, 0xc746'c544, 0xd352'd150, 0xdf5e'dd5c}});
3164 }
3165 
TEST_F(Riscv64InterpreterTest,TestVlseg4e32_vlmul1)3166 TEST_F(Riscv64InterpreterTest, TestVlseg4e32_vlmul1) {
3167   TestVlsegXeXX<UInt32, 4, 1>(0x6000e407,  // vlseg4e32.v v8, (x1), v0.t
3168                               {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3169                                {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534},
3170                                {0x8b0a'8908, 0x9b1a'9918, 0xab2a'a928, 0xbb3a'b938},
3171                                {0x8f0e'8d0c, 0x9f1e'9d1c, 0xaf2e'ad2c, 0xbf3e'bd3c}});
3172 }
3173 
TEST_F(Riscv64InterpreterTest,TestVlseg4e32_vlmul2)3174 TEST_F(Riscv64InterpreterTest, TestVlseg4e32_vlmul2) {
3175   TestVlsegXeXX<UInt32, 4, 2>(0x6000e407,  // vlseg4e32.v v8, (x1), v0.t
3176                               {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3177                                {0xc342'c140, 0xd352'd150, 0xe362'e160, 0xf372'f170},
3178                                {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534},
3179                                {0xc746'c544, 0xd756'd554, 0xe766'e564, 0xf776'f574},
3180                                {0x8b0a'8908, 0x9b1a'9918, 0xab2a'a928, 0xbb3a'b938},
3181                                {0xcb4a'c948, 0xdb5a'd958, 0xeb6a'e968, 0xfb7a'f978},
3182                                {0x8f0e'8d0c, 0x9f1e'9d1c, 0xaf2e'ad2c, 0xbf3e'bd3c},
3183                                {0xcf4e'cd4c, 0xdf5e'dd5c, 0xef6e'ed6c, 0xff7e'fd7c}});
3184 }
3185 
TEST_F(Riscv64InterpreterTest,TestVlseg5e32)3186 TEST_F(Riscv64InterpreterTest, TestVlseg5e32) {
3187   TestVlsegXeXX<UInt32, 5, 1>(0x8000e407,  // vlseg5e32.v v8, (x1), v0.t
3188                               {{0x8302'8100, 0x9716'9514, 0xab2a'a928, 0xbf3e'bd3c},
3189                                {0x8706'8504, 0x9b1a'9918, 0xaf2e'ad2c, 0xc342'c140},
3190                                {0x8b0a'8908, 0x9f1e'9d1c, 0xb332'b130, 0xc746'c544},
3191                                {0x8f0e'8d0c, 0xa322'a120, 0xb736'b534, 0xcb4a'c948},
3192                                {0x9312'9110, 0xa726'a524, 0xbb3a'b938, 0xcf4e'cd4c}});
3193 }
3194 
TEST_F(Riscv64InterpreterTest,TestVlseg6e32)3195 TEST_F(Riscv64InterpreterTest, TestVlseg6e32) {
3196   TestVlsegXeXX<UInt32, 6, 1>(0xa000e407,  // vlseg6e32.v v8, (x1), v0.t
3197                               {{0x8302'8100, 0x9b1a'9918, 0xb332'b130, 0xcb4a'c948},
3198                                {0x8706'8504, 0x9f1e'9d1c, 0xb736'b534, 0xcf4e'cd4c},
3199                                {0x8b0a'8908, 0xa322'a120, 0xbb3a'b938, 0xd352'd150},
3200                                {0x8f0e'8d0c, 0xa726'a524, 0xbf3e'bd3c, 0xd756'd554},
3201                                {0x9312'9110, 0xab2a'a928, 0xc342'c140, 0xdb5a'd958},
3202                                {0x9716'9514, 0xaf2e'ad2c, 0xc746'c544, 0xdf5e'dd5c}});
3203 }
3204 
TEST_F(Riscv64InterpreterTest,TestVlseg7e32)3205 TEST_F(Riscv64InterpreterTest, TestVlseg7e32) {
3206   TestVlsegXeXX<UInt32, 7, 1>(0xc000e407,  // vlseg7e32.v v8, (x1), v0.t
3207                               {{0x8302'8100, 0x9f1e'9d1c, 0xbb3a'b938, 0xd756'd554},
3208                                {0x8706'8504, 0xa322'a120, 0xbf3e'bd3c, 0xdb5a'd958},
3209                                {0x8b0a'8908, 0xa726'a524, 0xc342'c140, 0xdf5e'dd5c},
3210                                {0x8f0e'8d0c, 0xab2a'a928, 0xc746'c544, 0xe362'e160},
3211                                {0x9312'9110, 0xaf2e'ad2c, 0xcb4a'c948, 0xe766'e564},
3212                                {0x9716'9514, 0xb332'b130, 0xcf4e'cd4c, 0xeb6a'e968},
3213                                {0x9b1a'9918, 0xb736'b534, 0xd352'd150, 0xef6e'ed6c}});
3214 }
3215 
TEST_F(Riscv64InterpreterTest,TestVlseg8e32)3216 TEST_F(Riscv64InterpreterTest, TestVlseg8e32) {
3217   TestVlsegXeXX<UInt32, 8, 1>(0xe000e407,  // vlseg8e32.v v8, (x1), v0.t
3218                               {{0x8302'8100, 0xa322'a120, 0xc342'c140, 0xe362'e160},
3219                                {0x8706'8504, 0xa726'a524, 0xc746'c544, 0xe766'e564},
3220                                {0x8b0a'8908, 0xab2a'a928, 0xcb4a'c948, 0xeb6a'e968},
3221                                {0x8f0e'8d0c, 0xaf2e'ad2c, 0xcf4e'cd4c, 0xef6e'ed6c},
3222                                {0x9312'9110, 0xb332'b130, 0xd352'd150, 0xf372'f170},
3223                                {0x9716'9514, 0xb736'b534, 0xd756'd554, 0xf776'f574},
3224                                {0x9b1a'9918, 0xbb3a'b938, 0xdb5a'd958, 0xfb7a'f978},
3225                                {0x9f1e'9d1c, 0xbf3e'bd3c, 0xdf5e'dd5c, 0xff7e'fd7c}});
3226 }
3227 
TEST_F(Riscv64InterpreterTest,TestVle64_vlmul1)3228 TEST_F(Riscv64InterpreterTest, TestVle64_vlmul1) {
3229   TestVlsegXeXX<UInt64, 1, 1>(0x000f407,  // vle64.v v8, (x1), v0.t
3230                               {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908}});
3231 }
3232 
TEST_F(Riscv64InterpreterTest,TestVle64_vlmul2)3233 TEST_F(Riscv64InterpreterTest, TestVle64_vlmul2) {
3234   TestVlsegXeXX<UInt64, 1, 2>(0x000f407,  // vle64.v v8, (x1), v0.t
3235                               {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
3236                                {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918}});
3237 }
3238 
TEST_F(Riscv64InterpreterTest,TestVle64_vlmul4)3239 TEST_F(Riscv64InterpreterTest, TestVle64_vlmul4) {
3240   TestVlsegXeXX<UInt64, 1, 4>(0x000f407,  // vle64.v v8, (x1), v0.t
3241                               {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
3242                                {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
3243                                {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
3244                                {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938}});
3245 }
3246 
TEST_F(Riscv64InterpreterTest,TestVle64_vlmul8)3247 TEST_F(Riscv64InterpreterTest, TestVle64_vlmul8) {
3248   TestVlsegXeXX<UInt64, 1, 8>(0x000f407,  // vle64.v v8, (x1), v0.t
3249                               {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
3250                                {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
3251                                {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
3252                                {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938},
3253                                {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
3254                                {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
3255                                {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
3256                                {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}});
3257 }
3258 
TEST_F(Riscv64InterpreterTest,TestVlseg2e64_vlmul1)3259 TEST_F(Riscv64InterpreterTest, TestVlseg2e64_vlmul1) {
3260   TestVlsegXeXX<UInt64, 2, 1>(0x2000f407,  // vlseg2e64.v v8, (x1), v0.t
3261                               {{0x8706'8504'8302'8100, 0x9716'9514'9312'9110},
3262                                {0x8f0e'8d0c'8b0a'8908, 0x9f1e'9d1c'9b1a'9918}});
3263 }
3264 
TEST_F(Riscv64InterpreterTest,TestVlseg2e64_vlmul2)3265 TEST_F(Riscv64InterpreterTest, TestVlseg2e64_vlmul2) {
3266   TestVlsegXeXX<UInt64, 2, 2>(0x2000f407,  // vlseg2e64.v v8, (x1), v0.t
3267                               {{0x8706'8504'8302'8100, 0x9716'9514'9312'9110},
3268                                {0xa726'a524'a322'a120, 0xb736'b534'b332'b130},
3269                                {0x8f0e'8d0c'8b0a'8908, 0x9f1e'9d1c'9b1a'9918},
3270                                {0xaf2e'ad2c'ab2a'a928, 0xbf3e'bd3c'bb3a'b938}});
3271 }
3272 
TEST_F(Riscv64InterpreterTest,TestVlseg2e64_vlmul4)3273 TEST_F(Riscv64InterpreterTest, TestVlseg2e64_vlmul4) {
3274   TestVlsegXeXX<UInt64, 2, 4>(0x2000f407,  // vlseg2e64.v v8, (x1), v0.t
3275                               {{0x8706'8504'8302'8100, 0x9716'9514'9312'9110},
3276                                {0xa726'a524'a322'a120, 0xb736'b534'b332'b130},
3277                                {0xc746'c544'c342'c140, 0xd756'd554'd352'd150},
3278                                {0xe766'e564'e362'e160, 0xf776'f574'f372'f170},
3279                                {0x8f0e'8d0c'8b0a'8908, 0x9f1e'9d1c'9b1a'9918},
3280                                {0xaf2e'ad2c'ab2a'a928, 0xbf3e'bd3c'bb3a'b938},
3281                                {0xcf4e'cd4c'cb4a'c948, 0xdf5e'dd5c'db5a'd958},
3282                                {0xef6e'ed6c'eb6a'e968, 0xff7e'fd7c'fb7a'f978}});
3283 }
3284 
TEST_F(Riscv64InterpreterTest,TestVlseg3e64_vlmul1)3285 TEST_F(Riscv64InterpreterTest, TestVlseg3e64_vlmul1) {
3286   TestVlsegXeXX<UInt64, 3, 1>(0x4000f407,  // vlseg3e64.v v8, (x1), v0.t
3287                               {{0x8706'8504'8302'8100, 0x9f1e'9d1c'9b1a'9918},
3288                                {0x8f0e'8d0c'8b0a'8908, 0xa726'a524'a322'a120},
3289                                {0x9716'9514'9312'9110, 0xaf2e'ad2c'ab2a'a928}});
3290 }
3291 
TEST_F(Riscv64InterpreterTest,TestVlseg3e64_vlmul2)3292 TEST_F(Riscv64InterpreterTest, TestVlseg3e64_vlmul2) {
3293   TestVlsegXeXX<UInt64, 3, 2>(0x4000f407,  // vlseg3e64.v v8, (x1), v0.t
3294                               {{0x8706'8504'8302'8100, 0x9f1e'9d1c'9b1a'9918},
3295                                {0xb736'b534'b332'b130, 0xcf4e'cd4c'cb4a'c948},
3296                                {0x8f0e'8d0c'8b0a'8908, 0xa726'a524'a322'a120},
3297                                {0xbf3e'bd3c'bb3a'b938, 0xd756'd554'd352'd150},
3298                                {0x9716'9514'9312'9110, 0xaf2e'ad2c'ab2a'a928},
3299                                {0xc746'c544'c342'c140, 0xdf5e'dd5c'db5a'd958}});
3300 }
3301 
TEST_F(Riscv64InterpreterTest,TestVlseg4e64_vlmul1)3302 TEST_F(Riscv64InterpreterTest, TestVlseg4e64_vlmul1) {
3303   TestVlsegXeXX<UInt64, 4, 1>(0x6000f407,  // vlseg4e64.v v8, (x1), v0.t
3304                               {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3305                                {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928},
3306                                {0x9716'9514'9312'9110, 0xb736'b534'b332'b130},
3307                                {0x9f1e'9d1c'9b1a'9918, 0xbf3e'bd3c'bb3a'b938}});
3308 }
3309 
TEST_F(Riscv64InterpreterTest,TestVlseg4e64_vlmul2)3310 TEST_F(Riscv64InterpreterTest, TestVlseg4e64_vlmul2) {
3311   TestVlsegXeXX<UInt64, 4, 2>(0x6000f407,  // vlseg4e64.v v8, (x1), v0.t
3312                               {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3313                                {0xc746'c544'c342'c140, 0xe766'e564'e362'e160},
3314                                {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928},
3315                                {0xcf4e'cd4c'cb4a'c948, 0xef6e'ed6c'eb6a'e968},
3316                                {0x9716'9514'9312'9110, 0xb736'b534'b332'b130},
3317                                {0xd756'd554'd352'd150, 0xf776'f574'f372'f170},
3318                                {0x9f1e'9d1c'9b1a'9918, 0xbf3e'bd3c'bb3a'b938},
3319                                {0xdf5e'dd5c'db5a'd958, 0xff7e'fd7c'fb7a'f978}});
3320 }
3321 
TEST_F(Riscv64InterpreterTest,TestVlseg5e64)3322 TEST_F(Riscv64InterpreterTest, TestVlseg5e64) {
3323   TestVlsegXeXX<UInt64, 5, 1>(0x8000f407,  // vlseg5e64.v v8, (x1), v0.t
3324                               {{0x8706'8504'8302'8100, 0xaf2e'ad2c'ab2a'a928},
3325                                {0x8f0e'8d0c'8b0a'8908, 0xb736'b534'b332'b130},
3326                                {0x9716'9514'9312'9110, 0xbf3e'bd3c'bb3a'b938},
3327                                {0x9f1e'9d1c'9b1a'9918, 0xc746'c544'c342'c140},
3328                                {0xa726'a524'a322'a120, 0xcf4e'cd4c'cb4a'c948}});
3329 }
3330 
TEST_F(Riscv64InterpreterTest,TestVlseg6e64)3331 TEST_F(Riscv64InterpreterTest, TestVlseg6e64) {
3332   TestVlsegXeXX<UInt64, 6, 1>(0xa000f407,  // vlseg6e64.v v8, (x1), v0.t
3333                               {{0x8706'8504'8302'8100, 0xb736'b534'b332'b130},
3334                                {0x8f0e'8d0c'8b0a'8908, 0xbf3e'bd3c'bb3a'b938},
3335                                {0x9716'9514'9312'9110, 0xc746'c544'c342'c140},
3336                                {0x9f1e'9d1c'9b1a'9918, 0xcf4e'cd4c'cb4a'c948},
3337                                {0xa726'a524'a322'a120, 0xd756'd554'd352'd150},
3338                                {0xaf2e'ad2c'ab2a'a928, 0xdf5e'dd5c'db5a'd958}});
3339 }
3340 
TEST_F(Riscv64InterpreterTest,TestVlseg7e64)3341 TEST_F(Riscv64InterpreterTest, TestVlseg7e64) {
3342   TestVlsegXeXX<UInt64, 7, 1>(0xc000f407,  // vlseg7e64.v v8, (x1), v0.t
3343                               {{0x8706'8504'8302'8100, 0xbf3e'bd3c'bb3a'b938},
3344                                {0x8f0e'8d0c'8b0a'8908, 0xc746'c544'c342'c140},
3345                                {0x9716'9514'9312'9110, 0xcf4e'cd4c'cb4a'c948},
3346                                {0x9f1e'9d1c'9b1a'9918, 0xd756'd554'd352'd150},
3347                                {0xa726'a524'a322'a120, 0xdf5e'dd5c'db5a'd958},
3348                                {0xaf2e'ad2c'ab2a'a928, 0xe766'e564'e362'e160},
3349                                {0xb736'b534'b332'b130, 0xef6e'ed6c'eb6a'e968}});
3350 }
3351 
TEST_F(Riscv64InterpreterTest,TestVlseg8e64)3352 TEST_F(Riscv64InterpreterTest, TestVlseg8e64) {
3353   TestVlsegXeXX<UInt64, 8, 1>(0xe000f407,  // vlseg8e64.v v8, (x1), v0.t
3354                               {{0x8706'8504'8302'8100, 0xc746'c544'c342'c140},
3355                                {0x8f0e'8d0c'8b0a'8908, 0xcf4e'cd4c'cb4a'c948},
3356                                {0x9716'9514'9312'9110, 0xd756'd554'd352'd150},
3357                                {0x9f1e'9d1c'9b1a'9918, 0xdf5e'dd5c'db5a'd958},
3358                                {0xa726'a524'a322'a120, 0xe766'e564'e362'e160},
3359                                {0xaf2e'ad2c'ab2a'a928, 0xef6e'ed6c'eb6a'e968},
3360                                {0xb736'b534'b332'b130, 0xf776'f574'f372'f170},
3361                                {0xbf3e'bd3c'bb3a'b938, 0xff7e'fd7c'fb7a'f978}});
3362 }
3363 
TEST_F(Riscv64InterpreterTest,TestVlse8_vlmul1)3364 TEST_F(Riscv64InterpreterTest, TestVlse8_vlmul1) {
3365   TestVlssegXeXX<UInt8, 1, 1>(0x08208407,  // vlse8.v v8, (x1), x2, v0.t
3366                               4,
3367                               {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60}});
3368 }
3369 
TEST_F(Riscv64InterpreterTest,TestVlse8_vlmul2)3370 TEST_F(Riscv64InterpreterTest, TestVlse8_vlmul2) {
3371   TestVlssegXeXX<UInt8, 1, 2>(
3372       0x08208407,  // vlse8.v v8, (x1), x2, v0.t
3373       4,
3374       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3375        {64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124}});
3376 }
3377 
TEST_F(Riscv64InterpreterTest,TestVlse8_vlmul4)3378 TEST_F(Riscv64InterpreterTest, TestVlse8_vlmul4) {
3379   TestVlssegXeXX<UInt8, 1, 4>(
3380       0x08208407,  // vlse8.v v8, (x1), x2, v0.t
3381       4,
3382       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3383        {64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124},
3384        {0, 9, 17, 24, 32, 41, 49, 56, 64, 73, 81, 88, 96, 105, 113, 120},
3385        {128, 137, 145, 152, 160, 169, 177, 184, 192, 201, 209, 216, 224, 233, 241, 248}});
3386 }
3387 
TEST_F(Riscv64InterpreterTest,TestVlse8_vlmul8)3388 TEST_F(Riscv64InterpreterTest, TestVlse8_vlmul8) {
3389   TestVlssegXeXX<UInt8, 1, 8>(
3390       0x08208407,  // vlse8.v v8, (x1), x2, v0.t
3391       2,
3392       {{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30},
3393        {32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62},
3394        {64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94},
3395        {96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126},
3396        {0, 4, 9, 12, 17, 20, 24, 28, 32, 36, 41, 44, 49, 52, 56, 60},
3397        {64, 68, 73, 76, 81, 84, 88, 92, 96, 100, 105, 108, 113, 116, 120, 124},
3398        {128, 132, 137, 140, 145, 148, 152, 156, 160, 164, 169, 172, 177, 180, 184, 188},
3399        {192, 196, 201, 204, 209, 212, 216, 220, 224, 228, 233, 236, 241, 244, 248, 252}});
3400 }
3401 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e8_vlmul1)3402 TEST_F(Riscv64InterpreterTest, TestVlsseg2e8_vlmul1) {
3403   TestVlssegXeXX<UInt8, 2, 1>(
3404       0x28208407,  // vlsseg2e8.v v8, (x1), x2, v0.t
3405       4,
3406       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3407        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189}});
3408 }
3409 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e8_vlmul2)3410 TEST_F(Riscv64InterpreterTest, TestVlsseg2e8_vlmul2) {
3411   TestVlssegXeXX<UInt8, 2, 2>(
3412       0x28208407,  // vlsseg2e8.v v8, (x1), x2, v0.t
3413       4,
3414       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3415        {64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124},
3416        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189},
3417        {193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 233, 237, 241, 245, 249, 253}});
3418 }
3419 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e8_vlmul4)3420 TEST_F(Riscv64InterpreterTest, TestVlsseg2e8_vlmul4) {
3421   TestVlssegXeXX<UInt8, 2, 4>(
3422       0x28208407,  // vlsseg2e8.v v8, (x1), x2, v0.t
3423       4,
3424       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3425        {64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124},
3426        {0, 9, 17, 24, 32, 41, 49, 56, 64, 73, 81, 88, 96, 105, 113, 120},
3427        {128, 137, 145, 152, 160, 169, 177, 184, 192, 201, 209, 216, 224, 233, 241, 248},
3428        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189},
3429        {193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 233, 237, 241, 245, 249, 253},
3430        {146, 154, 130, 138, 178, 186, 162, 170, 210, 218, 194, 202, 242, 250, 226, 234},
3431        {18, 26, 2, 10, 50, 58, 34, 42, 82, 90, 66, 74, 114, 122, 98, 106}});
3432 }
3433 
TEST_F(Riscv64InterpreterTest,TestVlsseg3e8_vlmul1)3434 TEST_F(Riscv64InterpreterTest, TestVlsseg3e8_vlmul1) {
3435   TestVlssegXeXX<UInt8, 3, 1>(
3436       0x48208407,  // vlsseg3e8.v v8, (x1), x2, v0.t
3437       4,
3438       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3439        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189},
3440        {2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62}});
3441 }
3442 
TEST_F(Riscv64InterpreterTest,TestVlsseg3e8_vlmul2)3443 TEST_F(Riscv64InterpreterTest, TestVlsseg3e8_vlmul2) {
3444   TestVlssegXeXX<UInt8, 3, 2>(
3445       0x48208407,  // vlsseg3e8.v v8, (x1), x2, v0.t
3446       4,
3447       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3448        {64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124},
3449        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189},
3450        {193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 233, 237, 241, 245, 249, 253},
3451        {2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62},
3452        {66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126}});
3453 }
3454 
TEST_F(Riscv64InterpreterTest,TestVlsseg4e8_vlmul1)3455 TEST_F(Riscv64InterpreterTest, TestVlsseg4e8_vlmul1) {
3456   TestVlssegXeXX<UInt8, 4, 1>(
3457       0x68208407,  // vlsseg4e8.v v8, (x1), x2, v0.t
3458       4,
3459       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3460        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189},
3461        {2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62},
3462        {131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191}});
3463 }
3464 
TEST_F(Riscv64InterpreterTest,TestVlsseg4e8_vlmul2)3465 TEST_F(Riscv64InterpreterTest, TestVlsseg4e8_vlmul2) {
3466   TestVlssegXeXX<UInt8, 4, 2>(
3467       0x68208407,  // vlsseg4e8.v v8, (x1), x2, v0.t
3468       4,
3469       {{0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60},
3470        {64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124},
3471        {129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189},
3472        {193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 233, 237, 241, 245, 249, 253},
3473        {2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62},
3474        {66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126},
3475        {131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191},
3476        {195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255}});
3477 }
3478 
TEST_F(Riscv64InterpreterTest,TestVlsseg5e8)3479 TEST_F(Riscv64InterpreterTest, TestVlsseg5e8) {
3480   TestVlssegXeXX<UInt8, 5, 1>(
3481       0x88208407,  // vlsseg5e8.v v8, (x1), x2, v0.t
3482       8,
3483       {{0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120},
3484        {129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249},
3485        {2, 10, 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, 122},
3486        {131, 139, 147, 155, 163, 171, 179, 187, 195, 203, 211, 219, 227, 235, 243, 251},
3487        {4, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124}});
3488 }
3489 
TEST_F(Riscv64InterpreterTest,TestVlsseg6e8)3490 TEST_F(Riscv64InterpreterTest, TestVlsseg6e8) {
3491   TestVlssegXeXX<UInt8, 6, 1>(
3492       0xa8208407,  // vlsseg6e8.v v8, (x1), x2, v0.t
3493       8,
3494       {{0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120},
3495        {129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249},
3496        {2, 10, 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, 122},
3497        {131, 139, 147, 155, 163, 171, 179, 187, 195, 203, 211, 219, 227, 235, 243, 251},
3498        {4, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124},
3499        {133, 141, 149, 157, 165, 173, 181, 189, 197, 205, 213, 221, 229, 237, 245, 253}});
3500 }
3501 
TEST_F(Riscv64InterpreterTest,TestVlsseg7e8)3502 TEST_F(Riscv64InterpreterTest, TestVlsseg7e8) {
3503   TestVlssegXeXX<UInt8, 7, 1>(
3504       0xc8208407,  // vlsseg7e8.v v8, (x1), x2, v0.t
3505       8,
3506       {{0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120},
3507        {129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249},
3508        {2, 10, 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, 122},
3509        {131, 139, 147, 155, 163, 171, 179, 187, 195, 203, 211, 219, 227, 235, 243, 251},
3510        {4, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124},
3511        {133, 141, 149, 157, 165, 173, 181, 189, 197, 205, 213, 221, 229, 237, 245, 253},
3512        {6, 14, 22, 30, 38, 46, 54, 62, 70, 78, 86, 94, 102, 110, 118, 126}});
3513 }
3514 
TEST_F(Riscv64InterpreterTest,TestVlsseg8e8)3515 TEST_F(Riscv64InterpreterTest, TestVlsseg8e8) {
3516   TestVlssegXeXX<UInt8, 8, 1>(
3517       0xe8208407,  // vlsseg8e8.v v8, (x1), x2, v0.t
3518       8,
3519       {{0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120},
3520        {129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249},
3521        {2, 10, 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, 122},
3522        {131, 139, 147, 155, 163, 171, 179, 187, 195, 203, 211, 219, 227, 235, 243, 251},
3523        {4, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124},
3524        {133, 141, 149, 157, 165, 173, 181, 189, 197, 205, 213, 221, 229, 237, 245, 253},
3525        {6, 14, 22, 30, 38, 46, 54, 62, 70, 78, 86, 94, 102, 110, 118, 126},
3526        {135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 255}});
3527 }
3528 
TEST_F(Riscv64InterpreterTest,TestVlse16_vlmul1)3529 TEST_F(Riscv64InterpreterTest, TestVlse16_vlmul1) {
3530   TestVlssegXeXX<UInt16, 1, 1>(0x820d407,  // vlse16.v v8, (x1), x2, v0.t
3531                                8,
3532                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938}});
3533 }
3534 
TEST_F(Riscv64InterpreterTest,TestVlse16_vlmul2)3535 TEST_F(Riscv64InterpreterTest, TestVlse16_vlmul2) {
3536   TestVlssegXeXX<UInt16, 1, 2>(0x820d407,  // vlse16.v v8, (x1), x2, v0.t
3537                                8,
3538                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3539                                 {0xc140, 0xc948, 0xd150, 0xd958, 0xe160, 0xe968, 0xf170, 0xf978}});
3540 }
3541 
TEST_F(Riscv64InterpreterTest,TestVlse16_vlmul4)3542 TEST_F(Riscv64InterpreterTest, TestVlse16_vlmul4) {
3543   TestVlssegXeXX<UInt16, 1, 4>(0x820d407,  // vlse16.v v8, (x1), x2, v0.t
3544                                8,
3545                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3546                                 {0xc140, 0xc948, 0xd150, 0xd958, 0xe160, 0xe968, 0xf170, 0xf978},
3547                                 {0x9200, 0x8211, 0xb220, 0xa231, 0xd240, 0xc251, 0xf260, 0xe271},
3548                                 {0x1280, 0x0291, 0x32a0, 0x22b1, 0x52c0, 0x42d1, 0x72e0, 0x62f1}});
3549 }
3550 
TEST_F(Riscv64InterpreterTest,TestVlse16_vlmul8)3551 TEST_F(Riscv64InterpreterTest, TestVlse16_vlmul8) {
3552   TestVlssegXeXX<UInt16, 1, 8>(0x820d407,  // vlse16.v v8, (x1), x2, v0.t
3553                                4,
3554                                {{0x8100, 0x8504, 0x8908, 0x8d0c, 0x9110, 0x9514, 0x9918, 0x9d1c},
3555                                 {0xa120, 0xa524, 0xa928, 0xad2c, 0xb130, 0xb534, 0xb938, 0xbd3c},
3556                                 {0xc140, 0xc544, 0xc948, 0xcd4c, 0xd150, 0xd554, 0xd958, 0xdd5c},
3557                                 {0xe160, 0xe564, 0xe968, 0xed6c, 0xf170, 0xf574, 0xf978, 0xfd7c},
3558                                 {0x9200, 0x9a09, 0x8211, 0x8a18, 0xb220, 0xba29, 0xa231, 0xaa38},
3559                                 {0xd240, 0xda49, 0xc251, 0xca58, 0xf260, 0xfa69, 0xe271, 0xea78},
3560                                 {0x1280, 0x1a89, 0x0291, 0x0a98, 0x32a0, 0x3aa9, 0x22b1, 0x2ab8},
3561                                 {0x52c0, 0x5ac9, 0x42d1, 0x4ad8, 0x72e0, 0x7ae9, 0x62f1, 0x6af8}});
3562 }
3563 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e16_vlmul1)3564 TEST_F(Riscv64InterpreterTest, TestVlsseg2e16_vlmul1) {
3565   TestVlssegXeXX<UInt16, 2, 1>(0x2820d407,  // vlsseg2e16.v v8, (x1), x2, v0.t
3566                                8,
3567                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3568                                 {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a}});
3569 }
3570 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e16_vlmul2)3571 TEST_F(Riscv64InterpreterTest, TestVlsseg2e16_vlmul2) {
3572   TestVlssegXeXX<UInt16, 2, 2>(0x2820d407,  // vlsseg2e16.v v8, (x1), x2, v0.t
3573                                8,
3574                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3575                                 {0xc140, 0xc948, 0xd150, 0xd958, 0xe160, 0xe968, 0xf170, 0xf978},
3576                                 {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a},
3577                                 {0xc342, 0xcb4a, 0xd352, 0xdb5a, 0xe362, 0xeb6a, 0xf372, 0xfb7a}});
3578 }
3579 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e16_vlmul4)3580 TEST_F(Riscv64InterpreterTest, TestVlsseg2e16_vlmul4) {
3581   TestVlssegXeXX<UInt16, 2, 4>(0x2820d407,  // vlsseg2e16.v v8, (x1), x2, v0.t
3582                                8,
3583                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3584                                 {0xc140, 0xc948, 0xd150, 0xd958, 0xe160, 0xe968, 0xf170, 0xf978},
3585                                 {0x9200, 0x8211, 0xb220, 0xa231, 0xd240, 0xc251, 0xf260, 0xe271},
3586                                 {0x1280, 0x0291, 0x32a0, 0x22b1, 0x52c0, 0x42d1, 0x72e0, 0x62f1},
3587                                 {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a},
3588                                 {0xc342, 0xcb4a, 0xd352, 0xdb5a, 0xe362, 0xeb6a, 0xf372, 0xfb7a},
3589                                 {0x9604, 0x8614, 0xb624, 0xa634, 0xd644, 0xc654, 0xf664, 0xe674},
3590                                 {0x1684, 0x0694, 0x36a4, 0x26b4, 0x56c4, 0x46d4, 0x76e4, 0x66f4}});
3591 }
3592 
TEST_F(Riscv64InterpreterTest,TestVlsseg3e16_vlmul1)3593 TEST_F(Riscv64InterpreterTest, TestVlsseg3e16_vlmul1) {
3594   TestVlssegXeXX<UInt16, 3, 1>(0x4820d407,  // vlsseg3e16.v v8, (x1), x2, v0.t
3595                                8,
3596                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3597                                 {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a},
3598                                 {0x8504, 0x8d0c, 0x9514, 0x9d1c, 0xa524, 0xad2c, 0xb534, 0xbd3c}});
3599 }
3600 
TEST_F(Riscv64InterpreterTest,TestVlsseg3e16_vlmul2)3601 TEST_F(Riscv64InterpreterTest, TestVlsseg3e16_vlmul2) {
3602   TestVlssegXeXX<UInt16, 3, 2>(0x4820d407,  // vlsseg3e16.v v8, (x1), x2, v0.t
3603                                8,
3604                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3605                                 {0xc140, 0xc948, 0xd150, 0xd958, 0xe160, 0xe968, 0xf170, 0xf978},
3606                                 {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a},
3607                                 {0xc342, 0xcb4a, 0xd352, 0xdb5a, 0xe362, 0xeb6a, 0xf372, 0xfb7a},
3608                                 {0x8504, 0x8d0c, 0x9514, 0x9d1c, 0xa524, 0xad2c, 0xb534, 0xbd3c},
3609                                 {0xc544, 0xcd4c, 0xd554, 0xdd5c, 0xe564, 0xed6c, 0xf574, 0xfd7c}});
3610 }
3611 
TEST_F(Riscv64InterpreterTest,TestVlsseg4e16_vlmul1)3612 TEST_F(Riscv64InterpreterTest, TestVlsseg4e16_vlmul1) {
3613   TestVlssegXeXX<UInt16, 4, 1>(0x6820d407,  // vlsseg4e16.v v8, (x1), x2, v0.t
3614                                8,
3615                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3616                                 {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a},
3617                                 {0x8504, 0x8d0c, 0x9514, 0x9d1c, 0xa524, 0xad2c, 0xb534, 0xbd3c},
3618                                 {0x8706, 0x8f0e, 0x9716, 0x9f1e, 0xa726, 0xaf2e, 0xb736, 0xbf3e}});
3619 }
3620 
TEST_F(Riscv64InterpreterTest,TestVlsseg4e16_vlmul2)3621 TEST_F(Riscv64InterpreterTest, TestVlsseg4e16_vlmul2) {
3622   TestVlssegXeXX<UInt16, 4, 2>(0x6820d407,  // vlsseg4e16.v v8, (x1), x2, v0.t
3623                                8,
3624                                {{0x8100, 0x8908, 0x9110, 0x9918, 0xa120, 0xa928, 0xb130, 0xb938},
3625                                 {0xc140, 0xc948, 0xd150, 0xd958, 0xe160, 0xe968, 0xf170, 0xf978},
3626                                 {0x8302, 0x8b0a, 0x9312, 0x9b1a, 0xa322, 0xab2a, 0xb332, 0xbb3a},
3627                                 {0xc342, 0xcb4a, 0xd352, 0xdb5a, 0xe362, 0xeb6a, 0xf372, 0xfb7a},
3628                                 {0x8504, 0x8d0c, 0x9514, 0x9d1c, 0xa524, 0xad2c, 0xb534, 0xbd3c},
3629                                 {0xc544, 0xcd4c, 0xd554, 0xdd5c, 0xe564, 0xed6c, 0xf574, 0xfd7c},
3630                                 {0x8706, 0x8f0e, 0x9716, 0x9f1e, 0xa726, 0xaf2e, 0xb736, 0xbf3e},
3631                                 {0xc746, 0xcf4e, 0xd756, 0xdf5e, 0xe766, 0xef6e, 0xf776, 0xff7e}});
3632 }
3633 
TEST_F(Riscv64InterpreterTest,TestVlsseg5e16)3634 TEST_F(Riscv64InterpreterTest, TestVlsseg5e16) {
3635   TestVlssegXeXX<UInt16, 5, 1>(0x8820d407,  // vlsseg5e16.v v8, (x1), x2, v0.t
3636                                16,
3637                                {{0x8100, 0x9110, 0xa120, 0xb130, 0xc140, 0xd150, 0xe160, 0xf170},
3638                                 {0x8302, 0x9312, 0xa322, 0xb332, 0xc342, 0xd352, 0xe362, 0xf372},
3639                                 {0x8504, 0x9514, 0xa524, 0xb534, 0xc544, 0xd554, 0xe564, 0xf574},
3640                                 {0x8706, 0x9716, 0xa726, 0xb736, 0xc746, 0xd756, 0xe766, 0xf776},
3641                                 {0x8908, 0x9918, 0xa928, 0xb938, 0xc948, 0xd958, 0xe968, 0xf978}});
3642 }
3643 
TEST_F(Riscv64InterpreterTest,TestVlsseg6e16)3644 TEST_F(Riscv64InterpreterTest, TestVlsseg6e16) {
3645   TestVlssegXeXX<UInt16, 6, 1>(0xa820d407,  // vlsseg6e16.v v8, (x1), x2, v0.t
3646                                16,
3647                                {{0x8100, 0x9110, 0xa120, 0xb130, 0xc140, 0xd150, 0xe160, 0xf170},
3648                                 {0x8302, 0x9312, 0xa322, 0xb332, 0xc342, 0xd352, 0xe362, 0xf372},
3649                                 {0x8504, 0x9514, 0xa524, 0xb534, 0xc544, 0xd554, 0xe564, 0xf574},
3650                                 {0x8706, 0x9716, 0xa726, 0xb736, 0xc746, 0xd756, 0xe766, 0xf776},
3651                                 {0x8908, 0x9918, 0xa928, 0xb938, 0xc948, 0xd958, 0xe968, 0xf978},
3652                                 {0x8b0a, 0x9b1a, 0xab2a, 0xbb3a, 0xcb4a, 0xdb5a, 0xeb6a, 0xfb7a}});
3653 }
3654 
TEST_F(Riscv64InterpreterTest,TestVlsseg7e16)3655 TEST_F(Riscv64InterpreterTest, TestVlsseg7e16) {
3656   TestVlssegXeXX<UInt16, 7, 1>(0xc820d407,  // vlsseg7e16.v v8, (x1), x2, v0.t
3657                                16,
3658                                {{0x8100, 0x9110, 0xa120, 0xb130, 0xc140, 0xd150, 0xe160, 0xf170},
3659                                 {0x8302, 0x9312, 0xa322, 0xb332, 0xc342, 0xd352, 0xe362, 0xf372},
3660                                 {0x8504, 0x9514, 0xa524, 0xb534, 0xc544, 0xd554, 0xe564, 0xf574},
3661                                 {0x8706, 0x9716, 0xa726, 0xb736, 0xc746, 0xd756, 0xe766, 0xf776},
3662                                 {0x8908, 0x9918, 0xa928, 0xb938, 0xc948, 0xd958, 0xe968, 0xf978},
3663                                 {0x8b0a, 0x9b1a, 0xab2a, 0xbb3a, 0xcb4a, 0xdb5a, 0xeb6a, 0xfb7a},
3664                                 {0x8d0c, 0x9d1c, 0xad2c, 0xbd3c, 0xcd4c, 0xdd5c, 0xed6c, 0xfd7c}});
3665 }
3666 
TEST_F(Riscv64InterpreterTest,TestVlsseg8e16)3667 TEST_F(Riscv64InterpreterTest, TestVlsseg8e16) {
3668   TestVlssegXeXX<UInt16, 8, 1>(0xe820d407,  // vlsseg8e16.v v8, (x1), x2, v0.t
3669                                16,
3670                                {{0x8100, 0x9110, 0xa120, 0xb130, 0xc140, 0xd150, 0xe160, 0xf170},
3671                                 {0x8302, 0x9312, 0xa322, 0xb332, 0xc342, 0xd352, 0xe362, 0xf372},
3672                                 {0x8504, 0x9514, 0xa524, 0xb534, 0xc544, 0xd554, 0xe564, 0xf574},
3673                                 {0x8706, 0x9716, 0xa726, 0xb736, 0xc746, 0xd756, 0xe766, 0xf776},
3674                                 {0x8908, 0x9918, 0xa928, 0xb938, 0xc948, 0xd958, 0xe968, 0xf978},
3675                                 {0x8b0a, 0x9b1a, 0xab2a, 0xbb3a, 0xcb4a, 0xdb5a, 0xeb6a, 0xfb7a},
3676                                 {0x8d0c, 0x9d1c, 0xad2c, 0xbd3c, 0xcd4c, 0xdd5c, 0xed6c, 0xfd7c},
3677                                 {0x8f0e, 0x9f1e, 0xaf2e, 0xbf3e, 0xcf4e, 0xdf5e, 0xef6e, 0xff7e}});
3678 }
3679 
TEST_F(Riscv64InterpreterTest,TestVlse32_vlmul1)3680 TEST_F(Riscv64InterpreterTest, TestVlse32_vlmul1) {
3681   TestVlssegXeXX<UInt32, 1, 1>(0x820e407,  // vlse32.v v8, (x1), x2, v0.t
3682                                16,
3683                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130}});
3684 }
3685 
TEST_F(Riscv64InterpreterTest,TestVlse32_vlmul2)3686 TEST_F(Riscv64InterpreterTest, TestVlse32_vlmul2) {
3687   TestVlssegXeXX<UInt32, 1, 2>(0x820e407,  // vlse32.v v8, (x1), x2, v0.t
3688                                16,
3689                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3690                                 {0xc342'c140, 0xd352'd150, 0xe362'e160, 0xf372'f170}});
3691 }
3692 
TEST_F(Riscv64InterpreterTest,TestVlse32_vlmul4)3693 TEST_F(Riscv64InterpreterTest, TestVlse32_vlmul4) {
3694   TestVlssegXeXX<UInt32, 1, 4>(0x820e407,  // vlse32.v v8, (x1), x2, v0.t
3695                                16,
3696                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3697                                 {0xc342'c140, 0xd352'd150, 0xe362'e160, 0xf372'f170},
3698                                 {0x9604'9200, 0xb624'b220, 0xd644'd240, 0xf664'f260},
3699                                 {0x1684'1280, 0x36a4'32a0, 0x56c4'52c0, 0x76e4'72e0}});
3700 }
3701 
TEST_F(Riscv64InterpreterTest,TestVlse32_vlmul8)3702 TEST_F(Riscv64InterpreterTest, TestVlse32_vlmul8) {
3703   TestVlssegXeXX<UInt32, 1, 8>(0x820e407,  // vlse32.v v8, (x1), x2, v0.t
3704                                8,
3705                                {{0x8302'8100, 0x8b0a'8908, 0x9312'9110, 0x9b1a'9918},
3706                                 {0xa322'a120, 0xab2a'a928, 0xb332'b130, 0xbb3a'b938},
3707                                 {0xc342'c140, 0xcb4a'c948, 0xd352'd150, 0xdb5a'd958},
3708                                 {0xe362'e160, 0xeb6a'e968, 0xf372'f170, 0xfb7a'f978},
3709                                 {0x9604'9200, 0x8614'8211, 0xb624'b220, 0xa634'a231},
3710                                 {0xd644'd240, 0xc654'c251, 0xf664'f260, 0xe674'e271},
3711                                 {0x1684'1280, 0x0694'0291, 0x36a4'32a0, 0x26b4'22b1},
3712                                 {0x56c4'52c0, 0x46d4'42d1, 0x76e4'72e0, 0x66f4'62f1}});
3713 }
3714 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e32_vlmul1)3715 TEST_F(Riscv64InterpreterTest, TestVlsseg2e32_vlmul1) {
3716   TestVlssegXeXX<UInt32, 2, 1>(0x2820e407,  // vlsseg2e32.v v8, (x1), x2, v0.t
3717                                16,
3718                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3719                                 {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534}});
3720 }
3721 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e32_vlmul2)3722 TEST_F(Riscv64InterpreterTest, TestVlsseg2e32_vlmul2) {
3723   TestVlssegXeXX<UInt32, 2, 2>(0x2820e407,  // vlsseg2e32.v v8, (x1), x2, v0.t
3724                                16,
3725                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3726                                 {0xc342'c140, 0xd352'd150, 0xe362'e160, 0xf372'f170},
3727                                 {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534},
3728                                 {0xc746'c544, 0xd756'd554, 0xe766'e564, 0xf776'f574}});
3729 }
3730 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e32_vlmul4)3731 TEST_F(Riscv64InterpreterTest, TestVlsseg2e32_vlmul4) {
3732   TestVlssegXeXX<UInt32, 2, 4>(0x2820e407,  // vlsseg2e32.v v8, (x1), x2, v0.t
3733                                16,
3734                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3735                                 {0xc342'c140, 0xd352'd150, 0xe362'e160, 0xf372'f170},
3736                                 {0x9604'9200, 0xb624'b220, 0xd644'd240, 0xf664'f260},
3737                                 {0x1684'1280, 0x36a4'32a0, 0x56c4'52c0, 0x76e4'72e0},
3738                                 {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534},
3739                                 {0xc746'c544, 0xd756'd554, 0xe766'e564, 0xf776'f574},
3740                                 {0x9e0c'9a09, 0xbe2c'ba29, 0xde4c'da49, 0xfe6c'fa69},
3741                                 {0x1e8c'1a89, 0x3eac'3aa9, 0x5ecc'5ac9, 0x7eec'7ae9}});
3742 }
3743 
TEST_F(Riscv64InterpreterTest,TestVlsseg3e32_vlmul1)3744 TEST_F(Riscv64InterpreterTest, TestVlsseg3e32_vlmul1) {
3745   TestVlssegXeXX<UInt32, 3, 1>(0x4820e407,  // vlsseg3e32.v v8, (x1), x2, v0.t
3746                                16,
3747                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3748                                 {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534},
3749                                 {0x8b0a'8908, 0x9b1a'9918, 0xab2a'a928, 0xbb3a'b938}});
3750 }
3751 
TEST_F(Riscv64InterpreterTest,TestVlsseg3e32_vlmul2)3752 TEST_F(Riscv64InterpreterTest, TestVlsseg3e32_vlmul2) {
3753   TestVlssegXeXX<UInt32, 3, 2>(0x4820e407,  // vlsseg3e32.v v8, (x1), x2, v0.t
3754                                16,
3755                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3756                                 {0xc342'c140, 0xd352'd150, 0xe362'e160, 0xf372'f170},
3757                                 {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534},
3758                                 {0xc746'c544, 0xd756'd554, 0xe766'e564, 0xf776'f574},
3759                                 {0x8b0a'8908, 0x9b1a'9918, 0xab2a'a928, 0xbb3a'b938},
3760                                 {0xcb4a'c948, 0xdb5a'd958, 0xeb6a'e968, 0xfb7a'f978}});
3761 }
3762 
TEST_F(Riscv64InterpreterTest,TestVlsseg4e32_vlmul1)3763 TEST_F(Riscv64InterpreterTest, TestVlsseg4e32_vlmul1) {
3764   TestVlssegXeXX<UInt32, 4, 1>(0x6820e407,  // vlsseg4e32.v v8, (x1), x2, v0.t
3765                                16,
3766                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3767                                 {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534},
3768                                 {0x8b0a'8908, 0x9b1a'9918, 0xab2a'a928, 0xbb3a'b938},
3769                                 {0x8f0e'8d0c, 0x9f1e'9d1c, 0xaf2e'ad2c, 0xbf3e'bd3c}});
3770 }
3771 
TEST_F(Riscv64InterpreterTest,TestVlsseg4e32_vlmul2)3772 TEST_F(Riscv64InterpreterTest, TestVlsseg4e32_vlmul2) {
3773   TestVlssegXeXX<UInt32, 4, 2>(0x6820e407,  // vlsseg4e32.v v8, (x1), x2, v0.t
3774                                16,
3775                                {{0x8302'8100, 0x9312'9110, 0xa322'a120, 0xb332'b130},
3776                                 {0xc342'c140, 0xd352'd150, 0xe362'e160, 0xf372'f170},
3777                                 {0x8706'8504, 0x9716'9514, 0xa726'a524, 0xb736'b534},
3778                                 {0xc746'c544, 0xd756'd554, 0xe766'e564, 0xf776'f574},
3779                                 {0x8b0a'8908, 0x9b1a'9918, 0xab2a'a928, 0xbb3a'b938},
3780                                 {0xcb4a'c948, 0xdb5a'd958, 0xeb6a'e968, 0xfb7a'f978},
3781                                 {0x8f0e'8d0c, 0x9f1e'9d1c, 0xaf2e'ad2c, 0xbf3e'bd3c},
3782                                 {0xcf4e'cd4c, 0xdf5e'dd5c, 0xef6e'ed6c, 0xff7e'fd7c}});
3783 }
3784 
TEST_F(Riscv64InterpreterTest,TestVlsseg5e32)3785 TEST_F(Riscv64InterpreterTest, TestVlsseg5e32) {
3786   TestVlssegXeXX<UInt32, 5, 1>(0x8820e407,  // vlsseg5e32.v v8, (x1), x2, v0.t
3787                                32,
3788                                {{0x8302'8100, 0xa322'a120, 0xc342'c140, 0xe362'e160},
3789                                 {0x8706'8504, 0xa726'a524, 0xc746'c544, 0xe766'e564},
3790                                 {0x8b0a'8908, 0xab2a'a928, 0xcb4a'c948, 0xeb6a'e968},
3791                                 {0x8f0e'8d0c, 0xaf2e'ad2c, 0xcf4e'cd4c, 0xef6e'ed6c},
3792                                 {0x9312'9110, 0xb332'b130, 0xd352'd150, 0xf372'f170}});
3793 }
3794 
TEST_F(Riscv64InterpreterTest,TestVlsseg6e32)3795 TEST_F(Riscv64InterpreterTest, TestVlsseg6e32) {
3796   TestVlssegXeXX<UInt32, 6, 1>(0xa820e407,  // vlsseg6e32.v v8, (x1), x2, v0.t
3797                                32,
3798                                {{0x8302'8100, 0xa322'a120, 0xc342'c140, 0xe362'e160},
3799                                 {0x8706'8504, 0xa726'a524, 0xc746'c544, 0xe766'e564},
3800                                 {0x8b0a'8908, 0xab2a'a928, 0xcb4a'c948, 0xeb6a'e968},
3801                                 {0x8f0e'8d0c, 0xaf2e'ad2c, 0xcf4e'cd4c, 0xef6e'ed6c},
3802                                 {0x9312'9110, 0xb332'b130, 0xd352'd150, 0xf372'f170},
3803                                 {0x9716'9514, 0xb736'b534, 0xd756'd554, 0xf776'f574}});
3804 }
3805 
TEST_F(Riscv64InterpreterTest,TestVlsseg7e32)3806 TEST_F(Riscv64InterpreterTest, TestVlsseg7e32) {
3807   TestVlssegXeXX<UInt32, 7, 1>(0xc820e407,  // vlsseg7e32.v v8, (x1), x2, v0.t
3808                                32,
3809                                {{0x8302'8100, 0xa322'a120, 0xc342'c140, 0xe362'e160},
3810                                 {0x8706'8504, 0xa726'a524, 0xc746'c544, 0xe766'e564},
3811                                 {0x8b0a'8908, 0xab2a'a928, 0xcb4a'c948, 0xeb6a'e968},
3812                                 {0x8f0e'8d0c, 0xaf2e'ad2c, 0xcf4e'cd4c, 0xef6e'ed6c},
3813                                 {0x9312'9110, 0xb332'b130, 0xd352'd150, 0xf372'f170},
3814                                 {0x9716'9514, 0xb736'b534, 0xd756'd554, 0xf776'f574},
3815                                 {0x9b1a'9918, 0xbb3a'b938, 0xdb5a'd958, 0xfb7a'f978}});
3816 }
3817 
TEST_F(Riscv64InterpreterTest,TestVlsseg8e32)3818 TEST_F(Riscv64InterpreterTest, TestVlsseg8e32) {
3819   TestVlssegXeXX<UInt32, 8, 1>(0xe820e407,  // vlsseg8e32.v v8, (x1), x2, v0.t
3820                                32,
3821                                {{0x8302'8100, 0xa322'a120, 0xc342'c140, 0xe362'e160},
3822                                 {0x8706'8504, 0xa726'a524, 0xc746'c544, 0xe766'e564},
3823                                 {0x8b0a'8908, 0xab2a'a928, 0xcb4a'c948, 0xeb6a'e968},
3824                                 {0x8f0e'8d0c, 0xaf2e'ad2c, 0xcf4e'cd4c, 0xef6e'ed6c},
3825                                 {0x9312'9110, 0xb332'b130, 0xd352'd150, 0xf372'f170},
3826                                 {0x9716'9514, 0xb736'b534, 0xd756'd554, 0xf776'f574},
3827                                 {0x9b1a'9918, 0xbb3a'b938, 0xdb5a'd958, 0xfb7a'f978},
3828                                 {0x9f1e'9d1c, 0xbf3e'bd3c, 0xdf5e'dd5c, 0xff7e'fd7c}});
3829 }
3830 
TEST_F(Riscv64InterpreterTest,TestVlse64_vlmul1)3831 TEST_F(Riscv64InterpreterTest, TestVlse64_vlmul1) {
3832   TestVlssegXeXX<UInt64, 1, 1>(0x820f407,  // vlse64.v v8, (x1), x2, v0.t
3833                                32,
3834                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120}});
3835 }
3836 
TEST_F(Riscv64InterpreterTest,TestVlse64_vlmul2)3837 TEST_F(Riscv64InterpreterTest, TestVlse64_vlmul2) {
3838   TestVlssegXeXX<UInt64, 1, 2>(0x820f407,  // vlse64.v v8, (x1), x2, v0.t
3839                                32,
3840                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3841                                 {0xc746'c544'c342'c140, 0xe766'e564'e362'e160}});
3842 }
3843 
TEST_F(Riscv64InterpreterTest,TestVlse64_vlmul4)3844 TEST_F(Riscv64InterpreterTest, TestVlse64_vlmul4) {
3845   TestVlssegXeXX<UInt64, 1, 4>(0x820f407,  // vlse64.v v8, (x1), x2, v0.t
3846                                32,
3847                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3848                                 {0xc746'c544'c342'c140, 0xe766'e564'e362'e160},
3849                                 {0x9e0c'9a09'9604'9200, 0xde4c'da49'd644'd240},
3850                                 {0x1e8c'1a89'1684'1280, 0x5ecc'5ac9'56c4'52c0}});
3851 }
3852 
TEST_F(Riscv64InterpreterTest,TestVlse64_vlmul8)3853 TEST_F(Riscv64InterpreterTest, TestVlse64_vlmul8) {
3854   TestVlssegXeXX<UInt64, 1, 8>(0x820f407,  // vlse64.v v8, (x1), x2, v0.t
3855                                16,
3856                                {{0x8706'8504'8302'8100, 0x9716'9514'9312'9110},
3857                                 {0xa726'a524'a322'a120, 0xb736'b534'b332'b130},
3858                                 {0xc746'c544'c342'c140, 0xd756'd554'd352'd150},
3859                                 {0xe766'e564'e362'e160, 0xf776'f574'f372'f170},
3860                                 {0x9e0c'9a09'9604'9200, 0xbe2c'ba29'b624'b220},
3861                                 {0xde4c'da49'd644'd240, 0xfe6c'fa69'f664'f260},
3862                                 {0x1e8c'1a89'1684'1280, 0x3eac'3aa9'36a4'32a0},
3863                                 {0x5ecc'5ac9'56c4'52c0, 0x7eec'7ae9'76e4'72e0}});
3864 }
3865 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e64_vlmul1)3866 TEST_F(Riscv64InterpreterTest, TestVlsseg2e64_vlmul1) {
3867   TestVlssegXeXX<UInt64, 2, 1>(0x2820f407,  // vlsseg2e64.v v8, (x1), x2, v0.t
3868                                32,
3869                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3870                                 {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928}});
3871 }
3872 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e64_vlmul2)3873 TEST_F(Riscv64InterpreterTest, TestVlsseg2e64_vlmul2) {
3874   TestVlssegXeXX<UInt64, 2, 2>(0x2820f407,  // vlsseg2e64.v v8, (x1), x2, v0.t
3875                                32,
3876                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3877                                 {0xc746'c544'c342'c140, 0xe766'e564'e362'e160},
3878                                 {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928},
3879                                 {0xcf4e'cd4c'cb4a'c948, 0xef6e'ed6c'eb6a'e968}});
3880 }
3881 
TEST_F(Riscv64InterpreterTest,TestVlsseg2e64_vlmul4)3882 TEST_F(Riscv64InterpreterTest, TestVlsseg2e64_vlmul4) {
3883   TestVlssegXeXX<UInt64, 2, 4>(0x2820f407,  // vlsseg2e64.v v8, (x1), x2, v0.t
3884                                32,
3885                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3886                                 {0xc746'c544'c342'c140, 0xe766'e564'e362'e160},
3887                                 {0x9e0c'9a09'9604'9200, 0xde4c'da49'd644'd240},
3888                                 {0x1e8c'1a89'1684'1280, 0x5ecc'5ac9'56c4'52c0},
3889                                 {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928},
3890                                 {0xcf4e'cd4c'cb4a'c948, 0xef6e'ed6c'eb6a'e968},
3891                                 {0x8e1c'8a18'8614'8211, 0xce5c'ca58'c654'c251},
3892                                 {0x0e9c'0a98'0694'0291, 0x4edc'4ad8'46d4'42d1}});
3893 }
3894 
TEST_F(Riscv64InterpreterTest,TestVlsseg3e64_vlmul1)3895 TEST_F(Riscv64InterpreterTest, TestVlsseg3e64_vlmul1) {
3896   TestVlssegXeXX<UInt64, 3, 1>(0x4820f407,  // vlsseg3e64.v v8, (x1), x2, v0.t
3897                                32,
3898                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3899                                 {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928},
3900                                 {0x9716'9514'9312'9110, 0xb736'b534'b332'b130}});
3901 }
3902 
TEST_F(Riscv64InterpreterTest,TestVlsseg3e64_vlmul2)3903 TEST_F(Riscv64InterpreterTest, TestVlsseg3e64_vlmul2) {
3904   TestVlssegXeXX<UInt64, 3, 2>(0x4820f407,  // vlsseg3e64.v v8, (x1), x2, v0.t
3905                                32,
3906                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3907                                 {0xc746'c544'c342'c140, 0xe766'e564'e362'e160},
3908                                 {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928},
3909                                 {0xcf4e'cd4c'cb4a'c948, 0xef6e'ed6c'eb6a'e968},
3910                                 {0x9716'9514'9312'9110, 0xb736'b534'b332'b130},
3911                                 {0xd756'd554'd352'd150, 0xf776'f574'f372'f170}});
3912 }
3913 
TEST_F(Riscv64InterpreterTest,TestVlsseg4e64_vlmul1)3914 TEST_F(Riscv64InterpreterTest, TestVlsseg4e64_vlmul1) {
3915   TestVlssegXeXX<UInt64, 4, 1>(0x6820f407,  // vlsseg4e64.v v8, (x1), x2, v0.t
3916                                32,
3917                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3918                                 {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928},
3919                                 {0x9716'9514'9312'9110, 0xb736'b534'b332'b130},
3920                                 {0x9f1e'9d1c'9b1a'9918, 0xbf3e'bd3c'bb3a'b938}});
3921 }
3922 
TEST_F(Riscv64InterpreterTest,TestVlsseg4e64_vlmul2)3923 TEST_F(Riscv64InterpreterTest, TestVlsseg4e64_vlmul2) {
3924   TestVlssegXeXX<UInt64, 4, 2>(0x6820f407,  // vlsseg4e64.v v8, (x1), x2, v0.t
3925                                32,
3926                                {{0x8706'8504'8302'8100, 0xa726'a524'a322'a120},
3927                                 {0xc746'c544'c342'c140, 0xe766'e564'e362'e160},
3928                                 {0x8f0e'8d0c'8b0a'8908, 0xaf2e'ad2c'ab2a'a928},
3929                                 {0xcf4e'cd4c'cb4a'c948, 0xef6e'ed6c'eb6a'e968},
3930                                 {0x9716'9514'9312'9110, 0xb736'b534'b332'b130},
3931                                 {0xd756'd554'd352'd150, 0xf776'f574'f372'f170},
3932                                 {0x9f1e'9d1c'9b1a'9918, 0xbf3e'bd3c'bb3a'b938},
3933                                 {0xdf5e'dd5c'db5a'd958, 0xff7e'fd7c'fb7a'f978}});
3934 }
3935 
TEST_F(Riscv64InterpreterTest,TestVlsseg5e64)3936 TEST_F(Riscv64InterpreterTest, TestVlsseg5e64) {
3937   TestVlssegXeXX<UInt64, 5, 1>(0x8820f407,  // vlsseg5e64.v v8, (x1), x2, v0.t
3938                                64,
3939                                {{0x8706'8504'8302'8100, 0xc746'c544'c342'c140},
3940                                 {0x8f0e'8d0c'8b0a'8908, 0xcf4e'cd4c'cb4a'c948},
3941                                 {0x9716'9514'9312'9110, 0xd756'd554'd352'd150},
3942                                 {0x9f1e'9d1c'9b1a'9918, 0xdf5e'dd5c'db5a'd958},
3943                                 {0xa726'a524'a322'a120, 0xe766'e564'e362'e160}});
3944 }
3945 
TEST_F(Riscv64InterpreterTest,TestVlsseg6e64)3946 TEST_F(Riscv64InterpreterTest, TestVlsseg6e64) {
3947   TestVlssegXeXX<UInt64, 6, 1>(0xa820f407,  // vlsseg6e64.v v8, (x1), x2, v0.t
3948                                64,
3949                                {{0x8706'8504'8302'8100, 0xc746'c544'c342'c140},
3950                                 {0x8f0e'8d0c'8b0a'8908, 0xcf4e'cd4c'cb4a'c948},
3951                                 {0x9716'9514'9312'9110, 0xd756'd554'd352'd150},
3952                                 {0x9f1e'9d1c'9b1a'9918, 0xdf5e'dd5c'db5a'd958},
3953                                 {0xa726'a524'a322'a120, 0xe766'e564'e362'e160},
3954                                 {0xaf2e'ad2c'ab2a'a928, 0xef6e'ed6c'eb6a'e968}});
3955 }
3956 
TEST_F(Riscv64InterpreterTest,TestVlsseg7e64)3957 TEST_F(Riscv64InterpreterTest, TestVlsseg7e64) {
3958   TestVlssegXeXX<UInt64, 7, 1>(0xc820f407,  // vlsseg7e64.v v8, (x1), x2, v0.t
3959                                64,
3960                                {{0x8706'8504'8302'8100, 0xc746'c544'c342'c140},
3961                                 {0x8f0e'8d0c'8b0a'8908, 0xcf4e'cd4c'cb4a'c948},
3962                                 {0x9716'9514'9312'9110, 0xd756'd554'd352'd150},
3963                                 {0x9f1e'9d1c'9b1a'9918, 0xdf5e'dd5c'db5a'd958},
3964                                 {0xa726'a524'a322'a120, 0xe766'e564'e362'e160},
3965                                 {0xaf2e'ad2c'ab2a'a928, 0xef6e'ed6c'eb6a'e968},
3966                                 {0xb736'b534'b332'b130, 0xf776'f574'f372'f170}});
3967 }
3968 
TEST_F(Riscv64InterpreterTest,TestVlsseg8e64)3969 TEST_F(Riscv64InterpreterTest, TestVlsseg8e64) {
3970   TestVlssegXeXX<UInt64, 8, 1>(0xe820f407,  // vlsseg8e64.v v8, (x1), x2, v0.t
3971                                64,
3972                                {{0x8706'8504'8302'8100, 0xc746'c544'c342'c140},
3973                                 {0x8f0e'8d0c'8b0a'8908, 0xcf4e'cd4c'cb4a'c948},
3974                                 {0x9716'9514'9312'9110, 0xd756'd554'd352'd150},
3975                                 {0x9f1e'9d1c'9b1a'9918, 0xdf5e'dd5c'db5a'd958},
3976                                 {0xa726'a524'a322'a120, 0xe766'e564'e362'e160},
3977                                 {0xaf2e'ad2c'ab2a'a928, 0xef6e'ed6c'eb6a'e968},
3978                                 {0xb736'b534'b332'b130, 0xf776'f574'f372'f170},
3979                                 {0xbf3e'bd3c'bb3a'b938, 0xff7e'fd7c'fb7a'f978}});
3980 }
3981 
TEST_F(Riscv64InterpreterTest,TestVlm)3982 TEST_F(Riscv64InterpreterTest, TestVlm) {
3983   TestVlm(0x2b08407,  // vlm.v v8, (x1)
3984           {0, 129, 2, 131, 4, 133, 6, 135, 8, 137, 10, 139, 12, 141, 14, 143});
3985 }
3986 
TEST_F(Riscv64InterpreterTest,Vsxei8_sew8_vlmul1)3987 TEST_F(Riscv64InterpreterTest, Vsxei8_sew8_vlmul1) {
3988   VsxsegXeiXX<UInt8, 1, 1>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
3989                            {0x0487'8506'0283'0081, 0x0a89'0c8d'8b8f'080e});
3990 }
3991 
TEST_F(Riscv64InterpreterTest,Vsxei8_sew8_vlmul2)3992 TEST_F(Riscv64InterpreterTest, Vsxei8_sew8_vlmul2) {
3993   VsxsegXeiXX<UInt8, 1, 2>(
3994       0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
3995       {0x0487'8506'0283'0081, 0x0a89'0c8d'8b8f'080e, 0x9f93'9b1e'9714'121a, 0x9110'1899'1c95'169d});
3996 }
3997 
TEST_F(Riscv64InterpreterTest,Vsxei8_sew8_vlmul4)3998 TEST_F(Riscv64InterpreterTest, Vsxei8_sew8_vlmul4) {
3999   VsxsegXeiXX<UInt8, 1, 4>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4000                            {0x0487'8506'0283'0081,
4001                             0x0a89'0c8d'8b8f'080e,
4002                             0x9f93'9b1e'9714'121a,
4003                             0x9110'1899'1c95'169d,
4004                             0x2ea5'bd2c'30a3'38b9,
4005                             0xafad'3e20'a728'b1ab,
4006                             0x3626'b722'b5a1'bbbf,
4007                             0xa932'2434'b33a'2a3c});
4008 }
4009 
TEST_F(Riscv64InterpreterTest,Vsxei8_sew8_vlmul8)4010 TEST_F(Riscv64InterpreterTest, Vsxei8_sew8_vlmul8) {
4011   VsxsegXeiXX<UInt8, 1, 8>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4012                            {0x0487'8506'0283'0081,
4013                             0x0a89'0c8d'8b8f'080e,
4014                             0x9f93'9b1e'9714'121a,
4015                             0x9110'1899'1c95'169d,
4016                             0x2ea5'bd2c'30a3'38b9,
4017                             0xafad'3e20'a728'b1ab,
4018                             0x3626'b722'b5a1'bbbf,
4019                             0xa932'2434'b33a'2a3c,
4020                             0x6aed'ddd1'e35c'66c7,
4021                             0xd542'72e1'4674'4ed3,
4022                             0x78ef'd9e7'7a7e'eb76,
4023                             0xfbf9'f5c1'6e5a'c5ff,
4024                             0x52cd'c362'6c48'dfd7,
4025                             0x4a54'50fd'f3f7'cf68,
4026                             0x56cb'e57c'7044'60c9,
4027                             0xf1db'6440'58e9'4c5e});
4028 }
4029 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew8_vlmul1)4030 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew8_vlmul1) {
4031   VsxsegXeiXX<UInt8, 2, 1>(
4032       0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4033       {0x1202'9383'1000'9181, 0x1404'9787'9585'1606, 0x9b8b'9f8f'1808'1e0e, 0x1a0a'9989'1c0c'9d8d});
4034 }
4035 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew8_vlmul2)4036 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew8_vlmul2) {
4037   VsxsegXeiXX<UInt8, 2, 2>(0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4038                            {0x2202'a383'2000'a181,
4039                             0x2404'a787'a585'2606,
4040                             0xab8b'af8f'2808'2e0e,
4041                             0x2a0a'a989'2c0c'ad8d,
4042                             0xb797'3414'3212'3a1a,
4043                             0xbf9f'b393'bb9b'3e1e,
4044                             0x3c1c'b595'3616'bd9d,
4045                             0xb191'3010'3818'b999});
4046 }
4047 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew8_vlmul4)4048 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew8_vlmul4) {
4049   VsxsegXeiXX<UInt8, 2, 4>(0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4050                            {0x4202'c383'4000'c181,
4051                             0x4404'c787'c585'4606,
4052                             0xcb8b'cf8f'4808'4e0e,
4053                             0x4a0a'c989'4c0c'cd8d,
4054                             0xd797'5414'5212'5a1a,
4055                             0xdf9f'd393'db9b'5e1e,
4056                             0x5c1c'd595'5616'dd9d,
4057                             0xd191'5010'5818'd999,
4058                             0x7030'e3a3'7838'f9b9,
4059                             0x6e2e'e5a5'fdbd'6c2c,
4060                             0xe7a7'6828'f1b1'ebab,
4061                             0xefaf'edad'7e3e'6020,
4062                             0xf5b5'e1a1'fbbb'ffbf,
4063                             0x7636'6626'f7b7'6222,
4064                             0xf3b3'7a3a'6a2a'7c3c,
4065                             0xe9a9'7232'6424'7434});
4066 }
4067 
TEST_F(Riscv64InterpreterTest,Vsxseg3eiXX_sew8_vlmul1)4068 TEST_F(Riscv64InterpreterTest, Vsxseg3eiXX_sew8_vlmul1) {
4069   VsxsegXeiXX<UInt8, 3, 1>(0x45008427,  // Vsuxseg3ei8.v v8, (x1), v16, v0.t
4070                            {0x9383'2010'00a1'9181,
4071                             0x8526'1606'2212'02a3,
4072                             0x2414'04a7'9787'a595,
4073                             0x9f8f'2818'082e'1e0e,
4074                             0x0cad'9d8d'ab9b'8baf,
4075                             0x2a1a'0aa9'9989'2c1c});
4076 }
4077 
TEST_F(Riscv64InterpreterTest,Vsxseg3eiXX_sew8_vlmul2)4078 TEST_F(Riscv64InterpreterTest, Vsxseg3eiXX_sew8_vlmul2) {
4079   VsxsegXeiXX<UInt8, 3, 2>(0x45008427,  // Vsuxseg3ei8.v v8, (x1), v16, v0.t
4080                            {0xa383'4020'00c1'a181,
4081                             0x8546'2606'4222'02c3,
4082                             0x4424'04c7'a787'c5a5,
4083                             0xaf8f'4828'084e'2e0e,
4084                             0x0ccd'ad8d'cbab'8bcf,
4085                             0x4a2a'0ac9'a989'4c2c,
4086                             0x3414'5232'125a'3a1a,
4087                             0x9b5e'3e1e'd7b7'9754,
4088                             0xdfbf'9fd3'b393'dbbb,
4089                             0xb595'5636'16dd'bd9d,
4090                             0x18d9'b999'5c3c'1cd5,
4091                             0xd1b1'9150'3010'5838});
4092 }
4093 
TEST_F(Riscv64InterpreterTest,Vsxseg4eiXX_sew8_vlmul1)4094 TEST_F(Riscv64InterpreterTest, Vsxseg4eiXX_sew8_vlmul1) {
4095   VsxsegXeiXX<UInt8, 4, 1>(0x65008427,  // Vsuxseg4ei8.v v8, (x1), v16, v0.t
4096                            {0x3020'1000'b1a1'9181,
4097                             0x3222'1202'b3a3'9383,
4098                             0xb5a5'9585'3626'1606,
4099                             0x3424'1404'b7a7'9787,
4100                             0x3828'1808'3e2e'1e0e,
4101                             0xbbab'9b8b'bfaf'9f8f,
4102                             0x3c2c'1c0c'bdad'9d8d,
4103                             0x3a2a'1a0a'b9a9'9989});
4104 }
4105 
TEST_F(Riscv64InterpreterTest,Vsxseg4eiXX_sew8_vlmul2)4106 TEST_F(Riscv64InterpreterTest, Vsxseg4eiXX_sew8_vlmul2) {
4107   VsxsegXeiXX<UInt8, 4, 2>(0x65008427,  // Vsuxseg4ei8.v v8, (x1), v16, v0.t
4108                            {0x6040'2000'e1c1'a181,
4109                             0x6242'2202'e3c3'a383,
4110                             0xe5c5'a585'6646'2606,
4111                             0x6444'2404'e7c7'a787,
4112                             0x6848'2808'6e4e'2e0e,
4113                             0xebcb'ab8b'efcf'af8f,
4114                             0x6c4c'2c0c'edcd'ad8d,
4115                             0x6a4a'2a0a'e9c9'a989,
4116                             0x7252'3212'7a5a'3a1a,
4117                             0xf7d7'b797'7454'3414,
4118                             0xfbdb'bb9b'7e5e'3e1e,
4119                             0xffdf'bf9f'f3d3'b393,
4120                             0x7656'3616'fddd'bd9d,
4121                             0x7c5c'3c1c'f5d5'b595,
4122                             0x7858'3818'f9d9'b999,
4123                             0xf1d1'b191'7050'3010});
4124 }
4125 
TEST_F(Riscv64InterpreterTest,Vsxseg5eiXX_sew8)4126 TEST_F(Riscv64InterpreterTest, Vsxseg5eiXX_sew8) {
4127   VsxsegXeiXX<UInt8, 5, 1>(0x85008427,  // Vsuxseg5ei8.v v8, (x1), v16, v0.t
4128                            {0x2010'00c1'b1a1'9181,
4129                             0x02c3'b3a3'9383'4030,
4130                             0x3626'1606'4232'2212,
4131                             0x9787'c5b5'a595'8546,
4132                             0x4434'2414'04c7'b7a7,
4133                             0x2818'084e'3e2e'1e0e,
4134                             0x8bcf'bfaf'9f8f'4838,
4135                             0xbdad'9d8d'cbbb'ab9b,
4136                             0x9989'4c3c'2c1c'0ccd,
4137                             0x4a3a'2a1a'0ac9'b9a9});
4138 }
4139 
TEST_F(Riscv64InterpreterTest,Vsxseg6eiXX_sew8)4140 TEST_F(Riscv64InterpreterTest, Vsxseg6eiXX_sew8) {
4141   VsxsegXeiXX<UInt8, 6, 1>(0xa5008427,  // Vsuxseg6ei8.v v8, (x1), v16, v0.t
4142                            {0x1000'd1c1'b1a1'9181,
4143                             0xb3a3'9383'5040'3020,
4144                             0x5242'3222'1202'd3c3,
4145                             0x9585'5646'3626'1606,
4146                             0xb7a7'9787'd5c5'b5a5,
4147                             0x5444'3424'1404'd7c7,
4148                             0x1808'5e4e'3e2e'1e0e,
4149                             0xbfaf'9f8f'5848'3828,
4150                             0xdbcb'bbab'9b8b'dfcf,
4151                             0x1c0c'ddcd'bdad'9d8d,
4152                             0xb9a9'9989'5c4c'3c2c,
4153                             0x5a4a'3a2a'1a0a'd9c9});
4154 }
4155 
TEST_F(Riscv64InterpreterTest,Vsxseg7eiXX_sew8)4156 TEST_F(Riscv64InterpreterTest, Vsxseg7eiXX_sew8) {
4157   VsxsegXeiXX<UInt8, 7, 1>(0xc5008427,  // Vsuxseg7ei8.v v8, (x1), v16, v0.t
4158                            {0x00e1'd1c1'b1a1'9181,
4159                             0x9383'6050'4030'2010,
4160                             0x2212'02e3'd3c3'b3a3,
4161                             0x3626'1606'6252'4232,
4162                             0xc5b5'a595'8566'5646,
4163                             0xd7c7'b7a7'9787'e5d5,
4164                             0x6454'4434'2414'04e7,
4165                             0x086e'5e4e'3e2e'1e0e,
4166                             0x9f8f'6858'4838'2818,
4167                             0xab9b'8bef'dfcf'bfaf,
4168                             0xbdad'9d8d'ebdb'cbbb,
4169                             0x4c3c'2c1c'0ced'ddcd,
4170                             0xd9c9'b9a9'9989'6c5c,
4171                             0x6a5a'4a3a'2a1a'0ae9});
4172 }
4173 
TEST_F(Riscv64InterpreterTest,Vsxseg8eiXX_sew8)4174 TEST_F(Riscv64InterpreterTest, Vsxseg8eiXX_sew8) {
4175   VsxsegXeiXX<UInt8, 8, 1>(0xe5008427,  // Vsuxseg8ei8.v v8, (x1), v16, v0.t
4176                            {0xf1e1'd1c1'b1a1'9181,
4177                             0x7060'5040'3020'1000,
4178                             0xf3e3'd3c3'b3a3'9383,
4179                             0x7262'5242'3222'1202,
4180                             0x7666'5646'3626'1606,
4181                             0xf5e5'd5c5'b5a5'9585,
4182                             0xf7e7'd7c7'b7a7'9787,
4183                             0x7464'5444'3424'1404,
4184                             0x7e6e'5e4e'3e2e'1e0e,
4185                             0x7868'5848'3828'1808,
4186                             0xffef'dfcf'bfaf'9f8f,
4187                             0xfbeb'dbcb'bbab'9b8b,
4188                             0xfded'ddcd'bdad'9d8d,
4189                             0x7c6c'5c4c'3c2c'1c0c,
4190                             0xf9e9'd9c9'b9a9'9989,
4191                             0x7a6a'5a4a'3a2a'1a0a});
4192 }
4193 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew16_vlmul1)4194 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew16_vlmul1) {
4195   VsxsegXeiXX<UInt16, 1, 1>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4196                             {0x8504'8706'8100'8302, 0x8908'8f0e'8b0a'8d0c});
4197 }
4198 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew16_vlmul2)4199 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew16_vlmul2) {
4200   VsxsegXeiXX<UInt16, 1, 2>(
4201       0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4202       {0x8504'8706'8100'8302, 0x8908'8f0e'8b0a'8d0c, 0x9716'9f1e'9110'9d1c, 0x9514'9312'9918'9b1a});
4203 }
4204 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew16_vlmul4)4205 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew16_vlmul4) {
4206   VsxsegXeiXX<UInt16, 1, 4>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4207                             {0x8504'8706'8100'8302,
4208                              0x8908'8f0e'8b0a'8d0c,
4209                              0x9716'9f1e'9110'9d1c,
4210                              0x9514'9312'9918'9b1a,
4211                              0xaf2e'a928'a524'b534,
4212                              0xbf3e'a726'b736'bd3c,
4213                              0xb938'ab2a'ad2c'bb3a,
4214                              0xa322'a120'b130'b332});
4215 }
4216 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew16_vlmul8)4217 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew16_vlmul8) {
4218   VsxsegXeiXX<UInt16, 1, 8>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4219                             {0x8504'8706'8100'8302,
4220                              0x8908'8f0e'8b0a'8d0c,
4221                              0x9716'9f1e'9110'9d1c,
4222                              0x9514'9312'9918'9b1a,
4223                              0xaf2e'a928'a524'b534,
4224                              0xbf3e'a726'b736'bd3c,
4225                              0xb938'ab2a'ad2c'bb3a,
4226                              0xa322'a120'b130'b332,
4227                              0xe160'c746'f170'f372,
4228                              0xdd5c'cb4a'fb7a'd958,
4229                              0xcf4e'd150'e362'd756,
4230                              0xdf5e'db5a'fd7c'c140,
4231                              0xeb6a'c342'f776'ff7e,
4232                              0xed6c'cd4c'ef6e'c544,
4233                              0xe766'f574'd554'f978,
4234                              0xd352'e564'c948'e968});
4235 }
4236 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew16_vlmul1)4237 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew16_vlmul1) {
4238   VsxsegXeiXX<UInt16, 2, 1>(
4239       0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4240       {0x9110'8100'9312'8302, 0x9514'8504'9716'8706, 0x9b1a'8b0a'9d1c'8d0c, 0x9918'8908'9f1e'8f0e});
4241 }
4242 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew16_vlmul2)4243 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew16_vlmul2) {
4244   VsxsegXeiXX<UInt16, 2, 2>(0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4245                             {0xa120'8100'a322'8302,
4246                              0xa524'8504'a726'8706,
4247                              0xab2a'8b0a'ad2c'8d0c,
4248                              0xa928'8908'af2e'8f0e,
4249                              0xb130'9110'bd3c'9d1c,
4250                              0xb736'9716'bf3e'9f1e,
4251                              0xb938'9918'bb3a'9b1a,
4252                              0xb534'9514'b332'9312});
4253 }
4254 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew16_vlmul4)4255 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew16_vlmul4) {
4256   VsxsegXeiXX<UInt16, 2, 4>(0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4257                             {0xc140'8100'c342'8302,
4258                              0xc544'8504'c746'8706,
4259                              0xcb4a'8b0a'cd4c'8d0c,
4260                              0xc948'8908'cf4e'8f0e,
4261                              0xd150'9110'dd5c'9d1c,
4262                              0xd756'9716'df5e'9f1e,
4263                              0xd958'9918'db5a'9b1a,
4264                              0xd554'9514'd352'9312,
4265                              0xe564'a524'f574'b534,
4266                              0xef6e'af2e'e968'a928,
4267                              0xf776'b736'fd7c'bd3c,
4268                              0xff7e'bf3e'e766'a726,
4269                              0xed6c'ad2c'fb7a'bb3a,
4270                              0xf978'b938'eb6a'ab2a,
4271                              0xf170'b130'f372'b332,
4272                              0xe362'a322'e160'a120});
4273 }
4274 
TEST_F(Riscv64InterpreterTest,Vsxseg3eiXX_sew16_vlmul1)4275 TEST_F(Riscv64InterpreterTest, Vsxseg3eiXX_sew16_vlmul1) {
4276   VsxsegXeiXX<UInt16, 3, 1>(0x45008427,  // Vsuxseg3ei8.v v8, (x1), v16, v0.t
4277                             {0x8100'a322'9312'8302,
4278                              0x9716'8706'a120'9110,
4279                              0xa524'9514'8504'a726,
4280                              0x8b0a'ad2c'9d1c'8d0c,
4281                              0x9f1e'8f0e'ab2a'9b1a,
4282                              0xa928'9918'8908'af2e});
4283 }
4284 
TEST_F(Riscv64InterpreterTest,Vsxseg3eiXX_sew16_vlmul2)4285 TEST_F(Riscv64InterpreterTest, Vsxseg3eiXX_sew16_vlmul2) {
4286   VsxsegXeiXX<UInt16, 3, 2>(0x45008427,  // Vsuxseg3ei8.v v8, (x1), v16, v0.t
4287                             {0x8100'c342'a322'8302,
4288                              0xa726'8706'c140'a120,
4289                              0xc544'a524'8504'c746,
4290                              0x8b0a'cd4c'ad2c'8d0c,
4291                              0xaf2e'8f0e'cb4a'ab2a,
4292                              0xc948'a928'8908'cf4e,
4293                              0x9110'dd5c'bd3c'9d1c,
4294                              0xbf3e'9f1e'd150'b130,
4295                              0xd756'b736'9716'df5e,
4296                              0x9918'db5a'bb3a'9b1a,
4297                              0xb332'9312'd958'b938,
4298                              0xd554'b534'9514'd352});
4299 }
4300 
TEST_F(Riscv64InterpreterTest,Vsxseg4eiXX_sew16_vlmul1)4301 TEST_F(Riscv64InterpreterTest, Vsxseg4eiXX_sew16_vlmul1) {
4302   VsxsegXeiXX<UInt16, 4, 1>(0x65008427,  // Vsuxseg4ei8.v v8, (x1), v16, v0.t
4303                             {0xb332'a322'9312'8302,
4304                              0xb130'a120'9110'8100,
4305                              0xb736'a726'9716'8706,
4306                              0xb534'a524'9514'8504,
4307                              0xbd3c'ad2c'9d1c'8d0c,
4308                              0xbb3a'ab2a'9b1a'8b0a,
4309                              0xbf3e'af2e'9f1e'8f0e,
4310                              0xb938'a928'9918'8908});
4311 }
4312 
TEST_F(Riscv64InterpreterTest,Vsxseg4eiXX_sew16_vlmul2)4313 TEST_F(Riscv64InterpreterTest, Vsxseg4eiXX_sew16_vlmul2) {
4314   VsxsegXeiXX<UInt16, 4, 2>(0x65008427,  // Vsuxseg4ei8.v v8, (x1), v16, v0.t
4315                             {0xe362'c342'a322'8302,
4316                              0xe160'c140'a120'8100,
4317                              0xe766'c746'a726'8706,
4318                              0xe564'c544'a524'8504,
4319                              0xed6c'cd4c'ad2c'8d0c,
4320                              0xeb6a'cb4a'ab2a'8b0a,
4321                              0xef6e'cf4e'af2e'8f0e,
4322                              0xe968'c948'a928'8908,
4323                              0xfd7c'dd5c'bd3c'9d1c,
4324                              0xf170'd150'b130'9110,
4325                              0xff7e'df5e'bf3e'9f1e,
4326                              0xf776'd756'b736'9716,
4327                              0xfb7a'db5a'bb3a'9b1a,
4328                              0xf978'd958'b938'9918,
4329                              0xf372'd352'b332'9312,
4330                              0xf574'd554'b534'9514});
4331 }
4332 
TEST_F(Riscv64InterpreterTest,Vsxseg5eiXX_sew16)4333 TEST_F(Riscv64InterpreterTest, Vsxseg5eiXX_sew16) {
4334   VsxsegXeiXX<UInt16, 5, 1>(0x85008427,  // Vsuxseg5ei8.v v8, (x1), v16, v0.t
4335                             {0xb332'a322'9312'8302,
4336                              0xa120'9110'8100'c342,
4337                              0x9716'8706'c140'b130,
4338                              0x8504'c746'b736'a726,
4339                              0xc544'b534'a524'9514,
4340                              0xbd3c'ad2c'9d1c'8d0c,
4341                              0xab2a'9b1a'8b0a'cd4c,
4342                              0x9f1e'8f0e'cb4a'bb3a,
4343                              0x8908'cf4e'bf3e'af2e,
4344                              0xc948'b938'a928'9918});
4345 }
4346 
TEST_F(Riscv64InterpreterTest,Vsxseg6eiXX_sew16)4347 TEST_F(Riscv64InterpreterTest, Vsxseg6eiXX_sew16) {
4348   VsxsegXeiXX<UInt16, 6, 1>(0xa5008427,  // Vsuxseg6ei8.v v8, (x1), v16, v0.t
4349                             {0xb332'a322'9312'8302,
4350                              0x9110'8100'd352'c342,
4351                              0xd150'c140'b130'a120,
4352                              0xb736'a726'9716'8706,
4353                              0x9514'8504'd756'c746,
4354                              0xd554'c544'b534'a524,
4355                              0xbd3c'ad2c'9d1c'8d0c,
4356                              0x9b1a'8b0a'dd5c'cd4c,
4357                              0xdb5a'cb4a'bb3a'ab2a,
4358                              0xbf3e'af2e'9f1e'8f0e,
4359                              0x9918'8908'df5e'cf4e,
4360                              0xd958'c948'b938'a928});
4361 }
4362 
TEST_F(Riscv64InterpreterTest,Vsxseg7eiXX_sew16)4363 TEST_F(Riscv64InterpreterTest, Vsxseg7eiXX_sew16) {
4364   VsxsegXeiXX<UInt16, 7, 1>(0xc5008427,  // Vsuxseg7ei8.v v8, (x1), v16, v0.t
4365                             {0xb332'a322'9312'8302,
4366                              0x8100'e362'd352'c342,
4367                              0xc140'b130'a120'9110,
4368                              0x9716'8706'e160'd150,
4369                              0xd756'c746'b736'a726,
4370                              0xa524'9514'8504'e766,
4371                              0xe564'd554'c544'b534,
4372                              0xbd3c'ad2c'9d1c'8d0c,
4373                              0x8b0a'ed6c'dd5c'cd4c,
4374                              0xcb4a'bb3a'ab2a'9b1a,
4375                              0x9f1e'8f0e'eb6a'db5a,
4376                              0xdf5e'cf4e'bf3e'af2e,
4377                              0xa928'9918'8908'ef6e,
4378                              0xe968'd958'c948'b938});
4379 }
4380 
TEST_F(Riscv64InterpreterTest,Vsxseg8eiXX_sew16)4381 TEST_F(Riscv64InterpreterTest, Vsxseg8eiXX_sew16) {
4382   VsxsegXeiXX<UInt16, 8, 1>(0xe5008427,  // Vsuxseg8ei8.v v8, (x1), v16, v0.t
4383                             {0xb332'a322'9312'8302,
4384                              0xf372'e362'd352'c342,
4385                              0xb130'a120'9110'8100,
4386                              0xf170'e160'd150'c140,
4387                              0xb736'a726'9716'8706,
4388                              0xf776'e766'd756'c746,
4389                              0xb534'a524'9514'8504,
4390                              0xf574'e564'd554'c544,
4391                              0xbd3c'ad2c'9d1c'8d0c,
4392                              0xfd7c'ed6c'dd5c'cd4c,
4393                              0xbb3a'ab2a'9b1a'8b0a,
4394                              0xfb7a'eb6a'db5a'cb4a,
4395                              0xbf3e'af2e'9f1e'8f0e,
4396                              0xff7e'ef6e'df5e'cf4e,
4397                              0xb938'a928'9918'8908,
4398                              0xf978'e968'd958'c948});
4399 }
4400 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew32_vlmul1)4401 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew32_vlmul1) {
4402   VsxsegXeiXX<UInt32, 1, 1>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4403                             {0x8302'8100'8706'8504, 0x8b0a'8908'8f0e'8d0c});
4404 }
4405 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew32_vlmul2)4406 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew32_vlmul2) {
4407   VsxsegXeiXX<UInt32, 1, 2>(
4408       0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4409       {0x8302'8100'8706'8504, 0x8b0a'8908'8f0e'8d0c, 0x9716'9514'9b1a'9918, 0x9312'9110'9f1e'9d1c});
4410 }
4411 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew32_vlmul4)4412 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew32_vlmul4) {
4413   VsxsegXeiXX<UInt32, 1, 4>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4414                             {0x8302'8100'8706'8504,
4415                              0x8b0a'8908'8f0e'8d0c,
4416                              0x9716'9514'9b1a'9918,
4417                              0x9312'9110'9f1e'9d1c,
4418                              0xa322'a120'bb3a'b938,
4419                              0xaf2e'ad2c'bf3e'bd3c,
4420                              0xb332'b130'b736'b534,
4421                              0xab2a'a928'a726'a524});
4422 }
4423 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew32_vlmul8)4424 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew32_vlmul8) {
4425   VsxsegXeiXX<UInt32, 1, 8>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4426                             {0x8302'8100'8706'8504,
4427                              0x8b0a'8908'8f0e'8d0c,
4428                              0x9716'9514'9b1a'9918,
4429                              0x9312'9110'9f1e'9d1c,
4430                              0xa322'a120'bb3a'b938,
4431                              0xaf2e'ad2c'bf3e'bd3c,
4432                              0xb332'b130'b736'b534,
4433                              0xab2a'a928'a726'a524,
4434                              0xcb4a'c948'eb6a'e968,
4435                              0xdf5e'dd5c'd352'd150,
4436                              0xef6e'ed6c'fb7a'f978,
4437                              0xff7e'fd7c'cf4e'cd4c,
4438                              0xdb5a'd958'f776'f574,
4439                              0xf372'f170'd756'd554,
4440                              0xe362'e160'e766'e564,
4441                              0xc746'c544'c342'c140});
4442 }
4443 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew32_vlmul1)4444 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew32_vlmul1) {
4445   VsxsegXeiXX<UInt32, 2, 1>(
4446       0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4447       {0x9716'9514'8706'8504, 0x9312'9110'8302'8100, 0x9f1e'9d1c'8f0e'8d0c, 0x9b1a'9918'8b0a'8908});
4448 }
4449 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew32_vlmul2)4450 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew32_vlmul2) {
4451   VsxsegXeiXX<UInt32, 2, 2>(0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4452                             {0xa726'a524'8706'8504,
4453                              0xa322'a120'8302'8100,
4454                              0xaf2e'ad2c'8f0e'8d0c,
4455                              0xab2a'a928'8b0a'8908,
4456                              0xbb3a'b938'9b1a'9918,
4457                              0xb736'b534'9716'9514,
4458                              0xbf3e'bd3c'9f1e'9d1c,
4459                              0xb332'b130'9312'9110});
4460 }
4461 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew32_vlmul4)4462 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew32_vlmul4) {
4463   VsxsegXeiXX<UInt32, 2, 4>(0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4464                             {0xc746'c544'8706'8504,
4465                              0xc342'c140'8302'8100,
4466                              0xcf4e'cd4c'8f0e'8d0c,
4467                              0xcb4a'c948'8b0a'8908,
4468                              0xdb5a'd958'9b1a'9918,
4469                              0xd756'd554'9716'9514,
4470                              0xdf5e'dd5c'9f1e'9d1c,
4471                              0xd352'd150'9312'9110,
4472                              0xfb7a'f978'bb3a'b938,
4473                              0xe362'e160'a322'a120,
4474                              0xff7e'fd7c'bf3e'bd3c,
4475                              0xef6e'ed6c'af2e'ad2c,
4476                              0xf776'f574'b736'b534,
4477                              0xf372'f170'b332'b130,
4478                              0xe766'e564'a726'a524,
4479                              0xeb6a'e968'ab2a'a928});
4480 }
4481 
TEST_F(Riscv64InterpreterTest,Vsxseg3eiXX_sew32_vlmul1)4482 TEST_F(Riscv64InterpreterTest, Vsxseg3eiXX_sew32_vlmul1) {
4483   VsxsegXeiXX<UInt32, 3, 1>(0x45008427,  // Vsuxseg3ei8.v v8, (x1), v16, v0.t
4484                             {0x9716'9514'8706'8504,
4485                              0x8302'8100'a726'a524,
4486                              0xa322'a120'9312'9110,
4487                              0x9f1e'9d1c'8f0e'8d0c,
4488                              0x8b0a'8908'af2e'ad2c,
4489                              0xab2a'a928'9b1a'9918});
4490 }
4491 
TEST_F(Riscv64InterpreterTest,Vsxseg3eiXX_sew32_vlmul2)4492 TEST_F(Riscv64InterpreterTest, Vsxseg3eiXX_sew32_vlmul2) {
4493   VsxsegXeiXX<UInt32, 3, 2>(0x45008427,  // Vsuxseg3ei8.v v8, (x1), v16, v0.t
4494                             {0xa726'a524'8706'8504,
4495                              0x8302'8100'c746'c544,
4496                              0xc342'c140'a322'a120,
4497                              0xaf2e'ad2c'8f0e'8d0c,
4498                              0x8b0a'8908'cf4e'cd4c,
4499                              0xcb4a'c948'ab2a'a928,
4500                              0xbb3a'b938'9b1a'9918,
4501                              0x9716'9514'db5a'd958,
4502                              0xd756'd554'b736'b534,
4503                              0xbf3e'bd3c'9f1e'9d1c,
4504                              0x9312'9110'df5e'dd5c,
4505                              0xd352'd150'b332'b130});
4506 }
4507 
TEST_F(Riscv64InterpreterTest,Vsxseg4eiXX_sew32_vlmul1)4508 TEST_F(Riscv64InterpreterTest, Vsxseg4eiXX_sew32_vlmul1) {
4509   VsxsegXeiXX<UInt32, 4, 1>(0x65008427,  // Vsuxseg4ei8.v v8, (x1), v16, v0.t
4510                             {0x9716'9514'8706'8504,
4511                              0xb736'b534'a726'a524,
4512                              0x9312'9110'8302'8100,
4513                              0xb332'b130'a322'a120,
4514                              0x9f1e'9d1c'8f0e'8d0c,
4515                              0xbf3e'bd3c'af2e'ad2c,
4516                              0x9b1a'9918'8b0a'8908,
4517                              0xbb3a'b938'ab2a'a928});
4518 }
4519 
TEST_F(Riscv64InterpreterTest,Vsxseg4eiXX_sew32_vlmul2)4520 TEST_F(Riscv64InterpreterTest, Vsxseg4eiXX_sew32_vlmul2) {
4521   VsxsegXeiXX<UInt32, 4, 2>(0x65008427,  // Vsuxseg4ei8.v v8, (x1), v16, v0.t
4522                             {0xa726'a524'8706'8504,
4523                              0xe766'e564'c746'c544,
4524                              0xa322'a120'8302'8100,
4525                              0xe362'e160'c342'c140,
4526                              0xaf2e'ad2c'8f0e'8d0c,
4527                              0xef6e'ed6c'cf4e'cd4c,
4528                              0xab2a'a928'8b0a'8908,
4529                              0xeb6a'e968'cb4a'c948,
4530                              0xbb3a'b938'9b1a'9918,
4531                              0xfb7a'f978'db5a'd958,
4532                              0xb736'b534'9716'9514,
4533                              0xf776'f574'd756'd554,
4534                              0xbf3e'bd3c'9f1e'9d1c,
4535                              0xff7e'fd7c'df5e'dd5c,
4536                              0xb332'b130'9312'9110,
4537                              0xf372'f170'd352'd150});
4538 }
4539 
TEST_F(Riscv64InterpreterTest,Vsxseg5eiXX_sew32)4540 TEST_F(Riscv64InterpreterTest, Vsxseg5eiXX_sew32) {
4541   VsxsegXeiXX<UInt32, 5, 1>(0x85008427,  // Vsuxseg5ei8.v v8, (x1), v16, v0.t
4542                             {0x9716'9514'8706'8504,
4543                              0xb736'b534'a726'a524,
4544                              0x8302'8100'c746'c544,
4545                              0xa322'a120'9312'9110,
4546                              0xc342'c140'b332'b130,
4547                              0x9f1e'9d1c'8f0e'8d0c,
4548                              0xbf3e'bd3c'af2e'ad2c,
4549                              0x8b0a'8908'cf4e'cd4c,
4550                              0xab2a'a928'9b1a'9918,
4551                              0xcb4a'c948'bb3a'b938});
4552 }
4553 
TEST_F(Riscv64InterpreterTest,Vsxseg6eiXX_sew32)4554 TEST_F(Riscv64InterpreterTest, Vsxseg6eiXX_sew32) {
4555   VsxsegXeiXX<UInt32, 6, 1>(0xa5008427,  // Vsuxseg6ei8.v v8, (x1), v16, v0.t
4556                             {0x9716'9514'8706'8504,
4557                              0xb736'b534'a726'a524,
4558                              0xd756'd554'c746'c544,
4559                              0x9312'9110'8302'8100,
4560                              0xb332'b130'a322'a120,
4561                              0xd352'd150'c342'c140,
4562                              0x9f1e'9d1c'8f0e'8d0c,
4563                              0xbf3e'bd3c'af2e'ad2c,
4564                              0xdf5e'dd5c'cf4e'cd4c,
4565                              0x9b1a'9918'8b0a'8908,
4566                              0xbb3a'b938'ab2a'a928,
4567                              0xdb5a'd958'cb4a'c948});
4568 }
4569 
TEST_F(Riscv64InterpreterTest,Vsxseg7eiXX_sew32)4570 TEST_F(Riscv64InterpreterTest, Vsxseg7eiXX_sew32) {
4571   VsxsegXeiXX<UInt32, 7, 1>(0xc5008427,  // Vsuxseg7ei8.v v8, (x1), v16, v0.t
4572                             {0x9716'9514'8706'8504,
4573                              0xb736'b534'a726'a524,
4574                              0xd756'd554'c746'c544,
4575                              0x8302'8100'e766'e564,
4576                              0xa322'a120'9312'9110,
4577                              0xc342'c140'b332'b130,
4578                              0xe362'e160'd352'd150,
4579                              0x9f1e'9d1c'8f0e'8d0c,
4580                              0xbf3e'bd3c'af2e'ad2c,
4581                              0xdf5e'dd5c'cf4e'cd4c,
4582                              0x8b0a'8908'ef6e'ed6c,
4583                              0xab2a'a928'9b1a'9918,
4584                              0xcb4a'c948'bb3a'b938,
4585                              0xeb6a'e968'db5a'd958});
4586 }
4587 
TEST_F(Riscv64InterpreterTest,Vsxseg8eiXX_sew32)4588 TEST_F(Riscv64InterpreterTest, Vsxseg8eiXX_sew32) {
4589   VsxsegXeiXX<UInt32, 8, 1>(0xe5008427,  // Vsuxseg8ei8.v v8, (x1), v16, v0.t
4590                             {0x9716'9514'8706'8504,
4591                              0xb736'b534'a726'a524,
4592                              0xd756'd554'c746'c544,
4593                              0xf776'f574'e766'e564,
4594                              0x9312'9110'8302'8100,
4595                              0xb332'b130'a322'a120,
4596                              0xd352'd150'c342'c140,
4597                              0xf372'f170'e362'e160,
4598                              0x9f1e'9d1c'8f0e'8d0c,
4599                              0xbf3e'bd3c'af2e'ad2c,
4600                              0xdf5e'dd5c'cf4e'cd4c,
4601                              0xff7e'fd7c'ef6e'ed6c,
4602                              0x9b1a'9918'8b0a'8908,
4603                              0xbb3a'b938'ab2a'a928,
4604                              0xdb5a'd958'cb4a'c948,
4605                              0xfb7a'f978'eb6a'e968});
4606 }
4607 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew64_vlmul1)4608 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew64_vlmul1) {
4609   VsxsegXeiXX<UInt64, 1, 1>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4610                             {0x8f0e'8d0c'8b0a'8908, 0x8706'8504'8302'8100});
4611 }
4612 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew64_vlmul2)4613 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew64_vlmul2) {
4614   VsxsegXeiXX<UInt64, 1, 2>(
4615       0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4616       {0x8f0e'8d0c'8b0a'8908, 0x8706'8504'8302'8100, 0x9f1e'9d1c'9b1a'9918, 0x9716'9514'9312'9110});
4617 }
4618 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew64_vlmul4)4619 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew64_vlmul4) {
4620   VsxsegXeiXX<UInt64, 1, 4>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4621                             {0x8f0e'8d0c'8b0a'8908,
4622                              0x8706'8504'8302'8100,
4623                              0x9f1e'9d1c'9b1a'9918,
4624                              0x9716'9514'9312'9110,
4625                              0xb736'b534'b332'b130,
4626                              0xaf2e'ad2c'ab2a'a928,
4627                              0xbf3e'bd3c'bb3a'b938,
4628                              0xa726'a524'a322'a120});
4629 }
4630 
TEST_F(Riscv64InterpreterTest,VsxeiXX_sew64_vlmul8)4631 TEST_F(Riscv64InterpreterTest, VsxeiXX_sew64_vlmul8) {
4632   VsxsegXeiXX<UInt64, 1, 8>(0x5008427,  // Vsuxei8.v v8, (x1), v16, v0.t
4633                             {0x8f0e'8d0c'8b0a'8908,
4634                              0x8706'8504'8302'8100,
4635                              0x9f1e'9d1c'9b1a'9918,
4636                              0x9716'9514'9312'9110,
4637                              0xb736'b534'b332'b130,
4638                              0xaf2e'ad2c'ab2a'a928,
4639                              0xbf3e'bd3c'bb3a'b938,
4640                              0xa726'a524'a322'a120,
4641                              0xf776'f574'f372'f170,
4642                              0xc746'c544'c342'c140,
4643                              0xff7e'fd7c'fb7a'f978,
4644                              0xdf5e'dd5c'db5a'd958,
4645                              0xef6e'ed6c'eb6a'e968,
4646                              0xe766'e564'e362'e160,
4647                              0xcf4e'cd4c'cb4a'c948,
4648                              0xd756'd554'd352'd150});
4649 }
4650 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew64_vlmul1)4651 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew64_vlmul1) {
4652   VsxsegXeiXX<UInt64, 2, 1>(
4653       0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4654       {0x8f0e'8d0c'8b0a'8908, 0x9f1e'9d1c'9b1a'9918, 0x8706'8504'8302'8100, 0x9716'9514'9312'9110});
4655 }
4656 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew64_vlmul2)4657 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew64_vlmul2) {
4658   VsxsegXeiXX<UInt64, 2, 2>(0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4659                             {0x8f0e'8d0c'8b0a'8908,
4660                              0xaf2e'ad2c'ab2a'a928,
4661                              0x8706'8504'8302'8100,
4662                              0xa726'a524'a322'a120,
4663                              0x9f1e'9d1c'9b1a'9918,
4664                              0xbf3e'bd3c'bb3a'b938,
4665                              0x9716'9514'9312'9110,
4666                              0xb736'b534'b332'b130});
4667 }
4668 
TEST_F(Riscv64InterpreterTest,Vsxseg2eiXX_sew64_vlmul4)4669 TEST_F(Riscv64InterpreterTest, Vsxseg2eiXX_sew64_vlmul4) {
4670   VsxsegXeiXX<UInt64, 2, 4>(0x25008427,  // Vsuxseg2ei8.v v8, (x1), v16, v0.t
4671                             {0x8f0e'8d0c'8b0a'8908,
4672                              0xcf4e'cd4c'cb4a'c948,
4673                              0x8706'8504'8302'8100,
4674                              0xc746'c544'c342'c140,
4675                              0x9f1e'9d1c'9b1a'9918,
4676                              0xdf5e'dd5c'db5a'd958,
4677                              0x9716'9514'9312'9110,
4678                              0xd756'd554'd352'd150,
4679                              0xb736'b534'b332'b130,
4680                              0xf776'f574'f372'f170,
4681                              0xaf2e'ad2c'ab2a'a928,
4682                              0xef6e'ed6c'eb6a'e968,
4683                              0xbf3e'bd3c'bb3a'b938,
4684                              0xff7e'fd7c'fb7a'f978,
4685                              0xa726'a524'a322'a120,
4686                              0xe766'e564'e362'e160});
4687 }
4688 
TEST_F(Riscv64InterpreterTest,Vsxseg3eiXX_sew64_vlmul1)4689 TEST_F(Riscv64InterpreterTest, Vsxseg3eiXX_sew64_vlmul1) {
4690   VsxsegXeiXX<UInt64, 3, 1>(0x45008427,  // Vsuxseg3ei8.v v8, (x1), v16, v0.t
4691                             {0x8f0e'8d0c'8b0a'8908,
4692                              0x9f1e'9d1c'9b1a'9918,
4693                              0xaf2e'ad2c'ab2a'a928,
4694                              0x8706'8504'8302'8100,
4695                              0x9716'9514'9312'9110,
4696                              0xa726'a524'a322'a120});
4697 }
4698 
TEST_F(Riscv64InterpreterTest,Vsxseg3eiXX_sew64_vlmul2)4699 TEST_F(Riscv64InterpreterTest, Vsxseg3eiXX_sew64_vlmul2) {
4700   VsxsegXeiXX<UInt64, 3, 2>(0x45008427,  // Vsuxseg3ei8.v v8, (x1), v16, v0.t
4701                             {0x8f0e'8d0c'8b0a'8908,
4702                              0xaf2e'ad2c'ab2a'a928,
4703                              0xcf4e'cd4c'cb4a'c948,
4704                              0x8706'8504'8302'8100,
4705                              0xa726'a524'a322'a120,
4706                              0xc746'c544'c342'c140,
4707                              0x9f1e'9d1c'9b1a'9918,
4708                              0xbf3e'bd3c'bb3a'b938,
4709                              0xdf5e'dd5c'db5a'd958,
4710                              0x9716'9514'9312'9110,
4711                              0xb736'b534'b332'b130,
4712                              0xd756'd554'd352'd150});
4713 }
4714 
TEST_F(Riscv64InterpreterTest,Vsxseg4eiXX_sew64_vlmul1)4715 TEST_F(Riscv64InterpreterTest, Vsxseg4eiXX_sew64_vlmul1) {
4716   VsxsegXeiXX<UInt64, 4, 1>(0x65008427,  // Vsuxseg4ei8.v v8, (x1), v16, v0.t
4717                             {0x8f0e'8d0c'8b0a'8908,
4718                              0x9f1e'9d1c'9b1a'9918,
4719                              0xaf2e'ad2c'ab2a'a928,
4720                              0xbf3e'bd3c'bb3a'b938,
4721                              0x8706'8504'8302'8100,
4722                              0x9716'9514'9312'9110,
4723                              0xa726'a524'a322'a120,
4724                              0xb736'b534'b332'b130});
4725 }
4726 
TEST_F(Riscv64InterpreterTest,Vsxseg4eiXX_sew64_vlmul2)4727 TEST_F(Riscv64InterpreterTest, Vsxseg4eiXX_sew64_vlmul2) {
4728   VsxsegXeiXX<UInt64, 4, 2>(0x65008427,  // Vsuxseg4ei8.v v8, (x1), v16, v0.t
4729                             {0x8f0e'8d0c'8b0a'8908,
4730                              0xaf2e'ad2c'ab2a'a928,
4731                              0xcf4e'cd4c'cb4a'c948,
4732                              0xef6e'ed6c'eb6a'e968,
4733                              0x8706'8504'8302'8100,
4734                              0xa726'a524'a322'a120,
4735                              0xc746'c544'c342'c140,
4736                              0xe766'e564'e362'e160,
4737                              0x9f1e'9d1c'9b1a'9918,
4738                              0xbf3e'bd3c'bb3a'b938,
4739                              0xdf5e'dd5c'db5a'd958,
4740                              0xff7e'fd7c'fb7a'f978,
4741                              0x9716'9514'9312'9110,
4742                              0xb736'b534'b332'b130,
4743                              0xd756'd554'd352'd150,
4744                              0xf776'f574'f372'f170});
4745 }
4746 
TEST_F(Riscv64InterpreterTest,Vsxseg5eiXX_sew64)4747 TEST_F(Riscv64InterpreterTest, Vsxseg5eiXX_sew64) {
4748   VsxsegXeiXX<UInt64, 5, 1>(0x85008427,  // Vsuxseg5ei8.v v8, (x1), v16, v0.t
4749                             {0x8f0e'8d0c'8b0a'8908,
4750                              0x9f1e'9d1c'9b1a'9918,
4751                              0xaf2e'ad2c'ab2a'a928,
4752                              0xbf3e'bd3c'bb3a'b938,
4753                              0xcf4e'cd4c'cb4a'c948,
4754                              0x8706'8504'8302'8100,
4755                              0x9716'9514'9312'9110,
4756                              0xa726'a524'a322'a120,
4757                              0xb736'b534'b332'b130,
4758                              0xc746'c544'c342'c140});
4759 }
4760 
TEST_F(Riscv64InterpreterTest,Vsxseg6eiXX_sew64)4761 TEST_F(Riscv64InterpreterTest, Vsxseg6eiXX_sew64) {
4762   VsxsegXeiXX<UInt64, 6, 1>(0xa5008427,  // Vsuxseg6ei8.v v8, (x1), v16, v0.t
4763                             {0x8f0e'8d0c'8b0a'8908,
4764                              0x9f1e'9d1c'9b1a'9918,
4765                              0xaf2e'ad2c'ab2a'a928,
4766                              0xbf3e'bd3c'bb3a'b938,
4767                              0xcf4e'cd4c'cb4a'c948,
4768                              0xdf5e'dd5c'db5a'd958,
4769                              0x8706'8504'8302'8100,
4770                              0x9716'9514'9312'9110,
4771                              0xa726'a524'a322'a120,
4772                              0xb736'b534'b332'b130,
4773                              0xc746'c544'c342'c140,
4774                              0xd756'd554'd352'd150});
4775 }
4776 
TEST_F(Riscv64InterpreterTest,Vsxseg7eiXX_sew64)4777 TEST_F(Riscv64InterpreterTest, Vsxseg7eiXX_sew64) {
4778   VsxsegXeiXX<UInt64, 7, 1>(0xc5008427,  // Vsuxseg7ei8.v v8, (x1), v16, v0.t
4779                             {0x8f0e'8d0c'8b0a'8908,
4780                              0x9f1e'9d1c'9b1a'9918,
4781                              0xaf2e'ad2c'ab2a'a928,
4782                              0xbf3e'bd3c'bb3a'b938,
4783                              0xcf4e'cd4c'cb4a'c948,
4784                              0xdf5e'dd5c'db5a'd958,
4785                              0xef6e'ed6c'eb6a'e968,
4786                              0x8706'8504'8302'8100,
4787                              0x9716'9514'9312'9110,
4788                              0xa726'a524'a322'a120,
4789                              0xb736'b534'b332'b130,
4790                              0xc746'c544'c342'c140,
4791                              0xd756'd554'd352'd150,
4792                              0xe766'e564'e362'e160});
4793 }
4794 
TEST_F(Riscv64InterpreterTest,Vsxseg8eiXX_sew64)4795 TEST_F(Riscv64InterpreterTest, Vsxseg8eiXX_sew64) {
4796   VsxsegXeiXX<UInt64, 8, 1>(0xe5008427,  // Vsuxseg8ei8.v v8, (x1), v16, v0.t
4797                             {0x8f0e'8d0c'8b0a'8908,
4798                              0x9f1e'9d1c'9b1a'9918,
4799                              0xaf2e'ad2c'ab2a'a928,
4800                              0xbf3e'bd3c'bb3a'b938,
4801                              0xcf4e'cd4c'cb4a'c948,
4802                              0xdf5e'dd5c'db5a'd958,
4803                              0xef6e'ed6c'eb6a'e968,
4804                              0xff7e'fd7c'fb7a'f978,
4805                              0x8706'8504'8302'8100,
4806                              0x9716'9514'9312'9110,
4807                              0xa726'a524'a322'a120,
4808                              0xb736'b534'b332'b130,
4809                              0xc746'c544'c342'c140,
4810                              0xd756'd554'd352'd150,
4811                              0xe766'e564'e362'e160,
4812                              0xf776'f574'f372'f170});
4813 }
4814 
TEST_F(Riscv64InterpreterTest,TestVse8_vlmul1)4815 TEST_F(Riscv64InterpreterTest, TestVse8_vlmul1) {
4816   TestVssegXeXX<UInt8, 1, 1>(0x000008427,  // vsse8.v v8, (x1), v0.t
4817                              {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908});
4818 }
4819 
TEST_F(Riscv64InterpreterTest,TestVse8_vlmul2)4820 TEST_F(Riscv64InterpreterTest, TestVse8_vlmul2) {
4821   TestVssegXeXX<UInt8, 1, 2>(
4822       0x000008427,  // vsse8.v v8, (x1), v0.t
4823       {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908, 0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918});
4824 }
4825 
TEST_F(Riscv64InterpreterTest,TestVse8_vlmul4)4826 TEST_F(Riscv64InterpreterTest, TestVse8_vlmul4) {
4827   TestVssegXeXX<UInt8, 1, 4>(0x000008427,  // vsse8.v v8, (x1), v0.t
4828                              {0x8706'8504'8302'8100,
4829                               0x8f0e'8d0c'8b0a'8908,
4830                               0x9716'9514'9312'9110,
4831                               0x9f1e'9d1c'9b1a'9918,
4832                               0xa726'a524'a322'a120,
4833                               0xaf2e'ad2c'ab2a'a928,
4834                               0xb736'b534'b332'b130,
4835                               0xbf3e'bd3c'bb3a'b938});
4836 }
4837 
TEST_F(Riscv64InterpreterTest,TestVse8_vlmul8)4838 TEST_F(Riscv64InterpreterTest, TestVse8_vlmul8) {
4839   TestVssegXeXX<UInt8, 1, 8>(0x000008427,  // vsse8.v v8, (x1), v0.t
4840                              {0x8706'8504'8302'8100,
4841                               0x8f0e'8d0c'8b0a'8908,
4842                               0x9716'9514'9312'9110,
4843                               0x9f1e'9d1c'9b1a'9918,
4844                               0xa726'a524'a322'a120,
4845                               0xaf2e'ad2c'ab2a'a928,
4846                               0xb736'b534'b332'b130,
4847                               0xbf3e'bd3c'bb3a'b938,
4848                               0xc746'c544'c342'c140,
4849                               0xcf4e'cd4c'cb4a'c948,
4850                               0xd756'd554'd352'd150,
4851                               0xdf5e'dd5c'db5a'd958,
4852                               0xe766'e564'e362'e160,
4853                               0xef6e'ed6c'eb6a'e968,
4854                               0xf776'f574'f372'f170,
4855                               0xff7e'fd7c'fb7a'f978});
4856 }
4857 
TEST_F(Riscv64InterpreterTest,TestVsseg2e8_vlmul1)4858 TEST_F(Riscv64InterpreterTest, TestVsseg2e8_vlmul1) {
4859   TestVssegXeXX<UInt8, 2, 1>(
4860       0x20008427,  // vsseg2e8.v v8, (x1), v0.t
4861       {0x9383'1202'9181'1000, 0x9787'1606'9585'1404, 0x9b8b'1a0a'9989'1808, 0x9f8f'1e0e'9d8d'1c0c});
4862 }
4863 
TEST_F(Riscv64InterpreterTest,TestVsseg2e8_vlmul2)4864 TEST_F(Riscv64InterpreterTest, TestVsseg2e8_vlmul2) {
4865   TestVssegXeXX<UInt8, 2, 2>(0x20008427,  // vsseg2e8.v v8, (x1), v0.t
4866                              {0xa383'2202'a181'2000,
4867                               0xa787'2606'a585'2404,
4868                               0xab8b'2a0a'a989'2808,
4869                               0xaf8f'2e0e'ad8d'2c0c,
4870                               0xb393'3212'b191'3010,
4871                               0xb797'3616'b595'3414,
4872                               0xbb9b'3a1a'b999'3818,
4873                               0xbf9f'3e1e'bd9d'3c1c});
4874 }
4875 
TEST_F(Riscv64InterpreterTest,TestVsseg2e8_vlmul4)4876 TEST_F(Riscv64InterpreterTest, TestVsseg2e8_vlmul4) {
4877   TestVssegXeXX<UInt8, 2, 4>(0x20008427,  // vsseg2e8.v v8, (x1), v0.t
4878                              {0xc383'4202'c181'4000,
4879                               0xc787'4606'c585'4404,
4880                               0xcb8b'4a0a'c989'4808,
4881                               0xcf8f'4e0e'cd8d'4c0c,
4882                               0xd393'5212'd191'5010,
4883                               0xd797'5616'd595'5414,
4884                               0xdb9b'5a1a'd999'5818,
4885                               0xdf9f'5e1e'dd9d'5c1c,
4886                               0xe3a3'6222'e1a1'6020,
4887                               0xe7a7'6626'e5a5'6424,
4888                               0xebab'6a2a'e9a9'6828,
4889                               0xefaf'6e2e'edad'6c2c,
4890                               0xf3b3'7232'f1b1'7030,
4891                               0xf7b7'7636'f5b5'7434,
4892                               0xfbbb'7a3a'f9b9'7838,
4893                               0xffbf'7e3e'fdbd'7c3c});
4894 }
4895 
TEST_F(Riscv64InterpreterTest,TestVsseg3e8_vlmul1)4896 TEST_F(Riscv64InterpreterTest, TestVsseg3e8_vlmul1) {
4897   TestVssegXeXX<UInt8, 3, 1>(0x40008427,  // vsseg3e8.v v8, (x1), v0.t
4898                              {0x1202'a191'8120'1000,
4899                               0x8524'1404'a393'8322,
4900                               0xa797'8726'1606'a595,
4901                               0x1a0a'a999'8928'1808,
4902                               0x8d2c'1c0c'ab9b'8b2a,
4903                               0xaf9f'8f2e'1e0e'ad9d});
4904 }
4905 
TEST_F(Riscv64InterpreterTest,TestVsseg3e8_vlmul2)4906 TEST_F(Riscv64InterpreterTest, TestVsseg3e8_vlmul2) {
4907   TestVssegXeXX<UInt8, 3, 2>(0x40008427,  // vsseg3e8.v v8, (x1), v0.t
4908                              {0x2202'c1a1'8140'2000,
4909                               0x8544'2404'c3a3'8342,
4910                               0xc7a7'8746'2606'c5a5,
4911                               0x2a0a'c9a9'8948'2808,
4912                               0x8d4c'2c0c'cbab'8b4a,
4913                               0xcfaf'8f4e'2e0e'cdad,
4914                               0x3212'd1b1'9150'3010,
4915                               0x9554'3414'd3b3'9352,
4916                               0xd7b7'9756'3616'd5b5,
4917                               0x3a1a'd9b9'9958'3818,
4918                               0x9d5c'3c1c'dbbb'9b5a,
4919                               0xdfbf'9f5e'3e1e'ddbd});
4920 }
4921 
TEST_F(Riscv64InterpreterTest,TestVsseg4e8_vlmul1)4922 TEST_F(Riscv64InterpreterTest, TestVsseg4e8_vlmul1) {
4923   TestVssegXeXX<UInt8, 4, 1>(0x60008427,  // vsseg4e8.v v8, (x1), v0.t
4924                              {0xb1a1'9181'3020'1000,
4925                               0xb3a3'9383'3222'1202,
4926                               0xb5a5'9585'3424'1404,
4927                               0xb7a7'9787'3626'1606,
4928                               0xb9a9'9989'3828'1808,
4929                               0xbbab'9b8b'3a2a'1a0a,
4930                               0xbdad'9d8d'3c2c'1c0c,
4931                               0xbfaf'9f8f'3e2e'1e0e});
4932 }
4933 
TEST_F(Riscv64InterpreterTest,TestVsseg4e8_vlmul2)4934 TEST_F(Riscv64InterpreterTest, TestVsseg4e8_vlmul2) {
4935   TestVssegXeXX<UInt8, 4, 2>(0x60008427,  // vsseg4e8.v v8, (x1), v0.t
4936                              {0xe1c1'a181'6040'2000,
4937                               0xe3c3'a383'6242'2202,
4938                               0xe5c5'a585'6444'2404,
4939                               0xe7c7'a787'6646'2606,
4940                               0xe9c9'a989'6848'2808,
4941                               0xebcb'ab8b'6a4a'2a0a,
4942                               0xedcd'ad8d'6c4c'2c0c,
4943                               0xefcf'af8f'6e4e'2e0e,
4944                               0xf1d1'b191'7050'3010,
4945                               0xf3d3'b393'7252'3212,
4946                               0xf5d5'b595'7454'3414,
4947                               0xf7d7'b797'7656'3616,
4948                               0xf9d9'b999'7858'3818,
4949                               0xfbdb'bb9b'7a5a'3a1a,
4950                               0xfddd'bd9d'7c5c'3c1c,
4951                               0xffdf'bf9f'7e5e'3e1e});
4952 }
4953 
TEST_F(Riscv64InterpreterTest,TestVsseg5e8)4954 TEST_F(Riscv64InterpreterTest, TestVsseg5e8) {
4955   TestVssegXeXX<UInt8, 5, 1>(0x80008427,  // vsseg5e8.v v8, (x1), v0.t
4956                              {0xa191'8140'3020'1000,
4957                               0x8342'3222'1202'c1b1,
4958                               0x3424'1404'c3b3'a393,
4959                               0x1606'c5b5'a595'8544,
4960                               0xc7b7'a797'8746'3626,
4961                               0xa999'8948'3828'1808,
4962                               0x8b4a'3a2a'1a0a'c9b9,
4963                               0x3c2c'1c0c'cbbb'ab9b,
4964                               0x1e0e'cdbd'ad9d'8d4c,
4965                               0xcfbf'af9f'8f4e'3e2e});
4966 }
4967 
TEST_F(Riscv64InterpreterTest,TestVsseg6e8)4968 TEST_F(Riscv64InterpreterTest, TestVsseg6e8) {
4969   TestVssegXeXX<UInt8, 6, 1>(0xa0008427,  // vsseg6e8.v v8, (x1), v0.t
4970                              {0x9181'5040'3020'1000,
4971                               0x3222'1202'd1c1'b1a1,
4972                               0xd3c3'b3a3'9383'5242,
4973                               0x9585'5444'3424'1404,
4974                               0x3626'1606'd5c5'b5a5,
4975                               0xd7c7'b7a7'9787'5646,
4976                               0x9989'5848'3828'1808,
4977                               0x3a2a'1a0a'd9c9'b9a9,
4978                               0xdbcb'bbab'9b8b'5a4a,
4979                               0x9d8d'5c4c'3c2c'1c0c,
4980                               0x3e2e'1e0e'ddcd'bdad,
4981                               0xdfcf'bfaf'9f8f'5e4e});
4982 }
4983 
TEST_F(Riscv64InterpreterTest,TestVsseg7e8)4984 TEST_F(Riscv64InterpreterTest, TestVsseg7e8) {
4985   TestVssegXeXX<UInt8, 7, 1>(0xc0008427,  // vsseg7e8.v v8, (x1), v0.t
4986                              {0x8160'5040'3020'1000,
4987                               0x1202'e1d1'c1b1'a191,
4988                               0xa393'8362'5242'3222,
4989                               0x3424'1404'e3d3'c3b3,
4990                               0xc5b5'a595'8564'5444,
4991                               0x5646'3626'1606'e5d5,
4992                               0xe7d7'c7b7'a797'8766,
4993                               0x8968'5848'3828'1808,
4994                               0x1a0a'e9d9'c9b9'a999,
4995                               0xab9b'8b6a'5a4a'3a2a,
4996                               0x3c2c'1c0c'ebdb'cbbb,
4997                               0xcdbd'ad9d'8d6c'5c4c,
4998                               0x5e4e'3e2e'1e0e'eddd,
4999                               0xefdf'cfbf'af9f'8f6e});
5000 }
5001 
TEST_F(Riscv64InterpreterTest,TestVsseg8e8)5002 TEST_F(Riscv64InterpreterTest, TestVsseg8e8) {
5003   TestVssegXeXX<UInt8, 8, 1>(0xe0008427,  // vsseg8e8.v v8, (x1), v0.t
5004                              {0x7060'5040'3020'1000,
5005                               0xf1e1'd1c1'b1a1'9181,
5006                               0x7262'5242'3222'1202,
5007                               0xf3e3'd3c3'b3a3'9383,
5008                               0x7464'5444'3424'1404,
5009                               0xf5e5'd5c5'b5a5'9585,
5010                               0x7666'5646'3626'1606,
5011                               0xf7e7'd7c7'b7a7'9787,
5012                               0x7868'5848'3828'1808,
5013                               0xf9e9'd9c9'b9a9'9989,
5014                               0x7a6a'5a4a'3a2a'1a0a,
5015                               0xfbeb'dbcb'bbab'9b8b,
5016                               0x7c6c'5c4c'3c2c'1c0c,
5017                               0xfded'ddcd'bdad'9d8d,
5018                               0x7e6e'5e4e'3e2e'1e0e,
5019                               0xffef'dfcf'bfaf'9f8f});
5020 }
5021 
TEST_F(Riscv64InterpreterTest,TestVse16_vlmul1)5022 TEST_F(Riscv64InterpreterTest, TestVse16_vlmul1) {
5023   TestVssegXeXX<UInt16, 1, 1>(0x000d427,  // vse16.v v8, (x1), v0.t
5024                               {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908});
5025 }
5026 
TEST_F(Riscv64InterpreterTest,TestVse16_vlmul2)5027 TEST_F(Riscv64InterpreterTest, TestVse16_vlmul2) {
5028   TestVssegXeXX<UInt16, 1, 2>(
5029       0x000d427,  // vse16.v v8, (x1), v0.t
5030       {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908, 0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918});
5031 }
5032 
TEST_F(Riscv64InterpreterTest,TestVse16_vlmul4)5033 TEST_F(Riscv64InterpreterTest, TestVse16_vlmul4) {
5034   TestVssegXeXX<UInt16, 1, 4>(0x000d427,  // vse16.v v8, (x1), v0.t
5035                               {0x8706'8504'8302'8100,
5036                                0x8f0e'8d0c'8b0a'8908,
5037                                0x9716'9514'9312'9110,
5038                                0x9f1e'9d1c'9b1a'9918,
5039                                0xa726'a524'a322'a120,
5040                                0xaf2e'ad2c'ab2a'a928,
5041                                0xb736'b534'b332'b130,
5042                                0xbf3e'bd3c'bb3a'b938});
5043 }
5044 
TEST_F(Riscv64InterpreterTest,TestVse16_vlmul8)5045 TEST_F(Riscv64InterpreterTest, TestVse16_vlmul8) {
5046   TestVssegXeXX<UInt16, 1, 8>(0x000d427,  // vse16.v v8, (x1), v0.t
5047                               {0x8706'8504'8302'8100,
5048                                0x8f0e'8d0c'8b0a'8908,
5049                                0x9716'9514'9312'9110,
5050                                0x9f1e'9d1c'9b1a'9918,
5051                                0xa726'a524'a322'a120,
5052                                0xaf2e'ad2c'ab2a'a928,
5053                                0xb736'b534'b332'b130,
5054                                0xbf3e'bd3c'bb3a'b938,
5055                                0xc746'c544'c342'c140,
5056                                0xcf4e'cd4c'cb4a'c948,
5057                                0xd756'd554'd352'd150,
5058                                0xdf5e'dd5c'db5a'd958,
5059                                0xe766'e564'e362'e160,
5060                                0xef6e'ed6c'eb6a'e968,
5061                                0xf776'f574'f372'f170,
5062                                0xff7e'fd7c'fb7a'f978});
5063 }
5064 
TEST_F(Riscv64InterpreterTest,TestVsseg2e16_vlmul1)5065 TEST_F(Riscv64InterpreterTest, TestVsseg2e16_vlmul1) {
5066   TestVssegXeXX<UInt16, 2, 1>(
5067       0x2000d427,  // vsseg2e16.v v8, (x1), v0.t
5068       {0x9312'8302'9110'8100, 0x9716'8706'9514'8504, 0x9b1a'8b0a'9918'8908, 0x9f1e'8f0e'9d1c'8d0c});
5069 }
5070 
TEST_F(Riscv64InterpreterTest,TestVsseg2e16_vlmul2)5071 TEST_F(Riscv64InterpreterTest, TestVsseg2e16_vlmul2) {
5072   TestVssegXeXX<UInt16, 2, 2>(0x2000d427,  // vsseg2e16.v v8, (x1), v0.t
5073                               {0xa322'8302'a120'8100,
5074                                0xa726'8706'a524'8504,
5075                                0xab2a'8b0a'a928'8908,
5076                                0xaf2e'8f0e'ad2c'8d0c,
5077                                0xb332'9312'b130'9110,
5078                                0xb736'9716'b534'9514,
5079                                0xbb3a'9b1a'b938'9918,
5080                                0xbf3e'9f1e'bd3c'9d1c});
5081 }
5082 
TEST_F(Riscv64InterpreterTest,TestVsseg2e16_vlmul4)5083 TEST_F(Riscv64InterpreterTest, TestVsseg2e16_vlmul4) {
5084   TestVssegXeXX<UInt16, 2, 4>(0x2000d427,  // vsseg2e16.v v8, (x1), v0.t
5085                               {0xc342'8302'c140'8100,
5086                                0xc746'8706'c544'8504,
5087                                0xcb4a'8b0a'c948'8908,
5088                                0xcf4e'8f0e'cd4c'8d0c,
5089                                0xd352'9312'd150'9110,
5090                                0xd756'9716'd554'9514,
5091                                0xdb5a'9b1a'd958'9918,
5092                                0xdf5e'9f1e'dd5c'9d1c,
5093                                0xe362'a322'e160'a120,
5094                                0xe766'a726'e564'a524,
5095                                0xeb6a'ab2a'e968'a928,
5096                                0xef6e'af2e'ed6c'ad2c,
5097                                0xf372'b332'f170'b130,
5098                                0xf776'b736'f574'b534,
5099                                0xfb7a'bb3a'f978'b938,
5100                                0xff7e'bf3e'fd7c'bd3c});
5101 }
5102 
TEST_F(Riscv64InterpreterTest,TestVsseg3e16_vlmul1)5103 TEST_F(Riscv64InterpreterTest, TestVsseg3e16_vlmul1) {
5104   TestVssegXeXX<UInt16, 3, 1>(0x4000d427,  // vsseg3e16.v v8, (x1), v0.t
5105                               {0x8302'a120'9110'8100,
5106                                0x9514'8504'a322'9312,
5107                                0xa726'9716'8706'a524,
5108                                0x8b0a'a928'9918'8908,
5109                                0x9d1c'8d0c'ab2a'9b1a,
5110                                0xaf2e'9f1e'8f0e'ad2c});
5111 }
5112 
TEST_F(Riscv64InterpreterTest,TestVsseg3e16_vlmul2)5113 TEST_F(Riscv64InterpreterTest, TestVsseg3e16_vlmul2) {
5114   TestVssegXeXX<UInt16, 3, 2>(0x4000d427,  // vsseg3e16.v v8, (x1), v0.t
5115                               {0x8302'c140'a120'8100,
5116                                0xa524'8504'c342'a322,
5117                                0xc746'a726'8706'c544,
5118                                0x8b0a'c948'a928'8908,
5119                                0xad2c'8d0c'cb4a'ab2a,
5120                                0xcf4e'af2e'8f0e'cd4c,
5121                                0x9312'd150'b130'9110,
5122                                0xb534'9514'd352'b332,
5123                                0xd756'b736'9716'd554,
5124                                0x9b1a'd958'b938'9918,
5125                                0xbd3c'9d1c'db5a'bb3a,
5126                                0xdf5e'bf3e'9f1e'dd5c});
5127 }
5128 
TEST_F(Riscv64InterpreterTest,TestVsseg4e16_vlmul1)5129 TEST_F(Riscv64InterpreterTest, TestVsseg4e16_vlmul1) {
5130   TestVssegXeXX<UInt16, 4, 1>(0x6000d427,  // vsseg4e16.v v8, (x1), v0.t
5131                               {0xb130'a120'9110'8100,
5132                                0xb332'a322'9312'8302,
5133                                0xb534'a524'9514'8504,
5134                                0xb736'a726'9716'8706,
5135                                0xb938'a928'9918'8908,
5136                                0xbb3a'ab2a'9b1a'8b0a,
5137                                0xbd3c'ad2c'9d1c'8d0c,
5138                                0xbf3e'af2e'9f1e'8f0e});
5139 }
5140 
TEST_F(Riscv64InterpreterTest,TestVsseg4e16_vlmul2)5141 TEST_F(Riscv64InterpreterTest, TestVsseg4e16_vlmul2) {
5142   TestVssegXeXX<UInt16, 4, 2>(0x6000d427,  // vsseg4e16.v v8, (x1), v0.t
5143                               {0xe160'c140'a120'8100,
5144                                0xe362'c342'a322'8302,
5145                                0xe564'c544'a524'8504,
5146                                0xe766'c746'a726'8706,
5147                                0xe968'c948'a928'8908,
5148                                0xeb6a'cb4a'ab2a'8b0a,
5149                                0xed6c'cd4c'ad2c'8d0c,
5150                                0xef6e'cf4e'af2e'8f0e,
5151                                0xf170'd150'b130'9110,
5152                                0xf372'd352'b332'9312,
5153                                0xf574'd554'b534'9514,
5154                                0xf776'd756'b736'9716,
5155                                0xf978'd958'b938'9918,
5156                                0xfb7a'db5a'bb3a'9b1a,
5157                                0xfd7c'dd5c'bd3c'9d1c,
5158                                0xff7e'df5e'bf3e'9f1e});
5159 }
5160 
TEST_F(Riscv64InterpreterTest,TestVsseg5e16)5161 TEST_F(Riscv64InterpreterTest, TestVsseg5e16) {
5162   TestVssegXeXX<UInt16, 5, 1>(0x8000d427,  // vsseg5e16.v v8, (x1), v0.t
5163                               {0xb130'a120'9110'8100,
5164                                0xa322'9312'8302'c140,
5165                                0x9514'8504'c342'b332,
5166                                0x8706'c544'b534'a524,
5167                                0xc746'b736'a726'9716,
5168                                0xb938'a928'9918'8908,
5169                                0xab2a'9b1a'8b0a'c948,
5170                                0x9d1c'8d0c'cb4a'bb3a,
5171                                0x8f0e'cd4c'bd3c'ad2c,
5172                                0xcf4e'bf3e'af2e'9f1e});
5173 }
5174 
TEST_F(Riscv64InterpreterTest,TestVsseg6e16)5175 TEST_F(Riscv64InterpreterTest, TestVsseg6e16) {
5176   TestVssegXeXX<UInt16, 6, 1>(0xa000d427,  // vsseg6e16.v v8, (x1), v0.t
5177                               {0xb130'a120'9110'8100,
5178                                0x9312'8302'd150'c140,
5179                                0xd352'c342'b332'a322,
5180                                0xb534'a524'9514'8504,
5181                                0x9716'8706'd554'c544,
5182                                0xd756'c746'b736'a726,
5183                                0xb938'a928'9918'8908,
5184                                0x9b1a'8b0a'd958'c948,
5185                                0xdb5a'cb4a'bb3a'ab2a,
5186                                0xbd3c'ad2c'9d1c'8d0c,
5187                                0x9f1e'8f0e'dd5c'cd4c,
5188                                0xdf5e'cf4e'bf3e'af2e});
5189 }
5190 
TEST_F(Riscv64InterpreterTest,TestVsseg7e16)5191 TEST_F(Riscv64InterpreterTest, TestVsseg7e16) {
5192   TestVssegXeXX<UInt16, 7, 1>(0xc000d427,  // vsseg7e16.v v8, (x1), v0.t
5193                               {0xb130'a120'9110'8100,
5194                                0x8302'e160'd150'c140,
5195                                0xc342'b332'a322'9312,
5196                                0x9514'8504'e362'd352,
5197                                0xd554'c544'b534'a524,
5198                                0xa726'9716'8706'e564,
5199                                0xe766'd756'c746'b736,
5200                                0xb938'a928'9918'8908,
5201                                0x8b0a'e968'd958'c948,
5202                                0xcb4a'bb3a'ab2a'9b1a,
5203                                0x9d1c'8d0c'eb6a'db5a,
5204                                0xdd5c'cd4c'bd3c'ad2c,
5205                                0xaf2e'9f1e'8f0e'ed6c,
5206                                0xef6e'df5e'cf4e'bf3e});
5207 }
5208 
TEST_F(Riscv64InterpreterTest,TestVsseg8e16)5209 TEST_F(Riscv64InterpreterTest, TestVsseg8e16) {
5210   TestVssegXeXX<UInt16, 8, 1>(0xe000d427,  // vsseg8e16.v v8, (x1), v0.t
5211                               {0xb130'a120'9110'8100,
5212                                0xf170'e160'd150'c140,
5213                                0xb332'a322'9312'8302,
5214                                0xf372'e362'd352'c342,
5215                                0xb534'a524'9514'8504,
5216                                0xf574'e564'd554'c544,
5217                                0xb736'a726'9716'8706,
5218                                0xf776'e766'd756'c746,
5219                                0xb938'a928'9918'8908,
5220                                0xf978'e968'd958'c948,
5221                                0xbb3a'ab2a'9b1a'8b0a,
5222                                0xfb7a'eb6a'db5a'cb4a,
5223                                0xbd3c'ad2c'9d1c'8d0c,
5224                                0xfd7c'ed6c'dd5c'cd4c,
5225                                0xbf3e'af2e'9f1e'8f0e,
5226                                0xff7e'ef6e'df5e'cf4e});
5227 }
5228 
TEST_F(Riscv64InterpreterTest,TestVse32_vlmul1)5229 TEST_F(Riscv64InterpreterTest, TestVse32_vlmul1) {
5230   TestVssegXeXX<UInt32, 1, 1>(0x000e427,  // vse32.v v8, (x1), v0.t
5231                               {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908});
5232 }
5233 
TEST_F(Riscv64InterpreterTest,TestVse32_vlmul2)5234 TEST_F(Riscv64InterpreterTest, TestVse32_vlmul2) {
5235   TestVssegXeXX<UInt32, 1, 2>(
5236       0x000e427,  // vse32.v v8, (x1), v0.t
5237       {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908, 0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918});
5238 }
5239 
TEST_F(Riscv64InterpreterTest,TestVse32_vlmul4)5240 TEST_F(Riscv64InterpreterTest, TestVse32_vlmul4) {
5241   TestVssegXeXX<UInt32, 1, 4>(0x000e427,  // vse32.v v8, (x1), v0.t
5242                               {0x8706'8504'8302'8100,
5243                                0x8f0e'8d0c'8b0a'8908,
5244                                0x9716'9514'9312'9110,
5245                                0x9f1e'9d1c'9b1a'9918,
5246                                0xa726'a524'a322'a120,
5247                                0xaf2e'ad2c'ab2a'a928,
5248                                0xb736'b534'b332'b130,
5249                                0xbf3e'bd3c'bb3a'b938});
5250 }
5251 
TEST_F(Riscv64InterpreterTest,TestVse32_vlmul8)5252 TEST_F(Riscv64InterpreterTest, TestVse32_vlmul8) {
5253   TestVssegXeXX<UInt32, 1, 8>(0x000e427,  // vse32.v v8, (x1), v0.t
5254                               {0x8706'8504'8302'8100,
5255                                0x8f0e'8d0c'8b0a'8908,
5256                                0x9716'9514'9312'9110,
5257                                0x9f1e'9d1c'9b1a'9918,
5258                                0xa726'a524'a322'a120,
5259                                0xaf2e'ad2c'ab2a'a928,
5260                                0xb736'b534'b332'b130,
5261                                0xbf3e'bd3c'bb3a'b938,
5262                                0xc746'c544'c342'c140,
5263                                0xcf4e'cd4c'cb4a'c948,
5264                                0xd756'd554'd352'd150,
5265                                0xdf5e'dd5c'db5a'd958,
5266                                0xe766'e564'e362'e160,
5267                                0xef6e'ed6c'eb6a'e968,
5268                                0xf776'f574'f372'f170,
5269                                0xff7e'fd7c'fb7a'f978});
5270 }
5271 
TEST_F(Riscv64InterpreterTest,TestVsseg2e32_vlmul1)5272 TEST_F(Riscv64InterpreterTest, TestVsseg2e32_vlmul1) {
5273   TestVssegXeXX<UInt32, 2, 1>(
5274       0x2000e427,  // vsseg2e32.v v8, (x1), v0.t
5275       {0x9312'9110'8302'8100, 0x9716'9514'8706'8504, 0x9b1a'9918'8b0a'8908, 0x9f1e'9d1c'8f0e'8d0c});
5276 }
5277 
TEST_F(Riscv64InterpreterTest,TestVsseg2e32_vlmul2)5278 TEST_F(Riscv64InterpreterTest, TestVsseg2e32_vlmul2) {
5279   TestVssegXeXX<UInt32, 2, 2>(0x2000e427,  // vsseg2e32.v v8, (x1), v0.t
5280                               {0xa322'a120'8302'8100,
5281                                0xa726'a524'8706'8504,
5282                                0xab2a'a928'8b0a'8908,
5283                                0xaf2e'ad2c'8f0e'8d0c,
5284                                0xb332'b130'9312'9110,
5285                                0xb736'b534'9716'9514,
5286                                0xbb3a'b938'9b1a'9918,
5287                                0xbf3e'bd3c'9f1e'9d1c});
5288 }
5289 
TEST_F(Riscv64InterpreterTest,TestVsseg2e32_vlmul4)5290 TEST_F(Riscv64InterpreterTest, TestVsseg2e32_vlmul4) {
5291   TestVssegXeXX<UInt32, 2, 4>(0x2000e427,  // vsseg2e32.v v8, (x1), v0.t
5292                               {0xc342'c140'8302'8100,
5293                                0xc746'c544'8706'8504,
5294                                0xcb4a'c948'8b0a'8908,
5295                                0xcf4e'cd4c'8f0e'8d0c,
5296                                0xd352'd150'9312'9110,
5297                                0xd756'd554'9716'9514,
5298                                0xdb5a'd958'9b1a'9918,
5299                                0xdf5e'dd5c'9f1e'9d1c,
5300                                0xe362'e160'a322'a120,
5301                                0xe766'e564'a726'a524,
5302                                0xeb6a'e968'ab2a'a928,
5303                                0xef6e'ed6c'af2e'ad2c,
5304                                0xf372'f170'b332'b130,
5305                                0xf776'f574'b736'b534,
5306                                0xfb7a'f978'bb3a'b938,
5307                                0xff7e'fd7c'bf3e'bd3c});
5308 }
5309 
TEST_F(Riscv64InterpreterTest,TestVsseg3e32_vlmul1)5310 TEST_F(Riscv64InterpreterTest, TestVsseg3e32_vlmul1) {
5311   TestVssegXeXX<UInt32, 3, 1>(0x4000e427,  // vsseg3e32.v v8, (x1), v0.t
5312                               {0x9312'9110'8302'8100,
5313                                0x8706'8504'a322'a120,
5314                                0xa726'a524'9716'9514,
5315                                0x9b1a'9918'8b0a'8908,
5316                                0x8f0e'8d0c'ab2a'a928,
5317                                0xaf2e'ad2c'9f1e'9d1c});
5318 }
5319 
TEST_F(Riscv64InterpreterTest,TestVsseg3e32_vlmul2)5320 TEST_F(Riscv64InterpreterTest, TestVsseg3e32_vlmul2) {
5321   TestVssegXeXX<UInt32, 3, 2>(0x4000e427,  // vsseg3e32.v v8, (x1), v0.t
5322                               {0xa322'a120'8302'8100,
5323                                0x8706'8504'c342'c140,
5324                                0xc746'c544'a726'a524,
5325                                0xab2a'a928'8b0a'8908,
5326                                0x8f0e'8d0c'cb4a'c948,
5327                                0xcf4e'cd4c'af2e'ad2c,
5328                                0xb332'b130'9312'9110,
5329                                0x9716'9514'd352'd150,
5330                                0xd756'd554'b736'b534,
5331                                0xbb3a'b938'9b1a'9918,
5332                                0x9f1e'9d1c'db5a'd958,
5333                                0xdf5e'dd5c'bf3e'bd3c});
5334 }
5335 
TEST_F(Riscv64InterpreterTest,TestVsseg4e32_vlmul1)5336 TEST_F(Riscv64InterpreterTest, TestVsseg4e32_vlmul1) {
5337   TestVssegXeXX<UInt32, 4, 1>(0x6000e427,  // vsseg4e32.v v8, (x1), v0.t
5338                               {0x9312'9110'8302'8100,
5339                                0xb332'b130'a322'a120,
5340                                0x9716'9514'8706'8504,
5341                                0xb736'b534'a726'a524,
5342                                0x9b1a'9918'8b0a'8908,
5343                                0xbb3a'b938'ab2a'a928,
5344                                0x9f1e'9d1c'8f0e'8d0c,
5345                                0xbf3e'bd3c'af2e'ad2c});
5346 }
5347 
TEST_F(Riscv64InterpreterTest,TestVsseg4e32_vlmul2)5348 TEST_F(Riscv64InterpreterTest, TestVsseg4e32_vlmul2) {
5349   TestVssegXeXX<UInt32, 4, 2>(0x6000e427,  // vsseg4e32.v v8, (x1), v0.t
5350                               {0xa322'a120'8302'8100,
5351                                0xe362'e160'c342'c140,
5352                                0xa726'a524'8706'8504,
5353                                0xe766'e564'c746'c544,
5354                                0xab2a'a928'8b0a'8908,
5355                                0xeb6a'e968'cb4a'c948,
5356                                0xaf2e'ad2c'8f0e'8d0c,
5357                                0xef6e'ed6c'cf4e'cd4c,
5358                                0xb332'b130'9312'9110,
5359                                0xf372'f170'd352'd150,
5360                                0xb736'b534'9716'9514,
5361                                0xf776'f574'd756'd554,
5362                                0xbb3a'b938'9b1a'9918,
5363                                0xfb7a'f978'db5a'd958,
5364                                0xbf3e'bd3c'9f1e'9d1c,
5365                                0xff7e'fd7c'df5e'dd5c});
5366 }
5367 
TEST_F(Riscv64InterpreterTest,TestVsseg5e32)5368 TEST_F(Riscv64InterpreterTest, TestVsseg5e32) {
5369   TestVssegXeXX<UInt32, 5, 1>(0x8000e427,  // vsseg5e32.v v8, (x1), v0.t
5370                               {0x9312'9110'8302'8100,
5371                                0xb332'b130'a322'a120,
5372                                0x8706'8504'c342'c140,
5373                                0xa726'a524'9716'9514,
5374                                0xc746'c544'b736'b534,
5375                                0x9b1a'9918'8b0a'8908,
5376                                0xbb3a'b938'ab2a'a928,
5377                                0x8f0e'8d0c'cb4a'c948,
5378                                0xaf2e'ad2c'9f1e'9d1c,
5379                                0xcf4e'cd4c'bf3e'bd3c});
5380 }
5381 
TEST_F(Riscv64InterpreterTest,TestVsseg6e32)5382 TEST_F(Riscv64InterpreterTest, TestVsseg6e32) {
5383   TestVssegXeXX<UInt32, 6, 1>(0xa000e427,  // vsseg6e32.v v8, (x1), v0.t
5384                               {0x9312'9110'8302'8100,
5385                                0xb332'b130'a322'a120,
5386                                0xd352'd150'c342'c140,
5387                                0x9716'9514'8706'8504,
5388                                0xb736'b534'a726'a524,
5389                                0xd756'd554'c746'c544,
5390                                0x9b1a'9918'8b0a'8908,
5391                                0xbb3a'b938'ab2a'a928,
5392                                0xdb5a'd958'cb4a'c948,
5393                                0x9f1e'9d1c'8f0e'8d0c,
5394                                0xbf3e'bd3c'af2e'ad2c,
5395                                0xdf5e'dd5c'cf4e'cd4c});
5396 }
5397 
TEST_F(Riscv64InterpreterTest,TestVsseg7e32)5398 TEST_F(Riscv64InterpreterTest, TestVsseg7e32) {
5399   TestVssegXeXX<UInt32, 7, 1>(0xc000e427,  // vsseg7e32.v v8, (x1), v0.t
5400                               {0x9312'9110'8302'8100,
5401                                0xb332'b130'a322'a120,
5402                                0xd352'd150'c342'c140,
5403                                0x8706'8504'e362'e160,
5404                                0xa726'a524'9716'9514,
5405                                0xc746'c544'b736'b534,
5406                                0xe766'e564'd756'd554,
5407                                0x9b1a'9918'8b0a'8908,
5408                                0xbb3a'b938'ab2a'a928,
5409                                0xdb5a'd958'cb4a'c948,
5410                                0x8f0e'8d0c'eb6a'e968,
5411                                0xaf2e'ad2c'9f1e'9d1c,
5412                                0xcf4e'cd4c'bf3e'bd3c,
5413                                0xef6e'ed6c'df5e'dd5c});
5414 }
5415 
TEST_F(Riscv64InterpreterTest,TestVsseg8e32)5416 TEST_F(Riscv64InterpreterTest, TestVsseg8e32) {
5417   TestVssegXeXX<UInt32, 8, 1>(0xe000e427,  // vsseg8e32.v v8, (x1), v0.t
5418                               {0x9312'9110'8302'8100,
5419                                0xb332'b130'a322'a120,
5420                                0xd352'd150'c342'c140,
5421                                0xf372'f170'e362'e160,
5422                                0x9716'9514'8706'8504,
5423                                0xb736'b534'a726'a524,
5424                                0xd756'd554'c746'c544,
5425                                0xf776'f574'e766'e564,
5426                                0x9b1a'9918'8b0a'8908,
5427                                0xbb3a'b938'ab2a'a928,
5428                                0xdb5a'd958'cb4a'c948,
5429                                0xfb7a'f978'eb6a'e968,
5430                                0x9f1e'9d1c'8f0e'8d0c,
5431                                0xbf3e'bd3c'af2e'ad2c,
5432                                0xdf5e'dd5c'cf4e'cd4c,
5433                                0xff7e'fd7c'ef6e'ed6c});
5434 }
5435 
TEST_F(Riscv64InterpreterTest,TestVse64_vlmul1)5436 TEST_F(Riscv64InterpreterTest, TestVse64_vlmul1) {
5437   TestVssegXeXX<UInt64, 1, 1>(0x000f427,  // vse64.v v8, (x1), v0.t
5438                               {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908});
5439 }
5440 
TEST_F(Riscv64InterpreterTest,TestVse64_vlmul2)5441 TEST_F(Riscv64InterpreterTest, TestVse64_vlmul2) {
5442   TestVssegXeXX<UInt64, 1, 2>(
5443       0x000f427,  // vse64.v v8, (x1), v0.t
5444       {0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908, 0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918});
5445 }
5446 
TEST_F(Riscv64InterpreterTest,TestVse64_vlmul4)5447 TEST_F(Riscv64InterpreterTest, TestVse64_vlmul4) {
5448   TestVssegXeXX<UInt64, 1, 4>(0x000f427,  // vse64.v v8, (x1), v0.t
5449                               {0x8706'8504'8302'8100,
5450                                0x8f0e'8d0c'8b0a'8908,
5451                                0x9716'9514'9312'9110,
5452                                0x9f1e'9d1c'9b1a'9918,
5453                                0xa726'a524'a322'a120,
5454                                0xaf2e'ad2c'ab2a'a928,
5455                                0xb736'b534'b332'b130,
5456                                0xbf3e'bd3c'bb3a'b938});
5457 }
5458 
TEST_F(Riscv64InterpreterTest,TestVse64_vlmul8)5459 TEST_F(Riscv64InterpreterTest, TestVse64_vlmul8) {
5460   TestVssegXeXX<UInt64, 1, 8>(0x000f427,  // vse64.v v8, (x1), v0.t
5461                               {0x8706'8504'8302'8100,
5462                                0x8f0e'8d0c'8b0a'8908,
5463                                0x9716'9514'9312'9110,
5464                                0x9f1e'9d1c'9b1a'9918,
5465                                0xa726'a524'a322'a120,
5466                                0xaf2e'ad2c'ab2a'a928,
5467                                0xb736'b534'b332'b130,
5468                                0xbf3e'bd3c'bb3a'b938,
5469                                0xc746'c544'c342'c140,
5470                                0xcf4e'cd4c'cb4a'c948,
5471                                0xd756'd554'd352'd150,
5472                                0xdf5e'dd5c'db5a'd958,
5473                                0xe766'e564'e362'e160,
5474                                0xef6e'ed6c'eb6a'e968,
5475                                0xf776'f574'f372'f170,
5476                                0xff7e'fd7c'fb7a'f978});
5477 }
5478 
TEST_F(Riscv64InterpreterTest,TestVsseg2e64_vlmul1)5479 TEST_F(Riscv64InterpreterTest, TestVsseg2e64_vlmul1) {
5480   TestVssegXeXX<UInt64, 2, 1>(
5481       0x2000f427,  // vsseg2e64.v v8, (x1), v0.t
5482       {0x8706'8504'8302'8100, 0x9716'9514'9312'9110, 0x8f0e'8d0c'8b0a'8908, 0x9f1e'9d1c'9b1a'9918});
5483 }
5484 
TEST_F(Riscv64InterpreterTest,TestVsseg2e64_vlmul2)5485 TEST_F(Riscv64InterpreterTest, TestVsseg2e64_vlmul2) {
5486   TestVssegXeXX<UInt64, 2, 2>(0x2000f427,  // vsseg2e64.v v8, (x1), v0.t
5487                               {0x8706'8504'8302'8100,
5488                                0xa726'a524'a322'a120,
5489                                0x8f0e'8d0c'8b0a'8908,
5490                                0xaf2e'ad2c'ab2a'a928,
5491                                0x9716'9514'9312'9110,
5492                                0xb736'b534'b332'b130,
5493                                0x9f1e'9d1c'9b1a'9918,
5494                                0xbf3e'bd3c'bb3a'b938});
5495 }
5496 
TEST_F(Riscv64InterpreterTest,TestVsseg2e64_vlmul4)5497 TEST_F(Riscv64InterpreterTest, TestVsseg2e64_vlmul4) {
5498   TestVssegXeXX<UInt64, 2, 4>(0x2000f427,  // vsseg2e64.v v8, (x1), v0.t
5499                               {0x8706'8504'8302'8100,
5500                                0xc746'c544'c342'c140,
5501                                0x8f0e'8d0c'8b0a'8908,
5502                                0xcf4e'cd4c'cb4a'c948,
5503                                0x9716'9514'9312'9110,
5504                                0xd756'd554'd352'd150,
5505                                0x9f1e'9d1c'9b1a'9918,
5506                                0xdf5e'dd5c'db5a'd958,
5507                                0xa726'a524'a322'a120,
5508                                0xe766'e564'e362'e160,
5509                                0xaf2e'ad2c'ab2a'a928,
5510                                0xef6e'ed6c'eb6a'e968,
5511                                0xb736'b534'b332'b130,
5512                                0xf776'f574'f372'f170,
5513                                0xbf3e'bd3c'bb3a'b938,
5514                                0xff7e'fd7c'fb7a'f978});
5515 }
5516 
TEST_F(Riscv64InterpreterTest,TestVsseg3e64_vlmul1)5517 TEST_F(Riscv64InterpreterTest, TestVsseg3e64_vlmul1) {
5518   TestVssegXeXX<UInt64, 3, 1>(0x4000f427,  // vsseg3e64.v v8, (x1), v0.t
5519                               {0x8706'8504'8302'8100,
5520                                0x9716'9514'9312'9110,
5521                                0xa726'a524'a322'a120,
5522                                0x8f0e'8d0c'8b0a'8908,
5523                                0x9f1e'9d1c'9b1a'9918,
5524                                0xaf2e'ad2c'ab2a'a928});
5525 }
5526 
TEST_F(Riscv64InterpreterTest,TestVsseg3e64_vlmul2)5527 TEST_F(Riscv64InterpreterTest, TestVsseg3e64_vlmul2) {
5528   TestVssegXeXX<UInt64, 3, 2>(0x4000f427,  // vsseg3e64.v v8, (x1), v0.t
5529                               {0x8706'8504'8302'8100,
5530                                0xa726'a524'a322'a120,
5531                                0xc746'c544'c342'c140,
5532                                0x8f0e'8d0c'8b0a'8908,
5533                                0xaf2e'ad2c'ab2a'a928,
5534                                0xcf4e'cd4c'cb4a'c948,
5535                                0x9716'9514'9312'9110,
5536                                0xb736'b534'b332'b130,
5537                                0xd756'd554'd352'd150,
5538                                0x9f1e'9d1c'9b1a'9918,
5539                                0xbf3e'bd3c'bb3a'b938,
5540                                0xdf5e'dd5c'db5a'd958});
5541 }
5542 
TEST_F(Riscv64InterpreterTest,TestVsseg4e64_vlmul1)5543 TEST_F(Riscv64InterpreterTest, TestVsseg4e64_vlmul1) {
5544   TestVssegXeXX<UInt64, 4, 1>(0x6000f427,  // vsseg4e64.v v8, (x1), v0.t
5545                               {0x8706'8504'8302'8100,
5546                                0x9716'9514'9312'9110,
5547                                0xa726'a524'a322'a120,
5548                                0xb736'b534'b332'b130,
5549                                0x8f0e'8d0c'8b0a'8908,
5550                                0x9f1e'9d1c'9b1a'9918,
5551                                0xaf2e'ad2c'ab2a'a928,
5552                                0xbf3e'bd3c'bb3a'b938});
5553 }
5554 
TEST_F(Riscv64InterpreterTest,TestVsseg4e64_vlmul2)5555 TEST_F(Riscv64InterpreterTest, TestVsseg4e64_vlmul2) {
5556   TestVssegXeXX<UInt64, 4, 2>(0x6000f427,  // vsseg4e64.v v8, (x1), v0.t
5557                               {0x8706'8504'8302'8100,
5558                                0xa726'a524'a322'a120,
5559                                0xc746'c544'c342'c140,
5560                                0xe766'e564'e362'e160,
5561                                0x8f0e'8d0c'8b0a'8908,
5562                                0xaf2e'ad2c'ab2a'a928,
5563                                0xcf4e'cd4c'cb4a'c948,
5564                                0xef6e'ed6c'eb6a'e968,
5565                                0x9716'9514'9312'9110,
5566                                0xb736'b534'b332'b130,
5567                                0xd756'd554'd352'd150,
5568                                0xf776'f574'f372'f170,
5569                                0x9f1e'9d1c'9b1a'9918,
5570                                0xbf3e'bd3c'bb3a'b938,
5571                                0xdf5e'dd5c'db5a'd958,
5572                                0xff7e'fd7c'fb7a'f978});
5573 }
5574 
TEST_F(Riscv64InterpreterTest,TestVsseg5e64)5575 TEST_F(Riscv64InterpreterTest, TestVsseg5e64) {
5576   TestVssegXeXX<UInt64, 5, 1>(0x8000f427,  // vsseg5e64.v v8, (x1), v0.t
5577                               {0x8706'8504'8302'8100,
5578                                0x9716'9514'9312'9110,
5579                                0xa726'a524'a322'a120,
5580                                0xb736'b534'b332'b130,
5581                                0xc746'c544'c342'c140,
5582                                0x8f0e'8d0c'8b0a'8908,
5583                                0x9f1e'9d1c'9b1a'9918,
5584                                0xaf2e'ad2c'ab2a'a928,
5585                                0xbf3e'bd3c'bb3a'b938,
5586                                0xcf4e'cd4c'cb4a'c948});
5587 }
5588 
TEST_F(Riscv64InterpreterTest,TestVsseg6e64)5589 TEST_F(Riscv64InterpreterTest, TestVsseg6e64) {
5590   TestVssegXeXX<UInt64, 6, 1>(0xa000f427,  // vsseg6e64.v v8, (x1), v0.t
5591                               {0x8706'8504'8302'8100,
5592                                0x9716'9514'9312'9110,
5593                                0xa726'a524'a322'a120,
5594                                0xb736'b534'b332'b130,
5595                                0xc746'c544'c342'c140,
5596                                0xd756'd554'd352'd150,
5597                                0x8f0e'8d0c'8b0a'8908,
5598                                0x9f1e'9d1c'9b1a'9918,
5599                                0xaf2e'ad2c'ab2a'a928,
5600                                0xbf3e'bd3c'bb3a'b938,
5601                                0xcf4e'cd4c'cb4a'c948,
5602                                0xdf5e'dd5c'db5a'd958});
5603 }
5604 
TEST_F(Riscv64InterpreterTest,TestVsseg7e64)5605 TEST_F(Riscv64InterpreterTest, TestVsseg7e64) {
5606   TestVssegXeXX<UInt64, 7, 1>(0xc000f427,  // vsseg7e64.v v8, (x1), v0.t
5607                               {0x8706'8504'8302'8100,
5608                                0x9716'9514'9312'9110,
5609                                0xa726'a524'a322'a120,
5610                                0xb736'b534'b332'b130,
5611                                0xc746'c544'c342'c140,
5612                                0xd756'd554'd352'd150,
5613                                0xe766'e564'e362'e160,
5614                                0x8f0e'8d0c'8b0a'8908,
5615                                0x9f1e'9d1c'9b1a'9918,
5616                                0xaf2e'ad2c'ab2a'a928,
5617                                0xbf3e'bd3c'bb3a'b938,
5618                                0xcf4e'cd4c'cb4a'c948,
5619                                0xdf5e'dd5c'db5a'd958,
5620                                0xef6e'ed6c'eb6a'e968});
5621 }
5622 
TEST_F(Riscv64InterpreterTest,TestVsseg8e64)5623 TEST_F(Riscv64InterpreterTest, TestVsseg8e64) {
5624   TestVssegXeXX<UInt64, 8, 1>(0xe000f427,  // vsseg8e64.v v8, (x1), v0.t
5625                               {0x8706'8504'8302'8100,
5626                                0x9716'9514'9312'9110,
5627                                0xa726'a524'a322'a120,
5628                                0xb736'b534'b332'b130,
5629                                0xc746'c544'c342'c140,
5630                                0xd756'd554'd352'd150,
5631                                0xe766'e564'e362'e160,
5632                                0xf776'f574'f372'f170,
5633                                0x8f0e'8d0c'8b0a'8908,
5634                                0x9f1e'9d1c'9b1a'9918,
5635                                0xaf2e'ad2c'ab2a'a928,
5636                                0xbf3e'bd3c'bb3a'b938,
5637                                0xcf4e'cd4c'cb4a'c948,
5638                                0xdf5e'dd5c'db5a'd958,
5639                                0xef6e'ed6c'eb6a'e968,
5640                                0xff7e'fd7c'fb7a'f978});
5641 }
5642 
TEST_F(Riscv64InterpreterTest,TestVsse8_vlmul1)5643 TEST_F(Riscv64InterpreterTest, TestVsse8_vlmul1) {
5644   TestVsssegXeXX<UInt8, 1, 1>(0x8208427,  // vsse8.v v8, (x1), x2, v0.t
5645                               4,
5646                               {0x5555'5581'5555'5500,
5647                                0x5555'5583'5555'5502,
5648                                0x5555'5585'5555'5504,
5649                                0x5555'5587'5555'5506,
5650                                0x5555'5589'5555'5508,
5651                                0x5555'558b'5555'550a,
5652                                0x5555'558d'5555'550c,
5653                                0x5555'558f'5555'550e});
5654 }
5655 
TEST_F(Riscv64InterpreterTest,TestVsse8_vlmul2)5656 TEST_F(Riscv64InterpreterTest, TestVsse8_vlmul2) {
5657   TestVsssegXeXX<UInt8, 1, 2>(0x8208427,  // vsse8.v v8, (x1), x2, v0.t
5658                               4,
5659                               {0x5555'5581'5555'5500,
5660                                0x5555'5583'5555'5502,
5661                                0x5555'5585'5555'5504,
5662                                0x5555'5587'5555'5506,
5663                                0x5555'5589'5555'5508,
5664                                0x5555'558b'5555'550a,
5665                                0x5555'558d'5555'550c,
5666                                0x5555'558f'5555'550e,
5667                                0x5555'5591'5555'5510,
5668                                0x5555'5593'5555'5512,
5669                                0x5555'5595'5555'5514,
5670                                0x5555'5597'5555'5516,
5671                                0x5555'5599'5555'5518,
5672                                0x5555'559b'5555'551a,
5673                                0x5555'559d'5555'551c,
5674                                0x5555'559f'5555'551e});
5675 }
5676 
TEST_F(Riscv64InterpreterTest,TestVsse8_vlmul4)5677 TEST_F(Riscv64InterpreterTest, TestVsse8_vlmul4) {
5678   TestVsssegXeXX<UInt8, 1, 4>(
5679       0x8208427,  // vlse8.v v8, (x1), x2, v0.t
5680       4,
5681       {0x5555'5581'5555'5500, 0x5555'5583'5555'5502, 0x5555'5585'5555'5504, 0x5555'5587'5555'5506,
5682        0x5555'5589'5555'5508, 0x5555'558b'5555'550a, 0x5555'558d'5555'550c, 0x5555'558f'5555'550e,
5683        0x5555'5591'5555'5510, 0x5555'5593'5555'5512, 0x5555'5595'5555'5514, 0x5555'5597'5555'5516,
5684        0x5555'5599'5555'5518, 0x5555'559b'5555'551a, 0x5555'559d'5555'551c, 0x5555'559f'5555'551e,
5685        0x5555'55a1'5555'5520, 0x5555'55a3'5555'5522, 0x5555'55a5'5555'5524, 0x5555'55a7'5555'5526,
5686        0x5555'55a9'5555'5528, 0x5555'55ab'5555'552a, 0x5555'55ad'5555'552c, 0x5555'55af'5555'552e,
5687        0x5555'55b1'5555'5530, 0x5555'55b3'5555'5532, 0x5555'55b5'5555'5534, 0x5555'55b7'5555'5536,
5688        0x5555'55b9'5555'5538, 0x5555'55bb'5555'553a, 0x5555'55bd'5555'553c, 0x5555'55bf'5555'553e});
5689 }
5690 
TEST_F(Riscv64InterpreterTest,TestVsse8_vlmul8)5691 TEST_F(Riscv64InterpreterTest, TestVsse8_vlmul8) {
5692   TestVsssegXeXX<UInt8, 1, 8>(
5693       0x8208427,  // vsse8.v v8, (x1), x2, v0.t
5694       2,
5695       {0x5583'5502'5581'5500, 0x5587'5506'5585'5504, 0x558b'550a'5589'5508, 0x558f'550e'558d'550c,
5696        0x5593'5512'5591'5510, 0x5597'5516'5595'5514, 0x559b'551a'5599'5518, 0x559f'551e'559d'551c,
5697        0x55a3'5522'55a1'5520, 0x55a7'5526'55a5'5524, 0x55ab'552a'55a9'5528, 0x55af'552e'55ad'552c,
5698        0x55b3'5532'55b1'5530, 0x55b7'5536'55b5'5534, 0x55bb'553a'55b9'5538, 0x55bf'553e'55bd'553c,
5699        0x55c3'5542'55c1'5540, 0x55c7'5546'55c5'5544, 0x55cb'554a'55c9'5548, 0x55cf'554e'55cd'554c,
5700        0x55d3'5552'55d1'5550, 0x55d7'5556'55d5'5554, 0x55db'555a'55d9'5558, 0x55df'555e'55dd'555c,
5701        0x55e3'5562'55e1'5560, 0x55e7'5566'55e5'5564, 0x55eb'556a'55e9'5568, 0x55ef'556e'55ed'556c,
5702        0x55f3'5572'55f1'5570, 0x55f7'5576'55f5'5574, 0x55fb'557a'55f9'5578, 0x55ff'557e'55fd'557c});
5703 }
5704 
TEST_F(Riscv64InterpreterTest,TestVssseg2e8_vlmul1)5705 TEST_F(Riscv64InterpreterTest, TestVssseg2e8_vlmul1) {
5706   TestVsssegXeXX<UInt8, 2, 1>(0x28208427,  // vssseg2e8.v v8, (x1), x2, v0.t
5707                               4,
5708                               {0x5555'9181'5555'1000,
5709                                0x5555'9383'5555'1202,
5710                                0x5555'9585'5555'1404,
5711                                0x5555'9787'5555'1606,
5712                                0x5555'9989'5555'1808,
5713                                0x5555'9b8b'5555'1a0a,
5714                                0x5555'9d8d'5555'1c0c,
5715                                0x5555'9f8f'5555'1e0e});
5716 }
5717 
TEST_F(Riscv64InterpreterTest,TestVssseg2e8_vlmul2)5718 TEST_F(Riscv64InterpreterTest, TestVssseg2e8_vlmul2) {
5719   TestVsssegXeXX<UInt8, 2, 2>(0x28208427,  // vssseg2e8.v v8, (x1), x2, v0.t
5720                               4,
5721                               {0x5555'a181'5555'2000,
5722                                0x5555'a383'5555'2202,
5723                                0x5555'a585'5555'2404,
5724                                0x5555'a787'5555'2606,
5725                                0x5555'a989'5555'2808,
5726                                0x5555'ab8b'5555'2a0a,
5727                                0x5555'ad8d'5555'2c0c,
5728                                0x5555'af8f'5555'2e0e,
5729                                0x5555'b191'5555'3010,
5730                                0x5555'b393'5555'3212,
5731                                0x5555'b595'5555'3414,
5732                                0x5555'b797'5555'3616,
5733                                0x5555'b999'5555'3818,
5734                                0x5555'bb9b'5555'3a1a,
5735                                0x5555'bd9d'5555'3c1c,
5736                                0x5555'bf9f'5555'3e1e});
5737 }
5738 
TEST_F(Riscv64InterpreterTest,TestVssseg2e8_vlmul4)5739 TEST_F(Riscv64InterpreterTest, TestVssseg2e8_vlmul4) {
5740   TestVsssegXeXX<UInt8, 2, 4>(
5741       0x28208427,  // vssseg4e8.v v8, (x1), x2, v0.t
5742       4,
5743       {0x5555'c181'5555'4000, 0x5555'c383'5555'4202, 0x5555'c585'5555'4404, 0x5555'c787'5555'4606,
5744        0x5555'c989'5555'4808, 0x5555'cb8b'5555'4a0a, 0x5555'cd8d'5555'4c0c, 0x5555'cf8f'5555'4e0e,
5745        0x5555'd191'5555'5010, 0x5555'd393'5555'5212, 0x5555'd595'5555'5414, 0x5555'd797'5555'5616,
5746        0x5555'd999'5555'5818, 0x5555'db9b'5555'5a1a, 0x5555'dd9d'5555'5c1c, 0x5555'df9f'5555'5e1e,
5747        0x5555'e1a1'5555'6020, 0x5555'e3a3'5555'6222, 0x5555'e5a5'5555'6424, 0x5555'e7a7'5555'6626,
5748        0x5555'e9a9'5555'6828, 0x5555'ebab'5555'6a2a, 0x5555'edad'5555'6c2c, 0x5555'efaf'5555'6e2e,
5749        0x5555'f1b1'5555'7030, 0x5555'f3b3'5555'7232, 0x5555'f5b5'5555'7434, 0x5555'f7b7'5555'7636,
5750        0x5555'f9b9'5555'7838, 0x5555'fbbb'5555'7a3a, 0x5555'fdbd'5555'7c3c, 0x5555'ffbf'5555'7e3e});
5751 }
5752 
TEST_F(Riscv64InterpreterTest,TestVssseg3e8_vlmul1)5753 TEST_F(Riscv64InterpreterTest, TestVssseg3e8_vlmul1) {
5754   TestVsssegXeXX<UInt8, 3, 1>(0x48208427,  // vssseg3e8.v v8, (x1), x2, v0.t
5755                               4,
5756                               {0x55a1'9181'5520'1000,
5757                                0x55a3'9383'5522'1202,
5758                                0x55a5'9585'5524'1404,
5759                                0x55a7'9787'5526'1606,
5760                                0x55a9'9989'5528'1808,
5761                                0x55ab'9b8b'552a'1a0a,
5762                                0x55ad'9d8d'552c'1c0c,
5763                                0x55af'9f8f'552e'1e0e});
5764 }
5765 
TEST_F(Riscv64InterpreterTest,TestVssseg3e8_vlmul2)5766 TEST_F(Riscv64InterpreterTest, TestVssseg3e8_vlmul2) {
5767   TestVsssegXeXX<UInt8, 3, 2>(0x48208427,  // vssseg3e8.v v8, (x1), x2, v0.t
5768                               4,
5769                               {0x55c1'a181'5540'2000,
5770                                0x55c3'a383'5542'2202,
5771                                0x55c5'a585'5544'2404,
5772                                0x55c7'a787'5546'2606,
5773                                0x55c9'a989'5548'2808,
5774                                0x55cb'ab8b'554a'2a0a,
5775                                0x55cd'ad8d'554c'2c0c,
5776                                0x55cf'af8f'554e'2e0e,
5777                                0x55d1'b191'5550'3010,
5778                                0x55d3'b393'5552'3212,
5779                                0x55d5'b595'5554'3414,
5780                                0x55d7'b797'5556'3616,
5781                                0x55d9'b999'5558'3818,
5782                                0x55db'bb9b'555a'3a1a,
5783                                0x55dd'bd9d'555c'3c1c,
5784                                0x55df'bf9f'555e'3e1e});
5785 }
5786 
TEST_F(Riscv64InterpreterTest,TestVssseg4e8_vlmul1)5787 TEST_F(Riscv64InterpreterTest, TestVssseg4e8_vlmul1) {
5788   TestVsssegXeXX<UInt8, 4, 1>(0x68208427,  // vssseg4e8.v v8, (x1), x2, v0.t
5789                               4,
5790                               {0xb1a1'9181'3020'1000,
5791                                0xb3a3'9383'3222'1202,
5792                                0xb5a5'9585'3424'1404,
5793                                0xb7a7'9787'3626'1606,
5794                                0xb9a9'9989'3828'1808,
5795                                0xbbab'9b8b'3a2a'1a0a,
5796                                0xbdad'9d8d'3c2c'1c0c,
5797                                0xbfaf'9f8f'3e2e'1e0e});
5798 }
5799 
TEST_F(Riscv64InterpreterTest,TestVssseg4e8_vlmul2)5800 TEST_F(Riscv64InterpreterTest, TestVssseg4e8_vlmul2) {
5801   TestVsssegXeXX<UInt8, 4, 2>(0x68208427,  // vssseg4e8.v v8, (x1), x2, v0.t
5802                               4,
5803                               {0xe1c1'a181'6040'2000,
5804                                0xe3c3'a383'6242'2202,
5805                                0xe5c5'a585'6444'2404,
5806                                0xe7c7'a787'6646'2606,
5807                                0xe9c9'a989'6848'2808,
5808                                0xebcb'ab8b'6a4a'2a0a,
5809                                0xedcd'ad8d'6c4c'2c0c,
5810                                0xefcf'af8f'6e4e'2e0e,
5811                                0xf1d1'b191'7050'3010,
5812                                0xf3d3'b393'7252'3212,
5813                                0xf5d5'b595'7454'3414,
5814                                0xf7d7'b797'7656'3616,
5815                                0xf9d9'b999'7858'3818,
5816                                0xfbdb'bb9b'7a5a'3a1a,
5817                                0xfddd'bd9d'7c5c'3c1c,
5818                                0xffdf'bf9f'7e5e'3e1e});
5819 }
5820 
TEST_F(Riscv64InterpreterTest,TestVssseg5e8)5821 TEST_F(Riscv64InterpreterTest, TestVssseg5e8) {
5822   TestVsssegXeXX<UInt8, 5, 1>(0x88208427,  // vssseg5e8.v v8, (x1), x2, v0.t
5823                               8,
5824                               {0x5555'5540'3020'1000,
5825                                0x5555'55c1'b1a1'9181,
5826                                0x5555'5542'3222'1202,
5827                                0x5555'55c3'b3a3'9383,
5828                                0x5555'5544'3424'1404,
5829                                0x5555'55c5'b5a5'9585,
5830                                0x5555'5546'3626'1606,
5831                                0x5555'55c7'b7a7'9787,
5832                                0x5555'5548'3828'1808,
5833                                0x5555'55c9'b9a9'9989,
5834                                0x5555'554a'3a2a'1a0a,
5835                                0x5555'55cb'bbab'9b8b,
5836                                0x5555'554c'3c2c'1c0c,
5837                                0x5555'55cd'bdad'9d8d,
5838                                0x5555'554e'3e2e'1e0e,
5839                                0x5555'55cf'bfaf'9f8f});
5840 }
5841 
TEST_F(Riscv64InterpreterTest,TestVssseg6e8)5842 TEST_F(Riscv64InterpreterTest, TestVssseg6e8) {
5843   TestVsssegXeXX<UInt8, 6, 1>(0xa8208427,  // vssseg6e8.v v8, (x1), x2, v0.t
5844                               8,
5845                               {0x5555'5040'3020'1000,
5846                                0x5555'd1c1'b1a1'9181,
5847                                0x5555'5242'3222'1202,
5848                                0x5555'd3c3'b3a3'9383,
5849                                0x5555'5444'3424'1404,
5850                                0x5555'd5c5'b5a5'9585,
5851                                0x5555'5646'3626'1606,
5852                                0x5555'd7c7'b7a7'9787,
5853                                0x5555'5848'3828'1808,
5854                                0x5555'd9c9'b9a9'9989,
5855                                0x5555'5a4a'3a2a'1a0a,
5856                                0x5555'dbcb'bbab'9b8b,
5857                                0x5555'5c4c'3c2c'1c0c,
5858                                0x5555'ddcd'bdad'9d8d,
5859                                0x5555'5e4e'3e2e'1e0e,
5860                                0x5555'dfcf'bfaf'9f8f});
5861 }
5862 
TEST_F(Riscv64InterpreterTest,TestVssseg7e8)5863 TEST_F(Riscv64InterpreterTest, TestVssseg7e8) {
5864   TestVsssegXeXX<UInt8, 7, 1>(0xc8208427,  // vssseg7e8.v v8, (x1), x2, v0.t
5865                               8,
5866                               {0x5560'5040'3020'1000,
5867                                0x55e1'd1c1'b1a1'9181,
5868                                0x5562'5242'3222'1202,
5869                                0x55e3'd3c3'b3a3'9383,
5870                                0x5564'5444'3424'1404,
5871                                0x55e5'd5c5'b5a5'9585,
5872                                0x5566'5646'3626'1606,
5873                                0x55e7'd7c7'b7a7'9787,
5874                                0x5568'5848'3828'1808,
5875                                0x55e9'd9c9'b9a9'9989,
5876                                0x556a'5a4a'3a2a'1a0a,
5877                                0x55eb'dbcb'bbab'9b8b,
5878                                0x556c'5c4c'3c2c'1c0c,
5879                                0x55ed'ddcd'bdad'9d8d,
5880                                0x556e'5e4e'3e2e'1e0e,
5881                                0x55ef'dfcf'bfaf'9f8f});
5882 }
5883 
TEST_F(Riscv64InterpreterTest,TestVssseg8e8)5884 TEST_F(Riscv64InterpreterTest, TestVssseg8e8) {
5885   TestVsssegXeXX<UInt8, 8, 1>(0xe8208427,  // vssseg8e8.v v8, (x1), x2, v0.t
5886                               8,
5887                               {0x7060'5040'3020'1000,
5888                                0xf1e1'd1c1'b1a1'9181,
5889                                0x7262'5242'3222'1202,
5890                                0xf3e3'd3c3'b3a3'9383,
5891                                0x7464'5444'3424'1404,
5892                                0xf5e5'd5c5'b5a5'9585,
5893                                0x7666'5646'3626'1606,
5894                                0xf7e7'd7c7'b7a7'9787,
5895                                0x7868'5848'3828'1808,
5896                                0xf9e9'd9c9'b9a9'9989,
5897                                0x7a6a'5a4a'3a2a'1a0a,
5898                                0xfbeb'dbcb'bbab'9b8b,
5899                                0x7c6c'5c4c'3c2c'1c0c,
5900                                0xfded'ddcd'bdad'9d8d,
5901                                0x7e6e'5e4e'3e2e'1e0e,
5902                                0xffef'dfcf'bfaf'9f8f});
5903 }
5904 
TEST_F(Riscv64InterpreterTest,TestVsse16_vlmul1)5905 TEST_F(Riscv64InterpreterTest, TestVsse16_vlmul1) {
5906   TestVsssegXeXX<UInt16, 1, 1>(0x820d427,  // vsse16.v v8, (x1), x2, v0.t
5907                                8,
5908                                {0x5555'5555'5555'8100,
5909                                 0x5555'5555'5555'8302,
5910                                 0x5555'5555'5555'8504,
5911                                 0x5555'5555'5555'8706,
5912                                 0x5555'5555'5555'8908,
5913                                 0x5555'5555'5555'8b0a,
5914                                 0x5555'5555'5555'8d0c,
5915                                 0x5555'5555'5555'8f0e});
5916 }
5917 
TEST_F(Riscv64InterpreterTest,TestVsse16_vlmul2)5918 TEST_F(Riscv64InterpreterTest, TestVsse16_vlmul2) {
5919   TestVsssegXeXX<UInt16, 1, 2>(0x820d427,  // vsse16.v v8, (x1), x2, v0.t
5920                                8,
5921                                {0x5555'5555'5555'8100,
5922                                 0x5555'5555'5555'8302,
5923                                 0x5555'5555'5555'8504,
5924                                 0x5555'5555'5555'8706,
5925                                 0x5555'5555'5555'8908,
5926                                 0x5555'5555'5555'8b0a,
5927                                 0x5555'5555'5555'8d0c,
5928                                 0x5555'5555'5555'8f0e,
5929                                 0x5555'5555'5555'9110,
5930                                 0x5555'5555'5555'9312,
5931                                 0x5555'5555'5555'9514,
5932                                 0x5555'5555'5555'9716,
5933                                 0x5555'5555'5555'9918,
5934                                 0x5555'5555'5555'9b1a,
5935                                 0x5555'5555'5555'9d1c,
5936                                 0x5555'5555'5555'9f1e});
5937 }
5938 
TEST_F(Riscv64InterpreterTest,TestVsse16_vlmul4)5939 TEST_F(Riscv64InterpreterTest, TestVsse16_vlmul4) {
5940   TestVsssegXeXX<UInt16, 1, 4>(
5941       0x820d427,  // vsse16.v v8, (x1), x2, v0.t
5942       8,
5943       {0x5555'5555'5555'8100, 0x5555'5555'5555'8302, 0x5555'5555'5555'8504, 0x5555'5555'5555'8706,
5944        0x5555'5555'5555'8908, 0x5555'5555'5555'8b0a, 0x5555'5555'5555'8d0c, 0x5555'5555'5555'8f0e,
5945        0x5555'5555'5555'9110, 0x5555'5555'5555'9312, 0x5555'5555'5555'9514, 0x5555'5555'5555'9716,
5946        0x5555'5555'5555'9918, 0x5555'5555'5555'9b1a, 0x5555'5555'5555'9d1c, 0x5555'5555'5555'9f1e,
5947        0x5555'5555'5555'a120, 0x5555'5555'5555'a322, 0x5555'5555'5555'a524, 0x5555'5555'5555'a726,
5948        0x5555'5555'5555'a928, 0x5555'5555'5555'ab2a, 0x5555'5555'5555'ad2c, 0x5555'5555'5555'af2e,
5949        0x5555'5555'5555'b130, 0x5555'5555'5555'b332, 0x5555'5555'5555'b534, 0x5555'5555'5555'b736,
5950        0x5555'5555'5555'b938, 0x5555'5555'5555'bb3a, 0x5555'5555'5555'bd3c, 0x5555'5555'5555'bf3e});
5951 }
5952 
TEST_F(Riscv64InterpreterTest,TestVsse16_vlmul8)5953 TEST_F(Riscv64InterpreterTest, TestVsse16_vlmul8) {
5954   TestVsssegXeXX<UInt16, 1, 8>(
5955       0x820d427,  // vsse16.v v8, (x1), x2, v0.t
5956       4,
5957       {0x5555'8302'5555'8100, 0x5555'8706'5555'8504, 0x5555'8b0a'5555'8908, 0x5555'8f0e'5555'8d0c,
5958        0x5555'9312'5555'9110, 0x5555'9716'5555'9514, 0x5555'9b1a'5555'9918, 0x5555'9f1e'5555'9d1c,
5959        0x5555'a322'5555'a120, 0x5555'a726'5555'a524, 0x5555'ab2a'5555'a928, 0x5555'af2e'5555'ad2c,
5960        0x5555'b332'5555'b130, 0x5555'b736'5555'b534, 0x5555'bb3a'5555'b938, 0x5555'bf3e'5555'bd3c,
5961        0x5555'c342'5555'c140, 0x5555'c746'5555'c544, 0x5555'cb4a'5555'c948, 0x5555'cf4e'5555'cd4c,
5962        0x5555'd352'5555'd150, 0x5555'd756'5555'd554, 0x5555'db5a'5555'd958, 0x5555'df5e'5555'dd5c,
5963        0x5555'e362'5555'e160, 0x5555'e766'5555'e564, 0x5555'eb6a'5555'e968, 0x5555'ef6e'5555'ed6c,
5964        0x5555'f372'5555'f170, 0x5555'f776'5555'f574, 0x5555'fb7a'5555'f978, 0x5555'ff7e'5555'fd7c});
5965 }
5966 
TEST_F(Riscv64InterpreterTest,TestVssseg2e16_vlmul1)5967 TEST_F(Riscv64InterpreterTest, TestVssseg2e16_vlmul1) {
5968   TestVsssegXeXX<UInt16, 2, 1>(0x2820d427,  // vssseg2e16.v v8, (x1), x2, v0.t
5969                                8,
5970                                {0x5555'5555'9110'8100,
5971                                 0x5555'5555'9312'8302,
5972                                 0x5555'5555'9514'8504,
5973                                 0x5555'5555'9716'8706,
5974                                 0x5555'5555'9918'8908,
5975                                 0x5555'5555'9b1a'8b0a,
5976                                 0x5555'5555'9d1c'8d0c,
5977                                 0x5555'5555'9f1e'8f0e});
5978 }
5979 
TEST_F(Riscv64InterpreterTest,TestVssseg2e16_vlmul2)5980 TEST_F(Riscv64InterpreterTest, TestVssseg2e16_vlmul2) {
5981   TestVsssegXeXX<UInt16, 2, 2>(0x2820d427,  // vssseg2e16.v v8, (x1), x2, v0.t
5982                                8,
5983                                {0x5555'5555'a120'8100,
5984                                 0x5555'5555'a322'8302,
5985                                 0x5555'5555'a524'8504,
5986                                 0x5555'5555'a726'8706,
5987                                 0x5555'5555'a928'8908,
5988                                 0x5555'5555'ab2a'8b0a,
5989                                 0x5555'5555'ad2c'8d0c,
5990                                 0x5555'5555'af2e'8f0e,
5991                                 0x5555'5555'b130'9110,
5992                                 0x5555'5555'b332'9312,
5993                                 0x5555'5555'b534'9514,
5994                                 0x5555'5555'b736'9716,
5995                                 0x5555'5555'b938'9918,
5996                                 0x5555'5555'bb3a'9b1a,
5997                                 0x5555'5555'bd3c'9d1c,
5998                                 0x5555'5555'bf3e'9f1e});
5999 }
6000 
TEST_F(Riscv64InterpreterTest,TestVssseg2e16_vlmul4)6001 TEST_F(Riscv64InterpreterTest, TestVssseg2e16_vlmul4) {
6002   TestVsssegXeXX<UInt16, 2, 4>(
6003       0x2820d427,  // vssseg2e16.v v8, (x1), x2, v0.t
6004       8,
6005       {0x5555'5555'c140'8100, 0x5555'5555'c342'8302, 0x5555'5555'c544'8504, 0x5555'5555'c746'8706,
6006        0x5555'5555'c948'8908, 0x5555'5555'cb4a'8b0a, 0x5555'5555'cd4c'8d0c, 0x5555'5555'cf4e'8f0e,
6007        0x5555'5555'd150'9110, 0x5555'5555'd352'9312, 0x5555'5555'd554'9514, 0x5555'5555'd756'9716,
6008        0x5555'5555'd958'9918, 0x5555'5555'db5a'9b1a, 0x5555'5555'dd5c'9d1c, 0x5555'5555'df5e'9f1e,
6009        0x5555'5555'e160'a120, 0x5555'5555'e362'a322, 0x5555'5555'e564'a524, 0x5555'5555'e766'a726,
6010        0x5555'5555'e968'a928, 0x5555'5555'eb6a'ab2a, 0x5555'5555'ed6c'ad2c, 0x5555'5555'ef6e'af2e,
6011        0x5555'5555'f170'b130, 0x5555'5555'f372'b332, 0x5555'5555'f574'b534, 0x5555'5555'f776'b736,
6012        0x5555'5555'f978'b938, 0x5555'5555'fb7a'bb3a, 0x5555'5555'fd7c'bd3c, 0x5555'5555'ff7e'bf3e});
6013 }
6014 
TEST_F(Riscv64InterpreterTest,TestVssseg3e16_vlmul1)6015 TEST_F(Riscv64InterpreterTest, TestVssseg3e16_vlmul1) {
6016   TestVsssegXeXX<UInt16, 3, 1>(0x4820d427,  // vssseg3e16.v v8, (x1), x2, v0.t
6017                                8,
6018                                {0x5555'a120'9110'8100,
6019                                 0x5555'a322'9312'8302,
6020                                 0x5555'a524'9514'8504,
6021                                 0x5555'a726'9716'8706,
6022                                 0x5555'a928'9918'8908,
6023                                 0x5555'ab2a'9b1a'8b0a,
6024                                 0x5555'ad2c'9d1c'8d0c,
6025                                 0x5555'af2e'9f1e'8f0e});
6026 }
6027 
TEST_F(Riscv64InterpreterTest,TestVssseg3e16_vlmul2)6028 TEST_F(Riscv64InterpreterTest, TestVssseg3e16_vlmul2) {
6029   TestVsssegXeXX<UInt16, 3, 2>(0x4820d427,  // vssseg3e16.v v8, (x1), x2, v0.t
6030                                8,
6031                                {0x5555'c140'a120'8100,
6032                                 0x5555'c342'a322'8302,
6033                                 0x5555'c544'a524'8504,
6034                                 0x5555'c746'a726'8706,
6035                                 0x5555'c948'a928'8908,
6036                                 0x5555'cb4a'ab2a'8b0a,
6037                                 0x5555'cd4c'ad2c'8d0c,
6038                                 0x5555'cf4e'af2e'8f0e,
6039                                 0x5555'd150'b130'9110,
6040                                 0x5555'd352'b332'9312,
6041                                 0x5555'd554'b534'9514,
6042                                 0x5555'd756'b736'9716,
6043                                 0x5555'd958'b938'9918,
6044                                 0x5555'db5a'bb3a'9b1a,
6045                                 0x5555'dd5c'bd3c'9d1c,
6046                                 0x5555'df5e'bf3e'9f1e});
6047 }
6048 
TEST_F(Riscv64InterpreterTest,TestVssseg4e16_vlmul1)6049 TEST_F(Riscv64InterpreterTest, TestVssseg4e16_vlmul1) {
6050   TestVsssegXeXX<UInt16, 4, 1>(0x6820d427,  // vssseg4e16.v v8, (x1), x2, v0.t
6051                                8,
6052                                {0xb130'a120'9110'8100,
6053                                 0xb332'a322'9312'8302,
6054                                 0xb534'a524'9514'8504,
6055                                 0xb736'a726'9716'8706,
6056                                 0xb938'a928'9918'8908,
6057                                 0xbb3a'ab2a'9b1a'8b0a,
6058                                 0xbd3c'ad2c'9d1c'8d0c,
6059                                 0xbf3e'af2e'9f1e'8f0e});
6060 }
6061 
TEST_F(Riscv64InterpreterTest,TestVssseg4e16_vlmul2)6062 TEST_F(Riscv64InterpreterTest, TestVssseg4e16_vlmul2) {
6063   TestVsssegXeXX<UInt16, 4, 2>(0x6820d427,  // vssseg4e16.v v8, (x1), x2, v0.t
6064                                8,
6065                                {0xe160'c140'a120'8100,
6066                                 0xe362'c342'a322'8302,
6067                                 0xe564'c544'a524'8504,
6068                                 0xe766'c746'a726'8706,
6069                                 0xe968'c948'a928'8908,
6070                                 0xeb6a'cb4a'ab2a'8b0a,
6071                                 0xed6c'cd4c'ad2c'8d0c,
6072                                 0xef6e'cf4e'af2e'8f0e,
6073                                 0xf170'd150'b130'9110,
6074                                 0xf372'd352'b332'9312,
6075                                 0xf574'd554'b534'9514,
6076                                 0xf776'd756'b736'9716,
6077                                 0xf978'd958'b938'9918,
6078                                 0xfb7a'db5a'bb3a'9b1a,
6079                                 0xfd7c'dd5c'bd3c'9d1c,
6080                                 0xff7e'df5e'bf3e'9f1e});
6081 }
6082 
TEST_F(Riscv64InterpreterTest,TestVssseg5e16)6083 TEST_F(Riscv64InterpreterTest, TestVssseg5e16) {
6084   TestVsssegXeXX<UInt16, 5, 1>(0x8820d427,  // vssseg5e16.v v8, (x1), x2, v0.t
6085                                16,
6086                                {0xb130'a120'9110'8100,
6087                                 0x5555'5555'5555'c140,
6088                                 0xb332'a322'9312'8302,
6089                                 0x5555'5555'5555'c342,
6090                                 0xb534'a524'9514'8504,
6091                                 0x5555'5555'5555'c544,
6092                                 0xb736'a726'9716'8706,
6093                                 0x5555'5555'5555'c746,
6094                                 0xb938'a928'9918'8908,
6095                                 0x5555'5555'5555'c948,
6096                                 0xbb3a'ab2a'9b1a'8b0a,
6097                                 0x5555'5555'5555'cb4a,
6098                                 0xbd3c'ad2c'9d1c'8d0c,
6099                                 0x5555'5555'5555'cd4c,
6100                                 0xbf3e'af2e'9f1e'8f0e,
6101                                 0x5555'5555'5555'cf4e});
6102 }
6103 
TEST_F(Riscv64InterpreterTest,TestVssseg6e16)6104 TEST_F(Riscv64InterpreterTest, TestVssseg6e16) {
6105   TestVsssegXeXX<UInt16, 6, 1>(0xa820d427,  // vssseg6e16.v v8, (x1), x2, v0.t
6106                                16,
6107                                {0xb130'a120'9110'8100,
6108                                 0x5555'5555'd150'c140,
6109                                 0xb332'a322'9312'8302,
6110                                 0x5555'5555'd352'c342,
6111                                 0xb534'a524'9514'8504,
6112                                 0x5555'5555'd554'c544,
6113                                 0xb736'a726'9716'8706,
6114                                 0x5555'5555'd756'c746,
6115                                 0xb938'a928'9918'8908,
6116                                 0x5555'5555'd958'c948,
6117                                 0xbb3a'ab2a'9b1a'8b0a,
6118                                 0x5555'5555'db5a'cb4a,
6119                                 0xbd3c'ad2c'9d1c'8d0c,
6120                                 0x5555'5555'dd5c'cd4c,
6121                                 0xbf3e'af2e'9f1e'8f0e,
6122                                 0x5555'5555'df5e'cf4e});
6123 }
6124 
TEST_F(Riscv64InterpreterTest,TestVssseg7e16)6125 TEST_F(Riscv64InterpreterTest, TestVssseg7e16) {
6126   TestVsssegXeXX<UInt16, 7, 1>(0xc820d427,  // vssseg7e16.v v8, (x1), x2, v0.t
6127                                16,
6128                                {0xb130'a120'9110'8100,
6129                                 0x5555'e160'd150'c140,
6130                                 0xb332'a322'9312'8302,
6131                                 0x5555'e362'd352'c342,
6132                                 0xb534'a524'9514'8504,
6133                                 0x5555'e564'd554'c544,
6134                                 0xb736'a726'9716'8706,
6135                                 0x5555'e766'd756'c746,
6136                                 0xb938'a928'9918'8908,
6137                                 0x5555'e968'd958'c948,
6138                                 0xbb3a'ab2a'9b1a'8b0a,
6139                                 0x5555'eb6a'db5a'cb4a,
6140                                 0xbd3c'ad2c'9d1c'8d0c,
6141                                 0x5555'ed6c'dd5c'cd4c,
6142                                 0xbf3e'af2e'9f1e'8f0e,
6143                                 0x5555'ef6e'df5e'cf4e});
6144 }
6145 
TEST_F(Riscv64InterpreterTest,TestVssseg8e16)6146 TEST_F(Riscv64InterpreterTest, TestVssseg8e16) {
6147   TestVsssegXeXX<UInt16, 8, 1>(0xe820d427,  // vssseg8e16.v v8, (x1), x2, v0.t
6148                                16,
6149                                {0xb130'a120'9110'8100,
6150                                 0xf170'e160'd150'c140,
6151                                 0xb332'a322'9312'8302,
6152                                 0xf372'e362'd352'c342,
6153                                 0xb534'a524'9514'8504,
6154                                 0xf574'e564'd554'c544,
6155                                 0xb736'a726'9716'8706,
6156                                 0xf776'e766'd756'c746,
6157                                 0xb938'a928'9918'8908,
6158                                 0xf978'e968'd958'c948,
6159                                 0xbb3a'ab2a'9b1a'8b0a,
6160                                 0xfb7a'eb6a'db5a'cb4a,
6161                                 0xbd3c'ad2c'9d1c'8d0c,
6162                                 0xfd7c'ed6c'dd5c'cd4c,
6163                                 0xbf3e'af2e'9f1e'8f0e,
6164                                 0xff7e'ef6e'df5e'cf4e});
6165 }
6166 
TEST_F(Riscv64InterpreterTest,TestVsse32_vlmul1)6167 TEST_F(Riscv64InterpreterTest, TestVsse32_vlmul1) {
6168   TestVsssegXeXX<UInt32, 1, 1>(0x820e427,  // vsse32.v v8, (x1), x2, v0.t
6169                                16,
6170                                {0x5555'5555'8302'8100,
6171                                 0x5555'5555'5555'5555,
6172                                 0x5555'5555'8706'8504,
6173                                 0x5555'5555'5555'5555,
6174                                 0x5555'5555'8b0a'8908,
6175                                 0x5555'5555'5555'5555,
6176                                 0x5555'5555'8f0e'8d0c});
6177 }
6178 
TEST_F(Riscv64InterpreterTest,TestVsse32_vlmul2)6179 TEST_F(Riscv64InterpreterTest, TestVsse32_vlmul2) {
6180   TestVsssegXeXX<UInt32, 1, 2>(0x820e427,  // vsse32.v v8, (x1), x2, v0.t
6181                                16,
6182                                {0x5555'5555'8302'8100,
6183                                 0x5555'5555'5555'5555,
6184                                 0x5555'5555'8706'8504,
6185                                 0x5555'5555'5555'5555,
6186                                 0x5555'5555'8b0a'8908,
6187                                 0x5555'5555'5555'5555,
6188                                 0x5555'5555'8f0e'8d0c,
6189                                 0x5555'5555'5555'5555,
6190                                 0x5555'5555'9312'9110,
6191                                 0x5555'5555'5555'5555,
6192                                 0x5555'5555'9716'9514,
6193                                 0x5555'5555'5555'5555,
6194                                 0x5555'5555'9b1a'9918,
6195                                 0x5555'5555'5555'5555,
6196                                 0x5555'5555'9f1e'9d1c});
6197 }
6198 
TEST_F(Riscv64InterpreterTest,TestVsse32_vlmul4)6199 TEST_F(Riscv64InterpreterTest, TestVsse32_vlmul4) {
6200   TestVsssegXeXX<UInt32, 1, 4>(
6201       0x820e427,  // vsse32.v v8, (x1), x2, v0.t
6202       16,
6203       {0x5555'5555'8302'8100, 0x5555'5555'5555'5555, 0x5555'5555'8706'8504, 0x5555'5555'5555'5555,
6204        0x5555'5555'8b0a'8908, 0x5555'5555'5555'5555, 0x5555'5555'8f0e'8d0c, 0x5555'5555'5555'5555,
6205        0x5555'5555'9312'9110, 0x5555'5555'5555'5555, 0x5555'5555'9716'9514, 0x5555'5555'5555'5555,
6206        0x5555'5555'9b1a'9918, 0x5555'5555'5555'5555, 0x5555'5555'9f1e'9d1c, 0x5555'5555'5555'5555,
6207        0x5555'5555'a322'a120, 0x5555'5555'5555'5555, 0x5555'5555'a726'a524, 0x5555'5555'5555'5555,
6208        0x5555'5555'ab2a'a928, 0x5555'5555'5555'5555, 0x5555'5555'af2e'ad2c, 0x5555'5555'5555'5555,
6209        0x5555'5555'b332'b130, 0x5555'5555'5555'5555, 0x5555'5555'b736'b534, 0x5555'5555'5555'5555,
6210        0x5555'5555'bb3a'b938, 0x5555'5555'5555'5555, 0x5555'5555'bf3e'bd3c});
6211 }
6212 
TEST_F(Riscv64InterpreterTest,TestVsse32_vlmul8)6213 TEST_F(Riscv64InterpreterTest, TestVsse32_vlmul8) {
6214   TestVsssegXeXX<UInt32, 1, 8>(
6215       0x820e427,  // vsse32.v v8, (x1), x2, v0.t
6216       8,
6217       {0x5555'5555'8302'8100, 0x5555'5555'8706'8504, 0x5555'5555'8b0a'8908, 0x5555'5555'8f0e'8d0c,
6218        0x5555'5555'9312'9110, 0x5555'5555'9716'9514, 0x5555'5555'9b1a'9918, 0x5555'5555'9f1e'9d1c,
6219        0x5555'5555'a322'a120, 0x5555'5555'a726'a524, 0x5555'5555'ab2a'a928, 0x5555'5555'af2e'ad2c,
6220        0x5555'5555'b332'b130, 0x5555'5555'b736'b534, 0x5555'5555'bb3a'b938, 0x5555'5555'bf3e'bd3c,
6221        0x5555'5555'c342'c140, 0x5555'5555'c746'c544, 0x5555'5555'cb4a'c948, 0x5555'5555'cf4e'cd4c,
6222        0x5555'5555'd352'd150, 0x5555'5555'd756'd554, 0x5555'5555'db5a'd958, 0x5555'5555'df5e'dd5c,
6223        0x5555'5555'e362'e160, 0x5555'5555'e766'e564, 0x5555'5555'eb6a'e968, 0x5555'5555'ef6e'ed6c,
6224        0x5555'5555'f372'f170, 0x5555'5555'f776'f574, 0x5555'5555'fb7a'f978, 0x5555'5555'ff7e'fd7c});
6225 }
6226 
TEST_F(Riscv64InterpreterTest,TestVssseg2e32_vlmul1)6227 TEST_F(Riscv64InterpreterTest, TestVssseg2e32_vlmul1) {
6228   TestVsssegXeXX<UInt32, 2, 1>(0x2820e427,  // vssseg2e32.v v8, (x1), x2, v0.t
6229                                16,
6230                                {0x9312'9110'8302'8100,
6231                                 0x5555'5555'5555'5555,
6232                                 0x9716'9514'8706'8504,
6233                                 0x5555'5555'5555'5555,
6234                                 0x9b1a'9918'8b0a'8908,
6235                                 0x5555'5555'5555'5555,
6236                                 0x9f1e'9d1c'8f0e'8d0c});
6237 }
6238 
TEST_F(Riscv64InterpreterTest,TestVssseg2e32_vlmul2)6239 TEST_F(Riscv64InterpreterTest, TestVssseg2e32_vlmul2) {
6240   TestVsssegXeXX<UInt32, 2, 2>(0x2820e427,  // vssseg2e32.v v8, (x1), x2, v0.t
6241                                16,
6242                                {0xa322'a120'8302'8100,
6243                                 0x5555'5555'5555'5555,
6244                                 0xa726'a524'8706'8504,
6245                                 0x5555'5555'5555'5555,
6246                                 0xab2a'a928'8b0a'8908,
6247                                 0x5555'5555'5555'5555,
6248                                 0xaf2e'ad2c'8f0e'8d0c,
6249                                 0x5555'5555'5555'5555,
6250                                 0xb332'b130'9312'9110,
6251                                 0x5555'5555'5555'5555,
6252                                 0xb736'b534'9716'9514,
6253                                 0x5555'5555'5555'5555,
6254                                 0xbb3a'b938'9b1a'9918,
6255                                 0x5555'5555'5555'5555,
6256                                 0xbf3e'bd3c'9f1e'9d1c});
6257 }
6258 
TEST_F(Riscv64InterpreterTest,TestVssseg2e32_vlmul4)6259 TEST_F(Riscv64InterpreterTest, TestVssseg2e32_vlmul4) {
6260   TestVsssegXeXX<UInt32, 2, 4>(
6261       0x2820e427,  // vssseg2e32.v v8, (x1), x2, v0.t
6262       16,
6263       {0xc342'c140'8302'8100, 0x5555'5555'5555'5555, 0xc746'c544'8706'8504, 0x5555'5555'5555'5555,
6264        0xcb4a'c948'8b0a'8908, 0x5555'5555'5555'5555, 0xcf4e'cd4c'8f0e'8d0c, 0x5555'5555'5555'5555,
6265        0xd352'd150'9312'9110, 0x5555'5555'5555'5555, 0xd756'd554'9716'9514, 0x5555'5555'5555'5555,
6266        0xdb5a'd958'9b1a'9918, 0x5555'5555'5555'5555, 0xdf5e'dd5c'9f1e'9d1c, 0x5555'5555'5555'5555,
6267        0xe362'e160'a322'a120, 0x5555'5555'5555'5555, 0xe766'e564'a726'a524, 0x5555'5555'5555'5555,
6268        0xeb6a'e968'ab2a'a928, 0x5555'5555'5555'5555, 0xef6e'ed6c'af2e'ad2c, 0x5555'5555'5555'5555,
6269        0xf372'f170'b332'b130, 0x5555'5555'5555'5555, 0xf776'f574'b736'b534, 0x5555'5555'5555'5555,
6270        0xfb7a'f978'bb3a'b938, 0x5555'5555'5555'5555, 0xff7e'fd7c'bf3e'bd3c});
6271 }
6272 
TEST_F(Riscv64InterpreterTest,TestVssseg3e32_vlmul1)6273 TEST_F(Riscv64InterpreterTest, TestVssseg3e32_vlmul1) {
6274   TestVsssegXeXX<UInt32, 3, 1>(0x4820e427,  // vssseg3e32.v v8, (x1), x2, v0.t
6275                                16,
6276                                {0x9312'9110'8302'8100,
6277                                 0x5555'5555'a322'a120,
6278                                 0x9716'9514'8706'8504,
6279                                 0x5555'5555'a726'a524,
6280                                 0x9b1a'9918'8b0a'8908,
6281                                 0x5555'5555'ab2a'a928,
6282                                 0x9f1e'9d1c'8f0e'8d0c,
6283                                 0x5555'5555'af2e'ad2c});
6284 }
6285 
TEST_F(Riscv64InterpreterTest,TestVssseg3e32_vlmul2)6286 TEST_F(Riscv64InterpreterTest, TestVssseg3e32_vlmul2) {
6287   TestVsssegXeXX<UInt32, 3, 2>(0x4820e427,  // vssseg3e32.v v8, (x1), x2, v0.t
6288                                16,
6289                                {0xa322'a120'8302'8100,
6290                                 0x5555'5555'c342'c140,
6291                                 0xa726'a524'8706'8504,
6292                                 0x5555'5555'c746'c544,
6293                                 0xab2a'a928'8b0a'8908,
6294                                 0x5555'5555'cb4a'c948,
6295                                 0xaf2e'ad2c'8f0e'8d0c,
6296                                 0x5555'5555'cf4e'cd4c,
6297                                 0xb332'b130'9312'9110,
6298                                 0x5555'5555'd352'd150,
6299                                 0xb736'b534'9716'9514,
6300                                 0x5555'5555'd756'd554,
6301                                 0xbb3a'b938'9b1a'9918,
6302                                 0x5555'5555'db5a'd958,
6303                                 0xbf3e'bd3c'9f1e'9d1c,
6304                                 0x5555'5555'df5e'dd5c});
6305 }
6306 
TEST_F(Riscv64InterpreterTest,TestVssseg4e32_vlmul1)6307 TEST_F(Riscv64InterpreterTest, TestVssseg4e32_vlmul1) {
6308   TestVsssegXeXX<UInt32, 4, 1>(0x6820e427,  // vssseg4e32.v v8, (x1), x2, v0.t
6309                                16,
6310                                {0x9312'9110'8302'8100,
6311                                 0xb332'b130'a322'a120,
6312                                 0x9716'9514'8706'8504,
6313                                 0xb736'b534'a726'a524,
6314                                 0x9b1a'9918'8b0a'8908,
6315                                 0xbb3a'b938'ab2a'a928,
6316                                 0x9f1e'9d1c'8f0e'8d0c,
6317                                 0xbf3e'bd3c'af2e'ad2c});
6318 }
6319 
TEST_F(Riscv64InterpreterTest,TestVssseg4e32_vlmul2)6320 TEST_F(Riscv64InterpreterTest, TestVssseg4e32_vlmul2) {
6321   TestVsssegXeXX<UInt32, 4, 2>(0x6820e427,  // vssseg4e32.v v8, (x1), x2, v0.t
6322                                16,
6323                                {0xa322'a120'8302'8100,
6324                                 0xe362'e160'c342'c140,
6325                                 0xa726'a524'8706'8504,
6326                                 0xe766'e564'c746'c544,
6327                                 0xab2a'a928'8b0a'8908,
6328                                 0xeb6a'e968'cb4a'c948,
6329                                 0xaf2e'ad2c'8f0e'8d0c,
6330                                 0xef6e'ed6c'cf4e'cd4c,
6331                                 0xb332'b130'9312'9110,
6332                                 0xf372'f170'd352'd150,
6333                                 0xb736'b534'9716'9514,
6334                                 0xf776'f574'd756'd554,
6335                                 0xbb3a'b938'9b1a'9918,
6336                                 0xfb7a'f978'db5a'd958,
6337                                 0xbf3e'bd3c'9f1e'9d1c,
6338                                 0xff7e'fd7c'df5e'dd5c});
6339 }
6340 
TEST_F(Riscv64InterpreterTest,TestVssseg5e32)6341 TEST_F(Riscv64InterpreterTest, TestVssseg5e32) {
6342   TestVsssegXeXX<UInt32, 5, 1>(0x8820e427,  // vssseg5e32.v v8, (x1), x2, v0.t
6343                                32,
6344                                {0x9312'9110'8302'8100,
6345                                 0xb332'b130'a322'a120,
6346                                 0x5555'5555'c342'c140,
6347                                 0x5555'5555'5555'5555,
6348                                 0x9716'9514'8706'8504,
6349                                 0xb736'b534'a726'a524,
6350                                 0x5555'5555'c746'c544,
6351                                 0x5555'5555'5555'5555,
6352                                 0x9b1a'9918'8b0a'8908,
6353                                 0xbb3a'b938'ab2a'a928,
6354                                 0x5555'5555'cb4a'c948,
6355                                 0x5555'5555'5555'5555,
6356                                 0x9f1e'9d1c'8f0e'8d0c,
6357                                 0xbf3e'bd3c'af2e'ad2c,
6358                                 0x5555'5555'cf4e'cd4c});
6359 }
6360 
TEST_F(Riscv64InterpreterTest,TestVssseg6e32)6361 TEST_F(Riscv64InterpreterTest, TestVssseg6e32) {
6362   TestVsssegXeXX<UInt32, 6, 1>(0xa820e427,  // vssseg6e32.v v8, (x1), x2, v0.t
6363                                32,
6364                                {0x9312'9110'8302'8100,
6365                                 0xb332'b130'a322'a120,
6366                                 0xd352'd150'c342'c140,
6367                                 0x5555'5555'5555'5555,
6368                                 0x9716'9514'8706'8504,
6369                                 0xb736'b534'a726'a524,
6370                                 0xd756'd554'c746'c544,
6371                                 0x5555'5555'5555'5555,
6372                                 0x9b1a'9918'8b0a'8908,
6373                                 0xbb3a'b938'ab2a'a928,
6374                                 0xdb5a'd958'cb4a'c948,
6375                                 0x5555'5555'5555'5555,
6376                                 0x9f1e'9d1c'8f0e'8d0c,
6377                                 0xbf3e'bd3c'af2e'ad2c,
6378                                 0xdf5e'dd5c'cf4e'cd4c});
6379 }
6380 
TEST_F(Riscv64InterpreterTest,TestVssseg7e32)6381 TEST_F(Riscv64InterpreterTest, TestVssseg7e32) {
6382   TestVsssegXeXX<UInt32, 7, 1>(0xc820e427,  // vssseg7e32.v v8, (x1), x2, v0.t
6383                                32,
6384                                {0x9312'9110'8302'8100,
6385                                 0xb332'b130'a322'a120,
6386                                 0xd352'd150'c342'c140,
6387                                 0x5555'5555'e362'e160,
6388                                 0x9716'9514'8706'8504,
6389                                 0xb736'b534'a726'a524,
6390                                 0xd756'd554'c746'c544,
6391                                 0x5555'5555'e766'e564,
6392                                 0x9b1a'9918'8b0a'8908,
6393                                 0xbb3a'b938'ab2a'a928,
6394                                 0xdb5a'd958'cb4a'c948,
6395                                 0x5555'5555'eb6a'e968,
6396                                 0x9f1e'9d1c'8f0e'8d0c,
6397                                 0xbf3e'bd3c'af2e'ad2c,
6398                                 0xdf5e'dd5c'cf4e'cd4c,
6399                                 0x5555'5555'ef6e'ed6c});
6400 }
6401 
TEST_F(Riscv64InterpreterTest,TestVssseg8e32)6402 TEST_F(Riscv64InterpreterTest, TestVssseg8e32) {
6403   TestVsssegXeXX<UInt32, 8, 1>(0xe820e427,  // vssseg8e32.v v8, (x1), x2, v0.t
6404                                32,
6405                                {0x9312'9110'8302'8100,
6406                                 0xb332'b130'a322'a120,
6407                                 0xd352'd150'c342'c140,
6408                                 0xf372'f170'e362'e160,
6409                                 0x9716'9514'8706'8504,
6410                                 0xb736'b534'a726'a524,
6411                                 0xd756'd554'c746'c544,
6412                                 0xf776'f574'e766'e564,
6413                                 0x9b1a'9918'8b0a'8908,
6414                                 0xbb3a'b938'ab2a'a928,
6415                                 0xdb5a'd958'cb4a'c948,
6416                                 0xfb7a'f978'eb6a'e968,
6417                                 0x9f1e'9d1c'8f0e'8d0c,
6418                                 0xbf3e'bd3c'af2e'ad2c,
6419                                 0xdf5e'dd5c'cf4e'cd4c,
6420                                 0xff7e'fd7c'ef6e'ed6c});
6421 }
6422 
TEST_F(Riscv64InterpreterTest,TestVsse64_vlmul1)6423 TEST_F(Riscv64InterpreterTest, TestVsse64_vlmul1) {
6424   TestVsssegXeXX<UInt64, 1, 1>(0x820f427,  // vsse64.v v8, (x1), x2, v0.t
6425                                32,
6426                                {0x8706'8504'8302'8100,
6427                                 0x5555'5555'5555'5555,
6428                                 0x5555'5555'5555'5555,
6429                                 0x5555'5555'5555'5555,
6430                                 0x8f0e'8d0c'8b0a'8908});
6431 }
6432 
TEST_F(Riscv64InterpreterTest,TestVsse64_vlmul2)6433 TEST_F(Riscv64InterpreterTest, TestVsse64_vlmul2) {
6434   TestVsssegXeXX<UInt64, 1, 2>(0x820f427,  // vsse64.v v8, (x1), x2, v0.t
6435                                32,
6436                                {0x8706'8504'8302'8100,
6437                                 0x5555'5555'5555'5555,
6438                                 0x5555'5555'5555'5555,
6439                                 0x5555'5555'5555'5555,
6440                                 0x8f0e'8d0c'8b0a'8908,
6441                                 0x5555'5555'5555'5555,
6442                                 0x5555'5555'5555'5555,
6443                                 0x5555'5555'5555'5555,
6444                                 0x9716'9514'9312'9110,
6445                                 0x5555'5555'5555'5555,
6446                                 0x5555'5555'5555'5555,
6447                                 0x5555'5555'5555'5555,
6448                                 0x9f1e'9d1c'9b1a'9918});
6449 }
6450 
TEST_F(Riscv64InterpreterTest,TestVsse64_vlmul4)6451 TEST_F(Riscv64InterpreterTest, TestVsse64_vlmul4) {
6452   TestVsssegXeXX<UInt64, 1, 4>(
6453       0x820f427,  // vsse64.v v8, (x1), x2, v0.t
6454       32,
6455       {0x8706'8504'8302'8100, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555,
6456        0x8f0e'8d0c'8b0a'8908, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555,
6457        0x9716'9514'9312'9110, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555,
6458        0x9f1e'9d1c'9b1a'9918, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555,
6459        0xa726'a524'a322'a120, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555,
6460        0xaf2e'ad2c'ab2a'a928, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555,
6461        0xb736'b534'b332'b130, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555, 0x5555'5555'5555'5555,
6462        0xbf3e'bd3c'bb3a'b938});
6463 }
6464 
TEST_F(Riscv64InterpreterTest,TestVsse64_vlmul8)6465 TEST_F(Riscv64InterpreterTest, TestVsse64_vlmul8) {
6466   TestVsssegXeXX<UInt64, 1, 8>(
6467       0x820f427,  // vsse64.v v8, (x1), x2, v0.t
6468       16,
6469       {0x8706'8504'8302'8100, 0x5555'5555'5555'5555, 0x8f0e'8d0c'8b0a'8908, 0x5555'5555'5555'5555,
6470        0x9716'9514'9312'9110, 0x5555'5555'5555'5555, 0x9f1e'9d1c'9b1a'9918, 0x5555'5555'5555'5555,
6471        0xa726'a524'a322'a120, 0x5555'5555'5555'5555, 0xaf2e'ad2c'ab2a'a928, 0x5555'5555'5555'5555,
6472        0xb736'b534'b332'b130, 0x5555'5555'5555'5555, 0xbf3e'bd3c'bb3a'b938, 0x5555'5555'5555'5555,
6473        0xc746'c544'c342'c140, 0x5555'5555'5555'5555, 0xcf4e'cd4c'cb4a'c948, 0x5555'5555'5555'5555,
6474        0xd756'd554'd352'd150, 0x5555'5555'5555'5555, 0xdf5e'dd5c'db5a'd958, 0x5555'5555'5555'5555,
6475        0xe766'e564'e362'e160, 0x5555'5555'5555'5555, 0xef6e'ed6c'eb6a'e968, 0x5555'5555'5555'5555,
6476        0xf776'f574'f372'f170, 0x5555'5555'5555'5555, 0xff7e'fd7c'fb7a'f978});
6477 }
6478 
TEST_F(Riscv64InterpreterTest,TestVssseg2e64_vlmul1)6479 TEST_F(Riscv64InterpreterTest, TestVssseg2e64_vlmul1) {
6480   TestVsssegXeXX<UInt64, 2, 1>(0x2820f427,  // vssseg2e64.v v8, (x1), x2, v0.t
6481                                32,
6482                                {0x8706'8504'8302'8100,
6483                                 0x9716'9514'9312'9110,
6484                                 0x5555'5555'5555'5555,
6485                                 0x5555'5555'5555'5555,
6486                                 0x8f0e'8d0c'8b0a'8908,
6487                                 0x9f1e'9d1c'9b1a'9918});
6488 }
6489 
TEST_F(Riscv64InterpreterTest,TestVssseg2e64_vlmul2)6490 TEST_F(Riscv64InterpreterTest, TestVssseg2e64_vlmul2) {
6491   TestVsssegXeXX<UInt64, 2, 2>(0x2820f427,  // vssseg2e64.v v8, (x1), x2, v0.t
6492                                32,
6493                                {0x8706'8504'8302'8100,
6494                                 0xa726'a524'a322'a120,
6495                                 0x5555'5555'5555'5555,
6496                                 0x5555'5555'5555'5555,
6497                                 0x8f0e'8d0c'8b0a'8908,
6498                                 0xaf2e'ad2c'ab2a'a928,
6499                                 0x5555'5555'5555'5555,
6500                                 0x5555'5555'5555'5555,
6501                                 0x9716'9514'9312'9110,
6502                                 0xb736'b534'b332'b130,
6503                                 0x5555'5555'5555'5555,
6504                                 0x5555'5555'5555'5555,
6505                                 0x9f1e'9d1c'9b1a'9918,
6506                                 0xbf3e'bd3c'bb3a'b938});
6507 }
6508 
TEST_F(Riscv64InterpreterTest,TestVssseg2e64_vlmul4)6509 TEST_F(Riscv64InterpreterTest, TestVssseg2e64_vlmul4) {
6510   TestVsssegXeXX<UInt64, 2, 4>(0x2820f427,  // vssseg2e64.v v8, (x1), x2, v0.t
6511                                16,
6512                                {0x8706'8504'8302'8100,
6513                                 0xc746'c544'c342'c140,
6514                                 0x8f0e'8d0c'8b0a'8908,
6515                                 0xcf4e'cd4c'cb4a'c948,
6516                                 0x9716'9514'9312'9110,
6517                                 0xd756'd554'd352'd150,
6518                                 0x9f1e'9d1c'9b1a'9918,
6519                                 0xdf5e'dd5c'db5a'd958,
6520                                 0xa726'a524'a322'a120,
6521                                 0xe766'e564'e362'e160,
6522                                 0xaf2e'ad2c'ab2a'a928,
6523                                 0xef6e'ed6c'eb6a'e968,
6524                                 0xb736'b534'b332'b130,
6525                                 0xf776'f574'f372'f170,
6526                                 0xbf3e'bd3c'bb3a'b938,
6527                                 0xff7e'fd7c'fb7a'f978});
6528 }
6529 
TEST_F(Riscv64InterpreterTest,TestVssseg3e64_vlmul1)6530 TEST_F(Riscv64InterpreterTest, TestVssseg3e64_vlmul1) {
6531   TestVsssegXeXX<UInt64, 3, 1>(0x4820f427,  // vssseg3e64.v v8, (x1), x2, v0.t
6532                                32,
6533                                {0x8706'8504'8302'8100,
6534                                 0x9716'9514'9312'9110,
6535                                 0xa726'a524'a322'a120,
6536                                 0x5555'5555'5555'5555,
6537                                 0x8f0e'8d0c'8b0a'8908,
6538                                 0x9f1e'9d1c'9b1a'9918,
6539                                 0xaf2e'ad2c'ab2a'a928});
6540 }
6541 
TEST_F(Riscv64InterpreterTest,TestVssseg3e64_vlmul2)6542 TEST_F(Riscv64InterpreterTest, TestVssseg3e64_vlmul2) {
6543   TestVsssegXeXX<UInt64, 3, 2>(0x4820f427,  // vssseg3e64.v v8, (x1), x2, v0.t
6544                                32,
6545                                {0x8706'8504'8302'8100,
6546                                 0xa726'a524'a322'a120,
6547                                 0xc746'c544'c342'c140,
6548                                 0x5555'5555'5555'5555,
6549                                 0x8f0e'8d0c'8b0a'8908,
6550                                 0xaf2e'ad2c'ab2a'a928,
6551                                 0xcf4e'cd4c'cb4a'c948,
6552                                 0x5555'5555'5555'5555,
6553                                 0x9716'9514'9312'9110,
6554                                 0xb736'b534'b332'b130,
6555                                 0xd756'd554'd352'd150,
6556                                 0x5555'5555'5555'5555,
6557                                 0x9f1e'9d1c'9b1a'9918,
6558                                 0xbf3e'bd3c'bb3a'b938,
6559                                 0xdf5e'dd5c'db5a'd958});
6560 }
6561 
TEST_F(Riscv64InterpreterTest,TestVssseg4e64_vlmul1)6562 TEST_F(Riscv64InterpreterTest, TestVssseg4e64_vlmul1) {
6563   TestVsssegXeXX<UInt64, 4, 1>(0x6820f427,  // vssseg4e64.v v8, (x1), x2, v0.t
6564                                32,
6565                                {0x8706'8504'8302'8100,
6566                                 0x9716'9514'9312'9110,
6567                                 0xa726'a524'a322'a120,
6568                                 0xb736'b534'b332'b130,
6569                                 0x8f0e'8d0c'8b0a'8908,
6570                                 0x9f1e'9d1c'9b1a'9918,
6571                                 0xaf2e'ad2c'ab2a'a928,
6572                                 0xbf3e'bd3c'bb3a'b938});
6573 }
6574 
TEST_F(Riscv64InterpreterTest,TestVssseg4e64_vlmul2)6575 TEST_F(Riscv64InterpreterTest, TestVssseg4e64_vlmul2) {
6576   TestVsssegXeXX<UInt64, 4, 2>(0x6820f427,  // vssseg4e64.v v8, (x1), x2, v0.t
6577                                32,
6578                                {0x8706'8504'8302'8100,
6579                                 0xa726'a524'a322'a120,
6580                                 0xc746'c544'c342'c140,
6581                                 0xe766'e564'e362'e160,
6582                                 0x8f0e'8d0c'8b0a'8908,
6583                                 0xaf2e'ad2c'ab2a'a928,
6584                                 0xcf4e'cd4c'cb4a'c948,
6585                                 0xef6e'ed6c'eb6a'e968,
6586                                 0x9716'9514'9312'9110,
6587                                 0xb736'b534'b332'b130,
6588                                 0xd756'd554'd352'd150,
6589                                 0xf776'f574'f372'f170,
6590                                 0x9f1e'9d1c'9b1a'9918,
6591                                 0xbf3e'bd3c'bb3a'b938,
6592                                 0xdf5e'dd5c'db5a'd958,
6593                                 0xff7e'fd7c'fb7a'f978});
6594 }
6595 
TEST_F(Riscv64InterpreterTest,TestVssseg5e64)6596 TEST_F(Riscv64InterpreterTest, TestVssseg5e64) {
6597   TestVsssegXeXX<UInt64, 5, 1>(0x8820f427,  // vssseg5e64.v v8, (x1), x2, v0.t
6598                                64,
6599                                {0x8706'8504'8302'8100,
6600                                 0x9716'9514'9312'9110,
6601                                 0xa726'a524'a322'a120,
6602                                 0xb736'b534'b332'b130,
6603                                 0xc746'c544'c342'c140,
6604                                 0x5555'5555'5555'5555,
6605                                 0x5555'5555'5555'5555,
6606                                 0x5555'5555'5555'5555,
6607                                 0x8f0e'8d0c'8b0a'8908,
6608                                 0x9f1e'9d1c'9b1a'9918,
6609                                 0xaf2e'ad2c'ab2a'a928,
6610                                 0xbf3e'bd3c'bb3a'b938,
6611                                 0xcf4e'cd4c'cb4a'c948});
6612 }
6613 
TEST_F(Riscv64InterpreterTest,TestVssseg6e64)6614 TEST_F(Riscv64InterpreterTest, TestVssseg6e64) {
6615   TestVsssegXeXX<UInt64, 6, 1>(0xa820f427,  // vssseg6e64.v v8, (x1), x2, v0.t
6616                                64,
6617                                {0x8706'8504'8302'8100,
6618                                 0x9716'9514'9312'9110,
6619                                 0xa726'a524'a322'a120,
6620                                 0xb736'b534'b332'b130,
6621                                 0xc746'c544'c342'c140,
6622                                 0xd756'd554'd352'd150,
6623                                 0x5555'5555'5555'5555,
6624                                 0x5555'5555'5555'5555,
6625                                 0x8f0e'8d0c'8b0a'8908,
6626                                 0x9f1e'9d1c'9b1a'9918,
6627                                 0xaf2e'ad2c'ab2a'a928,
6628                                 0xbf3e'bd3c'bb3a'b938,
6629                                 0xcf4e'cd4c'cb4a'c948,
6630                                 0xdf5e'dd5c'db5a'd958});
6631 }
6632 
TEST_F(Riscv64InterpreterTest,TestVssseg7e64)6633 TEST_F(Riscv64InterpreterTest, TestVssseg7e64) {
6634   TestVsssegXeXX<UInt64, 7, 1>(0xc820f427,  // vssseg7e64.v v8, (x1), x2, v0.t
6635                                64,
6636                                {0x8706'8504'8302'8100,
6637                                 0x9716'9514'9312'9110,
6638                                 0xa726'a524'a322'a120,
6639                                 0xb736'b534'b332'b130,
6640                                 0xc746'c544'c342'c140,
6641                                 0xd756'd554'd352'd150,
6642                                 0xe766'e564'e362'e160,
6643                                 0x5555'5555'5555'5555,
6644                                 0x8f0e'8d0c'8b0a'8908,
6645                                 0x9f1e'9d1c'9b1a'9918,
6646                                 0xaf2e'ad2c'ab2a'a928,
6647                                 0xbf3e'bd3c'bb3a'b938,
6648                                 0xcf4e'cd4c'cb4a'c948,
6649                                 0xdf5e'dd5c'db5a'd958,
6650                                 0xef6e'ed6c'eb6a'e968});
6651 }
6652 
TEST_F(Riscv64InterpreterTest,TestVssseg8e64)6653 TEST_F(Riscv64InterpreterTest, TestVssseg8e64) {
6654   TestVsssegXeXX<UInt64, 8, 1>(0xe820f427,  // vssseg8e64.v v8, (x1), x2, v0.t
6655                                64,
6656                                {0x8706'8504'8302'8100,
6657                                 0x9716'9514'9312'9110,
6658                                 0xa726'a524'a322'a120,
6659                                 0xb736'b534'b332'b130,
6660                                 0xc746'c544'c342'c140,
6661                                 0xd756'd554'd352'd150,
6662                                 0xe766'e564'e362'e160,
6663                                 0xf776'f574'f372'f170,
6664                                 0x8f0e'8d0c'8b0a'8908,
6665                                 0x9f1e'9d1c'9b1a'9918,
6666                                 0xaf2e'ad2c'ab2a'a928,
6667                                 0xbf3e'bd3c'bb3a'b938,
6668                                 0xcf4e'cd4c'cb4a'c948,
6669                                 0xdf5e'dd5c'db5a'd958,
6670                                 0xef6e'ed6c'eb6a'e968,
6671                                 0xff7e'fd7c'fb7a'f978});
6672 }
6673 
TEST_F(Riscv64InterpreterTest,TestVsm)6674 TEST_F(Riscv64InterpreterTest, TestVsm) {
6675   TestVsm(0x2b08427,  // vsm.v v8, (x1)
6676           {0, 129, 2, 131, 4, 133, 6, 135, 8, 137, 10, 139, 12, 141, 14, 143});
6677 }
6678 
TEST_F(Riscv64InterpreterTest,TestVectorMaskInstructions)6679 TEST_F(Riscv64InterpreterTest, TestVectorMaskInstructions) {
6680   TestVectorMaskInstruction(128,
6681                             intrinsics::InactiveProcessing::kAgnostic,
6682                             0x630c2457,  // vmandn.mm v8, v16, v24
6683                             {0x8102'8504'8102'8100, 0x8102'8504'890a'8908});
6684   TestVectorMaskInstruction(128,
6685                             intrinsics::InactiveProcessing::kAgnostic,
6686                             0x670c2457,  // vmand.mm v8, v16, v24
6687                             {0x0604'0000'0200'0000, 0x0e0c'0808'0200'0000});
6688   TestVectorMaskInstruction(128,
6689                             intrinsics::InactiveProcessing::kAgnostic,
6690                             0x6b0c2457,  // vmor.mm v8, v16, v24
6691                             {0x8f0e'8f0d'8706'8300, 0x9f1e'9f1c'9f1e'9b19});
6692   TestVectorMaskInstruction(128,
6693                             intrinsics::InactiveProcessing::kAgnostic,
6694                             0x6f0c2457,  // vmxor.mm v8, v16, v24
6695                             {0x890a'8f0d'8506'8300, 0x9112'9714'9d1e'9b19});
6696   TestVectorMaskInstruction(128,
6697                             intrinsics::InactiveProcessing::kAgnostic,
6698                             0x730c2457,  // vmorn.mm v8, v16, v24
6699                             {0xf7f7'f5f6'fbfb'fdff, 0xefef'edef'ebeb'edee});
6700   TestVectorMaskInstruction(128,
6701                             intrinsics::InactiveProcessing::kAgnostic,
6702                             0x770c2457,  // vmnand.mm v8, v16, v24
6703                             {0xf9fb'ffff'fdff'ffff, 0xf1f3'f7f7'fdff'ffff});
6704   TestVectorMaskInstruction(128,
6705                             intrinsics::InactiveProcessing::kAgnostic,
6706                             0x7b0c2457,  // vmnor.mm v8, v16, v24
6707                             {0x70f1'70f2'78f9'7cff, 0x60e1'60e3'60e1'64e6});
6708   TestVectorMaskInstruction(128,
6709                             intrinsics::InactiveProcessing::kAgnostic,
6710                             0x7f0c2457,  // vmxnor.mm v8, v16, v24
6711                             {0x76f5'70f2'7af9'7cff, 0x6eed'68eb'62e1'64e6});
6712   TestVectorMaskInstruction(0,
6713                             intrinsics::InactiveProcessing::kAgnostic,
6714                             0x5300a457,  // vmsbf.m v8, v16
6715                             {0x0000'0000'0000'00ff, 0x0000'0000'0000'0000});
6716   TestVectorMaskInstruction(0,
6717                             intrinsics::InactiveProcessing::kAgnostic,
6718                             0x53012457,  // vmsof.m v8, v16
6719                             {0x0000'0000'0000'0100, 0x0000'0000'0000'0000});
6720   TestVectorMaskInstruction(0,
6721                             intrinsics::InactiveProcessing::kAgnostic,
6722                             0x5301a457,  // vmsif.m v8, v16
6723                             {0x0000'0000'0000'01ff, 0x0000'0000'0000'0000});
6724   TestVectorMaskInstruction(0,
6725                             intrinsics::InactiveProcessing::kAgnostic,
6726                             0x5100a457,  // vmsbf.m v8, v16, v0.t
6727                             {0xd5ad'd6b5'adff'ffff, 0x6af7'57bb'deed'7bb5});
6728   TestVectorMaskInstruction(0,
6729                             intrinsics::InactiveProcessing::kAgnostic,
6730                             0x51012457,  // vmsof.m v8, v16, v0.t
6731                             {0xd5ad'd6b5'af6b'b5ad, 0x6af7'57bb'deed'7bb5});
6732   TestVectorMaskInstruction(0,
6733                             intrinsics::InactiveProcessing::kAgnostic,
6734                             0x5101a457,  // vmsif.m v8, v16, v0.t
6735                             {0xd5ad'd6b5'afff'ffff, 0x6af7'57bb'deed'7bb5});
6736   TestVectorMaskInstruction(0,
6737                             intrinsics::InactiveProcessing::kUndisturbed,
6738                             0x5100a457,  // vmsbf.m v8, v16, v0.t
6739                             {0x5505'5415'05d5'5f57, 0x4055'5511'5445'5115});
6740   TestVectorMaskInstruction(0,
6741                             intrinsics::InactiveProcessing::kUndisturbed,
6742                             0x51012457,  // vmsof.m v8, v16, v0.t
6743                             {0x5505'5415'0741'1505, 0x4055'5511'5445'5115});
6744   TestVectorMaskInstruction(0,
6745                             intrinsics::InactiveProcessing::kUndisturbed,
6746                             0x5101a457,  // vmsif.m v8, v16, v0.t
6747                             {0x5505'5415'07d5'5f57, 0x4055'5511'5445'5115});
6748 }
6749 
TEST_F(Riscv64InterpreterTest,TestVmseq)6750 TEST_F(Riscv64InterpreterTest, TestVmseq) {
6751   TestVectorMaskTargetInstruction(0x610c0457,  // Vmseq.vv v8, v16, v24, v0.t
6752                                   {255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
6753                                   0x0000'0000'0000'00ff,
6754                                   0x0000'000f,
6755                                   0x0003,
6756                                   kVectorComparisonSource);
6757   TestVectorMaskTargetInstruction(0x6100c457,  // Vmseq.vx v8, v16, x1, v0.t
6758                                   {0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0},
6759                                   0x0000'0000'0f00'0000,
6760                                   0x0000'3000,
6761                                   0x0040,
6762                                   kVectorComparisonSource);
6763   TestVectorMaskTargetInstruction(0x610ab457,  // Vmseq.vi  v8, v16, -0xb, v0.t
6764                                   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0},
6765                                   0x0000'f000'0000'0000,
6766                                   0x0000'0000,
6767                                   0x0000,
6768                                   kVectorComparisonSource);
6769 }
6770 
TEST_F(Riscv64InterpreterTest,TestVmfne)6771 TEST_F(Riscv64InterpreterTest, TestVmfne) {
6772   TestVectorMaskTargetInstruction(0x710c1457,  // Vmfne.vv v8, v16, v24, v0.t
6773                                   0xffff'fff8,
6774                                   0xfffe,
6775                                   kVectorComparisonSource);
6776   TestVectorMaskTargetInstruction(0x7100d457,  // Vmfne.vf v8, v16, f1, v0.t
6777                                   0xffff'ffbf,
6778                                   0xffdf,
6779                                   kVectorComparisonSource);
6780 }
6781 
TEST_F(Riscv64InterpreterTest,TestVmsne)6782 TEST_F(Riscv64InterpreterTest, TestVmsne) {
6783   TestVectorMaskTargetInstruction(
6784       0x650c0457,  // Vmsne.vv v8, v16, v24, v0.t
6785       {0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
6786       0xffff'ffff'ffff'ff00,
6787       0xffff'fff0,
6788       0xfffc,
6789       kVectorComparisonSource);
6790   TestVectorMaskTargetInstruction(
6791       0x6500c457,  // Vmsne.vx v8, v16, x1, v0.t
6792       {255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255},
6793       0xffff'ffff'f0ff'ffff,
6794       0xffff'cfff,
6795       0xffbf,
6796       kVectorComparisonSource);
6797   TestVectorMaskTargetInstruction(
6798       0x650ab457,  // Vmsne.vi  v8, v16, -0xb, v0.t
6799       {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 170, 255, 255, 255, 255},
6800       0xffff'0fff'ffff'ffff,
6801       0xffff'ffff,
6802       0xffff,
6803       kVectorComparisonSource);
6804 }
6805 
TEST_F(Riscv64InterpreterTest,TestVmflt)6806 TEST_F(Riscv64InterpreterTest, TestVmflt) {
6807   TestVectorMaskTargetInstruction(0x6d0c1457,  // Vmflt.vv v8, v16, v24, v0.t
6808                                   0x0000'f000,
6809                                   0x00c0,
6810                                   kVectorComparisonSource);
6811   TestVectorMaskTargetInstruction(0x6d00d457,  // Vmflt.vf v8, v16, f1, v0.t
6812                                   0xff00'ff07,
6813                                   0xf0d1,
6814                                   kVectorComparisonSource);
6815 }
6816 
TEST_F(Riscv64InterpreterTest,TestVmsltu)6817 TEST_F(Riscv64InterpreterTest, TestVmsltu) {
6818   TestVectorMaskTargetInstruction(0x690c0457,  // Vmsltu.vv v8, v16, v24, v0.t
6819                                   {0, 0, 0, 3, 255, 255, 0, 255, 0, 0, 0, 0, 255, 255, 255, 255},
6820                                   0xffff'0000'f0ff'1000,
6821                                   0xff00'cf00,
6822                                   0xf0b0,
6823                                   kVectorComparisonSource);
6824   TestVectorMaskTargetInstruction(
6825       0x6900c457,  // Vmsltu.vx v8, v16, x1, v0.t
6826       {85, 15, 10, 11, 255, 255, 0, 255, 0, 0, 0, 0, 136, 136, 255, 255},
6827       0xffaa'0000'f0ff'3330,
6828       0xff00'cf54,
6829       0xf0b0,
6830       kVectorComparisonSource);
6831 }
6832 
TEST_F(Riscv64InterpreterTest,TestVmslt)6833 TEST_F(Riscv64InterpreterTest, TestVmslt) {
6834   TestVectorMaskTargetInstruction(0x6d0c0457,  // Vmslt.vv v8, v16, v24, v0.t
6835                                   {0, 0, 245, 247, 0, 32, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255},
6836                                   0xffff'0000'ff40'dc00,
6837                                   0xff00'f0a0,
6838                                   0xf0cc,
6839                                   kVectorComparisonSource);
6840   TestVectorMaskTargetInstruction(0x6d00c457,  // Vmslt.vx v8, v16, x1, v0.t
6841                                   {0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 136, 136, 255, 255},
6842                                   0xffaa'0000'0040'0000,
6843                                   0xff00'0000,
6844                                   0xf000,
6845                                   kVectorComparisonSource);
6846 }
6847 
TEST_F(Riscv64InterpreterTest,TestVmfle)6848 TEST_F(Riscv64InterpreterTest, TestVmfle) {
6849   TestVectorMaskTargetInstruction(0x650c1457,  // Vmfle.vv v8, v16, v24, v0.t
6850                                   0x0000'f007,
6851                                   0x00c1,
6852                                   kVectorComparisonSource);
6853   TestVectorMaskTargetInstruction(0x6500d457,  // Vmfle.vf v8, v16, f1, v0.t
6854                                   0xff00'ff47,
6855                                   0xf0f1,
6856                                   kVectorComparisonSource);
6857 }
6858 
TEST_F(Riscv64InterpreterTest,TestVmsleu)6859 TEST_F(Riscv64InterpreterTest, TestVmsleu) {
6860   TestVectorMaskTargetInstruction(
6861       0x710c0457,  // Vmsleu.vv v8, v16, v24, v0.t
6862       {255, 255, 0, 3, 255, 255, 0, 255, 0, 0, 0, 0, 255, 255, 255, 255},
6863       0xffff'0000'f0ff'10ff,
6864       0xff00'cf0f,
6865       0xf0b3,
6866       kVectorComparisonSource);
6867   TestVectorMaskTargetInstruction(
6868       0x7100c457,  // Vmsleu.vx v8, v16, x1, v0.t
6869       {85, 15, 10, 11, 255, 255, 255, 255, 0, 0, 0, 0, 136, 136, 255, 255},
6870       0xffaa'0000'ffff'3330,
6871       0xff00'ff54,
6872       0xf0f0,
6873       kVectorComparisonSource);
6874   TestVectorMaskTargetInstruction(
6875       0x710ab457,  // Vmsleu.vi  v8, v16, -0xb, v0.t
6876       {255, 15, 15, 15, 255, 255, 255, 255, 85, 0, 5, 85, 255, 255, 255, 255},
6877       0xffff'f30f'ffff'333f,
6878       0xffff'ff57,
6879       0xffff,
6880       kVectorComparisonSource);
6881 }
6882 
TEST_F(Riscv64InterpreterTest,TestVmsle)6883 TEST_F(Riscv64InterpreterTest, TestVmsle) {
6884   TestVectorMaskTargetInstruction(
6885       0x750c0457,  // Vmsle.vv v8, v16, v24, v0.t
6886       {255, 255, 245, 247, 0, 32, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255},
6887       0xffff'0000'ff40'dcff,
6888       0xff00'f0af,
6889       0xf0cf,
6890       kVectorComparisonSource);
6891   TestVectorMaskTargetInstruction(0x7500c457,  // Vmsle.vx v8, v16, x1, v0.t
6892                                   {0, 0, 0, 0, 0, 32, 255, 0, 0, 0, 0, 0, 136, 136, 255, 255},
6893                                   0xffaa'0000'0f40'0000,
6894                                   0xff00'3000,
6895                                   0xf040,
6896                                   kVectorComparisonSource);
6897   TestVectorMaskTargetInstruction(0x750ab457,  // Vmsle.vi  v8, v16, -0xb
6898                                   {170, 0, 5, 4, 0, 32, 255, 0, 85, 0, 5, 85, 255, 255, 255, 255},
6899                                   0xffff'f30f'0f40'000f,
6900                                   0xffff'3003,
6901                                   0xff4f,
6902                                   kVectorComparisonSource);
6903 }
6904 
TEST_F(Riscv64InterpreterTest,TestVmfgt)6905 TEST_F(Riscv64InterpreterTest, TestVmfgt) {
6906   TestVectorMaskTargetInstruction(0x7500d457,  // Vmfgt.vf v8, v16, f1, v0.t
6907                                   0x0000'0010,
6908                                   0x0000,
6909                                   kVectorComparisonSource);
6910 }
6911 
TEST_F(Riscv64InterpreterTest,TestVmsgtu)6912 TEST_F(Riscv64InterpreterTest, TestVmsgtu) {
6913   TestVectorMaskTargetInstruction(
6914       0x7900c457,  // Vmsgtu.vx v8, v16, x1, v0.t
6915       {170, 240, 245, 244, 0, 0, 0, 0, 255, 255, 255, 255, 119, 119, 0, 0},
6916       0x0055'ffff'0000'cccf,
6917       0x00ff'00ab,
6918       0x0f0f,
6919       kVectorComparisonSource);
6920   TestVectorMaskTargetInstruction(0x790ab457,  // Vmsgtu.vi  v8, v16, -0xb, v0.t
6921                                   {0, 240, 240, 240, 0, 0, 0, 0, 170, 255, 250, 170, 0, 0, 0, 0},
6922                                   0x0000'0cf0'0000'ccc0,
6923                                   0x0000'00a8,
6924                                   0x0000,
6925                                   kVectorComparisonSource);
6926 }
6927 
TEST_F(Riscv64InterpreterTest,TestVmsgt)6928 TEST_F(Riscv64InterpreterTest, TestVmsgt) {
6929   TestVectorMaskTargetInstruction(
6930       0x7d00c457,  // Vmsgt.vx v8, v16, x1, v0.t
6931       {255, 255, 255, 255, 255, 223, 0, 255, 255, 255, 255, 255, 119, 119, 0, 0},
6932       0x0055'ffff'f0bf'ffff,
6933       0x00ff'cfff,
6934       0x0fbf,
6935       kVectorComparisonSource);
6936   TestVectorMaskTargetInstruction(
6937       0x7d0ab457,  // Vmsgt.vi  v8, v16, -0xb, v0.t
6938       {85, 255, 250, 251, 255, 223, 0, 255, 170, 255, 250, 170, 0, 0, 0, 0},
6939       0x0000'0cf0'f0bf'fff0,
6940       0x0000'cffc,
6941       0x00b0,
6942       kVectorComparisonSource);
6943 }
6944 
TEST_F(Riscv64InterpreterTest,TestVmfge)6945 TEST_F(Riscv64InterpreterTest, TestVmfge) {
6946   TestVectorMaskTargetInstruction(0x7d00d457,  // Vmfge.vf v8, v16, f1, v0.t
6947                                   0x0000'0050,
6948                                   0x0020,
6949                                   kVectorComparisonSource);
6950 }
6951 
TEST_F(Riscv64InterpreterTest,TestVfmacc)6952 TEST_F(Riscv64InterpreterTest, TestVfmacc) {
6953   TestVectorFloatInstruction(0xb1881457,  // vfmacc.vv v8, v16, v24, v0.t
6954                              {{0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
6955                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
6956                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
6957                               {0x6a1f'cefd, 0x7629'21c4, 0x6232'9db4, 0x6e3c'70f9},
6958                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
6959                               {0x5555'5551, 0xd66b'bbc8, 0x5555'5555, 0x5555'5037},
6960                               {0xfaad'fde4, 0xff80'0000, 0xf2c2'c69a, 0xfecd'99e3},
6961                               {0xff80'0000, 0xff80'0000, 0xff80'0000, 0xff80'0000}},
6962                              {{0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6963                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6964                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6965                               {0x75b4'9040'f9f1'ea75, 0x6dcb'c6d1'12f0'a99b},
6966                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6967                               {0xd614'2330'4af7'4c90, 0x5555'5555'5555'5555},
6968                               {0xfff0'0000'0000'0000, 0xfe5b'5815'60f1'ac51},
6969                               {0xfff0'0000'0000'0000, 0xfff0'0000'0000'0000}},
6970                              kVectorCalculationsSource);
6971   TestVectorFloatInstruction(0xb100d457,  // vfmacc.vf v8, f1, v16, v0.t
6972                              {{0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
6973                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
6974                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
6975                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
6976                               {0x5555'5555, 0x5555'5555, 0x5555'550e, 0x5555'0ca1},
6977                               {0x550b'37bf, 0xd895'6354, 0xdc99'df27, 0xe09c'b3a3},
6978                               {0xe49f'8677, 0xe8a2'594a, 0xeca5'2c1d, 0xf0a7'fef0},
6979                               {0xf4aa'd1c3, 0xf8ad'a496, 0xfcb0'7768, 0xff80'0000}},
6980                              {{0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6981                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6982                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6983                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6984                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
6985                               {0xd780'0dff'a493'9082, 0xdf85'b3a5'4a3b'e0d2},
6986                               {0xe790'194a'efe1'8677, 0xef95'bef0'9587'2c1d},
6987                               {0xf7a0'2496'3b2c'd1c3, 0xffa5'ca3b'e0d2'7768}},
6988                              kVectorCalculationsSource);
6989 }
6990 
TEST_F(Riscv64InterpreterTest,TestVfnmacc)6991 TEST_F(Riscv64InterpreterTest, TestVfnmacc) {
6992   TestVectorFloatInstruction(0xb5881457,  // vfnmacc.vv v8, v16, v24, v0.t
6993                              {{0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
6994                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
6995                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
6996                               {0xea1f'cefd, 0xf629'21c4, 0xe232'9db4, 0xee3c'70f9},
6997                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
6998                               {0xd555'5551, 0x566b'bbc8, 0xd555'5555, 0xd555'5037},
6999                               {0x7aad'fde4, 0x7f80'0000, 0x72c2'c69a, 0x7ecd'99e3},
7000                               {0x7f80'0000, 0x7f80'0000, 0x7f80'0000, 0x7f80'0000}},
7001                              {{0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7002                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7003                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7004                               {0xf5b4'9040'f9f1'ea75, 0xedcb'c6d1'12f0'a99b},
7005                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7006                               {0x5614'2330'4af7'4c90, 0xd555'5555'5555'5555},
7007                               {0x7ff0'0000'0000'0000, 0x7e5b'5815'60f1'ac51},
7008                               {0x7ff0'0000'0000'0000, 0x7ff0'0000'0000'0000}},
7009                              kVectorCalculationsSource);
7010   TestVectorFloatInstruction(0xb500d457,  // vfnmacc.vf v8, f1, v16, v0.t
7011                              {{0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7012                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7013                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7014                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7015                               {0xd555'5555, 0xd555'5555, 0xd555'550e, 0xd555'0ca1},
7016                               {0xd50b'37bf, 0x5895'6354, 0x5c99'df27, 0x609c'b3a3},
7017                               {0x649f'8677, 0x68a2'594a, 0x6ca5'2c1d, 0x70a7'fef0},
7018                               {0x74aa'd1c3, 0x78ad'a496, 0x7cb0'7768, 0x7f80'0000}},
7019                              {{0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7020                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7021                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7022                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7023                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7024                               {0x5780'0dff'a493'9082, 0x5f85'b3a5'4a3b'e0d2},
7025                               {0x6790'194a'efe1'8677, 0x6f95'bef0'9587'2c1d},
7026                               {0x77a0'2496'3b2c'd1c3, 0x7fa5'ca3b'e0d2'7768}},
7027                              kVectorCalculationsSource);
7028 }
7029 
TEST_F(Riscv64InterpreterTest,TestVfwmacc)7030 TEST_F(Riscv64InterpreterTest, TestVfwmacc) {
7031   __m128i dst_result = {0x0000'0000'0000'0000, 0x0000'0000'0000'0000};
7032   TestWideningVectorFloatInstruction(0xf1881457,  // vfwmacc.vv v8, v16, v24, v0.t
7033                                      {{0x3330'e53c'6480'0000, 0x34b2'786b'bbc5'4900},
7034                                       {0x3234'1766'da4a'6200, 0x33b5'cab6'2d6c'4800},
7035                                       {0x3937'92ba'5bd0'8000, 0x3ab9'666a'779a'0d00},
7036                                       {0x383b'4565'd61f'6600, 0x39bd'3935'e5bd'8800},
7037                                       {0x3f3f'423b'5522'0000, 0x40c0'ab36'1ab7'e880},
7038                                       {0x3e41'bab3'e9fa'b500, 0x3fc2'd4dc'5007'e400},
7039                                       {0x4543'f9df'a83a'4000, 0x46c5'2438'7aa3'4a80},
7040                                       {0x4446'53b6'69e6'3700, 0x45c7'8e1f'2e31'8400}},
7041                                      kVectorCalculationsSource,
7042                                      dst_result);
7043   TestWideningVectorFloatInstruction(0xf100d457,  // vfwmacc.vf v8, f1, v16, v0.t
7044                                      {{0xb886'f0ad'0000'0000, 0xb907'a561'b400'0000},
7045                                       {0xb988'5a16'6800'0000, 0xba09'0ecb'1c00'0000},
7046                                       {0xba89'c37f'd000'0000, 0xbb0a'7834'8400'0000},
7047                                       {0xbb8b'2ce9'3800'0000, 0xbc0b'e19d'ec00'0000},
7048                                       {0xbc8c'9652'a000'0000, 0xbd0d'4b07'5400'0000},
7049                                       {0xbd8d'ffbc'0800'0000, 0xbe0e'b470'bc00'0000},
7050                                       {0xbe8f'6925'7000'0000, 0xbf10'0eed'1200'0000},
7051                                       {0xbf90'6947'6c00'0000, 0xc010'c3a1'c600'0000}},
7052                                      kVectorCalculationsSource,
7053                                      dst_result);
7054 
7055   dst_result = {0x401c'6666'6666'6666, 0x401c'6666'6666'6666};
7056   TestWideningVectorFloatInstruction(0xf1881457,  // vfwmacc.vv v8, v16, v24, v0.t
7057                                      {{0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7058                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7059                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7060                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7061                                       {0x401c'66e3'6f53'baee, 0x40c0'aec2'e784'b54d},
7062                                       {0x401c'6666'66f4'3c05, 0x401c'fd0d'48e6'a586},
7063                                       {0x4543'f9df'a83a'4000, 0x46c5'2438'7aa3'4a80},
7064                                       {0x4446'53b6'69e6'3700, 0x45c7'8e1f'2e31'8400}},
7065                                      kVectorCalculationsSource,
7066                                      dst_result);
7067   TestWideningVectorFloatInstruction(0xf100d457,  // vfwmacc.vf v8, f1, v16, v0.t
7068                                      {{0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7069                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7070                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7071                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7072                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6657},
7073                                       {0x401c'6666'6666'5766, 0x401c'6666'6657'0c2e},
7074                                       {0x401c'6666'56b1'd3ae, 0x401c'6656'5779'5466},
7075                                       {0x401c'55fd'1efa'6666, 0x4007'4589'40cc'cccc}},
7076                                      kVectorCalculationsSource,
7077                                      dst_result);
7078 }
7079 
TEST_F(Riscv64InterpreterTest,TestVfwnmacc)7080 TEST_F(Riscv64InterpreterTest, TestVfwnmacc) {
7081   __m128i dst_result = {0x0000'0000'0000'0000, 0x0000'0000'0000'0000};
7082   TestWideningVectorFloatInstruction(0xf5881457,  // vfwnmacc.vv v8, v16, v24, v0.t
7083                                      {{0xb330'e53c'6480'0000, 0xb4b2'786b'bbc5'4900},
7084                                       {0xb234'1766'da4a'6200, 0xb3b5'cab6'2d6c'4800},
7085                                       {0xb937'92ba'5bd0'8000, 0xbab9'666a'779a'0d00},
7086                                       {0xb83b'4565'd61f'6600, 0xb9bd'3935'e5bd'8800},
7087                                       {0xbf3f'423b'5522'0000, 0xc0c0'ab36'1ab7'e880},
7088                                       {0xbe41'bab3'e9fa'b500, 0xbfc2'd4dc'5007'e400},
7089                                       {0xc543'f9df'a83a'4000, 0xc6c5'2438'7aa3'4a80},
7090                                       {0xc446'53b6'69e6'3700, 0xc5c7'8e1f'2e31'8400}},
7091                                      kVectorCalculationsSource,
7092                                      dst_result);
7093   TestWideningVectorFloatInstruction(0xf500d457,  // vfwnmacc.vf v8, f1, v16, v0.t
7094                                      {{0x3886'f0ad'0000'0000, 0x3907'a561'b400'0000},
7095                                       {0x3988'5a16'6800'0000, 0x3a09'0ecb'1c00'0000},
7096                                       {0x3a89'c37f'd000'0000, 0x3b0a'7834'8400'0000},
7097                                       {0x3b8b'2ce9'3800'0000, 0x3c0b'e19d'ec00'0000},
7098                                       {0x3c8c'9652'a000'0000, 0x3d0d'4b07'5400'0000},
7099                                       {0x3d8d'ffbc'0800'0000, 0x3e0e'b470'bc00'0000},
7100                                       {0x3e8f'6925'7000'0000, 0x3f10'0eed'1200'0000},
7101                                       {0x3f90'6947'6c00'0000, 0x4010'c3a1'c600'0000}},
7102                                      kVectorCalculationsSource,
7103                                      dst_result);
7104 
7105   dst_result = {0x401c'6666'6666'6666, 0x401c'6666'6666'6666};
7106   TestWideningVectorFloatInstruction(0xf5881457,  // vfwnmacc.vv v8, v16, v24, v0.t
7107                                      {{0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7108                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7109                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7110                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7111                                       {0xc01c'66e3'6f53'baee, 0xc0c0'aec2'e784'b54d},
7112                                       {0xc01c'6666'66f4'3c05, 0xc01c'fd0d'48e6'a586},
7113                                       {0xc543'f9df'a83a'4000, 0xc6c5'2438'7aa3'4a80},
7114                                       {0xc446'53b6'69e6'3700, 0xc5c7'8e1f'2e31'8400}},
7115                                      kVectorCalculationsSource,
7116                                      dst_result);
7117   TestWideningVectorFloatInstruction(0xf500d457,  // vfwnmacc.vf v8, f1, v16, v0.t
7118                                      {{0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7119                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7120                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7121                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7122                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6657},
7123                                       {0xc01c'6666'6666'5766, 0xc01c'6666'6657'0c2e},
7124                                       {0xc01c'6666'56b1'd3ae, 0xc01c'6656'5779'5466},
7125                                       {0xc01c'55fd'1efa'6666, 0xc007'4589'40cc'cccc}},
7126                                      kVectorCalculationsSource,
7127                                      dst_result);
7128 }
7129 
TEST_F(Riscv64InterpreterTest,TestVfwmsac)7130 TEST_F(Riscv64InterpreterTest, TestVfwmsac) {
7131   __m128i dst_result = {0x0000'0000'0000'0000, 0x0000'0000'0000'0000};
7132   TestWideningVectorFloatInstruction(0xf9881457,  // vfwmsac.vv v8, v16, v24, v0.t
7133                                      {{0x3330'e53c'6480'0000, 0x34b2'786b'bbc5'4900},
7134                                       {0x3234'1766'da4a'6200, 0x33b5'cab6'2d6c'4800},
7135                                       {0x3937'92ba'5bd0'8000, 0x3ab9'666a'779a'0d00},
7136                                       {0x383b'4565'd61f'6600, 0x39bd'3935'e5bd'8800},
7137                                       {0x3f3f'423b'5522'0000, 0x40c0'ab36'1ab7'e880},
7138                                       {0x3e41'bab3'e9fa'b500, 0x3fc2'd4dc'5007'e400},
7139                                       {0x4543'f9df'a83a'4000, 0x46c5'2438'7aa3'4a80},
7140                                       {0x4446'53b6'69e6'3700, 0x45c7'8e1f'2e31'8400}},
7141                                      kVectorCalculationsSource,
7142                                      dst_result);
7143   TestWideningVectorFloatInstruction(0xf900d457,  // vfwmsac.vf v8, f1, v16, v0.t
7144                                      {{0xb886'f0ad'0000'0000, 0xb907'a561'b400'0000},
7145                                       {0xb988'5a16'6800'0000, 0xba09'0ecb'1c00'0000},
7146                                       {0xba89'c37f'd000'0000, 0xbb0a'7834'8400'0000},
7147                                       {0xbb8b'2ce9'3800'0000, 0xbc0b'e19d'ec00'0000},
7148                                       {0xbc8c'9652'a000'0000, 0xbd0d'4b07'5400'0000},
7149                                       {0xbd8d'ffbc'0800'0000, 0xbe0e'b470'bc00'0000},
7150                                       {0xbe8f'6925'7000'0000, 0xbf10'0eed'1200'0000},
7151                                       {0xbf90'6947'6c00'0000, 0xc010'c3a1'c600'0000}},
7152                                      kVectorCalculationsSource,
7153                                      dst_result);
7154 
7155   dst_result = {0x401c'6666'6666'6666, 0x401c'6666'6666'6666};
7156   TestWideningVectorFloatInstruction(0xf9881457,  // vfwmsac.vv v8, v16, v24, v0.t
7157                                      {{0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7158                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7159                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7160                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7161                                       {0xc01c'65e9'5d79'11de, 0x40c0'a7a9'4deb'1bb3},
7162                                       {0xc01c'6666'65d8'90c7, 0xc01b'cfbf'83e6'2746},
7163                                       {0x4543'f9df'a83a'4000, 0x46c5'2438'7aa3'4a80},
7164                                       {0x4446'53b6'69e6'3700, 0x45c7'8e1f'2e31'8400}},
7165                                      kVectorCalculationsSource,
7166                                      dst_result);
7167   TestWideningVectorFloatInstruction(0xf900d457,  // vfwmsac.vf v8, f1, v16, v0.t
7168                                      {{0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7169                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7170                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7171                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6666},
7172                                       {0xc01c'6666'6666'6666, 0xc01c'6666'6666'6675},
7173                                       {0xc01c'6666'6666'7566, 0xc01c'6666'6675'c09e},
7174                                       {0xc01c'6666'761a'f91e, 0xc01c'6676'7553'7866},
7175                                       {0xc01c'76cf'add2'6666, 0xc026'9504'1633'3333}},
7176                                      kVectorCalculationsSource,
7177                                      dst_result);
7178 }
7179 
TEST_F(Riscv64InterpreterTest,TestVfwnmsac)7180 TEST_F(Riscv64InterpreterTest, TestVfwnmsac) {
7181   __m128i dst_result = {0x0000'0000'0000'0000, 0x0000'0000'0000'0000};
7182   TestWideningVectorFloatInstruction(0xfd881457,  // vfwnmsac.vv v8, v16, v24, v0.t
7183                                      {{0xb330'e53c'6480'0000, 0xb4b2'786b'bbc5'4900},
7184                                       {0xb234'1766'da4a'6200, 0xb3b5'cab6'2d6c'4800},
7185                                       {0xb937'92ba'5bd0'8000, 0xbab9'666a'779a'0d00},
7186                                       {0xb83b'4565'd61f'6600, 0xb9bd'3935'e5bd'8800},
7187                                       {0xbf3f'423b'5522'0000, 0xc0c0'ab36'1ab7'e880},
7188                                       {0xbe41'bab3'e9fa'b500, 0xbfc2'd4dc'5007'e400},
7189                                       {0xc543'f9df'a83a'4000, 0xc6c5'2438'7aa3'4a80},
7190                                       {0xc446'53b6'69e6'3700, 0xc5c7'8e1f'2e31'8400}},
7191                                      kVectorCalculationsSource,
7192                                      dst_result);
7193   TestWideningVectorFloatInstruction(0xfd00d457,  // vfwnmsac.vf v8, f1, v16, v0.t
7194                                      {{0x3886'f0ad'0000'0000, 0x3907'a561'b400'0000},
7195                                       {0x3988'5a16'6800'0000, 0x3a09'0ecb'1c00'0000},
7196                                       {0x3a89'c37f'd000'0000, 0x3b0a'7834'8400'0000},
7197                                       {0x3b8b'2ce9'3800'0000, 0x3c0b'e19d'ec00'0000},
7198                                       {0x3c8c'9652'a000'0000, 0x3d0d'4b07'5400'0000},
7199                                       {0x3d8d'ffbc'0800'0000, 0x3e0e'b470'bc00'0000},
7200                                       {0x3e8f'6925'7000'0000, 0x3f10'0eed'1200'0000},
7201                                       {0x3f90'6947'6c00'0000, 0x4010'c3a1'c600'0000}},
7202                                      kVectorCalculationsSource,
7203                                      dst_result);
7204 
7205   dst_result = {0x401c'6666'6666'6666, 0x401c'6666'6666'6666};
7206   TestWideningVectorFloatInstruction(0xfd881457,  // vfwnmsac.vv v8, v16, v24, v0.t
7207                                      {{0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7208                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7209                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7210                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7211                                       {0x401c'65e9'5d79'11de, 0xc0c0'a7a9'4deb'1bb3},
7212                                       {0x401c'6666'65d8'90c7, 0x401b'cfbf'83e6'2746},
7213                                       {0xc543'f9df'a83a'4000, 0xc6c5'2438'7aa3'4a80},
7214                                       {0xc446'53b6'69e6'3700, 0xc5c7'8e1f'2e31'8400}},
7215                                      kVectorCalculationsSource,
7216                                      dst_result);
7217   TestWideningVectorFloatInstruction(0xfd00d457,  // vfwnmsac.vf v8, f1, v16, v0.t
7218                                      {{0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7219                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7220                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7221                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6666},
7222                                       {0x401c'6666'6666'6666, 0x401c'6666'6666'6675},
7223                                       {0x401c'6666'6666'7566, 0x401c'6666'6675'c09e},
7224                                       {0x401c'6666'761a'f91e, 0x401c'6676'7553'7866},
7225                                       {0x401c'76cf'add2'6666, 0x4026'9504'1633'3333}},
7226                                      kVectorCalculationsSource,
7227                                      dst_result);
7228 }
7229 
TEST_F(Riscv64InterpreterTest,TestVfmsac)7230 TEST_F(Riscv64InterpreterTest, TestVfmsac) {
7231   TestVectorFloatInstruction(0xb9881457,  // vfmsac.vv v8, v16, v24, v0.t
7232                              {{0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7233                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7234                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7235                               {0x6a1f'cefd, 0x7629'21c4, 0x6232'9db3, 0x6e3c'70f9},
7236                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7237                               {0xd555'5559, 0xd6ab'3339, 0xd555'5555, 0xd555'5a73},
7238                               {0xfaad'fde4, 0xff80'0000, 0xf2c2'c69a, 0xfecd'99e3},
7239                               {0xff80'0000, 0xff80'0000, 0xff80'0000, 0xff80'0000}},
7240                              {{0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7241                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7242                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7243                               {0x75b4'9040'f9f1'ea75, 0x6dcb'c6d1'12f0'a99b},
7244                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7245                               {0xd614'25da'f5a1'f73b, 0xd555'5555'5555'5555},
7246                               {0xfff0'0000'0000'0000, 0xfe5b'5815'60f1'ac51},
7247                               {0xfff0'0000'0000'0000, 0xfff0'0000'0000'0000}},
7248                              kVectorCalculationsSource);
7249   TestVectorFloatInstruction(0xb900d457,  // vfmsac.vf v8, f1, v16, v0.t
7250                              {{0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7251                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7252                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7253                               {0xd555'5555, 0xd555'5555, 0xd555'5555, 0xd555'5555},
7254                               {0xd555'5555, 0xd555'5555, 0xd555'559c, 0xd555'9e09},
7255                               {0xd58f'b976, 0xd898'b8aa, 0xdc99'e27d, 0xe09c'b3a6},
7256                               {0xe49f'8678, 0xe8a2'594a, 0xeca5'2c1d, 0xf0a7'fef0},
7257                               {0xf4aa'd1c3, 0xf8ad'a496, 0xfcb0'7768, 0xff80'0000}},
7258                              {{0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7259                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7260                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7261                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7262                               {0xd555'5555'5555'5555, 0xd555'5555'5555'5555},
7263                               {0xd780'0dff'a498'e5d7, 0xdf85'b3a5'4a3b'e0d2},
7264                               {0xe790'194a'efe1'8678, 0xef95'bef0'9587'2c1d},
7265                               {0xf7a0'2496'3b2c'd1c3, 0xffa5'ca3b'e0d2'7768}},
7266                              kVectorCalculationsSource);
7267 }
7268 
TEST_F(Riscv64InterpreterTest,TestVfnmsac)7269 TEST_F(Riscv64InterpreterTest, TestVfnmsac) {
7270   TestVectorFloatInstruction(0xbd881457,  // vfnmsac.vv v8, v16, v24, v0.t
7271                              {{0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
7272                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
7273                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
7274                               {0xea1f'cefd, 0xf629'21c4, 0xe232'9db3, 0xee3c'70f9},
7275                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
7276                               {0x5555'5559, 0x56ab'3339, 0x5555'5555, 0x5555'5a73},
7277                               {0x7aad'fde4, 0x7f80'0000, 0x72c2'c69a, 0x7ecd'99e3},
7278                               {0x7f80'0000, 0x7f80'0000, 0x7f80'0000, 0x7f80'0000}},
7279                              {{0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7280                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7281                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7282                               {0xf5b4'9040'f9f1'ea75, 0xedcb'c6d1'12f0'a99b},
7283                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7284                               {0x5614'25da'f5a1'f73b, 0x5555'5555'5555'5555},
7285                               {0x7ff0'0000'0000'0000, 0x7e5b'5815'60f1'ac51},
7286                               {0x7ff0'0000'0000'0000, 0x7ff0'0000'0000'0000}},
7287                              kVectorCalculationsSource);
7288   TestVectorFloatInstruction(0xbd00d457,  // vfnmsac.vf v8, f1, v16, v0.t
7289                              {{0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
7290                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
7291                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
7292                               {0x5555'5555, 0x5555'5555, 0x5555'5555, 0x5555'5555},
7293                               {0x5555'5555, 0x5555'5555, 0x5555'559c, 0x5555'9e09},
7294                               {0x558f'b976, 0x5898'b8aa, 0x5c99'e27d, 0x609c'b3a6},
7295                               {0x649f'8678, 0x68a2'594a, 0x6ca5'2c1d, 0x70a7'fef0},
7296                               {0x74aa'd1c3, 0x78ad'a496, 0x7cb0'7768, 0x7f80'0000}},
7297                              {{0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7298                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7299                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7300                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7301                               {0x5555'5555'5555'5555, 0x5555'5555'5555'5555},
7302                               {0x5780'0dff'a498'e5d7, 0x5f85'b3a5'4a3b'e0d2},
7303                               {0x6790'194a'efe1'8678, 0x6f95'bef0'9587'2c1d},
7304                               {0x77a0'2496'3b2c'd1c3, 0x7fa5'ca3b'e0d2'7768}},
7305                              kVectorCalculationsSource);
7306 }
7307 
TEST_F(Riscv64InterpreterTest,TestVfmadd)7308 TEST_F(Riscv64InterpreterTest, TestVfmadd) {
7309   TestVectorFloatInstruction(0xa1881457,  // vfmadd.vv v8, v16, v24, v0.t
7310                              {{0x98dd'a63a, 0x9e28'a06a, 0xa0e6'e462, 0xa4ed'95be},
7311                               {0xb624'b220, 0xbe2c'ba29, 0xb100'd4ec, 0xb504'308a},
7312                               {0xd644'd240, 0xde4c'da49, 0xc654'e5df, 0xce5c'ca7c},
7313                               {0xf664'f260, 0xfe6c'fa69, 0xe674'e271, 0xee7c'ea78},
7314                               {0xd922'4bb5, 0xdd25'a463, 0xe128'fd11, 0xe52c'55bf},
7315                               {0xe92f'ae6d, 0xed33'071b, 0xf136'5fc9, 0xf539'b877},
7316                               {0xf93d'1125, 0xfd40'69d3, 0xff80'0000, 0xff80'0000},
7317                               {0xff80'0000, 0xff80'0000, 0xff80'0000, 0xff80'0000}},
7318                              {{0x9e0c'9a09'9d86'3e2c, 0xa474'5e08'5cb1'b0b0},
7319                               {0xbe2c'ba29'b624'b220, 0xb484'68bd'bcbc'6610},
7320                               {0xde4c'da49'd644'd240, 0xce5c'ca58'c654'c251},
7321                               {0xfe6c'fa69'f664'f260, 0xee7c'ea78'e674'e271},
7322                               {0xdcae'5c5b'af03'ac55, 0xe4b4'88dd'dcdc'8630},
7323                               {0xecbe'71c6'6f19'1715, 0xf4c4'9393'3ce7'3b90},
7324                               {0xfcce'8731'2f2e'81d5, 0xfff0'0000'0000'0000},
7325                               {0xfff0'0000'0000'0000, 0xfff0'0000'0000'0000}},
7326 
7327                              kVectorCalculationsSource);
7328 
7329   TestVectorFloatInstruction(0xa100d457,  // vfmadd.vf v8, f1, v16, v0.t
7330                              {{0x5696'0000, 0x5696'0000, 0x5696'0000, 0x5696'0000},
7331                               {0x5696'0000, 0x5696'0000, 0x5696'0000, 0x5696'0000},
7332                               {0x5696'0000, 0x5696'0000, 0x5696'0000, 0x5696'0000},
7333                               {0x5696'0000, 0x5696'0000, 0x5696'0000, 0x5696'0000},
7334                               {0x5696'0000, 0x5696'0000, 0x5695'fffe, 0x5695'fe62},
7335                               {0x5694'5a5d, 0xd70b'd554, 0xdb5a'8e58, 0xdf5e'dd11},
7336                               {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
7337                               {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}},
7338                              {{0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7339                               {0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7340                               {0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7341                               {0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7342                               {0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7343                               {0xd756'd554'd2da'd150, 0xdf5e'dd5c'db5a'd958},
7344                               {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
7345                               {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}},
7346 
7347                              kVectorCalculationsSource);
7348 }
7349 
TEST_F(Riscv64InterpreterTest,TestVfnmadd)7350 TEST_F(Riscv64InterpreterTest, TestVfnmadd) {
7351   TestVectorFloatInstruction(0xa5881457,  // vfnmadd.vv v8, v16, v24, v0.t
7352                              {{0x18dd'a63a, 0x1e28'a06a, 0x20e6'e462, 0x24ed'95be},
7353                               {0x3624'b220, 0x3e2c'ba29, 0x3100'd4ec, 0x3504'308a},
7354                               {0x5644'd240, 0x5e4c'da49, 0x4654'e5df, 0x4e5c'ca7c},
7355                               {0x7664'f260, 0x7e6c'fa69, 0x6674'e271, 0x6e7c'ea78},
7356                               {0x5922'4bb5, 0x5d25'a463, 0x6128'fd11, 0x652c'55bf},
7357                               {0x692f'ae6d, 0x6d33'071b, 0x7136'5fc9, 0x7539'b877},
7358                               {0x793d'1125, 0x7d40'69d3, 0x7f80'0000, 0x7f80'0000},
7359                               {0x7f80'0000, 0x7f80'0000, 0x7f80'0000, 0x7f80'0000}},
7360                              {{0x1e0c'9a09'9d86'3e2c, 0x2474'5e08'5cb1'b0b0},
7361                               {0x3e2c'ba29'b624'b220, 0x3484'68bd'bcbc'6610},
7362                               {0x5e4c'da49'd644'd240, 0x4e5c'ca58'c654'c251},
7363                               {0x7e6c'fa69'f664'f260, 0x6e7c'ea78'e674'e271},
7364                               {0x5cae'5c5b'af03'ac55, 0x64b4'88dd'dcdc'8630},
7365                               {0x6cbe'71c6'6f19'1715, 0x74c4'9393'3ce7'3b90},
7366                               {0x7cce'8731'2f2e'81d5, 0x7ff0'0000'0000'0000},
7367                               {0x7ff0'0000'0000'0000, 0x7ff0'0000'0000'0000}},
7368                              kVectorCalculationsSource);
7369 
7370   TestVectorFloatInstruction(0xa500d457,  // vfmadd.vf v8, f1, v16, v0.t
7371                              {{0xd696'0000, 0xd696'0000, 0xd696'0000, 0xd696'0000},
7372                               {0xd696'0000, 0xd696'0000, 0xd696'0000, 0xd696'0000},
7373                               {0xd696'0000, 0xd696'0000, 0xd696'0000, 0xd696'0000},
7374                               {0xd696'0000, 0xd696'0000, 0xd696'0000, 0xd696'0000},
7375                               {0xd696'0000, 0xd696'0000, 0xd695'fffe, 0xd695'fe62},
7376                               {0xd694'5a5d, 0x570b'd554, 0x5b5a'8e58, 0x5f5e'dd11},
7377                               {0x6362'e160, 0x6766'e564, 0x6b6a'e968, 0x6f6e'ed6c},
7378                               {0x7372'f170, 0x7776'f574, 0x7b7a'f978, 0x7f7e'fd7c}},
7379                              {{0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7380                               {0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7381                               {0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7382                               {0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7383                               {0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7384                               {0x5756'd554'd2da'd150, 0x5f5e'dd5c'db5a'd958},
7385                               {0x6766'e564'e362'e160, 0x6f6e'ed6c'eb6a'e968},
7386                               {0x7776'f574'f372'f170, 0x7f7e'fd7c'fb7a'f978}},
7387                              kVectorCalculationsSource);
7388 }
7389 
TEST_F(Riscv64InterpreterTest,TestVfmsub)7390 TEST_F(Riscv64InterpreterTest, TestVfmsub) {
7391   TestVectorFloatInstruction(0xa9881457,  // vfmsub.vv v8, v16, v24, v0.t
7392                              {{0x98d5'5d1a, 0x1de1'2750, 0xa0e6'e462, 0xa4ed'95be},
7393                               {0x3624'b220, 0x3e2c'ba29, 0xb100'd4e6, 0xb504'2aa4},
7394                               {0x5644'd240, 0x5e4c'da49, 0x4654'9ec3, 0x4e5c'ca34},
7395                               {0x7664'f260, 0x7e6c'fa69, 0x6674'e271, 0x6e7c'ea78},
7396                               {0xd922'4bb5, 0xdd25'a463, 0xe128'fd11, 0xe52c'55bf},
7397                               {0xe92f'ae6d, 0xed33'071b, 0xf136'5fc9, 0xf539'b877},
7398                               {0xf93d'1125, 0xfd40'69d3, 0xff80'0000, 0xff80'0000},
7399                               {0xff80'0000, 0xff80'0000, 0xff80'0000, 0xff80'0000}},
7400                              {{0x1e0c'9a09'8e82'e5d4, 0xa474'5e08'5cb1'b0b0},
7401                               {0x3e2c'ba29'b624'b220, 0xb484'68bd'bcbc'6610},
7402                               {0x5e4c'da49'd644'd240, 0x4e5c'ca58'c654'c251},
7403                               {0x7e6c'fa69'f664'f260, 0x6e7c'ea78'e674'e271},
7404                               {0xdcae'5c5b'af03'ac55, 0xe4b4'88dd'dcdc'8630},
7405                               {0xecbe'71c6'6f19'1715, 0xf4c4'9393'3ce7'3b90},
7406                               {0xfcce'8731'2f2e'81d5, 0xfff0'0000'0000'0000},
7407                               {0xfff0'0000'0000'0000, 0xfff0'0000'0000'0000}},
7408                              kVectorCalculationsSource);
7409 
7410   TestVectorFloatInstruction(0xa900d457,  // vfmsub.vf v8, f1, v16, v0.t
7411                              {{0x5696'0000, 0x5696'0000, 0x5696'0000, 0x5696'0000},
7412                               {0x5696'0000, 0x5696'0000, 0x5696'0000, 0x5696'0000},
7413                               {0x5696'0000, 0x5696'0000, 0x5696'0000, 0x5696'0000},
7414                               {0x5696'0000, 0x5696'0000, 0x5696'0000, 0x5696'0000},
7415                               {0x5696'0000, 0x5696'0000, 0x5696'0001, 0x5696'019d},
7416                               {0x5697'a5a2, 0x5790'eaaa, 0x5b5b'2458, 0x5f5e'dda7},
7417                               {0x6362'e160, 0x6766'e564, 0x6b6a'e968, 0x6f6e'ed6c},
7418                               {0x7372'f170, 0x7776'f574, 0x7b7a'f978, 0x7f7e'fd7c}},
7419                              {{0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7420                               {0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7421                               {0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7422                               {0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7423                               {0x557e'0000'0000'0000, 0x557e'0000'0000'0000},
7424                               {0x5756'd554'd3ca'd150, 0x5f5e'dd5c'db5a'd958},
7425                               {0x6766'e564'e362'e160, 0x6f6e'ed6c'eb6a'e968},
7426                               {0x7776'f574'f372'f170, 0x7f7e'fd7c'fb7a'f978}},
7427                              kVectorCalculationsSource);
7428 }
7429 
TEST_F(Riscv64InterpreterTest,TestVfnmsub)7430 TEST_F(Riscv64InterpreterTest, TestVfnmsub) {
7431   TestVectorFloatInstruction(0xad881457,  // vfnmsub.vv v8, v16, v24, v0.t
7432                              {{0x18d5'5d1a, 0x9de1'2750, 0x20e6'e462, 0x24ed'95be},
7433                               {0xb624'b220, 0xbe2c'ba29, 0x3100'd4e6, 0x3504'2aa4},
7434                               {0xd644'd240, 0xde4c'da49, 0xc654'9ec3, 0xce5c'ca34},
7435                               {0xf664'f260, 0xfe6c'fa69, 0xe674'e271, 0xee7c'ea78},
7436                               {0x5922'4bb5, 0x5d25'a463, 0x6128'fd11, 0x652c'55bf},
7437                               {0x692f'ae6d, 0x6d33'071b, 0x7136'5fc9, 0x7539'b877},
7438                               {0x793d'1125, 0x7d40'69d3, 0x7f80'0000, 0x7f80'0000},
7439                               {0x7f80'0000, 0x7f80'0000, 0x7f80'0000, 0x7f80'0000}},
7440                              {{0x9e0c'9a09'8e82'e5d4, 0x2474'5e08'5cb1'b0b0},
7441                               {0xbe2c'ba29'b624'b220, 0x3484'68bd'bcbc'6610},
7442                               {0xde4c'da49'd644'd240, 0xce5c'ca58'c654'c251},
7443                               {0xfe6c'fa69'f664'f260, 0xee7c'ea78'e674'e271},
7444                               {0x5cae'5c5b'af03'ac55, 0x64b4'88dd'dcdc'8630},
7445                               {0x6cbe'71c6'6f19'1715, 0x74c4'9393'3ce7'3b90},
7446                               {0x7cce'8731'2f2e'81d5, 0x7ff0'0000'0000'0000},
7447                               {0x7ff0'0000'0000'0000, 0x7ff0'0000'0000'0000}},
7448                              kVectorCalculationsSource);
7449 
7450   TestVectorFloatInstruction(0xad00d457,  // vfnmsub.vf v8, f1, v16, v0.t
7451                              {{0xd696'0000, 0xd696'0000, 0xd696'0000, 0xd696'0000},
7452                               {0xd696'0000, 0xd696'0000, 0xd696'0000, 0xd696'0000},
7453                               {0xd696'0000, 0xd696'0000, 0xd696'0000, 0xd696'0000},
7454                               {0xd696'0000, 0xd696'0000, 0xd696'0000, 0xd696'0000},
7455                               {0xd696'0000, 0xd696'0000, 0xd696'0001, 0xd696'019d},
7456                               {0xd697'a5a2, 0xd790'eaaa, 0xdb5b'2458, 0xdf5e'dda7},
7457                               {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
7458                               {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}},
7459                              {{0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7460                               {0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7461                               {0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7462                               {0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7463                               {0xd57e'0000'0000'0000, 0xd57e'0000'0000'0000},
7464                               {0xd756'd554'd3ca'd150, 0xdf5e'dd5c'db5a'd958},
7465                               {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
7466                               {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}},
7467                              kVectorCalculationsSource);
7468 }
7469 
TEST_F(Riscv64InterpreterTest,TestVbrev8)7470 TEST_F(Riscv64InterpreterTest, TestVbrev8) {
7471   TestVectorInstruction(
7472       0x49842457,  // vbrev8.v v8, v24, v0.t
7473       {{160, 15, 160, 15, 160, 15, 160, 15, 2, 2, 2, 2, 255, 255, 255, 255},
7474        {136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136},
7475        {143, 255, 143, 255, 143, 255, 143, 255, 143, 255, 143, 255, 143, 255, 143, 255},
7476        {6, 70, 38, 102, 150, 86, 54, 118, 142, 78, 46, 110, 30, 94, 62, 126},
7477        {1, 65, 33, 97, 145, 81, 49, 113, 137, 73, 41, 105, 25, 89, 57, 121},
7478        {5, 69, 37, 101, 149, 85, 53, 117, 141, 77, 45, 109, 29, 93, 61, 125},
7479        {3, 67, 35, 99, 147, 83, 51, 115, 139, 75, 43, 107, 27, 91, 59, 123},
7480        {7, 71, 39, 103, 151, 87, 55, 119, 143, 79, 47, 111, 31, 95, 63, 127}},
7481       {{0x0fa0, 0x0fa0, 0x0fa0, 0x0fa0, 0x0202, 0x0202, 0xffff, 0xffff},
7482        {0x8888, 0x8888, 0x8888, 0x8888, 0x8888, 0x8888, 0x8888, 0x8888},
7483        {0xff8f, 0xff8f, 0xff8f, 0xff8f, 0xff8f, 0xff8f, 0xff8f, 0xff8f},
7484        {0x4606, 0x6626, 0x5696, 0x7636, 0x4e8e, 0x6e2e, 0x5e1e, 0x7e3e},
7485        {0x4101, 0x6121, 0x5191, 0x7131, 0x4989, 0x6929, 0x5919, 0x7939},
7486        {0x4505, 0x6525, 0x5595, 0x7535, 0x4d8d, 0x6d2d, 0x5d1d, 0x7d3d},
7487        {0x4303, 0x6323, 0x5393, 0x7333, 0x4b8b, 0x6b2b, 0x5b1b, 0x7b3b},
7488        {0x4707, 0x6727, 0x5797, 0x7737, 0x4f8f, 0x6f2f, 0x5f1f, 0x7f3f}},
7489       {{0x0fa0'0fa0, 0x0fa0'0fa0, 0x0202'0202, 0xffff'ffff},
7490        {0x8888'8888, 0x8888'8888, 0x8888'8888, 0x8888'8888},
7491        {0xff8f'ff8f, 0xff8f'ff8f, 0xff8f'ff8f, 0xff8f'ff8f},
7492        {0x6626'4606, 0x7636'5696, 0x6e2e'4e8e, 0x7e3e'5e1e},
7493        {0x6121'4101, 0x7131'5191, 0x6929'4989, 0x7939'5919},
7494        {0x6525'4505, 0x7535'5595, 0x6d2d'4d8d, 0x7d3d'5d1d},
7495        {0x6323'4303, 0x7333'5393, 0x6b2b'4b8b, 0x7b3b'5b1b},
7496        {0x6727'4707, 0x7737'5797, 0x6f2f'4f8f, 0x7f3f'5f1f}},
7497       {{0x0fa0'0fa0'0fa0'0fa0, 0xffff'ffff'0202'0202},
7498        {0x8888'8888'8888'8888, 0x8888'8888'8888'8888},
7499        {0xff8f'ff8f'ff8f'ff8f, 0xff8f'ff8f'ff8f'ff8f},
7500        {0x7636'5696'6626'4606, 0x7e3e'5e1e'6e2e'4e8e},
7501        {0x7131'5191'6121'4101, 0x7939'5919'6929'4989},
7502        {0x7535'5595'6525'4505, 0x7d3d'5d1d'6d2d'4d8d},
7503        {0x7333'5393'6323'4303, 0x7b3b'5b1b'6b2b'4b8b},
7504        {0x7737'5797'6727'4707, 0x7f3f'5f1f'6f2f'4f8f}},
7505       kVectorComparisonSource);
7506 }
7507 
TEST_F(Riscv64InterpreterTest,TestVfmin)7508 TEST_F(Riscv64InterpreterTest, TestVfmin) {
7509   TestVectorFloatInstruction(0x1100d457,  // vfmin.vf v8, v16, f1, v0.t
7510                              {{0xf005'f005, 0xf005'f005, 0x4040'4040, 0x40b4'0000},
7511                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7512                               {0x4016'4016, 0x4016'4016, 0x0000'0000, 0x4016'8000},
7513                               {0xaaaa'aaaa, 0xaaaa'aaaa, 0x1111'1111, 0x1111'1111},
7514                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7515                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7516                               {0xa9bb'bbbb, 0xa9bb'bbbb, 0xa9bb'bbbb, 0xa9bb'bbbb},
7517                               {0xa9a9'a9a9, 0xa9a9'a9a9, 0xa9a9'a9a9, 0xa9a9'a9a9}},
7518                              {{0xf005'f005'f005'f005, 0x4016'8000'0000'0000},
7519                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7520                               {0x4016'4016'4016'4016, 0x4016'8000'0000'0000},
7521                               {0xaaaa'aaaa'aaaa'aaaa, 0x1111'1111'1111'1111},
7522                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7523                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7524                               {0xa9bb'bbbb'a9bb'bbbb, 0xa9bb'bbbb'a9bb'bbbb},
7525                               {0xa9a9'a9a9'a9a9'a9a9, 0xa9a9'a9a9'a9a9'a9a9}},
7526                              kVectorComparisonSource);
7527   TestVectorFloatInstruction(0x110c1457,  // vfmin.vv v8,v16,v24,v0.t
7528                              {{0xf005'f005, 0xf005'f005, 0x4040'4040, 0x7fc0'0000},
7529                               {0x1111'1111, 0x1111'1111, 0x1111'1111, 0x1111'1111},
7530                               {0x4016'4016, 0x4016'4016, 0x0000'0000, 0x4016'8000},
7531                               {0xaaaa'aaaa, 0xaaaa'aaaa, 0x1111'1111, 0x1111'1111},
7532                               {0x8684'8280, 0x8e8c'8a89, 0x9694'9291, 0x9e9c'9a98},
7533                               {0xa6a4'a2a0, 0xaeac'aaa9, 0xb6b4'b2b1, 0xbebc'bab8},
7534                               {0xc6c4'c2c0, 0xcecc'cac9, 0xd6d4'd2d1, 0xdedc'dad8},
7535                               {0xe6e4'e2e0, 0xeeec'eae9, 0xf6f4'f2f1, 0xfefc'faf8}},
7536                              {{0xf005'f005'f005'f005, 0x7ff8'0000'0000'0000},
7537                               {0x1111'1111'1111'1111, 0x1111'1111'1111'1111},
7538                               {0x4016'4016'4016'4016, 0x4016'8000'0000'0000},
7539                               {0xaaaa'aaaa'aaaa'aaaa, 0x1111'1111'1111'1111},
7540                               {0x8e8c'8a89'8684'8280, 0x9e9c'9a98'9694'9291},
7541                               {0xaeac'aaa9'a6a4'a2a0, 0xbebc'bab8'b6b4'b2b1},
7542                               {0xcecc'cac9'c6c4'c2c0, 0xdedc'dad8'd6d4'd2d1},
7543                               {0xeeec'eae9'e6e4'e2e0, 0xfefc'faf8'f6f4'f2f1}},
7544                              kVectorComparisonSource);
7545 }
7546 
TEST_F(Riscv64InterpreterTest,TestVfmax)7547 TEST_F(Riscv64InterpreterTest, TestVfmax) {
7548   TestVectorFloatInstruction(0x1900d457,  // vfmax.vf v8, v16, f1, v0.t
7549                              {{0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7550                               {0x40b4'40b4, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7551                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7552                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7553                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7554                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7555                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7556                               {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000}},
7557                              {{0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7558                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7559                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7560                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7561                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7562                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7563                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7564                               {0x4016'8000'0000'0000, 0x4016'8000'0000'0000}},
7565                              kVectorComparisonSource);
7566   TestVectorFloatInstruction(0x190c1457,  // vfmax.vv v8,v16,v24,v0.t
7567                              {{0xf005'f005, 0xf005'f005, 0x4040'4040, 0x7fc0'0000},
7568                               {0x40b4'40b4, 0x1111'1111, 0x40b4'0000, 0x1111'1111},
7569                               {0x4016'4016, 0x4016'4016, 0x0000'0000, 0x4016'8000},
7570                               {0x6664'6260, 0x6e6c'6a69, 0x7674'7271, 0x7e7c'7a78},
7571                               {0x8684'8280, 0x8e8c'8a89, 0x9694'9291, 0x9e9c'9a98},
7572                               {0xa6a4'a2a0, 0xaeac'aaa9, 0xb6b4'b2b1, 0xbebc'bab8},
7573                               {0xa9bb'bbbb, 0xa9bb'bbbb, 0xa9bb'bbbb, 0xa9bb'bbbb},
7574                               {0xa9a9'a9a9, 0xa9a9'a9a9, 0xa9a9'a9a9, 0xa9a9'a9a9}},
7575                              {{0xf005'f005'f005'f005, 0x7ff8'0000'0000'0000},
7576                               {0x1111'1111'1111'1111, 0x1111'1111'1111'1111},
7577                               {0x4016'4016'4016'4016, 0x4016'8000'0000'0000},
7578                               {0x6e6c'6a69'6664'6260, 0x7e7c'7a78'7674'7271},
7579                               {0x8e8c'8a89'8684'8280, 0x9e9c'9a98'9694'9291},
7580                               {0xaeac'aaa9'a6a4'a2a0, 0xbebc'bab8'b6b4'b2b1},
7581                               {0xa9bb'bbbb'a9bb'bbbb, 0xa9bb'bbbb'a9bb'bbbb},
7582                               {0xa9a9'a9a9'a9a9'a9a9, 0xa9a9'a9a9'a9a9'a9a9}},
7583                              kVectorComparisonSource);
7584 }
7585 
TEST_F(Riscv64InterpreterTest,TestVfsgnj)7586 TEST_F(Riscv64InterpreterTest, TestVfsgnj) {
7587   TestVectorFloatInstruction(0x210c1457,  // vfsgnj.vv v8, v16, v24, v0.t
7588                              {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c},
7589                               {0x9312'9110, 0x9716'9514, 0x9b1a'9918, 0x9f1e'9d1c},
7590                               {0xa322'a120, 0xa726'a524, 0xab2a'a928, 0xaf2e'ad2c},
7591                               {0xb332'b130, 0xb736'b534, 0xbb3a'b938, 0xbf3e'bd3c},
7592                               {0x4342'c140, 0x4746'c544, 0x4b4a'c948, 0x4f4e'cd4c},
7593                               {0x5352'd150, 0x5756'd554, 0x5b5a'd958, 0x5f5e'dd5c},
7594                               {0x6362'e160, 0x6766'e564, 0x6b6a'e968, 0x6f6e'ed6c},
7595                               {0x7372'f170, 0x7776'f574, 0x7b7a'f978, 0x7f7e'fd7c}},
7596                              {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
7597                               {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
7598                               {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
7599                               {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938},
7600                               {0x4746'c544'c342'c140, 0x4f4e'cd4c'cb4a'c948},
7601                               {0x5756'd554'd352'd150, 0x5f5e'dd5c'db5a'd958},
7602                               {0x6766'e564'e362'e160, 0x6f6e'ed6c'eb6a'e968},
7603                               {0x7776'f574'f372'f170, 0x7f7e'fd7c'fb7a'f978}},
7604                              kVectorCalculationsSource);
7605   TestVectorFloatInstruction(0x2100d457,  // vfsgnj.vf v8, v16, f1, v0.t
7606                              {{0x0302'8100, 0x0706'8504, 0x0b0a'8908, 0x0f0e'8d0c},
7607                               {0x1312'9110, 0x1716'9514, 0x1b1a'9918, 0x1f1e'9d1c},
7608                               {0x2322'a120, 0x2726'a524, 0x2b2a'a928, 0x2f2e'ad2c},
7609                               {0x3332'b130, 0x3736'b534, 0x3b3a'b938, 0x3f3e'bd3c},
7610                               {0x4342'c140, 0x4746'c544, 0x4b4a'c948, 0x4f4e'cd4c},
7611                               {0x5352'd150, 0x5756'd554, 0x5b5a'd958, 0x5f5e'dd5c},
7612                               {0x6362'e160, 0x6766'e564, 0x6b6a'e968, 0x6f6e'ed6c},
7613                               {0x7372'f170, 0x7776'f574, 0x7b7a'f978, 0x7f7e'fd7c}},
7614                              {{0x0706'8504'8302'8100, 0x0f0e'8d0c'8b0a'8908},
7615                               {0x1716'9514'9312'9110, 0x1f1e'9d1c'9b1a'9918},
7616                               {0x2726'a524'a322'a120, 0x2f2e'ad2c'ab2a'a928},
7617                               {0x3736'b534'b332'b130, 0x3f3e'bd3c'bb3a'b938},
7618                               {0x4746'c544'c342'c140, 0x4f4e'cd4c'cb4a'c948},
7619                               {0x5756'd554'd352'd150, 0x5f5e'dd5c'db5a'd958},
7620                               {0x6766'e564'e362'e160, 0x6f6e'ed6c'eb6a'e968},
7621                               {0x7776'f574'f372'f170, 0x7f7e'fd7c'fb7a'f978}},
7622                              kVectorCalculationsSource);
7623   TestVectorFloatInstruction(0x250c1457,  // vfsgnjn.vv v8, v16, v24, v0.t
7624                              {{0x0302'8100, 0x0706'8504, 0x0b0a'8908, 0x0f0e'8d0c},
7625                               {0x1312'9110, 0x1716'9514, 0x1b1a'9918, 0x1f1e'9d1c},
7626                               {0x2322'a120, 0x2726'a524, 0x2b2a'a928, 0x2f2e'ad2c},
7627                               {0x3332'b130, 0x3736'b534, 0x3b3a'b938, 0x3f3e'bd3c},
7628                               {0xc342'c140, 0xc746'c544, 0xcb4a'c948, 0xcf4e'cd4c},
7629                               {0xd352'd150, 0xd756'd554, 0xdb5a'd958, 0xdf5e'dd5c},
7630                               {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
7631                               {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}},
7632                              {{0x0706'8504'8302'8100, 0x0f0e'8d0c'8b0a'8908},
7633                               {0x1716'9514'9312'9110, 0x1f1e'9d1c'9b1a'9918},
7634                               {0x2726'a524'a322'a120, 0x2f2e'ad2c'ab2a'a928},
7635                               {0x3736'b534'b332'b130, 0x3f3e'bd3c'bb3a'b938},
7636                               {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
7637                               {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
7638                               {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
7639                               {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}},
7640                              kVectorCalculationsSource);
7641   TestVectorFloatInstruction(0x2500d457,  // vfsgnjn.vf v8, v16, f1, v0.t
7642                              {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c},
7643                               {0x9312'9110, 0x9716'9514, 0x9b1a'9918, 0x9f1e'9d1c},
7644                               {0xa322'a120, 0xa726'a524, 0xab2a'a928, 0xaf2e'ad2c},
7645                               {0xb332'b130, 0xb736'b534, 0xbb3a'b938, 0xbf3e'bd3c},
7646                               {0xc342'c140, 0xc746'c544, 0xcb4a'c948, 0xcf4e'cd4c},
7647                               {0xd352'd150, 0xd756'd554, 0xdb5a'd958, 0xdf5e'dd5c},
7648                               {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
7649                               {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}},
7650                              {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
7651                               {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
7652                               {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
7653                               {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938},
7654                               {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
7655                               {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
7656                               {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
7657                               {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}},
7658                              kVectorCalculationsSource);
7659   TestVectorFloatInstruction(0x290c1457,  // vfsgnjx.vv v8, v16, v24, v0.t
7660                              {{0x0302'8100, 0x0706'8504, 0x0b0a'8908, 0x0f0e'8d0c},
7661                               {0x1312'9110, 0x1716'9514, 0x1b1a'9918, 0x1f1e'9d1c},
7662                               {0x2322'a120, 0x2726'a524, 0x2b2a'a928, 0x2f2e'ad2c},
7663                               {0x3332'b130, 0x3736'b534, 0x3b3a'b938, 0x3f3e'bd3c},
7664                               {0xc342'c140, 0xc746'c544, 0xcb4a'c948, 0xcf4e'cd4c},
7665                               {0xd352'd150, 0xd756'd554, 0xdb5a'd958, 0xdf5e'dd5c},
7666                               {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
7667                               {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}},
7668                              {{0x0706'8504'8302'8100, 0x0f0e'8d0c'8b0a'8908},
7669                               {0x1716'9514'9312'9110, 0x1f1e'9d1c'9b1a'9918},
7670                               {0x2726'a524'a322'a120, 0x2f2e'ad2c'ab2a'a928},
7671                               {0x3736'b534'b332'b130, 0x3f3e'bd3c'bb3a'b938},
7672                               {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
7673                               {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
7674                               {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
7675                               {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}},
7676                              kVectorCalculationsSource);
7677   TestVectorFloatInstruction(0x2900d457,  // vfsgnjx.vf v8, v16, f1, v0.t
7678                              {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c},
7679                               {0x9312'9110, 0x9716'9514, 0x9b1a'9918, 0x9f1e'9d1c},
7680                               {0xa322'a120, 0xa726'a524, 0xab2a'a928, 0xaf2e'ad2c},
7681                               {0xb332'b130, 0xb736'b534, 0xbb3a'b938, 0xbf3e'bd3c},
7682                               {0xc342'c140, 0xc746'c544, 0xcb4a'c948, 0xcf4e'cd4c},
7683                               {0xd352'd150, 0xd756'd554, 0xdb5a'd958, 0xdf5e'dd5c},
7684                               {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
7685                               {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}},
7686                              {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
7687                               {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
7688                               {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
7689                               {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938},
7690                               {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
7691                               {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
7692                               {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
7693                               {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}},
7694                              kVectorCalculationsSource);
7695 }
7696 
7697 // Note that the expected test outputs for v[f]merge.vXm are identical to those for v[f]mv.v.X.
7698 // This happens because v[f]merge.vXm is just a v[f]mv.v.X with mask (second operand is not used
7699 // by v[f]mv.v.X but the difference between v[f]merge.vXm and v[f]mv.v.X is captured in masking
7700 // logic within TestVectorInstruction itself via the parameter TestVectorInstructionMode::kVMerge
7701 // for V[f]merge/V[f]mv).
TEST_F(Riscv64InterpreterTest,TestVmerge)7702 TEST_F(Riscv64InterpreterTest, TestVmerge) {
7703   TestVectorMergeFloatInstruction(0x5d00d457,  // Vfmerge.vfm v8, v16, f1, v0
7704                                   {{0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7705                                    {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7706                                    {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7707                                    {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7708                                    {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7709                                    {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7710                                    {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000},
7711                                    {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000}},
7712                                   {{0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7713                                    {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7714                                    {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7715                                    {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7716                                    {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7717                                    {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7718                                    {0x4016'8000'0000'0000, 0x4016'8000'0000'0000},
7719                                    {0x4016'8000'0000'0000, 0x4016'8000'0000'0000}},
7720                                   kVectorCalculationsSource);
7721   TestVectorMergeInstruction(
7722       0x5d0c0457,  // Vmerge.vvm v8, v16, v24, v0
7723       {{0, 146, 4, 150, 9, 154, 12, 158, 17, 130, 20, 134, 24, 138, 28, 142},
7724        {32, 178, 36, 182, 41, 186, 44, 190, 49, 162, 52, 166, 56, 170, 60, 174},
7725        {64, 210, 68, 214, 73, 218, 76, 222, 81, 194, 84, 198, 88, 202, 92, 206},
7726        {96, 242, 100, 246, 105, 250, 108, 254, 113, 226, 116, 230, 120, 234, 124, 238},
7727        {128, 18, 132, 22, 137, 26, 140, 30, 145, 2, 148, 6, 152, 10, 156, 14},
7728        {160, 50, 164, 54, 169, 58, 172, 62, 177, 34, 180, 38, 184, 42, 188, 46},
7729        {192, 82, 196, 86, 201, 90, 204, 94, 209, 66, 212, 70, 216, 74, 220, 78},
7730        {224, 114, 228, 118, 233, 122, 236, 126, 241, 98, 244, 102, 248, 106, 252, 110}},
7731       {{0x9200, 0x9604, 0x9a09, 0x9e0c, 0x8211, 0x8614, 0x8a18, 0x8e1c},
7732        {0xb220, 0xb624, 0xba29, 0xbe2c, 0xa231, 0xa634, 0xaa38, 0xae3c},
7733        {0xd240, 0xd644, 0xda49, 0xde4c, 0xc251, 0xc654, 0xca58, 0xce5c},
7734        {0xf260, 0xf664, 0xfa69, 0xfe6c, 0xe271, 0xe674, 0xea78, 0xee7c},
7735        {0x1280, 0x1684, 0x1a89, 0x1e8c, 0x0291, 0x0694, 0x0a98, 0x0e9c},
7736        {0x32a0, 0x36a4, 0x3aa9, 0x3eac, 0x22b1, 0x26b4, 0x2ab8, 0x2ebc},
7737        {0x52c0, 0x56c4, 0x5ac9, 0x5ecc, 0x42d1, 0x46d4, 0x4ad8, 0x4edc},
7738        {0x72e0, 0x76e4, 0x7ae9, 0x7eec, 0x62f1, 0x66f4, 0x6af8, 0x6efc}},
7739       {{0x9604'9200, 0x9e0c'9a09, 0x8614'8211, 0x8e1c'8a18},
7740        {0xb624'b220, 0xbe2c'ba29, 0xa634'a231, 0xae3c'aa38},
7741        {0xd644'd240, 0xde4c'da49, 0xc654'c251, 0xce5c'ca58},
7742        {0xf664'f260, 0xfe6c'fa69, 0xe674'e271, 0xee7c'ea78},
7743        {0x1684'1280, 0x1e8c'1a89, 0x0694'0291, 0x0e9c'0a98},
7744        {0x36a4'32a0, 0x3eac'3aa9, 0x26b4'22b1, 0x2ebc'2ab8},
7745        {0x56c4'52c0, 0x5ecc'5ac9, 0x46d4'42d1, 0x4edc'4ad8},
7746        {0x76e4'72e0, 0x7eec'7ae9, 0x66f4'62f1, 0x6efc'6af8}},
7747       {{0x9e0c'9a09'9604'9200, 0x8e1c'8a18'8614'8211},
7748        {0xbe2c'ba29'b624'b220, 0xae3c'aa38'a634'a231},
7749        {0xde4c'da49'd644'd240, 0xce5c'ca58'c654'c251},
7750        {0xfe6c'fa69'f664'f260, 0xee7c'ea78'e674'e271},
7751        {0x1e8c'1a89'1684'1280, 0x0e9c'0a98'0694'0291},
7752        {0x3eac'3aa9'36a4'32a0, 0x2ebc'2ab8'26b4'22b1},
7753        {0x5ecc'5ac9'56c4'52c0, 0x4edc'4ad8'46d4'42d1},
7754        {0x7eec'7ae9'76e4'72e0, 0x6efc'6af8'66f4'62f1}},
7755       kVectorCalculationsSource);
7756   TestVectorMergeInstruction(
7757       0x5d00c457,  // Vmerge.vxm v8, v16, x1, v0
7758       {{170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170},
7759        {170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170},
7760        {170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170},
7761        {170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170},
7762        {170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170},
7763        {170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170},
7764        {170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170},
7765        {170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170}},
7766       {{0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa},
7767        {0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa},
7768        {0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa},
7769        {0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa},
7770        {0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa},
7771        {0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa},
7772        {0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa},
7773        {0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa}},
7774       {{0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa},
7775        {0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa},
7776        {0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa},
7777        {0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa},
7778        {0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa},
7779        {0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa},
7780        {0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa},
7781        {0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa}},
7782       {{0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa},
7783        {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa},
7784        {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa},
7785        {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa},
7786        {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa},
7787        {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa},
7788        {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa},
7789        {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa}},
7790       kVectorCalculationsSource);
7791   TestVectorMergeInstruction(
7792       0x5d0ab457,  // Vmerge.vim v8, v16, -0xb, v0
7793       {{245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245},
7794        {245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245},
7795        {245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245},
7796        {245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245},
7797        {245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245},
7798        {245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245},
7799        {245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245},
7800        {245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245}},
7801       {{0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5},
7802        {0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5},
7803        {0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5},
7804        {0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5},
7805        {0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5},
7806        {0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5},
7807        {0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5},
7808        {0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5, 0xfff5}},
7809       {{0xffff'fff5, 0xffff'fff5, 0xffff'fff5, 0xffff'fff5},
7810        {0xffff'fff5, 0xffff'fff5, 0xffff'fff5, 0xffff'fff5},
7811        {0xffff'fff5, 0xffff'fff5, 0xffff'fff5, 0xffff'fff5},
7812        {0xffff'fff5, 0xffff'fff5, 0xffff'fff5, 0xffff'fff5},
7813        {0xffff'fff5, 0xffff'fff5, 0xffff'fff5, 0xffff'fff5},
7814        {0xffff'fff5, 0xffff'fff5, 0xffff'fff5, 0xffff'fff5},
7815        {0xffff'fff5, 0xffff'fff5, 0xffff'fff5, 0xffff'fff5},
7816        {0xffff'fff5, 0xffff'fff5, 0xffff'fff5, 0xffff'fff5}},
7817       {{0xffff'ffff'ffff'fff5, 0xffff'ffff'ffff'fff5},
7818        {0xffff'ffff'ffff'fff5, 0xffff'ffff'ffff'fff5},
7819        {0xffff'ffff'ffff'fff5, 0xffff'ffff'ffff'fff5},
7820        {0xffff'ffff'ffff'fff5, 0xffff'ffff'ffff'fff5},
7821        {0xffff'ffff'ffff'fff5, 0xffff'ffff'ffff'fff5},
7822        {0xffff'ffff'ffff'fff5, 0xffff'ffff'ffff'fff5},
7823        {0xffff'ffff'ffff'fff5, 0xffff'ffff'ffff'fff5},
7824        {0xffff'ffff'ffff'fff5, 0xffff'ffff'ffff'fff5}},
7825       kVectorCalculationsSource);
7826 }
7827 
TEST_F(Riscv64InterpreterTest,TestVslide1down)7828 TEST_F(Riscv64InterpreterTest, TestVslide1down) {
7829   // Where the element at the top gets inserted will depend on VLMUL so we use
7830   // TestVectorPermutationInstruction instead of TestVectorInstruction.
7831 
7832   // VLMUL = 0
7833   TestVectorPermutationInstruction(
7834       0x3d80e457,  // vslide1down.vx v8, v24, x1, v0.t
7835       {{2, 4, 6, 9, 10, 12, 14, 17, 18, 20, 22, 24, 26, 28, 30, 0xaa}, {}, {}, {}, {}, {}, {}, {}},
7836       {{0x0604, 0x0a09, 0x0e0c, 0x1211, 0x1614, 0x1a18, 0x1e1c, 0xaaaa},
7837        {},
7838        {},
7839        {},
7840        {},
7841        {},
7842        {},
7843        {}},
7844       {{0x0e0c'0a09, 0x1614'1211, 0x1e1c'1a18, 0xaaaa'aaaa}, {}, {}, {}, {}, {}, {}, {}},
7845       {{0x1e1c'1a18'1614'1211, 0xaaaa'aaaa'aaaa'aaaa}, {}, {}, {}, {}, {}, {}, {}},
7846       kVectorCalculationsSourceLegacy,
7847       /*vlmul=*/0,
7848       /*regx1=*/0xaaaa'aaaa'aaaa'aaaa,
7849       /*skip=*/0,
7850       /*ignore_vma_for_last=*/true,
7851       /*last_elem_is_x1=*/true);
7852 
7853   // VLMUL = 1
7854   TestVectorPermutationInstruction(
7855       0x3d80e457,  // vslide1down.vx v8, v24, x1, v0.t
7856       {{2, 4, 6, 9, 10, 12, 14, 17, 18, 20, 22, 24, 26, 28, 30, 32},
7857        {34, 36, 38, 41, 42, 44, 46, 49, 50, 52, 54, 56, 58, 60, 62, 0xaa},
7858        {},
7859        {},
7860        {},
7861        {},
7862        {},
7863        {}},
7864       {{0x0604, 0x0a09, 0x0e0c, 0x1211, 0x1614, 0x1a18, 0x1e1c, 0x2220},
7865        {0x2624, 0x2a29, 0x2e2c, 0x3231, 0x3634, 0x3a38, 0x3e3c, 0xaaaa},
7866        {},
7867        {},
7868        {},
7869        {},
7870        {},
7871        {}},
7872       {{0x0e0c'0a09, 0x1614'1211, 0x1e1c'1a18, 0x2624'2220},
7873        {0x2e2c'2a29, 0x3634'3231, 0x3e3c'3a38, 0xaaaa'aaaa},
7874        {},
7875        {},
7876        {},
7877        {},
7878        {},
7879        {}},
7880       {{0x1e1c'1a18'1614'1211, 0x2e2c'2a29'2624'2220},
7881        {0x3e3c'3a38'3634'3231, 0xaaaa'aaaa'aaaa'aaaa},
7882        {},
7883        {},
7884        {},
7885        {},
7886        {},
7887        {}},
7888       kVectorCalculationsSourceLegacy,
7889       /*vlmul=*/1,
7890       /*regx1=*/0xaaaa'aaaa'aaaa'aaaa,
7891       /*skip=*/0,
7892       /*ignore_vma_for_last=*/true,
7893       /*last_elem_is_x1=*/true);
7894 
7895   // VLMUL = 2
7896   TestVectorPermutationInstruction(
7897       0x3d80e457,  // vslide1down.vx v8, v24, x1, v0.t
7898       {{2, 4, 6, 9, 10, 12, 14, 17, 18, 20, 22, 24, 26, 28, 30, 32},
7899        {34, 36, 38, 41, 42, 44, 46, 49, 50, 52, 54, 56, 58, 60, 62, 64},
7900        {66, 68, 70, 73, 74, 76, 78, 81, 82, 84, 86, 88, 90, 92, 94, 96},
7901        {98, 100, 102, 105, 106, 108, 110, 113, 114, 116, 118, 120, 122, 124, 126, 0xaa},
7902        {},
7903        {},
7904        {},
7905        {}},
7906       {{0x0604, 0x0a09, 0x0e0c, 0x1211, 0x1614, 0x1a18, 0x1e1c, 0x2220},
7907        {0x2624, 0x2a29, 0x2e2c, 0x3231, 0x3634, 0x3a38, 0x3e3c, 0x4240},
7908        {0x4644, 0x4a49, 0x4e4c, 0x5251, 0x5654, 0x5a58, 0x5e5c, 0x6260},
7909        {0x6664, 0x6a69, 0x6e6c, 0x7271, 0x7674, 0x7a78, 0x7e7c, 0xaaaa},
7910        {},
7911        {},
7912        {},
7913        {}},
7914       {{0x0e0c'0a09, 0x1614'1211, 0x1e1c'1a18, 0x2624'2220},
7915        {0x2e2c'2a29, 0x3634'3231, 0x3e3c'3a38, 0x4644'4240},
7916        {0x4e4c'4a49, 0x5654'5251, 0x5e5c'5a58, 0x6664'6260},
7917        {0x6e6c'6a69, 0x7674'7271, 0x7e7c'7a78, 0xaaaa'aaaa},
7918        {},
7919        {},
7920        {},
7921        {}},
7922       {{0x1e1c'1a18'1614'1211, 0x2e2c'2a29'2624'2220},
7923        {0x3e3c'3a38'3634'3231, 0x4e4c'4a49'4644'4240},
7924        {0x5e5c'5a58'5654'5251, 0x6e6c'6a69'6664'6260},
7925        {0x7e7c'7a78'7674'7271, 0xaaaa'aaaa'aaaa'aaaa},
7926        {},
7927        {},
7928        {},
7929        {}},
7930       kVectorCalculationsSourceLegacy,
7931       /*vlmul=*/2,
7932       /*regx1=*/0xaaaa'aaaa'aaaa'aaaa,
7933       /*skip=*/0,
7934       /*ignore_vma_for_last=*/true,
7935       /*last_elem_is_x1=*/true);
7936 
7937   // VLMUL = 3
7938   TestVectorPermutationInstruction(
7939       0x3d80e457,  // vslide1down.vx v8, v24, x1, v0.t
7940       {{2, 4, 6, 9, 10, 12, 14, 17, 18, 20, 22, 24, 26, 28, 30, 32},
7941        {34, 36, 38, 41, 42, 44, 46, 49, 50, 52, 54, 56, 58, 60, 62, 64},
7942        {66, 68, 70, 73, 74, 76, 78, 81, 82, 84, 86, 88, 90, 92, 94, 96},
7943        {98, 100, 102, 105, 106, 108, 110, 113, 114, 116, 118, 120, 122, 124, 126, 128},
7944        {130, 132, 134, 137, 138, 140, 142, 145, 146, 148, 150, 152, 154, 156, 158, 160},
7945        {162, 164, 166, 169, 170, 172, 174, 177, 178, 180, 182, 184, 186, 188, 190, 192},
7946        {194, 196, 198, 201, 202, 204, 206, 209, 210, 212, 214, 216, 218, 220, 222, 224},
7947        {226, 228, 230, 233, 234, 236, 238, 241, 242, 244, 246, 248, 250, 252, 254, 0xaa}},
7948       {{0x0604, 0x0a09, 0x0e0c, 0x1211, 0x1614, 0x1a18, 0x1e1c, 0x2220},
7949        {0x2624, 0x2a29, 0x2e2c, 0x3231, 0x3634, 0x3a38, 0x3e3c, 0x4240},
7950        {0x4644, 0x4a49, 0x4e4c, 0x5251, 0x5654, 0x5a58, 0x5e5c, 0x6260},
7951        {0x6664, 0x6a69, 0x6e6c, 0x7271, 0x7674, 0x7a78, 0x7e7c, 0x8280},
7952        {0x8684, 0x8a89, 0x8e8c, 0x9291, 0x9694, 0x9a98, 0x9e9c, 0xa2a0},
7953        {0xa6a4, 0xaaa9, 0xaeac, 0xb2b1, 0xb6b4, 0xbab8, 0xbebc, 0xc2c0},
7954        {0xc6c4, 0xcac9, 0xcecc, 0xd2d1, 0xd6d4, 0xdad8, 0xdedc, 0xe2e0},
7955        {0xe6e4, 0xeae9, 0xeeec, 0xf2f1, 0xf6f4, 0xfaf8, 0xfefc, 0xaaaa}},
7956       {{0x0e0c'0a09, 0x1614'1211, 0x1e1c'1a18, 0x2624'2220},
7957        {0x2e2c'2a29, 0x3634'3231, 0x3e3c'3a38, 0x4644'4240},
7958        {0x4e4c'4a49, 0x5654'5251, 0x5e5c'5a58, 0x6664'6260},
7959        {0x6e6c'6a69, 0x7674'7271, 0x7e7c'7a78, 0x8684'8280},
7960        {0x8e8c'8a89, 0x9694'9291, 0x9e9c'9a98, 0xa6a4'a2a0},
7961        {0xaeac'aaa9, 0xb6b4'b2b1, 0xbebc'bab8, 0xc6c4'c2c0},
7962        {0xcecc'cac9, 0xd6d4'd2d1, 0xdedc'dad8, 0xe6e4'e2e0},
7963        {0xeeec'eae9, 0xf6f4'f2f1, 0xfefc'faf8, 0xaaaa'aaaa}},
7964       {{0x1e1c'1a18'1614'1211, 0x2e2c'2a29'2624'2220},
7965        {0x3e3c'3a38'3634'3231, 0x4e4c'4a49'4644'4240},
7966        {0x5e5c'5a58'5654'5251, 0x6e6c'6a69'6664'6260},
7967        {0x7e7c'7a78'7674'7271, 0x8e8c'8a89'8684'8280},
7968        {0x9e9c'9a98'9694'9291, 0xaeac'aaa9'a6a4'a2a0},
7969        {0xbebc'bab8'b6b4'b2b1, 0xcecc'cac9'c6c4'c2c0},
7970        {0xdedc'dad8'd6d4'd2d1, 0xeeec'eae9'e6e4'e2e0},
7971        {0xfefc'faf8'f6f4'f2f1, 0xaaaa'aaaa'aaaa'aaaa}},
7972       kVectorCalculationsSourceLegacy,
7973       /*vlmul=*/3,
7974       /*regx1=*/0xaaaa'aaaa'aaaa'aaaa,
7975       /*skip=*/0,
7976       /*ignore_vma_for_last=*/true,
7977       /*last_elem_is_x1=*/true);
7978 
7979   // VLMUL = 4
7980   TestVectorPermutationInstruction(0x3d80e457,  // vslide1down.vx v8, v24, x1, v0.t
7981                                    {{}, {}, {}, {}, {}, {}, {}, {}},
7982                                    {{}, {}, {}, {}, {}, {}, {}, {}},
7983                                    {{}, {}, {}, {}, {}, {}, {}, {}},
7984                                    {{}, {}, {}, {}, {}, {}, {}, {}},
7985                                    kVectorCalculationsSourceLegacy,
7986                                    /*vlmul=*/4,
7987                                    /*regx1=*/0xaaaa'aaaa'aaaa'aaaa,
7988                                    /*skip=*/0,
7989                                    /*ignore_vma_for_last=*/true,
7990                                    /*last_elem_is_x1=*/true);
7991 
7992   // VLMUL = 5
7993   TestVectorPermutationInstruction(
7994       0x3d80e457,  // vslide1down.vx v8, v24, x1, v0.t
7995       {{2, 0xaa, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
7996       {{0xaaaa, 0, 0, 0, 0, 0, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
7997       {{}, {}, {}, {}, {}, {}, {}, {}},
7998       {{}, {}, {}, {}, {}, {}, {}, {}},
7999       kVectorCalculationsSourceLegacy,
8000       /*vlmul=*/5,
8001       /*regx1=*/0xaaaa'aaaa'aaaa'aaaa,
8002       /*skip=*/0,
8003       /*ignore_vma_for_last=*/true,
8004       /*last_elem_is_x1=*/true);
8005 
8006   // VLMUL = 6
8007   TestVectorPermutationInstruction(
8008       0x3d80e457,  // vslide1down.vx v8, v24, x1, v0.t
8009       {{2, 4, 6, 0xaa, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
8010       {{0x0604, 0xaaaa, 0, 0, 0, 0, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
8011       {{0xaaaa'aaaa, 0, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
8012       {{}, {}, {}, {}, {}, {}, {}, {}},
8013       kVectorCalculationsSourceLegacy,
8014       /*vlmul=*/6,
8015       /*regx1=*/0xaaaa'aaaa'aaaa'aaaa,
8016       /*skip=*/0,
8017       /*ignore_vma_for_last=*/true,
8018       /*last_elem_is_x1=*/true);
8019 
8020   // VLMUL = 7
8021   TestVectorPermutationInstruction(
8022       0x3d80e457,  // vslide1down.vx v8, v24, x1, v0.t
8023       {{2, 4, 6, 9, 10, 12, 14, 0xaa, 0, 0, 0, 0, 0, 0, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
8024       {{0x0604, 0x0a09, 0x0e0c, 0xaaaa, 0, 0, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
8025       {{0x0e0c'0a09, 0xaaaa'aaaa, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
8026       {{0xaaaa'aaaa'aaaa'aaaa, 0}, {}, {}, {}, {}, {}, {}, {}},
8027       kVectorCalculationsSourceLegacy,
8028       /*vlmul=*/7,
8029       /*regx1=*/0xaaaa'aaaa'aaaa'aaaa,
8030       /*skip=*/0,
8031       /*ignore_vma_for_last=*/true,
8032       /*last_elem_is_x1=*/true);
8033 }
8034 
TEST_F(Riscv64InterpreterTest,TestVfslide1up)8035 TEST_F(Riscv64InterpreterTest, TestVfslide1up) {
8036   TestVectorFloatInstruction(0x3980d457,  // vfslide1up.vf v8, v24, f1, v0.t
8037                              {{0x40b4'0000, 0x9604'9200, 0x9e0c'9a09, 0x8614'8211},
8038                               {0x8e1c'8a18, 0xb624'b220, 0xbe2c'ba29, 0xa634'a231},
8039                               {0xae3c'aa38, 0xd644'd240, 0xde4c'da49, 0xc654'c251},
8040                               {0xce5c'ca58, 0xf664'f260, 0xfe6c'fa69, 0xe674'e271},
8041                               {0xee7c'ea78, 0x1684'1280, 0x1e8c'1a89, 0x0694'0291},
8042                               {0x0e9c'0a98, 0x36a4'32a0, 0x3eac'3aa9, 0x26b4'22b1},
8043                               {0x2ebc'2ab8, 0x56c4'52c0, 0x5ecc'5ac9, 0x46d4'42d1},
8044                               {0x4edc'4ad8, 0x76e4'72e0, 0x7eec'7ae9, 0x66f4'62f1}},
8045                              {{0x4016'8000'0000'0000, 0x9e0c'9a09'9604'9200},
8046                               {0x8e1c'8a18'8614'8211, 0xbe2c'ba29'b624'b220},
8047                               {0xae3c'aa38'a634'a231, 0xde4c'da49'd644'd240},
8048                               {0xce5c'ca58'c654'c251, 0xfe6c'fa69'f664'f260},
8049                               {0xee7c'ea78'e674'e271, 0x1e8c'1a89'1684'1280},
8050                               {0x0e9c'0a98'0694'0291, 0x3eac'3aa9'36a4'32a0},
8051                               {0x2ebc'2ab8'26b4'22b1, 0x5ecc'5ac9'56c4'52c0},
8052                               {0x4edc'4ad8'46d4'42d1, 0x7eec'7ae9'76e4'72e0}},
8053                              kVectorCalculationsSource);
8054 }
8055 
TEST_F(Riscv64InterpreterTest,TestVfslide1down)8056 TEST_F(Riscv64InterpreterTest, TestVfslide1down) {
8057   // Where the element at the top gets inserted will depend on VLMUL so we use
8058   // TestVectorFloatPermutationInstruction instead of TestVectorFloatInstruction.
8059 
8060   // VLMUL = 0
8061   TestVectorFloatPermutationInstruction(
8062       0x3d80d457,  // vfslide1down.vf v8, v24, f1, v0.t
8063       {{0x9e0c'9a09, 0x8614'8211, 0x8e1c'8a18, 0x40b4'0000}, {}, {}, {}, {}, {}, {}, {}},
8064       {{0x8e1c'8a18'8614'8211, 0x4016'8000'0000'0000}, {}, {}, {}, {}, {}, {}, {}},
8065       kVectorCalculationsSource,
8066       /*vlmul=*/0,
8067       /*skip=*/0,
8068       /*ignore_vma_for_last=*/true,
8069       /*last_elem_is_f1=*/true);
8070 
8071   // VLMUL = 1
8072   TestVectorFloatPermutationInstruction(0x3d80d457,  // vfslide1down.vf v8, v24, f1, v0.t
8073                                         {{0x9e0c'9a09, 0x8614'8211, 0x8e1c'8a18, 0xb624'b220},
8074                                          {0xbe2c'ba29, 0xa634'a231, 0xae3c'aa38, 0x40b4'0000},
8075                                          {},
8076                                          {},
8077                                          {},
8078                                          {},
8079                                          {},
8080                                          {}},
8081                                         {{0x8e1c'8a18'8614'8211, 0xbe2c'ba29'b624'b220},
8082                                          {0xae3c'aa38'a634'a231, 0x4016'8000'0000'0000},
8083                                          {},
8084                                          {},
8085                                          {},
8086                                          {},
8087                                          {},
8088                                          {}},
8089                                         kVectorCalculationsSource,
8090                                         /*vlmul=*/1,
8091                                         /*skip=*/0,
8092                                         /*ignore_vma_for_last=*/true,
8093                                         /*last_elem_is_f1=*/true);
8094 
8095   // VLMUL = 2
8096   TestVectorFloatPermutationInstruction(0x3d80d457,  // vfslide1down.vf v8, v24, f1, v0.t
8097                                         {{0x9e0c'9a09, 0x8614'8211, 0x8e1c'8a18, 0xb624'b220},
8098                                          {0xbe2c'ba29, 0xa634'a231, 0xae3c'aa38, 0xd644'd240},
8099                                          {0xde4c'da49, 0xc654'c251, 0xce5c'ca58, 0xf664'f260},
8100                                          {0xfe6c'fa69, 0xe674'e271, 0xee7c'ea78, 0x40b4'0000},
8101                                          {},
8102                                          {},
8103                                          {},
8104                                          {}},
8105                                         {{0x8e1c'8a18'8614'8211, 0xbe2c'ba29'b624'b220},
8106                                          {0xae3c'aa38'a634'a231, 0xde4c'da49'd644'd240},
8107                                          {0xce5c'ca58'c654'c251, 0xfe6c'fa69'f664'f260},
8108                                          {0xee7c'ea78'e674'e271, 0x4016'8000'0000'0000},
8109                                          {},
8110                                          {},
8111                                          {},
8112                                          {}},
8113                                         kVectorCalculationsSource,
8114                                         /*vlmul=*/2,
8115                                         /*skip=*/0,
8116                                         /*ignore_vma_for_last=*/true,
8117                                         /*last_elem_is_f1=*/true);
8118 
8119   // VLMUL = 3
8120   TestVectorFloatPermutationInstruction(0x3d80d457,  // vfslide1down.vf v8, v24, f1, v0.t
8121                                         {{0x9e0c'9a09, 0x8614'8211, 0x8e1c'8a18, 0xb624'b220},
8122                                          {0xbe2c'ba29, 0xa634'a231, 0xae3c'aa38, 0xd644'd240},
8123                                          {0xde4c'da49, 0xc654'c251, 0xce5c'ca58, 0xf664'f260},
8124                                          {0xfe6c'fa69, 0xe674'e271, 0xee7c'ea78, 0x1684'1280},
8125                                          {0x1e8c'1a89, 0x0694'0291, 0x0e9c'0a98, 0x36a4'32a0},
8126                                          {0x3eac'3aa9, 0x26b4'22b1, 0x2ebc'2ab8, 0x56c4'52c0},
8127                                          {0x5ecc'5ac9, 0x46d4'42d1, 0x4edc'4ad8, 0x76e4'72e0},
8128                                          {0x7eec'7ae9, 0x66f4'62f1, 0x6efc'6af8, 0x40b4'0000}},
8129                                         {{0x8e1c'8a18'8614'8211, 0xbe2c'ba29'b624'b220},
8130                                          {0xae3c'aa38'a634'a231, 0xde4c'da49'd644'd240},
8131                                          {0xce5c'ca58'c654'c251, 0xfe6c'fa69'f664'f260},
8132                                          {0xee7c'ea78'e674'e271, 0x1e8c'1a89'1684'1280},
8133                                          {0x0e9c'0a98'0694'0291, 0x3eac'3aa9'36a4'32a0},
8134                                          {0x2ebc'2ab8'26b4'22b1, 0x5ecc'5ac9'56c4'52c0},
8135                                          {0x4edc'4ad8'46d4'42d1, 0x7eec'7ae9'76e4'72e0},
8136                                          {0x6efc'6af8'66f4'62f1, 0x4016'8000'0000'0000}},
8137                                         kVectorCalculationsSource,
8138                                         /*vlmul=*/3,
8139                                         /*skip=*/0,
8140                                         /*ignore_vma_for_last=*/true,
8141                                         /*last_elem_is_f1=*/true);
8142 
8143   // VLMUL = 4
8144   TestVectorFloatPermutationInstruction(0x3d80d457,  // vfslide1down.vf v8, v24, f1, v0.t
8145                                         {{}, {}, {}, {}, {}, {}, {}, {}},
8146                                         {{}, {}, {}, {}, {}, {}, {}, {}},
8147                                         kVectorCalculationsSource,
8148                                         /*vlmul=*/4,
8149                                         /*skip=*/0,
8150                                         /*ignore_vma_for_last=*/true,
8151                                         /*last_elem_is_f1=*/true);
8152 
8153   // VLMUL = 5
8154   TestVectorFloatPermutationInstruction(0x3d80d457,  // vfslide1down.vf v8, v24, f1, v0.t
8155                                         {{}, {}, {}, {}, {}, {}, {}, {}},
8156                                         {{}, {}, {}, {}, {}, {}, {}, {}},
8157                                         kVectorCalculationsSource,
8158                                         /*vlmul=*/5,
8159                                         /*skip=*/0,
8160                                         /*ignore_vma_for_last=*/true,
8161                                         /*last_elem_is_f1=*/true);
8162 
8163   // VLMUL = 6
8164   TestVectorFloatPermutationInstruction(0x3d80d457,  // vfslide1down.vf v8, v24, f1, v0.t
8165                                         {{0x40b4'0000, 0, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
8166                                         {{}, {}, {}, {}, {}, {}, {}, {}},
8167                                         kVectorCalculationsSource,
8168                                         /*vlmul=*/6,
8169                                         /*skip=*/0,
8170                                         /*ignore_vma_for_last=*/true,
8171                                         /*last_elem_is_f1=*/true);
8172 
8173   // VLMUL = 7
8174   TestVectorFloatPermutationInstruction(
8175       0x3d80d457,  // vfslide1down.vf v8, v24, f1, v0.t
8176       {{0x9e0c'9a09, 0x40b4'0000, 0, 0}, {}, {}, {}, {}, {}, {}, {}},
8177       {{0x4016'8000'0000'0000, 0}, {}, {}, {}, {}, {}, {}, {}},
8178       kVectorCalculationsSource,
8179       /*vlmul=*/7,
8180       /*skip=*/0,
8181       /*ignore_vma_for_last=*/true,
8182       /*last_elem_is_f1=*/true);
8183 }
8184 
TEST_F(Riscv64InterpreterTest,TestVseXX)8185 TEST_F(Riscv64InterpreterTest, TestVseXX) {
8186   TestVseXX(0x8427,  // vse8.v v8, (x1), v0.t
8187             {{0, 129, 2, 131, 4, 133, 6, 135, 8, 137, 10, 139, 12, 141, 14, 143},
8188              {16, 145, 18, 147, 20, 149, 22, 151, 24, 153, 26, 155, 28, 157, 30, 159},
8189              {32, 161, 34, 163, 36, 165, 38, 167, 40, 169, 42, 171, 44, 173, 46, 175},
8190              {48, 177, 50, 179, 52, 181, 54, 183, 56, 185, 58, 187, 60, 189, 62, 191},
8191              {64, 193, 66, 195, 68, 197, 70, 199, 72, 201, 74, 203, 76, 205, 78, 207},
8192              {80, 209, 82, 211, 84, 213, 86, 215, 88, 217, 90, 219, 92, 221, 94, 223},
8193              {96, 225, 98, 227, 100, 229, 102, 231, 104, 233, 106, 235, 108, 237, 110, 239},
8194              {112, 241, 114, 243, 116, 245, 118, 247, 120, 249, 122, 251, 124, 253, 126, 255}},
8195             {},
8196             {},
8197             {},
8198             0,
8199             kVectorCalculationsSourceLegacy);
8200   TestVseXX(0xd427,  // vse16.v v8, (x1), v0.t
8201             {},
8202             {{0x8100, 0x8302, 0x8504, 0x8706, 0x8908, 0x8b0a, 0x8d0c, 0x8f0e},
8203              {0x9110, 0x9312, 0x9514, 0x9716, 0x9918, 0x9b1a, 0x9d1c, 0x9f1e},
8204              {0xa120, 0xa322, 0xa524, 0xa726, 0xa928, 0xab2a, 0xad2c, 0xaf2e},
8205              {0xb130, 0xb332, 0xb534, 0xb736, 0xb938, 0xbb3a, 0xbd3c, 0xbf3e},
8206              {0xc140, 0xc342, 0xc544, 0xc746, 0xc948, 0xcb4a, 0xcd4c, 0xcf4e},
8207              {0xd150, 0xd352, 0xd554, 0xd756, 0xd958, 0xdb5a, 0xdd5c, 0xdf5e},
8208              {0xe160, 0xe362, 0xe564, 0xe766, 0xe968, 0xeb6a, 0xed6c, 0xef6e},
8209              {0xf170, 0xf372, 0xf574, 0xf776, 0xf978, 0xfb7a, 0xfd7c, 0xff7e}},
8210             {},
8211             {},
8212             1,
8213             kVectorCalculationsSourceLegacy);
8214   TestVseXX(0xe427,  // vse32.v v8, (x1), v0.t
8215             {},
8216             {},
8217             {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c},
8218              {0x9312'9110, 0x9716'9514, 0x9b1a'9918, 0x9f1e'9d1c},
8219              {0xa322'a120, 0xa726'a524, 0xab2a'a928, 0xaf2e'ad2c},
8220              {0xb332'b130, 0xb736'b534, 0xbb3a'b938, 0xbf3e'bd3c},
8221              {0xc342'c140, 0xc746'c544, 0xcb4a'c948, 0xcf4e'cd4c},
8222              {0xd352'd150, 0xd756'd554, 0xdb5a'd958, 0xdf5e'dd5c},
8223              {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
8224              {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}},
8225             {},
8226             2,
8227             kVectorCalculationsSourceLegacy);
8228   TestVseXX(0xf427,  // vse64.v v8, (x1), v0.t
8229             {},
8230             {},
8231             {},
8232             {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
8233              {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
8234              {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
8235              {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938},
8236              {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
8237              {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
8238              {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
8239              {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}},
8240             3,
8241             kVectorCalculationsSourceLegacy);
8242 }
8243 
TEST_F(Riscv64InterpreterTest,TestVleXX)8244 TEST_F(Riscv64InterpreterTest, TestVleXX) {
8245   TestVleXX(0x8407,  // vle8.v v8, (x1), v0.t
8246             {{0, 129, 2, 131, 4, 133, 6, 135, 8, 137, 10, 139, 12, 141, 14, 143},
8247              {16, 145, 18, 147, 20, 149, 22, 151, 24, 153, 26, 155, 28, 157, 30, 159},
8248              {32, 161, 34, 163, 36, 165, 38, 167, 40, 169, 42, 171, 44, 173, 46, 175},
8249              {48, 177, 50, 179, 52, 181, 54, 183, 56, 185, 58, 187, 60, 189, 62, 191},
8250              {64, 193, 66, 195, 68, 197, 70, 199, 72, 201, 74, 203, 76, 205, 78, 207},
8251              {80, 209, 82, 211, 84, 213, 86, 215, 88, 217, 90, 219, 92, 221, 94, 223},
8252              {96, 225, 98, 227, 100, 229, 102, 231, 104, 233, 106, 235, 108, 237, 110, 239},
8253              {112, 241, 114, 243, 116, 245, 118, 247, 120, 249, 122, 251, 124, 253, 126, 255}},
8254             {},
8255             {},
8256             {},
8257             0,
8258             kVectorCalculationsSourceLegacy);
8259   TestVleXX(0xd407,  // vle16.v v8, (x1), v0.t
8260             {},
8261             {{0x8100, 0x8302, 0x8504, 0x8706, 0x8908, 0x8b0a, 0x8d0c, 0x8f0e},
8262              {0x9110, 0x9312, 0x9514, 0x9716, 0x9918, 0x9b1a, 0x9d1c, 0x9f1e},
8263              {0xa120, 0xa322, 0xa524, 0xa726, 0xa928, 0xab2a, 0xad2c, 0xaf2e},
8264              {0xb130, 0xb332, 0xb534, 0xb736, 0xb938, 0xbb3a, 0xbd3c, 0xbf3e},
8265              {0xc140, 0xc342, 0xc544, 0xc746, 0xc948, 0xcb4a, 0xcd4c, 0xcf4e},
8266              {0xd150, 0xd352, 0xd554, 0xd756, 0xd958, 0xdb5a, 0xdd5c, 0xdf5e},
8267              {0xe160, 0xe362, 0xe564, 0xe766, 0xe968, 0xeb6a, 0xed6c, 0xef6e},
8268              {0xf170, 0xf372, 0xf574, 0xf776, 0xf978, 0xfb7a, 0xfd7c, 0xff7e}},
8269             {},
8270             {},
8271             1,
8272             kVectorCalculationsSourceLegacy);
8273   TestVleXX(0xe407,  // vle32.v v8, (x1), v0.t
8274             {},
8275             {},
8276             {{0x8302'8100, 0x8706'8504, 0x8b0a'8908, 0x8f0e'8d0c},
8277              {0x9312'9110, 0x9716'9514, 0x9b1a'9918, 0x9f1e'9d1c},
8278              {0xa322'a120, 0xa726'a524, 0xab2a'a928, 0xaf2e'ad2c},
8279              {0xb332'b130, 0xb736'b534, 0xbb3a'b938, 0xbf3e'bd3c},
8280              {0xc342'c140, 0xc746'c544, 0xcb4a'c948, 0xcf4e'cd4c},
8281              {0xd352'd150, 0xd756'd554, 0xdb5a'd958, 0xdf5e'dd5c},
8282              {0xe362'e160, 0xe766'e564, 0xeb6a'e968, 0xef6e'ed6c},
8283              {0xf372'f170, 0xf776'f574, 0xfb7a'f978, 0xff7e'fd7c}},
8284             {},
8285             2,
8286             kVectorCalculationsSourceLegacy);
8287   TestVleXX(0xf407,  // vle64.v v8, (x1), v0.t
8288             {},
8289             {},
8290             {},
8291             {{0x8706'8504'8302'8100, 0x8f0e'8d0c'8b0a'8908},
8292              {0x9716'9514'9312'9110, 0x9f1e'9d1c'9b1a'9918},
8293              {0xa726'a524'a322'a120, 0xaf2e'ad2c'ab2a'a928},
8294              {0xb736'b534'b332'b130, 0xbf3e'bd3c'bb3a'b938},
8295              {0xc746'c544'c342'c140, 0xcf4e'cd4c'cb4a'c948},
8296              {0xd756'd554'd352'd150, 0xdf5e'dd5c'db5a'd958},
8297              {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968},
8298              {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}},
8299             3,
8300             kVectorCalculationsSourceLegacy);
8301 }
8302 
TEST_F(Riscv64InterpreterTest,TestVleXXff)8303 TEST_F(Riscv64InterpreterTest, TestVleXXff) {
8304   TestVleXXff(0x1008407, 6, 0, 6);  // vle8ff.v v8, (x1), v0.t
8305   TestVleXXff(0x1008407, 8, 0, 8);
8306   TestVleXXff(0x1008407, 16, 0, 16);
8307   TestVleXXff(0x1008407, 32, 0, 32);
8308   TestVleXXff(0x1008407, 255, 0, 128);  // All 128 bytes accessible.
8309 
8310   TestVleXXff(0x100d407, 6, 1, 3);  // vle16ff.v v8, (x1), v0.t
8311   TestVleXXff(0x100d407, 8, 1, 4);
8312   TestVleXXff(0x100d407, 16, 1, 8);
8313   TestVleXXff(0x100d407, 32, 1, 16);
8314 
8315   TestVleXXff(0x100e407, 6, 2, 1);  // vle32ff.v v8, (x1), v0.t
8316   TestVleXXff(0x100e407, 8, 2, 2);
8317   TestVleXXff(0x100e407, 16, 2, 4);
8318   TestVleXXff(0x100e407, 32, 2, 8);
8319   TestVleXXff(0x100e407, 64, 2, 16);
8320 
8321   TestVleXXff(0x100f407, 8, 3, 1);  // vle64ff.v v8, (x1), v0.t
8322   TestVleXXff(0x100f407, 16, 3, 2);
8323   TestVleXXff(0x100f407, 32, 3, 4);
8324   TestVleXXff(0x100f407, 64, 3, 8);
8325 
8326   TestVleXXff(0x100f407, 6, 3, 16, true);  // Should raise exception and not change VL
8327 }
8328 
TEST_F(Riscv64InterpreterTest,TestVcpopm)8329 TEST_F(Riscv64InterpreterTest, TestVcpopm) {
8330   TestVXmXXsInstruction(
8331       0x410820d7,  // vcpop.m x1, v16, v0.t
8332       { 0, /* default value when vl=0 */
8333         0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  2,
8334         2,  3,  3,  3,  3,  3,  3,  3,  4,  5,  5,  5,  5,  5,  5,  6,
8335         6,  6,  7,  7,  7,  7,  7,  7,  8,  8,  9,  9,  9,  9,  9, 10,
8336        10, 11, 12, 12, 12, 12, 12, 12, 13, 14, 15, 15, 15, 15, 15, 16,
8337        16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20,
8338        20, 21, 21, 22, 22, 22, 22, 22, 23, 24, 24, 25, 25, 25, 25, 26,
8339        26, 26, 27, 28, 28, 28, 28, 28, 29, 29, 30, 31, 31, 31, 31, 32,
8340        32, 33, 34, 35, 35, 35, 35, 35, 36, 37, 38, 39, 39, 39, 39, 40},
8341       { 0, /* default value when vl=0 */
8342         0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  2,
8343         2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  5,
8344         5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  8,
8345         8,  8,  9,  9,  9,  9,  9,  9, 10, 10, 11, 11, 11, 11, 11, 12,
8346        12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14,
8347        14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 17, 17, 17, 17, 18,
8348        18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 21, 21, 21, 21, 21, 21,
8349        21, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 25, 25, 25, 25, 25},
8350       kVectorCalculationsSourceLegacy[0]);
8351 }
8352 
TEST_F(Riscv64InterpreterTest,TestVfirstm)8353 TEST_F(Riscv64InterpreterTest, TestVfirstm) {
8354   TestVXmXXsInstruction(
8355       0x4108a0d7,  // vfirst.m x1, v16, v0.t
8356       { [0 ... 8] = ~0ULL,
8357         [9 ... 128] = 8 },
8358       { [0 ... 8] = ~0ULL,
8359         [9 ... 128] = 8 },
8360       kVectorCalculationsSourceLegacy[0]);
8361 }
8362 
8363 // For Vrgather the expectations for different VLMULs are very different, i.e. different vlmax
8364 // values produce different results for the same src. So we have to call each of them explicitly.
8365 // To produce none-all-zero expected_results, all registers index vectors(v24) have first half
8366 // masked to have valid indexes (< vlmax); x1 is masked to be < vlmax; uimm is accordingly to be 0,
8367 // 1 or 3.
TEST_F(Riscv64InterpreterTest,TestVrgather)8368 TEST_F(Riscv64InterpreterTest, TestVrgather) {
8369   // VLMUL = 0
8370   TestVectorRegisterGather(0x310c0457,  // vrgather.vv v8,v16,v24,v0.t
8371                            {{0, 2, 4, 6, 137, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0},
8372                             {0, 2, 4, 6, 137, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0},
8373                             {0, 2, 4, 6, 137, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0},
8374                             {0, 2, 4, 6, 137, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0},
8375                             {0, 2, 4, 6, 137, 10, 12, 14, 0, 2, 0, 6, 0, 10, 0, 14},
8376                             {0, 2, 4, 6, 137, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0},
8377                             {0, 2, 4, 6, 137, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0},
8378                             {0, 2, 4, 6, 137, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0}},
8379                            {{0x8100, 0x8908, 0x8302, 0x8908, 0x0000, 0x0000, 0x0000, 0x0000},
8380                             {0x8100, 0x8908, 0x8302, 0x8908, 0x0000, 0x0000, 0x0000, 0x0000},
8381                             {0x8100, 0x8908, 0x8302, 0x8908, 0x0000, 0x0000, 0x0000, 0x0000},
8382                             {0x8100, 0x8908, 0x8302, 0x8908, 0x0000, 0x0000, 0x0000, 0x0000},
8383                             {0x8100, 0x8908, 0x8302, 0x8908, 0x0000, 0x0000, 0x0000, 0x0000},
8384                             {0x8100, 0x8908, 0x8302, 0x8908, 0x0000, 0x0000, 0x0000, 0x0000},
8385                             {0x8100, 0x8908, 0x8302, 0x8908, 0x0000, 0x0000, 0x0000, 0x0000},
8386                             {0x8100, 0x8908, 0x8302, 0x8908, 0x0000, 0x0000, 0x0000, 0x0000}},
8387                            {{0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8388                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8389                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8390                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8391                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8392                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8393                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8394                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000}},
8395                            {{0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8396                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8397                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8398                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8399                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8400                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8401                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8402                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000}},
8403                            /*vlmul=*/0,
8404                            kVectorCalculationsSource);
8405 
8406   TestVectorRegisterGather(0x3100c457,  // vrgather.vx v8,v16,x1,v0.t
8407                            {{10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8408                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8409                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8410                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8411                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8412                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8413                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8414                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}},
8415                            {{0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
8416                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
8417                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
8418                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
8419                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
8420                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
8421                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
8422                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504}},
8423                            {{0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8424                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8425                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8426                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8427                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8428                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8429                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8430                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908}},
8431                            {{0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
8432                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
8433                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
8434                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
8435                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
8436                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
8437                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
8438                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100}},
8439                            /*vlmul=*/0,
8440                            kVectorCalculationsSource);
8441   TestVectorRegisterGather(
8442       0x3100b457,  // vrgather.vi v8,v16,1,v0.t
8443       {{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8444        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8445        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8446        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8447        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8448        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8449        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8450        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129}},
8451       {{0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8452        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8453        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8454        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8455        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8456        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8457        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8458        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302}},
8459       {{0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8460        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8461        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8462        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8463        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8464        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8465        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8466        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504}},
8467       {{0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8468        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8469        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8470        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8471        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8472        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8473        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8474        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908}},
8475       /*vlmul=*/0,
8476       kVectorCalculationsSource);
8477 
8478   // VLMUL = 1
8479   TestVectorRegisterGather(0x310c0457,  // vrgather.vv v8,v16,v24,v0.t
8480                            {{0, 18, 4, 22, 137, 26, 12, 30, 145, 0, 20, 0, 24, 0, 28, 0},
8481                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0},
8482                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0},
8483                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0},
8484                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 2, 0, 6, 0, 10, 0, 14},
8485                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0},
8486                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0},
8487                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0}},
8488                            {{0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8489                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8490                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8491                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8492                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8493                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8494                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8495                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000}},
8496                            {{0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8497                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8498                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8499                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8500                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8501                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8502                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8503                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000}},
8504                            {{0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8505                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8506                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8507                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8508                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8509                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8510                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8511                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000}},
8512                            /*vlmul=*/1,
8513                            kVectorCalculationsSource);
8514   TestVectorRegisterGather(0x3100c457,  // vrgather.vx v8,v16,x1,v0.t
8515                            {{10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8516                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8517                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8518                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8519                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8520                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8521                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
8522                             {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}},
8523                            {{0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8524                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8525                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8526                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8527                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8528                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8529                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8530                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514}},
8531                            {{0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8532                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8533                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8534                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8535                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8536                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8537                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908},
8538                             {0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908, 0x8b0a'8908}},
8539                            {{0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8540                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8541                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8542                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8543                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8544                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8545                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8546                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110}},
8547                            /*vlmul=*/1,
8548                            kVectorCalculationsSource);
8549   TestVectorRegisterGather(
8550       0x3100b457,  // vrgather.vi v8,v16,1,v0.t
8551       {{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8552        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8553        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8554        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8555        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8556        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8557        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8558        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129}},
8559       {{0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8560        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8561        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8562        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8563        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8564        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8565        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8566        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302}},
8567       {{0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8568        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8569        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8570        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8571        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8572        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8573        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8574        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504}},
8575       {{0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8576        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8577        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8578        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8579        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8580        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8581        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8582        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908}},
8583       /*vlmul=*/1,
8584       kVectorCalculationsSource);
8585 
8586   // VLMUL = 2
8587   TestVectorRegisterGather(0x310c0457,  // vrgather.vv v8,v16,v24,v0.t
8588                            {{0, 18, 4, 22, 137, 26, 12, 30, 145, 0, 20, 0, 24, 0, 28, 0},
8589                             {32, 50, 36, 54, 169, 58, 44, 62, 177, 0, 52, 0, 56, 0, 60, 0},
8590                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0},
8591                             {32, 50, 36, 54, 169, 58, 44, 62, 0, 0, 0, 0, 0, 0, 0, 0},
8592                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 2, 0, 6, 0, 10, 0, 14},
8593                             {32, 50, 36, 54, 169, 58, 44, 62, 0, 34, 0, 38, 0, 42, 0, 46},
8594                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0},
8595                             {32, 50, 36, 54, 169, 58, 44, 62, 0, 0, 0, 0, 0, 0, 0, 0}},
8596                            {{0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8597                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8598                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8599                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8600                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8601                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8602                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8603                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000}},
8604                            {{0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8605                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8606                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8607                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8608                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8609                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8610                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8611                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000}},
8612                            {{0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8613                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8614                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8615                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8616                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8617                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8618                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8619                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000}},
8620                            /*vlmul=*/2,
8621                            kVectorCalculationsSource);
8622   TestVectorRegisterGather(0x3100c457,  // vrgather.vx v8,v16,x1,v0.t
8623                            {{42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8624                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8625                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8626                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8627                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8628                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8629                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8630                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}},
8631                            {{0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8632                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8633                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8634                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8635                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8636                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8637                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514},
8638                             {0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514, 0x9514}},
8639                            {{0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8640                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8641                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8642                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8643                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8644                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8645                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8646                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928}},
8647                            {{0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8648                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8649                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8650                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8651                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8652                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8653                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110},
8654                             {0x9716'9514'9312'9110, 0x9716'9514'9312'9110}},
8655                            /*vlmul=*/2,
8656                            kVectorCalculationsSource);
8657   TestVectorRegisterGather(
8658       0x3100b457,  // vrgather.vi v8,v16,1,v0.t
8659       {{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8660        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8661        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8662        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8663        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8664        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8665        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8666        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129}},
8667       {{0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8668        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8669        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8670        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8671        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8672        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8673        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8674        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302}},
8675       {{0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8676        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8677        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8678        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8679        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8680        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8681        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
8682        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504}},
8683       {{0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8684        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8685        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8686        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8687        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8688        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8689        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908},
8690        {0x8f0e'8d0c'8b0a'8908, 0x8f0e'8d0c'8b0a'8908}},
8691       /*vlmul=*/2,
8692       kVectorCalculationsSource);
8693 
8694   // VLMUL = 3
8695   TestVectorRegisterGather(0x310c0457,  // vrgather.vv v8,v16,v24,v0.t
8696                            {{0, 18, 4, 22, 137, 26, 12, 30, 145, 0, 20, 0, 24, 0, 28, 0},
8697                             {32, 50, 36, 54, 169, 58, 44, 62, 177, 0, 52, 0, 56, 0, 60, 0},
8698                             {64, 82, 68, 86, 201, 90, 76, 94, 209, 0, 84, 0, 88, 0, 92, 0},
8699                             {96, 114, 100, 118, 233, 122, 108, 126, 241, 0, 116, 0, 120, 0, 124, 0},
8700                             {0, 18, 4, 22, 137, 26, 12, 30, 0, 2, 0, 6, 0, 10, 0, 14},
8701                             {32, 50, 36, 54, 169, 58, 44, 62, 0, 34, 0, 38, 0, 42, 0, 46},
8702                             {64, 82, 68, 86, 201, 90, 76, 94, 0, 66, 0, 70, 0, 74, 0, 78},
8703                             {96, 114, 100, 118, 233, 122, 108, 126, 0, 98, 0, 102, 0, 106, 0, 110}},
8704                            {{0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8705                             {0xc140, 0xc948, 0xd352, 0xd958, 0x0000, 0x0000, 0x0000, 0x0000},
8706                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8707                             {0xc140, 0xc948, 0xd352, 0xd958, 0x0000, 0x0000, 0x0000, 0x0000},
8708                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8709                             {0xc140, 0xc948, 0xd352, 0xd958, 0x0000, 0x0000, 0x0000, 0x0000},
8710                             {0x8100, 0x8908, 0x9312, 0x9918, 0x0000, 0x0000, 0x0000, 0x0000},
8711                             {0xc140, 0xc948, 0xd352, 0xd958, 0x0000, 0x0000, 0x0000, 0x0000}},
8712                            {{0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8713                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8714                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8715                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8716                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8717                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8718                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000},
8719                             {0x8302'8100, 0xa726'a524, 0x0000'0000, 0x0000'0000}},
8720                            {{0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8721                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8722                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8723                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8724                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8725                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8726                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8727                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000}},
8728                            /*vlmul=*/3,
8729                            kVectorCalculationsSource);
8730   TestVectorRegisterGather(0x3100c457,  // vrgather.vx v8,v16,x1,v0.t
8731                            {{42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8732                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8733                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8734                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8735                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8736                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8737                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42},
8738                             {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}},
8739                            {{0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554},
8740                             {0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554},
8741                             {0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554},
8742                             {0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554},
8743                             {0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554},
8744                             {0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554},
8745                             {0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554},
8746                             {0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554, 0xd554}},
8747                            {{0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8748                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8749                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8750                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8751                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8752                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8753                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928},
8754                             {0xab2a'a928, 0xab2a'a928, 0xab2a'a928, 0xab2a'a928}},
8755                            {{0xd756'd554'd352'd150, 0xd756'd554'd352'd150},
8756                             {0xd756'd554'd352'd150, 0xd756'd554'd352'd150},
8757                             {0xd756'd554'd352'd150, 0xd756'd554'd352'd150},
8758                             {0xd756'd554'd352'd150, 0xd756'd554'd352'd150},
8759                             {0xd756'd554'd352'd150, 0xd756'd554'd352'd150},
8760                             {0xd756'd554'd352'd150, 0xd756'd554'd352'd150},
8761                             {0xd756'd554'd352'd150, 0xd756'd554'd352'd150},
8762                             {0xd756'd554'd352'd150, 0xd756'd554'd352'd150}},
8763                            /*vlmul=*/3,
8764                            kVectorCalculationsSource);
8765   TestVectorRegisterGather(
8766       0x3101b457,  // vrgather.vi v8,v16,3,v0.t
8767       {{131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131},
8768        {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131},
8769        {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131},
8770        {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131},
8771        {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131},
8772        {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131},
8773        {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131},
8774        {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131}},
8775       {{0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706},
8776        {0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706},
8777        {0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706},
8778        {0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706},
8779        {0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706},
8780        {0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706},
8781        {0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706},
8782        {0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706, 0x8706}},
8783       {{0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c},
8784        {0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c},
8785        {0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c},
8786        {0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c},
8787        {0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c},
8788        {0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c},
8789        {0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c},
8790        {0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c, 0x8f0e'8d0c}},
8791       {{0x9f1e'9d1c'9b1a'9918, 0x9f1e'9d1c'9b1a'9918},
8792        {0x9f1e'9d1c'9b1a'9918, 0x9f1e'9d1c'9b1a'9918},
8793        {0x9f1e'9d1c'9b1a'9918, 0x9f1e'9d1c'9b1a'9918},
8794        {0x9f1e'9d1c'9b1a'9918, 0x9f1e'9d1c'9b1a'9918},
8795        {0x9f1e'9d1c'9b1a'9918, 0x9f1e'9d1c'9b1a'9918},
8796        {0x9f1e'9d1c'9b1a'9918, 0x9f1e'9d1c'9b1a'9918},
8797        {0x9f1e'9d1c'9b1a'9918, 0x9f1e'9d1c'9b1a'9918},
8798        {0x9f1e'9d1c'9b1a'9918, 0x9f1e'9d1c'9b1a'9918}},
8799       /*vlmul=*/3,
8800       kVectorCalculationsSource);
8801 
8802   // VLMUL = 5
8803   TestVectorRegisterGather(0x310c0457,  // vrgather.vv v8,v16,v24,v0.t
8804                            {{0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8805                             {0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8806                             {0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8807                             {0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8808                             {0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8809                             {0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8810                             {0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8811                             {0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
8812                            {{0x8100, 0x8100, 0x8100, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8813                             {0x8100, 0x8100, 0x8100, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8814                             {0x8100, 0x8100, 0x8100, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8815                             {0x8100, 0x8100, 0x8100, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8816                             {0x8100, 0x8100, 0x8100, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8817                             {0x8100, 0x8100, 0x8100, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8818                             {0x8100, 0x8100, 0x8100, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8819                             {0x8100, 0x8100, 0x8100, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000}},
8820                            {},
8821                            {},
8822                            /*vlmul=*/5,
8823                            kVectorCalculationsSource);
8824   TestVectorRegisterGather(0x3100c457,  // vrgather.vx v8,v16,x1,v0.t
8825                            {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8826                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8827                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8828                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8829                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8830                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8831                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8832                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
8833                            {{0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8834                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8835                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8836                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8837                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8838                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8839                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8840                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100}},
8841                            {},
8842                            {},
8843                            /*vlmul=*/5,
8844                            kVectorCalculationsSource);
8845   TestVectorRegisterGather(
8846       0x3100b457,  // vrgather.vi v8,v16,1,v0.t
8847       {{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8848        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8849        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8850        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8851        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8852        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8853        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8854        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129}},
8855       {{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
8856        {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
8857        {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
8858        {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
8859        {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
8860        {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
8861        {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
8862        {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
8863       {},
8864       {},
8865       /*vlmul=*/5,
8866       kVectorCalculationsSource);
8867 
8868   // VLMUL = 6
8869   TestVectorRegisterGather(0x310c0457,  // vrgather.vv v8,v16,v24,v0.t
8870                            {{0, 2, 0, 2, 129, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0},
8871                             {0, 2, 0, 2, 129, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0},
8872                             {0, 2, 0, 2, 129, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0},
8873                             {0, 2, 0, 2, 129, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0},
8874                             {0, 2, 0, 2, 129, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0},
8875                             {0, 2, 0, 2, 129, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0},
8876                             {0, 2, 0, 2, 129, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0},
8877                             {0, 2, 0, 2, 129, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0}},
8878                            {{0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8879                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8880                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8881                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8882                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8883                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8884                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8885                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000}},
8886                            {{0x8302'8100, 0x8302'8100, 0x0000'0000, 0x0000'0000},
8887                             {0x8302'8100, 0x8302'8100, 0x0000'0000, 0x0000'0000},
8888                             {0x8302'8100, 0x8302'8100, 0x0000'0000, 0x0000'0000},
8889                             {0x8302'8100, 0x8302'8100, 0x0000'0000, 0x0000'0000},
8890                             {0x8302'8100, 0x8302'8100, 0x0000'0000, 0x0000'0000},
8891                             {0x8302'8100, 0x8302'8100, 0x0000'0000, 0x0000'0000},
8892                             {0x8302'8100, 0x8302'8100, 0x0000'0000, 0x0000'0000},
8893                             {0x8302'8100, 0x8302'8100, 0x0000'0000, 0x0000'0000}},
8894                            {},
8895                            /*vlmul=*/6,
8896                            kVectorCalculationsSource);
8897   TestVectorRegisterGather(0x3100c457,  // vrgather.vx v8,v16,x1,v0.t
8898                            {{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8899                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8900                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8901                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8902                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8903                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8904                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8905                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}},
8906                            {{0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8907                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8908                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8909                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8910                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8911                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8912                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100},
8913                             {0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100, 0x8100}},
8914                            {{0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
8915                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
8916                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
8917                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
8918                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
8919                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
8920                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
8921                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100}},
8922                            {},
8923                            /*vlmul=*/6,
8924                            kVectorCalculationsSource);
8925   TestVectorRegisterGather(
8926       0x3100b457,  // vrgather.vi v8,v16,1,v0.t
8927       {{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8928        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8929        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8930        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8931        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8932        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8933        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
8934        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129}},
8935       {{0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8936        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8937        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8938        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8939        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8940        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8941        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
8942        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302}},
8943       {{0x0000'0000, 0x0000'0000, 0x0000'0000, 0x0000'0000},
8944        {0x0000'0000, 0x0000'0000, 0x0000'0000, 0x0000'0000},
8945        {0x0000'0000, 0x0000'0000, 0x0000'0000, 0x0000'0000},
8946        {0x0000'0000, 0x0000'0000, 0x0000'0000, 0x0000'0000},
8947        {0x0000'0000, 0x0000'0000, 0x0000'0000, 0x0000'0000},
8948        {0x0000'0000, 0x0000'0000, 0x0000'0000, 0x0000'0000},
8949        {0x0000'0000, 0x0000'0000, 0x0000'0000, 0x0000'0000},
8950        {0x0000'0000, 0x0000'0000, 0x0000'0000, 0x0000'0000}},
8951       {},
8952       /*vlmul=*/6,
8953       kVectorCalculationsSource);
8954 
8955   // VLMUL = 7
8956   TestVectorRegisterGather(0x310c0457,  // vrgather.vv v8,v16,v24,v0.t
8957                            {{0, 2, 4, 6, 129, 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0},
8958                             {0, 2, 4, 6, 129, 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0},
8959                             {0, 2, 4, 6, 129, 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0},
8960                             {0, 2, 4, 6, 129, 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0},
8961                             {0, 2, 4, 6, 129, 2, 4, 6, 0, 2, 0, 6, 0, 0, 0, 0},
8962                             {0, 2, 4, 6, 129, 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0},
8963                             {0, 2, 4, 6, 129, 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0},
8964                             {0, 2, 4, 6, 129, 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0}},
8965                            {{0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8966                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8967                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8968                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8969                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8970                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8971                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000},
8972                             {0x8100, 0x8100, 0x8302, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000}},
8973                            {{0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8974                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8975                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8976                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8977                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8978                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8979                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000},
8980                             {0x8302'8100, 0x8706'8504, 0x0000'0000, 0x0000'0000}},
8981                            {{0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8982                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8983                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8984                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8985                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8986                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8987                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000},
8988                             {0x8706'8504'8302'8100, 0x0000'0000'0000'0000}},
8989                            /*vlmul=*/7,
8990                            kVectorCalculationsSource);
8991   TestVectorRegisterGather(0x3100c457,  // vrgather.vx v8,v16,x1,v0.t
8992                            {{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8993                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8994                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8995                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8996                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8997                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8998                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
8999                             {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}},
9000                            {{0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
9001                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
9002                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
9003                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
9004                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
9005                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
9006                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504},
9007                             {0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504, 0x8504}},
9008                            {{0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
9009                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
9010                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
9011                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
9012                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
9013                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
9014                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100},
9015                             {0x8302'8100, 0x8302'8100, 0x8302'8100, 0x8302'8100}},
9016                            {{0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
9017                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
9018                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
9019                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
9020                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
9021                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
9022                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100},
9023                             {0x8706'8504'8302'8100, 0x8706'8504'8302'8100}},
9024                            /*vlmul=*/7,
9025                            kVectorCalculationsSource);
9026   TestVectorRegisterGather(
9027       0x3100b457,  // vrgather.vi v8,v16,1,v0.t
9028       {{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
9029        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
9030        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
9031        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
9032        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
9033        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
9034        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129},
9035        {129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129}},
9036       {{0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
9037        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
9038        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
9039        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
9040        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
9041        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
9042        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302},
9043        {0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302, 0x8302}},
9044       {{0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
9045        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
9046        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
9047        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
9048        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
9049        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
9050        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504},
9051        {0x8706'8504, 0x8706'8504, 0x8706'8504, 0x8706'8504}},
9052       {{0x0000'0000'0000'0000, 0x0000'0000'0000'0000},
9053        {0x0000'0000'0000'0000, 0x0000'0000'0000'0000},
9054        {0x0000'0000'0000'0000, 0x0000'0000'0000'0000},
9055        {0x0000'0000'0000'0000, 0x0000'0000'0000'0000},
9056        {0x0000'0000'0000'0000, 0x0000'0000'0000'0000},
9057        {0x0000'0000'0000'0000, 0x0000'0000'0000'0000},
9058        {0x0000'0000'0000'0000, 0x0000'0000'0000'0000},
9059        {0x0000'0000'0000'0000, 0x0000'0000'0000'0000}},
9060       /*vlmul=*/7,
9061       kVectorCalculationsSource);
9062 }
9063 
TEST_F(Riscv64InterpreterTest,TestVadc)9064 TEST_F(Riscv64InterpreterTest, TestVadc) {
9065   TestVectorCarryInstruction(
9066       0x410c0457,  //  vadc.vvm v8,v16,v24,v0
9067       {{1, 19, 7, 26, 13, 32, 18, 38, 26, 11, 31, 17, 37, 24, 42, 30},
9068        {49, 68, 54, 74, 61, 80, 67, 85, 74, 59, 79, 66, 84, 72, 90, 78},
9069        {97, 115, 103, 121, 110, 128, 114, 134, 121, 108, 127, 113, 133, 119, 139, 126},
9070        {145, 163, 151, 170, 157, 176, 162, 182, 170, 155, 175, 161, 181, 167, 187, 174},
9071        {193, 211, 199, 217, 206, 224, 210, 230, 218, 204, 222, 210, 229, 216, 235, 221},
9072        {241, 3, 247, 10, 253, 16, 3, 22, 9, 252, 15, 2, 21, 7, 27, 14},
9073        {33, 52, 38, 58, 46, 64, 50, 70, 58, 44, 63, 49, 69, 55, 75, 61},
9074        {81, 100, 87, 105, 94, 112, 99, 118, 105, 92, 110, 98, 116, 104, 123, 109}},
9075       {{0x1301, 0x1906, 0x1f0e, 0x2513, 0x0b19, 0x111f, 0x1724, 0x1d2b},
9076        {0x4331, 0x4936, 0x4f3e, 0x5542, 0x3b4a, 0x414f, 0x4754, 0x4d5b},
9077        {0x7361, 0x7967, 0x7f6d, 0x8573, 0x6b79, 0x717f, 0x7785, 0x7d8a},
9078        {0xa391, 0xa996, 0xaf9e, 0xb5a3, 0x9ba9, 0xa1af, 0xa7b4, 0xadbb},
9079        {0xd3c1, 0xd9c6, 0xdfce, 0xe5d2, 0xcbda, 0xd1df, 0xd7e4, 0xddeb},
9080        {0x03f0, 0x09f7, 0x0ffe, 0x1602, 0xfc0a, 0x020e, 0x0815, 0x0e1b},
9081        {0x3421, 0x3a26, 0x402e, 0x4633, 0x2c39, 0x323f, 0x3844, 0x3e4b},
9082        {0x6451, 0x6a56, 0x705e, 0x7662, 0x5c6a, 0x626e, 0x6875, 0x6e7b}},
9083       {{0x1907'1301, 0x2513'1f0d, 0x111f'0b1a, 0x1d2b'1725},
9084        {0x4937'4330, 0x5543'4f3e, 0x414f'3b49, 0x4d5b'4755},
9085        {0x7967'7361, 0x8573'7f6d, 0x717f'6b7a, 0x7d8b'7784},
9086        {0xa997'a391, 0xb5a3'af9e, 0xa1af'9ba9, 0xadbb'a7b5},
9087        {0xd9c6'd3c1, 0xe5d2'dfce, 0xd1de'cbd9, 0xddea'd7e5},
9088        {0x09f7'03f0, 0x1603'0ffe, 0x020e'fc0a, 0x0e1b'0814},
9089        {0x3a27'3421, 0x4633'402d, 0x323f'2c3a, 0x3e4b'3845},
9090        {0x6a57'6450, 0x7663'705e, 0x626f'5c69, 0x6e7b'6875}},
9091       {{0x2513'1f0e'1907'1301, 0x1d2b'1725'111f'0b19},
9092        {0x5543'4f3e'4937'4331, 0x4d5b'4755'414f'3b4a},
9093        {0x8573'7f6e'7967'7360, 0x7d8b'7785'717f'6b7a},
9094        {0xb5a3'af9e'a997'a390, 0xadbb'a7b5'a1af'9baa},
9095        {0xe5d2'dfcd'd9c6'd3c1, 0xddea'd7e4'd1de'cbd9},
9096        {0x1603'0ffe'09f7'03f1, 0x0e1b'0815'020e'fc09},
9097        {0x4633'402e'3a27'3421, 0x3e4b'3845'323f'2c3a},
9098        {0x7663'705e'6a57'6450, 0x6e7b'6875'626f'5c6a}},
9099       kVectorCalculationsSource);
9100 
9101   TestVectorCarryInstruction(
9102       0x4100c457,  // vadc.vxm	v8,v16,x1,v0
9103       {{171, 43, 173, 46, 174, 48, 176, 50, 179, 51, 181, 53, 183, 56, 184, 58},
9104        {187, 60, 188, 62, 190, 64, 193, 65, 195, 67, 197, 70, 198, 72, 200, 74},
9105        {203, 75, 205, 77, 207, 80, 208, 82, 210, 84, 213, 85, 215, 87, 217, 90},
9106        {219, 91, 221, 94, 222, 96, 224, 98, 227, 99, 229, 101, 231, 103, 233, 106},
9107        {235, 107, 237, 109, 239, 112, 240, 114, 243, 116, 244, 118, 247, 120, 249, 121},
9108        {251, 123, 253, 126, 254, 128, 1, 130, 2, 132, 5, 134, 7, 135, 9, 138},
9109        {11, 140, 12, 142, 15, 144, 16, 146, 19, 148, 21, 149, 23, 151, 25, 153},
9110        {27, 156, 29, 157, 31, 160, 33, 162, 34, 164, 36, 166, 38, 168, 41, 169}},
9111       {{0x2bab, 0x2dac, 0x2faf, 0x31b1, 0x33b2, 0x35b5, 0x37b6, 0x39b9},
9112        {0x3bbb, 0x3dbc, 0x3fbf, 0x41c0, 0x43c3, 0x45c5, 0x47c6, 0x49c9},
9113        {0x4bcb, 0x4dcd, 0x4fce, 0x51d1, 0x53d2, 0x55d5, 0x57d7, 0x59d8},
9114        {0x5bdb, 0x5ddc, 0x5fdf, 0x61e1, 0x63e2, 0x65e5, 0x67e6, 0x69e9},
9115        {0x6beb, 0x6dec, 0x6fef, 0x71f0, 0x73f3, 0x75f5, 0x77f6, 0x79f9},
9116        {0x7bfa, 0x7dfd, 0x7fff, 0x8200, 0x8403, 0x8604, 0x8807, 0x8a09},
9117        {0x8c0b, 0x8e0c, 0x900f, 0x9211, 0x9412, 0x9615, 0x9816, 0x9a19},
9118        {0x9c1b, 0x9e1c, 0xa01f, 0xa220, 0xa423, 0xa624, 0xa827, 0xaa29}},
9119       {{0x2dad'2bab, 0x31b1'2fae, 0x35b5'33b3, 0x39b9'37b7},
9120        {0x3dbd'3bba, 0x41c1'3fbf, 0x45c5'43c2, 0x49c9'47c7},
9121        {0x4dcd'4bcb, 0x51d1'4fce, 0x55d5'53d3, 0x59d9'57d6},
9122        {0x5ddd'5bdb, 0x61e1'5fdf, 0x65e5'63e2, 0x69e9'67e7},
9123        {0x6ded'6beb, 0x71f1'6fef, 0x75f5'73f2, 0x79f9'77f7},
9124        {0x7dfd'7bfa, 0x8201'7fff, 0x8605'8403, 0x8a09'8806},
9125        {0x8e0d'8c0b, 0x9211'900e, 0x9615'9413, 0x9a19'9817},
9126        {0x9e1d'9c1a, 0xa221'a01f, 0xa625'a422, 0xaa29'a827}},
9127       {{0x31b1'2faf'2dad'2bab, 0x39b9'37b7'35b5'33b2},
9128        {0x41c1'3fbf'3dbd'3bbb, 0x49c9'47c7'45c5'43c3},
9129        {0x51d1'4fcf'4dcd'4bca, 0x59d9'57d7'55d5'53d3},
9130        {0x61e1'5fdf'5ddd'5bda, 0x69e9'67e7'65e5'63e3},
9131        {0x71f1'6fef'6ded'6beb, 0x79f9'77f7'75f5'73f2},
9132        {0x8201'7fff'7dfd'7bfb, 0x8a09'8807'8605'8402},
9133        {0x9211'900f'8e0d'8c0b, 0x9a19'9817'9615'9413},
9134        {0xa221'a01f'9e1d'9c1a, 0xaa29'a827'a625'a423}},
9135       kVectorCalculationsSource);
9136 
9137   TestVectorCarryInstruction(
9138       0x4105b457,  // vadc.vim v8,v16,0xb,v0
9139       {{12, 140, 14, 143, 15, 145, 17, 147, 20, 148, 22, 150, 24, 153, 25, 155},
9140        {28, 157, 29, 159, 31, 161, 34, 162, 36, 164, 38, 167, 39, 169, 41, 171},
9141        {44, 172, 46, 174, 48, 177, 49, 179, 51, 181, 54, 182, 56, 184, 58, 187},
9142        {60, 188, 62, 191, 63, 193, 65, 195, 68, 196, 70, 198, 72, 200, 74, 203},
9143        {76, 204, 78, 206, 80, 209, 81, 211, 84, 213, 85, 215, 88, 217, 90, 218},
9144        {92, 220, 94, 223, 95, 225, 98, 227, 99, 229, 102, 231, 104, 232, 106, 235},
9145        {108, 237, 109, 239, 112, 241, 113, 243, 116, 245, 118, 246, 120, 248, 122, 250},
9146        {124, 253, 126, 254, 128, 1, 130, 3, 131, 5, 133, 7, 135, 9, 138, 10}},
9147       {{0x810c, 0x830d, 0x8510, 0x8712, 0x8913, 0x8b16, 0x8d17, 0x8f1a},
9148        {0x911c, 0x931d, 0x9520, 0x9721, 0x9924, 0x9b26, 0x9d27, 0x9f2a},
9149        {0xa12c, 0xa32e, 0xa52f, 0xa732, 0xa933, 0xab36, 0xad38, 0xaf39},
9150        {0xb13c, 0xb33d, 0xb540, 0xb742, 0xb943, 0xbb46, 0xbd47, 0xbf4a},
9151        {0xc14c, 0xc34d, 0xc550, 0xc751, 0xc954, 0xcb56, 0xcd57, 0xcf5a},
9152        {0xd15b, 0xd35e, 0xd560, 0xd761, 0xd964, 0xdb65, 0xdd68, 0xdf6a},
9153        {0xe16c, 0xe36d, 0xe570, 0xe772, 0xe973, 0xeb76, 0xed77, 0xef7a},
9154        {0xf17c, 0xf37d, 0xf580, 0xf781, 0xf984, 0xfb85, 0xfd88, 0xff8a}},
9155       {{0x8302'810c, 0x8706'850f, 0x8b0a'8914, 0x8f0e'8d18},
9156        {0x9312'911b, 0x9716'9520, 0x9b1a'9923, 0x9f1e'9d28},
9157        {0xa322'a12c, 0xa726'a52f, 0xab2a'a934, 0xaf2e'ad37},
9158        {0xb332'b13c, 0xb736'b540, 0xbb3a'b943, 0xbf3e'bd48},
9159        {0xc342'c14c, 0xc746'c550, 0xcb4a'c953, 0xcf4e'cd58},
9160        {0xd352'd15b, 0xd756'd560, 0xdb5a'd964, 0xdf5e'dd67},
9161        {0xe362'e16c, 0xe766'e56f, 0xeb6a'e974, 0xef6e'ed78},
9162        {0xf372'f17b, 0xf776'f580, 0xfb7a'f983, 0xff7e'fd88}},
9163       {{0x8706'8504'8302'810c, 0x8f0e'8d0c'8b0a'8913},
9164        {0x9716'9514'9312'911c, 0x9f1e'9d1c'9b1a'9924},
9165        {0xa726'a524'a322'a12b, 0xaf2e'ad2c'ab2a'a934},
9166        {0xb736'b534'b332'b13b, 0xbf3e'bd3c'bb3a'b944},
9167        {0xc746'c544'c342'c14c, 0xcf4e'cd4c'cb4a'c953},
9168        {0xd756'd554'd352'd15c, 0xdf5e'dd5c'db5a'd963},
9169        {0xe766'e564'e362'e16c, 0xef6e'ed6c'eb6a'e974},
9170        {0xf776'f574'f372'f17b, 0xff7e'fd7c'fb7a'f984}},
9171       kVectorCalculationsSource);
9172 }
9173 
TEST_F(Riscv64InterpreterTest,TestVsbc)9174 TEST_F(Riscv64InterpreterTest, TestVsbc) {
9175   TestVectorCarryInstruction(
9176       0x490c0457,  // vsb.vvm	v8,v16,v24,v0
9177       {{255, 17, 1, 18, 5, 20, 6, 22, 8, 249, 9, 251, 11, 252, 14, 254},
9178        {15, 32, 18, 34, 21, 36, 21, 39, 24, 9, 25, 10, 28, 12, 30, 14},
9179        {31, 49, 33, 51, 36, 52, 38, 54, 41, 24, 41, 27, 43, 29, 45, 30},
9180        {47, 65, 49, 66, 53, 68, 54, 70, 56, 41, 57, 43, 59, 45, 61, 46},
9181        {63, 81, 65, 83, 68, 84, 70, 86, 72, 56, 74, 58, 75, 60, 77, 63},
9182        {79, 97, 81, 98, 85, 100, 85, 102, 89, 72, 89, 74, 91, 77, 93, 78},
9183        {95, 112, 98, 114, 100, 116, 102, 118, 104, 88, 105, 91, 107, 93, 109, 95},
9184        {111, 128, 113, 131, 116, 132, 117, 134, 121, 104, 122, 106, 124, 108, 125, 111}},
9185       {{0x10ff, 0x1302, 0x1504, 0x1705, 0xf909, 0xfb09, 0xfd0c, 0xff0d},
9186        {0x210f, 0x2312, 0x2514, 0x2716, 0x0918, 0x0b19, 0x0d1c, 0x0f1d},
9187        {0x311f, 0x3321, 0x3525, 0x3725, 0x1929, 0x1b29, 0x1d2b, 0x1f2e},
9188        {0x412f, 0x4332, 0x4534, 0x4735, 0x2939, 0x2b39, 0x2d3c, 0x2f3d},
9189        {0x513f, 0x5342, 0x5544, 0x5746, 0x3948, 0x3b49, 0x3d4c, 0x3f4d},
9190        {0x6150, 0x6351, 0x6554, 0x6756, 0x4958, 0x4b5a, 0x4d5b, 0x4f5d},
9191        {0x715f, 0x7362, 0x7564, 0x7765, 0x5969, 0x5b69, 0x5d6c, 0x5f6d},
9192        {0x816f, 0x8372, 0x8574, 0x8776, 0x6978, 0x6b7a, 0x6d7b, 0x6f7d}},
9193       {{0x1302'10ff, 0x1706'1505, 0xfb09'f908, 0xff0d'fd0b},
9194        {0x2312'2110, 0x2716'2514, 0x0b1a'0919, 0x0f1e'0d1b},
9195        {0x3322'311f, 0x3726'3525, 0x1b2a'1928, 0x1f2e'1d2c},
9196        {0x4332'412f, 0x4736'4534, 0x2b3a'2939, 0x2f3e'2d3b},
9197        {0x5341'513f, 0x5745'5544, 0x3b49'3949, 0x3f4d'3d4b},
9198        {0x6351'6150, 0x6755'6554, 0x4b59'4958, 0x4f5d'4d5c},
9199        {0x7361'715f, 0x7765'7565, 0x5b69'5968, 0x5f6d'5d6b},
9200        {0x8371'8170, 0x8775'8574, 0x6b79'6979, 0x6f7d'6d7b}},
9201       {{0x1706'1505'1302'10ff, 0xff0d'fd0b'fb09'f909},
9202        {0x2716'2515'2312'210f, 0x0f1e'0d1c'0b1a'0918},
9203        {0x3726'3525'3322'3120, 0x1f2e'1d2c'1b2a'1928},
9204        {0x4736'4535'4332'4130, 0x2f3e'2d3c'2b3a'2938},
9205        {0x5745'5544'5341'513f, 0x3f4d'3d4b'3b49'3949},
9206        {0x6755'6554'6351'614f, 0x4f5d'4d5b'4b59'4959},
9207        {0x7765'7564'7361'715f, 0x5f6d'5d6b'5b69'5968},
9208        {0x8775'8574'8371'8170, 0x6f7d'6d7b'6b79'6978}},
9209       kVectorCalculationsSource);
9210 
9211   TestVectorCarryInstruction(
9212       0x4900c457,  // vsbc.vxm	v8,v16,x1,v0
9213       {{169, 41, 167, 38, 166, 36, 164, 34, 161, 33, 159, 31, 157, 28, 156, 26},
9214        {153, 24, 152, 22, 150, 20, 147, 19, 145, 17, 143, 14, 142, 12, 140, 10},
9215        {137, 9, 135, 7, 133, 4, 132, 2, 130, 0, 127, 255, 125, 253, 123, 250},
9216        {121, 249, 119, 246, 118, 244, 116, 242, 113, 241, 111, 239, 109, 237, 107, 234},
9217        {105, 233, 103, 231, 101, 228, 100, 226, 97, 224, 96, 222, 93, 220, 91, 219},
9218        {89, 217, 87, 214, 86, 212, 83, 210, 82, 208, 79, 206, 77, 205, 75, 202},
9219        {73, 200, 72, 198, 69, 196, 68, 194, 65, 192, 63, 191, 61, 189, 59, 187},
9220        {57, 184, 55, 183, 53, 180, 51, 178, 50, 176, 48, 174, 46, 172, 43, 171}},
9221       {{0x29a9, 0x27a8, 0x25a5, 0x23a3, 0x21a2, 0x1f9f, 0x1d9e, 0x1b9b},
9222        {0x1999, 0x1798, 0x1595, 0x1394, 0x1191, 0x0f8f, 0x0d8e, 0x0b8b},
9223        {0x0989, 0x0787, 0x0586, 0x0383, 0x0182, 0xff7f, 0xfd7d, 0xfb7c},
9224        {0xf979, 0xf778, 0xf575, 0xf373, 0xf172, 0xef6f, 0xed6e, 0xeb6b},
9225        {0xe969, 0xe768, 0xe565, 0xe364, 0xe161, 0xdf5f, 0xdd5e, 0xdb5b},
9226        {0xd95a, 0xd757, 0xd555, 0xd354, 0xd151, 0xcf50, 0xcd4d, 0xcb4b},
9227        {0xc949, 0xc748, 0xc545, 0xc343, 0xc142, 0xbf3f, 0xbd3e, 0xbb3b},
9228        {0xb939, 0xb738, 0xb535, 0xb334, 0xb131, 0xaf30, 0xad2d, 0xab2b}},
9229       {{0x27a8'29a9, 0x23a4'25a6, 0x1fa0'21a1, 0x1b9c'1d9d},
9230        {0x1798'199a, 0x1394'1595, 0x0f90'1192, 0x0b8c'0d8d},
9231        {0x0788'0989, 0x0384'0586, 0xff80'0181, 0xfb7b'fd7e},
9232        {0xf777'f979, 0xf373'f575, 0xef6f'f172, 0xeb6b'ed6d},
9233        {0xe767'e969, 0xe363'e565, 0xdf5f'e162, 0xdb5b'dd5d},
9234        {0xd757'd95a, 0xd353'd555, 0xcf4f'd151, 0xcb4b'cd4e},
9235        {0xc747'c949, 0xc343'c546, 0xbf3f'c141, 0xbb3b'bd3d},
9236        {0xb737'b93a, 0xb333'b535, 0xaf2f'b132, 0xab2b'ad2d}},
9237       {{0x23a4'25a6'27a8'29a9, 0x1b9c'1d9e'1fa0'21a2},
9238        {0x1394'1596'1798'1999, 0x0b8c'0d8e'0f90'1191},
9239        {0x0384'0586'0788'098a, 0xfb7b'fd7d'ff80'0181},
9240        {0xf373'f575'f777'f97a, 0xeb6b'ed6d'ef6f'f171},
9241        {0xe363'e565'e767'e969, 0xdb5b'dd5d'df5f'e162},
9242        {0xd353'd555'd757'd959, 0xcb4b'cd4d'cf4f'd152},
9243        {0xc343'c545'c747'c949, 0xbb3b'bd3d'bf3f'c141},
9244        {0xb333'b535'b737'b93a, 0xab2b'ad2d'af2f'b131}},
9245       kVectorCalculationsSource);
9246 }
9247 }  // namespace
9248 
9249 }  // namespace berberis
9250