xref: /aosp_15_r20/external/vixl/test/aarch64/test-disasm-sve-aarch64.cc (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
1 // Copyright 2019, VIXL authors
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 //   * Redistributions of source code must retain the above copyright notice,
8 //     this list of conditions and the following disclaimer.
9 //   * Redistributions in binary form must reproduce the above copyright notice,
10 //     this list of conditions and the following disclaimer in the documentation
11 //     and/or other materials provided with the distribution.
12 //   * Neither the name of ARM Limited nor the names of its contributors may be
13 //     used to endorse or promote products derived from this software without
14 //     specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 
27 
28 #include <cstdio>
29 #include <cstring>
30 #include <string>
31 
32 #include "test-runner.h"
33 #include "aarch64/test-utils-aarch64.h"
34 
35 #include "aarch64/disasm-aarch64.h"
36 #include "aarch64/macro-assembler-aarch64.h"
37 #include "test-disasm-aarch64.h"
38 #include "test-utils-aarch64.h"
39 
40 namespace vixl {
41 namespace aarch64 {
42 
TEST(sve)43 TEST(sve) {
44   SETUP();
45 
46   // TODO: Replace these tests when the disassembler is more capable.
47   COMPARE(asrr(z0.VnB(), p7.Merging(), z0.VnB(), z1.VnB()),
48           "asrr z0.b, p7/m, z0.b, z1.b");
49   COMPARE(fcmeq(p6.VnD(), p7.Zeroing(), z0.VnD(), z1.VnD()),
50           "fcmeq p6.d, p7/z, z0.d, z1.d");
51   COMPARE(mla(z0.VnB(), p7.Merging(), z0.VnB(), z1.VnB()),
52           "mla z0.b, p7/m, z0.b, z1.b");
53   COMPARE(mla(z1.VnS(), p7.Merging(), z1.VnS(), z0.VnS()),
54           "mla z1.s, p7/m, z1.s, z0.s");
55   COMPARE(asr(z1.VnB(), z0.VnB(), 8), "asr z1.b, z0.b, #8");
56   COMPARE(lsl(z0.VnH(), z1.VnH(), 15), "lsl z0.h, z1.h, #15");
57   COMPARE(lsr(z1.VnS(), z0.VnS(), 32), "lsr z1.s, z0.s, #32");
58   COMPARE(and_(p6.VnB(), p7.Zeroing(), p6.VnB(), p7.VnB()),
59           "and p6.b, p7/z, p6.b, p7.b");
60   COMPARE(rev(p7.VnB(), p6.VnB()), "rev p7.b, p6.b");
61   COMPARE(splice(z0.VnH(), p7, z0.VnH(), z1.VnH()),
62           "splice z0.h, p7, z0.h, z1.h");
63   COMPARE(fnmad(z0.VnD(), p6.Merging(), z1.VnD(), z0.VnD()),
64           "fnmad z0.d, p6/m, z1.d, z0.d");
65 
66   CLEANUP();
67 }
68 
TEST(sve_unallocated_fp_byte_type)69 TEST(sve_unallocated_fp_byte_type) {
70   // Ensure disassembly of FP instructions does not report byte-sized lanes.
71 
72   SETUP();
73 
74   COMPARE_PREFIX(dci(0x650003ca), "unallocated");
75   COMPARE_PREFIX(dci(0x6500230b), "unallocated");
76   COMPARE_PREFIX(dci(0x6500424c), "unallocated");
77   COMPARE_PREFIX(dci(0x6500618d), "unallocated");
78   COMPARE_PREFIX(dci(0x6500a00f), "unallocated");
79   COMPARE_PREFIX(dci(0x6500de91), "unallocated");
80   COMPARE_PREFIX(dci(0x6500fdd2), "unallocated");
81   COMPARE_PREFIX(dci(0x65011d13), "unallocated");
82   COMPARE_PREFIX(dci(0x65015b95), "unallocated");
83   COMPARE_PREFIX(dci(0x65017ad6), "unallocated");
84   COMPARE_PREFIX(dci(0x65019a17), "unallocated");
85   COMPARE_PREFIX(dci(0x6501b958), "unallocated");
86   COMPARE_PREFIX(dci(0x6502941f), "unallocated");
87   COMPARE_PREFIX(dci(0x6502b360), "unallocated");
88   COMPARE_PREFIX(dci(0x6502d2a1), "unallocated");
89   COMPARE_PREFIX(dci(0x65038e27), "unallocated");
90   COMPARE_PREFIX(dci(0x6503ad68), "unallocated");
91   COMPARE_PREFIX(dci(0x65042a6c), "unallocated");
92   COMPARE_PREFIX(dci(0x6504882f), "unallocated");
93   COMPARE_PREFIX(dci(0x6504a770), "unallocated");
94   COMPARE_PREFIX(dci(0x65052474), "unallocated");
95   COMPARE_PREFIX(dci(0x65058237), "unallocated");
96   COMPARE_PREFIX(dci(0x65063dbd), "unallocated");
97   COMPARE_PREFIX(dci(0x65069b80), "unallocated");
98   COMPARE_PREFIX(dci(0x6506bac1), "unallocated");
99   COMPARE_PREFIX(dci(0x65071884), "unallocated");
100   COMPARE_PREFIX(dci(0x650737c5), "unallocated");
101   COMPARE_PREFIX(dci(0x65079588), "unallocated");
102   COMPARE_PREFIX(dci(0x6507b4c9), "unallocated");
103   COMPARE_PREFIX(dci(0x65088f90), "unallocated");
104   COMPARE_PREFIX(dci(0x65090c94), "unallocated");
105   COMPARE_PREFIX(dci(0x65098998), "unallocated");
106   COMPARE_PREFIX(dci(0x650a83a0), "unallocated");
107   COMPARE_PREFIX(dci(0x650c96f1), "unallocated");
108   COMPARE_PREFIX(dci(0x650d90f9), "unallocated");
109   COMPARE_PREFIX(dci(0x65113a97), "unallocated");
110   COMPARE_PREFIX(dci(0x65183010), "unallocated");
111   COMPARE_PREFIX(dci(0x65200050), "unallocated");
112   COMPARE_PREFIX(dci(0x65203ed2), "unallocated");
113   COMPARE_PREFIX(dci(0x65205e13), "unallocated");
114   COMPARE_PREFIX(dci(0x65207d54), "unallocated");
115   COMPARE_PREFIX(dci(0x65209c95), "unallocated");
116   COMPARE_PREFIX(dci(0x6520bbd6), "unallocated");
117   COMPARE_PREFIX(dci(0x6520db17), "unallocated");
118   COMPARE_PREFIX(dci(0x6520fa58), "unallocated");
119   COMPARE_PREFIX(dci(0x650f31e1), "unallocated");
120   COMPARE_PREFIX(dci(0x650e30f7), "unallocated");
121   COMPARE_PREFIX(dci(0x6511376e), "unallocated");
122 
123   CLEANUP();
124 }
125 
TEST(sve_address_generation)126 TEST(sve_address_generation) {
127   SETUP();
128 
129   COMPARE(adr(z19.VnD(), SVEMemOperand(z22.VnD(), z11.VnD(), SXTW)),
130           "adr z19.d, [z22.d, z11.d, sxtw]");
131   COMPARE(adr(z19.VnD(), SVEMemOperand(z22.VnD(), z11.VnD(), SXTW, 1)),
132           "adr z19.d, [z22.d, z11.d, sxtw #1]");
133   COMPARE(adr(z19.VnD(), SVEMemOperand(z22.VnD(), z11.VnD(), SXTW, 2)),
134           "adr z19.d, [z22.d, z11.d, sxtw #2]");
135   COMPARE(adr(z19.VnD(), SVEMemOperand(z22.VnD(), z11.VnD(), SXTW, 3)),
136           "adr z19.d, [z22.d, z11.d, sxtw #3]");
137   COMPARE(adr(z30.VnD(), SVEMemOperand(z14.VnD(), z16.VnD(), UXTW)),
138           "adr z30.d, [z14.d, z16.d, uxtw]");
139   COMPARE(adr(z30.VnD(), SVEMemOperand(z14.VnD(), z16.VnD(), UXTW, 1)),
140           "adr z30.d, [z14.d, z16.d, uxtw #1]");
141   COMPARE(adr(z30.VnD(), SVEMemOperand(z14.VnD(), z16.VnD(), UXTW, 2)),
142           "adr z30.d, [z14.d, z16.d, uxtw #2]");
143   COMPARE(adr(z30.VnD(), SVEMemOperand(z14.VnD(), z16.VnD(), UXTW, 3)),
144           "adr z30.d, [z14.d, z16.d, uxtw #3]");
145   COMPARE(adr(z8.VnS(), SVEMemOperand(z16.VnS(), z16.VnS())),
146           "adr z8.s, [z16.s, z16.s]");
147   COMPARE(adr(z8.VnS(), SVEMemOperand(z16.VnS(), z16.VnS(), LSL, 1)),
148           "adr z8.s, [z16.s, z16.s, lsl #1]");
149   COMPARE(adr(z8.VnS(), SVEMemOperand(z16.VnS(), z16.VnS(), LSL, 2)),
150           "adr z8.s, [z16.s, z16.s, lsl #2]");
151   COMPARE(adr(z8.VnS(), SVEMemOperand(z16.VnS(), z16.VnS(), LSL, 3)),
152           "adr z8.s, [z16.s, z16.s, lsl #3]");
153   COMPARE(adr(z9.VnD(), SVEMemOperand(z1.VnD(), z16.VnD())),
154           "adr z9.d, [z1.d, z16.d]");
155   COMPARE(adr(z9.VnD(), SVEMemOperand(z1.VnD(), z16.VnD(), LSL, 1)),
156           "adr z9.d, [z1.d, z16.d, lsl #1]");
157   COMPARE(adr(z9.VnD(), SVEMemOperand(z1.VnD(), z16.VnD(), LSL, 2)),
158           "adr z9.d, [z1.d, z16.d, lsl #2]");
159   COMPARE(adr(z9.VnD(), SVEMemOperand(z1.VnD(), z16.VnD(), LSL, 3)),
160           "adr z9.d, [z1.d, z16.d, lsl #3]");
161 
162 
163   CLEANUP();
164 }
165 
TEST(sve_calculate_sve_address)166 TEST(sve_calculate_sve_address) {
167 #pragma GCC diagnostic push
168 #pragma GCC diagnostic ignored "-Wshadow"
169 
170   // Shadow the `MacroAssembler` type so that the test macros work without
171   // modification.
172   typedef CalculateSVEAddressMacroAssembler MacroAssembler;
173 
174   SETUP();
175 
176   // It is important that we cover every branch in this test because most other
177   // tests tend not to check every code path.
178 
179   // IsEquivalentToScalar()
180   COMPARE_MACRO(CalculateSVEAddress(x0, SVEMemOperand(x1)), "mov x0, x1");
181   COMPARE_MACRO(CalculateSVEAddress(x4, SVEMemOperand(x2, 0)), "mov x4, x2");
182   COMPARE_MACRO(CalculateSVEAddress(x4, SVEMemOperand(x2, xzr, LSL, 2)),
183                 "mov x4, x2");
184 
185   // IsScalarPlusImmediate()
186   // Simple immediates just pass through to 'Add'.
187   COMPARE_MACRO(CalculateSVEAddress(x10, SVEMemOperand(x0, 42)),
188                 "add x10, x0, #0x2a (42)");
189   COMPARE_MACRO(CalculateSVEAddress(x10, SVEMemOperand(sp, 42)),
190                 "add x10, sp, #0x2a (42)");
191   // SVE_MUL_VL variants use `Addpl`, which has its own tests, but
192   // `CalculateSVEAddress` needs to check and handle the access size.
193   COMPARE_MACRO(CalculateSVEAddress(x10, SVEMemOperand(x0, 3, SVE_MUL_VL), 0),
194                 "addpl x10, x0, #24");
195   COMPARE_MACRO(CalculateSVEAddress(x10, SVEMemOperand(x0, 3, SVE_MUL_VL), 1),
196                 "addpl x10, x0, #12");
197   COMPARE_MACRO(CalculateSVEAddress(x10, SVEMemOperand(x0, 3, SVE_MUL_VL), 2),
198                 "addpl x10, x0, #6");
199   COMPARE_MACRO(CalculateSVEAddress(x10, SVEMemOperand(x0, 3, SVE_MUL_VL), 3),
200                 "addpl x10, x0, #3");
201 
202   // IsScalarPlusScalar()
203   // All forms pass through to `Add`, but SVE_LSL must be handled correctly.
204   COMPARE_MACRO(CalculateSVEAddress(x22, SVEMemOperand(x2, x3)),
205                 "add x22, x2, x3");
206   COMPARE_MACRO(CalculateSVEAddress(x22, SVEMemOperand(sp, x3)),
207                 "add x22, sp, x3");
208   COMPARE_MACRO(CalculateSVEAddress(x22, SVEMemOperand(x2, x3, LSL, 2)),
209                 "add x22, x2, x3, lsl #2");
210   COMPARE_MACRO(CalculateSVEAddress(x22, SVEMemOperand(sp, x3, LSL, 2)),
211                 "add x22, sp, x3, lsl #2");
212 
213   CLEANUP();
214 
215 #pragma GCC diagnostic pop
216 }
217 
TEST(sve_bitwise_imm)218 TEST(sve_bitwise_imm) {
219   SETUP();
220 
221   // The assembler will necessarily encode an immediate in the simplest bitset.
222   COMPARE(and_(z2.VnD(), z2.VnD(), 0x0000ffff0000ffff),
223           "and z2.s, z2.s, #0xffff");
224   COMPARE(dupm(z15.VnS(), 0x7f007f00), "dupm z15.h, #0x7f00");
225   COMPARE(eor(z26.VnH(), z26.VnH(), 0x7ff8), "eor z26.h, z26.h, #0x7ff8");
226   COMPARE(orr(z13.VnB(), z13.VnB(), 0x78), "orr z13.b, z13.b, #0x78");
227 
228   // Logical aliases.
229   COMPARE(bic(z21.VnD(), z21.VnD(), 0xffff00000000ffff),
230           "and z21.d, z21.d, #0xffffffff0000");
231   COMPARE(eon(z31.VnS(), z31.VnS(), 0x1ffe), "eor z31.s, z31.s, #0xffffe001");
232   COMPARE(orn(z11.VnH(), z11.VnH(), 0x2), "orr z11.h, z11.h, #0xfffd");
233 
234   // Mov alias for dupm.
235   COMPARE(mov(z0.VnH(), 0xf00f), "mov z0.h, #0xf00f");
236   COMPARE_MACRO(Mov(z11.VnS(), 0xe0000003), "mov z11.s, #0xe0000003");
237   COMPARE_MACRO(Mov(z22.VnD(), 0x8000), "dupm z22.d, #0x8000");
238 
239   // Test dupm versus mov disassembly.
240   COMPARE(dupm(z0.VnH(), 0xfe), "dupm z0.h, #0xfe");
241   COMPARE(dupm(z0.VnH(), 0xff), "dupm z0.h, #0xff");
242   COMPARE(dupm(z0.VnH(), 0x1fe), "mov z0.h, #0x1fe");
243   COMPARE(dupm(z0.VnH(), 0xfe00), "dupm z0.h, #0xfe00");
244   COMPARE(dupm(z0.VnH(), 0xfe01), "mov z0.h, #0xfe01");
245   COMPARE(dupm(z0.VnS(), 0xfe00), "dupm z0.s, #0xfe00");
246   COMPARE(dupm(z0.VnS(), 0xfe000001), "mov z0.s, #0xfe000001");
247   COMPARE(dupm(z0.VnS(), 0xffffff00), "dupm z0.s, #0xffffff00");
248   COMPARE(dupm(z0.VnS(), 0xffffff01), "dupm z0.s, #0xffffff01");
249   COMPARE(dupm(z0.VnS(), 0xfffffe01), "mov z0.s, #0xfffffe01");
250   COMPARE(dupm(z0.VnS(), 0xfff), "mov z0.s, #0xfff");
251   COMPARE(dupm(z0.VnD(), 0xffffffffffffff00), "dupm z0.d, #0xffffffffffffff00");
252   COMPARE(dupm(z0.VnD(), 0x7fffffffffffff80), "mov z0.d, #0x7fffffffffffff80");
253   COMPARE(dupm(z0.VnD(), 0x8000), "dupm z0.d, #0x8000");
254   COMPARE(dupm(z0.VnD(), 0x10000), "mov z0.d, #0x10000");
255 
256   CLEANUP();
257 }
258 
TEST(sve_bitwise_logical_unpredicated)259 TEST(sve_bitwise_logical_unpredicated) {
260   SETUP();
261 
262   COMPARE(and_(z12.VnD(), z5.VnD(), z29.VnD()), "and z12.d, z5.d, z29.d");
263   COMPARE(bic(z11.VnD(), z15.VnD(), z9.VnD()), "bic z11.d, z15.d, z9.d");
264   COMPARE(eor(z9.VnD(), z31.VnD(), z29.VnD()), "eor z9.d, z31.d, z29.d");
265   COMPARE(orr(z17.VnD(), z8.VnD(), z19.VnD()), "orr z17.d, z8.d, z19.d");
266 
267   // Check mov aliases.
268   COMPARE(orr(z17.VnD(), z8.VnD(), z8.VnD()), "mov z17.d, z8.d");
269   COMPARE(mov(z18, z9), "mov z18.d, z9.d");
270   COMPARE_MACRO(Mov(z19, z10), "mov z19.d, z10.d");
271 
272   CLEANUP();
273 }
274 
TEST(sve_bitwise_shift_predicated)275 TEST(sve_bitwise_shift_predicated) {
276   SETUP();
277 
278   COMPARE(asrr(z20.VnB(), p3.Merging(), z20.VnB(), z11.VnB()),
279           "asrr z20.b, p3/m, z20.b, z11.b");
280   COMPARE(asrr(z20.VnH(), p3.Merging(), z20.VnH(), z11.VnH()),
281           "asrr z20.h, p3/m, z20.h, z11.h");
282   COMPARE(asrr(z20.VnS(), p3.Merging(), z20.VnS(), z11.VnS()),
283           "asrr z20.s, p3/m, z20.s, z11.s");
284   COMPARE(asrr(z20.VnD(), p3.Merging(), z20.VnD(), z11.VnD()),
285           "asrr z20.d, p3/m, z20.d, z11.d");
286   COMPARE(asr(z26.VnB(), p2.Merging(), z26.VnB(), z17.VnB()),
287           "asr z26.b, p2/m, z26.b, z17.b");
288   COMPARE(asr(z26.VnH(), p2.Merging(), z26.VnH(), z17.VnH()),
289           "asr z26.h, p2/m, z26.h, z17.h");
290   COMPARE(asr(z26.VnS(), p2.Merging(), z26.VnS(), z17.VnS()),
291           "asr z26.s, p2/m, z26.s, z17.s");
292   COMPARE(asr(z26.VnD(), p2.Merging(), z26.VnD(), z17.VnD()),
293           "asr z26.d, p2/m, z26.d, z17.d");
294   COMPARE(lslr(z30.VnB(), p1.Merging(), z30.VnB(), z26.VnB()),
295           "lslr z30.b, p1/m, z30.b, z26.b");
296   COMPARE(lslr(z30.VnH(), p1.Merging(), z30.VnH(), z26.VnH()),
297           "lslr z30.h, p1/m, z30.h, z26.h");
298   COMPARE(lslr(z30.VnS(), p1.Merging(), z30.VnS(), z26.VnS()),
299           "lslr z30.s, p1/m, z30.s, z26.s");
300   COMPARE(lslr(z30.VnD(), p1.Merging(), z30.VnD(), z26.VnD()),
301           "lslr z30.d, p1/m, z30.d, z26.d");
302   COMPARE(lsl(z14.VnB(), p6.Merging(), z14.VnB(), z25.VnB()),
303           "lsl z14.b, p6/m, z14.b, z25.b");
304   COMPARE(lsl(z14.VnH(), p6.Merging(), z14.VnH(), z25.VnH()),
305           "lsl z14.h, p6/m, z14.h, z25.h");
306   COMPARE(lsl(z14.VnS(), p6.Merging(), z14.VnS(), z25.VnS()),
307           "lsl z14.s, p6/m, z14.s, z25.s");
308   COMPARE(lsl(z14.VnD(), p6.Merging(), z14.VnD(), z25.VnD()),
309           "lsl z14.d, p6/m, z14.d, z25.d");
310   COMPARE(lsrr(z3.VnB(), p1.Merging(), z3.VnB(), z16.VnB()),
311           "lsrr z3.b, p1/m, z3.b, z16.b");
312   COMPARE(lsrr(z3.VnH(), p1.Merging(), z3.VnH(), z16.VnH()),
313           "lsrr z3.h, p1/m, z3.h, z16.h");
314   COMPARE(lsrr(z3.VnS(), p1.Merging(), z3.VnS(), z16.VnS()),
315           "lsrr z3.s, p1/m, z3.s, z16.s");
316   COMPARE(lsrr(z3.VnD(), p1.Merging(), z3.VnD(), z16.VnD()),
317           "lsrr z3.d, p1/m, z3.d, z16.d");
318   COMPARE(lsr(z29.VnB(), p7.Merging(), z29.VnB(), z13.VnB()),
319           "lsr z29.b, p7/m, z29.b, z13.b");
320   COMPARE(lsr(z29.VnH(), p7.Merging(), z29.VnH(), z13.VnH()),
321           "lsr z29.h, p7/m, z29.h, z13.h");
322   COMPARE(lsr(z29.VnS(), p7.Merging(), z29.VnS(), z13.VnS()),
323           "lsr z29.s, p7/m, z29.s, z13.s");
324   COMPARE(lsr(z29.VnD(), p7.Merging(), z29.VnD(), z13.VnD()),
325           "lsr z29.d, p7/m, z29.d, z13.d");
326 
327   COMPARE(asr(z4.VnB(), p0.Merging(), z4.VnB(), z30.VnD()),
328           "asr z4.b, p0/m, z4.b, z30.d");
329   COMPARE(asr(z4.VnH(), p0.Merging(), z4.VnH(), z30.VnD()),
330           "asr z4.h, p0/m, z4.h, z30.d");
331   COMPARE(asr(z4.VnS(), p0.Merging(), z4.VnS(), z30.VnD()),
332           "asr z4.s, p0/m, z4.s, z30.d");
333   COMPARE(lsl(z13.VnB(), p7.Merging(), z13.VnB(), z18.VnD()),
334           "lsl z13.b, p7/m, z13.b, z18.d");
335   COMPARE(lsl(z13.VnH(), p7.Merging(), z13.VnH(), z18.VnD()),
336           "lsl z13.h, p7/m, z13.h, z18.d");
337   COMPARE(lsl(z13.VnS(), p7.Merging(), z13.VnS(), z18.VnD()),
338           "lsl z13.s, p7/m, z13.s, z18.d");
339   COMPARE(lsr(z1.VnB(), p4.Merging(), z1.VnB(), z14.VnD()),
340           "lsr z1.b, p4/m, z1.b, z14.d");
341   COMPARE(lsr(z1.VnH(), p4.Merging(), z1.VnH(), z14.VnD()),
342           "lsr z1.h, p4/m, z1.h, z14.d");
343   COMPARE(lsr(z1.VnS(), p4.Merging(), z1.VnS(), z14.VnD()),
344           "lsr z1.s, p4/m, z1.s, z14.d");
345 
346   COMPARE_MACRO(Asr(z4.VnB(), p0.Merging(), z4.VnB(), z30.VnB()),
347                 "asr z4.b, p0/m, z4.b, z30.b");
348   COMPARE_MACRO(Asr(z4.VnB(), p0.Merging(), z30.VnB(), z4.VnB()),
349                 "asrr z4.b, p0/m, z4.b, z30.b");
350   COMPARE_MACRO(Asr(z4.VnB(), p0.Merging(), z10.VnB(), z14.VnB()),
351                 "movprfx z4.b, p0/m, z10.b\n"
352                 "asr z4.b, p0/m, z4.b, z14.b");
353   COMPARE_MACRO(Lsl(z4.VnB(), p0.Merging(), z4.VnB(), z30.VnB()),
354                 "lsl z4.b, p0/m, z4.b, z30.b");
355   COMPARE_MACRO(Lsl(z4.VnB(), p0.Merging(), z30.VnB(), z4.VnB()),
356                 "lslr z4.b, p0/m, z4.b, z30.b");
357   COMPARE_MACRO(Lsl(z4.VnB(), p0.Merging(), z10.VnB(), z14.VnB()),
358                 "movprfx z4.b, p0/m, z10.b\n"
359                 "lsl z4.b, p0/m, z4.b, z14.b");
360   COMPARE_MACRO(Lsr(z4.VnB(), p0.Merging(), z4.VnB(), z30.VnB()),
361                 "lsr z4.b, p0/m, z4.b, z30.b");
362   COMPARE_MACRO(Lsr(z4.VnB(), p0.Merging(), z30.VnB(), z4.VnB()),
363                 "lsrr z4.b, p0/m, z4.b, z30.b");
364   COMPARE_MACRO(Lsr(z4.VnB(), p0.Merging(), z10.VnB(), z14.VnB()),
365                 "movprfx z4.b, p0/m, z10.b\n"
366                 "lsr z4.b, p0/m, z4.b, z14.b");
367 
368   COMPARE(asrd(z0.VnB(), p4.Merging(), z0.VnB(), 1),
369           "asrd z0.b, p4/m, z0.b, #1");
370   COMPARE(asrd(z0.VnH(), p4.Merging(), z0.VnH(), 1),
371           "asrd z0.h, p4/m, z0.h, #1");
372   COMPARE(asrd(z0.VnS(), p4.Merging(), z0.VnS(), 1),
373           "asrd z0.s, p4/m, z0.s, #1");
374   COMPARE(asrd(z0.VnD(), p4.Merging(), z0.VnD(), 1),
375           "asrd z0.d, p4/m, z0.d, #1");
376   COMPARE(asr(z8.VnB(), p7.Merging(), z8.VnB(), 3), "asr z8.b, p7/m, z8.b, #3");
377   COMPARE(asr(z8.VnH(), p7.Merging(), z8.VnH(), 3), "asr z8.h, p7/m, z8.h, #3");
378   COMPARE(asr(z8.VnS(), p7.Merging(), z8.VnS(), 3), "asr z8.s, p7/m, z8.s, #3");
379   COMPARE(asr(z8.VnD(), p7.Merging(), z8.VnD(), 3), "asr z8.d, p7/m, z8.d, #3");
380   COMPARE(lsl(z29.VnB(), p6.Merging(), z29.VnB(), 0),
381           "lsl z29.b, p6/m, z29.b, #0");
382   COMPARE(lsl(z29.VnH(), p6.Merging(), z29.VnH(), 5),
383           "lsl z29.h, p6/m, z29.h, #5");
384   COMPARE(lsl(z29.VnS(), p6.Merging(), z29.VnS(), 0),
385           "lsl z29.s, p6/m, z29.s, #0");
386   COMPARE(lsl(z29.VnD(), p6.Merging(), z29.VnD(), 63),
387           "lsl z29.d, p6/m, z29.d, #63");
388   COMPARE(lsr(z24.VnB(), p2.Merging(), z24.VnB(), 8),
389           "lsr z24.b, p2/m, z24.b, #8");
390   COMPARE(lsr(z24.VnH(), p2.Merging(), z24.VnH(), 16),
391           "lsr z24.h, p2/m, z24.h, #16");
392   COMPARE(lsr(z24.VnS(), p2.Merging(), z24.VnS(), 32),
393           "lsr z24.s, p2/m, z24.s, #32");
394   COMPARE(lsr(z24.VnD(), p2.Merging(), z24.VnD(), 64),
395           "lsr z24.d, p2/m, z24.d, #64");
396 
397   COMPARE_MACRO(Asrd(z0.VnB(), p4.Merging(), z8.VnB(), 1),
398                 "movprfx z0.b, p4/m, z8.b\n"
399                 "asrd z0.b, p4/m, z0.b, #1");
400   COMPARE_MACRO(Asr(z8.VnH(), p7.Merging(), z29.VnH(), 3),
401                 "movprfx z8.h, p7/m, z29.h\n"
402                 "asr z8.h, p7/m, z8.h, #3");
403   COMPARE_MACRO(Lsl(z29.VnS(), p6.Merging(), z24.VnS(), 0),
404                 "movprfx z29.s, p6/m, z24.s\n"
405                 "lsl z29.s, p6/m, z29.s, #0");
406   COMPARE_MACRO(Lsr(z24.VnD(), p2.Merging(), z0.VnD(), 64),
407                 "movprfx z24.d, p2/m, z0.d\n"
408                 "lsr z24.d, p2/m, z24.d, #64");
409 
410   CLEANUP();
411 }
412 
TEST(sve_bitwise_shift_unpredicated)413 TEST(sve_bitwise_shift_unpredicated) {
414   SETUP();
415 
416   // Test lsl with reserved D-sized lane field.
417   COMPARE_PREFIX(dci(0x04ef8e15), "unimplemented");
418   // Test asr with reserved tsz field.
419   COMPARE_PREFIX(dci(0x04209345), "unimplemented");
420 
421   COMPARE(asr(z4.VnB(), z27.VnB(), 1), "asr z4.b, z27.b, #1");
422   COMPARE(asr(z5.VnB(), z26.VnB(), 8), "asr z5.b, z26.b, #8");
423   COMPARE(asr(z6.VnH(), z25.VnH(), 1), "asr z6.h, z25.h, #1");
424   COMPARE(asr(z7.VnH(), z24.VnH(), 16), "asr z7.h, z24.h, #16");
425   COMPARE(asr(z8.VnS(), z23.VnS(), 1), "asr z8.s, z23.s, #1");
426   COMPARE(asr(z9.VnS(), z22.VnS(), 32), "asr z9.s, z22.s, #32");
427   COMPARE(asr(z10.VnD(), z21.VnD(), 1), "asr z10.d, z21.d, #1");
428   COMPARE(asr(z11.VnD(), z20.VnD(), 64), "asr z11.d, z20.d, #64");
429   COMPARE(lsr(z4.VnB(), z27.VnB(), 3), "lsr z4.b, z27.b, #3");
430   COMPARE(lsr(z5.VnB(), z26.VnB(), 7), "lsr z5.b, z26.b, #7");
431   COMPARE(lsr(z6.VnH(), z25.VnH(), 8), "lsr z6.h, z25.h, #8");
432   COMPARE(lsr(z7.VnH(), z24.VnH(), 15), "lsr z7.h, z24.h, #15");
433   COMPARE(lsr(z8.VnS(), z23.VnS(), 14), "lsr z8.s, z23.s, #14");
434   COMPARE(lsr(z9.VnS(), z22.VnS(), 31), "lsr z9.s, z22.s, #31");
435   COMPARE(lsr(z10.VnD(), z21.VnD(), 30), "lsr z10.d, z21.d, #30");
436   COMPARE(lsr(z11.VnD(), z20.VnD(), 63), "lsr z11.d, z20.d, #63");
437   COMPARE(lsl(z4.VnB(), z27.VnB(), 4), "lsl z4.b, z27.b, #4");
438   COMPARE(lsl(z5.VnB(), z26.VnB(), 6), "lsl z5.b, z26.b, #6");
439   COMPARE(lsl(z6.VnH(), z25.VnH(), 10), "lsl z6.h, z25.h, #10");
440   COMPARE(lsl(z7.VnH(), z24.VnH(), 14), "lsl z7.h, z24.h, #14");
441   COMPARE(lsl(z8.VnS(), z23.VnS(), 21), "lsl z8.s, z23.s, #21");
442   COMPARE(lsl(z9.VnS(), z22.VnS(), 30), "lsl z9.s, z22.s, #30");
443   COMPARE(lsl(z10.VnD(), z21.VnD(), 44), "lsl z10.d, z21.d, #44");
444   COMPARE(lsl(z11.VnD(), z20.VnD(), 62), "lsl z11.d, z20.d, #62");
445   COMPARE(asr(z12.VnB(), z8.VnB(), z14.VnD()), "asr z12.b, z8.b, z14.d");
446   COMPARE(asr(z14.VnH(), z8.VnH(), z12.VnD()), "asr z14.h, z8.h, z12.d");
447   COMPARE(asr(z16.VnS(), z8.VnS(), z10.VnD()), "asr z16.s, z8.s, z10.d");
448   COMPARE(lsl(z21.VnB(), z16.VnB(), z15.VnD()), "lsl z21.b, z16.b, z15.d");
449   COMPARE(lsl(z23.VnH(), z16.VnH(), z13.VnD()), "lsl z23.h, z16.h, z13.d");
450   COMPARE(lsl(z25.VnS(), z16.VnS(), z11.VnD()), "lsl z25.s, z16.s, z11.d");
451   COMPARE(lsr(z16.VnB(), z19.VnB(), z2.VnD()), "lsr z16.b, z19.b, z2.d");
452   COMPARE(lsr(z18.VnH(), z19.VnH(), z4.VnD()), "lsr z18.h, z19.h, z4.d");
453   COMPARE(lsr(z20.VnS(), z19.VnS(), z6.VnD()), "lsr z20.s, z19.s, z6.d");
454 
455   CLEANUP();
456 }
457 
458 
TEST(sve_element_count)459 TEST(sve_element_count) {
460   SETUP();
461 
462   COMPARE_MACRO(Cntb(x7), "cntb x7");
463   COMPARE_MACRO(Cntb(x7, SVE_POW2), "cntb x7, pow2");
464   COMPARE_MACRO(Cntb(x7, SVE_VL1), "cntb x7, vl1");
465   COMPARE_MACRO(Cntb(x7, SVE_VL2), "cntb x7, vl2");
466   COMPARE_MACRO(Cntb(x7, SVE_VL16), "cntb x7, vl16");
467   COMPARE_MACRO(Cntb(x7, SVE_VL256), "cntb x7, vl256");
468   COMPARE_MACRO(Cntb(x7, SVE_MUL4), "cntb x7, mul4");
469   COMPARE_MACRO(Cntb(x7, SVE_MUL3), "cntb x7, mul3");
470   COMPARE_MACRO(Cntb(x7, SVE_ALL), "cntb x7");
471 
472   COMPARE_MACRO(Cntb(x7, SVE_POW2, 1), "cntb x7, pow2");
473   COMPARE_MACRO(Cntb(x7, SVE_VL1, 16), "cntb x7, vl1, mul #16");
474   COMPARE_MACRO(Cntb(x7, SVE_VL2, 15), "cntb x7, vl2, mul #15");
475   COMPARE_MACRO(Cntb(x7, SVE_VL16, 14), "cntb x7, vl16, mul #14");
476   COMPARE_MACRO(Cntb(x7, SVE_VL256, 8), "cntb x7, vl256, mul #8");
477   COMPARE_MACRO(Cntb(x7, SVE_MUL4, 4), "cntb x7, mul4, mul #4");
478   COMPARE_MACRO(Cntb(x7, SVE_MUL3, 3), "cntb x7, mul3, mul #3");
479   COMPARE_MACRO(Cntb(x7, SVE_ALL, 2), "cntb x7, all, mul #2");
480 
481   COMPARE_MACRO(Cntb(x30), "cntb x30");
482   COMPARE_MACRO(Cntd(xzr, SVE_POW2), "cntd xzr, pow2");
483   COMPARE_MACRO(Cntd(xzr, SVE_MUL4, 1), "cntd xzr, mul4");
484   COMPARE_MACRO(Cnth(x29, SVE_MUL3, 4), "cnth x29, mul3, mul #4");
485   COMPARE_MACRO(Cntw(x28, SVE_VL256, 16), "cntw x28, vl256, mul #16");
486 
487   CLEANUP();
488 }
489 
TEST(sve_incdec_reg_element_count)490 TEST(sve_incdec_reg_element_count) {
491   SETUP();
492 
493   COMPARE_MACRO(Decb(x4), "decb x4");
494   COMPARE_MACRO(Decb(x4, SVE_POW2), "decb x4, pow2");
495   COMPARE_MACRO(Decb(x4, SVE_VL1), "decb x4, vl1");
496   COMPARE_MACRO(Decb(x4, SVE_VL2), "decb x4, vl2");
497   COMPARE_MACRO(Decb(x4, SVE_VL16), "decb x4, vl16");
498   COMPARE_MACRO(Decb(x4, SVE_VL256), "decb x4, vl256");
499   COMPARE_MACRO(Decb(x4, SVE_MUL4), "decb x4, mul4");
500   COMPARE_MACRO(Decb(x4, SVE_MUL3), "decb x4, mul3");
501   COMPARE_MACRO(Decb(x4, SVE_ALL), "decb x4");
502 
503   COMPARE_MACRO(Decb(x4, SVE_POW2, 1), "decb x4, pow2");
504   COMPARE_MACRO(Decb(x4, SVE_VL1, 16), "decb x4, vl1, mul #16");
505   COMPARE_MACRO(Decb(x4, SVE_VL2, 15), "decb x4, vl2, mul #15");
506   COMPARE_MACRO(Decb(x4, SVE_VL16, 14), "decb x4, vl16, mul #14");
507   COMPARE_MACRO(Decb(x4, SVE_VL256, 8), "decb x4, vl256, mul #8");
508   COMPARE_MACRO(Decb(x4, SVE_MUL4, 4), "decb x4, mul4, mul #4");
509   COMPARE_MACRO(Decb(x4, SVE_MUL3, 3), "decb x4, mul3, mul #3");
510   COMPARE_MACRO(Decb(x4, SVE_ALL, 2), "decb x4, all, mul #2");
511 
512   COMPARE_MACRO(Decb(x30), "decb x30");
513   COMPARE_MACRO(Decd(xzr, SVE_POW2), "decd xzr, pow2");
514   COMPARE_MACRO(Decd(xzr, SVE_MUL4, 1), "decd xzr, mul4");
515   COMPARE_MACRO(Dech(x29, SVE_MUL3, 4), "dech x29, mul3, mul #4");
516   COMPARE_MACRO(Decw(x28, SVE_VL256, 16), "decw x28, vl256, mul #16");
517 
518   COMPARE_MACRO(Incb(x17), "incb x17");
519   COMPARE_MACRO(Incb(x17, SVE_POW2), "incb x17, pow2");
520   COMPARE_MACRO(Incb(x17, SVE_VL1), "incb x17, vl1");
521   COMPARE_MACRO(Incb(x17, SVE_VL2), "incb x17, vl2");
522   COMPARE_MACRO(Incb(x17, SVE_VL16), "incb x17, vl16");
523   COMPARE_MACRO(Incb(x17, SVE_VL256), "incb x17, vl256");
524   COMPARE_MACRO(Incb(x17, SVE_MUL4), "incb x17, mul4");
525   COMPARE_MACRO(Incb(x17, SVE_MUL3), "incb x17, mul3");
526   COMPARE_MACRO(Incb(x17, SVE_ALL), "incb x17");
527 
528   COMPARE_MACRO(Incb(x17, SVE_POW2, 1), "incb x17, pow2");
529   COMPARE_MACRO(Incb(x17, SVE_VL1, 16), "incb x17, vl1, mul #16");
530   COMPARE_MACRO(Incb(x17, SVE_VL2, 15), "incb x17, vl2, mul #15");
531   COMPARE_MACRO(Incb(x17, SVE_VL16, 14), "incb x17, vl16, mul #14");
532   COMPARE_MACRO(Incb(x17, SVE_VL256, 8), "incb x17, vl256, mul #8");
533   COMPARE_MACRO(Incb(x17, SVE_MUL4, 4), "incb x17, mul4, mul #4");
534   COMPARE_MACRO(Incb(x17, SVE_MUL3, 3), "incb x17, mul3, mul #3");
535   COMPARE_MACRO(Incb(x17, SVE_ALL, 2), "incb x17, all, mul #2");
536 
537   COMPARE_MACRO(Incb(x30), "incb x30");
538   COMPARE_MACRO(Incd(xzr, SVE_POW2), "incd xzr, pow2");
539   COMPARE_MACRO(Incd(xzr, SVE_MUL4, 1), "incd xzr, mul4");
540   COMPARE_MACRO(Inch(x29, SVE_MUL3, 4), "inch x29, mul3, mul #4");
541   COMPARE_MACRO(Incw(x28, SVE_VL256, 16), "incw x28, vl256, mul #16");
542 
543   CLEANUP();
544 }
545 
TEST(sve_signed_sat_incdec_reg_element_count)546 TEST(sve_signed_sat_incdec_reg_element_count) {
547   SETUP();
548 
549   COMPARE_MACRO(Sqdecb(x12, w12), "sqdecb x12, w12");
550   COMPARE_MACRO(Sqdecb(x12, w12, SVE_POW2), "sqdecb x12, w12, pow2");
551   COMPARE_MACRO(Sqdecb(x12, w12, SVE_VL1), "sqdecb x12, w12, vl1");
552   COMPARE_MACRO(Sqdecb(x12, w12, SVE_VL2), "sqdecb x12, w12, vl2");
553   COMPARE_MACRO(Sqdecb(x12, w12, SVE_VL16), "sqdecb x12, w12, vl16");
554   COMPARE_MACRO(Sqdecb(x12, w12, SVE_VL256), "sqdecb x12, w12, vl256");
555   COMPARE_MACRO(Sqdecb(x12, w12, SVE_MUL4), "sqdecb x12, w12, mul4");
556   COMPARE_MACRO(Sqdecb(x12, w12, SVE_MUL3), "sqdecb x12, w12, mul3");
557   COMPARE_MACRO(Sqdecb(x12, w12, SVE_ALL), "sqdecb x12, w12");
558 
559   COMPARE_MACRO(Sqdecb(x12, w12, SVE_POW2, 1), "sqdecb x12, w12, pow2");
560   COMPARE_MACRO(Sqdecb(x12, w12, SVE_VL1, 16), "sqdecb x12, w12, vl1, mul #16");
561   COMPARE_MACRO(Sqdecb(x12, w12, SVE_VL2, 15), "sqdecb x12, w12, vl2, mul #15");
562   COMPARE_MACRO(Sqdecb(x12, w12, SVE_VL16, 14),
563                 "sqdecb x12, w12, vl16, mul #14");
564   COMPARE_MACRO(Sqdecb(x12, w12, SVE_VL256, 8),
565                 "sqdecb x12, w12, vl256, mul #8");
566   COMPARE_MACRO(Sqdecb(x12, w12, SVE_MUL4, 4), "sqdecb x12, w12, mul4, mul #4");
567   COMPARE_MACRO(Sqdecb(x12, w12, SVE_MUL3, 3), "sqdecb x12, w12, mul3, mul #3");
568   COMPARE_MACRO(Sqdecb(x12, w12, SVE_ALL, 2), "sqdecb x12, w12, all, mul #2");
569 
570   COMPARE_MACRO(Sqdecb(xzr, wzr, SVE_POW2), "sqdecb xzr, wzr, pow2");
571   COMPARE_MACRO(Sqdecb(xzr, wzr, SVE_MUL4, 1), "sqdecb xzr, wzr, mul4");
572 
573   COMPARE_MACRO(Sqincw(x20, w20, SVE_POW2, 1), "sqincw x20, w20, pow2");
574   COMPARE_MACRO(Sqincd(x20, w20, SVE_VL1, 16), "sqincd x20, w20, vl1, mul #16");
575   COMPARE_MACRO(Sqinch(x20, w20, SVE_VL2, 15), "sqinch x20, w20, vl2, mul #15");
576   COMPARE_MACRO(Sqincw(x20, w20, SVE_VL16, 14),
577                 "sqincw x20, w20, vl16, mul #14");
578   COMPARE_MACRO(Sqincd(x20, w20, SVE_VL256, 8),
579                 "sqincd x20, w20, vl256, mul #8");
580   COMPARE_MACRO(Sqinch(x20, w20, SVE_MUL4, 4), "sqinch x20, w20, mul4, mul #4");
581   COMPARE_MACRO(Sqincw(x20, w20, SVE_MUL3, 3), "sqincw x20, w20, mul3, mul #3");
582   COMPARE_MACRO(Sqincd(x20, w20, SVE_ALL, 2), "sqincd x20, w20, all, mul #2");
583 
584   COMPARE_MACRO(Sqdecb(x5), "sqdecb x5");
585   COMPARE_MACRO(Sqdecb(x5, SVE_POW2), "sqdecb x5, pow2");
586   COMPARE_MACRO(Sqdecb(x5, SVE_VL1), "sqdecb x5, vl1");
587   COMPARE_MACRO(Sqdecb(x5, SVE_VL2), "sqdecb x5, vl2");
588   COMPARE_MACRO(Sqdecb(x5, SVE_VL16), "sqdecb x5, vl16");
589   COMPARE_MACRO(Sqdecb(x5, SVE_VL256), "sqdecb x5, vl256");
590   COMPARE_MACRO(Sqdecb(x5, SVE_MUL4), "sqdecb x5, mul4");
591   COMPARE_MACRO(Sqdecb(x5, SVE_MUL3), "sqdecb x5, mul3");
592   COMPARE_MACRO(Sqdecb(x5, SVE_ALL), "sqdecb x5");
593 
594   COMPARE_MACRO(Sqdecb(x5, SVE_POW2, 1), "sqdecb x5, pow2");
595   COMPARE_MACRO(Sqdecb(x5, SVE_VL1, 16), "sqdecb x5, vl1, mul #16");
596   COMPARE_MACRO(Sqdecb(x5, SVE_VL2, 15), "sqdecb x5, vl2, mul #15");
597   COMPARE_MACRO(Sqdecb(x5, SVE_VL16, 14), "sqdecb x5, vl16, mul #14");
598   COMPARE_MACRO(Sqdecb(x5, SVE_VL256, 8), "sqdecb x5, vl256, mul #8");
599   COMPARE_MACRO(Sqdecb(x5, SVE_MUL4, 4), "sqdecb x5, mul4, mul #4");
600   COMPARE_MACRO(Sqdecb(x5, SVE_MUL3, 3), "sqdecb x5, mul3, mul #3");
601   COMPARE_MACRO(Sqdecb(x5, SVE_ALL, 2), "sqdecb x5, all, mul #2");
602 
603   COMPARE_MACRO(Sqdecb(xzr, SVE_POW2), "sqdecb xzr, pow2");
604   COMPARE_MACRO(Sqdecb(xzr, SVE_MUL4, 1), "sqdecb xzr, mul4");
605 
606   COMPARE_MACRO(Sqincw(x7, SVE_POW2, 1), "sqincw x7, pow2");
607   COMPARE_MACRO(Sqincd(x7, SVE_VL1, 16), "sqincd x7, vl1, mul #16");
608   COMPARE_MACRO(Sqinch(x7, SVE_VL2, 15), "sqinch x7, vl2, mul #15");
609   COMPARE_MACRO(Sqincw(x7, SVE_VL16, 14), "sqincw x7, vl16, mul #14");
610   COMPARE_MACRO(Sqincd(x7, SVE_VL256, 8), "sqincd x7, vl256, mul #8");
611   COMPARE_MACRO(Sqinch(x7, SVE_MUL4, 4), "sqinch x7, mul4, mul #4");
612   COMPARE_MACRO(Sqincw(x7, SVE_MUL3, 3), "sqincw x7, mul3, mul #3");
613   COMPARE_MACRO(Sqincd(x7, SVE_ALL, 2), "sqincd x7, all, mul #2");
614 
615   CLEANUP();
616 }
617 
TEST(sve_unsigned_sat_incdec_reg_element_count)618 TEST(sve_unsigned_sat_incdec_reg_element_count) {
619   SETUP();
620 
621   COMPARE_MACRO(Uqdecb(w12), "uqdecb w12");
622   COMPARE_MACRO(Uqdecb(w12, SVE_POW2), "uqdecb w12, pow2");
623   COMPARE_MACRO(Uqdecb(w12, SVE_VL1), "uqdecb w12, vl1");
624   COMPARE_MACRO(Uqdecb(w12, SVE_VL2), "uqdecb w12, vl2");
625   COMPARE_MACRO(Uqdecb(w12, SVE_VL16), "uqdecb w12, vl16");
626   COMPARE_MACRO(Uqdecb(w12, SVE_VL256), "uqdecb w12, vl256");
627   COMPARE_MACRO(Uqdecb(w12, SVE_MUL4), "uqdecb w12, mul4");
628   COMPARE_MACRO(Uqdecb(w12, SVE_MUL3), "uqdecb w12, mul3");
629   COMPARE_MACRO(Uqdecb(w12, SVE_ALL), "uqdecb w12");
630 
631   COMPARE_MACRO(Uqdecb(w12, SVE_POW2, 1), "uqdecb w12, pow2");
632   COMPARE_MACRO(Uqdecb(w12, SVE_VL1, 16), "uqdecb w12, vl1, mul #16");
633   COMPARE_MACRO(Uqdecb(w12, SVE_VL2, 15), "uqdecb w12, vl2, mul #15");
634   COMPARE_MACRO(Uqdecb(w12, SVE_VL16, 14), "uqdecb w12, vl16, mul #14");
635   COMPARE_MACRO(Uqdecb(w12, SVE_VL256, 8), "uqdecb w12, vl256, mul #8");
636   COMPARE_MACRO(Uqdecb(w12, SVE_MUL4, 4), "uqdecb w12, mul4, mul #4");
637   COMPARE_MACRO(Uqdecb(w12, SVE_MUL3, 3), "uqdecb w12, mul3, mul #3");
638   COMPARE_MACRO(Uqdecb(w12, SVE_ALL, 2), "uqdecb w12, all, mul #2");
639 
640   COMPARE_MACRO(Uqdecb(x30), "uqdecb x30");
641   COMPARE_MACRO(Uqdecb(xzr, SVE_POW2), "uqdecb xzr, pow2");
642   COMPARE_MACRO(Uqdecb(xzr, SVE_MUL4, 1), "uqdecb xzr, mul4");
643 
644   COMPARE_MACRO(Uqdecw(w22), "uqdecw w22");
645   COMPARE_MACRO(Uqdecd(w22, SVE_POW2, 1), "uqdecd w22, pow2");
646   COMPARE_MACRO(Uqdech(w22, SVE_VL1, 16), "uqdech w22, vl1, mul #16");
647   COMPARE_MACRO(Uqdecw(x22, SVE_VL2, 15), "uqdecw x22, vl2, mul #15");
648   COMPARE_MACRO(Uqdecd(x22, SVE_VL16, 14), "uqdecd x22, vl16, mul #14");
649   COMPARE_MACRO(Uqdech(x22, SVE_VL256, 8), "uqdech x22, vl256, mul #8");
650   COMPARE_MACRO(Uqdecw(w22, SVE_MUL4, 4), "uqdecw w22, mul4, mul #4");
651   COMPARE_MACRO(Uqdecd(w22, SVE_MUL3, 3), "uqdecd w22, mul3, mul #3");
652   COMPARE_MACRO(Uqdech(w22, SVE_ALL, 2), "uqdech w22, all, mul #2");
653 
654   COMPARE_MACRO(Uqincb(w29), "uqincb w29");
655   COMPARE_MACRO(Uqincb(w29, SVE_POW2), "uqincb w29, pow2");
656   COMPARE_MACRO(Uqincb(w29, SVE_VL1), "uqincb w29, vl1");
657   COMPARE_MACRO(Uqincb(w29, SVE_VL2), "uqincb w29, vl2");
658   COMPARE_MACRO(Uqincb(w29, SVE_VL16), "uqincb w29, vl16");
659   COMPARE_MACRO(Uqincb(w29, SVE_VL256), "uqincb w29, vl256");
660   COMPARE_MACRO(Uqincb(w29, SVE_MUL4), "uqincb w29, mul4");
661   COMPARE_MACRO(Uqincb(w29, SVE_MUL3), "uqincb w29, mul3");
662   COMPARE_MACRO(Uqincb(w29, SVE_ALL), "uqincb w29");
663 
664   COMPARE_MACRO(Uqincb(w29, SVE_POW2, 1), "uqincb w29, pow2");
665   COMPARE_MACRO(Uqincb(w29, SVE_VL1, 16), "uqincb w29, vl1, mul #16");
666   COMPARE_MACRO(Uqincb(w29, SVE_VL2, 15), "uqincb w29, vl2, mul #15");
667   COMPARE_MACRO(Uqincb(w29, SVE_VL16, 14), "uqincb w29, vl16, mul #14");
668   COMPARE_MACRO(Uqincb(w29, SVE_VL256, 8), "uqincb w29, vl256, mul #8");
669   COMPARE_MACRO(Uqincb(w29, SVE_MUL4, 4), "uqincb w29, mul4, mul #4");
670   COMPARE_MACRO(Uqincb(w29, SVE_MUL3, 3), "uqincb w29, mul3, mul #3");
671   COMPARE_MACRO(Uqincb(w29, SVE_ALL, 2), "uqincb w29, all, mul #2");
672 
673   COMPARE_MACRO(Uqincb(x30), "uqincb x30");
674   COMPARE_MACRO(Uqincb(xzr, SVE_POW2), "uqincb xzr, pow2");
675   COMPARE_MACRO(Uqincb(xzr, SVE_MUL4, 1), "uqincb xzr, mul4");
676 
677   COMPARE_MACRO(Uqinch(w11), "uqinch w11");
678   COMPARE_MACRO(Uqincw(w11, SVE_POW2), "uqincw w11, pow2");
679   COMPARE_MACRO(Uqincd(w11, SVE_VL1), "uqincd w11, vl1");
680   COMPARE_MACRO(Uqinch(x11, SVE_VL2), "uqinch x11, vl2");
681   COMPARE_MACRO(Uqincw(x11, SVE_VL16), "uqincw x11, vl16");
682   COMPARE_MACRO(Uqincd(x11, SVE_VL256), "uqincd x11, vl256");
683   COMPARE_MACRO(Uqinch(w11, SVE_MUL4), "uqinch w11, mul4");
684   COMPARE_MACRO(Uqincw(w11, SVE_MUL3), "uqincw w11, mul3");
685   COMPARE_MACRO(Uqincd(w11, SVE_ALL), "uqincd w11");
686 
687   CLEANUP();
688 }
689 
TEST(sve_vector_dec_element_count)690 TEST(sve_vector_dec_element_count) {
691   SETUP();
692 
693   COMPARE_MACRO(Decd(z14.VnD()), "decd z14.d");
694   COMPARE_MACRO(Decd(z14.VnD(), SVE_POW2), "decd z14.d, pow2");
695   COMPARE_MACRO(Decd(z14.VnD(), SVE_VL1), "decd z14.d, vl1");
696   COMPARE_MACRO(Decd(z14.VnD(), SVE_VL2), "decd z14.d, vl2");
697   COMPARE_MACRO(Decd(z14.VnD(), SVE_VL16), "decd z14.d, vl16");
698   COMPARE_MACRO(Decd(z14.VnD(), SVE_VL256), "decd z14.d, vl256");
699   COMPARE_MACRO(Decd(z14.VnD(), SVE_MUL4), "decd z14.d, mul4");
700   COMPARE_MACRO(Decd(z14.VnD(), SVE_MUL3), "decd z14.d, mul3");
701   COMPARE_MACRO(Decd(z14.VnD(), SVE_ALL), "decd z14.d");
702 
703   COMPARE_MACRO(Decd(z19.VnD(), SVE_POW2, 1), "decd z19.d, pow2");
704   COMPARE_MACRO(Decd(z19.VnD(), SVE_VL1, 16), "decd z19.d, vl1, mul #16");
705   COMPARE_MACRO(Decd(z19.VnD(), SVE_VL2, 15), "decd z19.d, vl2, mul #15");
706   COMPARE_MACRO(Decd(z19.VnD(), SVE_VL16, 14), "decd z19.d, vl16, mul #14");
707   COMPARE_MACRO(Decd(z19.VnD(), SVE_VL256, 8), "decd z19.d, vl256, mul #8");
708   COMPARE_MACRO(Decd(z19.VnD(), SVE_MUL4, 4), "decd z19.d, mul4, mul #4");
709   COMPARE_MACRO(Decd(z19.VnD(), SVE_MUL3, 3), "decd z19.d, mul3, mul #3");
710   COMPARE_MACRO(Decd(z19.VnD(), SVE_ALL, 2), "decd z19.d, all, mul #2");
711 
712   COMPARE_MACRO(Dech(z27.VnH(), SVE_POW2, 1), "dech z27.h, pow2");
713   COMPARE_MACRO(Decw(z27.VnS(), SVE_VL1, 16), "decw z27.s, vl1, mul #16");
714   COMPARE_MACRO(Dech(z27.VnH(), SVE_VL2, 15), "dech z27.h, vl2, mul #15");
715   COMPARE_MACRO(Decw(z27.VnS(), SVE_VL16, 14), "decw z27.s, vl16, mul #14");
716   COMPARE_MACRO(Dech(z27.VnH(), SVE_VL256, 8), "dech z27.h, vl256, mul #8");
717   COMPARE_MACRO(Decw(z27.VnS(), SVE_MUL4, 4), "decw z27.s, mul4, mul #4");
718   COMPARE_MACRO(Dech(z27.VnH(), SVE_MUL3, 3), "dech z27.h, mul3, mul #3");
719   COMPARE_MACRO(Decw(z27.VnS(), SVE_ALL, 2), "decw z27.s, all, mul #2");
720 
721   COMPARE_MACRO(Sqdecd(z13.VnD()), "sqdecd z13.d");
722   COMPARE_MACRO(Sqdecd(z13.VnD(), SVE_POW2), "sqdecd z13.d, pow2");
723   COMPARE_MACRO(Sqdecd(z13.VnD(), SVE_VL1), "sqdecd z13.d, vl1");
724   COMPARE_MACRO(Sqdecd(z13.VnD(), SVE_VL2), "sqdecd z13.d, vl2");
725   COMPARE_MACRO(Sqdecd(z13.VnD(), SVE_VL16), "sqdecd z13.d, vl16");
726   COMPARE_MACRO(Sqdecd(z13.VnD(), SVE_VL256), "sqdecd z13.d, vl256");
727   COMPARE_MACRO(Sqdecd(z13.VnD(), SVE_MUL4), "sqdecd z13.d, mul4");
728   COMPARE_MACRO(Sqdecd(z13.VnD(), SVE_MUL3), "sqdecd z13.d, mul3");
729   COMPARE_MACRO(Sqdecd(z13.VnD(), SVE_ALL), "sqdecd z13.d");
730 
731   COMPARE_MACRO(Sqdecd(z9.VnD(), SVE_POW2, 1), "sqdecd z9.d, pow2");
732   COMPARE_MACRO(Sqdecd(z9.VnD(), SVE_VL1, 16), "sqdecd z9.d, vl1, mul #16");
733   COMPARE_MACRO(Sqdecd(z9.VnD(), SVE_VL2, 15), "sqdecd z9.d, vl2, mul #15");
734   COMPARE_MACRO(Sqdecd(z9.VnD(), SVE_VL16, 14), "sqdecd z9.d, vl16, mul #14");
735   COMPARE_MACRO(Sqdecd(z9.VnD(), SVE_VL256, 8), "sqdecd z9.d, vl256, mul #8");
736   COMPARE_MACRO(Sqdecd(z9.VnD(), SVE_MUL4, 4), "sqdecd z9.d, mul4, mul #4");
737   COMPARE_MACRO(Sqdecd(z9.VnD(), SVE_MUL3, 3), "sqdecd z9.d, mul3, mul #3");
738   COMPARE_MACRO(Sqdecd(z9.VnD(), SVE_ALL, 2), "sqdecd z9.d, all, mul #2");
739 
740   COMPARE_MACRO(Sqdech(z31.VnH(), SVE_POW2, 1), "sqdech z31.h, pow2");
741   COMPARE_MACRO(Sqdecw(z31.VnS(), SVE_VL1, 16), "sqdecw z31.s, vl1, mul #16");
742   COMPARE_MACRO(Sqdech(z31.VnH(), SVE_VL2, 15), "sqdech z31.h, vl2, mul #15");
743   COMPARE_MACRO(Sqdecw(z31.VnS(), SVE_VL16, 14), "sqdecw z31.s, vl16, mul #14");
744   COMPARE_MACRO(Sqdech(z31.VnH(), SVE_VL256, 8), "sqdech z31.h, vl256, mul #8");
745   COMPARE_MACRO(Sqdecw(z31.VnS(), SVE_MUL4, 4), "sqdecw z31.s, mul4, mul #4");
746   COMPARE_MACRO(Sqdech(z31.VnH(), SVE_MUL3, 3), "sqdech z31.h, mul3, mul #3");
747   COMPARE_MACRO(Sqdecw(z31.VnS(), SVE_ALL, 2), "sqdecw z31.s, all, mul #2");
748 
749   COMPARE_MACRO(Uqdecd(z1.VnD()), "uqdecd z1.d");
750   COMPARE_MACRO(Uqdecd(z1.VnD(), SVE_POW2), "uqdecd z1.d, pow2");
751   COMPARE_MACRO(Uqdecd(z1.VnD(), SVE_VL1), "uqdecd z1.d, vl1");
752   COMPARE_MACRO(Uqdecd(z1.VnD(), SVE_VL2), "uqdecd z1.d, vl2");
753   COMPARE_MACRO(Uqdecd(z1.VnD(), SVE_VL16), "uqdecd z1.d, vl16");
754   COMPARE_MACRO(Uqdecd(z1.VnD(), SVE_VL256), "uqdecd z1.d, vl256");
755   COMPARE_MACRO(Uqdecd(z1.VnD(), SVE_MUL4), "uqdecd z1.d, mul4");
756   COMPARE_MACRO(Uqdecd(z1.VnD(), SVE_MUL3), "uqdecd z1.d, mul3");
757   COMPARE_MACRO(Uqdecd(z1.VnD(), SVE_ALL), "uqdecd z1.d");
758 
759   COMPARE_MACRO(Uqdecd(z7.VnD(), SVE_POW2, 1), "uqdecd z7.d, pow2");
760   COMPARE_MACRO(Uqdecd(z7.VnD(), SVE_VL1, 16), "uqdecd z7.d, vl1, mul #16");
761   COMPARE_MACRO(Uqdecd(z7.VnD(), SVE_VL2, 15), "uqdecd z7.d, vl2, mul #15");
762   COMPARE_MACRO(Uqdecd(z7.VnD(), SVE_VL16, 14), "uqdecd z7.d, vl16, mul #14");
763   COMPARE_MACRO(Uqdecd(z7.VnD(), SVE_VL256, 8), "uqdecd z7.d, vl256, mul #8");
764   COMPARE_MACRO(Uqdecd(z7.VnD(), SVE_MUL4, 4), "uqdecd z7.d, mul4, mul #4");
765   COMPARE_MACRO(Uqdecd(z7.VnD(), SVE_MUL3, 3), "uqdecd z7.d, mul3, mul #3");
766   COMPARE_MACRO(Uqdecd(z7.VnD(), SVE_ALL, 2), "uqdecd z7.d, all, mul #2");
767 
768   COMPARE_MACRO(Uqdech(z26.VnH(), SVE_POW2, 1), "uqdech z26.h, pow2");
769   COMPARE_MACRO(Uqdecw(z26.VnS(), SVE_VL1, 16), "uqdecw z26.s, vl1, mul #16");
770   COMPARE_MACRO(Uqdech(z26.VnH(), SVE_VL2, 15), "uqdech z26.h, vl2, mul #15");
771   COMPARE_MACRO(Uqdecw(z26.VnS(), SVE_VL16, 14), "uqdecw z26.s, vl16, mul #14");
772   COMPARE_MACRO(Uqdech(z26.VnH(), SVE_VL256, 8), "uqdech z26.h, vl256, mul #8");
773   COMPARE_MACRO(Uqdecw(z26.VnS(), SVE_MUL4, 4), "uqdecw z26.s, mul4, mul #4");
774   COMPARE_MACRO(Uqdech(z26.VnH(), SVE_MUL3, 3), "uqdech z26.h, mul3, mul #3");
775   COMPARE_MACRO(Uqdecw(z26.VnS(), SVE_ALL, 2), "uqdecw z26.s, all, mul #2");
776 
777   CLEANUP();
778 }
779 
TEST(sve_vector_inc_element_count)780 TEST(sve_vector_inc_element_count) {
781   SETUP();
782 
783   COMPARE_MACRO(Incd(z16.VnD()), "incd z16.d");
784   COMPARE_MACRO(Incd(z16.VnD(), SVE_POW2), "incd z16.d, pow2");
785   COMPARE_MACRO(Incd(z16.VnD(), SVE_VL1), "incd z16.d, vl1");
786   COMPARE_MACRO(Incd(z16.VnD(), SVE_VL2), "incd z16.d, vl2");
787   COMPARE_MACRO(Incd(z16.VnD(), SVE_VL16), "incd z16.d, vl16");
788   COMPARE_MACRO(Incd(z16.VnD(), SVE_VL256), "incd z16.d, vl256");
789   COMPARE_MACRO(Incd(z16.VnD(), SVE_MUL4), "incd z16.d, mul4");
790   COMPARE_MACRO(Incd(z16.VnD(), SVE_MUL3), "incd z16.d, mul3");
791   COMPARE_MACRO(Incd(z16.VnD(), SVE_ALL), "incd z16.d");
792 
793   COMPARE_MACRO(Incd(z18.VnD(), SVE_POW2, 1), "incd z18.d, pow2");
794   COMPARE_MACRO(Incd(z18.VnD(), SVE_VL1, 16), "incd z18.d, vl1, mul #16");
795   COMPARE_MACRO(Incd(z18.VnD(), SVE_VL2, 15), "incd z18.d, vl2, mul #15");
796   COMPARE_MACRO(Incd(z18.VnD(), SVE_VL16, 14), "incd z18.d, vl16, mul #14");
797   COMPARE_MACRO(Incd(z18.VnD(), SVE_VL256, 8), "incd z18.d, vl256, mul #8");
798   COMPARE_MACRO(Incd(z18.VnD(), SVE_MUL4, 4), "incd z18.d, mul4, mul #4");
799   COMPARE_MACRO(Incd(z18.VnD(), SVE_MUL3, 3), "incd z18.d, mul3, mul #3");
800   COMPARE_MACRO(Incd(z18.VnD(), SVE_ALL, 2), "incd z18.d, all, mul #2");
801 
802   COMPARE_MACRO(Inch(z24.VnH(), SVE_POW2, 1), "inch z24.h, pow2");
803   COMPARE_MACRO(Incw(z24.VnS(), SVE_VL1, 16), "incw z24.s, vl1, mul #16");
804   COMPARE_MACRO(Inch(z24.VnH(), SVE_VL2, 15), "inch z24.h, vl2, mul #15");
805   COMPARE_MACRO(Incw(z24.VnS(), SVE_VL16, 14), "incw z24.s, vl16, mul #14");
806   COMPARE_MACRO(Inch(z24.VnH(), SVE_VL256, 8), "inch z24.h, vl256, mul #8");
807   COMPARE_MACRO(Incw(z24.VnS(), SVE_MUL4, 4), "incw z24.s, mul4, mul #4");
808   COMPARE_MACRO(Inch(z24.VnH(), SVE_MUL3, 3), "inch z24.h, mul3, mul #3");
809   COMPARE_MACRO(Incw(z24.VnS(), SVE_ALL, 2), "incw z24.s, all, mul #2");
810 
811   COMPARE_MACRO(Sqincd(z10.VnD()), "sqincd z10.d");
812   COMPARE_MACRO(Sqincd(z10.VnD(), SVE_POW2), "sqincd z10.d, pow2");
813   COMPARE_MACRO(Sqincd(z10.VnD(), SVE_VL1), "sqincd z10.d, vl1");
814   COMPARE_MACRO(Sqincd(z10.VnD(), SVE_VL2), "sqincd z10.d, vl2");
815   COMPARE_MACRO(Sqincd(z10.VnD(), SVE_VL16), "sqincd z10.d, vl16");
816   COMPARE_MACRO(Sqincd(z10.VnD(), SVE_VL256), "sqincd z10.d, vl256");
817   COMPARE_MACRO(Sqincd(z10.VnD(), SVE_MUL4), "sqincd z10.d, mul4");
818   COMPARE_MACRO(Sqincd(z10.VnD(), SVE_MUL3), "sqincd z10.d, mul3");
819   COMPARE_MACRO(Sqincd(z10.VnD(), SVE_ALL), "sqincd z10.d");
820 
821   COMPARE_MACRO(Sqincd(z3.VnD(), SVE_POW2, 1), "sqincd z3.d, pow2");
822   COMPARE_MACRO(Sqincd(z3.VnD(), SVE_VL1, 16), "sqincd z3.d, vl1, mul #16");
823   COMPARE_MACRO(Sqincd(z3.VnD(), SVE_VL2, 15), "sqincd z3.d, vl2, mul #15");
824   COMPARE_MACRO(Sqincd(z3.VnD(), SVE_VL16, 14), "sqincd z3.d, vl16, mul #14");
825   COMPARE_MACRO(Sqincd(z3.VnD(), SVE_VL256, 8), "sqincd z3.d, vl256, mul #8");
826   COMPARE_MACRO(Sqincd(z3.VnD(), SVE_MUL4, 4), "sqincd z3.d, mul4, mul #4");
827   COMPARE_MACRO(Sqincd(z3.VnD(), SVE_MUL3, 3), "sqincd z3.d, mul3, mul #3");
828   COMPARE_MACRO(Sqincd(z3.VnD(), SVE_ALL, 2), "sqincd z3.d, all, mul #2");
829 
830   COMPARE_MACRO(Sqinch(z24.VnH(), SVE_POW2, 1), "sqinch z24.h, pow2");
831   COMPARE_MACRO(Sqincw(z24.VnS(), SVE_VL1, 16), "sqincw z24.s, vl1, mul #16");
832   COMPARE_MACRO(Sqinch(z24.VnH(), SVE_VL2, 15), "sqinch z24.h, vl2, mul #15");
833   COMPARE_MACRO(Sqincw(z24.VnS(), SVE_VL16, 14), "sqincw z24.s, vl16, mul #14");
834   COMPARE_MACRO(Sqinch(z24.VnH(), SVE_VL256, 8), "sqinch z24.h, vl256, mul #8");
835   COMPARE_MACRO(Sqincw(z24.VnS(), SVE_MUL4, 4), "sqincw z24.s, mul4, mul #4");
836   COMPARE_MACRO(Sqinch(z24.VnH(), SVE_MUL3, 3), "sqinch z24.h, mul3, mul #3");
837   COMPARE_MACRO(Sqincw(z24.VnS(), SVE_ALL, 2), "sqincw z24.s, all, mul #2");
838 
839   COMPARE_MACRO(Uqincd(z10.VnD()), "uqincd z10.d");
840   COMPARE_MACRO(Uqincd(z10.VnD(), SVE_POW2), "uqincd z10.d, pow2");
841   COMPARE_MACRO(Uqincd(z10.VnD(), SVE_VL1), "uqincd z10.d, vl1");
842   COMPARE_MACRO(Uqincd(z10.VnD(), SVE_VL2), "uqincd z10.d, vl2");
843   COMPARE_MACRO(Uqincd(z10.VnD(), SVE_VL16), "uqincd z10.d, vl16");
844   COMPARE_MACRO(Uqincd(z10.VnD(), SVE_VL256), "uqincd z10.d, vl256");
845   COMPARE_MACRO(Uqincd(z10.VnD(), SVE_MUL4), "uqincd z10.d, mul4");
846   COMPARE_MACRO(Uqincd(z10.VnD(), SVE_MUL3), "uqincd z10.d, mul3");
847   COMPARE_MACRO(Uqincd(z10.VnD(), SVE_ALL), "uqincd z10.d");
848 
849   COMPARE_MACRO(Uqincd(z6.VnD(), SVE_POW2, 1), "uqincd z6.d, pow2");
850   COMPARE_MACRO(Uqincd(z6.VnD(), SVE_VL1, 16), "uqincd z6.d, vl1, mul #16");
851   COMPARE_MACRO(Uqincd(z6.VnD(), SVE_VL2, 15), "uqincd z6.d, vl2, mul #15");
852   COMPARE_MACRO(Uqincd(z6.VnD(), SVE_VL16, 14), "uqincd z6.d, vl16, mul #14");
853   COMPARE_MACRO(Uqincd(z6.VnD(), SVE_VL256, 8), "uqincd z6.d, vl256, mul #8");
854   COMPARE_MACRO(Uqincd(z6.VnD(), SVE_MUL4, 4), "uqincd z6.d, mul4, mul #4");
855   COMPARE_MACRO(Uqincd(z6.VnD(), SVE_MUL3, 3), "uqincd z6.d, mul3, mul #3");
856   COMPARE_MACRO(Uqincd(z6.VnD(), SVE_ALL, 2), "uqincd z6.d, all, mul #2");
857 
858   COMPARE_MACRO(Uqinch(z20.VnH(), SVE_POW2, 1), "uqinch z20.h, pow2");
859   COMPARE_MACRO(Uqincw(z20.VnS(), SVE_VL1, 16), "uqincw z20.s, vl1, mul #16");
860   COMPARE_MACRO(Uqinch(z20.VnH(), SVE_VL2, 15), "uqinch z20.h, vl2, mul #15");
861   COMPARE_MACRO(Uqincw(z20.VnS(), SVE_VL16, 14), "uqincw z20.s, vl16, mul #14");
862   COMPARE_MACRO(Uqinch(z20.VnH(), SVE_VL256, 8), "uqinch z20.h, vl256, mul #8");
863   COMPARE_MACRO(Uqincw(z20.VnS(), SVE_MUL4, 4), "uqincw z20.s, mul4, mul #4");
864   COMPARE_MACRO(Uqinch(z20.VnH(), SVE_MUL3, 3), "uqinch z20.h, mul3, mul #3");
865   COMPARE_MACRO(Uqincw(z20.VnS(), SVE_ALL, 2), "uqincw z20.s, all, mul #2");
866 
867   CLEANUP();
868 }
869 
TEST(sve_fp_accumulating_reduction)870 TEST(sve_fp_accumulating_reduction) {
871   SETUP();
872 
873   COMPARE(fadda(h10, p2, h10, z0.VnH()), "fadda h10, p2, h10, z0.h");
874   COMPARE(fadda(s10, p2, s10, z0.VnS()), "fadda s10, p2, s10, z0.s");
875   COMPARE(fadda(d10, p2, d10, z0.VnD()), "fadda d10, p2, d10, z0.d");
876 
877   CLEANUP();
878 }
879 
TEST(sve_fp_arithmetic_predicated)880 TEST(sve_fp_arithmetic_predicated) {
881   SETUP();
882 
883   COMPARE(fdiv(z9.VnH(), p4.Merging(), z9.VnH(), z4.VnH()),
884           "fdiv z9.h, p4/m, z9.h, z4.h");
885   COMPARE(fdiv(z19.VnS(), p5.Merging(), z19.VnS(), z14.VnS()),
886           "fdiv z19.s, p5/m, z19.s, z14.s");
887   COMPARE(fdiv(z29.VnD(), p6.Merging(), z29.VnD(), z24.VnD()),
888           "fdiv z29.d, p6/m, z29.d, z24.d");
889   COMPARE(fdivr(z21.VnH(), p3.Merging(), z21.VnH(), z11.VnH()),
890           "fdivr z21.h, p3/m, z21.h, z11.h");
891   COMPARE(fdivr(z23.VnS(), p5.Merging(), z23.VnS(), z15.VnS()),
892           "fdivr z23.s, p5/m, z23.s, z15.s");
893   COMPARE(fdivr(z25.VnD(), p7.Merging(), z25.VnD(), z19.VnD()),
894           "fdivr z25.d, p7/m, z25.d, z19.d");
895   COMPARE(fmax(z4.VnH(), p1.Merging(), z4.VnH(), z29.VnH()),
896           "fmax z4.h, p1/m, z4.h, z29.h");
897   COMPARE(fmax(z14.VnS(), p3.Merging(), z14.VnS(), z29.VnS()),
898           "fmax z14.s, p3/m, z14.s, z29.s");
899   COMPARE(fmax(z24.VnD(), p5.Merging(), z24.VnD(), z29.VnD()),
900           "fmax z24.d, p5/m, z24.d, z29.d");
901   COMPARE(fmin(z1.VnH(), p2.Merging(), z1.VnH(), z30.VnH()),
902           "fmin z1.h, p2/m, z1.h, z30.h");
903   COMPARE(fmin(z11.VnS(), p4.Merging(), z11.VnS(), z30.VnS()),
904           "fmin z11.s, p4/m, z11.s, z30.s");
905   COMPARE(fmin(z21.VnD(), p6.Merging(), z21.VnD(), z30.VnD()),
906           "fmin z21.d, p6/m, z21.d, z30.d");
907 
908   COMPARE(ftmad(z21.VnH(), z21.VnH(), z22.VnH(), 0),
909           "ftmad z21.h, z21.h, z22.h, #0");
910   COMPARE(ftmad(z21.VnH(), z21.VnH(), z22.VnH(), 2),
911           "ftmad z21.h, z21.h, z22.h, #2");
912   COMPARE(ftmad(z2.VnH(), z2.VnH(), z21.VnH(), 7),
913           "ftmad z2.h, z2.h, z21.h, #7");
914   COMPARE(ftmad(z21.VnS(), z21.VnS(), z22.VnS(), 0),
915           "ftmad z21.s, z21.s, z22.s, #0");
916   COMPARE(ftmad(z21.VnS(), z21.VnS(), z22.VnS(), 2),
917           "ftmad z21.s, z21.s, z22.s, #2");
918   COMPARE(ftmad(z2.VnS(), z2.VnS(), z21.VnS(), 7),
919           "ftmad z2.s, z2.s, z21.s, #7");
920   COMPARE(ftmad(z21.VnD(), z21.VnD(), z22.VnD(), 0),
921           "ftmad z21.d, z21.d, z22.d, #0");
922   COMPARE(ftmad(z21.VnD(), z21.VnD(), z22.VnD(), 2),
923           "ftmad z21.d, z21.d, z22.d, #2");
924   COMPARE(ftmad(z2.VnD(), z2.VnD(), z21.VnD(), 7),
925           "ftmad z2.d, z2.d, z21.d, #7");
926 
927   COMPARE_MACRO(Ftmad(z3.VnH(), z2.VnH(), z1.VnH(), 1),
928                 "movprfx z3, z2\n"
929                 "ftmad z3.h, z3.h, z1.h, #1");
930   COMPARE_MACRO(Ftmad(z6.VnS(), z4.VnS(), z6.VnS(), 1),
931                 "mov z31.d, z6.d\n"
932                 "movprfx z6, z4\n"
933                 "ftmad z6.s, z6.s, z31.s, #1");
934 
935   COMPARE(fabd(z31.VnH(), p7.Merging(), z31.VnH(), z17.VnH()),
936           "fabd z31.h, p7/m, z31.h, z17.h");
937   COMPARE(fabd(z31.VnS(), p7.Merging(), z31.VnS(), z17.VnS()),
938           "fabd z31.s, p7/m, z31.s, z17.s");
939   COMPARE(fabd(z31.VnD(), p7.Merging(), z31.VnD(), z17.VnD()),
940           "fabd z31.d, p7/m, z31.d, z17.d");
941   COMPARE(fadd(z24.VnH(), p2.Merging(), z24.VnH(), z15.VnH()),
942           "fadd z24.h, p2/m, z24.h, z15.h");
943   COMPARE(fadd(z24.VnS(), p2.Merging(), z24.VnS(), z15.VnS()),
944           "fadd z24.s, p2/m, z24.s, z15.s");
945   COMPARE(fadd(z24.VnD(), p2.Merging(), z24.VnD(), z15.VnD()),
946           "fadd z24.d, p2/m, z24.d, z15.d");
947   COMPARE(fmaxnm(z15.VnH(), p4.Merging(), z15.VnH(), z3.VnH()),
948           "fmaxnm z15.h, p4/m, z15.h, z3.h");
949   COMPARE(fmaxnm(z15.VnS(), p4.Merging(), z15.VnS(), z3.VnS()),
950           "fmaxnm z15.s, p4/m, z15.s, z3.s");
951   COMPARE(fmaxnm(z15.VnD(), p4.Merging(), z15.VnD(), z3.VnD()),
952           "fmaxnm z15.d, p4/m, z15.d, z3.d");
953   COMPARE(fminnm(z19.VnH(), p2.Merging(), z19.VnH(), z29.VnH()),
954           "fminnm z19.h, p2/m, z19.h, z29.h");
955   COMPARE(fminnm(z19.VnS(), p2.Merging(), z19.VnS(), z29.VnS()),
956           "fminnm z19.s, p2/m, z19.s, z29.s");
957   COMPARE(fminnm(z19.VnD(), p2.Merging(), z19.VnD(), z29.VnD()),
958           "fminnm z19.d, p2/m, z19.d, z29.d");
959   COMPARE(fmulx(z30.VnH(), p6.Merging(), z30.VnH(), z20.VnH()),
960           "fmulx z30.h, p6/m, z30.h, z20.h");
961   COMPARE(fmulx(z30.VnS(), p6.Merging(), z30.VnS(), z20.VnS()),
962           "fmulx z30.s, p6/m, z30.s, z20.s");
963   COMPARE(fmulx(z30.VnD(), p6.Merging(), z30.VnD(), z20.VnD()),
964           "fmulx z30.d, p6/m, z30.d, z20.d");
965   COMPARE(fmul(z26.VnH(), p2.Merging(), z26.VnH(), z6.VnH()),
966           "fmul z26.h, p2/m, z26.h, z6.h");
967   COMPARE(fmul(z26.VnS(), p2.Merging(), z26.VnS(), z6.VnS()),
968           "fmul z26.s, p2/m, z26.s, z6.s");
969   COMPARE(fmul(z26.VnD(), p2.Merging(), z26.VnD(), z6.VnD()),
970           "fmul z26.d, p2/m, z26.d, z6.d");
971   COMPARE(fscale(z8.VnH(), p3.Merging(), z8.VnH(), z6.VnH()),
972           "fscale z8.h, p3/m, z8.h, z6.h");
973   COMPARE(fscale(z8.VnS(), p3.Merging(), z8.VnS(), z6.VnS()),
974           "fscale z8.s, p3/m, z8.s, z6.s");
975   COMPARE(fscale(z8.VnD(), p3.Merging(), z8.VnD(), z6.VnD()),
976           "fscale z8.d, p3/m, z8.d, z6.d");
977   COMPARE(fsubr(z16.VnH(), p5.Merging(), z16.VnH(), z15.VnH()),
978           "fsubr z16.h, p5/m, z16.h, z15.h");
979   COMPARE(fsubr(z16.VnS(), p5.Merging(), z16.VnS(), z15.VnS()),
980           "fsubr z16.s, p5/m, z16.s, z15.s");
981   COMPARE(fsubr(z16.VnD(), p5.Merging(), z16.VnD(), z15.VnD()),
982           "fsubr z16.d, p5/m, z16.d, z15.d");
983   COMPARE(fsub(z16.VnH(), p5.Merging(), z16.VnH(), z26.VnH()),
984           "fsub z16.h, p5/m, z16.h, z26.h");
985   COMPARE(fsub(z16.VnS(), p5.Merging(), z16.VnS(), z26.VnS()),
986           "fsub z16.s, p5/m, z16.s, z26.s");
987   COMPARE(fsub(z16.VnD(), p5.Merging(), z16.VnD(), z26.VnD()),
988           "fsub z16.d, p5/m, z16.d, z26.d");
989 
990   COMPARE_MACRO(Fsub(z0.VnH(), p0.Merging(), z1.VnH(), z0.VnH()),
991                 "fsubr z0.h, p0/m, z0.h, z1.h");
992 
993   COMPARE_MACRO(Fadd(z0.VnH(),
994                      p0.Merging(),
995                      z1.VnH(),
996                      z2.VnH(),
997                      FastNaNPropagation),
998                 "movprfx z0.h, p0/m, z1.h\n"
999                 "fadd z0.h, p0/m, z0.h, z2.h");
1000   COMPARE_MACRO(Fadd(z0.VnH(),
1001                      p0.Merging(),
1002                      z1.VnH(),
1003                      z0.VnH(),
1004                      FastNaNPropagation),
1005                 "fadd z0.h, p0/m, z0.h, z1.h");
1006   COMPARE_MACRO(Fadd(z0.VnH(),
1007                      p0.Merging(),
1008                      z1.VnH(),
1009                      z0.VnH(),
1010                      StrictNaNPropagation),
1011                 "movprfx z31.h, p0/m, z1.h\n"
1012                 "fadd z31.h, p0/m, z31.h, z0.h\n"
1013                 "mov z0.d, z31.d");
1014   COMPARE_MACRO(Fmul(z1.VnS(),
1015                      p1.Merging(),
1016                      z2.VnS(),
1017                      z3.VnS(),
1018                      FastNaNPropagation),
1019                 "movprfx z1.s, p1/m, z2.s\n"
1020                 "fmul z1.s, p1/m, z1.s, z3.s");
1021   COMPARE_MACRO(Fmulx(z2.VnD(),
1022                       p2.Merging(),
1023                       z3.VnD(),
1024                       z4.VnD(),
1025                       FastNaNPropagation),
1026                 "movprfx z2.d, p2/m, z3.d\n"
1027                 "fmulx z2.d, p2/m, z2.d, z4.d");
1028   COMPARE_MACRO(Fminnm(z3.VnH(),
1029                        p3.Merging(),
1030                        z4.VnH(),
1031                        z5.VnH(),
1032                        FastNaNPropagation),
1033                 "movprfx z3.h, p3/m, z4.h\n"
1034                 "fminnm z3.h, p3/m, z3.h, z5.h");
1035   COMPARE_MACRO(Fmaxnm(z4.VnS(),
1036                        p4.Merging(),
1037                        z5.VnS(),
1038                        z6.VnS(),
1039                        FastNaNPropagation),
1040                 "movprfx z4.s, p4/m, z5.s\n"
1041                 "fmaxnm z4.s, p4/m, z4.s, z6.s");
1042   COMPARE_MACRO(Fsub(z5.VnD(), p5.Merging(), z6.VnD(), z7.VnD()),
1043                 "movprfx z5.d, p5/m, z6.d\n"
1044                 "fsub z5.d, p5/m, z5.d, z7.d");
1045   COMPARE_MACRO(Fscale(z6.VnH(), p6.Merging(), z7.VnH(), z8.VnH()),
1046                 "movprfx z6.h, p6/m, z7.h\n"
1047                 "fscale z6.h, p6/m, z6.h, z8.h");
1048   COMPARE_MACRO(Fscale(z7.VnS(), p7.Merging(), z8.VnS(), z7.VnS()),
1049                 "mov z31.d, z7.d\n"
1050                 "movprfx z7.s, p7/m, z8.s\n"
1051                 "fscale z7.s, p7/m, z7.s, z31.s");
1052 
1053   COMPARE(fadd(z18.VnH(), p0.Merging(), z18.VnH(), 0.5),
1054           "fadd z18.h, p0/m, z18.h, #0.5");
1055   COMPARE(fadd(z18.VnS(), p0.Merging(), z18.VnS(), 1.0),
1056           "fadd z18.s, p0/m, z18.s, #1.0");
1057   COMPARE(fadd(z18.VnD(), p0.Merging(), z18.VnD(), 1.0),
1058           "fadd z18.d, p0/m, z18.d, #1.0");
1059   COMPARE(fmaxnm(z6.VnH(), p1.Merging(), z6.VnH(), 0.0),
1060           "fmaxnm z6.h, p1/m, z6.h, #0.0");
1061   COMPARE(fmaxnm(z6.VnS(), p1.Merging(), z6.VnS(), 1.0),
1062           "fmaxnm z6.s, p1/m, z6.s, #1.0");
1063   COMPARE(fmaxnm(z6.VnD(), p1.Merging(), z6.VnD(), 1.0),
1064           "fmaxnm z6.d, p1/m, z6.d, #1.0");
1065   COMPARE(fmax(z8.VnH(), p6.Merging(), z8.VnH(), 0.0),
1066           "fmax z8.h, p6/m, z8.h, #0.0");
1067   COMPARE(fmax(z8.VnS(), p6.Merging(), z8.VnS(), 0.0),
1068           "fmax z8.s, p6/m, z8.s, #0.0");
1069   COMPARE(fmax(z8.VnD(), p6.Merging(), z8.VnD(), 1.0),
1070           "fmax z8.d, p6/m, z8.d, #1.0");
1071   COMPARE(fminnm(z26.VnH(), p0.Merging(), z26.VnH(), 1.0),
1072           "fminnm z26.h, p0/m, z26.h, #1.0");
1073   COMPARE(fminnm(z26.VnS(), p0.Merging(), z26.VnS(), 0.0),
1074           "fminnm z26.s, p0/m, z26.s, #0.0");
1075   COMPARE(fminnm(z26.VnD(), p0.Merging(), z26.VnD(), 1.0),
1076           "fminnm z26.d, p0/m, z26.d, #1.0");
1077   COMPARE(fmin(z22.VnH(), p0.Merging(), z22.VnH(), 1.0),
1078           "fmin z22.h, p0/m, z22.h, #1.0");
1079   COMPARE(fmin(z22.VnS(), p0.Merging(), z22.VnS(), 1.0),
1080           "fmin z22.s, p0/m, z22.s, #1.0");
1081   COMPARE(fmin(z22.VnD(), p0.Merging(), z22.VnD(), 0.0),
1082           "fmin z22.d, p0/m, z22.d, #0.0");
1083   COMPARE(fmul(z21.VnH(), p3.Merging(), z21.VnH(), 0.5),
1084           "fmul z21.h, p3/m, z21.h, #0.5");
1085   COMPARE(fmul(z21.VnS(), p3.Merging(), z21.VnS(), 2.0),
1086           "fmul z21.s, p3/m, z21.s, #2.0");
1087   COMPARE(fmul(z21.VnD(), p3.Merging(), z21.VnD(), 2.0),
1088           "fmul z21.d, p3/m, z21.d, #2.0");
1089   COMPARE(fsubr(z21.VnH(), p3.Merging(), z21.VnH(), 1.0),
1090           "fsubr z21.h, p3/m, z21.h, #1.0");
1091   COMPARE(fsubr(z21.VnS(), p3.Merging(), z21.VnS(), 0.5),
1092           "fsubr z21.s, p3/m, z21.s, #0.5");
1093   COMPARE(fsubr(z21.VnD(), p3.Merging(), z21.VnD(), 1.0),
1094           "fsubr z21.d, p3/m, z21.d, #1.0");
1095   COMPARE(fsub(z26.VnH(), p4.Merging(), z26.VnH(), 0.5),
1096           "fsub z26.h, p4/m, z26.h, #0.5");
1097   COMPARE(fsub(z26.VnS(), p4.Merging(), z26.VnS(), 1.0),
1098           "fsub z26.s, p4/m, z26.s, #1.0");
1099   COMPARE(fsub(z26.VnD(), p4.Merging(), z26.VnD(), 0.5),
1100           "fsub z26.d, p4/m, z26.d, #0.5");
1101 
1102   COMPARE_MACRO(Fadd(z18.VnH(), p0.Merging(), z8.VnH(), 1.0),
1103                 "movprfx z18.h, p0/m, z8.h\n"
1104                 "fadd z18.h, p0/m, z18.h, #1.0");
1105   COMPARE_MACRO(Fsub(z19.VnH(), p1.Merging(), z9.VnH(), 0.5),
1106                 "movprfx z19.h, p1/m, z9.h\n"
1107                 "fsub z19.h, p1/m, z19.h, #0.5");
1108   COMPARE_MACRO(Fsub(z20.VnH(), p2.Merging(), 1.0, z10.VnH()),
1109                 "movprfx z20.h, p2/m, z10.h\n"
1110                 "fsubr z20.h, p2/m, z20.h, #1.0");
1111   COMPARE_MACRO(Fmul(z21.VnH(), p3.Merging(), z11.VnH(), 2.0),
1112                 "movprfx z21.h, p3/m, z11.h\n"
1113                 "fmul z21.h, p3/m, z21.h, #2.0");
1114   COMPARE_MACRO(Fmin(z22.VnH(), p4.Merging(), z12.VnH(), 0.0),
1115                 "movprfx z22.h, p4/m, z12.h\n"
1116                 "fmin z22.h, p4/m, z22.h, #0.0");
1117   COMPARE_MACRO(Fminnm(z22.VnH(), p4.Merging(), z12.VnH(), 0.0),
1118                 "movprfx z22.h, p4/m, z12.h\n"
1119                 "fminnm z22.h, p4/m, z22.h, #0.0");
1120   COMPARE_MACRO(Fmax(z23.VnH(), p5.Merging(), z13.VnH(), 1.0),
1121                 "movprfx z23.h, p5/m, z13.h\n"
1122                 "fmax z23.h, p5/m, z23.h, #1.0");
1123   COMPARE_MACRO(Fmaxnm(z23.VnH(), p5.Merging(), z13.VnH(), 1.0),
1124                 "movprfx z23.h, p5/m, z13.h\n"
1125                 "fmaxnm z23.h, p5/m, z23.h, #1.0");
1126   CLEANUP();
1127 }
1128 
TEST(sve_fp_arithmetic_predicated_macro_fast_nan_propagation)1129 TEST(sve_fp_arithmetic_predicated_macro_fast_nan_propagation) {
1130 #pragma GCC diagnostic push
1131 #pragma GCC diagnostic ignored "-Wshadow"
1132 
1133   // Shadow the `MacroAssembler` type so that the test macros work without
1134   // modification.
1135   typedef FastNaNPropagationMacroAssembler MacroAssembler;
1136 
1137   SETUP();
1138 
1139   COMPARE_MACRO(Fdiv(z8.VnH(), p4.Merging(), z8.VnH(), z4.VnH()),
1140                 "fdiv z8.h, p4/m, z8.h, z4.h");
1141   COMPARE_MACRO(Fdiv(z18.VnS(), p5.Merging(), z18.VnS(), z14.VnS()),
1142                 "fdiv z18.s, p5/m, z18.s, z14.s");
1143   COMPARE_MACRO(Fdiv(z28.VnD(), p6.Merging(), z28.VnD(), z24.VnD()),
1144                 "fdiv z28.d, p6/m, z28.d, z24.d");
1145   COMPARE_MACRO(Fdiv(z17.VnH(), p2.Merging(), z17.VnH(), z17.VnH()),
1146                 "fdiv z17.h, p2/m, z17.h, z17.h");
1147   COMPARE_MACRO(Fdiv(z20.VnS(), p5.Merging(), z23.VnS(), z20.VnS()),
1148                 "fdivr z20.s, p5/m, z20.s, z23.s");
1149   COMPARE_MACRO(Fdiv(z15.VnD(), p6.Merging(), z30.VnD(), z8.VnD()),
1150                 "movprfx z15.d, p6/m, z30.d\n"
1151                 "fdiv z15.d, p6/m, z15.d, z8.d");
1152 
1153   COMPARE_MACRO(Fmax(z8.VnH(), p4.Merging(), z8.VnH(), z4.VnH()),
1154                 "fmax z8.h, p4/m, z8.h, z4.h");
1155   COMPARE_MACRO(Fmax(z18.VnS(), p5.Merging(), z18.VnS(), z14.VnS()),
1156                 "fmax z18.s, p5/m, z18.s, z14.s");
1157   COMPARE_MACRO(Fmax(z28.VnD(), p6.Merging(), z28.VnD(), z24.VnD()),
1158                 "fmax z28.d, p6/m, z28.d, z24.d");
1159   COMPARE_MACRO(Fmax(z17.VnH(), p2.Merging(), z17.VnH(), z17.VnH()),
1160                 "fmax z17.h, p2/m, z17.h, z17.h");
1161   COMPARE_MACRO(Fmax(z20.VnS(), p5.Merging(), z23.VnS(), z20.VnS()),
1162                 "fmax z20.s, p5/m, z20.s, z23.s");
1163   COMPARE_MACRO(Fmax(z15.VnD(), p6.Merging(), z30.VnD(), z8.VnD()),
1164                 "movprfx z15.d, p6/m, z30.d\n"
1165                 "fmax z15.d, p6/m, z15.d, z8.d");
1166 
1167   COMPARE_MACRO(Fmin(z8.VnH(), p4.Merging(), z8.VnH(), z4.VnH()),
1168                 "fmin z8.h, p4/m, z8.h, z4.h");
1169   COMPARE_MACRO(Fmin(z18.VnS(), p5.Merging(), z18.VnS(), z14.VnS()),
1170                 "fmin z18.s, p5/m, z18.s, z14.s");
1171   COMPARE_MACRO(Fmin(z28.VnD(), p6.Merging(), z28.VnD(), z24.VnD()),
1172                 "fmin z28.d, p6/m, z28.d, z24.d");
1173   COMPARE_MACRO(Fmin(z17.VnH(), p2.Merging(), z17.VnH(), z17.VnH()),
1174                 "fmin z17.h, p2/m, z17.h, z17.h");
1175   COMPARE_MACRO(Fmin(z20.VnS(), p5.Merging(), z23.VnS(), z20.VnS()),
1176                 "fmin z20.s, p5/m, z20.s, z23.s");
1177   COMPARE_MACRO(Fmin(z15.VnD(), p6.Merging(), z30.VnD(), z8.VnD()),
1178                 "movprfx z15.d, p6/m, z30.d\n"
1179                 "fmin z15.d, p6/m, z15.d, z8.d");
1180 
1181   CLEANUP();
1182 
1183 #pragma GCC diagnostic pop
1184 }
1185 
TEST(sve_fp_arithmetic_predicated_macro_strict_nan_propagation)1186 TEST(sve_fp_arithmetic_predicated_macro_strict_nan_propagation) {
1187 #pragma GCC diagnostic push
1188 #pragma GCC diagnostic ignored "-Wshadow"
1189 
1190   // Shadow the `MacroAssembler` type so that the test macros work without
1191   // modification.
1192   typedef StrictNaNPropagationMacroAssembler MacroAssembler;
1193 
1194   SETUP();
1195 
1196   COMPARE_MACRO(Fdiv(z8.VnH(), p4.Merging(), z8.VnH(), z4.VnH()),
1197                 "fdiv z8.h, p4/m, z8.h, z4.h");
1198   COMPARE_MACRO(Fdiv(z18.VnS(), p5.Merging(), z18.VnS(), z14.VnS()),
1199                 "fdiv z18.s, p5/m, z18.s, z14.s");
1200   COMPARE_MACRO(Fdiv(z28.VnD(), p6.Merging(), z28.VnD(), z24.VnD()),
1201                 "fdiv z28.d, p6/m, z28.d, z24.d");
1202   COMPARE_MACRO(Fdiv(z17.VnH(), p2.Merging(), z17.VnH(), z17.VnH()),
1203                 "fdiv z17.h, p2/m, z17.h, z17.h");
1204   COMPARE_MACRO(Fdiv(z20.VnS(), p5.Merging(), z23.VnS(), z20.VnS()),
1205                 "fdivr z20.s, p5/m, z20.s, z23.s");
1206   COMPARE_MACRO(Fdiv(z15.VnD(), p6.Merging(), z30.VnD(), z8.VnD()),
1207                 "movprfx z15.d, p6/m, z30.d\n"
1208                 "fdiv z15.d, p6/m, z15.d, z8.d");
1209 
1210   COMPARE_MACRO(Fmax(z8.VnH(), p4.Merging(), z8.VnH(), z4.VnH()),
1211                 "fmax z8.h, p4/m, z8.h, z4.h");
1212   COMPARE_MACRO(Fmax(z18.VnS(), p5.Merging(), z18.VnS(), z14.VnS()),
1213                 "fmax z18.s, p5/m, z18.s, z14.s");
1214   COMPARE_MACRO(Fmax(z28.VnD(), p6.Merging(), z28.VnD(), z24.VnD()),
1215                 "fmax z28.d, p6/m, z28.d, z24.d");
1216   COMPARE_MACRO(Fmax(z17.VnH(), p2.Merging(), z17.VnH(), z17.VnH()),
1217                 "fmax z17.h, p2/m, z17.h, z17.h");
1218   COMPARE_MACRO(Fmax(z20.VnS(), p5.Merging(), z23.VnS(), z20.VnS()),
1219                 "movprfx z31.s, p5/m, z23.s\n"
1220                 "fmax z31.s, p5/m, z31.s, z20.s\n"
1221                 "mov z20.d, z31.d");
1222   COMPARE_MACRO(Fmax(z15.VnD(), p6.Merging(), z30.VnD(), z8.VnD()),
1223                 "movprfx z15.d, p6/m, z30.d\n"
1224                 "fmax z15.d, p6/m, z15.d, z8.d");
1225 
1226   COMPARE_MACRO(Fmin(z8.VnH(), p4.Merging(), z8.VnH(), z4.VnH()),
1227                 "fmin z8.h, p4/m, z8.h, z4.h");
1228   COMPARE_MACRO(Fmin(z18.VnS(), p5.Merging(), z18.VnS(), z14.VnS()),
1229                 "fmin z18.s, p5/m, z18.s, z14.s");
1230   COMPARE_MACRO(Fmin(z28.VnD(), p6.Merging(), z28.VnD(), z24.VnD()),
1231                 "fmin z28.d, p6/m, z28.d, z24.d");
1232   COMPARE_MACRO(Fmin(z17.VnH(), p2.Merging(), z17.VnH(), z17.VnH()),
1233                 "fmin z17.h, p2/m, z17.h, z17.h");
1234   COMPARE_MACRO(Fmin(z20.VnS(), p5.Merging(), z23.VnS(), z20.VnS()),
1235                 "movprfx z31.s, p5/m, z23.s\n"
1236                 "fmin z31.s, p5/m, z31.s, z20.s\n"
1237                 "mov z20.d, z31.d");
1238   COMPARE_MACRO(Fmin(z15.VnD(), p6.Merging(), z30.VnD(), z8.VnD()),
1239                 "movprfx z15.d, p6/m, z30.d\n"
1240                 "fmin z15.d, p6/m, z15.d, z8.d");
1241 
1242   CLEANUP();
1243 
1244 #pragma GCC diagnostic pop
1245 }
1246 
TEST(sve_fp_arithmetic_unpredicated)1247 TEST(sve_fp_arithmetic_unpredicated) {
1248   SETUP();
1249 
1250   COMPARE(fadd(z5.VnH(), z24.VnH(), z11.VnH()), "fadd z5.h, z24.h, z11.h");
1251   COMPARE(fadd(z15.VnS(), z14.VnS(), z12.VnS()), "fadd z15.s, z14.s, z12.s");
1252   COMPARE(fadd(z25.VnD(), z4.VnD(), z13.VnD()), "fadd z25.d, z4.d, z13.d");
1253   COMPARE(fmul(z9.VnH(), z24.VnH(), z10.VnH()), "fmul z9.h, z24.h, z10.h");
1254   COMPARE(fmul(z19.VnS(), z14.VnS(), z0.VnS()), "fmul z19.s, z14.s, z0.s");
1255   COMPARE(fmul(z29.VnD(), z4.VnD(), z20.VnD()), "fmul z29.d, z4.d, z20.d");
1256   COMPARE(fsub(z4.VnH(), z14.VnH(), z29.VnH()), "fsub z4.h, z14.h, z29.h");
1257   COMPARE(fsub(z14.VnS(), z24.VnS(), z9.VnS()), "fsub z14.s, z24.s, z9.s");
1258   COMPARE(fsub(z14.VnD(), z4.VnD(), z19.VnD()), "fsub z14.d, z4.d, z19.d");
1259   COMPARE(frecps(z14.VnH(), z29.VnH(), z18.VnH()),
1260           "frecps z14.h, z29.h, z18.h");
1261   COMPARE(frecps(z14.VnS(), z29.VnS(), z18.VnS()),
1262           "frecps z14.s, z29.s, z18.s");
1263   COMPARE(frecps(z14.VnD(), z29.VnD(), z18.VnD()),
1264           "frecps z14.d, z29.d, z18.d");
1265   COMPARE(frsqrts(z5.VnH(), z6.VnH(), z28.VnH()), "frsqrts z5.h, z6.h, z28.h");
1266   COMPARE(frsqrts(z5.VnS(), z6.VnS(), z28.VnS()), "frsqrts z5.s, z6.s, z28.s");
1267   COMPARE(frsqrts(z5.VnD(), z6.VnD(), z28.VnD()), "frsqrts z5.d, z6.d, z28.d");
1268   COMPARE(ftsmul(z21.VnH(), z17.VnH(), z24.VnH()),
1269           "ftsmul z21.h, z17.h, z24.h");
1270   COMPARE(ftsmul(z21.VnS(), z17.VnS(), z24.VnS()),
1271           "ftsmul z21.s, z17.s, z24.s");
1272   COMPARE(ftsmul(z21.VnD(), z17.VnD(), z24.VnD()),
1273           "ftsmul z21.d, z17.d, z24.d");
1274 
1275   CLEANUP();
1276 }
1277 
TEST(sve_fp_compare_vectors)1278 TEST(sve_fp_compare_vectors) {
1279   SETUP();
1280 
1281 
1282   COMPARE(facge(p1.VnH(), p3.Zeroing(), z22.VnH(), z25.VnH()),
1283           "facge p1.h, p3/z, z22.h, z25.h");
1284   COMPARE(facge(p1.VnS(), p3.Zeroing(), z22.VnS(), z25.VnS()),
1285           "facge p1.s, p3/z, z22.s, z25.s");
1286   COMPARE(facge(p1.VnD(), p3.Zeroing(), z22.VnD(), z25.VnD()),
1287           "facge p1.d, p3/z, z22.d, z25.d");
1288   COMPARE(facgt(p8.VnH(), p7.Zeroing(), z25.VnH(), z17.VnH()),
1289           "facgt p8.h, p7/z, z25.h, z17.h");
1290   COMPARE(facgt(p8.VnS(), p7.Zeroing(), z25.VnS(), z17.VnS()),
1291           "facgt p8.s, p7/z, z25.s, z17.s");
1292   COMPARE(facgt(p8.VnD(), p7.Zeroing(), z25.VnD(), z17.VnD()),
1293           "facgt p8.d, p7/z, z25.d, z17.d");
1294   COMPARE(fcmeq(p10.VnH(), p2.Zeroing(), z1.VnH(), z17.VnH()),
1295           "fcmeq p10.h, p2/z, z1.h, z17.h");
1296   COMPARE(fcmeq(p10.VnS(), p2.Zeroing(), z1.VnS(), z17.VnS()),
1297           "fcmeq p10.s, p2/z, z1.s, z17.s");
1298   COMPARE(fcmeq(p10.VnD(), p2.Zeroing(), z1.VnD(), z17.VnD()),
1299           "fcmeq p10.d, p2/z, z1.d, z17.d");
1300   COMPARE(fcmge(p0.VnH(), p0.Zeroing(), z1.VnH(), z0.VnH()),
1301           "fcmge p0.h, p0/z, z1.h, z0.h");
1302   COMPARE(fcmge(p0.VnS(), p0.Zeroing(), z1.VnS(), z0.VnS()),
1303           "fcmge p0.s, p0/z, z1.s, z0.s");
1304   COMPARE(fcmge(p0.VnD(), p0.Zeroing(), z1.VnD(), z0.VnD()),
1305           "fcmge p0.d, p0/z, z1.d, z0.d");
1306   COMPARE(fcmgt(p15.VnH(), p5.Zeroing(), z26.VnH(), z5.VnH()),
1307           "fcmgt p15.h, p5/z, z26.h, z5.h");
1308   COMPARE(fcmgt(p15.VnS(), p5.Zeroing(), z26.VnS(), z5.VnS()),
1309           "fcmgt p15.s, p5/z, z26.s, z5.s");
1310   COMPARE(fcmgt(p15.VnD(), p5.Zeroing(), z26.VnD(), z5.VnD()),
1311           "fcmgt p15.d, p5/z, z26.d, z5.d");
1312   COMPARE(fcmne(p2.VnH(), p1.Zeroing(), z9.VnH(), z4.VnH()),
1313           "fcmne p2.h, p1/z, z9.h, z4.h");
1314   COMPARE(fcmne(p2.VnS(), p1.Zeroing(), z9.VnS(), z4.VnS()),
1315           "fcmne p2.s, p1/z, z9.s, z4.s");
1316   COMPARE(fcmne(p2.VnD(), p1.Zeroing(), z9.VnD(), z4.VnD()),
1317           "fcmne p2.d, p1/z, z9.d, z4.d");
1318   COMPARE(fcmuo(p6.VnH(), p4.Zeroing(), z10.VnH(), z21.VnH()),
1319           "fcmuo p6.h, p4/z, z10.h, z21.h");
1320   COMPARE(fcmuo(p6.VnS(), p4.Zeroing(), z10.VnS(), z21.VnS()),
1321           "fcmuo p6.s, p4/z, z10.s, z21.s");
1322   COMPARE(fcmuo(p6.VnD(), p4.Zeroing(), z10.VnD(), z21.VnD()),
1323           "fcmuo p6.d, p4/z, z10.d, z21.d");
1324 
1325   COMPARE_MACRO(Facle(p2.VnH(), p0.Zeroing(), z11.VnH(), z15.VnH()),
1326                 "facge p2.h, p0/z, z15.h, z11.h");
1327   COMPARE_MACRO(Facle(p2.VnS(), p0.Zeroing(), z11.VnS(), z15.VnS()),
1328                 "facge p2.s, p0/z, z15.s, z11.s");
1329   COMPARE_MACRO(Facle(p2.VnD(), p0.Zeroing(), z11.VnD(), z15.VnD()),
1330                 "facge p2.d, p0/z, z15.d, z11.d");
1331   COMPARE_MACRO(Faclt(p9.VnH(), p4.Zeroing(), z27.VnH(), z5.VnH()),
1332                 "facgt p9.h, p4/z, z5.h, z27.h");
1333   COMPARE_MACRO(Faclt(p9.VnS(), p4.Zeroing(), z27.VnS(), z5.VnS()),
1334                 "facgt p9.s, p4/z, z5.s, z27.s");
1335   COMPARE_MACRO(Faclt(p9.VnD(), p4.Zeroing(), z27.VnD(), z5.VnD()),
1336                 "facgt p9.d, p4/z, z5.d, z27.d");
1337 
1338   COMPARE_MACRO(Fcmle(p12.VnH(), p2.Zeroing(), z21.VnH(), z29.VnH()),
1339                 "fcmge p12.h, p2/z, z29.h, z21.h");
1340   COMPARE_MACRO(Fcmle(p12.VnS(), p2.Zeroing(), z21.VnS(), z29.VnS()),
1341                 "fcmge p12.s, p2/z, z29.s, z21.s");
1342   COMPARE_MACRO(Fcmle(p12.VnD(), p2.Zeroing(), z21.VnD(), z29.VnD()),
1343                 "fcmge p12.d, p2/z, z29.d, z21.d");
1344   COMPARE_MACRO(Fcmlt(p7.VnH(), p3.Zeroing(), z7.VnH(), z14.VnH()),
1345                 "fcmgt p7.h, p3/z, z14.h, z7.h");
1346   COMPARE_MACRO(Fcmlt(p7.VnS(), p3.Zeroing(), z7.VnS(), z14.VnS()),
1347                 "fcmgt p7.s, p3/z, z14.s, z7.s");
1348   COMPARE_MACRO(Fcmlt(p7.VnD(), p3.Zeroing(), z7.VnD(), z14.VnD()),
1349                 "fcmgt p7.d, p3/z, z14.d, z7.d");
1350 
1351   CLEANUP();
1352 }
1353 
TEST(sve_fp_compare_with_zero)1354 TEST(sve_fp_compare_with_zero) {
1355   SETUP();
1356 
1357   COMPARE(fcmeq(p9.VnH(), p1.Zeroing(), z17.VnH(), 0),
1358           "fcmeq p9.h, p1/z, z17.h, #0.0");
1359   COMPARE(fcmeq(p9.VnS(), p1.Zeroing(), z17.VnS(), 0),
1360           "fcmeq p9.s, p1/z, z17.s, #0.0");
1361   COMPARE(fcmeq(p9.VnD(), p1.Zeroing(), z17.VnD(), 0),
1362           "fcmeq p9.d, p1/z, z17.d, #0.0");
1363   COMPARE(fcmge(p13.VnH(), p3.Zeroing(), z13.VnH(), 0),
1364           "fcmge p13.h, p3/z, z13.h, #0.0");
1365   COMPARE(fcmge(p13.VnS(), p3.Zeroing(), z13.VnS(), 0),
1366           "fcmge p13.s, p3/z, z13.s, #0.0");
1367   COMPARE(fcmge(p13.VnD(), p3.Zeroing(), z13.VnD(), 0),
1368           "fcmge p13.d, p3/z, z13.d, #0.0");
1369   COMPARE(fcmgt(p10.VnH(), p2.Zeroing(), z24.VnH(), 0),
1370           "fcmgt p10.h, p2/z, z24.h, #0.0");
1371   COMPARE(fcmgt(p10.VnS(), p2.Zeroing(), z24.VnS(), 0),
1372           "fcmgt p10.s, p2/z, z24.s, #0.0");
1373   COMPARE(fcmgt(p10.VnD(), p2.Zeroing(), z24.VnD(), 0),
1374           "fcmgt p10.d, p2/z, z24.d, #0.0");
1375   COMPARE(fcmle(p4.VnH(), p7.Zeroing(), z1.VnH(), 0),
1376           "fcmle p4.h, p7/z, z1.h, #0.0");
1377   COMPARE(fcmle(p4.VnS(), p7.Zeroing(), z1.VnS(), 0),
1378           "fcmle p4.s, p7/z, z1.s, #0.0");
1379   COMPARE(fcmle(p4.VnD(), p7.Zeroing(), z1.VnD(), 0),
1380           "fcmle p4.d, p7/z, z1.d, #0.0");
1381   COMPARE(fcmlt(p15.VnH(), p7.Zeroing(), z9.VnH(), 0),
1382           "fcmlt p15.h, p7/z, z9.h, #0.0");
1383   COMPARE(fcmlt(p15.VnS(), p7.Zeroing(), z9.VnS(), 0),
1384           "fcmlt p15.s, p7/z, z9.s, #0.0");
1385   COMPARE(fcmlt(p15.VnD(), p7.Zeroing(), z9.VnD(), 0),
1386           "fcmlt p15.d, p7/z, z9.d, #0.0");
1387   COMPARE(fcmne(p14.VnH(), p7.Zeroing(), z28.VnH(), 0),
1388           "fcmne p14.h, p7/z, z28.h, #0.0");
1389   COMPARE(fcmne(p14.VnS(), p7.Zeroing(), z28.VnS(), 0),
1390           "fcmne p14.s, p7/z, z28.s, #0.0");
1391   COMPARE(fcmne(p14.VnD(), p7.Zeroing(), z28.VnD(), 0),
1392           "fcmne p14.d, p7/z, z28.d, #0.0");
1393 
1394   CLEANUP();
1395 }
1396 
TEST(sve_fp_complex_addition)1397 TEST(sve_fp_complex_addition) {
1398   SETUP();
1399 
1400   COMPARE(fcadd(z12.VnH(), p5.Merging(), z12.VnH(), z13.VnH(), 90),
1401           "fcadd z12.h, p5/m, z12.h, z13.h, #90");
1402   COMPARE(fcadd(z12.VnS(), p5.Merging(), z12.VnS(), z13.VnS(), 90),
1403           "fcadd z12.s, p5/m, z12.s, z13.s, #90");
1404   COMPARE(fcadd(z12.VnD(), p5.Merging(), z12.VnD(), z13.VnD(), 90),
1405           "fcadd z12.d, p5/m, z12.d, z13.d, #90");
1406   COMPARE(fcadd(z22.VnH(), p0.Merging(), z22.VnH(), z23.VnH(), 270),
1407           "fcadd z22.h, p0/m, z22.h, z23.h, #270");
1408   COMPARE(fcadd(z22.VnS(), p0.Merging(), z22.VnS(), z23.VnS(), 270),
1409           "fcadd z22.s, p0/m, z22.s, z23.s, #270");
1410   COMPARE(fcadd(z22.VnD(), p0.Merging(), z22.VnD(), z23.VnD(), 270),
1411           "fcadd z22.d, p0/m, z22.d, z23.d, #270");
1412 
1413   COMPARE_MACRO(Fcadd(z12.VnH(), p5.Merging(), z1.VnH(), z13.VnH(), 90),
1414                 "movprfx z12.h, p5/m, z1.h\n"
1415                 "fcadd z12.h, p5/m, z12.h, z13.h, #90");
1416   COMPARE_MACRO(Fcadd(z12.VnH(), p5.Merging(), z1.VnH(), z12.VnH(), 90),
1417                 "movprfx z31.h, p5/m, z1.h\n"
1418                 "fcadd z31.h, p5/m, z31.h, z12.h, #90\n"
1419                 "mov z12.d, z31.d");
1420   CLEANUP();
1421 }
1422 
TEST(sve_fp_complex_mul_add)1423 TEST(sve_fp_complex_mul_add) {
1424   SETUP();
1425 
1426   COMPARE_MACRO(Fcmla(z19.VnH(),
1427                       p7.Merging(),
1428                       z19.VnH(),
1429                       z16.VnH(),
1430                       z0.VnH(),
1431                       90),
1432                 "fcmla z19.h, p7/m, z16.h, z0.h, #90");
1433   COMPARE_MACRO(Fcmla(z19.VnS(),
1434                       p7.Merging(),
1435                       z19.VnS(),
1436                       z16.VnS(),
1437                       z0.VnS(),
1438                       90),
1439                 "fcmla z19.s, p7/m, z16.s, z0.s, #90");
1440   COMPARE_MACRO(Fcmla(z19.VnD(),
1441                       p7.Merging(),
1442                       z19.VnD(),
1443                       z16.VnD(),
1444                       z0.VnD(),
1445                       90),
1446                 "fcmla z19.d, p7/m, z16.d, z0.d, #90");
1447 
1448   COMPARE_MACRO(Fcmla(z20.VnD(),
1449                       p6.Merging(),
1450                       z20.VnD(),
1451                       z15.VnD(),
1452                       z1.VnD(),
1453                       0),
1454                 "fcmla z20.d, p6/m, z15.d, z1.d, #0");
1455   COMPARE_MACRO(Fcmla(z20.VnD(),
1456                       p6.Merging(),
1457                       z20.VnD(),
1458                       z15.VnD(),
1459                       z1.VnD(),
1460                       180),
1461                 "fcmla z20.d, p6/m, z15.d, z1.d, #180");
1462   COMPARE_MACRO(Fcmla(z20.VnD(),
1463                       p6.Merging(),
1464                       z20.VnD(),
1465                       z15.VnD(),
1466                       z1.VnD(),
1467                       270),
1468                 "fcmla z20.d, p6/m, z15.d, z1.d, #270");
1469 
1470   COMPARE_MACRO(Fcmla(z20.VnD(),
1471                       p6.Merging(),
1472                       z20.VnD(),
1473                       z15.VnD(),
1474                       z20.VnD(),
1475                       270),
1476                 "fcmla z20.d, p6/m, z15.d, z20.d, #270");
1477   COMPARE_MACRO(Fcmla(z20.VnD(),
1478                       p6.Merging(),
1479                       z21.VnD(),
1480                       z15.VnD(),
1481                       z1.VnD(),
1482                       270),
1483                 "movprfx z20.d, p6/m, z21.d\n"
1484                 "fcmla z20.d, p6/m, z15.d, z1.d, #270");
1485   COMPARE_MACRO(Fcmla(z20.VnD(),
1486                       p6.Merging(),
1487                       z21.VnD(),
1488                       z20.VnD(),
1489                       z1.VnD(),
1490                       270),
1491                 "movprfx z31, z21\n"
1492                 "fcmla z31.d, p6/m, z20.d, z1.d, #270\n"
1493                 "mov z20.d, p6/m, z31.d");
1494   COMPARE_MACRO(Fcmla(z20.VnD(),
1495                       p6.Merging(),
1496                       z21.VnD(),
1497                       z15.VnD(),
1498                       z20.VnD(),
1499                       270),
1500                 "movprfx z31, z21\n"
1501                 "fcmla z31.d, p6/m, z15.d, z20.d, #270\n"
1502                 "mov z20.d, p6/m, z31.d");
1503   COMPARE_MACRO(Fcmla(z20.VnD(),
1504                       p6.Merging(),
1505                       z21.VnD(),
1506                       z20.VnD(),
1507                       z20.VnD(),
1508                       270),
1509                 "movprfx z31, z21\n"
1510                 "fcmla z31.d, p6/m, z20.d, z20.d, #270\n"
1511                 "mov z20.d, p6/m, z31.d");
1512 
1513   CLEANUP();
1514 }
1515 
TEST(sve_fp_complex_mul_add_index)1516 TEST(sve_fp_complex_mul_add_index) {
1517   SETUP();
1518 
1519   COMPARE(fcmla(z30.VnH(), z20.VnH(), z3.VnH(), 0, 0),
1520           "fcmla z30.h, z20.h, z3.h[0], #0");
1521   COMPARE(fcmla(z30.VnH(), z20.VnH(), z3.VnH(), 1, 0),
1522           "fcmla z30.h, z20.h, z3.h[1], #0");
1523   COMPARE(fcmla(z30.VnH(), z20.VnH(), z3.VnH(), 2, 90),
1524           "fcmla z30.h, z20.h, z3.h[2], #90");
1525   COMPARE(fcmla(z30.VnH(), z20.VnH(), z3.VnH(), 0, 270),
1526           "fcmla z30.h, z20.h, z3.h[0], #270");
1527   COMPARE(fcmla(z10.VnS(), z20.VnS(), z1.VnS(), 0, 0),
1528           "fcmla z10.s, z20.s, z1.s[0], #0");
1529   COMPARE(fcmla(z10.VnS(), z20.VnS(), z1.VnS(), 1, 0),
1530           "fcmla z10.s, z20.s, z1.s[1], #0");
1531   COMPARE(fcmla(z10.VnS(), z20.VnS(), z1.VnS(), 1, 90),
1532           "fcmla z10.s, z20.s, z1.s[1], #90");
1533   COMPARE(fcmla(z10.VnS(), z20.VnS(), z1.VnS(), 0, 270),
1534           "fcmla z10.s, z20.s, z1.s[0], #270");
1535 
1536   CLEANUP();
1537 }
1538 
TEST(sve_fp_fast_reduction)1539 TEST(sve_fp_fast_reduction) {
1540   SETUP();
1541 
1542   COMPARE(faddv(h26, p6, z16.VnH()), "faddv h26, p6, z16.h");
1543   COMPARE(faddv(s26, p6, z16.VnS()), "faddv s26, p6, z16.s");
1544   COMPARE(faddv(d26, p6, z16.VnD()), "faddv d26, p6, z16.d");
1545   COMPARE(fmaxnmv(h28, p1, z0.VnH()), "fmaxnmv h28, p1, z0.h");
1546   COMPARE(fmaxnmv(s28, p1, z0.VnS()), "fmaxnmv s28, p1, z0.s");
1547   COMPARE(fmaxnmv(d28, p1, z0.VnD()), "fmaxnmv d28, p1, z0.d");
1548   COMPARE(fmaxv(h3, p1, z23.VnH()), "fmaxv h3, p1, z23.h");
1549   COMPARE(fmaxv(s3, p1, z23.VnS()), "fmaxv s3, p1, z23.s");
1550   COMPARE(fmaxv(d3, p1, z23.VnD()), "fmaxv d3, p1, z23.d");
1551   COMPARE(fminnmv(h20, p6, z21.VnH()), "fminnmv h20, p6, z21.h");
1552   COMPARE(fminnmv(s20, p6, z21.VnS()), "fminnmv s20, p6, z21.s");
1553   COMPARE(fminnmv(d20, p6, z21.VnD()), "fminnmv d20, p6, z21.d");
1554   COMPARE(fminv(h10, p4, z27.VnH()), "fminv h10, p4, z27.h");
1555   COMPARE(fminv(s10, p4, z27.VnS()), "fminv s10, p4, z27.s");
1556   COMPARE(fminv(d10, p4, z27.VnD()), "fminv d10, p4, z27.d");
1557 
1558   CLEANUP();
1559 }
1560 
TEST(sve_fp_mul_add)1561 TEST(sve_fp_mul_add) {
1562   SETUP();
1563 
1564   COMPARE(fmad(z31.VnH(), p2.Merging(), z8.VnH(), z1.VnH()),
1565           "fmad z31.h, p2/m, z8.h, z1.h");
1566   COMPARE(fmad(z31.VnS(), p2.Merging(), z8.VnS(), z1.VnS()),
1567           "fmad z31.s, p2/m, z8.s, z1.s");
1568   COMPARE(fmad(z31.VnD(), p2.Merging(), z8.VnD(), z1.VnD()),
1569           "fmad z31.d, p2/m, z8.d, z1.d");
1570   COMPARE(fmla(z26.VnH(), p7.Merging(), z19.VnH(), z16.VnH()),
1571           "fmla z26.h, p7/m, z19.h, z16.h");
1572   COMPARE(fmla(z26.VnS(), p7.Merging(), z19.VnS(), z16.VnS()),
1573           "fmla z26.s, p7/m, z19.s, z16.s");
1574   COMPARE(fmla(z26.VnD(), p7.Merging(), z19.VnD(), z16.VnD()),
1575           "fmla z26.d, p7/m, z19.d, z16.d");
1576   COMPARE(fmls(z20.VnH(), p6.Merging(), z28.VnH(), z0.VnH()),
1577           "fmls z20.h, p6/m, z28.h, z0.h");
1578   COMPARE(fmls(z20.VnS(), p6.Merging(), z28.VnS(), z0.VnS()),
1579           "fmls z20.s, p6/m, z28.s, z0.s");
1580   COMPARE(fmls(z20.VnD(), p6.Merging(), z28.VnD(), z0.VnD()),
1581           "fmls z20.d, p6/m, z28.d, z0.d");
1582   COMPARE(fmsb(z3.VnH(), p4.Merging(), z8.VnH(), z22.VnH()),
1583           "fmsb z3.h, p4/m, z8.h, z22.h");
1584   COMPARE(fmsb(z3.VnS(), p4.Merging(), z8.VnS(), z22.VnS()),
1585           "fmsb z3.s, p4/m, z8.s, z22.s");
1586   COMPARE(fmsb(z3.VnD(), p4.Merging(), z8.VnD(), z22.VnD()),
1587           "fmsb z3.d, p4/m, z8.d, z22.d");
1588   COMPARE(fnmad(z0.VnH(), p5.Merging(), z20.VnH(), z17.VnH()),
1589           "fnmad z0.h, p5/m, z20.h, z17.h");
1590   COMPARE(fnmad(z0.VnS(), p5.Merging(), z20.VnS(), z17.VnS()),
1591           "fnmad z0.s, p5/m, z20.s, z17.s");
1592   COMPARE(fnmad(z0.VnD(), p5.Merging(), z20.VnD(), z17.VnD()),
1593           "fnmad z0.d, p5/m, z20.d, z17.d");
1594   COMPARE(fnmla(z31.VnH(), p6.Merging(), z14.VnH(), z8.VnH()),
1595           "fnmla z31.h, p6/m, z14.h, z8.h");
1596   COMPARE(fnmla(z31.VnS(), p6.Merging(), z14.VnS(), z8.VnS()),
1597           "fnmla z31.s, p6/m, z14.s, z8.s");
1598   COMPARE(fnmla(z31.VnD(), p6.Merging(), z14.VnD(), z8.VnD()),
1599           "fnmla z31.d, p6/m, z14.d, z8.d");
1600   COMPARE(fnmls(z2.VnH(), p1.Merging(), z23.VnH(), z15.VnH()),
1601           "fnmls z2.h, p1/m, z23.h, z15.h");
1602   COMPARE(fnmls(z2.VnS(), p1.Merging(), z23.VnS(), z15.VnS()),
1603           "fnmls z2.s, p1/m, z23.s, z15.s");
1604   COMPARE(fnmls(z2.VnD(), p1.Merging(), z23.VnD(), z15.VnD()),
1605           "fnmls z2.d, p1/m, z23.d, z15.d");
1606   COMPARE(fnmsb(z28.VnH(), p3.Merging(), z26.VnH(), z11.VnH()),
1607           "fnmsb z28.h, p3/m, z26.h, z11.h");
1608   COMPARE(fnmsb(z28.VnS(), p3.Merging(), z26.VnS(), z11.VnS()),
1609           "fnmsb z28.s, p3/m, z26.s, z11.s");
1610   COMPARE(fnmsb(z28.VnD(), p3.Merging(), z26.VnD(), z11.VnD()),
1611           "fnmsb z28.d, p3/m, z26.d, z11.d");
1612 
1613   CLEANUP();
1614 }
1615 
TEST(sve_fp_mul_add_macro_strict_nan_propagation)1616 TEST(sve_fp_mul_add_macro_strict_nan_propagation) {
1617 #pragma GCC diagnostic push
1618 #pragma GCC diagnostic ignored "-Wshadow"
1619 
1620   // Shadow the `MacroAssembler` type so that the test macros work without
1621   // modification.
1622   typedef StrictNaNPropagationMacroAssembler MacroAssembler;
1623 
1624   SETUP();
1625 
1626   COMPARE_MACRO(Fmla(z0.VnH(), p1.Merging(), z0.VnH(), z2.VnH(), z4.VnH()),
1627                 "fmla z0.h, p1/m, z2.h, z4.h");
1628   COMPARE_MACRO(Fmla(z3.VnH(), p2.Merging(), z4.VnH(), z3.VnH(), z5.VnH()),
1629                 "fmad z3.h, p2/m, z5.h, z4.h");
1630   COMPARE_MACRO(Fmla(z4.VnS(), p3.Merging(), z5.VnS(), z6.VnS(), z4.VnS()),
1631                 "movprfx z31.s, p3/m, z5.s\n"
1632                 "fmla z31.s, p3/m, z6.s, z4.s\n"
1633                 "mov z4.d, z31.d");
1634   COMPARE_MACRO(Fmla(z5.VnD(), p4.Merging(), z6.VnD(), z7.VnD(), z8.VnD()),
1635                 "movprfx z5.d, p4/m, z6.d\n"
1636                 "fmla z5.d, p4/m, z7.d, z8.d");
1637 
1638   COMPARE_MACRO(Fmls(z0.VnD(), p1.Merging(), z0.VnD(), z2.VnD(), z4.VnD()),
1639                 "fmls z0.d, p1/m, z2.d, z4.d");
1640   COMPARE_MACRO(Fmls(z3.VnS(), p2.Merging(), z4.VnS(), z3.VnS(), z5.VnS()),
1641                 "fmsb z3.s, p2/m, z5.s, z4.s");
1642   COMPARE_MACRO(Fmls(z4.VnH(), p3.Merging(), z5.VnH(), z6.VnH(), z4.VnH()),
1643                 "movprfx z31.h, p3/m, z5.h\n"
1644                 "fmls z31.h, p3/m, z6.h, z4.h\n"
1645                 "mov z4.d, z31.d");
1646   COMPARE_MACRO(Fmls(z5.VnD(), p4.Merging(), z6.VnD(), z7.VnD(), z8.VnD()),
1647                 "movprfx z5.d, p4/m, z6.d\n"
1648                 "fmls z5.d, p4/m, z7.d, z8.d");
1649 
1650   COMPARE_MACRO(Fnmla(z10.VnH(), p5.Merging(), z10.VnH(), z12.VnH(), z14.VnH()),
1651                 "fnmla z10.h, p5/m, z12.h, z14.h");
1652   COMPARE_MACRO(Fnmla(z13.VnH(), p6.Merging(), z14.VnH(), z13.VnH(), z15.VnH()),
1653                 "fnmad z13.h, p6/m, z15.h, z14.h");
1654   COMPARE_MACRO(Fnmla(z14.VnS(), p7.Merging(), z15.VnS(), z16.VnS(), z14.VnS()),
1655                 "movprfx z31.s, p7/m, z15.s\n"
1656                 "fnmla z31.s, p7/m, z16.s, z14.s\n"
1657                 "mov z14.d, z31.d");
1658   COMPARE_MACRO(Fnmla(z15.VnD(), p0.Merging(), z16.VnD(), z17.VnD(), z18.VnD()),
1659                 "movprfx z15.d, p0/m, z16.d\n"
1660                 "fnmla z15.d, p0/m, z17.d, z18.d");
1661 
1662   COMPARE_MACRO(Fnmls(z10.VnD(), p5.Merging(), z10.VnD(), z12.VnD(), z14.VnD()),
1663                 "fnmls z10.d, p5/m, z12.d, z14.d");
1664   COMPARE_MACRO(Fnmls(z13.VnS(), p6.Merging(), z14.VnS(), z13.VnS(), z15.VnS()),
1665                 "fnmsb z13.s, p6/m, z15.s, z14.s");
1666   COMPARE_MACRO(Fnmls(z14.VnH(), p7.Merging(), z15.VnH(), z16.VnH(), z14.VnH()),
1667                 "movprfx z31.h, p7/m, z15.h\n"
1668                 "fnmls z31.h, p7/m, z16.h, z14.h\n"
1669                 "mov z14.d, z31.d");
1670   COMPARE_MACRO(Fnmls(z15.VnD(), p0.Merging(), z16.VnD(), z17.VnD(), z18.VnD()),
1671                 "movprfx z15.d, p0/m, z16.d\n"
1672                 "fnmls z15.d, p0/m, z17.d, z18.d");
1673 
1674   CLEANUP();
1675 
1676 #pragma GCC diagnostic pop
1677 }
1678 
TEST(sve_fp_mul_add_macro_fast_nan_propagation)1679 TEST(sve_fp_mul_add_macro_fast_nan_propagation) {
1680 #pragma GCC diagnostic push
1681 #pragma GCC diagnostic ignored "-Wshadow"
1682 
1683   // Shadow the `MacroAssembler` type so that the test macros work without
1684   // modification.
1685   typedef FastNaNPropagationMacroAssembler MacroAssembler;
1686 
1687   SETUP();
1688 
1689   COMPARE_MACRO(Fmla(z0.VnH(), p1.Merging(), z0.VnH(), z2.VnH(), z4.VnH()),
1690                 "fmla z0.h, p1/m, z2.h, z4.h");
1691   COMPARE_MACRO(Fmla(z3.VnH(), p2.Merging(), z4.VnH(), z3.VnH(), z5.VnH()),
1692                 "fmad z3.h, p2/m, z5.h, z4.h");
1693   COMPARE_MACRO(Fmla(z4.VnS(), p3.Merging(), z5.VnS(), z6.VnS(), z4.VnS()),
1694                 "fmad z4.s, p3/m, z6.s, z5.s");
1695   COMPARE_MACRO(Fmla(z5.VnD(), p4.Merging(), z6.VnD(), z7.VnD(), z8.VnD()),
1696                 "movprfx z5.d, p4/m, z6.d\n"
1697                 "fmla z5.d, p4/m, z7.d, z8.d");
1698 
1699   COMPARE_MACRO(Fmls(z0.VnD(), p1.Merging(), z0.VnD(), z2.VnD(), z4.VnD()),
1700                 "fmls z0.d, p1/m, z2.d, z4.d");
1701   COMPARE_MACRO(Fmls(z3.VnS(), p2.Merging(), z4.VnS(), z3.VnS(), z5.VnS()),
1702                 "fmsb z3.s, p2/m, z5.s, z4.s");
1703   COMPARE_MACRO(Fmls(z4.VnH(), p3.Merging(), z5.VnH(), z6.VnH(), z4.VnH()),
1704                 "fmsb z4.h, p3/m, z6.h, z5.h");
1705   COMPARE_MACRO(Fmls(z5.VnD(), p4.Merging(), z6.VnD(), z7.VnD(), z8.VnD()),
1706                 "movprfx z5.d, p4/m, z6.d\n"
1707                 "fmls z5.d, p4/m, z7.d, z8.d");
1708 
1709   COMPARE_MACRO(Fnmla(z10.VnH(), p5.Merging(), z10.VnH(), z12.VnH(), z14.VnH()),
1710                 "fnmla z10.h, p5/m, z12.h, z14.h");
1711   COMPARE_MACRO(Fnmla(z13.VnH(), p6.Merging(), z14.VnH(), z13.VnH(), z15.VnH()),
1712                 "fnmad z13.h, p6/m, z15.h, z14.h");
1713   COMPARE_MACRO(Fnmla(z14.VnS(), p7.Merging(), z15.VnS(), z16.VnS(), z14.VnS()),
1714                 "fnmad z14.s, p7/m, z16.s, z15.s");
1715   COMPARE_MACRO(Fnmla(z15.VnD(), p0.Merging(), z16.VnD(), z17.VnD(), z18.VnD()),
1716                 "movprfx z15.d, p0/m, z16.d\n"
1717                 "fnmla z15.d, p0/m, z17.d, z18.d");
1718 
1719   COMPARE_MACRO(Fnmls(z10.VnD(), p5.Merging(), z10.VnD(), z12.VnD(), z14.VnD()),
1720                 "fnmls z10.d, p5/m, z12.d, z14.d");
1721   COMPARE_MACRO(Fnmls(z13.VnS(), p6.Merging(), z14.VnS(), z13.VnS(), z15.VnS()),
1722                 "fnmsb z13.s, p6/m, z15.s, z14.s");
1723   COMPARE_MACRO(Fnmls(z14.VnH(), p7.Merging(), z15.VnH(), z16.VnH(), z14.VnH()),
1724                 "fnmsb z14.h, p7/m, z16.h, z15.h");
1725   COMPARE_MACRO(Fnmls(z15.VnD(), p0.Merging(), z16.VnD(), z17.VnD(), z18.VnD()),
1726                 "movprfx z15.d, p0/m, z16.d\n"
1727                 "fnmls z15.d, p0/m, z17.d, z18.d");
1728 
1729   CLEANUP();
1730 
1731 #pragma GCC diagnostic pop
1732 }
1733 
TEST(sve_fp_mul_add_index)1734 TEST(sve_fp_mul_add_index) {
1735   SETUP();
1736 
1737   COMPARE(fmla(z25.VnD(), z9.VnD(), z1.VnD(), 0), "fmla z25.d, z9.d, z1.d[0]");
1738   COMPARE(fmla(z25.VnD(), z9.VnD(), z1.VnD(), 1), "fmla z25.d, z9.d, z1.d[1]");
1739 
1740   COMPARE(fmla(z13.VnH(), z7.VnH(), z7.VnH(), 0), "fmla z13.h, z7.h, z7.h[0]");
1741   COMPARE(fmla(z13.VnH(), z7.VnH(), z7.VnH(), 2), "fmla z13.h, z7.h, z7.h[2]");
1742   COMPARE(fmla(z13.VnH(), z7.VnH(), z7.VnH(), 5), "fmla z13.h, z7.h, z7.h[5]");
1743   COMPARE(fmla(z13.VnH(), z7.VnH(), z7.VnH(), 7), "fmla z13.h, z7.h, z7.h[7]");
1744 
1745   COMPARE(fmla(z17.VnS(), z27.VnS(), z2.VnS(), 0),
1746           "fmla z17.s, z27.s, z2.s[0]");
1747   COMPARE(fmla(z17.VnS(), z27.VnS(), z2.VnS(), 1),
1748           "fmla z17.s, z27.s, z2.s[1]");
1749   COMPARE(fmla(z17.VnS(), z27.VnS(), z2.VnS(), 2),
1750           "fmla z17.s, z27.s, z2.s[2]");
1751   COMPARE(fmla(z17.VnS(), z27.VnS(), z2.VnS(), 3),
1752           "fmla z17.s, z27.s, z2.s[3]");
1753 
1754   COMPARE(fmls(z28.VnD(), z2.VnD(), z0.VnD(), 0), "fmls z28.d, z2.d, z0.d[0]");
1755   COMPARE(fmls(z28.VnD(), z2.VnD(), z0.VnD(), 1), "fmls z28.d, z2.d, z0.d[1]");
1756 
1757   COMPARE(fmls(z30.VnH(), z29.VnH(), z7.VnH(), 1),
1758           "fmls z30.h, z29.h, z7.h[1]");
1759   COMPARE(fmls(z30.VnH(), z29.VnH(), z7.VnH(), 4),
1760           "fmls z30.h, z29.h, z7.h[4]");
1761   COMPARE(fmls(z30.VnH(), z29.VnH(), z7.VnH(), 3),
1762           "fmls z30.h, z29.h, z7.h[3]");
1763   COMPARE(fmls(z30.VnH(), z29.VnH(), z7.VnH(), 6),
1764           "fmls z30.h, z29.h, z7.h[6]");
1765 
1766   COMPARE(fmls(z30.VnS(), z1.VnS(), z6.VnS(), 0), "fmls z30.s, z1.s, z6.s[0]");
1767   COMPARE(fmls(z30.VnS(), z1.VnS(), z6.VnS(), 1), "fmls z30.s, z1.s, z6.s[1]");
1768   COMPARE(fmls(z30.VnS(), z1.VnS(), z6.VnS(), 2), "fmls z30.s, z1.s, z6.s[2]");
1769   COMPARE(fmls(z30.VnS(), z1.VnS(), z6.VnS(), 3), "fmls z30.s, z1.s, z6.s[3]");
1770 
1771   COMPARE_MACRO(Fmla(z10.VnH(), z11.VnH(), z12.VnH(), z4.VnH(), 7),
1772                 "movprfx z10, z11\n"
1773                 "fmla z10.h, z12.h, z4.h[7]");
1774   COMPARE_MACRO(Fmla(z10.VnH(), z10.VnH(), z12.VnH(), z4.VnH(), 6),
1775                 "fmla z10.h, z12.h, z4.h[6]");
1776   COMPARE_MACRO(Fmla(z11.VnS(), z12.VnS(), z11.VnS(), z5.VnS(), 3),
1777                 "movprfx z31, z12\n"
1778                 "fmla z31.s, z11.s, z5.s[3]\n"
1779                 "mov z11.d, z31.d");
1780   COMPARE_MACRO(Fmla(z12.VnD(), z13.VnD(), z14.VnD(), z12.VnD(), 1),
1781                 "movprfx z31, z13\n"
1782                 "fmla z31.d, z14.d, z12.d[1]\n"
1783                 "mov z12.d, z31.d");
1784 
1785   COMPARE_MACRO(Fmls(z10.VnH(), z11.VnH(), z12.VnH(), z4.VnH(), 7),
1786                 "movprfx z10, z11\n"
1787                 "fmls z10.h, z12.h, z4.h[7]");
1788   COMPARE_MACRO(Fmls(z10.VnH(), z10.VnH(), z12.VnH(), z4.VnH(), 6),
1789                 "fmls z10.h, z12.h, z4.h[6]");
1790   COMPARE_MACRO(Fmls(z11.VnS(), z12.VnS(), z11.VnS(), z5.VnS(), 3),
1791                 "movprfx z31, z12\n"
1792                 "fmls z31.s, z11.s, z5.s[3]\n"
1793                 "mov z11.d, z31.d");
1794   COMPARE_MACRO(Fmls(z12.VnD(), z13.VnD(), z14.VnD(), z12.VnD(), 1),
1795                 "movprfx z31, z13\n"
1796                 "fmls z31.d, z14.d, z12.d[1]\n"
1797                 "mov z12.d, z31.d");
1798 
1799   CLEANUP();
1800 }
1801 
TEST(sve_fp_mul_index)1802 TEST(sve_fp_mul_index) {
1803   SETUP();
1804 
1805   COMPARE(fmul(z12.VnD(), z3.VnD(), z4.VnD(), 0), "fmul z12.d, z3.d, z4.d[0]");
1806   COMPARE(fmul(z12.VnD(), z3.VnD(), z4.VnD(), 1), "fmul z12.d, z3.d, z4.d[1]");
1807 
1808   COMPARE(fmul(z22.VnH(), z2.VnH(), z3.VnH(), 0), "fmul z22.h, z2.h, z3.h[0]");
1809   COMPARE(fmul(z22.VnH(), z2.VnH(), z3.VnH(), 3), "fmul z22.h, z2.h, z3.h[3]");
1810   COMPARE(fmul(z22.VnH(), z2.VnH(), z3.VnH(), 4), "fmul z22.h, z2.h, z3.h[4]");
1811   COMPARE(fmul(z22.VnH(), z2.VnH(), z3.VnH(), 7), "fmul z22.h, z2.h, z3.h[7]");
1812 
1813   COMPARE(fmul(z2.VnS(), z8.VnS(), z7.VnS(), 0), "fmul z2.s, z8.s, z7.s[0]");
1814   COMPARE(fmul(z2.VnS(), z8.VnS(), z7.VnS(), 1), "fmul z2.s, z8.s, z7.s[1]");
1815   COMPARE(fmul(z2.VnS(), z8.VnS(), z7.VnS(), 2), "fmul z2.s, z8.s, z7.s[2]");
1816   COMPARE(fmul(z2.VnS(), z8.VnS(), z7.VnS(), 3), "fmul z2.s, z8.s, z7.s[3]");
1817 
1818   CLEANUP();
1819 }
1820 
TEST(sve_fp_unary_op_predicated)1821 TEST(sve_fp_unary_op_predicated) {
1822   SETUP();
1823 
1824   COMPARE(fcvtzs(z29.VnS(), p5.Merging(), z8.VnD()),
1825           "fcvtzs z29.s, p5/m, z8.d");
1826   COMPARE(fcvtzs(z30.VnD(), p5.Merging(), z8.VnD()),
1827           "fcvtzs z30.d, p5/m, z8.d");
1828   COMPARE(fcvtzs(z14.VnH(), p1.Merging(), z29.VnH()),
1829           "fcvtzs z14.h, p1/m, z29.h");
1830   COMPARE(fcvtzs(z11.VnS(), p3.Merging(), z16.VnH()),
1831           "fcvtzs z11.s, p3/m, z16.h");
1832   COMPARE(fcvtzs(z4.VnD(), p7.Merging(), z4.VnH()), "fcvtzs z4.d, p7/m, z4.h");
1833   COMPARE(fcvtzs(z24.VnS(), p1.Merging(), z4.VnS()),
1834           "fcvtzs z24.s, p1/m, z4.s");
1835   COMPARE(fcvtzs(z25.VnD(), p4.Merging(), z24.VnS()),
1836           "fcvtzs z25.d, p4/m, z24.s");
1837   COMPARE(fcvtzu(z16.VnS(), p7.Merging(), z14.VnD()),
1838           "fcvtzu z16.s, p7/m, z14.d");
1839   COMPARE(fcvtzu(z31.VnD(), p1.Merging(), z16.VnD()),
1840           "fcvtzu z31.d, p1/m, z16.d");
1841   COMPARE(fcvtzu(z12.VnH(), p2.Merging(), z27.VnH()),
1842           "fcvtzu z12.h, p2/m, z27.h");
1843   COMPARE(fcvtzu(z26.VnS(), p6.Merging(), z29.VnH()),
1844           "fcvtzu z26.s, p6/m, z29.h");
1845   COMPARE(fcvtzu(z29.VnD(), p5.Merging(), z27.VnH()),
1846           "fcvtzu z29.d, p5/m, z27.h");
1847   COMPARE(fcvtzu(z13.VnS(), p2.Merging(), z17.VnS()),
1848           "fcvtzu z13.s, p2/m, z17.s");
1849   COMPARE(fcvtzu(z25.VnD(), p7.Merging(), z28.VnS()),
1850           "fcvtzu z25.d, p7/m, z28.s");
1851   COMPARE(scvtf(z16.VnH(), p6.Merging(), z5.VnH()), "scvtf z16.h, p6/m, z5.h");
1852   COMPARE(scvtf(z31.VnD(), p5.Merging(), z26.VnS()),
1853           "scvtf z31.d, p5/m, z26.s");
1854   COMPARE(scvtf(z0.VnH(), p7.Merging(), z0.VnS()), "scvtf z0.h, p7/m, z0.s");
1855   COMPARE(scvtf(z12.VnS(), p7.Merging(), z0.VnS()), "scvtf z12.s, p7/m, z0.s");
1856   COMPARE(scvtf(z17.VnD(), p1.Merging(), z17.VnD()),
1857           "scvtf z17.d, p1/m, z17.d");
1858   COMPARE(scvtf(z2.VnH(), p0.Merging(), z9.VnD()), "scvtf z2.h, p0/m, z9.d");
1859   COMPARE(scvtf(z26.VnS(), p5.Merging(), z4.VnD()), "scvtf z26.s, p5/m, z4.d");
1860   COMPARE(ucvtf(z27.VnH(), p4.Merging(), z25.VnH()),
1861           "ucvtf z27.h, p4/m, z25.h");
1862   COMPARE(ucvtf(z3.VnD(), p4.Merging(), z3.VnS()), "ucvtf z3.d, p4/m, z3.s");
1863   COMPARE(ucvtf(z24.VnH(), p2.Merging(), z29.VnS()),
1864           "ucvtf z24.h, p2/m, z29.s");
1865   COMPARE(ucvtf(z29.VnS(), p5.Merging(), z14.VnS()),
1866           "ucvtf z29.s, p5/m, z14.s");
1867   COMPARE(ucvtf(z7.VnD(), p2.Merging(), z14.VnD()), "ucvtf z7.d, p2/m, z14.d");
1868   COMPARE(ucvtf(z20.VnH(), p2.Merging(), z14.VnD()),
1869           "ucvtf z20.h, p2/m, z14.d");
1870   COMPARE(ucvtf(z26.VnS(), p1.Merging(), z18.VnD()),
1871           "ucvtf z26.s, p1/m, z18.d");
1872   COMPARE(frinta(z11.VnH(), p0.Merging(), z3.VnH()),
1873           "frinta z11.h, p0/m, z3.h");
1874   COMPARE(frinta(z11.VnS(), p0.Merging(), z3.VnS()),
1875           "frinta z11.s, p0/m, z3.s");
1876   COMPARE(frinta(z11.VnD(), p0.Merging(), z3.VnD()),
1877           "frinta z11.d, p0/m, z3.d");
1878   COMPARE(frinti(z17.VnH(), p0.Merging(), z16.VnH()),
1879           "frinti z17.h, p0/m, z16.h");
1880   COMPARE(frinti(z17.VnS(), p0.Merging(), z16.VnS()),
1881           "frinti z17.s, p0/m, z16.s");
1882   COMPARE(frinti(z17.VnD(), p0.Merging(), z16.VnD()),
1883           "frinti z17.d, p0/m, z16.d");
1884   COMPARE(frintm(z2.VnH(), p7.Merging(), z15.VnH()),
1885           "frintm z2.h, p7/m, z15.h");
1886   COMPARE(frintm(z2.VnS(), p7.Merging(), z15.VnS()),
1887           "frintm z2.s, p7/m, z15.s");
1888   COMPARE(frintm(z2.VnD(), p7.Merging(), z15.VnD()),
1889           "frintm z2.d, p7/m, z15.d");
1890   COMPARE(frintn(z14.VnH(), p5.Merging(), z18.VnH()),
1891           "frintn z14.h, p5/m, z18.h");
1892   COMPARE(frintn(z14.VnS(), p5.Merging(), z18.VnS()),
1893           "frintn z14.s, p5/m, z18.s");
1894   COMPARE(frintn(z14.VnD(), p5.Merging(), z18.VnD()),
1895           "frintn z14.d, p5/m, z18.d");
1896   COMPARE(frintp(z20.VnH(), p6.Merging(), z23.VnH()),
1897           "frintp z20.h, p6/m, z23.h");
1898   COMPARE(frintp(z20.VnS(), p6.Merging(), z23.VnS()),
1899           "frintp z20.s, p6/m, z23.s");
1900   COMPARE(frintp(z20.VnD(), p6.Merging(), z23.VnD()),
1901           "frintp z20.d, p6/m, z23.d");
1902   COMPARE(frintx(z2.VnH(), p6.Merging(), z18.VnH()),
1903           "frintx z2.h, p6/m, z18.h");
1904   COMPARE(frintx(z2.VnS(), p6.Merging(), z18.VnS()),
1905           "frintx z2.s, p6/m, z18.s");
1906   COMPARE(frintx(z2.VnD(), p6.Merging(), z18.VnD()),
1907           "frintx z2.d, p6/m, z18.d");
1908   COMPARE(frintz(z26.VnH(), p7.Merging(), z25.VnH()),
1909           "frintz z26.h, p7/m, z25.h");
1910   COMPARE(frintz(z26.VnS(), p7.Merging(), z25.VnS()),
1911           "frintz z26.s, p7/m, z25.s");
1912   COMPARE(frintz(z26.VnD(), p7.Merging(), z25.VnD()),
1913           "frintz z26.d, p7/m, z25.d");
1914   COMPARE(fcvt(z5.VnH(), p2.Merging(), z11.VnD()), "fcvt z5.h, p2/m, z11.d");
1915   COMPARE(fcvt(z30.VnS(), p7.Merging(), z0.VnD()), "fcvt z30.s, p7/m, z0.d");
1916   COMPARE(fcvt(z10.VnD(), p0.Merging(), z17.VnH()), "fcvt z10.d, p0/m, z17.h");
1917   COMPARE(fcvt(z28.VnS(), p3.Merging(), z27.VnH()), "fcvt z28.s, p3/m, z27.h");
1918   COMPARE(fcvt(z9.VnD(), p7.Merging(), z0.VnS()), "fcvt z9.d, p7/m, z0.s");
1919   COMPARE(fcvt(z27.VnH(), p7.Merging(), z9.VnS()), "fcvt z27.h, p7/m, z9.s");
1920   COMPARE(frecpx(z16.VnH(), p1.Merging(), z29.VnH()),
1921           "frecpx z16.h, p1/m, z29.h");
1922   COMPARE(frecpx(z16.VnS(), p1.Merging(), z29.VnS()),
1923           "frecpx z16.s, p1/m, z29.s");
1924   COMPARE(frecpx(z16.VnD(), p1.Merging(), z29.VnD()),
1925           "frecpx z16.d, p1/m, z29.d");
1926   COMPARE(fsqrt(z30.VnH(), p3.Merging(), z13.VnH()),
1927           "fsqrt z30.h, p3/m, z13.h");
1928   COMPARE(fsqrt(z30.VnS(), p3.Merging(), z13.VnS()),
1929           "fsqrt z30.s, p3/m, z13.s");
1930   COMPARE(fsqrt(z30.VnD(), p3.Merging(), z13.VnD()),
1931           "fsqrt z30.d, p3/m, z13.d");
1932 
1933   CLEANUP();
1934 }
1935 
TEST(sve_fp_unary_op_predicated_macro)1936 TEST(sve_fp_unary_op_predicated_macro) {
1937   SETUP();
1938 
1939   COMPARE_MACRO(Fcvt(z5.VnH(), p2.Zeroing(), z11.VnD()),
1940                 "movprfx z5.d, p2/z, z11.d\n"
1941                 "fcvt z5.h, p2/m, z11.d");
1942   COMPARE_MACRO(Fcvt(z30.VnS(), p7.Zeroing(), z0.VnD()),
1943                 "movprfx z30.d, p7/z, z0.d\n"
1944                 "fcvt z30.s, p7/m, z0.d");
1945   COMPARE_MACRO(Fcvt(z10.VnD(), p0.Zeroing(), z17.VnH()),
1946                 "movprfx z10.d, p0/z, z17.d\n"
1947                 "fcvt z10.d, p0/m, z17.h");
1948   COMPARE_MACRO(Fcvt(z28.VnS(), p3.Zeroing(), z27.VnH()),
1949                 "movprfx z28.s, p3/z, z27.s\n"
1950                 "fcvt z28.s, p3/m, z27.h");
1951   COMPARE_MACRO(Fcvt(z9.VnD(), p7.Zeroing(), z0.VnS()),
1952                 "movprfx z9.d, p7/z, z0.d\n"
1953                 "fcvt z9.d, p7/m, z0.s");
1954   COMPARE_MACRO(Fcvt(z27.VnH(), p7.Zeroing(), z9.VnS()),
1955                 "movprfx z27.s, p7/z, z9.s\n"
1956                 "fcvt z27.h, p7/m, z9.s");
1957   COMPARE_MACRO(Frecpx(z16.VnH(), p1.Zeroing(), z29.VnH()),
1958                 "movprfx z16.h, p1/z, z29.h\n"
1959                 "frecpx z16.h, p1/m, z29.h");
1960   COMPARE_MACRO(Frecpx(z17.VnS(), p2.Zeroing(), z30.VnS()),
1961                 "movprfx z17.s, p2/z, z30.s\n"
1962                 "frecpx z17.s, p2/m, z30.s");
1963   COMPARE_MACRO(Frecpx(z18.VnD(), p3.Zeroing(), z31.VnD()),
1964                 "movprfx z18.d, p3/z, z31.d\n"
1965                 "frecpx z18.d, p3/m, z31.d");
1966   COMPARE_MACRO(Frinta(z6.VnD(), p3.Zeroing(), z12.VnD()),
1967                 "movprfx z6.d, p3/z, z12.d\n"
1968                 "frinta z6.d, p3/m, z12.d");
1969   COMPARE_MACRO(Frinti(z7.VnS(), p3.Zeroing(), z11.VnS()),
1970                 "movprfx z7.s, p3/z, z11.s\n"
1971                 "frinti z7.s, p3/m, z11.s");
1972   COMPARE_MACRO(Frintm(z8.VnH(), p3.Zeroing(), z10.VnH()),
1973                 "movprfx z8.h, p3/z, z10.h\n"
1974                 "frintm z8.h, p3/m, z10.h");
1975   COMPARE_MACRO(Frintn(z9.VnD(), p3.Zeroing(), z9.VnD()),
1976                 "movprfx z9.d, p3/z, z9.d\n"
1977                 "frintn z9.d, p3/m, z9.d");
1978   COMPARE_MACRO(Frintp(z10.VnS(), p3.Zeroing(), z8.VnS()),
1979                 "movprfx z10.s, p3/z, z8.s\n"
1980                 "frintp z10.s, p3/m, z8.s");
1981   COMPARE_MACRO(Frintx(z11.VnH(), p3.Zeroing(), z7.VnH()),
1982                 "movprfx z11.h, p3/z, z7.h\n"
1983                 "frintx z11.h, p3/m, z7.h");
1984   COMPARE_MACRO(Frintz(z12.VnD(), p3.Zeroing(), z6.VnD()),
1985                 "movprfx z12.d, p3/z, z6.d\n"
1986                 "frintz z12.d, p3/m, z6.d");
1987   COMPARE_MACRO(Fsqrt(z30.VnH(), p3.Zeroing(), z13.VnH()),
1988                 "movprfx z30.h, p3/z, z13.h\n"
1989                 "fsqrt z30.h, p3/m, z13.h");
1990   COMPARE_MACRO(Fsqrt(z29.VnS(), p3.Zeroing(), z14.VnS()),
1991                 "movprfx z29.s, p3/z, z14.s\n"
1992                 "fsqrt z29.s, p3/m, z14.s");
1993   COMPARE_MACRO(Fsqrt(z28.VnD(), p3.Zeroing(), z15.VnD()),
1994                 "movprfx z28.d, p3/z, z15.d\n"
1995                 "fsqrt z28.d, p3/m, z15.d");
1996 
1997   CLEANUP();
1998 }
1999 
TEST(sve_fp_unary_op_unpredicated)2000 TEST(sve_fp_unary_op_unpredicated) {
2001   SETUP();
2002 
2003   COMPARE(frecpe(z0.VnH(), z2.VnH()), "frecpe z0.h, z2.h");
2004   COMPARE(frecpe(z0.VnS(), z2.VnS()), "frecpe z0.s, z2.s");
2005   COMPARE(frecpe(z0.VnD(), z2.VnD()), "frecpe z0.d, z2.d");
2006   COMPARE(frsqrte(z27.VnH(), z14.VnH()), "frsqrte z27.h, z14.h");
2007   COMPARE(frsqrte(z27.VnS(), z14.VnS()), "frsqrte z27.s, z14.s");
2008   COMPARE(frsqrte(z27.VnD(), z14.VnD()), "frsqrte z27.d, z14.d");
2009 
2010   CLEANUP();
2011 }
2012 
TEST(sve_inc_dec_by_predicate_count)2013 TEST(sve_inc_dec_by_predicate_count) {
2014   SETUP();
2015 
2016   COMPARE(decp(x17, p0.VnB()), "decp x17, p0.b");
2017   COMPARE(decp(x17, p0.VnH()), "decp x17, p0.h");
2018   COMPARE(decp(x17, p0.VnS()), "decp x17, p0.s");
2019   COMPARE(decp(x17, p0.VnD()), "decp x17, p0.d");
2020   COMPARE(decp(z2.VnH(), p11), "decp z2.h, p11");
2021   COMPARE(decp(z2.VnS(), p11), "decp z2.s, p11");
2022   COMPARE(decp(z2.VnD(), p11), "decp z2.d, p11");
2023   COMPARE(incp(x26, p8.VnB()), "incp x26, p8.b");
2024   COMPARE(incp(x26, p8.VnH()), "incp x26, p8.h");
2025   COMPARE(incp(x26, p8.VnS()), "incp x26, p8.s");
2026   COMPARE(incp(x26, p8.VnD()), "incp x26, p8.d");
2027   COMPARE(incp(z27.VnH(), p9), "incp z27.h, p9");
2028   COMPARE(incp(z27.VnS(), p9), "incp z27.s, p9");
2029   COMPARE(incp(z27.VnD(), p9), "incp z27.d, p9");
2030   COMPARE(sqdecp(x12, p7.VnB(), w12), "sqdecp x12, p7.b, w12");
2031   COMPARE(sqdecp(x12, p7.VnH(), w12), "sqdecp x12, p7.h, w12");
2032   COMPARE(sqdecp(x12, p7.VnS(), w12), "sqdecp x12, p7.s, w12");
2033   COMPARE(sqdecp(x12, p7.VnD(), w12), "sqdecp x12, p7.d, w12");
2034   COMPARE(sqdecp(x30, p5.VnB()), "sqdecp x30, p5.b");
2035   COMPARE(sqdecp(x30, p5.VnH()), "sqdecp x30, p5.h");
2036   COMPARE(sqdecp(x30, p5.VnS()), "sqdecp x30, p5.s");
2037   COMPARE(sqdecp(x30, p5.VnD()), "sqdecp x30, p5.d");
2038   COMPARE(sqdecp(z13.VnH(), p1), "sqdecp z13.h, p1");
2039   COMPARE(sqdecp(z13.VnS(), p1), "sqdecp z13.s, p1");
2040   COMPARE(sqdecp(z13.VnD(), p1), "sqdecp z13.d, p1");
2041   COMPARE(sqincp(x26, p5.VnB(), w26), "sqincp x26, p5.b, w26");
2042   COMPARE(sqincp(x26, p5.VnH(), w26), "sqincp x26, p5.h, w26");
2043   COMPARE(sqincp(x26, p5.VnS(), w26), "sqincp x26, p5.s, w26");
2044   COMPARE(sqincp(x26, p5.VnD(), w26), "sqincp x26, p5.d, w26");
2045   COMPARE(sqincp(x5, p15.VnB()), "sqincp x5, p15.b");
2046   COMPARE(sqincp(x5, p15.VnH()), "sqincp x5, p15.h");
2047   COMPARE(sqincp(x5, p15.VnS()), "sqincp x5, p15.s");
2048   COMPARE(sqincp(x5, p15.VnD()), "sqincp x5, p15.d");
2049   COMPARE(sqincp(z14.VnH(), p4), "sqincp z14.h, p4");
2050   COMPARE(sqincp(z14.VnS(), p4), "sqincp z14.s, p4");
2051   COMPARE(sqincp(z14.VnD(), p4), "sqincp z14.d, p4");
2052   COMPARE(uqdecp(w3, p13.VnB()), "uqdecp w3, p13.b");
2053   COMPARE(uqdecp(w3, p13.VnH()), "uqdecp w3, p13.h");
2054   COMPARE(uqdecp(w3, p13.VnS()), "uqdecp w3, p13.s");
2055   COMPARE(uqdecp(w3, p13.VnD()), "uqdecp w3, p13.d");
2056   COMPARE(uqdecp(x19, p0.VnB()), "uqdecp x19, p0.b");
2057   COMPARE(uqdecp(x19, p0.VnH()), "uqdecp x19, p0.h");
2058   COMPARE(uqdecp(x19, p0.VnS()), "uqdecp x19, p0.s");
2059   COMPARE(uqdecp(x19, p0.VnD()), "uqdecp x19, p0.d");
2060   COMPARE(uqdecp(z15.VnH(), p9), "uqdecp z15.h, p9");
2061   COMPARE(uqdecp(z15.VnS(), p9), "uqdecp z15.s, p9");
2062   COMPARE(uqdecp(z15.VnD(), p9), "uqdecp z15.d, p9");
2063   COMPARE(uqincp(w18, p1.VnB()), "uqincp w18, p1.b");
2064   COMPARE(uqincp(w18, p1.VnH()), "uqincp w18, p1.h");
2065   COMPARE(uqincp(w18, p1.VnS()), "uqincp w18, p1.s");
2066   COMPARE(uqincp(w18, p1.VnD()), "uqincp w18, p1.d");
2067   COMPARE(uqincp(x17, p15.VnB()), "uqincp x17, p15.b");
2068   COMPARE(uqincp(x17, p15.VnH()), "uqincp x17, p15.h");
2069   COMPARE(uqincp(x17, p15.VnS()), "uqincp x17, p15.s");
2070   COMPARE(uqincp(x17, p15.VnD()), "uqincp x17, p15.d");
2071   COMPARE(uqincp(z4.VnH(), p3), "uqincp z4.h, p3");
2072   COMPARE(uqincp(z4.VnS(), p3), "uqincp z4.s, p3");
2073   COMPARE(uqincp(z4.VnD(), p3), "uqincp z4.d, p3");
2074 
2075   CLEANUP();
2076 }
2077 
TEST(sve_inc_dec_by_predicate_count_macro)2078 TEST(sve_inc_dec_by_predicate_count_macro) {
2079   SETUP();
2080 
2081   // The MacroAssembler automatically generates movprfx where it can.
2082   COMPARE_MACRO(Decp(z0.VnD(), p1), "decp z0.d, p1");
2083   COMPARE_MACRO(Decp(z2.VnS(), p3, z2.VnS()), "decp z2.s, p3");
2084   COMPARE_MACRO(Decp(z3.VnS(), p3, z3.VnS()), "decp z3.s, p3");
2085   COMPARE_MACRO(Decp(z4.VnH(), p5, z6.VnH()),
2086                 "movprfx z4, z6\n"
2087                 "decp z4.h, p5");
2088   COMPARE_MACRO(Incp(z7.VnD(), p8), "incp z7.d, p8");
2089   COMPARE_MACRO(Incp(z9.VnS(), p10, z9.VnS()), "incp z9.s, p10");
2090   COMPARE_MACRO(Incp(z10.VnS(), p10, z10.VnS()), "incp z10.s, p10");
2091   COMPARE_MACRO(Incp(z10.VnH(), p11, z12.VnH()),
2092                 "movprfx z10, z12\n"
2093                 "incp z10.h, p11");
2094   COMPARE_MACRO(Sqdecp(z0.VnD(), p1), "sqdecp z0.d, p1");
2095   COMPARE_MACRO(Sqdecp(z2.VnS(), p3, z2.VnS()), "sqdecp z2.s, p3");
2096   COMPARE_MACRO(Sqdecp(z3.VnS(), p3, z3.VnS()), "sqdecp z3.s, p3");
2097   COMPARE_MACRO(Sqdecp(z4.VnH(), p5, z6.VnH()),
2098                 "movprfx z4, z6\n"
2099                 "sqdecp z4.h, p5");
2100   COMPARE_MACRO(Sqincp(z7.VnD(), p8), "sqincp z7.d, p8");
2101   COMPARE_MACRO(Sqincp(z9.VnS(), p10, z9.VnS()), "sqincp z9.s, p10");
2102   COMPARE_MACRO(Sqincp(z10.VnS(), p10, z10.VnS()), "sqincp z10.s, p10");
2103   COMPARE_MACRO(Sqincp(z10.VnH(), p11, z12.VnH()),
2104                 "movprfx z10, z12\n"
2105                 "sqincp z10.h, p11");
2106   COMPARE_MACRO(Uqdecp(z0.VnD(), p1), "uqdecp z0.d, p1");
2107   COMPARE_MACRO(Uqdecp(z2.VnS(), p3, z2.VnS()), "uqdecp z2.s, p3");
2108   COMPARE_MACRO(Uqdecp(z3.VnS(), p3, z3.VnS()), "uqdecp z3.s, p3");
2109   COMPARE_MACRO(Uqdecp(z4.VnH(), p5, z6.VnH()),
2110                 "movprfx z4, z6\n"
2111                 "uqdecp z4.h, p5");
2112   COMPARE_MACRO(Uqincp(z7.VnD(), p8), "uqincp z7.d, p8");
2113   COMPARE_MACRO(Uqincp(z9.VnS(), p10, z9.VnS()), "uqincp z9.s, p10");
2114   COMPARE_MACRO(Uqincp(z10.VnS(), p10, z10.VnS()), "uqincp z10.s, p10");
2115   COMPARE_MACRO(Uqincp(z10.VnH(), p11, z12.VnH()),
2116                 "movprfx z10, z12\n"
2117                 "uqincp z10.h, p11");
2118 
2119   // Sqdecp cannot write into a W register, but Uqdecp can.
2120   COMPARE_MACRO(Uqdecp(w6, p7.VnD()), "uqdecp w6, p7.d");
2121   COMPARE_MACRO(Uqdecp(x10, p11.VnH()), "uqdecp x10, p11.h");
2122   COMPARE_MACRO(Uqdecp(x12, p13.VnS()), "uqdecp x12, p13.s");
2123   COMPARE_MACRO(Uqdecp(w14, p15.VnD()), "uqdecp w14, p15.d");
2124 
2125   CLEANUP();
2126 }
2127 
TEST(sve_index_generation)2128 TEST(sve_index_generation) {
2129   SETUP();
2130 
2131   COMPARE(index(z21.VnB(), -16, 15), "index z21.b, #-16, #15");
2132   COMPARE(index(z22.VnB(), -2, 1), "index z22.b, #-2, #1");
2133   COMPARE(index(z23.VnH(), -1, 0), "index z23.h, #-1, #0");
2134   COMPARE(index(z24.VnS(), 0, -1), "index z24.s, #0, #-1");
2135   COMPARE(index(z25.VnD(), 1, -2), "index z25.d, #1, #-2");
2136   COMPARE(index(z26.VnB(), 15, -16), "index z26.b, #15, #-16");
2137   COMPARE(index(z23.VnB(), -16, w8), "index z23.b, #-16, w8");
2138   COMPARE(index(z24.VnH(), -1, x9), "index z24.h, #-1, w9");
2139   COMPARE(index(z25.VnS(), 0, w10), "index z25.s, #0, w10");
2140   COMPARE(index(z26.VnD(), 15, x11), "index z26.d, #15, x11");
2141   COMPARE(index(z14.VnB(), w15, 15), "index z14.b, w15, #15");
2142   COMPARE(index(z15.VnH(), x16, 1), "index z15.h, w16, #1");
2143   COMPARE(index(z16.VnS(), w17, 0), "index z16.s, w17, #0");
2144   COMPARE(index(z17.VnD(), x18, -16), "index z17.d, x18, #-16");
2145   COMPARE(index(z20.VnB(), w23, w21), "index z20.b, w23, w21");
2146   COMPARE(index(z21.VnH(), x24, w22), "index z21.h, w24, w22");
2147   COMPARE(index(z22.VnS(), w25, x23), "index z22.s, w25, w23");
2148   COMPARE(index(z23.VnD(), x26, x24), "index z23.d, x26, x24");
2149 
2150   // Simple pass-through macros.
2151   COMPARE_MACRO(Index(z21.VnB(), -16, 15), "index z21.b, #-16, #15");
2152   COMPARE_MACRO(Index(z22.VnB(), -2, 1), "index z22.b, #-2, #1");
2153   COMPARE_MACRO(Index(z23.VnH(), -1, 0), "index z23.h, #-1, #0");
2154   COMPARE_MACRO(Index(z24.VnS(), 0, -1), "index z24.s, #0, #-1");
2155   COMPARE_MACRO(Index(z25.VnD(), 1, -2), "index z25.d, #1, #-2");
2156   COMPARE_MACRO(Index(z26.VnB(), 15, -16), "index z26.b, #15, #-16");
2157   COMPARE_MACRO(Index(z23.VnB(), -16, w8), "index z23.b, #-16, w8");
2158   COMPARE_MACRO(Index(z24.VnH(), -1, x9), "index z24.h, #-1, w9");
2159   COMPARE_MACRO(Index(z25.VnS(), 0, w10), "index z25.s, #0, w10");
2160   COMPARE_MACRO(Index(z26.VnD(), 15, x11), "index z26.d, #15, x11");
2161   COMPARE_MACRO(Index(z14.VnB(), w15, 15), "index z14.b, w15, #15");
2162   COMPARE_MACRO(Index(z15.VnH(), x16, 1), "index z15.h, w16, #1");
2163   COMPARE_MACRO(Index(z16.VnS(), w17, 0), "index z16.s, w17, #0");
2164   COMPARE_MACRO(Index(z17.VnD(), x18, -16), "index z17.d, x18, #-16");
2165   COMPARE_MACRO(Index(z20.VnB(), w23, w21), "index z20.b, w23, w21");
2166   COMPARE_MACRO(Index(z21.VnH(), x24, w22), "index z21.h, w24, w22");
2167   COMPARE_MACRO(Index(z22.VnS(), w25, x23), "index z22.s, w25, w23");
2168   COMPARE_MACRO(Index(z23.VnD(), x26, x24), "index z23.d, x26, x24");
2169 
2170   // Argument synthesis.
2171   COMPARE_MACRO(Index(z0.VnB(), 16, -17),
2172                 "mov w16, #0x10\n"
2173                 "mov w17, #0xffffffef\n"
2174                 "index z0.b, w16, w17");
2175   COMPARE_MACRO(Index(z1.VnH(), x2, -17),
2176                 "mov w16, #0xffffffef\n"
2177                 "index z1.h, w2, w16");
2178   COMPARE_MACRO(Index(z3.VnS(), 16, w4),
2179                 "mov w16, #0x10\n"
2180                 "index z3.s, w16, w4");
2181   COMPARE_MACRO(Index(z4.VnD(), -17, 16),
2182                 "mov x16, #0xffffffffffffffef\n"
2183                 "mov x17, #0x10\n"
2184                 "index z4.d, x16, x17");
2185 
2186   CLEANUP();
2187 }
2188 
TEST(sve_int_arithmetic_unpredicated)2189 TEST(sve_int_arithmetic_unpredicated) {
2190   SETUP();
2191 
2192   COMPARE(add(z23.VnB(), z30.VnB(), z31.VnB()), "add z23.b, z30.b, z31.b");
2193   COMPARE(add(z24.VnH(), z29.VnH(), z30.VnH()), "add z24.h, z29.h, z30.h");
2194   COMPARE(add(z25.VnS(), z28.VnS(), z29.VnS()), "add z25.s, z28.s, z29.s");
2195   COMPARE(add(z26.VnD(), z27.VnD(), z28.VnD()), "add z26.d, z27.d, z28.d");
2196   COMPARE(sqadd(z26.VnB(), z21.VnB(), z1.VnB()), "sqadd z26.b, z21.b, z1.b");
2197   COMPARE(sqadd(z25.VnH(), z20.VnH(), z2.VnH()), "sqadd z25.h, z20.h, z2.h");
2198   COMPARE(sqadd(z24.VnS(), z19.VnS(), z3.VnS()), "sqadd z24.s, z19.s, z3.s");
2199   COMPARE(sqadd(z23.VnD(), z18.VnD(), z4.VnD()), "sqadd z23.d, z18.d, z4.d");
2200   COMPARE(sqsub(z1.VnB(), z10.VnB(), z0.VnB()), "sqsub z1.b, z10.b, z0.b");
2201   COMPARE(sqsub(z2.VnH(), z11.VnH(), z1.VnH()), "sqsub z2.h, z11.h, z1.h");
2202   COMPARE(sqsub(z3.VnS(), z12.VnS(), z2.VnS()), "sqsub z3.s, z12.s, z2.s");
2203   COMPARE(sqsub(z4.VnD(), z13.VnD(), z3.VnD()), "sqsub z4.d, z13.d, z3.d");
2204   COMPARE(sub(z9.VnB(), z7.VnB(), z25.VnB()), "sub z9.b, z7.b, z25.b");
2205   COMPARE(sub(z8.VnH(), z8.VnH(), z26.VnH()), "sub z8.h, z8.h, z26.h");
2206   COMPARE(sub(z7.VnS(), z9.VnS(), z27.VnS()), "sub z7.s, z9.s, z27.s");
2207   COMPARE(sub(z6.VnD(), z10.VnD(), z28.VnD()), "sub z6.d, z10.d, z28.d");
2208   COMPARE(uqadd(z13.VnB(), z15.VnB(), z3.VnB()), "uqadd z13.b, z15.b, z3.b");
2209   COMPARE(uqadd(z12.VnH(), z16.VnH(), z2.VnH()), "uqadd z12.h, z16.h, z2.h");
2210   COMPARE(uqadd(z11.VnS(), z17.VnS(), z1.VnS()), "uqadd z11.s, z17.s, z1.s");
2211   COMPARE(uqadd(z10.VnD(), z18.VnD(), z0.VnD()), "uqadd z10.d, z18.d, z0.d");
2212   COMPARE(uqsub(z9.VnB(), z13.VnB(), z13.VnB()), "uqsub z9.b, z13.b, z13.b");
2213   COMPARE(uqsub(z11.VnH(), z15.VnH(), z11.VnH()), "uqsub z11.h, z15.h, z11.h");
2214   COMPARE(uqsub(z13.VnS(), z17.VnS(), z13.VnS()), "uqsub z13.s, z17.s, z13.s");
2215   COMPARE(uqsub(z15.VnD(), z19.VnD(), z15.VnD()), "uqsub z15.d, z19.d, z15.d");
2216 
2217   CLEANUP();
2218 }
2219 
TEST(sve_int_binary_arithmetic_predicated)2220 TEST(sve_int_binary_arithmetic_predicated) {
2221   SETUP();
2222 
2223   COMPARE(add(z22.VnB(), p4.Merging(), z22.VnB(), z20.VnB()),
2224           "add z22.b, p4/m, z22.b, z20.b");
2225   COMPARE(add(z22.VnH(), p4.Merging(), z22.VnH(), z20.VnH()),
2226           "add z22.h, p4/m, z22.h, z20.h");
2227   COMPARE(add(z22.VnS(), p4.Merging(), z22.VnS(), z20.VnS()),
2228           "add z22.s, p4/m, z22.s, z20.s");
2229   COMPARE(add(z22.VnD(), p4.Merging(), z22.VnD(), z20.VnD()),
2230           "add z22.d, p4/m, z22.d, z20.d");
2231   COMPARE(and_(z22.VnB(), p3.Merging(), z22.VnB(), z3.VnB()),
2232           "and z22.b, p3/m, z22.b, z3.b");
2233   COMPARE(and_(z22.VnH(), p3.Merging(), z22.VnH(), z3.VnH()),
2234           "and z22.h, p3/m, z22.h, z3.h");
2235   COMPARE(and_(z22.VnS(), p3.Merging(), z22.VnS(), z3.VnS()),
2236           "and z22.s, p3/m, z22.s, z3.s");
2237   COMPARE(and_(z22.VnD(), p3.Merging(), z22.VnD(), z3.VnD()),
2238           "and z22.d, p3/m, z22.d, z3.d");
2239   COMPARE(bic(z17.VnB(), p7.Merging(), z17.VnB(), z10.VnB()),
2240           "bic z17.b, p7/m, z17.b, z10.b");
2241   COMPARE(bic(z17.VnH(), p7.Merging(), z17.VnH(), z10.VnH()),
2242           "bic z17.h, p7/m, z17.h, z10.h");
2243   COMPARE(bic(z17.VnS(), p7.Merging(), z17.VnS(), z10.VnS()),
2244           "bic z17.s, p7/m, z17.s, z10.s");
2245   COMPARE(bic(z17.VnD(), p7.Merging(), z17.VnD(), z10.VnD()),
2246           "bic z17.d, p7/m, z17.d, z10.d");
2247   COMPARE(eor(z23.VnB(), p4.Merging(), z23.VnB(), z15.VnB()),
2248           "eor z23.b, p4/m, z23.b, z15.b");
2249   COMPARE(eor(z23.VnH(), p4.Merging(), z23.VnH(), z15.VnH()),
2250           "eor z23.h, p4/m, z23.h, z15.h");
2251   COMPARE(eor(z23.VnS(), p4.Merging(), z23.VnS(), z15.VnS()),
2252           "eor z23.s, p4/m, z23.s, z15.s");
2253   COMPARE(eor(z23.VnD(), p4.Merging(), z23.VnD(), z15.VnD()),
2254           "eor z23.d, p4/m, z23.d, z15.d");
2255   COMPARE(mul(z15.VnB(), p5.Merging(), z15.VnB(), z15.VnB()),
2256           "mul z15.b, p5/m, z15.b, z15.b");
2257   COMPARE(mul(z15.VnH(), p5.Merging(), z15.VnH(), z15.VnH()),
2258           "mul z15.h, p5/m, z15.h, z15.h");
2259   COMPARE(mul(z15.VnS(), p5.Merging(), z15.VnS(), z15.VnS()),
2260           "mul z15.s, p5/m, z15.s, z15.s");
2261   COMPARE(mul(z15.VnD(), p5.Merging(), z15.VnD(), z15.VnD()),
2262           "mul z15.d, p5/m, z15.d, z15.d");
2263   COMPARE(orr(z9.VnB(), p1.Merging(), z9.VnB(), z28.VnB()),
2264           "orr z9.b, p1/m, z9.b, z28.b");
2265   COMPARE(orr(z9.VnH(), p1.Merging(), z9.VnH(), z28.VnH()),
2266           "orr z9.h, p1/m, z9.h, z28.h");
2267   COMPARE(orr(z9.VnS(), p1.Merging(), z9.VnS(), z28.VnS()),
2268           "orr z9.s, p1/m, z9.s, z28.s");
2269   COMPARE(orr(z9.VnD(), p1.Merging(), z9.VnD(), z28.VnD()),
2270           "orr z9.d, p1/m, z9.d, z28.d");
2271   COMPARE(sabd(z11.VnB(), p6.Merging(), z11.VnB(), z31.VnB()),
2272           "sabd z11.b, p6/m, z11.b, z31.b");
2273   COMPARE(sabd(z11.VnH(), p6.Merging(), z11.VnH(), z31.VnH()),
2274           "sabd z11.h, p6/m, z11.h, z31.h");
2275   COMPARE(sabd(z11.VnS(), p6.Merging(), z11.VnS(), z31.VnS()),
2276           "sabd z11.s, p6/m, z11.s, z31.s");
2277   COMPARE(sabd(z11.VnD(), p6.Merging(), z11.VnD(), z31.VnD()),
2278           "sabd z11.d, p6/m, z11.d, z31.d");
2279   COMPARE(sdivr(z20.VnS(), p5.Merging(), z20.VnS(), z23.VnS()),
2280           "sdivr z20.s, p5/m, z20.s, z23.s");
2281   COMPARE(sdiv(z15.VnD(), p6.Merging(), z15.VnD(), z8.VnD()),
2282           "sdiv z15.d, p6/m, z15.d, z8.d");
2283   COMPARE(smax(z30.VnB(), p4.Merging(), z30.VnB(), z30.VnB()),
2284           "smax z30.b, p4/m, z30.b, z30.b");
2285   COMPARE(smax(z30.VnH(), p4.Merging(), z30.VnH(), z30.VnH()),
2286           "smax z30.h, p4/m, z30.h, z30.h");
2287   COMPARE(smax(z30.VnS(), p4.Merging(), z30.VnS(), z30.VnS()),
2288           "smax z30.s, p4/m, z30.s, z30.s");
2289   COMPARE(smax(z30.VnD(), p4.Merging(), z30.VnD(), z30.VnD()),
2290           "smax z30.d, p4/m, z30.d, z30.d");
2291   COMPARE(smin(z20.VnB(), p7.Merging(), z20.VnB(), z19.VnB()),
2292           "smin z20.b, p7/m, z20.b, z19.b");
2293   COMPARE(smin(z20.VnH(), p7.Merging(), z20.VnH(), z19.VnH()),
2294           "smin z20.h, p7/m, z20.h, z19.h");
2295   COMPARE(smin(z20.VnS(), p7.Merging(), z20.VnS(), z19.VnS()),
2296           "smin z20.s, p7/m, z20.s, z19.s");
2297   COMPARE(smin(z20.VnD(), p7.Merging(), z20.VnD(), z19.VnD()),
2298           "smin z20.d, p7/m, z20.d, z19.d");
2299   COMPARE(smulh(z23.VnB(), p0.Merging(), z23.VnB(), z3.VnB()),
2300           "smulh z23.b, p0/m, z23.b, z3.b");
2301   COMPARE(smulh(z23.VnH(), p0.Merging(), z23.VnH(), z3.VnH()),
2302           "smulh z23.h, p0/m, z23.h, z3.h");
2303   COMPARE(smulh(z23.VnS(), p0.Merging(), z23.VnS(), z3.VnS()),
2304           "smulh z23.s, p0/m, z23.s, z3.s");
2305   COMPARE(smulh(z23.VnD(), p0.Merging(), z23.VnD(), z3.VnD()),
2306           "smulh z23.d, p0/m, z23.d, z3.d");
2307   COMPARE(subr(z1.VnB(), p6.Merging(), z1.VnB(), z1.VnB()),
2308           "subr z1.b, p6/m, z1.b, z1.b");
2309   COMPARE(subr(z1.VnH(), p6.Merging(), z1.VnH(), z1.VnH()),
2310           "subr z1.h, p6/m, z1.h, z1.h");
2311   COMPARE(subr(z1.VnS(), p6.Merging(), z1.VnS(), z1.VnS()),
2312           "subr z1.s, p6/m, z1.s, z1.s");
2313   COMPARE(subr(z1.VnD(), p6.Merging(), z1.VnD(), z1.VnD()),
2314           "subr z1.d, p6/m, z1.d, z1.d");
2315   COMPARE(sub(z28.VnB(), p2.Merging(), z28.VnB(), z0.VnB()),
2316           "sub z28.b, p2/m, z28.b, z0.b");
2317   COMPARE(sub(z28.VnH(), p2.Merging(), z28.VnH(), z0.VnH()),
2318           "sub z28.h, p2/m, z28.h, z0.h");
2319   COMPARE(sub(z28.VnS(), p2.Merging(), z28.VnS(), z0.VnS()),
2320           "sub z28.s, p2/m, z28.s, z0.s");
2321   COMPARE(sub(z28.VnD(), p2.Merging(), z28.VnD(), z0.VnD()),
2322           "sub z28.d, p2/m, z28.d, z0.d");
2323   COMPARE(uabd(z14.VnB(), p6.Merging(), z14.VnB(), z22.VnB()),
2324           "uabd z14.b, p6/m, z14.b, z22.b");
2325   COMPARE(uabd(z14.VnH(), p6.Merging(), z14.VnH(), z22.VnH()),
2326           "uabd z14.h, p6/m, z14.h, z22.h");
2327   COMPARE(uabd(z14.VnS(), p6.Merging(), z14.VnS(), z22.VnS()),
2328           "uabd z14.s, p6/m, z14.s, z22.s");
2329   COMPARE(uabd(z14.VnD(), p6.Merging(), z14.VnD(), z22.VnD()),
2330           "uabd z14.d, p6/m, z14.d, z22.d");
2331   COMPARE(udivr(z27.VnS(), p5.Merging(), z27.VnS(), z31.VnS()),
2332           "udivr z27.s, p5/m, z27.s, z31.s");
2333   COMPARE(udiv(z13.VnD(), p4.Merging(), z13.VnD(), z11.VnD()),
2334           "udiv z13.d, p4/m, z13.d, z11.d");
2335   COMPARE(umax(z0.VnB(), p5.Merging(), z0.VnB(), z14.VnB()),
2336           "umax z0.b, p5/m, z0.b, z14.b");
2337   COMPARE(umax(z0.VnH(), p5.Merging(), z0.VnH(), z14.VnH()),
2338           "umax z0.h, p5/m, z0.h, z14.h");
2339   COMPARE(umax(z0.VnS(), p5.Merging(), z0.VnS(), z14.VnS()),
2340           "umax z0.s, p5/m, z0.s, z14.s");
2341   COMPARE(umax(z0.VnD(), p5.Merging(), z0.VnD(), z14.VnD()),
2342           "umax z0.d, p5/m, z0.d, z14.d");
2343   COMPARE(umin(z26.VnB(), p5.Merging(), z26.VnB(), z12.VnB()),
2344           "umin z26.b, p5/m, z26.b, z12.b");
2345   COMPARE(umin(z26.VnH(), p5.Merging(), z26.VnH(), z12.VnH()),
2346           "umin z26.h, p5/m, z26.h, z12.h");
2347   COMPARE(umin(z26.VnS(), p5.Merging(), z26.VnS(), z12.VnS()),
2348           "umin z26.s, p5/m, z26.s, z12.s");
2349   COMPARE(umin(z26.VnD(), p5.Merging(), z26.VnD(), z12.VnD()),
2350           "umin z26.d, p5/m, z26.d, z12.d");
2351   COMPARE(umulh(z12.VnB(), p2.Merging(), z12.VnB(), z17.VnB()),
2352           "umulh z12.b, p2/m, z12.b, z17.b");
2353   COMPARE(umulh(z12.VnH(), p2.Merging(), z12.VnH(), z17.VnH()),
2354           "umulh z12.h, p2/m, z12.h, z17.h");
2355   COMPARE(umulh(z12.VnS(), p2.Merging(), z12.VnS(), z17.VnS()),
2356           "umulh z12.s, p2/m, z12.s, z17.s");
2357   COMPARE(umulh(z12.VnD(), p2.Merging(), z12.VnD(), z17.VnD()),
2358           "umulh z12.d, p2/m, z12.d, z17.d");
2359   CLEANUP();
2360 }
2361 
TEST(sve_int_binary_arithmetic_predicated_macro)2362 TEST(sve_int_binary_arithmetic_predicated_macro) {
2363   SETUP();
2364 
2365   COMPARE_MACRO(Add(z22.VnB(), p4.Merging(), z22.VnB(), z20.VnB()),
2366                 "add z22.b, p4/m, z22.b, z20.b");
2367   COMPARE_MACRO(Add(z22.VnH(), p4.Merging(), z20.VnH(), z22.VnH()),
2368                 "add z22.h, p4/m, z22.h, z20.h");
2369   COMPARE_MACRO(Add(z22.VnS(), p4.Merging(), z21.VnS(), z20.VnS()),
2370                 "movprfx z22.s, p4/m, z21.s\n"
2371                 "add z22.s, p4/m, z22.s, z20.s");
2372 
2373   COMPARE_MACRO(And(z22.VnH(), p3.Merging(), z22.VnH(), z3.VnH()),
2374                 "and z22.h, p3/m, z22.h, z3.h");
2375   COMPARE_MACRO(And(z22.VnS(), p3.Merging(), z3.VnS(), z22.VnS()),
2376                 "and z22.s, p3/m, z22.s, z3.s");
2377   COMPARE_MACRO(And(z22.VnD(), p3.Merging(), z2.VnD(), z3.VnD()),
2378                 "movprfx z22.d, p3/m, z2.d\n"
2379                 "and z22.d, p3/m, z22.d, z3.d");
2380 
2381   COMPARE_MACRO(Bic(z17.VnB(), p7.Merging(), z17.VnB(), z10.VnB()),
2382                 "bic z17.b, p7/m, z17.b, z10.b");
2383   COMPARE_MACRO(Bic(z17.VnS(), p7.Merging(), z10.VnS(), z17.VnS()),
2384                 "bic z17.s, p7/m, z17.s, z10.s");
2385   COMPARE_MACRO(Bic(z17.VnD(), p7.Merging(), z7.VnD(), z27.VnD()),
2386                 "movprfx z17.d, p7/m, z7.d\n"
2387                 "bic z17.d, p7/m, z17.d, z27.d");
2388 
2389   COMPARE_MACRO(Eor(z23.VnB(), p4.Merging(), z23.VnB(), z15.VnB()),
2390                 "eor z23.b, p4/m, z23.b, z15.b");
2391   COMPARE_MACRO(Eor(z23.VnH(), p4.Merging(), z23.VnH(), z15.VnH()),
2392                 "eor z23.h, p4/m, z23.h, z15.h");
2393   COMPARE_MACRO(Eor(z23.VnD(), p4.Merging(), z18.VnD(), z15.VnD()),
2394                 "movprfx z23.d, p4/m, z18.d\n"
2395                 "eor z23.d, p4/m, z23.d, z15.d");
2396 
2397   COMPARE_MACRO(Mul(z15.VnB(), p5.Merging(), z15.VnB(), z15.VnB()),
2398                 "mul z15.b, p5/m, z15.b, z15.b");
2399   COMPARE_MACRO(Mul(z15.VnH(), p5.Merging(), z7.VnH(), z15.VnH()),
2400                 "mul z15.h, p5/m, z15.h, z7.h");
2401   COMPARE_MACRO(Mul(z15.VnS(), p5.Merging(), z0.VnS(), z1.VnS()),
2402                 "movprfx z15.s, p5/m, z0.s\n"
2403                 "mul z15.s, p5/m, z15.s, z1.s");
2404 
2405   COMPARE_MACRO(Orr(z9.VnH(), p1.Merging(), z9.VnH(), z28.VnH()),
2406                 "orr z9.h, p1/m, z9.h, z28.h");
2407   COMPARE_MACRO(Orr(z9.VnS(), p1.Merging(), z9.VnS(), z28.VnS()),
2408                 "orr z9.s, p1/m, z9.s, z28.s");
2409   COMPARE_MACRO(Orr(z9.VnD(), p1.Merging(), z6.VnD(), z7.VnD()),
2410                 "movprfx z9.d, p1/m, z6.d\n"
2411                 "orr z9.d, p1/m, z9.d, z7.d");
2412 
2413   COMPARE_MACRO(Sabd(z11.VnB(), p6.Merging(), z11.VnB(), z31.VnB()),
2414                 "sabd z11.b, p6/m, z11.b, z31.b");
2415   COMPARE_MACRO(Sabd(z11.VnH(), p6.Merging(), z31.VnH(), z11.VnH()),
2416                 "sabd z11.h, p6/m, z11.h, z31.h");
2417   COMPARE_MACRO(Sabd(z11.VnS(), p6.Merging(), z21.VnS(), z31.VnS()),
2418                 "movprfx z11.s, p6/m, z21.s\n"
2419                 "sabd z11.s, p6/m, z11.s, z31.s");
2420 
2421   COMPARE_MACRO(Sdiv(z20.VnS(), p5.Merging(), z23.VnS(), z20.VnS()),
2422                 "sdivr z20.s, p5/m, z20.s, z23.s");
2423   COMPARE_MACRO(Sdiv(z15.VnD(), p6.Merging(), z30.VnD(), z8.VnD()),
2424                 "movprfx z15.d, p6/m, z30.d\n"
2425                 "sdiv z15.d, p6/m, z15.d, z8.d");
2426 
2427   COMPARE_MACRO(Smax(z30.VnB(), p4.Merging(), z30.VnB(), z31.VnB()),
2428                 "smax z30.b, p4/m, z30.b, z31.b");
2429   COMPARE_MACRO(Smax(z30.VnS(), p4.Merging(), z3.VnS(), z30.VnS()),
2430                 "smax z30.s, p4/m, z30.s, z3.s");
2431   COMPARE_MACRO(Smax(z30.VnD(), p4.Merging(), z1.VnD(), z5.VnD()),
2432                 "movprfx z30.d, p4/m, z1.d\n"
2433                 "smax z30.d, p4/m, z30.d, z5.d");
2434 
2435   COMPARE_MACRO(Smin(z20.VnH(), p7.Merging(), z20.VnH(), z19.VnH()),
2436                 "smin z20.h, p7/m, z20.h, z19.h");
2437   COMPARE_MACRO(Smin(z20.VnS(), p7.Merging(), z19.VnS(), z20.VnS()),
2438                 "smin z20.s, p7/m, z20.s, z19.s");
2439   COMPARE_MACRO(Smin(z20.VnD(), p7.Merging(), z14.VnD(), z15.VnD()),
2440                 "movprfx z20.d, p7/m, z14.d\n"
2441                 "smin z20.d, p7/m, z20.d, z15.d");
2442 
2443   COMPARE_MACRO(Smulh(z23.VnB(), p0.Merging(), z23.VnB(), z3.VnB()),
2444                 "smulh z23.b, p0/m, z23.b, z3.b");
2445   COMPARE_MACRO(Smulh(z23.VnH(), p0.Merging(), z13.VnH(), z23.VnH()),
2446                 "smulh z23.h, p0/m, z23.h, z13.h");
2447   COMPARE_MACRO(Smulh(z23.VnD(), p0.Merging(), z30.VnD(), z31.VnD()),
2448                 "movprfx z23.d, p0/m, z30.d\n"
2449                 "smulh z23.d, p0/m, z23.d, z31.d");
2450 
2451   COMPARE_MACRO(Sub(z28.VnB(), p2.Merging(), z28.VnB(), z0.VnB()),
2452                 "sub z28.b, p2/m, z28.b, z0.b");
2453   COMPARE_MACRO(Sub(z28.VnH(), p2.Merging(), z14.VnH(), z28.VnH()),
2454                 "subr z28.h, p2/m, z28.h, z14.h");
2455   COMPARE_MACRO(Sub(z28.VnS(), p2.Merging(), z7.VnS(), z13.VnS()),
2456                 "movprfx z28.s, p2/m, z7.s\n"
2457                 "sub z28.s, p2/m, z28.s, z13.s");
2458 
2459   COMPARE_MACRO(Uabd(z14.VnH(), p6.Merging(), z14.VnH(), z22.VnH()),
2460                 "uabd z14.h, p6/m, z14.h, z22.h");
2461   COMPARE_MACRO(Uabd(z14.VnS(), p6.Merging(), z14.VnS(), z22.VnS()),
2462                 "uabd z14.s, p6/m, z14.s, z22.s");
2463   COMPARE_MACRO(Uabd(z14.VnD(), p6.Merging(), z13.VnD(), z22.VnD()),
2464                 "movprfx z14.d, p6/m, z13.d\n"
2465                 "uabd z14.d, p6/m, z14.d, z22.d");
2466 
2467   COMPARE_MACRO(Udiv(z27.VnS(), p5.Merging(), z16.VnS(), z27.VnS()),
2468                 "udivr z27.s, p5/m, z27.s, z16.s");
2469   COMPARE_MACRO(Udiv(z13.VnD(), p4.Merging(), z22.VnD(), z11.VnD()),
2470                 "movprfx z13.d, p4/m, z22.d\n"
2471                 "udiv z13.d, p4/m, z13.d, z11.d");
2472 
2473   COMPARE_MACRO(Umax(z0.VnB(), p5.Merging(), z0.VnB(), z14.VnB()),
2474                 "umax z0.b, p5/m, z0.b, z14.b");
2475   COMPARE_MACRO(Umax(z0.VnS(), p5.Merging(), z14.VnS(), z0.VnS()),
2476                 "umax z0.s, p5/m, z0.s, z14.s");
2477   COMPARE_MACRO(Umax(z0.VnD(), p5.Merging(), z29.VnD(), z14.VnD()),
2478                 "movprfx z0.d, p5/m, z29.d\n"
2479                 "umax z0.d, p5/m, z0.d, z14.d");
2480 
2481   COMPARE_MACRO(Umin(z26.VnB(), p5.Merging(), z26.VnB(), z12.VnB()),
2482                 "umin z26.b, p5/m, z26.b, z12.b");
2483   COMPARE_MACRO(Umin(z26.VnH(), p5.Merging(), z27.VnH(), z26.VnH()),
2484                 "umin z26.h, p5/m, z26.h, z27.h");
2485   COMPARE_MACRO(Umin(z26.VnD(), p5.Merging(), z13.VnD(), z12.VnD()),
2486                 "movprfx z26.d, p5/m, z13.d\n"
2487                 "umin z26.d, p5/m, z26.d, z12.d");
2488 
2489   COMPARE_MACRO(Umulh(z12.VnB(), p2.Merging(), z12.VnB(), z17.VnB()),
2490                 "umulh z12.b, p2/m, z12.b, z17.b");
2491   COMPARE_MACRO(Umulh(z12.VnH(), p2.Merging(), z0.VnH(), z12.VnH()),
2492                 "umulh z12.h, p2/m, z12.h, z0.h");
2493   COMPARE_MACRO(Umulh(z12.VnS(), p2.Merging(), z25.VnS(), z17.VnS()),
2494                 "movprfx z12.s, p2/m, z25.s\n"
2495                 "umulh z12.s, p2/m, z12.s, z17.s");
2496 
2497   CLEANUP();
2498 }
2499 
TEST(sve_int_compare_scalars)2500 TEST(sve_int_compare_scalars) {
2501   SETUP();
2502 
2503   COMPARE(ctermeq(w30, w26), "ctermeq w30, w26");
2504   COMPARE(ctermne(x21, x18), "ctermne x21, x18");
2505   COMPARE(whilele(p10.VnB(), x11, x6), "whilele p10.b, x11, x6");
2506   COMPARE(whilele(p10.VnH(), w11, w6), "whilele p10.h, w11, w6");
2507   COMPARE(whilele(p10.VnH(), x11, x6), "whilele p10.h, x11, x6");
2508   COMPARE(whilele(p10.VnS(), w11, w6), "whilele p10.s, w11, w6");
2509   COMPARE(whilele(p10.VnD(), x11, x6), "whilele p10.d, x11, x6");
2510   COMPARE(whilelo(p4.VnB(), w3, w25), "whilelo p4.b, w3, w25");
2511   COMPARE(whilelo(p4.VnH(), x3, x25), "whilelo p4.h, x3, x25");
2512   COMPARE(whilelo(p4.VnS(), w3, w25), "whilelo p4.s, w3, w25");
2513   COMPARE(whilelo(p4.VnD(), x3, x25), "whilelo p4.d, x3, x25");
2514   COMPARE(whilels(p7.VnB(), w15, w15), "whilels p7.b, w15, w15");
2515   COMPARE(whilels(p7.VnH(), x15, x15), "whilels p7.h, x15, x15");
2516   COMPARE(whilels(p7.VnS(), w15, w15), "whilels p7.s, w15, w15");
2517   COMPARE(whilels(p7.VnD(), x15, x15), "whilels p7.d, x15, x15");
2518   COMPARE(whilelt(p14.VnB(), w11, w14), "whilelt p14.b, w11, w14");
2519   COMPARE(whilelt(p14.VnH(), x11, x14), "whilelt p14.h, x11, x14");
2520   COMPARE(whilelt(p14.VnS(), w11, w14), "whilelt p14.s, w11, w14");
2521   COMPARE(whilelt(p14.VnD(), x11, x14), "whilelt p14.d, x11, x14");
2522 
2523   CLEANUP();
2524 }
2525 
TEST(sve_int_compare_signed_imm)2526 TEST(sve_int_compare_signed_imm) {
2527   SETUP();
2528 
2529   COMPARE(cmpeq(p0.VnB(), p3.Zeroing(), z1.VnB(), 15),
2530           "cmpeq p0.b, p3/z, z1.b, #15");
2531   COMPARE(cmpeq(p0.VnH(), p3.Zeroing(), z1.VnH(), 7),
2532           "cmpeq p0.h, p3/z, z1.h, #7");
2533   COMPARE(cmpeq(p0.VnS(), p3.Zeroing(), z1.VnS(), -3),
2534           "cmpeq p0.s, p3/z, z1.s, #-3");
2535   COMPARE(cmpeq(p0.VnD(), p3.Zeroing(), z1.VnD(), -14),
2536           "cmpeq p0.d, p3/z, z1.d, #-14");
2537   COMPARE(cmpge(p9.VnB(), p6.Zeroing(), z12.VnB(), 14),
2538           "cmpge p9.b, p6/z, z12.b, #14");
2539   COMPARE(cmpge(p9.VnH(), p6.Zeroing(), z12.VnH(), 6),
2540           "cmpge p9.h, p6/z, z12.h, #6");
2541   COMPARE(cmpge(p9.VnS(), p6.Zeroing(), z12.VnS(), -4),
2542           "cmpge p9.s, p6/z, z12.s, #-4");
2543   COMPARE(cmpge(p9.VnD(), p6.Zeroing(), z12.VnD(), -13),
2544           "cmpge p9.d, p6/z, z12.d, #-13");
2545   COMPARE(cmpgt(p15.VnB(), p4.Zeroing(), z23.VnB(), 13),
2546           "cmpgt p15.b, p4/z, z23.b, #13");
2547   COMPARE(cmpgt(p15.VnH(), p4.Zeroing(), z23.VnH(), 5),
2548           "cmpgt p15.h, p4/z, z23.h, #5");
2549   COMPARE(cmpgt(p15.VnS(), p4.Zeroing(), z23.VnS(), -12),
2550           "cmpgt p15.s, p4/z, z23.s, #-12");
2551   COMPARE(cmpgt(p15.VnD(), p4.Zeroing(), z23.VnD(), -5),
2552           "cmpgt p15.d, p4/z, z23.d, #-5");
2553   COMPARE(cmple(p4.VnB(), p3.Zeroing(), z5.VnB(), 12),
2554           "cmple p4.b, p3/z, z5.b, #12");
2555   COMPARE(cmple(p4.VnH(), p3.Zeroing(), z5.VnH(), 4),
2556           "cmple p4.h, p3/z, z5.h, #4");
2557   COMPARE(cmple(p4.VnS(), p3.Zeroing(), z5.VnS(), -11),
2558           "cmple p4.s, p3/z, z5.s, #-11");
2559   COMPARE(cmple(p4.VnD(), p3.Zeroing(), z5.VnD(), -6),
2560           "cmple p4.d, p3/z, z5.d, #-6");
2561   COMPARE(cmplt(p3.VnB(), p7.Zeroing(), z15.VnB(), 11),
2562           "cmplt p3.b, p7/z, z15.b, #11");
2563   COMPARE(cmplt(p3.VnH(), p7.Zeroing(), z15.VnH(), 3),
2564           "cmplt p3.h, p7/z, z15.h, #3");
2565   COMPARE(cmplt(p3.VnS(), p7.Zeroing(), z15.VnS(), -10),
2566           "cmplt p3.s, p7/z, z15.s, #-10");
2567   COMPARE(cmplt(p3.VnD(), p7.Zeroing(), z15.VnD(), -7),
2568           "cmplt p3.d, p7/z, z15.d, #-7");
2569   COMPARE(cmpne(p13.VnB(), p5.Zeroing(), z20.VnB(), 10),
2570           "cmpne p13.b, p5/z, z20.b, #10");
2571   COMPARE(cmpne(p13.VnH(), p5.Zeroing(), z20.VnH(), 2),
2572           "cmpne p13.h, p5/z, z20.h, #2");
2573   COMPARE(cmpne(p13.VnS(), p5.Zeroing(), z20.VnS(), -9),
2574           "cmpne p13.s, p5/z, z20.s, #-9");
2575   COMPARE(cmpne(p13.VnD(), p5.Zeroing(), z20.VnD(), -8),
2576           "cmpne p13.d, p5/z, z20.d, #-8");
2577 
2578   CLEANUP();
2579 }
2580 
TEST(sve_int_compare_unsigned_imm)2581 TEST(sve_int_compare_unsigned_imm) {
2582   SETUP();
2583 
2584   COMPARE(cmphi(p8.VnB(), p6.Zeroing(), z1.VnB(), 127),
2585           "cmphi p8.b, p6/z, z1.b, #127");
2586   COMPARE(cmphi(p8.VnH(), p6.Zeroing(), z1.VnH(), 126),
2587           "cmphi p8.h, p6/z, z1.h, #126");
2588   COMPARE(cmphi(p8.VnS(), p6.Zeroing(), z1.VnS(), 99),
2589           "cmphi p8.s, p6/z, z1.s, #99");
2590   COMPARE(cmphi(p8.VnD(), p6.Zeroing(), z1.VnD(), 78),
2591           "cmphi p8.d, p6/z, z1.d, #78");
2592   COMPARE(cmphs(p11.VnB(), p2.Zeroing(), z8.VnB(), 67),
2593           "cmphs p11.b, p2/z, z8.b, #67");
2594   COMPARE(cmphs(p11.VnH(), p2.Zeroing(), z8.VnH(), 63),
2595           "cmphs p11.h, p2/z, z8.h, #63");
2596   COMPARE(cmphs(p11.VnS(), p2.Zeroing(), z8.VnS(), 51),
2597           "cmphs p11.s, p2/z, z8.s, #51");
2598   COMPARE(cmphs(p11.VnD(), p2.Zeroing(), z8.VnD(), 40),
2599           "cmphs p11.d, p2/z, z8.d, #40");
2600   COMPARE(cmplo(p9.VnB(), p4.Zeroing(), z4.VnB(), 32),
2601           "cmplo p9.b, p4/z, z4.b, #32");
2602   COMPARE(cmplo(p9.VnH(), p4.Zeroing(), z4.VnH(), 22),
2603           "cmplo p9.h, p4/z, z4.h, #22");
2604   COMPARE(cmplo(p9.VnS(), p4.Zeroing(), z4.VnS(), 15),
2605           "cmplo p9.s, p4/z, z4.s, #15");
2606   COMPARE(cmplo(p9.VnD(), p4.Zeroing(), z4.VnD(), 11),
2607           "cmplo p9.d, p4/z, z4.d, #11");
2608   COMPARE(cmpls(p14.VnB(), p5.Zeroing(), z9.VnB(), 7),
2609           "cmpls p14.b, p5/z, z9.b, #7");
2610   COMPARE(cmpls(p14.VnH(), p5.Zeroing(), z9.VnH(), 4),
2611           "cmpls p14.h, p5/z, z9.h, #4");
2612   COMPARE(cmpls(p14.VnS(), p5.Zeroing(), z9.VnS(), 3),
2613           "cmpls p14.s, p5/z, z9.s, #3");
2614   COMPARE(cmpls(p14.VnD(), p5.Zeroing(), z9.VnD(), 1),
2615           "cmpls p14.d, p5/z, z9.d, #1");
2616 
2617   CLEANUP();
2618 }
2619 
TEST(sve_int_compare_vectors)2620 TEST(sve_int_compare_vectors) {
2621   SETUP();
2622 
2623   COMPARE(cmpeq(p13.VnB(), p0.Zeroing(), z26.VnB(), z10.VnD()),
2624           "cmpeq p13.b, p0/z, z26.b, z10.d");
2625   COMPARE(cmpeq(p13.VnH(), p0.Zeroing(), z26.VnH(), z10.VnD()),
2626           "cmpeq p13.h, p0/z, z26.h, z10.d");
2627   COMPARE(cmpeq(p13.VnS(), p0.Zeroing(), z26.VnS(), z10.VnD()),
2628           "cmpeq p13.s, p0/z, z26.s, z10.d");
2629   COMPARE(cmpeq(p14.VnB(), p3.Zeroing(), z18.VnB(), z15.VnB()),
2630           "cmpeq p14.b, p3/z, z18.b, z15.b");
2631   COMPARE(cmpeq(p14.VnH(), p3.Zeroing(), z18.VnH(), z15.VnH()),
2632           "cmpeq p14.h, p3/z, z18.h, z15.h");
2633   COMPARE(cmpeq(p14.VnS(), p3.Zeroing(), z18.VnS(), z15.VnS()),
2634           "cmpeq p14.s, p3/z, z18.s, z15.s");
2635   COMPARE(cmpeq(p14.VnD(), p3.Zeroing(), z18.VnD(), z15.VnD()),
2636           "cmpeq p14.d, p3/z, z18.d, z15.d");
2637   COMPARE(cmpge(p8.VnB(), p3.Zeroing(), z13.VnB(), z0.VnD()),
2638           "cmpge p8.b, p3/z, z13.b, z0.d");
2639   COMPARE(cmpge(p8.VnH(), p3.Zeroing(), z13.VnH(), z0.VnD()),
2640           "cmpge p8.h, p3/z, z13.h, z0.d");
2641   COMPARE(cmpge(p8.VnS(), p3.Zeroing(), z13.VnS(), z0.VnD()),
2642           "cmpge p8.s, p3/z, z13.s, z0.d");
2643   COMPARE(cmpge(p3.VnB(), p4.Zeroing(), z6.VnB(), z1.VnB()),
2644           "cmpge p3.b, p4/z, z6.b, z1.b");
2645   COMPARE(cmpge(p3.VnH(), p4.Zeroing(), z6.VnH(), z1.VnH()),
2646           "cmpge p3.h, p4/z, z6.h, z1.h");
2647   COMPARE(cmpge(p3.VnS(), p4.Zeroing(), z6.VnS(), z1.VnS()),
2648           "cmpge p3.s, p4/z, z6.s, z1.s");
2649   COMPARE(cmpge(p3.VnD(), p4.Zeroing(), z6.VnD(), z1.VnD()),
2650           "cmpge p3.d, p4/z, z6.d, z1.d");
2651   COMPARE(cmpgt(p4.VnB(), p2.Zeroing(), z24.VnB(), z1.VnD()),
2652           "cmpgt p4.b, p2/z, z24.b, z1.d");
2653   COMPARE(cmpgt(p4.VnH(), p2.Zeroing(), z24.VnH(), z1.VnD()),
2654           "cmpgt p4.h, p2/z, z24.h, z1.d");
2655   COMPARE(cmpgt(p4.VnS(), p2.Zeroing(), z24.VnS(), z1.VnD()),
2656           "cmpgt p4.s, p2/z, z24.s, z1.d");
2657   COMPARE(cmpgt(p10.VnB(), p3.Zeroing(), z23.VnB(), z19.VnB()),
2658           "cmpgt p10.b, p3/z, z23.b, z19.b");
2659   COMPARE(cmpgt(p10.VnH(), p3.Zeroing(), z23.VnH(), z19.VnH()),
2660           "cmpgt p10.h, p3/z, z23.h, z19.h");
2661   COMPARE(cmpgt(p10.VnS(), p3.Zeroing(), z23.VnS(), z19.VnS()),
2662           "cmpgt p10.s, p3/z, z23.s, z19.s");
2663   COMPARE(cmpgt(p10.VnD(), p3.Zeroing(), z23.VnD(), z19.VnD()),
2664           "cmpgt p10.d, p3/z, z23.d, z19.d");
2665   COMPARE(cmphi(p10.VnB(), p6.Zeroing(), z6.VnB(), z11.VnD()),
2666           "cmphi p10.b, p6/z, z6.b, z11.d");
2667   COMPARE(cmphi(p10.VnH(), p6.Zeroing(), z6.VnH(), z11.VnD()),
2668           "cmphi p10.h, p6/z, z6.h, z11.d");
2669   COMPARE(cmphi(p10.VnS(), p6.Zeroing(), z6.VnS(), z11.VnD()),
2670           "cmphi p10.s, p6/z, z6.s, z11.d");
2671   COMPARE(cmphi(p1.VnB(), p0.Zeroing(), z4.VnB(), z2.VnB()),
2672           "cmphi p1.b, p0/z, z4.b, z2.b");
2673   COMPARE(cmphi(p1.VnH(), p0.Zeroing(), z4.VnH(), z2.VnH()),
2674           "cmphi p1.h, p0/z, z4.h, z2.h");
2675   COMPARE(cmphi(p1.VnS(), p0.Zeroing(), z4.VnS(), z2.VnS()),
2676           "cmphi p1.s, p0/z, z4.s, z2.s");
2677   COMPARE(cmphi(p1.VnD(), p0.Zeroing(), z4.VnD(), z2.VnD()),
2678           "cmphi p1.d, p0/z, z4.d, z2.d");
2679   COMPARE(cmphs(p10.VnB(), p5.Zeroing(), z22.VnB(), z5.VnD()),
2680           "cmphs p10.b, p5/z, z22.b, z5.d");
2681   COMPARE(cmphs(p10.VnH(), p5.Zeroing(), z22.VnH(), z5.VnD()),
2682           "cmphs p10.h, p5/z, z22.h, z5.d");
2683   COMPARE(cmphs(p10.VnS(), p5.Zeroing(), z22.VnS(), z5.VnD()),
2684           "cmphs p10.s, p5/z, z22.s, z5.d");
2685   COMPARE(cmphs(p12.VnB(), p6.Zeroing(), z20.VnB(), z24.VnB()),
2686           "cmphs p12.b, p6/z, z20.b, z24.b");
2687   COMPARE(cmphs(p12.VnH(), p6.Zeroing(), z20.VnH(), z24.VnH()),
2688           "cmphs p12.h, p6/z, z20.h, z24.h");
2689   COMPARE(cmphs(p12.VnS(), p6.Zeroing(), z20.VnS(), z24.VnS()),
2690           "cmphs p12.s, p6/z, z20.s, z24.s");
2691   COMPARE(cmphs(p12.VnD(), p6.Zeroing(), z20.VnD(), z24.VnD()),
2692           "cmphs p12.d, p6/z, z20.d, z24.d");
2693   COMPARE(cmple(p11.VnB(), p2.Zeroing(), z18.VnB(), z0.VnD()),
2694           "cmple p11.b, p2/z, z18.b, z0.d");
2695   COMPARE(cmple(p11.VnH(), p2.Zeroing(), z18.VnH(), z0.VnD()),
2696           "cmple p11.h, p2/z, z18.h, z0.d");
2697   COMPARE(cmple(p11.VnS(), p2.Zeroing(), z18.VnS(), z0.VnD()),
2698           "cmple p11.s, p2/z, z18.s, z0.d");
2699   COMPARE(cmplo(p12.VnB(), p6.Zeroing(), z21.VnB(), z10.VnD()),
2700           "cmplo p12.b, p6/z, z21.b, z10.d");
2701   COMPARE(cmplo(p12.VnH(), p6.Zeroing(), z21.VnH(), z10.VnD()),
2702           "cmplo p12.h, p6/z, z21.h, z10.d");
2703   COMPARE(cmplo(p12.VnS(), p6.Zeroing(), z21.VnS(), z10.VnD()),
2704           "cmplo p12.s, p6/z, z21.s, z10.d");
2705   COMPARE(cmpls(p8.VnB(), p4.Zeroing(), z9.VnB(), z15.VnD()),
2706           "cmpls p8.b, p4/z, z9.b, z15.d");
2707   COMPARE(cmpls(p8.VnH(), p4.Zeroing(), z9.VnH(), z15.VnD()),
2708           "cmpls p8.h, p4/z, z9.h, z15.d");
2709   COMPARE(cmpls(p8.VnS(), p4.Zeroing(), z9.VnS(), z15.VnD()),
2710           "cmpls p8.s, p4/z, z9.s, z15.d");
2711   COMPARE(cmplt(p6.VnB(), p6.Zeroing(), z4.VnB(), z8.VnD()),
2712           "cmplt p6.b, p6/z, z4.b, z8.d");
2713   COMPARE(cmplt(p6.VnH(), p6.Zeroing(), z4.VnH(), z8.VnD()),
2714           "cmplt p6.h, p6/z, z4.h, z8.d");
2715   COMPARE(cmplt(p6.VnS(), p6.Zeroing(), z4.VnS(), z8.VnD()),
2716           "cmplt p6.s, p6/z, z4.s, z8.d");
2717   COMPARE(cmpne(p1.VnB(), p6.Zeroing(), z31.VnB(), z16.VnD()),
2718           "cmpne p1.b, p6/z, z31.b, z16.d");
2719   COMPARE(cmpne(p1.VnH(), p6.Zeroing(), z31.VnH(), z16.VnD()),
2720           "cmpne p1.h, p6/z, z31.h, z16.d");
2721   COMPARE(cmpne(p1.VnS(), p6.Zeroing(), z31.VnS(), z16.VnD()),
2722           "cmpne p1.s, p6/z, z31.s, z16.d");
2723   COMPARE(cmpne(p11.VnB(), p1.Zeroing(), z3.VnB(), z24.VnB()),
2724           "cmpne p11.b, p1/z, z3.b, z24.b");
2725   COMPARE(cmpne(p11.VnH(), p1.Zeroing(), z3.VnH(), z24.VnH()),
2726           "cmpne p11.h, p1/z, z3.h, z24.h");
2727   COMPARE(cmpne(p11.VnS(), p1.Zeroing(), z3.VnS(), z24.VnS()),
2728           "cmpne p11.s, p1/z, z3.s, z24.s");
2729   COMPARE(cmpne(p11.VnD(), p1.Zeroing(), z3.VnD(), z24.VnD()),
2730           "cmpne p11.d, p1/z, z3.d, z24.d");
2731   COMPARE(cmpls(p8.VnB(), p4.Zeroing(), z9.VnB(), z15.VnB()),
2732           "cmphs p8.b, p4/z, z15.b, z9.b");
2733   COMPARE(cmpls(p8.VnH(), p4.Zeroing(), z9.VnH(), z15.VnH()),
2734           "cmphs p8.h, p4/z, z15.h, z9.h");
2735   COMPARE(cmpls(p8.VnS(), p4.Zeroing(), z9.VnS(), z15.VnS()),
2736           "cmphs p8.s, p4/z, z15.s, z9.s");
2737   COMPARE(cmpls(p8.VnD(), p4.Zeroing(), z9.VnD(), z15.VnD()),
2738           "cmphs p8.d, p4/z, z15.d, z9.d");
2739   COMPARE(cmplo(p10.VnB(), p3.Zeroing(), z14.VnB(), z20.VnB()),
2740           "cmphi p10.b, p3/z, z20.b, z14.b");
2741   COMPARE(cmplo(p10.VnH(), p3.Zeroing(), z14.VnH(), z20.VnH()),
2742           "cmphi p10.h, p3/z, z20.h, z14.h");
2743   COMPARE(cmplo(p10.VnS(), p3.Zeroing(), z14.VnS(), z20.VnS()),
2744           "cmphi p10.s, p3/z, z20.s, z14.s");
2745   COMPARE(cmplo(p10.VnD(), p3.Zeroing(), z14.VnD(), z20.VnD()),
2746           "cmphi p10.d, p3/z, z20.d, z14.d");
2747   COMPARE(cmple(p12.VnB(), p2.Zeroing(), z19.VnB(), z25.VnB()),
2748           "cmpge p12.b, p2/z, z25.b, z19.b");
2749   COMPARE(cmple(p12.VnH(), p2.Zeroing(), z19.VnH(), z25.VnH()),
2750           "cmpge p12.h, p2/z, z25.h, z19.h");
2751   COMPARE(cmple(p12.VnS(), p2.Zeroing(), z19.VnS(), z25.VnS()),
2752           "cmpge p12.s, p2/z, z25.s, z19.s");
2753   COMPARE(cmple(p12.VnD(), p2.Zeroing(), z19.VnD(), z25.VnD()),
2754           "cmpge p12.d, p2/z, z25.d, z19.d");
2755   COMPARE(cmplt(p14.VnB(), p1.Zeroing(), z24.VnB(), z30.VnB()),
2756           "cmpgt p14.b, p1/z, z30.b, z24.b");
2757   COMPARE(cmplt(p14.VnH(), p1.Zeroing(), z24.VnH(), z30.VnH()),
2758           "cmpgt p14.h, p1/z, z30.h, z24.h");
2759   COMPARE(cmplt(p14.VnS(), p1.Zeroing(), z24.VnS(), z30.VnS()),
2760           "cmpgt p14.s, p1/z, z30.s, z24.s");
2761   COMPARE(cmplt(p14.VnD(), p1.Zeroing(), z24.VnD(), z30.VnD()),
2762           "cmpgt p14.d, p1/z, z30.d, z24.d");
2763 
2764   CLEANUP();
2765 }
2766 
TEST(sve_int_misc_unpredicated)2767 TEST(sve_int_misc_unpredicated) {
2768   SETUP();
2769 
2770   COMPARE(fexpa(z5.VnH(), z9.VnH()), "fexpa z5.h, z9.h");
2771   COMPARE(fexpa(z5.VnS(), z9.VnS()), "fexpa z5.s, z9.s");
2772   COMPARE(fexpa(z5.VnD(), z9.VnD()), "fexpa z5.d, z9.d");
2773   COMPARE(ftssel(z17.VnH(), z24.VnH(), z14.VnH()),
2774           "ftssel z17.h, z24.h, z14.h");
2775   COMPARE(ftssel(z17.VnS(), z24.VnS(), z14.VnS()),
2776           "ftssel z17.s, z24.s, z14.s");
2777   COMPARE(ftssel(z17.VnD(), z24.VnD(), z14.VnD()),
2778           "ftssel z17.d, z24.d, z14.d");
2779   COMPARE(movprfx(z24, z1), "movprfx z24, z1");
2780 
2781   CLEANUP();
2782 }
2783 
TEST(sve_int_mul_add_predicated)2784 TEST(sve_int_mul_add_predicated) {
2785   SETUP();
2786 
2787   COMPARE(mad(z29.VnB(), p6.Merging(), z22.VnB(), z21.VnB()),
2788           "mad z29.b, p6/m, z22.b, z21.b");
2789   COMPARE(mad(z29.VnH(), p6.Merging(), z22.VnH(), z21.VnH()),
2790           "mad z29.h, p6/m, z22.h, z21.h");
2791   COMPARE(mad(z29.VnS(), p6.Merging(), z22.VnS(), z21.VnS()),
2792           "mad z29.s, p6/m, z22.s, z21.s");
2793   COMPARE(mad(z29.VnD(), p6.Merging(), z22.VnD(), z21.VnD()),
2794           "mad z29.d, p6/m, z22.d, z21.d");
2795   COMPARE(mla(z23.VnB(), p1.Merging(), z21.VnB(), z23.VnB()),
2796           "mla z23.b, p1/m, z21.b, z23.b");
2797   COMPARE(mla(z23.VnH(), p1.Merging(), z21.VnH(), z23.VnH()),
2798           "mla z23.h, p1/m, z21.h, z23.h");
2799   COMPARE(mla(z23.VnS(), p1.Merging(), z21.VnS(), z23.VnS()),
2800           "mla z23.s, p1/m, z21.s, z23.s");
2801   COMPARE(mla(z23.VnD(), p1.Merging(), z21.VnD(), z23.VnD()),
2802           "mla z23.d, p1/m, z21.d, z23.d");
2803   COMPARE(mls(z4.VnB(), p6.Merging(), z17.VnB(), z28.VnB()),
2804           "mls z4.b, p6/m, z17.b, z28.b");
2805   COMPARE(mls(z4.VnH(), p6.Merging(), z17.VnH(), z28.VnH()),
2806           "mls z4.h, p6/m, z17.h, z28.h");
2807   COMPARE(mls(z4.VnS(), p6.Merging(), z17.VnS(), z28.VnS()),
2808           "mls z4.s, p6/m, z17.s, z28.s");
2809   COMPARE(mls(z4.VnD(), p6.Merging(), z17.VnD(), z28.VnD()),
2810           "mls z4.d, p6/m, z17.d, z28.d");
2811   COMPARE(msb(z27.VnB(), p7.Merging(), z29.VnB(), z1.VnB()),
2812           "msb z27.b, p7/m, z29.b, z1.b");
2813   COMPARE(msb(z27.VnH(), p7.Merging(), z29.VnH(), z1.VnH()),
2814           "msb z27.h, p7/m, z29.h, z1.h");
2815   COMPARE(msb(z27.VnS(), p7.Merging(), z29.VnS(), z1.VnS()),
2816           "msb z27.s, p7/m, z29.s, z1.s");
2817   COMPARE(msb(z27.VnD(), p7.Merging(), z29.VnD(), z1.VnD()),
2818           "msb z27.d, p7/m, z29.d, z1.d");
2819 
2820   CLEANUP();
2821 }
2822 
TEST(sve_int_mul_add_predicated_macro)2823 TEST(sve_int_mul_add_predicated_macro) {
2824   SETUP();
2825 
2826   COMPARE_MACRO(Mla(z0.VnB(), p1.Merging(), z0.VnB(), z2.VnB(), z4.VnB()),
2827                 "mla z0.b, p1/m, z2.b, z4.b");
2828   COMPARE_MACRO(Mla(z3.VnH(), p2.Merging(), z4.VnH(), z3.VnH(), z5.VnH()),
2829                 "mad z3.h, p2/m, z5.h, z4.h");
2830   COMPARE_MACRO(Mla(z4.VnS(), p3.Merging(), z5.VnS(), z6.VnS(), z4.VnS()),
2831                 "mad z4.s, p3/m, z6.s, z5.s");
2832   COMPARE_MACRO(Mla(z5.VnD(), p4.Merging(), z6.VnD(), z7.VnD(), z8.VnD()),
2833                 "movprfx z5.d, p4/m, z6.d\n"
2834                 "mla z5.d, p4/m, z7.d, z8.d");
2835 
2836   COMPARE_MACRO(Mls(z0.VnD(), p1.Merging(), z0.VnD(), z2.VnD(), z4.VnD()),
2837                 "mls z0.d, p1/m, z2.d, z4.d");
2838   COMPARE_MACRO(Mls(z3.VnS(), p2.Merging(), z4.VnS(), z3.VnS(), z5.VnS()),
2839                 "msb z3.s, p2/m, z5.s, z4.s");
2840   COMPARE_MACRO(Mls(z4.VnH(), p3.Merging(), z5.VnH(), z6.VnH(), z4.VnH()),
2841                 "msb z4.h, p3/m, z6.h, z5.h");
2842   COMPARE_MACRO(Mls(z5.VnB(), p4.Merging(), z6.VnB(), z7.VnB(), z8.VnB()),
2843                 "movprfx z5.b, p4/m, z6.b\n"
2844                 "mls z5.b, p4/m, z7.b, z8.b");
2845 
2846   CLEANUP();
2847 }
2848 
TEST(sve_int_mul_add_unpredicated)2849 TEST(sve_int_mul_add_unpredicated) {
2850   SETUP();
2851 
2852   COMPARE(sdot(z13.VnS(), z12.VnB(), z12.VnB()), "sdot z13.s, z12.b, z12.b");
2853   COMPARE(sdot(z18.VnD(), z27.VnH(), z22.VnH()), "sdot z18.d, z27.h, z22.h");
2854   COMPARE(udot(z23.VnS(), z22.VnB(), z11.VnB()), "udot z23.s, z22.b, z11.b");
2855   COMPARE(udot(z21.VnD(), z27.VnH(), z27.VnH()), "udot z21.d, z27.h, z27.h");
2856 
2857   CLEANUP();
2858 }
2859 
TEST(sve_int_mul_add_unpredicated_macro)2860 TEST(sve_int_mul_add_unpredicated_macro) {
2861   SETUP();
2862 
2863   COMPARE_MACRO(Sdot(z0.VnS(), z0.VnS(), z2.VnB(), z4.VnB()),
2864                 "sdot z0.s, z2.b, z4.b");
2865   COMPARE_MACRO(Sdot(z3.VnD(), z4.VnD(), z3.VnH(), z5.VnH()),
2866                 "movprfx z31, z4\n"
2867                 "sdot z31.d, z3.h, z5.h\n"
2868                 "mov z3.d, z31.d");
2869   COMPARE_MACRO(Sdot(z4.VnS(), z5.VnS(), z6.VnB(), z4.VnB()),
2870                 "movprfx z31, z5\n"
2871                 "sdot z31.s, z6.b, z4.b\n"
2872                 "mov z4.d, z31.d");
2873   COMPARE_MACRO(Sdot(z6.VnD(), z7.VnD(), z8.VnH(), z9.VnH()),
2874                 "movprfx z6, z7\n"
2875                 "sdot z6.d, z8.h, z9.h");
2876   COMPARE_MACRO(Sdot(z5.VnD(), z5.VnD(), z5.VnH(), z5.VnH()),
2877                 "sdot z5.d, z5.h, z5.h");
2878 
2879   COMPARE_MACRO(Udot(z0.VnD(), z0.VnD(), z2.VnH(), z4.VnH()),
2880                 "udot z0.d, z2.h, z4.h");
2881   COMPARE_MACRO(Udot(z3.VnS(), z4.VnS(), z3.VnB(), z5.VnB()),
2882                 "movprfx z31, z4\n"
2883                 "udot z31.s, z3.b, z5.b\n"
2884                 "mov z3.d, z31.d");
2885   COMPARE_MACRO(Udot(z4.VnD(), z5.VnD(), z6.VnH(), z4.VnH()),
2886                 "movprfx z31, z5\n"
2887                 "udot z31.d, z6.h, z4.h\n"
2888                 "mov z4.d, z31.d");
2889   COMPARE_MACRO(Udot(z6.VnS(), z7.VnS(), z8.VnB(), z9.VnB()),
2890                 "movprfx z6, z7\n"
2891                 "udot z6.s, z8.b, z9.b");
2892   COMPARE_MACRO(Udot(z5.VnS(), z5.VnS(), z5.VnB(), z5.VnB()),
2893                 "udot z5.s, z5.b, z5.b");
2894   CLEANUP();
2895 }
2896 
TEST(sve_int_reduction)2897 TEST(sve_int_reduction) {
2898   SETUP();
2899 
2900   COMPARE(andv(b15, p1, z4.VnB()), "andv b15, p1, z4.b");
2901   COMPARE(andv(h14, p2, z3.VnH()), "andv h14, p2, z3.h");
2902   COMPARE(andv(s13, p3, z2.VnS()), "andv s13, p3, z2.s");
2903   COMPARE(andv(d12, p4, z1.VnD()), "andv d12, p4, z1.d");
2904   COMPARE(eorv(b12, p0, z30.VnB()), "eorv b12, p0, z30.b");
2905   COMPARE(eorv(h11, p1, z29.VnH()), "eorv h11, p1, z29.h");
2906   COMPARE(eorv(s10, p2, z28.VnS()), "eorv s10, p2, z28.s");
2907   COMPARE(eorv(d9, p3, z27.VnD()), "eorv d9, p3, z27.d");
2908   COMPARE(movprfx(z30.VnB(), p2.Zeroing(), z23.VnB()),
2909           "movprfx z30.b, p2/z, z23.b");
2910   COMPARE(movprfx(z10.VnH(), p0.Merging(), z10.VnH()),
2911           "movprfx z10.h, p0/m, z10.h");
2912   COMPARE(movprfx(z0.VnS(), p2.Zeroing(), z23.VnS()),
2913           "movprfx z0.s, p2/z, z23.s");
2914   COMPARE(movprfx(z31.VnD(), p7.Merging(), z23.VnD()),
2915           "movprfx z31.d, p7/m, z23.d");
2916   COMPARE(orv(b4, p0, z16.VnB()), "orv b4, p0, z16.b");
2917   COMPARE(orv(h6, p2, z18.VnH()), "orv h6, p2, z18.h");
2918   COMPARE(orv(s8, p4, z20.VnS()), "orv s8, p4, z20.s");
2919   COMPARE(orv(d10, p6, z22.VnD()), "orv d10, p6, z22.d");
2920   COMPARE(saddv(d20, p1, z12.VnB()), "saddv d20, p1, z12.b");
2921   COMPARE(saddv(d22, p3, z15.VnH()), "saddv d22, p3, z15.h");
2922   COMPARE(saddv(d24, p5, z18.VnS()), "saddv d24, p5, z18.s");
2923   COMPARE(smaxv(b9, p3, z1.VnB()), "smaxv b9, p3, z1.b");
2924   COMPARE(smaxv(h19, p2, z1.VnH()), "smaxv h19, p2, z1.h");
2925   COMPARE(smaxv(s29, p1, z1.VnS()), "smaxv s29, p1, z1.s");
2926   COMPARE(smaxv(d9, p0, z1.VnD()), "smaxv d9, p0, z1.d");
2927   COMPARE(sminv(b8, p3, z14.VnB()), "sminv b8, p3, z14.b");
2928   COMPARE(sminv(h18, p2, z4.VnH()), "sminv h18, p2, z4.h");
2929   COMPARE(sminv(s28, p1, z4.VnS()), "sminv s28, p1, z4.s");
2930   COMPARE(sminv(d8, p0, z24.VnD()), "sminv d8, p0, z24.d");
2931   COMPARE(uaddv(d13, p0, z15.VnB()), "uaddv d13, p0, z15.b");
2932   COMPARE(uaddv(d15, p2, z20.VnH()), "uaddv d15, p2, z20.h");
2933   COMPARE(uaddv(d17, p4, z25.VnS()), "uaddv d17, p4, z25.s");
2934   COMPARE(uaddv(d19, p6, z30.VnD()), "uaddv d19, p6, z30.d");
2935   COMPARE(umaxv(b28, p3, z4.VnB()), "umaxv b28, p3, z4.b");
2936   COMPARE(umaxv(h18, p6, z2.VnH()), "umaxv h18, p6, z2.h");
2937   COMPARE(umaxv(s18, p4, z29.VnS()), "umaxv s18, p4, z29.s");
2938   COMPARE(umaxv(d28, p1, z24.VnD()), "umaxv d28, p1, z24.d");
2939   COMPARE(uminv(b16, p3, z0.VnB()), "uminv b16, p3, z0.b");
2940   COMPARE(uminv(h16, p2, z3.VnH()), "uminv h16, p2, z3.h");
2941   COMPARE(uminv(s16, p1, z5.VnS()), "uminv s16, p1, z5.s");
2942   COMPARE(uminv(d16, p7, z7.VnD()), "uminv d16, p7, z7.d");
2943 
2944   CLEANUP();
2945 }
2946 
TEST(sve_int_unary_arithmetic_predicated)2947 TEST(sve_int_unary_arithmetic_predicated) {
2948   SETUP();
2949 
2950   COMPARE(abs(z5.VnB(), p5.Merging(), z31.VnB()), "abs z5.b, p5/m, z31.b");
2951   COMPARE(abs(z29.VnH(), p5.Merging(), z17.VnH()), "abs z29.h, p5/m, z17.h");
2952   COMPARE(abs(z6.VnS(), p4.Merging(), z24.VnS()), "abs z6.s, p4/m, z24.s");
2953   COMPARE(abs(z19.VnD(), p3.Merging(), z25.VnD()), "abs z19.d, p3/m, z25.d");
2954   COMPARE(cls(z4.VnB(), p0.Merging(), z20.VnB()), "cls z4.b, p0/m, z20.b");
2955   COMPARE(cls(z11.VnH(), p0.Merging(), z26.VnH()), "cls z11.h, p0/m, z26.h");
2956   COMPARE(cls(z10.VnS(), p1.Merging(), z10.VnS()), "cls z10.s, p1/m, z10.s");
2957   COMPARE(cls(z5.VnD(), p1.Merging(), z4.VnD()), "cls z5.d, p1/m, z4.d");
2958   COMPARE(clz(z18.VnB(), p3.Merging(), z1.VnB()), "clz z18.b, p3/m, z1.b");
2959   COMPARE(clz(z13.VnH(), p4.Merging(), z18.VnH()), "clz z13.h, p4/m, z18.h");
2960   COMPARE(clz(z15.VnS(), p4.Merging(), z24.VnS()), "clz z15.s, p4/m, z24.s");
2961   COMPARE(clz(z29.VnD(), p2.Merging(), z22.VnD()), "clz z29.d, p2/m, z22.d");
2962   COMPARE(cnot(z16.VnB(), p6.Merging(), z20.VnB()), "cnot z16.b, p6/m, z20.b");
2963   COMPARE(cnot(z10.VnH(), p5.Merging(), z12.VnH()), "cnot z10.h, p5/m, z12.h");
2964   COMPARE(cnot(z8.VnS(), p5.Merging(), z21.VnS()), "cnot z8.s, p5/m, z21.s");
2965   COMPARE(cnot(z3.VnD(), p3.Merging(), z18.VnD()), "cnot z3.d, p3/m, z18.d");
2966   COMPARE(cnt(z29.VnB(), p3.Merging(), z7.VnB()), "cnt z29.b, p3/m, z7.b");
2967   COMPARE(cnt(z3.VnH(), p6.Merging(), z31.VnH()), "cnt z3.h, p6/m, z31.h");
2968   COMPARE(cnt(z2.VnS(), p4.Merging(), z16.VnS()), "cnt z2.s, p4/m, z16.s");
2969   COMPARE(cnt(z0.VnD(), p0.Merging(), z24.VnD()), "cnt z0.d, p0/m, z24.d");
2970   COMPARE(fabs(z17.VnH(), p7.Merging(), z15.VnH()), "fabs z17.h, p7/m, z15.h");
2971   COMPARE(fabs(z18.VnS(), p0.Merging(), z29.VnS()), "fabs z18.s, p0/m, z29.s");
2972   COMPARE(fabs(z17.VnD(), p1.Merging(), z9.VnD()), "fabs z17.d, p1/m, z9.d");
2973   COMPARE(fneg(z25.VnH(), p1.Merging(), z28.VnH()), "fneg z25.h, p1/m, z28.h");
2974   COMPARE(fneg(z5.VnS(), p1.Merging(), z25.VnS()), "fneg z5.s, p1/m, z25.s");
2975   COMPARE(fneg(z6.VnD(), p1.Merging(), z17.VnD()), "fneg z6.d, p1/m, z17.d");
2976   COMPARE(neg(z25.VnB(), p4.Merging(), z8.VnB()), "neg z25.b, p4/m, z8.b");
2977   COMPARE(neg(z30.VnH(), p3.Merging(), z23.VnH()), "neg z30.h, p3/m, z23.h");
2978   COMPARE(neg(z7.VnS(), p2.Merging(), z26.VnS()), "neg z7.s, p2/m, z26.s");
2979   COMPARE(neg(z21.VnD(), p3.Merging(), z5.VnD()), "neg z21.d, p3/m, z5.d");
2980   COMPARE(not_(z24.VnB(), p1.Merging(), z27.VnB()), "not z24.b, p1/m, z27.b");
2981   COMPARE(not_(z31.VnH(), p6.Merging(), z19.VnH()), "not z31.h, p6/m, z19.h");
2982   COMPARE(not_(z18.VnS(), p5.Merging(), z13.VnS()), "not z18.s, p5/m, z13.s");
2983   COMPARE(not_(z12.VnD(), p2.Merging(), z28.VnD()), "not z12.d, p2/m, z28.d");
2984   COMPARE(sxtb(z19.VnH(), p7.Merging(), z3.VnH()), "sxtb z19.h, p7/m, z3.h");
2985   COMPARE(sxtb(z3.VnS(), p1.Merging(), z17.VnS()), "sxtb z3.s, p1/m, z17.s");
2986   COMPARE(sxtb(z27.VnD(), p0.Merging(), z12.VnD()), "sxtb z27.d, p0/m, z12.d");
2987   COMPARE(sxth(z6.VnS(), p1.Merging(), z17.VnS()), "sxth z6.s, p1/m, z17.s");
2988   COMPARE(sxth(z8.VnD(), p6.Merging(), z2.VnD()), "sxth z8.d, p6/m, z2.d");
2989   COMPARE(sxtw(z13.VnD(), p3.Merging(), z27.VnD()), "sxtw z13.d, p3/m, z27.d");
2990   COMPARE(uxtb(z23.VnH(), p3.Merging(), z21.VnH()), "uxtb z23.h, p3/m, z21.h");
2991   COMPARE(uxtb(z0.VnS(), p2.Merging(), z13.VnS()), "uxtb z0.s, p2/m, z13.s");
2992   COMPARE(uxtb(z1.VnD(), p3.Merging(), z13.VnD()), "uxtb z1.d, p3/m, z13.d");
2993   COMPARE(uxth(z27.VnS(), p0.Merging(), z29.VnS()), "uxth z27.s, p0/m, z29.s");
2994   COMPARE(uxth(z22.VnD(), p4.Merging(), z20.VnD()), "uxth z22.d, p4/m, z20.d");
2995   COMPARE(uxtw(z14.VnD(), p1.Merging(), z13.VnD()), "uxtw z14.d, p1/m, z13.d");
2996 
2997   // Check related but undefined encodings.
2998   COMPARE(dci(0x0410a000), "unallocated (Unallocated)");  // sxtb b
2999   COMPARE(dci(0x0412a000), "unallocated (Unallocated)");  // sxth b
3000   COMPARE(dci(0x0452a000), "unallocated (Unallocated)");  // sxth h
3001   COMPARE(dci(0x0414a000), "unallocated (Unallocated)");  // sxtw b
3002   COMPARE(dci(0x0454a000), "unallocated (Unallocated)");  // sxtw h
3003   COMPARE(dci(0x0494a000), "unallocated (Unallocated)");  // sxtw s
3004 
3005   COMPARE(dci(0x0411a000), "unallocated (Unallocated)");  // uxtb b
3006   COMPARE(dci(0x0413a000), "unallocated (Unallocated)");  // uxth b
3007   COMPARE(dci(0x0453a000), "unallocated (Unallocated)");  // uxth h
3008   COMPARE(dci(0x0415a000), "unallocated (Unallocated)");  // uxtw b
3009   COMPARE(dci(0x0455a000), "unallocated (Unallocated)");  // uxtw h
3010   COMPARE(dci(0x0495a000), "unallocated (Unallocated)");  // uxtw s
3011 
3012   COMPARE(dci(0x041ca000), "unallocated (Unallocated)");  // fabs b
3013   COMPARE(dci(0x041da000), "unallocated (Unallocated)");  // fneg b
3014 
3015   CLEANUP();
3016 }
3017 
TEST(sve_neg_macro)3018 TEST(sve_neg_macro) {
3019   SETUP();
3020 
3021   COMPARE_MACRO(Neg(z0.VnB(), z0.VnB()), "subr z0.b, z0.b, #0");
3022   COMPARE_MACRO(Neg(z1.VnH(), z2.VnH()),
3023                 "movprfx z1, z2\n"
3024                 "subr z1.h, z1.h, #0");
3025   COMPARE_MACRO(Neg(z29.VnS(), z29.VnS()), "subr z29.s, z29.s, #0");
3026   COMPARE_MACRO(Neg(z30.VnD(), z31.VnD()),
3027                 "movprfx z30, z31\n"
3028                 "subr z30.d, z30.d, #0");
3029 
3030   CLEANUP();
3031 }
3032 
TEST(sve_cpy_fcpy_imm)3033 TEST(sve_cpy_fcpy_imm) {
3034   SETUP();
3035 
3036   COMPARE(cpy(z25.VnB(), p13.Zeroing(), -1), "mov z25.b, p13/z, #-1");
3037   COMPARE(cpy(z25.VnB(), p13.Merging(), -1), "mov z25.b, p13/m, #-1");
3038   COMPARE(cpy(z25.VnH(), p13.Merging(), 127), "mov z25.h, p13/m, #127");
3039   COMPARE(cpy(z25.VnS(), p13.Merging(), 10752),
3040           "mov z25.s, p13/m, #42, lsl #8");
3041   COMPARE(cpy(z25.VnD(), p13.Merging(), -10752),
3042           "mov z25.d, p13/m, #-42, lsl #8");
3043   COMPARE(mov(z25.VnD(), p13.Merging(), -10752),
3044           "mov z25.d, p13/m, #-42, lsl #8");
3045 
3046   COMPARE(fcpy(z20.VnH(), p11.Merging(), 29.0),
3047           "fmov z20.h, p11/m, #0x3d (29.0000)");
3048   COMPARE(fmov(z20.VnS(), p11.Merging(), -31.0),
3049           "fmov z20.s, p11/m, #0xbf (-31.0000)");
3050   COMPARE(fcpy(z20.VnD(), p11.Merging(), 1.0),
3051           "fmov z20.d, p11/m, #0x70 (1.0000)");
3052 
3053   CLEANUP();
3054 }
3055 
TEST(sve_fmov_zero)3056 TEST(sve_fmov_zero) {
3057   SETUP();
3058 
3059   // Predicated `fmov` is an alias for either `fcpy` or `cpy`.
3060   COMPARE(fmov(z13.VnS(), p0.Merging(), 1.0),
3061           "fmov z13.s, p0/m, #0x70 (1.0000)");
3062   COMPARE(fmov(z13.VnS(), p0.Merging(), 0.0), "mov z13.s, p0/m, #0");
3063   COMPARE_MACRO(Fmov(z13.VnD(), p0.Merging(), 1.0),
3064                 "fmov z13.d, p0/m, #0x70 (1.0000)");
3065   COMPARE_MACRO(Fmov(z13.VnD(), p0.Merging(), 0.0), "mov z13.d, p0/m, #0");
3066 
3067   // Unpredicated `fmov` is an alias for either `fdup` or `dup`.
3068   COMPARE(fmov(z13.VnS(), 1.0), "fmov z13.s, #0x70 (1.0000)");
3069   COMPARE(fmov(z13.VnS(), 0.0), "mov z13.s, #0");
3070   COMPARE_MACRO(Fmov(z13.VnD(), 1.0), "fmov z13.d, #0x70 (1.0000)");
3071   COMPARE_MACRO(Fmov(z13.VnD(), 0.0), "mov z13.d, #0");
3072 
3073   // -0.0 cannot be encoded by this alias, but is handled by the MacroAssembler.
3074   COMPARE_MACRO(Fmov(z13.VnD(), p0.Merging(), -0.0),
3075                 "mov x16, #0x8000000000000000\n"
3076                 "mov z13.d, p0/m, x16");
3077   COMPARE_MACRO(Fmov(z13.VnD(), -0.0), "mov z13.d, #0x8000000000000000");
3078 
3079   CLEANUP();
3080 }
3081 
TEST(sve_int_wide_imm_unpredicated)3082 TEST(sve_int_wide_imm_unpredicated) {
3083   SETUP();
3084 
3085   COMPARE(add(z12.VnB(), z12.VnB(), 0), "add z12.b, z12.b, #0");
3086   COMPARE(add(z13.VnH(), z13.VnH(), 255), "add z13.h, z13.h, #255");
3087   COMPARE(add(z14.VnS(), z14.VnS(), 256), "add z14.s, z14.s, #1, lsl #8");
3088   COMPARE(add(z15.VnD(), z15.VnD(), 255 * 256),
3089           "add z15.d, z15.d, #255, lsl #8");
3090 
3091   COMPARE(dup(z6.VnB(), -128), "mov z6.b, #-128");
3092   COMPARE(dup(z7.VnH(), 127), "mov z7.h, #127");
3093   COMPARE(dup(z8.VnS(), -128 * 256), "mov z8.s, #-128, lsl #8");
3094   COMPARE(dup(z9.VnD(), 127 * 256), "mov z9.d, #127, lsl #8");
3095   COMPARE(mov(z8.VnS(), -128 * 256, -1), "mov z8.s, #-128, lsl #8");
3096   COMPARE(mov(z9.VnD(), 127 * 256, -1), "mov z9.d, #127, lsl #8");
3097 
3098   COMPARE(sqadd(z7.VnB(), z7.VnB(), 124), "sqadd z7.b, z7.b, #124");
3099   COMPARE(sqadd(z8.VnH(), z8.VnH(), 131), "sqadd z8.h, z8.h, #131");
3100   COMPARE(sqadd(z9.VnS(), z9.VnS(), 252 * 256),
3101           "sqadd z9.s, z9.s, #252, lsl #8");
3102   COMPARE(sqadd(z10.VnD(), z10.VnD(), 20 * 256),
3103           "sqadd z10.d, z10.d, #20, lsl #8");
3104 
3105   COMPARE(sqsub(z31.VnB(), z31.VnB(), 132), "sqsub z31.b, z31.b, #132");
3106   COMPARE(sqsub(z30.VnH(), z30.VnH(), 251), "sqsub z30.h, z30.h, #251");
3107   COMPARE(sqsub(z29.VnS(), z29.VnS(), 21 * 256),
3108           "sqsub z29.s, z29.s, #21, lsl #8");
3109   COMPARE(sqsub(z28.VnD(), z28.VnD(), 123 * 256),
3110           "sqsub z28.d, z28.d, #123, lsl #8");
3111 
3112   COMPARE(subr(z20.VnB(), z20.VnB(), 250), "subr z20.b, z20.b, #250");
3113   COMPARE(subr(z21.VnH(), z21.VnH(), 22), "subr z21.h, z21.h, #22");
3114   COMPARE(subr(z22.VnS(), z22.VnS(), 122 * 256),
3115           "subr z22.s, z22.s, #122, lsl #8");
3116   COMPARE(subr(z23.VnD(), z23.VnD(), 133 * 256),
3117           "subr z23.d, z23.d, #133, lsl #8");
3118 
3119   COMPARE(sub(z18.VnB(), z18.VnB(), 23), "sub z18.b, z18.b, #23");
3120   COMPARE(sub(z19.VnH(), z19.VnH(), 121), "sub z19.h, z19.h, #121");
3121   COMPARE(sub(z20.VnS(), z20.VnS(), 134 * 256),
3122           "sub z20.s, z20.s, #134, lsl #8");
3123   COMPARE(sub(z21.VnD(), z21.VnD(), 249 * 256),
3124           "sub z21.d, z21.d, #249, lsl #8");
3125 
3126   COMPARE(uqadd(z21.VnB(), z21.VnB(), 246), "uqadd z21.b, z21.b, #246");
3127   COMPARE(uqadd(z22.VnH(), z22.VnH(), 26), "uqadd z22.h, z22.h, #26");
3128   COMPARE(uqadd(z23.VnS(), z23.VnS(), 118 * 256),
3129           "uqadd z23.s, z23.s, #118, lsl #8");
3130   COMPARE(uqadd(z24.VnD(), z24.VnD(), 137 * 256),
3131           "uqadd z24.d, z24.d, #137, lsl #8");
3132 
3133   COMPARE(uqsub(z10.VnB(), z10.VnB(), 27), "uqsub z10.b, z10.b, #27");
3134   COMPARE(uqsub(z11.VnH(), z11.VnH(), 117), "uqsub z11.h, z11.h, #117");
3135   COMPARE(uqsub(z12.VnS(), z12.VnS(), 138 * 256),
3136           "uqsub z12.s, z12.s, #138, lsl #8");
3137   COMPARE(uqsub(z13.VnD(), z13.VnD(), 245 * 256),
3138           "uqsub z13.d, z13.d, #245, lsl #8");
3139 
3140   COMPARE(fdup(z26.VnH(), Float16(-5.0f)), "fmov z26.h, #0x94 (-5.0000)");
3141   COMPARE(fdup(z27.VnS(), -13.0f), "fmov z27.s, #0xaa (-13.0000)");
3142   COMPARE(fdup(z28.VnD(), 1.0f), "fmov z28.d, #0x70 (1.0000)");
3143   COMPARE(fmov(z28.VnD(), 1.0f), "fmov z28.d, #0x70 (1.0000)");
3144 
3145   COMPARE(mul(z15.VnB(), z15.VnB(), -128), "mul z15.b, z15.b, #-128");
3146   COMPARE(mul(z16.VnH(), z16.VnH(), -1), "mul z16.h, z16.h, #-1");
3147   COMPARE(mul(z17.VnS(), z17.VnS(), 17), "mul z17.s, z17.s, #17");
3148   COMPARE(mul(z18.VnD(), z18.VnD(), 127), "mul z18.d, z18.d, #127");
3149 
3150   COMPARE(smax(z7.VnB(), z7.VnB(), -2), "smax z7.b, z7.b, #-2");
3151   COMPARE(smax(z8.VnH(), z8.VnH(), 18), "smax z8.h, z8.h, #18");
3152   COMPARE(smax(z9.VnS(), z9.VnS(), 126), "smax z9.s, z9.s, #126");
3153   COMPARE(smax(z10.VnD(), z10.VnD(), -127), "smax z10.d, z10.d, #-127");
3154 
3155   COMPARE(smin(z5.VnB(), z5.VnB(), 19), "smin z5.b, z5.b, #19");
3156   COMPARE(smin(z6.VnH(), z6.VnH(), 125), "smin z6.h, z6.h, #125");
3157   COMPARE(smin(z7.VnS(), z7.VnS(), -126), "smin z7.s, z7.s, #-126");
3158   COMPARE(smin(z8.VnD(), z8.VnD(), -3), "smin z8.d, z8.d, #-3");
3159 
3160   COMPARE(umax(z15.VnB(), z15.VnB(), 120), "umax z15.b, z15.b, #120");
3161   COMPARE(umax(z16.VnH(), z16.VnH(), 135), "umax z16.h, z16.h, #135");
3162   COMPARE(umax(z17.VnS(), z17.VnS(), 248), "umax z17.s, z17.s, #248");
3163   COMPARE(umax(z18.VnD(), z18.VnD(), 24), "umax z18.d, z18.d, #24");
3164 
3165   COMPARE(umin(z22.VnB(), z22.VnB(), 136), "umin z22.b, z22.b, #136");
3166   COMPARE(umin(z23.VnH(), z23.VnH(), 247), "umin z23.h, z23.h, #247");
3167   COMPARE(umin(z24.VnS(), z24.VnS(), 25), "umin z24.s, z24.s, #25");
3168   COMPARE(umin(z25.VnD(), z25.VnD(), 119), "umin z25.d, z25.d, #119");
3169 
3170   CLEANUP();
3171 }
3172 
TEST(sve_add_sub_imm_macro)3173 TEST(sve_add_sub_imm_macro) {
3174   SETUP();
3175 
3176   // The MacroAssembler automatically generates movprfx where necessary.
3177   COMPARE_MACRO(Add(z12.VnB(), z13.VnB(), 0),
3178                 "movprfx z12, z13\n"
3179                 "add z12.b, z12.b, #0");
3180   COMPARE_MACRO(Sub(z20.VnB(), 250, z2.VnB()),
3181                 "movprfx z20, z2\n"
3182                 "subr z20.b, z20.b, #250");
3183   COMPARE_MACRO(Sub(z19.VnH(), z4.VnH(), 121),
3184                 "movprfx z19, z4\n"
3185                 "sub z19.h, z19.h, #121");
3186 
3187   // Add and Sub can make use of two's complement equivalences.
3188   COMPARE_MACRO(Add(z13.VnH(), z13.VnH(), 0xffff), "sub z13.h, z13.h, #1");
3189   COMPARE_MACRO(Add(z15.VnD(), z15.VnD(), 0xffffffffffffffd6),
3190                 "sub z15.d, z15.d, #42");
3191   COMPARE_MACRO(Add(z16.VnH(), z16.VnH(), 0xff00),
3192                 "add z16.h, z16.h, #255, lsl #8");
3193   COMPARE_MACRO(Sub(z17.VnH(), z17.VnH(), 0xfffe), "add z17.h, z17.h, #2");
3194   COMPARE_MACRO(Sub(z14.VnB(), z14.VnB(), 0x80), "sub z14.b, z14.b, #128");
3195 
3196   // The MacroAssembler automatically generates dup if an immediate isn't
3197   // encodable.
3198   COMPARE_MACRO(Add(z15.VnD(), z20.VnD(), 1234567890),
3199                 "mov x16, #0x2d2\n"
3200                 "movk x16, #0x4996, lsl #16\n"
3201                 "mov z31.d, x16\n"
3202                 "add z15.d, z20.d, z31.d");
3203   COMPARE_MACRO(Sub(z22.VnS(), 256 * 256, z2.VnS()),
3204                 "mov z31.s, #0x10000\n"
3205                 "sub z22.s, z31.s, z2.s");
3206   COMPARE_MACRO(Sub(z21.VnD(), z11.VnD(), 111111111111),
3207                 "mov x16, #0x1c7\n"
3208                 "movk x16, #0xdebd, lsl #16\n"
3209                 "movk x16, #0x19, lsl #32\n"
3210                 "mov z31.d, x16\n"
3211                 "sub z21.d, z11.d, z31.d");
3212 
3213   CLEANUP();
3214 }
3215 
TEST(sve_uqadd_uqsub_imm_macro)3216 TEST(sve_uqadd_uqsub_imm_macro) {
3217   SETUP();
3218 
3219   // The MacroAssembler automatically generates movprfx where necessary.
3220   COMPARE_MACRO(Uqadd(z21.VnB(), z14.VnB(), 246),
3221                 "movprfx z21, z14\n"
3222                 "uqadd z21.b, z21.b, #246");
3223   COMPARE_MACRO(Uqsub(z10.VnB(), z27.VnB(), 27),
3224                 "movprfx z10, z27\n"
3225                 "uqsub z10.b, z10.b, #27");
3226   COMPARE_MACRO(Uqadd(z1.VnS(), z2.VnS(), 42 * 256),
3227                 "movprfx z1, z2\n"
3228                 "uqadd z1.s, z1.s, #42, lsl #8");
3229 
3230   COMPARE_MACRO(Uqsub(z3.VnB(), z3.VnB(), 0xff), "uqsub z3.b, z3.b, #255");
3231   COMPARE_MACRO(Uqadd(z8.VnS(), z8.VnS(), 0xff00),
3232                 "uqadd z8.s, z8.s, #255, lsl #8");
3233 
3234   CLEANUP();
3235 }
3236 
TEST(sve_sqadd_sqsub_imm_macro)3237 TEST(sve_sqadd_sqsub_imm_macro) {
3238   SETUP();
3239 
3240   // The MacroAssembler automatically generates movprfx where necessary.
3241   COMPARE_MACRO(Sqadd(z21.VnB(), z14.VnB(), 123),
3242                 "movprfx z21, z14\n"
3243                 "sqadd z21.b, z21.b, #123");
3244   COMPARE_MACRO(Sqsub(z10.VnB(), z27.VnB(), 27),
3245                 "movprfx z10, z27\n"
3246                 "sqsub z10.b, z10.b, #27");
3247   COMPARE_MACRO(Sqadd(z22.VnS(), z15.VnS(), 256),
3248                 "movprfx z22, z15\n"
3249                 "sqadd z22.s, z22.s, #1, lsl #8");
3250 
3251   COMPARE_MACRO(Sqsub(z3.VnB(), z3.VnB(), 0xff), "sqsub z3.b, z3.b, #255");
3252   COMPARE_MACRO(Sqadd(z4.VnH(), z4.VnH(), 0xff00),
3253                 "sqadd z4.h, z4.h, #255, lsl #8");
3254 
3255   CLEANUP();
3256 }
3257 
TEST(sve_int_wide_imm_unpredicated_macro)3258 TEST(sve_int_wide_imm_unpredicated_macro) {
3259   SETUP();
3260 
3261   // The MacroAssembler automatically generates movprfx where it can.
3262   COMPARE_MACRO(Mul(z1.VnD(), z18.VnD(), 127),
3263                 "movprfx z1, z18\n"
3264                 "mul z1.d, z1.d, #127");
3265   COMPARE_MACRO(Smax(z3.VnS(), z9.VnS(), 126),
3266                 "movprfx z3, z9\n"
3267                 "smax z3.s, z3.s, #126");
3268   COMPARE_MACRO(Smin(z26.VnH(), z6.VnH(), 125),
3269                 "movprfx z26, z6\n"
3270                 "smin z26.h, z26.h, #125");
3271   COMPARE_MACRO(Umax(z25.VnB(), z15.VnB(), 120),
3272                 "movprfx z25, z15\n"
3273                 "umax z25.b, z25.b, #120");
3274   COMPARE_MACRO(Umin(z13.VnD(), z25.VnD(), 119),
3275                 "movprfx z13, z25\n"
3276                 "umin z13.d, z13.d, #119");
3277   COMPARE_MACRO(Dup(z8.VnS(), -7654321),
3278                 "mov w16, #0x344f\n"
3279                 "movk w16, #0xff8b, lsl #16\n"
3280                 "mov z8.s, w16");
3281 
3282   // The MacroAssembler automatically generates dup if an immediate isn't
3283   // encodable, when it is out-of-range for example.
3284   COMPARE_MACRO(Dup(z9.VnD(), 0x80000000), "mov z9.d, #0x80000000");
3285   COMPARE_MACRO(Mov(z9.VnD(), 0x80000000), "mov z9.d, #0x80000000");
3286   COMPARE_MACRO(Fdup(z26.VnH(), Float16(0.0)), "mov z26.h, #0");
3287   COMPARE_MACRO(Fdup(z26.VnH(), Float16(0.0)), "mov z26.h, #0");
3288   COMPARE_MACRO(Fdup(z27.VnS(), 255.0f),
3289                 "mov w16, #0x437f0000\n"
3290                 "mov z27.s, w16");
3291   COMPARE_MACRO(Fdup(z28.VnD(), 12.3456),
3292                 "mov x16, #0xfec5\n"
3293                 "movk x16, #0x7bb2, lsl #16\n"
3294                 "movk x16, #0xb0f2, lsl #32\n"
3295                 "movk x16, #0x4028, lsl #48\n"
3296                 "mov z28.d, x16");
3297   COMPARE_MACRO(Fmov(z26.VnH(), Float16(0.0)), "mov z26.h, #0");
3298   COMPARE_MACRO(Fmov(z26.VnH(), Float16(0.0)), "mov z26.h, #0");
3299   COMPARE_MACRO(Fmov(z27.VnS(), 255.0f),
3300                 "mov w16, #0x437f0000\n"
3301                 "mov z27.s, w16");
3302   COMPARE_MACRO(Fmov(z28.VnD(), 12.3456),
3303                 "mov x16, #0xfec5\n"
3304                 "movk x16, #0x7bb2, lsl #16\n"
3305                 "movk x16, #0xb0f2, lsl #32\n"
3306                 "movk x16, #0x4028, lsl #48\n"
3307                 "mov z28.d, x16");
3308 
3309   // Only predicated version of instruction is supported for unencodable
3310   // immediate.
3311   {
3312     UseScratchRegisterScope temps(&masm);
3313     temps.Include(p7, p15);
3314     COMPARE_MACRO(Mul(z18.VnD(), z18.VnD(), -1270000000),
3315                   "ptrue p7.d\n"
3316                   "mov x16, #0xffffffffffff5680\n"
3317                   "movk x16, #0xb44d, lsl #16\n"
3318                   "mov z31.d, x16\n"
3319                   "mul z18.d, p7/m, z18.d, z31.d");
3320     COMPARE_MACRO(Smax(z9.VnS(), z11.VnS(), -0x70000001),
3321                   "ptrue p7.s\n"
3322                   "mov z9.s, #0x8fffffff\n"
3323                   "smax z9.s, p7/m, z9.s, z11.s");
3324     COMPARE_MACRO(Smin(z6.VnH(), z6.VnH(), -0x7eef),
3325                   "ptrue p7.h\n"
3326                   "mov w16, #0xffff8111\n"
3327                   "mov z31.h, w16\n"
3328                   "smin z6.h, p7/m, z6.h, z31.h");
3329     COMPARE_MACRO(Umax(z15.VnH(), z7.VnH(), 0xfeee),
3330                   "ptrue p7.h\n"
3331                   "mov w16, #0xfeee\n"
3332                   "mov z15.h, w16\n"
3333                   "umax z15.h, p7/m, z15.h, z7.h");
3334     COMPARE_MACRO(Umin(z25.VnD(), z25.VnD(), 123123123),
3335                   "ptrue p7.d\n"
3336                   "mov x16, #0xb5b3\n"
3337                   "movk x16, #0x756, lsl #16\n"
3338                   "mov z31.d, x16\n"
3339                   "umin z25.d, p7/m, z25.d, z31.d");
3340   }
3341 }
3342 
TEST(sve_mem_32bit_gather_vector_plus_immediate_macro)3343 TEST(sve_mem_32bit_gather_vector_plus_immediate_macro) {
3344   SETUP();
3345 
3346   // Simple cases.
3347   COMPARE_MACRO(Ld1b(z4.VnS(), p4.Zeroing(), SVEMemOperand(z12.VnS(), 31)),
3348                 "ld1b {z4.s}, p4/z, [z12.s, #31]");
3349   COMPARE_MACRO(Ld1h(z10.VnS(), p6.Zeroing(), SVEMemOperand(z4.VnS(), 10)),
3350                 "ld1h {z10.s}, p6/z, [z4.s, #10]");
3351   COMPARE_MACRO(Ld1w(z16.VnS(), p0.Zeroing(), SVEMemOperand(z26.VnS(), 124)),
3352                 "ld1w {z16.s}, p0/z, [z26.s, #124]");
3353   COMPARE_MACRO(Ld1sb(z9.VnS(), p3.Zeroing(), SVEMemOperand(z22.VnS())),
3354                 "ld1sb {z9.s}, p3/z, [z22.s]");
3355   COMPARE_MACRO(Ld1sh(z22.VnS(), p1.Zeroing(), SVEMemOperand(z9.VnS(), 62)),
3356                 "ld1sh {z22.s}, p1/z, [z9.s, #62]");
3357   COMPARE_MACRO(Ldff1b(z17.VnS(), p2.Zeroing(), SVEMemOperand(z29.VnS(), 0)),
3358                 "ldff1b {z17.s}, p2/z, [z29.s]");
3359   COMPARE_MACRO(Ldff1h(z16.VnS(), p3.Zeroing(), SVEMemOperand(z15.VnS())),
3360                 "ldff1h {z16.s}, p3/z, [z15.s]");
3361   COMPARE_MACRO(Ldff1w(z7.VnS(), p3.Zeroing(), SVEMemOperand(z20.VnS(), 4)),
3362                 "ldff1w {z7.s}, p3/z, [z20.s, #4]");
3363   COMPARE_MACRO(Ldff1sb(z7.VnS(), p1.Zeroing(), SVEMemOperand(z10.VnS(), 21)),
3364                 "ldff1sb {z7.s}, p1/z, [z10.s, #21]");
3365   COMPARE_MACRO(Ldff1sh(z0.VnS(), p1.Zeroing(), SVEMemOperand(z23.VnS(), 42)),
3366                 "ldff1sh {z0.s}, p1/z, [z23.s, #42]");
3367 
3368   // Unencodable cases use a scalar-plus-vector form.
3369   COMPARE_MACRO(Ld1b(z17.VnS(), p2.Zeroing(), SVEMemOperand(z11.VnS(), 32)),
3370                 "mov x16, #0x20\n"
3371                 "ld1b {z17.s}, p2/z, [x16, z11.s, uxtw]");
3372   COMPARE_MACRO(Ld1h(z11.VnS(), p1.Zeroing(), SVEMemOperand(z8.VnS(), -2)),
3373                 "mov x16, #0xfffffffffffffffe\n"
3374                 "ld1h {z11.s}, p1/z, [x16, z8.s, uxtw]");
3375   COMPARE_MACRO(Ld1w(z5.VnS(), p6.Zeroing(), SVEMemOperand(z9.VnS(), 42)),
3376                 "mov x16, #0x2a\n"
3377                 "ld1w {z5.s}, p6/z, [x16, z9.s, uxtw]");
3378   COMPARE_MACRO(Ld1sb(z28.VnS(), p5.Zeroing(), SVEMemOperand(z12.VnS(), -1)),
3379                 "mov x16, #0xffffffffffffffff\n"
3380                 "ld1sb {z28.s}, p5/z, [x16, z12.s, uxtw]");
3381   COMPARE_MACRO(Ld1sh(z30.VnS(), p5.Zeroing(), SVEMemOperand(z21.VnS(), 64)),
3382                 "mov x16, #0x40\n"
3383                 "ld1sh {z30.s}, p5/z, [x16, z21.s, uxtw]");
3384   COMPARE_MACRO(Ldff1b(z19.VnS(), p6.Zeroing(), SVEMemOperand(z24.VnS(), 32)),
3385                 "mov x16, #0x20\n"
3386                 "ldff1b {z19.s}, p6/z, [x16, z24.s, uxtw]");
3387   COMPARE_MACRO(Ldff1h(z5.VnS(), p1.Zeroing(), SVEMemOperand(z24.VnS(), -2)),
3388                 "mov x16, #0xfffffffffffffffe\n"
3389                 "ldff1h {z5.s}, p1/z, [x16, z24.s, uxtw]");
3390   COMPARE_MACRO(Ldff1w(z17.VnS(), p6.Zeroing(), SVEMemOperand(z18.VnS(), 42)),
3391                 "mov x16, #0x2a\n"
3392                 "ldff1w {z17.s}, p6/z, [x16, z18.s, uxtw]");
3393   COMPARE_MACRO(Ldff1sb(z31.VnS(), p5.Zeroing(), SVEMemOperand(z21.VnS(), -1)),
3394                 "mov x16, #0xffffffffffffffff\n"
3395                 "ldff1sb {z31.s}, p5/z, [x16, z21.s, uxtw]");
3396   COMPARE_MACRO(Ldff1sh(z6.VnS(), p5.Zeroing(), SVEMemOperand(z22.VnS(), 64)),
3397                 "mov x16, #0x40\n"
3398                 "ldff1sh {z6.s}, p5/z, [x16, z22.s, uxtw]");
3399 
3400   CLEANUP();
3401 }
3402 
TEST(sve_mem_32bit_gather_and_unsized_contiguous)3403 TEST(sve_mem_32bit_gather_and_unsized_contiguous) {
3404   SETUP();
3405 
3406   // 32-bit gather load in scalar-plus-vector vform with unscaled offset.
3407   COMPARE(ld1b(z9.VnS(), p5.Zeroing(), SVEMemOperand(x2, z1.VnS(), SXTW)),
3408           "ld1b {z9.s}, p5/z, [x2, z1.s, sxtw]");
3409   COMPARE(ld1b(z9.VnS(), p5.Zeroing(), SVEMemOperand(sp, z1.VnS(), UXTW)),
3410           "ld1b {z9.s}, p5/z, [sp, z1.s, uxtw]");
3411   COMPARE(ld1h(z17.VnS(), p2.Zeroing(), SVEMemOperand(x11, z24.VnS(), SXTW)),
3412           "ld1h {z17.s}, p2/z, [x11, z24.s, sxtw]");
3413   COMPARE(ld1w(z22.VnS(), p6.Zeroing(), SVEMemOperand(sp, z5.VnS(), UXTW)),
3414           "ld1w {z22.s}, p6/z, [sp, z5.s, uxtw]");
3415   COMPARE(ld1sb(z12.VnS(), p7.Zeroing(), SVEMemOperand(x17, z23.VnS(), UXTW)),
3416           "ld1sb {z12.s}, p7/z, [x17, z23.s, uxtw]");
3417   COMPARE(ld1sb(z22.VnS(), p3.Zeroing(), SVEMemOperand(x23, z23.VnS(), SXTW)),
3418           "ld1sb {z22.s}, p3/z, [x23, z23.s, sxtw]");
3419   COMPARE(ld1sh(z11.VnS(), p2.Zeroing(), SVEMemOperand(x18, z10.VnS(), UXTW)),
3420           "ld1sh {z11.s}, p2/z, [x18, z10.s, uxtw]");
3421 
3422   // 32-bit gather load in scalar-plus-vector vform with scaled offset.
3423   COMPARE(ld1h(z9.VnS(), p3.Zeroing(), SVEMemOperand(sp, z4.VnS(), UXTW, 1)),
3424           "ld1h {z9.s}, p3/z, [sp, z4.s, uxtw #1]");
3425   COMPARE(ld1w(z0.VnS(), p6.Zeroing(), SVEMemOperand(x28, z21.VnS(), SXTW, 2)),
3426           "ld1w {z0.s}, p6/z, [x28, z21.s, sxtw #2]");
3427   COMPARE(ld1sh(z11.VnS(), p4.Zeroing(), SVEMemOperand(sp, z0.VnS(), SXTW, 1)),
3428           "ld1sh {z11.s}, p4/z, [sp, z0.s, sxtw #1]");
3429 
3430   // 32-bit gather first-fault load in scalar-plus-vector vform with 32-bit
3431   // unpacked unscaled offset.
3432   COMPARE(ldff1b(z18.VnS(), p6.Zeroing(), SVEMemOperand(x27, z24.VnS(), UXTW)),
3433           "ldff1b {z18.s}, p6/z, [x27, z24.s, uxtw]");
3434   COMPARE(ldff1h(z28.VnS(), p6.Zeroing(), SVEMemOperand(x1, z30.VnS(), UXTW)),
3435           "ldff1h {z28.s}, p6/z, [x1, z30.s, uxtw]");
3436   COMPARE(ldff1w(z12.VnS(), p3.Zeroing(), SVEMemOperand(x25, z27.VnS(), SXTW)),
3437           "ldff1w {z12.s}, p3/z, [x25, z27.s, sxtw]");
3438   COMPARE(ldff1sb(z15.VnS(), p5.Zeroing(), SVEMemOperand(x5, z14.VnS(), SXTW)),
3439           "ldff1sb {z15.s}, p5/z, [x5, z14.s, sxtw]");
3440   COMPARE(ldff1sh(z18.VnS(), p4.Zeroing(), SVEMemOperand(x25, z25.VnS(), SXTW)),
3441           "ldff1sh {z18.s}, p4/z, [x25, z25.s, sxtw]");
3442 
3443   // 32-bit gather first-fault load in scalar-plus-vector vform with 32-bit
3444   // scaled offset.
3445   COMPARE(ldff1h(z25.VnS(),
3446                  p3.Zeroing(),
3447                  SVEMemOperand(x17, z15.VnS(), SXTW, 1)),
3448           "ldff1h {z25.s}, p3/z, [x17, z15.s, sxtw #1]");
3449   COMPARE(ldff1w(z5.VnS(),
3450                  p4.Zeroing(),
3451                  SVEMemOperand(x23, z31.VnS(), UXTW, 2)),
3452           "ldff1w {z5.s}, p4/z, [x23, z31.s, uxtw #2]");
3453   COMPARE(ldff1sh(z10.VnS(),
3454                   p0.Zeroing(),
3455                   SVEMemOperand(x19, z15.VnS(), UXTW, 1)),
3456           "ldff1sh {z10.s}, p0/z, [x19, z15.s, uxtw #1]");
3457 
3458   // Load and broadcast data to vector.
3459   COMPARE(ld1rb(z2.VnH(), p0.Zeroing(), SVEMemOperand(x30, 0)),
3460           "ld1rb {z2.h}, p0/z, [x30]");
3461   COMPARE(ld1rb(z14.VnS(), p2.Zeroing(), SVEMemOperand(x11, 63)),
3462           "ld1rb {z14.s}, p2/z, [x11, #63]");
3463   COMPARE(ld1rb(z27.VnD(), p1.Zeroing(), SVEMemOperand(x29, 2)),
3464           "ld1rb {z27.d}, p1/z, [x29, #2]");
3465   COMPARE(ld1rb(z0.VnB(), p3.Zeroing(), SVEMemOperand(sp, 59)),
3466           "ld1rb {z0.b}, p3/z, [sp, #59]");
3467   COMPARE(ld1rh(z19.VnH(), p5.Zeroing(), SVEMemOperand(x1, 0)),
3468           "ld1rh {z19.h}, p5/z, [x1]");
3469   COMPARE(ld1rh(z4.VnS(), p7.Zeroing(), SVEMemOperand(x29, 126)),
3470           "ld1rh {z4.s}, p7/z, [x29, #126]");
3471   COMPARE(ld1rh(z24.VnD(), p0.Zeroing(), SVEMemOperand(sp, 78)),
3472           "ld1rh {z24.d}, p0/z, [sp, #78]");
3473   COMPARE(ld1rw(z19.VnS(), p5.Zeroing(), SVEMemOperand(x4, 252)),
3474           "ld1rw {z19.s}, p5/z, [x4, #252]");
3475   COMPARE(ld1rw(z13.VnD(), p3.Zeroing(), SVEMemOperand(x2, 100)),
3476           "ld1rw {z13.d}, p3/z, [x2, #100]");
3477   COMPARE(ld1rd(z19.VnD(), p7.Zeroing(), SVEMemOperand(x14, 504)),
3478           "ld1rd {z19.d}, p7/z, [x14, #504]");
3479   COMPARE(ld1rsb(z16.VnH(), p1.Zeroing(), SVEMemOperand(x29, 0)),
3480           "ld1rsb {z16.h}, p1/z, [x29]");
3481   COMPARE(ld1rsb(z8.VnS(), p6.Zeroing(), SVEMemOperand(sp, 33)),
3482           "ld1rsb {z8.s}, p6/z, [sp, #33]");
3483   COMPARE(ld1rsb(z25.VnD(), p2.Zeroing(), SVEMemOperand(x18, 63)),
3484           "ld1rsb {z25.d}, p2/z, [x18, #63]");
3485   COMPARE(ld1rsh(z11.VnS(), p5.Zeroing(), SVEMemOperand(x14, 2)),
3486           "ld1rsh {z11.s}, p5/z, [x14, #2]");
3487   COMPARE(ld1rsh(z28.VnD(), p1.Zeroing(), SVEMemOperand(x19, 124)),
3488           "ld1rsh {z28.d}, p1/z, [x19, #124]");
3489   COMPARE(ld1rsw(z23.VnD(), p4.Zeroing(), SVEMemOperand(x10, 8)),
3490           "ld1rsw {z23.d}, p4/z, [x10, #8]");
3491 
3492   CLEANUP();
3493 }
3494 
TEST(sve_mem_32bit_gather_and_unsized_contiguous_macro)3495 TEST(sve_mem_32bit_gather_and_unsized_contiguous_macro) {
3496   SETUP();
3497 
3498   COMPARE_MACRO(Ld1rb(z2.VnB(), p0.Zeroing(), SVEMemOperand(x30, 100)),
3499                 "add x16, x30, #0x64 (100)\n"
3500                 "ld1rb {z2.b}, p0/z, [x16]");
3501   COMPARE_MACRO(Ld1rh(z4.VnH(), p1.Zeroing(), SVEMemOperand(x21, 201)),
3502                 "add x16, x21, #0xc9 (201)\n"
3503                 "ld1rh {z4.h}, p1/z, [x16]");
3504   COMPARE_MACRO(Ld1rw(z6.VnS(), p2.Zeroing(), SVEMemOperand(x14, 512)),
3505                 "add x16, x14, #0x200 (512)\n"
3506                 "ld1rw {z6.s}, p2/z, [x16]");
3507   COMPARE_MACRO(Ld1rd(z8.VnD(), p3.Zeroing(), SVEMemOperand(x3, 1024)),
3508                 "add x16, x3, #0x400 (1024)\n"
3509                 "ld1rd {z8.d}, p3/z, [x16]");
3510   COMPARE_MACRO(Ld1rsb(z10.VnH(), p4.Zeroing(), SVEMemOperand(sp, -100)),
3511                 "sub x16, sp, #0x64 (100)\n"
3512                 "ld1rsb {z10.h}, p4/z, [x16]");
3513   COMPARE_MACRO(Ld1rsh(z12.VnS(), p5.Zeroing(), SVEMemOperand(x30, -255)),
3514                 "sub x16, x30, #0xff (255)\n"
3515                 "ld1rsh {z12.s}, p5/z, [x16]");
3516   COMPARE_MACRO(Ld1rsw(z14.VnD(), p6.Zeroing(), SVEMemOperand(x1, -1024)),
3517                 "sub x16, x1, #0x400 (1024)\n"
3518                 "ld1rsw {z14.d}, p6/z, [x16]");
3519 }
3520 
TEST(sve_mem_64bit_gather_vector_plus_immediate)3521 TEST(sve_mem_64bit_gather_vector_plus_immediate) {
3522   SETUP();
3523 
3524   COMPARE(ld1b(z2.VnD(), p2.Zeroing(), SVEMemOperand(z12.VnD(), 31)),
3525           "ld1b {z2.d}, p2/z, [z12.d, #31]");
3526   COMPARE(ld1h(z30.VnD(), p7.Zeroing(), SVEMemOperand(z28.VnD(), 10)),
3527           "ld1h {z30.d}, p7/z, [z28.d, #10]");
3528   COMPARE(ld1w(z10.VnD(), p5.Zeroing(), SVEMemOperand(z4.VnD(), 124)),
3529           "ld1w {z10.d}, p5/z, [z4.d, #124]");
3530   COMPARE(ld1d(z13.VnD(), p3.Zeroing(), SVEMemOperand(z19.VnD(), 248)),
3531           "ld1d {z13.d}, p3/z, [z19.d, #248]");
3532   COMPARE(ld1sb(z16.VnD(), p7.Zeroing(), SVEMemOperand(z31.VnD())),
3533           "ld1sb {z16.d}, p7/z, [z31.d]");
3534   COMPARE(ld1sh(z20.VnD(), p2.Zeroing(), SVEMemOperand(z2.VnD(), 62)),
3535           "ld1sh {z20.d}, p2/z, [z2.d, #62]");
3536   COMPARE(ld1sw(z2.VnD(), p7.Zeroing(), SVEMemOperand(z25.VnD())),
3537           "ld1sw {z2.d}, p7/z, [z25.d]");
3538   COMPARE(ldff1b(z24.VnD(), p5.Zeroing(), SVEMemOperand(z8.VnD(), 0)),
3539           "ldff1b {z24.d}, p5/z, [z8.d]");
3540   COMPARE(ldff1h(z9.VnD(), p3.Zeroing(), SVEMemOperand(z19.VnD())),
3541           "ldff1h {z9.d}, p3/z, [z19.d]");
3542   COMPARE(ldff1w(z26.VnD(), p6.Zeroing(), SVEMemOperand(z15.VnD(), 4)),
3543           "ldff1w {z26.d}, p6/z, [z15.d, #4]");
3544   COMPARE(ldff1d(z19.VnD(), p1.Zeroing(), SVEMemOperand(z14.VnD())),
3545           "ldff1d {z19.d}, p1/z, [z14.d]");
3546   COMPARE(ldff1sb(z26.VnD(), p5.Zeroing(), SVEMemOperand(z14.VnD(), 21)),
3547           "ldff1sb {z26.d}, p5/z, [z14.d, #21]");
3548   COMPARE(ldff1sh(z6.VnD(), p3.Zeroing(), SVEMemOperand(z19.VnD(), 42)),
3549           "ldff1sh {z6.d}, p3/z, [z19.d, #42]");
3550   COMPARE(ldff1sw(z19.VnD(), p7.Zeroing(), SVEMemOperand(z14.VnD(), 84)),
3551           "ldff1sw {z19.d}, p7/z, [z14.d, #84]");
3552 
3553   CLEANUP();
3554 }
3555 
TEST(sve_mem_64bit_gather_vector_plus_immediate_macro)3556 TEST(sve_mem_64bit_gather_vector_plus_immediate_macro) {
3557   SETUP();
3558 
3559   // Simple cases.
3560   COMPARE_MACRO(Ld1b(z18.VnD(), p6.Zeroing(), SVEMemOperand(z31.VnD(), 31)),
3561                 "ld1b {z18.d}, p6/z, [z31.d, #31]");
3562   COMPARE_MACRO(Ld1h(z5.VnD(), p3.Zeroing(), SVEMemOperand(z18.VnD(), 10)),
3563                 "ld1h {z5.d}, p3/z, [z18.d, #10]");
3564   COMPARE_MACRO(Ld1w(z0.VnD(), p6.Zeroing(), SVEMemOperand(z22.VnD(), 124)),
3565                 "ld1w {z0.d}, p6/z, [z22.d, #124]");
3566   COMPARE_MACRO(Ld1d(z18.VnD(), p3.Zeroing(), SVEMemOperand(z19.VnD(), 248)),
3567                 "ld1d {z18.d}, p3/z, [z19.d, #248]");
3568   COMPARE_MACRO(Ld1sb(z18.VnD(), p6.Zeroing(), SVEMemOperand(z17.VnD())),
3569                 "ld1sb {z18.d}, p6/z, [z17.d]");
3570   COMPARE_MACRO(Ld1sh(z14.VnD(), p3.Zeroing(), SVEMemOperand(z11.VnD(), 62)),
3571                 "ld1sh {z14.d}, p3/z, [z11.d, #62]");
3572   COMPARE_MACRO(Ld1sw(z18.VnD(), p5.Zeroing(), SVEMemOperand(z14.VnD())),
3573                 "ld1sw {z18.d}, p5/z, [z14.d]");
3574   COMPARE_MACRO(Ldff1b(z20.VnD(), p5.Zeroing(), SVEMemOperand(z17.VnD(), 0)),
3575                 "ldff1b {z20.d}, p5/z, [z17.d]");
3576   COMPARE_MACRO(Ldff1h(z20.VnD(), p5.Zeroing(), SVEMemOperand(z16.VnD())),
3577                 "ldff1h {z20.d}, p5/z, [z16.d]");
3578   COMPARE_MACRO(Ldff1w(z1.VnD(), p6.Zeroing(), SVEMemOperand(z16.VnD(), 4)),
3579                 "ldff1w {z1.d}, p6/z, [z16.d, #4]");
3580   COMPARE_MACRO(Ldff1d(z16.VnD(), p1.Zeroing(), SVEMemOperand(z3.VnD())),
3581                 "ldff1d {z16.d}, p1/z, [z3.d]");
3582   COMPARE_MACRO(Ldff1sb(z26.VnD(), p7.Zeroing(), SVEMemOperand(z3.VnD(), 21)),
3583                 "ldff1sb {z26.d}, p7/z, [z3.d, #21]");
3584   COMPARE_MACRO(Ldff1sh(z1.VnD(), p7.Zeroing(), SVEMemOperand(z9.VnD(), 42)),
3585                 "ldff1sh {z1.d}, p7/z, [z9.d, #42]");
3586   COMPARE_MACRO(Ldff1sw(z19.VnD(), p4.Zeroing(), SVEMemOperand(z3.VnD(), 84)),
3587                 "ldff1sw {z19.d}, p4/z, [z3.d, #84]");
3588 
3589   // Unencodable cases use a scalar-plus-vector form.
3590   COMPARE_MACRO(Ld1b(z23.VnD(), p6.Zeroing(), SVEMemOperand(z16.VnD(), 32)),
3591                 "mov x16, #0x20\n"
3592                 "ld1b {z23.d}, p6/z, [x16, z16.d]");
3593   COMPARE_MACRO(Ld1h(z10.VnD(), p6.Zeroing(), SVEMemOperand(z11.VnD(), -2)),
3594                 "mov x16, #0xfffffffffffffffe\n"
3595                 "ld1h {z10.d}, p6/z, [x16, z11.d]");
3596   COMPARE_MACRO(Ld1w(z14.VnD(), p3.Zeroing(), SVEMemOperand(z11.VnD(), 42)),
3597                 "mov x16, #0x2a\n"
3598                 "ld1w {z14.d}, p3/z, [x16, z11.d]");
3599   COMPARE_MACRO(Ld1d(z10.VnD(), p4.Zeroing(), SVEMemOperand(z3.VnD(), 256)),
3600                 "mov x16, #0x100\n"
3601                 "ld1d {z10.d}, p4/z, [x16, z3.d]");
3602   COMPARE_MACRO(Ld1sb(z14.VnD(), p2.Zeroing(), SVEMemOperand(z11.VnD(), -1)),
3603                 "mov x16, #0xffffffffffffffff\n"
3604                 "ld1sb {z14.d}, p2/z, [x16, z11.d]");
3605   COMPARE_MACRO(Ld1sh(z20.VnD(), p7.Zeroing(), SVEMemOperand(z12.VnD(), 64)),
3606                 "mov x16, #0x40\n"
3607                 "ld1sh {z20.d}, p7/z, [x16, z12.d]");
3608   COMPARE_MACRO(Ld1sw(z15.VnD(), p6.Zeroing(), SVEMemOperand(z18.VnD(), 42)),
3609                 "mov x16, #0x2a\n"
3610                 "ld1sw {z15.d}, p6/z, [x16, z18.d]");
3611   COMPARE_MACRO(Ldff1b(z15.VnD(), p0.Zeroing(), SVEMemOperand(z0.VnD(), 32)),
3612                 "mov x16, #0x20\n"
3613                 "ldff1b {z15.d}, p0/z, [x16, z0.d]");
3614   COMPARE_MACRO(Ldff1h(z23.VnD(), p3.Zeroing(), SVEMemOperand(z31.VnD(), -2)),
3615                 "mov x16, #0xfffffffffffffffe\n"
3616                 "ldff1h {z23.d}, p3/z, [x16, z31.d]");
3617   COMPARE_MACRO(Ldff1w(z28.VnD(), p3.Zeroing(), SVEMemOperand(z17.VnD(), 42)),
3618                 "mov x16, #0x2a\n"
3619                 "ldff1w {z28.d}, p3/z, [x16, z17.d]");
3620   COMPARE_MACRO(Ldff1d(z18.VnD(), p3.Zeroing(), SVEMemOperand(z13.VnD(), 256)),
3621                 "mov x16, #0x100\n"
3622                 "ldff1d {z18.d}, p3/z, [x16, z13.d]");
3623   COMPARE_MACRO(Ldff1sb(z31.VnD(), p7.Zeroing(), SVEMemOperand(z3.VnD(), -1)),
3624                 "mov x16, #0xffffffffffffffff\n"
3625                 "ldff1sb {z31.d}, p7/z, [x16, z3.d]");
3626   COMPARE_MACRO(Ldff1sh(z13.VnD(), p0.Zeroing(), SVEMemOperand(z15.VnD(), 64)),
3627                 "mov x16, #0x40\n"
3628                 "ldff1sh {z13.d}, p0/z, [x16, z15.d]");
3629   COMPARE_MACRO(Ldff1sw(z30.VnD(), p7.Zeroing(), SVEMemOperand(z10.VnD(), 42)),
3630                 "mov x16, #0x2a\n"
3631                 "ldff1sw {z30.d}, p7/z, [x16, z10.d]");
3632 
3633   CLEANUP();
3634 }
3635 
TEST(sve_mem_64bit_gather_scalar_plus_vector)3636 TEST(sve_mem_64bit_gather_scalar_plus_vector) {
3637   SETUP();
3638 
3639   COMPARE(ld1b(z30.VnD(), p6.Zeroing(), SVEMemOperand(sp, z24.VnD())),
3640           "ld1b {z30.d}, p6/z, [sp, z24.d]");
3641   COMPARE(ld1d(z18.VnD(), p5.Zeroing(), SVEMemOperand(x11, z11.VnD())),
3642           "ld1d {z18.d}, p5/z, [x11, z11.d]");
3643   COMPARE(ld1h(z2.VnD(), p3.Zeroing(), SVEMemOperand(x16, z18.VnD())),
3644           "ld1h {z2.d}, p3/z, [x16, z18.d]");
3645   COMPARE(ld1sb(z11.VnD(), p3.Zeroing(), SVEMemOperand(x24, z21.VnD())),
3646           "ld1sb {z11.d}, p3/z, [x24, z21.d]");
3647   COMPARE(ld1sh(z7.VnD(), p7.Zeroing(), SVEMemOperand(x28, z23.VnD())),
3648           "ld1sh {z7.d}, p7/z, [x28, z23.d]");
3649   COMPARE(ld1sw(z29.VnD(), p7.Zeroing(), SVEMemOperand(x27, z4.VnD())),
3650           "ld1sw {z29.d}, p7/z, [x27, z4.d]");
3651   COMPARE(ld1w(z19.VnD(), p1.Zeroing(), SVEMemOperand(x27, z4.VnD())),
3652           "ld1w {z19.d}, p1/z, [x27, z4.d]");
3653 
3654   COMPARE(ld1d(z20.VnD(), p3.Zeroing(), SVEMemOperand(x3, z15.VnD(), LSL, 3)),
3655           "ld1d {z20.d}, p3/z, [x3, z15.d, lsl #3]");
3656   COMPARE(ld1h(z24.VnD(), p4.Zeroing(), SVEMemOperand(x6, z11.VnD(), LSL, 1)),
3657           "ld1h {z24.d}, p4/z, [x6, z11.d, lsl #1]");
3658   COMPARE(ld1sh(z22.VnD(), p6.Zeroing(), SVEMemOperand(x7, z31.VnD(), LSL, 1)),
3659           "ld1sh {z22.d}, p6/z, [x7, z31.d, lsl #1]");
3660   COMPARE(ld1sw(z9.VnD(), p0.Zeroing(), SVEMemOperand(x2, z27.VnD(), LSL, 2)),
3661           "ld1sw {z9.d}, p0/z, [x2, z27.d, lsl #2]");
3662   COMPARE(ld1w(z9.VnD(), p2.Zeroing(), SVEMemOperand(x0, z0.VnD(), LSL, 2)),
3663           "ld1w {z9.d}, p2/z, [x0, z0.d, lsl #2]");
3664 
3665   COMPARE(ld1b(z19.VnD(), p5.Zeroing(), SVEMemOperand(x21, z29.VnD(), UXTW)),
3666           "ld1b {z19.d}, p5/z, [x21, z29.d, uxtw]");
3667   COMPARE(ld1d(z9.VnD(), p5.Zeroing(), SVEMemOperand(x5, z21.VnD(), SXTW)),
3668           "ld1d {z9.d}, p5/z, [x5, z21.d, sxtw]");
3669   COMPARE(ld1h(z26.VnD(), p3.Zeroing(), SVEMemOperand(x1, z10.VnD(), UXTW)),
3670           "ld1h {z26.d}, p3/z, [x1, z10.d, uxtw]");
3671   COMPARE(ld1sb(z4.VnD(), p1.Zeroing(), SVEMemOperand(x24, z15.VnD(), SXTW)),
3672           "ld1sb {z4.d}, p1/z, [x24, z15.d, sxtw]");
3673   COMPARE(ld1sh(z9.VnD(), p1.Zeroing(), SVEMemOperand(x0, z12.VnD(), UXTW)),
3674           "ld1sh {z9.d}, p1/z, [x0, z12.d, uxtw]");
3675   COMPARE(ld1sw(z19.VnD(), p2.Zeroing(), SVEMemOperand(x19, z16.VnD(), SXTW)),
3676           "ld1sw {z19.d}, p2/z, [x19, z16.d, sxtw]");
3677   COMPARE(ld1w(z13.VnD(), p3.Zeroing(), SVEMemOperand(x8, z10.VnD(), UXTW)),
3678           "ld1w {z13.d}, p3/z, [x8, z10.d, uxtw]");
3679 
3680   COMPARE(ld1d(z25.VnD(), p3.Zeroing(), SVEMemOperand(x14, z0.VnD(), UXTW, 3)),
3681           "ld1d {z25.d}, p3/z, [x14, z0.d, uxtw #3]");
3682   COMPARE(ld1h(z21.VnD(), p5.Zeroing(), SVEMemOperand(x13, z8.VnD(), SXTW, 1)),
3683           "ld1h {z21.d}, p5/z, [x13, z8.d, sxtw #1]");
3684   COMPARE(ld1sh(z29.VnD(), p0.Zeroing(), SVEMemOperand(x9, z10.VnD(), UXTW, 1)),
3685           "ld1sh {z29.d}, p0/z, [x9, z10.d, uxtw #1]");
3686   COMPARE(ld1sw(z5.VnD(), p2.Zeroing(), SVEMemOperand(x1, z23.VnD(), SXTW, 2)),
3687           "ld1sw {z5.d}, p2/z, [x1, z23.d, sxtw #2]");
3688   COMPARE(ld1w(z21.VnD(), p1.Zeroing(), SVEMemOperand(x7, z8.VnD(), UXTW, 2)),
3689           "ld1w {z21.d}, p1/z, [x7, z8.d, uxtw #2]");
3690 
3691   CLEANUP();
3692 }
3693 
TEST(sve_mem_prefetch)3694 TEST(sve_mem_prefetch) {
3695   SETUP();
3696 
3697   // Test every encodable prefetch operation.
3698   const char* expected[] = {" pldl1keep",
3699                             " pldl1strm",
3700                             " pldl2keep",
3701                             " pldl2strm",
3702                             " pldl3keep",
3703                             " pldl3strm",
3704                             " pstl1keep",
3705                             " pstl1strm",
3706                             " pstl2keep",
3707                             " pstl2strm",
3708                             " pstl3keep",
3709                             " pstl3strm"};
3710 
3711   const PrefetchOperation kSVEPrfOperations[] = {PLDL1KEEP,
3712                                                  PLDL1STRM,
3713                                                  PLDL2KEEP,
3714                                                  PLDL2STRM,
3715                                                  PLDL3KEEP,
3716                                                  PLDL3STRM,
3717                                                  PSTL1KEEP,
3718                                                  PSTL1STRM,
3719                                                  PSTL2KEEP,
3720                                                  PSTL2STRM,
3721                                                  PSTL3KEEP,
3722                                                  PSTL3STRM};
3723 
3724   VIXL_STATIC_ASSERT(ArrayLength(expected) == ArrayLength(kSVEPrfOperations));
3725 
3726 
3727 #define VIXL_DISAM_PREFETCH_TEST(INSN, NAME, SH)                               \
3728   do {                                                                         \
3729     for (size_t i = 0; i < ArrayLength(kSVEPrfOperations); i++) {              \
3730       PrefetchOperation op = kSVEPrfOperations[i];                             \
3731       std::string str(NAME);                                                   \
3732       str.append(expected[i]);                                                 \
3733       /* Vector plus immediate */                                              \
3734       COMPARE_PREFIX(INSN(op, p6, SVEMemOperand(z30.VnS(), 31)), str.c_str()); \
3735       COMPARE_PREFIX(INSN(op, p5, SVEMemOperand(z29.VnD(), 17)), str.c_str()); \
3736       /* Scalar plus immediate */                                              \
3737       COMPARE_PREFIX(INSN(op, p4, SVEMemOperand(x11, -32, SVE_MUL_VL)),        \
3738                      str.c_str());                                             \
3739       COMPARE_PREFIX(INSN(op, p4, SVEMemOperand(sp, 31, SVE_MUL_VL)),          \
3740                      str.c_str());                                             \
3741       /* Scalar plus vector */                                                 \
3742       COMPARE_PREFIX(INSN(op, p3, SVEMemOperand(x24, z22.VnS(), UXTW, SH)),    \
3743                      str.c_str());                                             \
3744       COMPARE_PREFIX(INSN(op, p2, SVEMemOperand(x24, z22.VnD(), SXTW, SH)),    \
3745                      str.c_str());                                             \
3746       COMPARE_PREFIX(INSN(op, p1, SVEMemOperand(x4, z2.VnD(), LSL, SH)),       \
3747                      str.c_str());                                             \
3748       /* Scalar plus scalar */                                                 \
3749       COMPARE_PREFIX(INSN(op, p1, SVEMemOperand(x8, x29, LSL, SH)),            \
3750                      str.c_str());                                             \
3751       COMPARE_PREFIX(INSN(op, p0, SVEMemOperand(sp, x6, LSL, SH)),             \
3752                      str.c_str());                                             \
3753     }                                                                          \
3754   } while (0)
3755 
3756   VIXL_DISAM_PREFETCH_TEST(prfh, "prfh", 1);
3757   VIXL_DISAM_PREFETCH_TEST(prfw, "prfw", 2);
3758   VIXL_DISAM_PREFETCH_TEST(prfd, "prfd", 3);
3759 #undef VIXL_DISAM_PREFETCH_TEST
3760 
3761   COMPARE(prfb(PLDL1KEEP, p5, SVEMemOperand(z30.VnS(), 0)),
3762           "prfb pldl1keep, p5, [z30.s]");
3763   COMPARE(prfb(PLDL1STRM, p5, SVEMemOperand(x28, -11, SVE_MUL_VL)),
3764           "prfb pldl1strm, p5, [x28, #-11, mul vl]");
3765   COMPARE(prfb(PLDL2KEEP, p6, SVEMemOperand(x30, x29)),
3766           "prfb pldl2keep, p6, [x30, x29]");
3767   COMPARE(prfb(PLDL2STRM, p6, SVEMemOperand(x7, z12.VnD())),
3768           "prfb pldl2strm, p6, [x7, z12.d]");
3769   COMPARE(prfb(PLDL2STRM, p6, SVEMemOperand(x7, z12.VnS(), UXTW)),
3770           "prfb pldl2strm, p6, [x7, z12.s, uxtw]");
3771   COMPARE(prfd(PLDL3KEEP, p5, SVEMemOperand(z11.VnD(), 9)),
3772           "prfd pldl3keep, p5, [z11.d, #9]");
3773   COMPARE(prfd(PLDL3STRM, p3, SVEMemOperand(x0, 0, SVE_MUL_VL)),
3774           "prfd pldl3strm, p3, [x0]");
3775   COMPARE(prfd(PSTL1KEEP, p7, SVEMemOperand(x5, x5, LSL, 3)),
3776           "prfd pstl1keep, p7, [x5, x5, lsl #3]");
3777   COMPARE(prfd(PSTL1STRM, p1, SVEMemOperand(x19, z18.VnS(), SXTW, 3)),
3778           "prfd pstl1strm, p1, [x19, z18.s, sxtw #3]");
3779   COMPARE(prfh(PSTL2KEEP, p6, SVEMemOperand(z0.VnS(), 31)),
3780           "prfh pstl2keep, p6, [z0.s, #31]");
3781   COMPARE(prfh(PSTL2STRM, p4, SVEMemOperand(x17, -3, SVE_MUL_VL)),
3782           "prfh pstl2strm, p4, [x17, #-3, mul vl]");
3783   COMPARE(prfh(PSTL3KEEP, p3, SVEMemOperand(x0, x0, LSL, 1)),
3784           "prfh pstl3keep, p3, [x0, x0, lsl #1]");
3785   COMPARE(prfh(PSTL3STRM, p4, SVEMemOperand(x20, z0.VnD(), LSL, 1)),
3786           "prfh pstl3strm, p4, [x20, z0.d, lsl #1]");
3787   COMPARE(prfw(PLDL1KEEP, p3, SVEMemOperand(z23.VnD(), 5)),
3788           "prfw pldl1keep, p3, [z23.d, #5]");
3789   COMPARE(prfw(PLDL1STRM, p1, SVEMemOperand(x4, 31, SVE_MUL_VL)),
3790           "prfw pldl1strm, p1, [x4, #31, mul vl]");
3791   COMPARE(prfw(PLDL2KEEP, p2, SVEMemOperand(x22, x22, LSL, 2)),
3792           "prfw pldl2keep, p2, [x22, x22, lsl #2]");
3793   COMPARE(prfw(PLDL2STRM, p1, SVEMemOperand(x2, z6.VnS(), SXTW, 2)),
3794           "prfw pldl2strm, p1, [x2, z6.s, sxtw #2]");
3795 
3796   CLEANUP();
3797 }
3798 
TEST(sve_mem_64bit_ff_gather_scalar_plus_vector)3799 TEST(sve_mem_64bit_ff_gather_scalar_plus_vector) {
3800   SETUP();
3801 
3802   // 64-bit unscaled offset.
3803   COMPARE(ldff1b(z18.VnD(), p6.Zeroing(), SVEMemOperand(x27, z24.VnD())),
3804           "ldff1b {z18.d}, p6/z, [x27, z24.d]");
3805   COMPARE(ldff1h(z28.VnD(), p6.Zeroing(), SVEMemOperand(x1, z30.VnD())),
3806           "ldff1h {z28.d}, p6/z, [x1, z30.d]");
3807   COMPARE(ldff1w(z12.VnD(), p3.Zeroing(), SVEMemOperand(x25, z27.VnD())),
3808           "ldff1w {z12.d}, p3/z, [x25, z27.d]");
3809   COMPARE(ldff1d(z23.VnD(), p5.Zeroing(), SVEMemOperand(x29, z31.VnD())),
3810           "ldff1d {z23.d}, p5/z, [x29, z31.d]");
3811   COMPARE(ldff1sb(z15.VnD(), p5.Zeroing(), SVEMemOperand(x5, z14.VnD())),
3812           "ldff1sb {z15.d}, p5/z, [x5, z14.d]");
3813   COMPARE(ldff1sh(z18.VnD(), p4.Zeroing(), SVEMemOperand(x25, z25.VnD())),
3814           "ldff1sh {z18.d}, p4/z, [x25, z25.d]");
3815   COMPARE(ldff1sw(z12.VnD(), p3.Zeroing(), SVEMemOperand(x25, z27.VnD())),
3816           "ldff1sw {z12.d}, p3/z, [x25, z27.d]");
3817 
3818   // 64-bit scaled offset.
3819   COMPARE(ldff1h(z25.VnD(),
3820                  p3.Zeroing(),
3821                  SVEMemOperand(x17, z15.VnD(), LSL, 1)),
3822           "ldff1h {z25.d}, p3/z, [x17, z15.d, lsl #1]");
3823   COMPARE(ldff1w(z5.VnD(), p4.Zeroing(), SVEMemOperand(x23, z31.VnD(), LSL, 2)),
3824           "ldff1w {z5.d}, p4/z, [x23, z31.d, lsl #2]");
3825   COMPARE(ldff1d(z2.VnD(), p0.Zeroing(), SVEMemOperand(sp, z7.VnD(), LSL, 3)),
3826           "ldff1d {z2.d}, p0/z, [sp, z7.d, lsl #3]");
3827   COMPARE(ldff1sh(z10.VnD(),
3828                   p0.Zeroing(),
3829                   SVEMemOperand(x19, z15.VnD(), LSL, 1)),
3830           "ldff1sh {z10.d}, p0/z, [x19, z15.d, lsl #1]");
3831   COMPARE(ldff1sw(z5.VnD(),
3832                   p4.Zeroing(),
3833                   SVEMemOperand(x23, z31.VnD(), LSL, 2)),
3834           "ldff1sw {z5.d}, p4/z, [x23, z31.d, lsl #2]");
3835 
3836   // 32-bit unpacked unscaled offset
3837   COMPARE(ldff1b(z18.VnD(), p6.Zeroing(), SVEMemOperand(sp, z24.VnD(), UXTW)),
3838           "ldff1b {z18.d}, p6/z, [sp, z24.d, uxtw]");
3839   COMPARE(ldff1h(z20.VnD(), p5.Zeroing(), SVEMemOperand(x7, z14.VnD(), SXTW)),
3840           "ldff1h {z20.d}, p5/z, [x7, z14.d, sxtw]");
3841   COMPARE(ldff1w(z22.VnD(), p4.Zeroing(), SVEMemOperand(x17, z4.VnD(), UXTW)),
3842           "ldff1w {z22.d}, p4/z, [x17, z4.d, uxtw]");
3843   COMPARE(ldff1d(z24.VnD(), p3.Zeroing(), SVEMemOperand(x3, z24.VnD(), SXTW)),
3844           "ldff1d {z24.d}, p3/z, [x3, z24.d, sxtw]");
3845   COMPARE(ldff1sb(z26.VnD(), p2.Zeroing(), SVEMemOperand(x13, z14.VnD(), UXTW)),
3846           "ldff1sb {z26.d}, p2/z, [x13, z14.d, uxtw]");
3847   COMPARE(ldff1sh(z28.VnD(), p1.Zeroing(), SVEMemOperand(x23, z4.VnD(), SXTW)),
3848           "ldff1sh {z28.d}, p1/z, [x23, z4.d, sxtw]");
3849   COMPARE(ldff1sw(z30.VnD(), p0.Zeroing(), SVEMemOperand(x8, z24.VnD(), UXTW)),
3850           "ldff1sw {z30.d}, p0/z, [x8, z24.d, uxtw]");
3851 
3852   // 32-bit unpacked scaled offset
3853   COMPARE(ldff1h(z4.VnD(), p5.Zeroing(), SVEMemOperand(x7, z1.VnD(), SXTW, 1)),
3854           "ldff1h {z4.d}, p5/z, [x7, z1.d, sxtw #1]");
3855   COMPARE(ldff1w(z5.VnD(),
3856                  p4.Zeroing(),
3857                  SVEMemOperand(x17, z11.VnD(), UXTW, 2)),
3858           "ldff1w {z5.d}, p4/z, [x17, z11.d, uxtw #2]");
3859   COMPARE(ldff1d(z6.VnD(), p3.Zeroing(), SVEMemOperand(x3, z31.VnD(), SXTW, 3)),
3860           "ldff1d {z6.d}, p3/z, [x3, z31.d, sxtw #3]");
3861   COMPARE(ldff1sh(z7.VnD(),
3862                   p1.Zeroing(),
3863                   SVEMemOperand(x23, z7.VnD(), UXTW, 1)),
3864           "ldff1sh {z7.d}, p1/z, [x23, z7.d, uxtw #1]");
3865   COMPARE(ldff1sw(z8.VnD(),
3866                   p0.Zeroing(),
3867                   SVEMemOperand(x8, z17.VnD(), SXTW, 2)),
3868           "ldff1sw {z8.d}, p0/z, [x8, z17.d, sxtw #2]");
3869 
3870   CLEANUP();
3871 }
3872 
TEST(sve_ld2_scalar_plus_immediate)3873 TEST(sve_ld2_scalar_plus_immediate) {
3874   SETUP();
3875 
3876   COMPARE(ld2b(z31.VnB(), z0.VnB(), p6.Zeroing(), SVEMemOperand(x19)),
3877           "ld2b {z31.b, z0.b}, p6/z, [x19]");
3878   COMPARE(ld2b(z31.VnB(),
3879                z0.VnB(),
3880                p6.Zeroing(),
3881                SVEMemOperand(x19, 14, SVE_MUL_VL)),
3882           "ld2b {z31.b, z0.b}, p6/z, [x19, #14, mul vl]");
3883   COMPARE(ld2b(z15.VnB(),
3884                z16.VnB(),
3885                p6.Zeroing(),
3886                SVEMemOperand(x19, -16, SVE_MUL_VL)),
3887           "ld2b {z15.b, z16.b}, p6/z, [x19, #-16, mul vl]");
3888 
3889   COMPARE(ld2h(z15.VnH(), z16.VnH(), p6.Zeroing(), SVEMemOperand(x19)),
3890           "ld2h {z15.h, z16.h}, p6/z, [x19]");
3891   COMPARE(ld2h(z15.VnH(),
3892                z16.VnH(),
3893                p0.Zeroing(),
3894                SVEMemOperand(x19, 14, SVE_MUL_VL)),
3895           "ld2h {z15.h, z16.h}, p0/z, [x19, #14, mul vl]");
3896   COMPARE(ld2h(z15.VnH(),
3897                z16.VnH(),
3898                p0.Zeroing(),
3899                SVEMemOperand(x19, -16, SVE_MUL_VL)),
3900           "ld2h {z15.h, z16.h}, p0/z, [x19, #-16, mul vl]");
3901 
3902   COMPARE(ld2w(z0.VnS(), z1.VnS(), p0.Zeroing(), SVEMemOperand(x19)),
3903           "ld2w {z0.s, z1.s}, p0/z, [x19]");
3904   COMPARE(ld2w(z0.VnS(),
3905                z1.VnS(),
3906                p0.Zeroing(),
3907                SVEMemOperand(x19, 14, SVE_MUL_VL)),
3908           "ld2w {z0.s, z1.s}, p0/z, [x19, #14, mul vl]");
3909   COMPARE(ld2w(z0.VnS(),
3910                z1.VnS(),
3911                p7.Zeroing(),
3912                SVEMemOperand(x19, -16, SVE_MUL_VL)),
3913           "ld2w {z0.s, z1.s}, p7/z, [x19, #-16, mul vl]");
3914 
3915   COMPARE(ld2d(z0.VnD(), z1.VnD(), p7.Zeroing(), SVEMemOperand(x19)),
3916           "ld2d {z0.d, z1.d}, p7/z, [x19]");
3917   COMPARE(ld2d(z31.VnD(),
3918                z0.VnD(),
3919                p7.Zeroing(),
3920                SVEMemOperand(x19, 14, SVE_MUL_VL)),
3921           "ld2d {z31.d, z0.d}, p7/z, [x19, #14, mul vl]");
3922   COMPARE(ld2d(z31.VnD(),
3923                z0.VnD(),
3924                p7.Zeroing(),
3925                SVEMemOperand(x19, -16, SVE_MUL_VL)),
3926           "ld2d {z31.d, z0.d}, p7/z, [x19, #-16, mul vl]");
3927 
3928   CLEANUP();
3929 }
3930 
TEST(sve_ld3_scalar_plus_immediate)3931 TEST(sve_ld3_scalar_plus_immediate) {
3932   SETUP();
3933 
3934   COMPARE(ld3b(z30.VnB(),
3935                z31.VnB(),
3936                z0.VnB(),
3937                p7.Zeroing(),
3938                SVEMemOperand(x19)),
3939           "ld3b {z30.b, z31.b, z0.b}, p7/z, [x19]");
3940   COMPARE(ld3b(z30.VnB(),
3941                z31.VnB(),
3942                z0.VnB(),
3943                p6.Zeroing(),
3944                SVEMemOperand(x19, 21, SVE_MUL_VL)),
3945           "ld3b {z30.b, z31.b, z0.b}, p6/z, [x19, #21, mul vl]");
3946   COMPARE(ld3b(z30.VnB(),
3947                z31.VnB(),
3948                z0.VnB(),
3949                p6.Zeroing(),
3950                SVEMemOperand(x19, -24, SVE_MUL_VL)),
3951           "ld3b {z30.b, z31.b, z0.b}, p6/z, [x19, #-24, mul vl]");
3952 
3953   COMPARE(ld3h(z15.VnH(),
3954                z16.VnH(),
3955                z17.VnH(),
3956                p6.Zeroing(),
3957                SVEMemOperand(x19)),
3958           "ld3h {z15.h, z16.h, z17.h}, p6/z, [x19]");
3959   COMPARE(ld3h(z15.VnH(),
3960                z16.VnH(),
3961                z17.VnH(),
3962                p6.Zeroing(),
3963                SVEMemOperand(x19, 21, SVE_MUL_VL)),
3964           "ld3h {z15.h, z16.h, z17.h}, p6/z, [x19, #21, mul vl]");
3965   COMPARE(ld3h(z15.VnH(),
3966                z16.VnH(),
3967                z17.VnH(),
3968                p0.Zeroing(),
3969                SVEMemOperand(x19, -24, SVE_MUL_VL)),
3970           "ld3h {z15.h, z16.h, z17.h}, p0/z, [x19, #-24, mul vl]");
3971 
3972   COMPARE(ld3w(z15.VnS(),
3973                z16.VnS(),
3974                z17.VnS(),
3975                p0.Zeroing(),
3976                SVEMemOperand(x19)),
3977           "ld3w {z15.s, z16.s, z17.s}, p0/z, [x19]");
3978   COMPARE(ld3w(z0.VnS(),
3979                z1.VnS(),
3980                z2.VnS(),
3981                p0.Zeroing(),
3982                SVEMemOperand(x19, 21, SVE_MUL_VL)),
3983           "ld3w {z0.s, z1.s, z2.s}, p0/z, [x19, #21, mul vl]");
3984   COMPARE(ld3w(z0.VnS(),
3985                z1.VnS(),
3986                z2.VnS(),
3987                p0.Zeroing(),
3988                SVEMemOperand(x19, -24, SVE_MUL_VL)),
3989           "ld3w {z0.s, z1.s, z2.s}, p0/z, [x19, #-24, mul vl]");
3990 
3991   COMPARE(ld3d(z0.VnD(), z1.VnD(), z2.VnD(), p7.Zeroing(), SVEMemOperand(x19)),
3992           "ld3d {z0.d, z1.d, z2.d}, p7/z, [x19]");
3993   COMPARE(ld3d(z0.VnD(),
3994                z1.VnD(),
3995                z2.VnD(),
3996                p7.Zeroing(),
3997                SVEMemOperand(x19, 21, SVE_MUL_VL)),
3998           "ld3d {z0.d, z1.d, z2.d}, p7/z, [x19, #21, mul vl]");
3999   COMPARE(ld3d(z30.VnD(),
4000                z31.VnD(),
4001                z0.VnD(),
4002                p7.Zeroing(),
4003                SVEMemOperand(x19, -24, SVE_MUL_VL)),
4004           "ld3d {z30.d, z31.d, z0.d}, p7/z, [x19, #-24, mul vl]");
4005 
4006   CLEANUP();
4007 }
4008 
TEST(sve_ld4_scalar_plus_immediate)4009 TEST(sve_ld4_scalar_plus_immediate) {
4010   SETUP();
4011 
4012   COMPARE(ld4b(z31.VnB(),
4013                z0.VnB(),
4014                z1.VnB(),
4015                z2.VnB(),
4016                p7.Zeroing(),
4017                SVEMemOperand(x19)),
4018           "ld4b {z31.b, z0.b, z1.b, z2.b}, p7/z, [x19]");
4019   COMPARE(ld4b(z31.VnB(),
4020                z0.VnB(),
4021                z1.VnB(),
4022                z2.VnB(),
4023                p7.Zeroing(),
4024                SVEMemOperand(x19, 28, SVE_MUL_VL)),
4025           "ld4b {z31.b, z0.b, z1.b, z2.b}, p7/z, [x19, #28, mul vl]");
4026   COMPARE(ld4b(z31.VnB(),
4027                z0.VnB(),
4028                z1.VnB(),
4029                z2.VnB(),
4030                p6.Zeroing(),
4031                SVEMemOperand(x19, -32, SVE_MUL_VL)),
4032           "ld4b {z31.b, z0.b, z1.b, z2.b}, p6/z, [x19, #-32, mul vl]");
4033 
4034   COMPARE(ld4h(z31.VnH(),
4035                z0.VnH(),
4036                z1.VnH(),
4037                z2.VnH(),
4038                p6.Zeroing(),
4039                SVEMemOperand(x19)),
4040           "ld4h {z31.h, z0.h, z1.h, z2.h}, p6/z, [x19]");
4041   COMPARE(ld4h(z15.VnH(),
4042                z16.VnH(),
4043                z17.VnH(),
4044                z18.VnH(),
4045                p6.Zeroing(),
4046                SVEMemOperand(x19, 28, SVE_MUL_VL)),
4047           "ld4h {z15.h, z16.h, z17.h, z18.h}, p6/z, "
4048           "[x19, #28, mul vl]");
4049   COMPARE(ld4h(z15.VnH(),
4050                z16.VnH(),
4051                z17.VnH(),
4052                z18.VnH(),
4053                p6.Zeroing(),
4054                SVEMemOperand(x19, -32, SVE_MUL_VL)),
4055           "ld4h {z15.h, z16.h, z17.h, z18.h}, p6/z, "
4056           "[x19, #-32, mul vl]");
4057 
4058   COMPARE(ld4w(z15.VnS(),
4059                z16.VnS(),
4060                z17.VnS(),
4061                z18.VnS(),
4062                p0.Zeroing(),
4063                SVEMemOperand(x19)),
4064           "ld4w {z15.s, z16.s, z17.s, z18.s}, p0/z, [x19]");
4065   COMPARE(ld4w(z15.VnS(),
4066                z16.VnS(),
4067                z17.VnS(),
4068                z18.VnS(),
4069                p0.Zeroing(),
4070                SVEMemOperand(x19, 28, SVE_MUL_VL)),
4071           "ld4w {z15.s, z16.s, z17.s, z18.s}, p0/z, "
4072           "[x19, #28, mul vl]");
4073   COMPARE(ld4w(z0.VnS(),
4074                z1.VnS(),
4075                z2.VnS(),
4076                z3.VnS(),
4077                p0.Zeroing(),
4078                SVEMemOperand(x19, -32, SVE_MUL_VL)),
4079           "ld4w {z0.s, z1.s, z2.s, z3.s}, p0/z, [x19, #-32, mul vl]");
4080 
4081   COMPARE(ld4d(z0.VnD(),
4082                z1.VnD(),
4083                z2.VnD(),
4084                z3.VnD(),
4085                p0.Zeroing(),
4086                SVEMemOperand(x19)),
4087           "ld4d {z0.d, z1.d, z2.d, z3.d}, p0/z, [x19]");
4088   COMPARE(ld4d(z0.VnD(),
4089                z1.VnD(),
4090                z2.VnD(),
4091                z3.VnD(),
4092                p7.Zeroing(),
4093                SVEMemOperand(x19, 28, SVE_MUL_VL)),
4094           "ld4d {z0.d, z1.d, z2.d, z3.d}, p7/z, [x19, #28, mul vl]");
4095   COMPARE(ld4d(z0.VnD(),
4096                z1.VnD(),
4097                z2.VnD(),
4098                z3.VnD(),
4099                p7.Zeroing(),
4100                SVEMemOperand(x19, -32, SVE_MUL_VL)),
4101           "ld4d {z0.d, z1.d, z2.d, z3.d}, p7/z, [x19, #-32, mul vl]");
4102 
4103   CLEANUP();
4104 }
4105 
TEST(sve_ld2_scalar_plus_scalar)4106 TEST(sve_ld2_scalar_plus_scalar) {
4107   SETUP();
4108 
4109   COMPARE(ld2b(z25.VnB(), z26.VnB(), p1.Zeroing(), SVEMemOperand(x20, x19)),
4110           "ld2b {z25.b, z26.b}, p1/z, [x20, x19]");
4111   COMPARE(ld2b(z25.VnB(), z26.VnB(), p1.Zeroing(), SVEMemOperand(sp, x19)),
4112           "ld2b {z25.b, z26.b}, p1/z, [sp, x19]");
4113   COMPARE(ld2b(z31.VnB(), z0.VnB(), p1.Zeroing(), SVEMemOperand(sp, x19)),
4114           "ld2b {z31.b, z0.b}, p1/z, [sp, x19]");
4115 
4116   COMPARE(ld2h(z31.VnH(),
4117                z0.VnH(),
4118                p1.Zeroing(),
4119                SVEMemOperand(x20, x19, LSL, 1)),
4120           "ld2h {z31.h, z0.h}, p1/z, [x20, x19, lsl #1]");
4121   COMPARE(ld2h(z31.VnH(),
4122                z0.VnH(),
4123                p7.Zeroing(),
4124                SVEMemOperand(sp, x19, LSL, 1)),
4125           "ld2h {z31.h, z0.h}, p7/z, [sp, x19, lsl #1]");
4126   COMPARE(ld2h(z31.VnH(),
4127                z0.VnH(),
4128                p7.Zeroing(),
4129                SVEMemOperand(sp, x19, LSL, 1)),
4130           "ld2h {z31.h, z0.h}, p7/z, [sp, x19, lsl #1]");
4131 
4132   COMPARE(ld2w(z16.VnS(),
4133                z17.VnS(),
4134                p7.Zeroing(),
4135                SVEMemOperand(x20, x19, LSL, 2)),
4136           "ld2w {z16.s, z17.s}, p7/z, [x20, x19, lsl #2]");
4137   COMPARE(ld2w(z16.VnS(),
4138                z17.VnS(),
4139                p7.Zeroing(),
4140                SVEMemOperand(sp, x19, LSL, 2)),
4141           "ld2w {z16.s, z17.s}, p7/z, [sp, x19, lsl #2]");
4142   COMPARE(ld2w(z16.VnS(),
4143                z17.VnS(),
4144                p0.Zeroing(),
4145                SVEMemOperand(sp, x19, LSL, 2)),
4146           "ld2w {z16.s, z17.s}, p0/z, [sp, x19, lsl #2]");
4147 
4148   COMPARE(ld2d(z16.VnD(),
4149                z17.VnD(),
4150                p0.Zeroing(),
4151                SVEMemOperand(x20, x19, LSL, 3)),
4152           "ld2d {z16.d, z17.d}, p0/z, [x20, x19, lsl #3]");
4153   COMPARE(ld2d(z25.VnD(),
4154                z26.VnD(),
4155                p0.Zeroing(),
4156                SVEMemOperand(sp, x19, LSL, 3)),
4157           "ld2d {z25.d, z26.d}, p0/z, [sp, x19, lsl #3]");
4158   COMPARE(ld2d(z25.VnD(),
4159                z26.VnD(),
4160                p0.Zeroing(),
4161                SVEMemOperand(sp, x19, LSL, 3)),
4162           "ld2d {z25.d, z26.d}, p0/z, [sp, x19, lsl #3]");
4163 
4164   CLEANUP();
4165 }
4166 
TEST(sve_ld3_scalar_plus_scalar)4167 TEST(sve_ld3_scalar_plus_scalar) {
4168   SETUP();
4169 
4170   COMPARE(ld3b(z25.VnB(),
4171                z26.VnB(),
4172                z27.VnB(),
4173                p1.Zeroing(),
4174                SVEMemOperand(x20, x19)),
4175           "ld3b {z25.b, z26.b, z27.b}, p1/z, [x20, x19]");
4176   COMPARE(ld3b(z25.VnB(),
4177                z26.VnB(),
4178                z27.VnB(),
4179                p1.Zeroing(),
4180                SVEMemOperand(sp, x19)),
4181           "ld3b {z25.b, z26.b, z27.b}, p1/z, [sp, x19]");
4182   COMPARE(ld3b(z30.VnB(),
4183                z31.VnB(),
4184                z0.VnB(),
4185                p1.Zeroing(),
4186                SVEMemOperand(sp, x19)),
4187           "ld3b {z30.b, z31.b, z0.b}, p1/z, [sp, x19]");
4188 
4189   COMPARE(ld3h(z30.VnH(),
4190                z31.VnH(),
4191                z0.VnH(),
4192                p1.Zeroing(),
4193                SVEMemOperand(x20, x19, LSL, 1)),
4194           "ld3h {z30.h, z31.h, z0.h}, p1/z, [x20, x19, lsl #1]");
4195   COMPARE(ld3h(z30.VnH(),
4196                z31.VnH(),
4197                z0.VnH(),
4198                p7.Zeroing(),
4199                SVEMemOperand(sp, x19, LSL, 1)),
4200           "ld3h {z30.h, z31.h, z0.h}, p7/z, [sp, x19, lsl #1]");
4201   COMPARE(ld3h(z30.VnH(),
4202                z31.VnH(),
4203                z0.VnH(),
4204                p7.Zeroing(),
4205                SVEMemOperand(sp, x19, LSL, 1)),
4206           "ld3h {z30.h, z31.h, z0.h}, p7/z, [sp, x19, lsl #1]");
4207 
4208   COMPARE(ld3w(z16.VnS(),
4209                z17.VnS(),
4210                z18.VnS(),
4211                p7.Zeroing(),
4212                SVEMemOperand(x20, x19, LSL, 2)),
4213           "ld3w {z16.s, z17.s, z18.s}, p7/z, [x20, x19, lsl #2]");
4214   COMPARE(ld3w(z16.VnS(),
4215                z17.VnS(),
4216                z18.VnS(),
4217                p7.Zeroing(),
4218                SVEMemOperand(sp, x19, LSL, 2)),
4219           "ld3w {z16.s, z17.s, z18.s}, p7/z, [sp, x19, lsl #2]");
4220   COMPARE(ld3w(z16.VnS(),
4221                z17.VnS(),
4222                z18.VnS(),
4223                p0.Zeroing(),
4224                SVEMemOperand(sp, x19, LSL, 2)),
4225           "ld3w {z16.s, z17.s, z18.s}, p0/z, [sp, x19, lsl #2]");
4226 
4227   COMPARE(ld3d(z16.VnD(),
4228                z17.VnD(),
4229                z18.VnD(),
4230                p0.Zeroing(),
4231                SVEMemOperand(x20, x19, LSL, 3)),
4232           "ld3d {z16.d, z17.d, z18.d}, p0/z, [x20, x19, lsl #3]");
4233   COMPARE(ld3d(z25.VnD(),
4234                z26.VnD(),
4235                z27.VnD(),
4236                p0.Zeroing(),
4237                SVEMemOperand(sp, x19, LSL, 3)),
4238           "ld3d {z25.d, z26.d, z27.d}, p0/z, [sp, x19, lsl #3]");
4239   COMPARE(ld3d(z25.VnD(),
4240                z26.VnD(),
4241                z27.VnD(),
4242                p0.Zeroing(),
4243                SVEMemOperand(sp, x19, LSL, 3)),
4244           "ld3d {z25.d, z26.d, z27.d}, p0/z, [sp, x19, lsl #3]");
4245 
4246   CLEANUP();
4247 }
4248 
TEST(sve_ld4_scalar_plus_scalar)4249 TEST(sve_ld4_scalar_plus_scalar) {
4250   SETUP();
4251 
4252   COMPARE(ld4b(z25.VnB(),
4253                z26.VnB(),
4254                z27.VnB(),
4255                z28.VnB(),
4256                p0.Zeroing(),
4257                SVEMemOperand(x20, x19)),
4258           "ld4b {z25.b, z26.b, z27.b, z28.b}, p0/z, [x20, x19]");
4259   COMPARE(ld4b(z25.VnB(),
4260                z26.VnB(),
4261                z27.VnB(),
4262                z28.VnB(),
4263                p1.Zeroing(),
4264                SVEMemOperand(sp, x19)),
4265           "ld4b {z25.b, z26.b, z27.b, z28.b}, p1/z, [sp, x19]");
4266   COMPARE(ld4b(z25.VnB(),
4267                z26.VnB(),
4268                z27.VnB(),
4269                z28.VnB(),
4270                p1.Zeroing(),
4271                SVEMemOperand(sp, x19)),
4272           "ld4b {z25.b, z26.b, z27.b, z28.b}, p1/z, [sp, x19]");
4273 
4274   COMPARE(ld4h(z31.VnH(),
4275                z0.VnH(),
4276                z1.VnH(),
4277                z2.VnH(),
4278                p1.Zeroing(),
4279                SVEMemOperand(x20, x19, LSL, 1)),
4280           "ld4h {z31.h, z0.h, z1.h, z2.h}, p1/z, [x20, x19, lsl #1]");
4281   COMPARE(ld4h(z31.VnH(),
4282                z0.VnH(),
4283                z1.VnH(),
4284                z2.VnH(),
4285                p1.Zeroing(),
4286                SVEMemOperand(sp, x19, LSL, 1)),
4287           "ld4h {z31.h, z0.h, z1.h, z2.h}, p1/z, [sp, x19, lsl #1]");
4288   COMPARE(ld4h(z31.VnH(),
4289                z0.VnH(),
4290                z1.VnH(),
4291                z2.VnH(),
4292                p7.Zeroing(),
4293                SVEMemOperand(sp, x19, LSL, 1)),
4294           "ld4h {z31.h, z0.h, z1.h, z2.h}, p7/z, [sp, x19, lsl #1]");
4295 
4296   COMPARE(ld4w(z31.VnS(),
4297                z0.VnS(),
4298                z1.VnS(),
4299                z2.VnS(),
4300                p7.Zeroing(),
4301                SVEMemOperand(x20, x19, LSL, 2)),
4302           "ld4w {z31.s, z0.s, z1.s, z2.s}, p7/z, [x20, x19, lsl #2]");
4303   COMPARE(ld4w(z16.VnS(),
4304                z17.VnS(),
4305                z18.VnS(),
4306                z19.VnS(),
4307                p7.Zeroing(),
4308                SVEMemOperand(sp, x19, LSL, 2)),
4309           "ld4w {z16.s, z17.s, z18.s, z19.s}, p7/z, "
4310           "[sp, x19, lsl #2]");
4311   COMPARE(ld4w(z16.VnS(),
4312                z17.VnS(),
4313                z18.VnS(),
4314                z19.VnS(),
4315                p7.Zeroing(),
4316                SVEMemOperand(sp, x19, LSL, 2)),
4317           "ld4w {z16.s, z17.s, z18.s, z19.s}, p7/z, "
4318           "[sp, x19, lsl #2]");
4319 
4320   COMPARE(ld4d(z16.VnD(),
4321                z17.VnD(),
4322                z18.VnD(),
4323                z19.VnD(),
4324                p0.Zeroing(),
4325                SVEMemOperand(x20, x19, LSL, 3)),
4326           "ld4d {z16.d, z17.d, z18.d, z19.d}, p0/z, "
4327           "[x20, x19, lsl #3]");
4328   COMPARE(ld4d(z16.VnD(),
4329                z17.VnD(),
4330                z18.VnD(),
4331                z19.VnD(),
4332                p0.Zeroing(),
4333                SVEMemOperand(sp, x19, LSL, 3)),
4334           "ld4d {z16.d, z17.d, z18.d, z19.d}, p0/z, "
4335           "[sp, x19, lsl #3]");
4336   COMPARE(ld4d(z25.VnD(),
4337                z26.VnD(),
4338                z27.VnD(),
4339                z28.VnD(),
4340                p0.Zeroing(),
4341                SVEMemOperand(sp, x19, LSL, 3)),
4342           "ld4d {z25.d, z26.d, z27.d, z28.d}, p0/z, "
4343           "[sp, x19, lsl #3]");
4344 
4345   CLEANUP();
4346 }
4347 
TEST(sve_ff_contiguous)4348 TEST(sve_ff_contiguous) {
4349   SETUP();
4350 
4351   COMPARE(ldff1b(z24.VnB(), p1.Zeroing(), SVEMemOperand(x21)),
4352           "ldff1b {z24.b}, p1/z, [x21]");
4353   COMPARE(ldff1b(z22.VnH(), p5.Zeroing(), SVEMemOperand(x5, x28)),
4354           "ldff1b {z22.h}, p5/z, [x5, x28]");
4355   COMPARE(ldff1b(z2.VnS(), p5.Zeroing(), SVEMemOperand(sp, x11)),
4356           "ldff1b {z2.s}, p5/z, [sp, x11]");
4357   COMPARE(ldff1b(z12.VnD(), p3.Zeroing(), SVEMemOperand(x26, xzr)),
4358           "ldff1b {z12.d}, p3/z, [x26]");
4359   COMPARE(ldff1h(z21.VnH(), p3.Zeroing(), SVEMemOperand(x27)),
4360           "ldff1h {z21.h}, p3/z, [x27]");
4361   COMPARE(ldff1h(z11.VnS(), p6.Zeroing(), SVEMemOperand(sp, x15, LSL, 1)),
4362           "ldff1h {z11.s}, p6/z, [sp, x15, lsl #1]");
4363   COMPARE(ldff1h(z6.VnD(), p7.Zeroing(), SVEMemOperand(x8, xzr, LSL, 1)),
4364           "ldff1h {z6.d}, p7/z, [x8]");
4365   COMPARE(ldff1w(z11.VnS(), p7.Zeroing(), SVEMemOperand(sp)),
4366           "ldff1w {z11.s}, p7/z, [sp]");
4367   COMPARE(ldff1w(z6.VnD(), p6.Zeroing(), SVEMemOperand(x5, x0, LSL, 2)),
4368           "ldff1w {z6.d}, p6/z, [x5, x0, lsl #2]");
4369   COMPARE(ldff1d(z0.VnD(), p3.Zeroing(), SVEMemOperand(x15, x1, LSL, 3)),
4370           "ldff1d {z0.d}, p3/z, [x15, x1, lsl #3]");
4371 
4372   COMPARE(ldff1sb(z31.VnH(), p4.Zeroing(), SVEMemOperand(x10, x25)),
4373           "ldff1sb {z31.h}, p4/z, [x10, x25]");
4374   COMPARE(ldff1sb(z25.VnS(), p7.Zeroing(), SVEMemOperand(sp, x20)),
4375           "ldff1sb {z25.s}, p7/z, [sp, x20]");
4376   COMPARE(ldff1sb(z20.VnD(), p3.Zeroing(), SVEMemOperand(x19, xzr)),
4377           "ldff1sb {z20.d}, p3/z, [x19]");
4378   COMPARE(ldff1sh(z18.VnS(), p3.Zeroing(), SVEMemOperand(sp, x0, LSL, 1)),
4379           "ldff1sh {z18.s}, p3/z, [sp, x0, lsl #1]");
4380   COMPARE(ldff1sh(z30.VnD(), p1.Zeroing(), SVEMemOperand(x28, xzr, LSL, 1)),
4381           "ldff1sh {z30.d}, p1/z, [x28]");
4382   COMPARE(ldff1sw(z3.VnD(), p4.Zeroing(), SVEMemOperand(x22, x18, LSL, 2)),
4383           "ldff1sw {z3.d}, p4/z, [x22, x18, lsl #2]");
4384 
4385   CLEANUP();
4386 }
4387 
TEST(sve_mem_contiguous_load)4388 TEST(sve_mem_contiguous_load) {
4389   SETUP();
4390 
4391   COMPARE(ld1rqb(z3.VnB(), p2.Zeroing(), SVEMemOperand(x22, x18)),
4392           "ld1rqb {z3.b}, p2/z, [x22, x18]");
4393   COMPARE(ld1rqd(z6.VnD(), p0.Zeroing(), SVEMemOperand(x18, x9, LSL, 3)),
4394           "ld1rqd {z6.d}, p0/z, [x18, x9, lsl #3]");
4395   COMPARE(ld1rqh(z1.VnH(), p7.Zeroing(), SVEMemOperand(x9, x6, LSL, 1)),
4396           "ld1rqh {z1.h}, p7/z, [x9, x6, lsl #1]");
4397   COMPARE(ld1rqw(z12.VnS(), p4.Zeroing(), SVEMemOperand(sp, xzr, LSL, 2)),
4398           "ld1rqw {z12.s}, p4/z, [sp, xzr, lsl #2]");
4399   COMPARE(ld1rqb(z18.VnB(), p2.Zeroing(), SVEMemOperand(x18, 0)),
4400           "ld1rqb {z18.b}, p2/z, [x18]");
4401   COMPARE(ld1rqb(z18.VnB(), p2.Zeroing(), SVEMemOperand(x18, 16)),
4402           "ld1rqb {z18.b}, p2/z, [x18, #16]");
4403   COMPARE(ld1rqd(z11.VnD(), p1.Zeroing(), SVEMemOperand(x23, -16)),
4404           "ld1rqd {z11.d}, p1/z, [x23, #-16]");
4405   COMPARE(ld1rqh(z11.VnH(), p1.Zeroing(), SVEMemOperand(x0, 112)),
4406           "ld1rqh {z11.h}, p1/z, [x0, #112]");
4407   COMPARE(ld1rqw(z22.VnS(), p3.Zeroing(), SVEMemOperand(sp, -128)),
4408           "ld1rqw {z22.s}, p3/z, [sp, #-128]");
4409 
4410   COMPARE_MACRO(Ld1rqb(z0.VnB(), p0.Zeroing(), SVEMemOperand(x0, x1)),
4411                 "ld1rqb {z0.b}, p0/z, [x0, x1]");
4412   COMPARE_MACRO(Ld1rqh(z0.VnH(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 1)),
4413                 "ld1rqh {z0.h}, p0/z, [x0, x1, lsl #1]");
4414   COMPARE_MACRO(Ld1rqw(z0.VnS(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 2)),
4415                 "ld1rqw {z0.s}, p0/z, [x0, x1, lsl #2]");
4416   COMPARE_MACRO(Ld1rqd(z0.VnD(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 3)),
4417                 "ld1rqd {z0.d}, p0/z, [x0, x1, lsl #3]");
4418   COMPARE_MACRO(Ld1rqh(z11.VnH(), p1.Zeroing(), SVEMemOperand(x0, 112)),
4419                 "ld1rqh {z11.h}, p1/z, [x0, #112]");
4420   COMPARE_MACRO(Ld1rqw(z22.VnS(), p3.Zeroing(), SVEMemOperand(sp, -128)),
4421                 "ld1rqw {z22.s}, p3/z, [sp, #-128]");
4422 
4423   COMPARE_MACRO(Ld1rqb(z0.VnB(), p0.Zeroing(), SVEMemOperand(x0, 2222)),
4424                 "add x16, x0, #0x8ae (2222)\n"
4425                 "ld1rqb {z0.b}, p0/z, [x16]");
4426   COMPARE_MACRO(Ld1rqw(z0.VnS(), p0.Zeroing(), SVEMemOperand(x0, x1)),
4427                 "add x16, x0, x1\n"
4428                 "ld1rqw {z0.s}, p0/z, [x16]");
4429   COMPARE_MACRO(Ld1rqd(z0.VnD(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 1)),
4430                 "add x16, x0, x1, lsl #1\n"
4431                 "ld1rqd {z0.d}, p0/z, [x16]");
4432 
4433   COMPARE(ldnt1b(z21.VnB(), p5.Zeroing(), SVEMemOperand(x1, x23)),
4434           "ldnt1b {z21.b}, p5/z, [x1, x23]");
4435   COMPARE(ldnt1d(z10.VnD(), p0.Zeroing(), SVEMemOperand(x23, x6, LSL, 3)),
4436           "ldnt1d {z10.d}, p0/z, [x23, x6, lsl #3]");
4437   COMPARE(ldnt1h(z30.VnH(), p4.Zeroing(), SVEMemOperand(x6, x11, LSL, 1)),
4438           "ldnt1h {z30.h}, p4/z, [x6, x11, lsl #1]");
4439   COMPARE(ldnt1w(z0.VnS(), p4.Zeroing(), SVEMemOperand(x11, x1, LSL, 2)),
4440           "ldnt1w {z0.s}, p4/z, [x11, x1, lsl #2]");
4441   COMPARE(ldnt1w(z0.VnS(), p4.Zeroing(), SVEMemOperand(sp, xzr, LSL, 2)),
4442           "ldnt1w {z0.s}, p4/z, [sp, xzr, lsl #2]");
4443 
4444   COMPARE_MACRO(Ldnt1b(z0.VnB(), p0.Zeroing(), SVEMemOperand(x0, x1)),
4445                 "ldnt1b {z0.b}, p0/z, [x0, x1]");
4446   COMPARE_MACRO(Ldnt1h(z0.VnH(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 1)),
4447                 "ldnt1h {z0.h}, p0/z, [x0, x1, lsl #1]");
4448   COMPARE_MACRO(Ldnt1w(z0.VnS(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 2)),
4449                 "ldnt1w {z0.s}, p0/z, [x0, x1, lsl #2]");
4450   COMPARE_MACRO(Ldnt1d(z0.VnD(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 3)),
4451                 "ldnt1d {z0.d}, p0/z, [x0, x1, lsl #3]");
4452 
4453   COMPARE_MACRO(Ldnt1w(z0.VnS(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 3)),
4454                 "add x16, x0, x1, lsl #3\n"
4455                 "ldnt1w {z0.s}, p0/z, [x16]");
4456   COMPARE_MACRO(Ldnt1d(z0.VnD(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 4)),
4457                 "add x16, x0, x1, lsl #4\n"
4458                 "ldnt1d {z0.d}, p0/z, [x16]");
4459 
4460   COMPARE(ldnt1b(z1.VnB(), p3.Zeroing(), SVEMemOperand(x11)),
4461           "ldnt1b {z1.b}, p3/z, [x11]");
4462   COMPARE(ldnt1b(z2.VnB(), p2.Zeroing(), SVEMemOperand(x12, -8, SVE_MUL_VL)),
4463           "ldnt1b {z2.b}, p2/z, [x12, #-8, mul vl]");
4464   COMPARE(ldnt1d(z2.VnD(), p7.Zeroing(), SVEMemOperand(x13, -2, SVE_MUL_VL)),
4465           "ldnt1d {z2.d}, p7/z, [x13, #-2, mul vl]");
4466   COMPARE(ldnt1h(z26.VnH(), p4.Zeroing(), SVEMemOperand(x16, 3, SVE_MUL_VL)),
4467           "ldnt1h {z26.h}, p4/z, [x16, #3, mul vl]");
4468   COMPARE(ldnt1w(z17.VnS(), p4.Zeroing(), SVEMemOperand(x15, 7, SVE_MUL_VL)),
4469           "ldnt1w {z17.s}, p4/z, [x15, #7, mul vl]");
4470   COMPARE(ldnt1w(z17.VnS(), p4.Zeroing(), SVEMemOperand(sp, 7, SVE_MUL_VL)),
4471           "ldnt1w {z17.s}, p4/z, [sp, #7, mul vl]");
4472 
4473   COMPARE_MACRO(Ldnt1b(z2.VnB(),
4474                        p0.Zeroing(),
4475                        SVEMemOperand(x10, 42, SVE_MUL_VL)),
4476                 "mov x16, #0x2a\n"
4477                 "rdvl x17, #1\n"
4478                 "madd x16, x16, x17, x10\n"
4479                 "ldnt1b {z2.b}, p0/z, [x16]");
4480   COMPARE_MACRO(Ldnt1h(z3.VnH(),
4481                        p1.Zeroing(),
4482                        SVEMemOperand(x11, 31, SVE_MUL_VL)),
4483                 "addvl x16, x11, #31\n"
4484                 "ldnt1h {z3.h}, p1/z, [x16]");
4485   COMPARE_MACRO(Ldnt1w(z4.VnS(),
4486                        p2.Zeroing(),
4487                        SVEMemOperand(x12, -35, SVE_MUL_VL)),
4488                 "mov x16, #0xffffffffffffffdd\n"
4489                 "rdvl x17, #1\n"
4490                 "madd x16, x16, x17, x12\n"
4491                 "ldnt1w {z4.s}, p2/z, [x16]");
4492   COMPARE_MACRO(Ldnt1d(z5.VnD(), p3.Zeroing(), SVEMemOperand(x13, 3)),
4493                 "add x16, x13, #0x3 (3)\n"
4494                 "ldnt1d {z5.d}, p3/z, [x16]");
4495 
4496   COMPARE(ldnf1b(z1.VnH(), p0.Zeroing(), SVEMemOperand(x25, -8, SVE_MUL_VL)),
4497           "ldnf1b {z1.h}, p0/z, [x25, #-8, mul vl]");
4498   COMPARE(ldnf1b(z0.VnS(), p0.Zeroing(), SVEMemOperand(x2, 7, SVE_MUL_VL)),
4499           "ldnf1b {z0.s}, p0/z, [x2, #7, mul vl]");
4500   COMPARE(ldnf1b(z31.VnD(), p6.Zeroing(), SVEMemOperand(x0, -7, SVE_MUL_VL)),
4501           "ldnf1b {z31.d}, p6/z, [x0, #-7, mul vl]");
4502   COMPARE(ldnf1b(z25.VnB(), p1.Zeroing(), SVEMemOperand(x5, 6, SVE_MUL_VL)),
4503           "ldnf1b {z25.b}, p1/z, [x5, #6, mul vl]");
4504   COMPARE(ldnf1d(z25.VnD(), p0.Zeroing(), SVEMemOperand(x11, -6, SVE_MUL_VL)),
4505           "ldnf1d {z25.d}, p0/z, [x11, #-6, mul vl]");
4506   COMPARE(ldnf1h(z22.VnH(), p4.Zeroing(), SVEMemOperand(x7, 5, SVE_MUL_VL)),
4507           "ldnf1h {z22.h}, p4/z, [x7, #5, mul vl]");
4508   COMPARE(ldnf1h(z7.VnS(), p2.Zeroing(), SVEMemOperand(x1, -5, SVE_MUL_VL)),
4509           "ldnf1h {z7.s}, p2/z, [x1, #-5, mul vl]");
4510   COMPARE(ldnf1h(z5.VnD(), p3.Zeroing(), SVEMemOperand(x29, 4, SVE_MUL_VL)),
4511           "ldnf1h {z5.d}, p3/z, [x29, #4, mul vl]");
4512   COMPARE(ldnf1sb(z12.VnH(), p5.Zeroing(), SVEMemOperand(x27, -4, SVE_MUL_VL)),
4513           "ldnf1sb {z12.h}, p5/z, [x27, #-4, mul vl]");
4514   COMPARE(ldnf1sb(z10.VnS(), p2.Zeroing(), SVEMemOperand(x13, 3, SVE_MUL_VL)),
4515           "ldnf1sb {z10.s}, p2/z, [x13, #3, mul vl]");
4516   COMPARE(ldnf1sb(z25.VnD(), p6.Zeroing(), SVEMemOperand(x26, -3, SVE_MUL_VL)),
4517           "ldnf1sb {z25.d}, p6/z, [x26, #-3, mul vl]");
4518   COMPARE(ldnf1sh(z3.VnS(), p5.Zeroing(), SVEMemOperand(x1, 2, SVE_MUL_VL)),
4519           "ldnf1sh {z3.s}, p5/z, [x1, #2, mul vl]");
4520   COMPARE(ldnf1sh(z8.VnD(), p6.Zeroing(), SVEMemOperand(x13, -2, SVE_MUL_VL)),
4521           "ldnf1sh {z8.d}, p6/z, [x13, #-2, mul vl]");
4522   COMPARE(ldnf1sw(z5.VnD(), p6.Zeroing(), SVEMemOperand(x2, 1, SVE_MUL_VL)),
4523           "ldnf1sw {z5.d}, p6/z, [x2, #1, mul vl]");
4524   COMPARE(ldnf1w(z11.VnS(), p3.Zeroing(), SVEMemOperand(sp, -1, SVE_MUL_VL)),
4525           "ldnf1w {z11.s}, p3/z, [sp, #-1, mul vl]");
4526   COMPARE(ldnf1w(z10.VnD(), p6.Zeroing(), SVEMemOperand(x12)),
4527           "ldnf1w {z10.d}, p6/z, [x12]");
4528 
4529   CLEANUP();
4530 }
4531 
TEST(sve_mem_contiguous_store)4532 TEST(sve_mem_contiguous_store) {
4533   SETUP();
4534 
4535   COMPARE(stnt1b(z21.VnB(), p5.Zeroing(), SVEMemOperand(x1, x23)),
4536           "stnt1b {z21.b}, p5, [x1, x23]");
4537   COMPARE(stnt1d(z10.VnD(), p0.Zeroing(), SVEMemOperand(x23, x6, LSL, 3)),
4538           "stnt1d {z10.d}, p0, [x23, x6, lsl #3]");
4539   COMPARE(stnt1h(z30.VnH(), p4.Zeroing(), SVEMemOperand(x6, x11, LSL, 1)),
4540           "stnt1h {z30.h}, p4, [x6, x11, lsl #1]");
4541   COMPARE(stnt1w(z0.VnS(), p4.Zeroing(), SVEMemOperand(x11, x1, LSL, 2)),
4542           "stnt1w {z0.s}, p4, [x11, x1, lsl #2]");
4543   COMPARE(stnt1w(z0.VnS(), p4.Zeroing(), SVEMemOperand(sp, xzr, LSL, 2)),
4544           "stnt1w {z0.s}, p4, [sp, xzr, lsl #2]");
4545 
4546   COMPARE(stnt1b(z1.VnB(), p3.Zeroing(), SVEMemOperand(x11)),
4547           "stnt1b {z1.b}, p3, [x11]");
4548   COMPARE(stnt1b(z2.VnB(), p2.Zeroing(), SVEMemOperand(x12, -8, SVE_MUL_VL)),
4549           "stnt1b {z2.b}, p2, [x12, #-8, mul vl]");
4550   COMPARE(stnt1d(z2.VnD(), p7.Zeroing(), SVEMemOperand(x13, -2, SVE_MUL_VL)),
4551           "stnt1d {z2.d}, p7, [x13, #-2, mul vl]");
4552   COMPARE(stnt1h(z26.VnH(), p4.Zeroing(), SVEMemOperand(x16, 3, SVE_MUL_VL)),
4553           "stnt1h {z26.h}, p4, [x16, #3, mul vl]");
4554   COMPARE(stnt1w(z17.VnS(), p4.Zeroing(), SVEMemOperand(x15, 7, SVE_MUL_VL)),
4555           "stnt1w {z17.s}, p4, [x15, #7, mul vl]");
4556   COMPARE(stnt1w(z17.VnS(), p4.Zeroing(), SVEMemOperand(sp, 7, SVE_MUL_VL)),
4557           "stnt1w {z17.s}, p4, [sp, #7, mul vl]");
4558 
4559   COMPARE_MACRO(Stnt1b(z2.VnB(),
4560                        p0.Zeroing(),
4561                        SVEMemOperand(x10, 42, SVE_MUL_VL)),
4562                 "mov x16, #0x2a\n"
4563                 "rdvl x17, #1\n"
4564                 "madd x16, x16, x17, x10\n"
4565                 "stnt1b {z2.b}, p0, [x16]");
4566   COMPARE_MACRO(Stnt1h(z3.VnH(),
4567                        p1.Zeroing(),
4568                        SVEMemOperand(x11, 31, SVE_MUL_VL)),
4569                 "addvl x16, x11, #31\n"
4570                 "stnt1h {z3.h}, p1, [x16]");
4571   COMPARE_MACRO(Stnt1w(z4.VnS(),
4572                        p2.Zeroing(),
4573                        SVEMemOperand(x12, -35, SVE_MUL_VL)),
4574                 "mov x16, #0xffffffffffffffdd\n"
4575                 "rdvl x17, #1\n"
4576                 "madd x16, x16, x17, x12\n"
4577                 "stnt1w {z4.s}, p2, [x16]");
4578 
4579   COMPARE_MACRO(Stnt1b(z0.VnB(), p0.Zeroing(), SVEMemOperand(x0, x1)),
4580                 "stnt1b {z0.b}, p0, [x0, x1]");
4581   COMPARE_MACRO(Stnt1h(z0.VnH(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 1)),
4582                 "stnt1h {z0.h}, p0, [x0, x1, lsl #1]");
4583   COMPARE_MACRO(Stnt1w(z0.VnS(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 2)),
4584                 "stnt1w {z0.s}, p0, [x0, x1, lsl #2]");
4585   COMPARE_MACRO(Stnt1d(z0.VnD(), p0.Zeroing(), SVEMemOperand(x0, x1, LSL, 3)),
4586                 "stnt1d {z0.d}, p0, [x0, x1, lsl #3]");
4587 
4588   CLEANUP();
4589 }
4590 
TEST(sve_load_broadcast_octo)4591 TEST(sve_load_broadcast_octo) {
4592   SETUP();
4593 
4594   COMPARE_MACRO(Ld1rob(z3.VnB(), p1.Zeroing(), SVEMemOperand(x0, x1)),
4595                 "ld1rob {z3.b}, p1/z, [x0, x1]");
4596   COMPARE_MACRO(Ld1roh(z6.VnH(), p4.Zeroing(), SVEMemOperand(sp, x31, LSL, 1)),
4597                 "ld1roh {z6.h}, p4/z, [sp]");
4598   COMPARE_MACRO(Ld1roh(z6.VnH(), p4.Zeroing(), SVEMemOperand(sp, x30, LSL, 1)),
4599                 "ld1roh {z6.h}, p4/z, [sp, x30, lsl #1]");
4600   COMPARE_MACRO(Ld1row(z2.VnS(), p6.Zeroing(), SVEMemOperand(x30, x30, LSL, 2)),
4601                 "ld1row {z2.s}, p6/z, [x30, x30, lsl #2]");
4602   COMPARE_MACRO(Ld1rod(z30.VnD(), p7.Zeroing(), SVEMemOperand(x21, x5, LSL, 3)),
4603                 "ld1rod {z30.d}, p7/z, [x21, x5, lsl #3]");
4604   COMPARE_MACRO(Ld1rob(z9.VnB(), p0.Zeroing(), SVEMemOperand(sp, 32)),
4605                 "ld1rob {z9.b}, p0/z, [sp, #32]");
4606   COMPARE_MACRO(Ld1roh(z19.VnH(), p3.Zeroing(), SVEMemOperand(x4)),
4607                 "ld1roh {z19.h}, p3/z, [x4]");
4608   COMPARE_MACRO(Ld1row(z21.VnS(), p3.Zeroing(), SVEMemOperand(x11, 224)),
4609                 "ld1row {z21.s}, p3/z, [x11, #224]");
4610   COMPARE_MACRO(Ld1rod(z0.VnD(), p2.Zeroing(), SVEMemOperand(x16, -256)),
4611                 "ld1rod {z0.d}, p2/z, [x16, #-256]");
4612 
4613   CLEANUP();
4614 }
4615 
TEST(sve_ldr_str_simple)4616 TEST(sve_ldr_str_simple) {
4617   SETUP();
4618 
4619   COMPARE(str(p14, SVEMemOperand(x0)), "str p14, [x0]");
4620   COMPARE(str(z14, SVEMemOperand(sp)), "str z14, [sp]");
4621   COMPARE(ldr(p4, SVEMemOperand(x0)), "ldr p4, [x0]");
4622   COMPARE(ldr(z4, SVEMemOperand(sp)), "ldr z4, [sp]");
4623   COMPARE(str(p15, SVEMemOperand(sp, -256, SVE_MUL_VL)),
4624           "str p15, [sp, #-256, mul vl]");
4625   COMPARE(str(z16, SVEMemOperand(x13, 255, SVE_MUL_VL)),
4626           "str z16, [x13, #255, mul vl]");
4627   COMPARE(ldr(p5, SVEMemOperand(sp, -42, SVE_MUL_VL)),
4628           "ldr p5, [sp, #-42, mul vl]");
4629   COMPARE(ldr(z6, SVEMemOperand(x28, 42, SVE_MUL_VL)),
4630           "ldr z6, [x28, #42, mul vl]");
4631 
4632   COMPARE_MACRO(Str(p14, SVEMemOperand(x0)), "str p14, [x0]");
4633   COMPARE_MACRO(Str(z14, SVEMemOperand(sp)), "str z14, [sp]");
4634   COMPARE_MACRO(Ldr(p4, SVEMemOperand(x0)), "ldr p4, [x0]");
4635   COMPARE_MACRO(Ldr(z4, SVEMemOperand(sp)), "ldr z4, [sp]");
4636   COMPARE_MACRO(Str(p15, SVEMemOperand(sp, -256, SVE_MUL_VL)),
4637                 "str p15, [sp, #-256, mul vl]");
4638   COMPARE_MACRO(Str(z16, SVEMemOperand(x13, 255, SVE_MUL_VL)),
4639                 "str z16, [x13, #255, mul vl]");
4640   COMPARE_MACRO(Ldr(p5, SVEMemOperand(sp, -42, SVE_MUL_VL)),
4641                 "ldr p5, [sp, #-42, mul vl]");
4642   COMPARE_MACRO(Ldr(z6, SVEMemOperand(x28, 42, SVE_MUL_VL)),
4643                 "ldr z6, [x28, #42, mul vl]");
4644 
4645   COMPARE_MACRO(Ldr(z6, SVEMemOperand(x28, 42, SVE_MUL_VL)),
4646                 "ldr z6, [x28, #42, mul vl]");
4647 
4648   // IsEquivalentToScalar
4649   COMPARE_MACRO(Str(p0, SVEMemOperand(x0, xzr)), "str p0, [x0]");
4650   COMPARE_MACRO(Ldr(p1, SVEMemOperand(sp, xzr)), "ldr p1, [sp]");
4651   COMPARE_MACRO(Str(z2, SVEMemOperand(x12, xzr)), "str z2, [x12]");
4652   COMPARE_MACRO(Ldr(z3, SVEMemOperand(x7, xzr)), "ldr z3, [x7]");
4653 
4654   // Other cases fall back on Adr. We test Adr separately, so here we just test
4655   // sequences that stress scratch register allocation.
4656   COMPARE_MACRO(Str(p4, SVEMemOperand(x5, 4242, SVE_MUL_VL)),
4657                 "mov x16, #0x1092\n"
4658                 "rdvl x17, #1\n"
4659                 "mul x16, x16, x17\n"
4660                 "add x16, x5, x16, asr #3\n"
4661                 "str p4, [x16]");
4662   COMPARE_MACRO(Ldr(p6, SVEMemOperand(sp, 4242, SVE_MUL_VL)),
4663                 "mov x16, #0x1092\n"
4664                 "rdvl x17, #1\n"
4665                 "mul x16, x16, x17\n"
4666                 "asr x16, x16, #3\n"
4667                 "add x16, sp, x16\n"
4668                 "ldr p6, [x16]");
4669   COMPARE_MACRO(Str(z7, SVEMemOperand(sp, 4242, SVE_MUL_VL)),
4670                 "mov x16, #0x1092\n"
4671                 "rdvl x17, #1\n"
4672                 "mul x16, x16, x17\n"
4673                 "add x16, sp, x16\n"
4674                 "str z7, [x16]");
4675   COMPARE_MACRO(Ldr(z8, SVEMemOperand(x9, 4242, SVE_MUL_VL)),
4676                 "mov x16, #0x1092\n"
4677                 "rdvl x17, #1\n"
4678                 "madd x16, x16, x17, x9\n"
4679                 "ldr z8, [x16]");
4680 
4681   CLEANUP();
4682 }
4683 
TEST(sve_ld1_st1)4684 TEST(sve_ld1_st1) {
4685   SETUP();
4686 
4687   COMPARE(st1b(z11.VnB(), p0, SVEMemOperand(x22)), "st1b {z11.b}, p0, [x22]");
4688   COMPARE(st1b(z15.VnH(), p1, SVEMemOperand(x15, 7, SVE_MUL_VL)),
4689           "st1b {z15.h}, p1, [x15, #7, mul vl]");
4690   COMPARE(st1b(z19.VnS(), p2, SVEMemOperand(sp, -8, SVE_MUL_VL)),
4691           "st1b {z19.s}, p2, [sp, #-8, mul vl]");
4692   COMPARE(st1b(z23.VnD(), p3, SVEMemOperand(x1, 0, SVE_MUL_VL)),
4693           "st1b {z23.d}, p3, [x1]");
4694   COMPARE(st1b(z2.VnB(), p4, SVEMemOperand(x1, x2)),
4695           "st1b {z2.b}, p4, [x1, x2]");
4696   COMPARE(st1b(z31.VnD(), p7, SVEMemOperand(x9, x9, LSL, 0)),
4697           "st1b {z31.d}, p7, [x9, x9]");
4698   COMPARE(st1b(z3.VnS(), p0, SVEMemOperand(z14.VnS(), 30)),
4699           "st1b {z3.s}, p0, [z14.s, #30]");
4700   COMPARE(st1b(z14.VnD(), p4, SVEMemOperand(z3.VnD(), 31)),
4701           "st1b {z14.d}, p4, [z3.d, #31]");
4702   COMPARE(st1b(z15.VnD(), p5, SVEMemOperand(x0, z5.VnD())),
4703           "st1b {z15.d}, p5, [x0, z5.d]");
4704   COMPARE(st1b(z15.VnS(), p5, SVEMemOperand(sp, z2.VnS(), UXTW)),
4705           "st1b {z15.s}, p5, [sp, z2.s, uxtw]");
4706   COMPARE(st1b(z15.VnD(), p5, SVEMemOperand(x0, z25.VnD(), SXTW)),
4707           "st1b {z15.d}, p5, [x0, z25.d, sxtw]");
4708 
4709   COMPARE(st1h(z15.VnH(), p1, SVEMemOperand(x15, 7, SVE_MUL_VL)),
4710           "st1h {z15.h}, p1, [x15, #7, mul vl]");
4711   COMPARE(st1h(z19.VnS(), p2, SVEMemOperand(sp, -8, SVE_MUL_VL)),
4712           "st1h {z19.s}, p2, [sp, #-8, mul vl]");
4713   COMPARE(st1h(z23.VnD(), p3, SVEMemOperand(x1, 0, SVE_MUL_VL)),
4714           "st1h {z23.d}, p3, [x1]");
4715   COMPARE(st1h(z2.VnH(), p4, SVEMemOperand(x1, x2, LSL, 1)),
4716           "st1h {z2.h}, p4, [x1, x2, lsl #1]");
4717   COMPARE(st1h(z31.VnD(), p7, SVEMemOperand(x9, x9, LSL, 1)),
4718           "st1h {z31.d}, p7, [x9, x9, lsl #1]");
4719   COMPARE(st1h(z3.VnS(), p0, SVEMemOperand(z14.VnS(), 30)),
4720           "st1h {z3.s}, p0, [z14.s, #30]");
4721   COMPARE(st1h(z14.VnD(), p4, SVEMemOperand(z3.VnD(), 62)),
4722           "st1h {z14.d}, p4, [z3.d, #62]");
4723   COMPARE(st1h(z15.VnD(), p6, SVEMemOperand(sp, z6.VnD())),
4724           "st1h {z15.d}, p6, [sp, z6.d]");
4725   COMPARE(st1h(z15.VnD(), p6, SVEMemOperand(sp, z6.VnD(), LSL, 1)),
4726           "st1h {z15.d}, p6, [sp, z6.d, lsl #1]");
4727   COMPARE(st1h(z15.VnS(), p3, SVEMemOperand(x25, z3.VnS(), SXTW)),
4728           "st1h {z15.s}, p3, [x25, z3.s, sxtw]");
4729   COMPARE(st1h(z15.VnS(), p6, SVEMemOperand(x7, z15.VnS(), SXTW, 1)),
4730           "st1h {z15.s}, p6, [x7, z15.s, sxtw #1]");
4731   COMPARE(st1h(z17.VnD(), p3, SVEMemOperand(sp, z26.VnD(), SXTW)),
4732           "st1h {z17.d}, p3, [sp, z26.d, sxtw]");
4733   COMPARE(st1h(z15.VnD(), p6, SVEMemOperand(x13, z9.VnD(), UXTW, 1)),
4734           "st1h {z15.d}, p6, [x13, z9.d, uxtw #1]");
4735 
4736   COMPARE(st1w(z19.VnS(), p2, SVEMemOperand(sp, -8, SVE_MUL_VL)),
4737           "st1w {z19.s}, p2, [sp, #-8, mul vl]");
4738   COMPARE(st1w(z23.VnD(), p3, SVEMemOperand(x1, 0, SVE_MUL_VL)),
4739           "st1w {z23.d}, p3, [x1]");
4740   COMPARE(st1w(z2.VnS(), p4, SVEMemOperand(x1, x2, LSL, 2)),
4741           "st1w {z2.s}, p4, [x1, x2, lsl #2]");
4742   COMPARE(st1w(z31.VnD(), p7, SVEMemOperand(x9, x9, LSL, 2)),
4743           "st1w {z31.d}, p7, [x9, x9, lsl #2]");
4744   COMPARE(st1w(z3.VnS(), p0, SVEMemOperand(z14.VnS(), 32)),
4745           "st1w {z3.s}, p0, [z14.s, #32]");
4746   COMPARE(st1w(z14.VnD(), p4, SVEMemOperand(z3.VnD(), 124)),
4747           "st1w {z14.d}, p4, [z3.d, #124]");
4748   COMPARE(st1w(z17.VnD(), p2, SVEMemOperand(x30, z5.VnD())),
4749           "st1w {z17.d}, p2, [x30, z5.d]");
4750   COMPARE(st1w(z17.VnD(), p2, SVEMemOperand(x30, z5.VnD(), LSL, 2)),
4751           "st1w {z17.d}, p2, [x30, z5.d, lsl #2]");
4752   COMPARE(st1w(z15.VnS(), p7, SVEMemOperand(x26, z4.VnS(), UXTW)),
4753           "st1w {z15.s}, p7, [x26, z4.s, uxtw]");
4754   COMPARE(st1w(z15.VnS(), p4, SVEMemOperand(x8, z16.VnS(), UXTW, 2)),
4755           "st1w {z15.s}, p4, [x8, z16.s, uxtw #2]");
4756   COMPARE(st1w(z19.VnD(), p7, SVEMemOperand(x1, z27.VnD(), UXTW)),
4757           "st1w {z19.d}, p7, [x1, z27.d, uxtw]");
4758   COMPARE(st1w(z15.VnD(), p4, SVEMemOperand(sp, z10.VnD(), SXTW, 2)),
4759           "st1w {z15.d}, p4, [sp, z10.d, sxtw #2]");
4760 
4761   COMPARE(st1d(z23.VnD(), p3, SVEMemOperand(x1, 0, SVE_MUL_VL)),
4762           "st1d {z23.d}, p3, [x1]");
4763   COMPARE(st1d(z31.VnD(), p7, SVEMemOperand(x9, x9, LSL, 3)),
4764           "st1d {z31.d}, p7, [x9, x9, lsl #3]");
4765   COMPARE(st1d(z14.VnD(), p4, SVEMemOperand(z3.VnD(), 32)),
4766           "st1d {z14.d}, p4, [z3.d, #32]");
4767   COMPARE(st1d(z14.VnD(), p4, SVEMemOperand(z3.VnD(), 248)),
4768           "st1d {z14.d}, p4, [z3.d, #248]");
4769   COMPARE(st1d(z19.VnD(), p2, SVEMemOperand(x29, z22.VnD())),
4770           "st1d {z19.d}, p2, [x29, z22.d]");
4771   COMPARE(st1d(z19.VnD(), p2, SVEMemOperand(x29, z22.VnD(), LSL, 3)),
4772           "st1d {z19.d}, p2, [x29, z22.d, lsl #3]");
4773   COMPARE(st1d(z21.VnD(), p1, SVEMemOperand(x2, z28.VnD(), SXTW)),
4774           "st1d {z21.d}, p1, [x2, z28.d, sxtw]");
4775   COMPARE(st1d(z15.VnD(), p2, SVEMemOperand(x14, z11.VnD(), UXTW, 3)),
4776           "st1d {z15.d}, p2, [x14, z11.d, uxtw #3]");
4777 
4778   COMPARE(ld1b(z11.VnB(), p0.Zeroing(), SVEMemOperand(x22)),
4779           "ld1b {z11.b}, p0/z, [x22]");
4780   COMPARE(ld1b(z15.VnH(), p1.Zeroing(), SVEMemOperand(x15, 7, SVE_MUL_VL)),
4781           "ld1b {z15.h}, p1/z, [x15, #7, mul vl]");
4782   COMPARE(ld1b(z19.VnS(), p2.Zeroing(), SVEMemOperand(sp, -8, SVE_MUL_VL)),
4783           "ld1b {z19.s}, p2/z, [sp, #-8, mul vl]");
4784   COMPARE(ld1b(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4785           "ld1b {z23.d}, p3/z, [x1]");
4786   COMPARE(ld1b(z2.VnB(), p4.Zeroing(), SVEMemOperand(x1, x2)),
4787           "ld1b {z2.b}, p4/z, [x1, x2]");
4788   COMPARE(ld1b(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 0)),
4789           "ld1b {z31.d}, p7/z, [x9, x9]");
4790 
4791   COMPARE(ld1h(z15.VnH(), p1.Zeroing(), SVEMemOperand(x15, 7, SVE_MUL_VL)),
4792           "ld1h {z15.h}, p1/z, [x15, #7, mul vl]");
4793   COMPARE(ld1h(z19.VnS(), p2.Zeroing(), SVEMemOperand(sp, -8, SVE_MUL_VL)),
4794           "ld1h {z19.s}, p2/z, [sp, #-8, mul vl]");
4795   COMPARE(ld1h(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4796           "ld1h {z23.d}, p3/z, [x1]");
4797   COMPARE(ld1h(z2.VnH(), p4.Zeroing(), SVEMemOperand(x1, x2, LSL, 1)),
4798           "ld1h {z2.h}, p4/z, [x1, x2, lsl #1]");
4799   COMPARE(ld1h(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 1)),
4800           "ld1h {z31.d}, p7/z, [x9, x9, lsl #1]");
4801 
4802   COMPARE(ld1w(z19.VnS(), p2.Zeroing(), SVEMemOperand(sp, -8, SVE_MUL_VL)),
4803           "ld1w {z19.s}, p2/z, [sp, #-8, mul vl]");
4804   COMPARE(ld1w(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4805           "ld1w {z23.d}, p3/z, [x1]");
4806   COMPARE(ld1w(z2.VnS(), p4.Zeroing(), SVEMemOperand(x1, x2, LSL, 2)),
4807           "ld1w {z2.s}, p4/z, [x1, x2, lsl #2]");
4808   COMPARE(ld1w(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 2)),
4809           "ld1w {z31.d}, p7/z, [x9, x9, lsl #2]");
4810 
4811   COMPARE(ld1d(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4812           "ld1d {z23.d}, p3/z, [x1]");
4813   COMPARE(ld1d(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 3)),
4814           "ld1d {z31.d}, p7/z, [x9, x9, lsl #3]");
4815 
4816   COMPARE(ld1sb(z15.VnH(), p1.Zeroing(), SVEMemOperand(x15, 7, SVE_MUL_VL)),
4817           "ld1sb {z15.h}, p1/z, [x15, #7, mul vl]");
4818   COMPARE(ld1sb(z19.VnS(), p2.Zeroing(), SVEMemOperand(sp, -8, SVE_MUL_VL)),
4819           "ld1sb {z19.s}, p2/z, [sp, #-8, mul vl]");
4820   COMPARE(ld1d(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4821           "ld1d {z23.d}, p3/z, [x1]");
4822   COMPARE(ld1sb(z5.VnH(), p1.Zeroing(), SVEMemOperand(x15, x1, LSL, 0)),
4823           "ld1sb {z5.h}, p1/z, [x15, x1]");
4824   COMPARE(ld1sb(z9.VnS(), p2.Zeroing(), SVEMemOperand(x29, x3, LSL, 0)),
4825           "ld1sb {z9.s}, p2/z, [x29, x3]");
4826   COMPARE(ld1sb(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 0)),
4827           "ld1sb {z31.d}, p7/z, [x9, x9]");
4828 
4829   COMPARE(ld1sh(z19.VnS(), p2.Zeroing(), SVEMemOperand(sp, -8, SVE_MUL_VL)),
4830           "ld1sh {z19.s}, p2/z, [sp, #-8, mul vl]");
4831   COMPARE(ld1sh(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4832           "ld1sh {z23.d}, p3/z, [x1]");
4833   COMPARE(ld1sh(z11.VnS(), p4.Zeroing(), SVEMemOperand(x22, x10, LSL, 1)),
4834           "ld1sh {z11.s}, p4/z, [x22, x10, lsl #1]");
4835   COMPARE(ld1sh(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 1)),
4836           "ld1sh {z31.d}, p7/z, [x9, x9, lsl #1]");
4837 
4838   COMPARE(ld1sw(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4839           "ld1sw {z23.d}, p3/z, [x1]");
4840   COMPARE(ld1sw(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 2)),
4841           "ld1sw {z31.d}, p7/z, [x9, x9, lsl #2]");
4842 
4843   CLEANUP();
4844 }
4845 
TEST(sve_ld1_st1_macro)4846 TEST(sve_ld1_st1_macro) {
4847   SETUP();
4848 
4849   // Pass-through cases.
4850   COMPARE_MACRO(St1b(z11.VnB(), p0, SVEMemOperand(x22)),
4851                 "st1b {z11.b}, p0, [x22]");
4852   COMPARE_MACRO(St1b(z15.VnH(), p1, SVEMemOperand(x15, 7, SVE_MUL_VL)),
4853                 "st1b {z15.h}, p1, [x15, #7, mul vl]");
4854   COMPARE_MACRO(St1b(z19.VnS(), p2, SVEMemOperand(sp, -8, SVE_MUL_VL)),
4855                 "st1b {z19.s}, p2, [sp, #-8, mul vl]");
4856   COMPARE_MACRO(St1b(z23.VnD(), p3, SVEMemOperand(x1, 0, SVE_MUL_VL)),
4857                 "st1b {z23.d}, p3, [x1]");
4858   COMPARE_MACRO(St1b(z2.VnB(), p4, SVEMemOperand(x1, x2)),
4859                 "st1b {z2.b}, p4, [x1, x2]");
4860   COMPARE_MACRO(St1b(z31.VnD(), p7, SVEMemOperand(x9, x9, LSL, 0)),
4861                 "st1b {z31.d}, p7, [x9, x9]");
4862   COMPARE_MACRO(St1b(z3.VnS(), p6, SVEMemOperand(z4.VnS(), 22)),
4863                 "st1b {z3.s}, p6, [z4.s, #22]");
4864 
4865   COMPARE_MACRO(St1h(z15.VnH(), p1, SVEMemOperand(x15, 7, SVE_MUL_VL)),
4866                 "st1h {z15.h}, p1, [x15, #7, mul vl]");
4867   COMPARE_MACRO(St1h(z19.VnS(), p2, SVEMemOperand(sp, -8, SVE_MUL_VL)),
4868                 "st1h {z19.s}, p2, [sp, #-8, mul vl]");
4869   COMPARE_MACRO(St1h(z23.VnD(), p3, SVEMemOperand(x1, 0, SVE_MUL_VL)),
4870                 "st1h {z23.d}, p3, [x1]");
4871   COMPARE_MACRO(St1h(z2.VnH(), p4, SVEMemOperand(x1, x2, LSL, 1)),
4872                 "st1h {z2.h}, p4, [x1, x2, lsl #1]");
4873   COMPARE_MACRO(St1h(z31.VnD(), p7, SVEMemOperand(x9, x9, LSL, 1)),
4874                 "st1h {z31.d}, p7, [x9, x9, lsl #1]");
4875   COMPARE_MACRO(St1h(z3.VnD(), p5, SVEMemOperand(z0.VnD())),
4876                 "st1h {z3.d}, p5, [z0.d]");
4877 
4878   COMPARE_MACRO(St1w(z19.VnS(), p2, SVEMemOperand(sp, -8, SVE_MUL_VL)),
4879                 "st1w {z19.s}, p2, [sp, #-8, mul vl]");
4880   COMPARE_MACRO(St1w(z23.VnD(), p3, SVEMemOperand(x1, 0, SVE_MUL_VL)),
4881                 "st1w {z23.d}, p3, [x1]");
4882   COMPARE_MACRO(St1w(z2.VnS(), p4, SVEMemOperand(x1, x2, LSL, 2)),
4883                 "st1w {z2.s}, p4, [x1, x2, lsl #2]");
4884   COMPARE_MACRO(St1w(z31.VnD(), p7, SVEMemOperand(x9, x9, LSL, 2)),
4885                 "st1w {z31.d}, p7, [x9, x9, lsl #2]");
4886   COMPARE_MACRO(St1w(z12.VnS(), p2, SVEMemOperand(z13.VnS(), 124)),
4887                 "st1w {z12.s}, p2, [z13.s, #124]");
4888 
4889   COMPARE_MACRO(St1d(z23.VnD(), p3, SVEMemOperand(x1, 0, SVE_MUL_VL)),
4890                 "st1d {z23.d}, p3, [x1]");
4891   COMPARE_MACRO(St1d(z31.VnD(), p7, SVEMemOperand(x9, x9, LSL, 3)),
4892                 "st1d {z31.d}, p7, [x9, x9, lsl #3]");
4893   COMPARE_MACRO(St1d(z13.VnD(), p3, SVEMemOperand(z12.VnD(), 248)),
4894                 "st1d {z13.d}, p3, [z12.d, #248]");
4895 
4896   // SVEMemOperand synthesis.
4897   // Check that the MacroAssembler falls back on `CalculateSVEAddress` at the
4898   // boundary conditions. We test this helper independently.
4899   COMPARE_MACRO(St1b(z10.VnB(), p7, SVEMemOperand(x0, 8, SVE_MUL_VL)),
4900                 "addvl x16, x0, #8\n"
4901                 "st1b {z10.b}, p7, [x16]");
4902   COMPARE_MACRO(St1h(z11.VnS(), p5, SVEMemOperand(sp, -9, SVE_MUL_VL)),
4903                 "mov x16, #0xffffffffffffffdc\n"
4904                 "rdvl x17, #1\n"
4905                 "mul x16, x16, x17\n"
4906                 "asr x16, x16, #3\n"
4907                 "add x16, sp, x16\n"
4908                 "st1h {z11.s}, p5, [x16]");
4909   COMPARE_MACRO(St1w(z22.VnS(), p3, SVEMemOperand(sp, 42)),
4910                 "add x16, sp, #0x2a (42)\n"
4911                 "st1w {z22.s}, p3, [x16]");
4912   COMPARE_MACRO(St1d(z22.VnD(), p1, SVEMemOperand(x3, x4)),
4913                 "add x16, x3, x4\n"
4914                 "st1d {z22.d}, p1, [x16]");
4915   COMPARE_MACRO(St1b(z30.VnD(), p0, SVEMemOperand(x9, xzr)),
4916                 "st1b {z30.d}, p0, [x9]");
4917 
4918 // TODO: Fix these - they need scatter-store-to-scalar-plus-vector support.
4919 #if 0
4920   COMPARE_MACRO(St1b(z1.VnD(), p6, SVEMemOperand(z0.VnD(), 32)), "mov x16, #0x20\n" "st1b {z1.d}, p6/z, [x16, z0.d]");
4921   COMPARE_MACRO(St1h(z1.VnS(), p6, SVEMemOperand(z0.VnS(), -1)), "mov x16, #0xffffffffffffffff\n" "st1h {z1.s}, p6/z, [x16, z0.s]");
4922 #endif
4923 
4924   COMPARE_MACRO(Ld1b(z11.VnB(), p0.Zeroing(), SVEMemOperand(x22)),
4925                 "ld1b {z11.b}, p0/z, [x22]");
4926   COMPARE_MACRO(Ld1b(z15.VnH(),
4927                      p1.Zeroing(),
4928                      SVEMemOperand(x15, 7, SVE_MUL_VL)),
4929                 "ld1b {z15.h}, p1/z, [x15, #7, mul vl]");
4930   COMPARE_MACRO(Ld1b(z19.VnS(),
4931                      p2.Zeroing(),
4932                      SVEMemOperand(sp, -8, SVE_MUL_VL)),
4933                 "ld1b {z19.s}, p2/z, [sp, #-8, mul vl]");
4934   COMPARE_MACRO(Ld1b(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4935                 "ld1b {z23.d}, p3/z, [x1]");
4936   COMPARE_MACRO(Ld1b(z2.VnB(), p4.Zeroing(), SVEMemOperand(x1, x2)),
4937                 "ld1b {z2.b}, p4/z, [x1, x2]");
4938   COMPARE_MACRO(Ld1b(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 0)),
4939                 "ld1b {z31.d}, p7/z, [x9, x9]");
4940 
4941   COMPARE_MACRO(Ld1h(z15.VnH(),
4942                      p1.Zeroing(),
4943                      SVEMemOperand(x15, 7, SVE_MUL_VL)),
4944                 "ld1h {z15.h}, p1/z, [x15, #7, mul vl]");
4945   COMPARE_MACRO(Ld1h(z19.VnS(),
4946                      p2.Zeroing(),
4947                      SVEMemOperand(sp, -8, SVE_MUL_VL)),
4948                 "ld1h {z19.s}, p2/z, [sp, #-8, mul vl]");
4949   COMPARE_MACRO(Ld1h(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4950                 "ld1h {z23.d}, p3/z, [x1]");
4951   COMPARE_MACRO(Ld1h(z2.VnH(), p4.Zeroing(), SVEMemOperand(x1, x2, LSL, 1)),
4952                 "ld1h {z2.h}, p4/z, [x1, x2, lsl #1]");
4953   COMPARE_MACRO(Ld1h(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 1)),
4954                 "ld1h {z31.d}, p7/z, [x9, x9, lsl #1]");
4955 
4956   COMPARE_MACRO(Ld1w(z19.VnS(),
4957                      p2.Zeroing(),
4958                      SVEMemOperand(sp, -8, SVE_MUL_VL)),
4959                 "ld1w {z19.s}, p2/z, [sp, #-8, mul vl]");
4960   COMPARE_MACRO(Ld1w(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4961                 "ld1w {z23.d}, p3/z, [x1]");
4962   COMPARE_MACRO(Ld1w(z2.VnS(), p4.Zeroing(), SVEMemOperand(x1, x2, LSL, 2)),
4963                 "ld1w {z2.s}, p4/z, [x1, x2, lsl #2]");
4964   COMPARE_MACRO(Ld1w(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 2)),
4965                 "ld1w {z31.d}, p7/z, [x9, x9, lsl #2]");
4966 
4967   COMPARE_MACRO(Ld1d(z23.VnD(), p3.Zeroing(), SVEMemOperand(x1, 0, SVE_MUL_VL)),
4968                 "ld1d {z23.d}, p3/z, [x1]");
4969   COMPARE_MACRO(Ld1d(z31.VnD(), p7.Zeroing(), SVEMemOperand(x9, x9, LSL, 3)),
4970                 "ld1d {z31.d}, p7/z, [x9, x9, lsl #3]");
4971 
4972   // SVEMemOperand synthesis.
4973   // Check that the MacroAssembler falls back on `CalculateSVEAddress` at the
4974   // boundary conditions. We test this helper independently.
4975   COMPARE_MACRO(Ld1b(z10.VnB(), p7.Zeroing(), SVEMemOperand(x0, 8, SVE_MUL_VL)),
4976                 "addvl x16, x0, #8\n"
4977                 "ld1b {z10.b}, p7/z, [x16]");
4978   COMPARE_MACRO(Ld1h(z11.VnS(),
4979                      p5.Zeroing(),
4980                      SVEMemOperand(sp, -9, SVE_MUL_VL)),
4981                 "mov x16, #0xffffffffffffffdc\n"
4982                 "rdvl x17, #1\n"
4983                 "mul x16, x16, x17\n"
4984                 "asr x16, x16, #3\n"
4985                 "add x16, sp, x16\n"
4986                 "ld1h {z11.s}, p5/z, [x16]");
4987   COMPARE_MACRO(Ld1w(z22.VnS(), p3.Zeroing(), SVEMemOperand(sp, 42)),
4988                 "add x16, sp, #0x2a (42)\n"
4989                 "ld1w {z22.s}, p3/z, [x16]");
4990   COMPARE_MACRO(Ld1d(z22.VnD(), p1.Zeroing(), SVEMemOperand(x3, x4)),
4991                 "add x16, x3, x4\n"
4992                 "ld1d {z22.d}, p1/z, [x16]");
4993   COMPARE_MACRO(Ld1b(z30.VnD(), p0.Zeroing(), SVEMemOperand(x9, xzr)),
4994                 "ld1b {z30.d}, p0/z, [x9]");
4995   CLEANUP();
4996 }
4997 
TEST(sve_st2_scalar_plus_immediate)4998 TEST(sve_st2_scalar_plus_immediate) {
4999   SETUP();
5000 
5001   COMPARE(st2b(z31.VnB(), z0.VnB(), p6, SVEMemOperand(x19)),
5002           "st2b {z31.b, z0.b}, p6, [x19]");
5003   COMPARE(st2b(z31.VnB(), z0.VnB(), p6, SVEMemOperand(x19, 14, SVE_MUL_VL)),
5004           "st2b {z31.b, z0.b}, p6, [x19, #14, mul vl]");
5005   COMPARE(st2b(z15.VnB(), z16.VnB(), p6, SVEMemOperand(x19, -16, SVE_MUL_VL)),
5006           "st2b {z15.b, z16.b}, p6, [x19, #-16, mul vl]");
5007 
5008   COMPARE(st2h(z15.VnH(), z16.VnH(), p6, SVEMemOperand(x19)),
5009           "st2h {z15.h, z16.h}, p6, [x19]");
5010   COMPARE(st2h(z15.VnH(), z16.VnH(), p0, SVEMemOperand(x19, 14, SVE_MUL_VL)),
5011           "st2h {z15.h, z16.h}, p0, [x19, #14, mul vl]");
5012   COMPARE(st2h(z15.VnH(), z16.VnH(), p0, SVEMemOperand(x19, -16, SVE_MUL_VL)),
5013           "st2h {z15.h, z16.h}, p0, [x19, #-16, mul vl]");
5014 
5015   COMPARE(st2w(z0.VnS(), z1.VnS(), p0, SVEMemOperand(x19)),
5016           "st2w {z0.s, z1.s}, p0, [x19]");
5017   COMPARE(st2w(z0.VnS(), z1.VnS(), p0, SVEMemOperand(x19, 14, SVE_MUL_VL)),
5018           "st2w {z0.s, z1.s}, p0, [x19, #14, mul vl]");
5019   COMPARE(st2w(z0.VnS(), z1.VnS(), p7, SVEMemOperand(x19, -16, SVE_MUL_VL)),
5020           "st2w {z0.s, z1.s}, p7, [x19, #-16, mul vl]");
5021 
5022   COMPARE(st2d(z0.VnD(), z1.VnD(), p7, SVEMemOperand(x19)),
5023           "st2d {z0.d, z1.d}, p7, [x19]");
5024   COMPARE(st2d(z31.VnD(), z0.VnD(), p7, SVEMemOperand(x19, 14, SVE_MUL_VL)),
5025           "st2d {z31.d, z0.d}, p7, [x19, #14, mul vl]");
5026   COMPARE(st2d(z31.VnD(), z0.VnD(), p7, SVEMemOperand(x19, -16, SVE_MUL_VL)),
5027           "st2d {z31.d, z0.d}, p7, [x19, #-16, mul vl]");
5028 
5029   CLEANUP();
5030 }
5031 
TEST(sve_st3_scalar_plus_immediate)5032 TEST(sve_st3_scalar_plus_immediate) {
5033   SETUP();
5034 
5035   COMPARE(st3b(z30.VnB(), z31.VnB(), z0.VnB(), p7, SVEMemOperand(x19)),
5036           "st3b {z30.b, z31.b, z0.b}, p7, [x19]");
5037   COMPARE(st3b(z30.VnB(),
5038                z31.VnB(),
5039                z0.VnB(),
5040                p6,
5041                SVEMemOperand(x19, 21, SVE_MUL_VL)),
5042           "st3b {z30.b, z31.b, z0.b}, p6, [x19, #21, mul vl]");
5043   COMPARE(st3b(z30.VnB(),
5044                z31.VnB(),
5045                z0.VnB(),
5046                p6,
5047                SVEMemOperand(x19, -24, SVE_MUL_VL)),
5048           "st3b {z30.b, z31.b, z0.b}, p6, [x19, #-24, mul vl]");
5049 
5050   COMPARE(st3h(z15.VnH(), z16.VnH(), z17.VnH(), p6, SVEMemOperand(x19)),
5051           "st3h {z15.h, z16.h, z17.h}, p6, [x19]");
5052   COMPARE(st3h(z15.VnH(),
5053                z16.VnH(),
5054                z17.VnH(),
5055                p6,
5056                SVEMemOperand(x19, 21, SVE_MUL_VL)),
5057           "st3h {z15.h, z16.h, z17.h}, p6, [x19, #21, mul vl]");
5058   COMPARE(st3h(z15.VnH(),
5059                z16.VnH(),
5060                z17.VnH(),
5061                p0,
5062                SVEMemOperand(x19, -24, SVE_MUL_VL)),
5063           "st3h {z15.h, z16.h, z17.h}, p0, [x19, #-24, mul vl]");
5064 
5065   COMPARE(st3w(z15.VnS(), z16.VnS(), z17.VnS(), p0, SVEMemOperand(x19)),
5066           "st3w {z15.s, z16.s, z17.s}, p0, [x19]");
5067   COMPARE(st3w(z0.VnS(),
5068                z1.VnS(),
5069                z2.VnS(),
5070                p0,
5071                SVEMemOperand(x19, 21, SVE_MUL_VL)),
5072           "st3w {z0.s, z1.s, z2.s}, p0, [x19, #21, mul vl]");
5073   COMPARE(st3w(z0.VnS(),
5074                z1.VnS(),
5075                z2.VnS(),
5076                p0,
5077                SVEMemOperand(x19, -24, SVE_MUL_VL)),
5078           "st3w {z0.s, z1.s, z2.s}, p0, [x19, #-24, mul vl]");
5079 
5080   COMPARE(st3d(z0.VnD(), z1.VnD(), z2.VnD(), p7, SVEMemOperand(x19)),
5081           "st3d {z0.d, z1.d, z2.d}, p7, [x19]");
5082   COMPARE(st3d(z0.VnD(),
5083                z1.VnD(),
5084                z2.VnD(),
5085                p7,
5086                SVEMemOperand(x19, 21, SVE_MUL_VL)),
5087           "st3d {z0.d, z1.d, z2.d}, p7, [x19, #21, mul vl]");
5088   COMPARE(st3d(z30.VnD(),
5089                z31.VnD(),
5090                z0.VnD(),
5091                p7,
5092                SVEMemOperand(x19, -24, SVE_MUL_VL)),
5093           "st3d {z30.d, z31.d, z0.d}, p7, [x19, #-24, mul vl]");
5094 
5095   CLEANUP();
5096 }
5097 
TEST(sve_st4_scalar_plus_immediate)5098 TEST(sve_st4_scalar_plus_immediate) {
5099   SETUP();
5100 
5101   COMPARE(st4b(z31.VnB(), z0.VnB(), z1.VnB(), z2.VnB(), p7, SVEMemOperand(x19)),
5102           "st4b {z31.b, z0.b, z1.b, z2.b}, p7, [x19]");
5103   COMPARE(st4b(z31.VnB(),
5104                z0.VnB(),
5105                z1.VnB(),
5106                z2.VnB(),
5107                p7,
5108                SVEMemOperand(x19, 28, SVE_MUL_VL)),
5109           "st4b {z31.b, z0.b, z1.b, z2.b}, p7, [x19, #28, mul vl]");
5110   COMPARE(st4b(z31.VnB(),
5111                z0.VnB(),
5112                z1.VnB(),
5113                z2.VnB(),
5114                p6,
5115                SVEMemOperand(x19, -32, SVE_MUL_VL)),
5116           "st4b {z31.b, z0.b, z1.b, z2.b}, p6, [x19, #-32, mul vl]");
5117 
5118   COMPARE(st4h(z31.VnH(), z0.VnH(), z1.VnH(), z2.VnH(), p6, SVEMemOperand(x19)),
5119           "st4h {z31.h, z0.h, z1.h, z2.h}, p6, [x19]");
5120   COMPARE(st4h(z15.VnH(),
5121                z16.VnH(),
5122                z17.VnH(),
5123                z18.VnH(),
5124                p6,
5125                SVEMemOperand(x19, 28, SVE_MUL_VL)),
5126           "st4h {z15.h, z16.h, z17.h, z18.h}, p6, [x19, #28, mul vl]");
5127   COMPARE(st4h(z15.VnH(),
5128                z16.VnH(),
5129                z17.VnH(),
5130                z18.VnH(),
5131                p6,
5132                SVEMemOperand(x19, -32, SVE_MUL_VL)),
5133           "st4h {z15.h, z16.h, z17.h, z18.h}, p6, "
5134           "[x19, #-32, mul vl]");
5135 
5136   COMPARE(st4w(z15.VnS(),
5137                z16.VnS(),
5138                z17.VnS(),
5139                z18.VnS(),
5140                p0,
5141                SVEMemOperand(x19)),
5142           "st4w {z15.s, z16.s, z17.s, z18.s}, p0, [x19]");
5143   COMPARE(st4w(z15.VnS(),
5144                z16.VnS(),
5145                z17.VnS(),
5146                z18.VnS(),
5147                p0,
5148                SVEMemOperand(x19, 28, SVE_MUL_VL)),
5149           "st4w {z15.s, z16.s, z17.s, z18.s}, p0, [x19, #28, mul vl]");
5150   COMPARE(st4w(z0.VnS(),
5151                z1.VnS(),
5152                z2.VnS(),
5153                z3.VnS(),
5154                p0,
5155                SVEMemOperand(x19, -32, SVE_MUL_VL)),
5156           "st4w {z0.s, z1.s, z2.s, z3.s}, p0, [x19, #-32, mul vl]");
5157 
5158   COMPARE(st4d(z0.VnD(), z1.VnD(), z2.VnD(), z3.VnD(), p0, SVEMemOperand(x19)),
5159           "st4d {z0.d, z1.d, z2.d, z3.d}, p0, [x19]");
5160   COMPARE(st4d(z0.VnD(),
5161                z1.VnD(),
5162                z2.VnD(),
5163                z3.VnD(),
5164                p7,
5165                SVEMemOperand(x19, 28, SVE_MUL_VL)),
5166           "st4d {z0.d, z1.d, z2.d, z3.d}, p7, [x19, #28, mul vl]");
5167   COMPARE(st4d(z0.VnD(),
5168                z1.VnD(),
5169                z2.VnD(),
5170                z3.VnD(),
5171                p7,
5172                SVEMemOperand(x19, -32, SVE_MUL_VL)),
5173           "st4d {z0.d, z1.d, z2.d, z3.d}, p7, [x19, #-32, mul vl]");
5174 
5175   CLEANUP();
5176 }
5177 
TEST(sve_st2_scalar_plus_scalar)5178 TEST(sve_st2_scalar_plus_scalar) {
5179   SETUP();
5180 
5181   COMPARE(st2b(z25.VnB(), z26.VnB(), p1, SVEMemOperand(x20, x19)),
5182           "st2b {z25.b, z26.b}, p1, [x20, x19]");
5183   COMPARE(st2b(z25.VnB(), z26.VnB(), p1, SVEMemOperand(sp, x19)),
5184           "st2b {z25.b, z26.b}, p1, [sp, x19]");
5185   COMPARE(st2b(z31.VnB(), z0.VnB(), p1, SVEMemOperand(sp, x19)),
5186           "st2b {z31.b, z0.b}, p1, [sp, x19]");
5187 
5188   COMPARE(st2h(z31.VnH(), z0.VnH(), p1, SVEMemOperand(x20, x19, LSL, 1)),
5189           "st2h {z31.h, z0.h}, p1, [x20, x19, lsl #1]");
5190   COMPARE(st2h(z31.VnH(), z0.VnH(), p7, SVEMemOperand(sp, x19, LSL, 1)),
5191           "st2h {z31.h, z0.h}, p7, [sp, x19, lsl #1]");
5192   COMPARE(st2h(z31.VnH(), z0.VnH(), p7, SVEMemOperand(sp, x19, LSL, 1)),
5193           "st2h {z31.h, z0.h}, p7, [sp, x19, lsl #1]");
5194 
5195   COMPARE(st2w(z16.VnS(), z17.VnS(), p7, SVEMemOperand(x20, x19, LSL, 2)),
5196           "st2w {z16.s, z17.s}, p7, [x20, x19, lsl #2]");
5197   COMPARE(st2w(z16.VnS(), z17.VnS(), p7, SVEMemOperand(sp, x19, LSL, 2)),
5198           "st2w {z16.s, z17.s}, p7, [sp, x19, lsl #2]");
5199   COMPARE(st2w(z16.VnS(), z17.VnS(), p0, SVEMemOperand(sp, x19, LSL, 2)),
5200           "st2w {z16.s, z17.s}, p0, [sp, x19, lsl #2]");
5201 
5202   COMPARE(st2d(z16.VnD(), z17.VnD(), p0, SVEMemOperand(x20, x19, LSL, 3)),
5203           "st2d {z16.d, z17.d}, p0, [x20, x19, lsl #3]");
5204   COMPARE(st2d(z25.VnD(), z26.VnD(), p0, SVEMemOperand(sp, x19, LSL, 3)),
5205           "st2d {z25.d, z26.d}, p0, [sp, x19, lsl #3]");
5206   COMPARE(st2d(z25.VnD(), z26.VnD(), p0, SVEMemOperand(sp, x19, LSL, 3)),
5207           "st2d {z25.d, z26.d}, p0, [sp, x19, lsl #3]");
5208 
5209   CLEANUP();
5210 }
5211 
TEST(sve_st3_scalar_plus_scalar)5212 TEST(sve_st3_scalar_plus_scalar) {
5213   SETUP();
5214 
5215   COMPARE(st3b(z25.VnB(), z26.VnB(), z27.VnB(), p1, SVEMemOperand(x20, x19)),
5216           "st3b {z25.b, z26.b, z27.b}, p1, [x20, x19]");
5217   COMPARE(st3b(z25.VnB(), z26.VnB(), z27.VnB(), p1, SVEMemOperand(sp, x19)),
5218           "st3b {z25.b, z26.b, z27.b}, p1, [sp, x19]");
5219   COMPARE(st3b(z30.VnB(), z31.VnB(), z0.VnB(), p1, SVEMemOperand(sp, x19)),
5220           "st3b {z30.b, z31.b, z0.b}, p1, [sp, x19]");
5221 
5222   COMPARE(st3h(z30.VnH(),
5223                z31.VnH(),
5224                z0.VnH(),
5225                p1,
5226                SVEMemOperand(x20, x19, LSL, 1)),
5227           "st3h {z30.h, z31.h, z0.h}, p1, [x20, x19, lsl #1]");
5228   COMPARE(st3h(z30.VnH(),
5229                z31.VnH(),
5230                z0.VnH(),
5231                p7,
5232                SVEMemOperand(sp, x19, LSL, 1)),
5233           "st3h {z30.h, z31.h, z0.h}, p7, [sp, x19, lsl #1]");
5234   COMPARE(st3h(z30.VnH(),
5235                z31.VnH(),
5236                z0.VnH(),
5237                p7,
5238                SVEMemOperand(sp, x19, LSL, 1)),
5239           "st3h {z30.h, z31.h, z0.h}, p7, [sp, x19, lsl #1]");
5240 
5241   COMPARE(st3w(z16.VnS(),
5242                z17.VnS(),
5243                z18.VnS(),
5244                p7,
5245                SVEMemOperand(x20, x19, LSL, 2)),
5246           "st3w {z16.s, z17.s, z18.s}, p7, [x20, x19, lsl #2]");
5247   COMPARE(st3w(z16.VnS(),
5248                z17.VnS(),
5249                z18.VnS(),
5250                p7,
5251                SVEMemOperand(sp, x19, LSL, 2)),
5252           "st3w {z16.s, z17.s, z18.s}, p7, [sp, x19, lsl #2]");
5253   COMPARE(st3w(z16.VnS(),
5254                z17.VnS(),
5255                z18.VnS(),
5256                p0,
5257                SVEMemOperand(sp, x19, LSL, 2)),
5258           "st3w {z16.s, z17.s, z18.s}, p0, [sp, x19, lsl #2]");
5259 
5260   COMPARE(st3d(z16.VnD(),
5261                z17.VnD(),
5262                z18.VnD(),
5263                p0,
5264                SVEMemOperand(x20, x19, LSL, 3)),
5265           "st3d {z16.d, z17.d, z18.d}, p0, [x20, x19, lsl #3]");
5266   COMPARE(st3d(z25.VnD(),
5267                z26.VnD(),
5268                z27.VnD(),
5269                p0,
5270                SVEMemOperand(sp, x19, LSL, 3)),
5271           "st3d {z25.d, z26.d, z27.d}, p0, [sp, x19, lsl #3]");
5272   COMPARE(st3d(z25.VnD(),
5273                z26.VnD(),
5274                z27.VnD(),
5275                p0,
5276                SVEMemOperand(sp, x19, LSL, 3)),
5277           "st3d {z25.d, z26.d, z27.d}, p0, [sp, x19, lsl #3]");
5278 
5279   CLEANUP();
5280 }
5281 
TEST(sve_st4_scalar_plus_scalar)5282 TEST(sve_st4_scalar_plus_scalar) {
5283   SETUP();
5284 
5285   COMPARE(st4b(z25.VnB(),
5286                z26.VnB(),
5287                z27.VnB(),
5288                z28.VnB(),
5289                p0,
5290                SVEMemOperand(x20, x19)),
5291           "st4b {z25.b, z26.b, z27.b, z28.b}, p0, [x20, x19]");
5292   COMPARE(st4b(z25.VnB(),
5293                z26.VnB(),
5294                z27.VnB(),
5295                z28.VnB(),
5296                p1,
5297                SVEMemOperand(sp, x19)),
5298           "st4b {z25.b, z26.b, z27.b, z28.b}, p1, [sp, x19]");
5299   COMPARE(st4b(z25.VnB(),
5300                z26.VnB(),
5301                z27.VnB(),
5302                z28.VnB(),
5303                p1,
5304                SVEMemOperand(sp, x19)),
5305           "st4b {z25.b, z26.b, z27.b, z28.b}, p1, [sp, x19]");
5306 
5307   COMPARE(st4h(z31.VnH(),
5308                z0.VnH(),
5309                z1.VnH(),
5310                z2.VnH(),
5311                p1,
5312                SVEMemOperand(x20, x19, LSL, 1)),
5313           "st4h {z31.h, z0.h, z1.h, z2.h}, p1, [x20, x19, lsl #1]");
5314   COMPARE(st4h(z31.VnH(),
5315                z0.VnH(),
5316                z1.VnH(),
5317                z2.VnH(),
5318                p1,
5319                SVEMemOperand(sp, x19, LSL, 1)),
5320           "st4h {z31.h, z0.h, z1.h, z2.h}, p1, [sp, x19, lsl #1]");
5321   COMPARE(st4h(z31.VnH(),
5322                z0.VnH(),
5323                z1.VnH(),
5324                z2.VnH(),
5325                p7,
5326                SVEMemOperand(sp, x19, LSL, 1)),
5327           "st4h {z31.h, z0.h, z1.h, z2.h}, p7, [sp, x19, lsl #1]");
5328 
5329   COMPARE(st4w(z31.VnS(),
5330                z0.VnS(),
5331                z1.VnS(),
5332                z2.VnS(),
5333                p7,
5334                SVEMemOperand(x20, x19, LSL, 2)),
5335           "st4w {z31.s, z0.s, z1.s, z2.s}, p7, [x20, x19, lsl #2]");
5336   COMPARE(st4w(z16.VnS(),
5337                z17.VnS(),
5338                z18.VnS(),
5339                z19.VnS(),
5340                p7,
5341                SVEMemOperand(sp, x19, LSL, 2)),
5342           "st4w {z16.s, z17.s, z18.s, z19.s}, p7, [sp, x19, lsl #2]");
5343   COMPARE(st4w(z16.VnS(),
5344                z17.VnS(),
5345                z18.VnS(),
5346                z19.VnS(),
5347                p7,
5348                SVEMemOperand(sp, x19, LSL, 2)),
5349           "st4w {z16.s, z17.s, z18.s, z19.s}, p7, [sp, x19, lsl #2]");
5350 
5351   COMPARE(st4d(z16.VnD(),
5352                z17.VnD(),
5353                z18.VnD(),
5354                z19.VnD(),
5355                p0,
5356                SVEMemOperand(x20, x19, LSL, 3)),
5357           "st4d {z16.d, z17.d, z18.d, z19.d}, p0, [x20, x19, lsl #3]");
5358   COMPARE(st4d(z16.VnD(),
5359                z17.VnD(),
5360                z18.VnD(),
5361                z19.VnD(),
5362                p0,
5363                SVEMemOperand(sp, x19, LSL, 3)),
5364           "st4d {z16.d, z17.d, z18.d, z19.d}, p0, [sp, x19, lsl #3]");
5365   COMPARE(st4d(z25.VnD(),
5366                z26.VnD(),
5367                z27.VnD(),
5368                z28.VnD(),
5369                p0,
5370                SVEMemOperand(sp, x19, LSL, 3)),
5371           "st4d {z25.d, z26.d, z27.d, z28.d}, p0, [sp, x19, lsl #3]");
5372 
5373   CLEANUP();
5374 }
5375 
TEST(sve_mul_index)5376 TEST(sve_mul_index) {
5377   SETUP();
5378 
5379   COMPARE(sdot(z17.VnD(), z21.VnH(), z15.VnH(), 0),
5380           "sdot z17.d, z21.h, z15.h[0]");
5381   COMPARE(sdot(z28.VnS(), z9.VnB(), z7.VnB(), 1), "sdot z28.s, z9.b, z7.b[1]");
5382   COMPARE(udot(z26.VnD(), z15.VnH(), z1.VnH(), 1),
5383           "udot z26.d, z15.h, z1.h[1]");
5384   COMPARE(udot(z23.VnS(), z24.VnB(), z5.VnB(), 3),
5385           "udot z23.s, z24.b, z5.b[3]");
5386 
5387   CLEANUP();
5388 }
5389 
TEST(sve_mul_index_macro)5390 TEST(sve_mul_index_macro) {
5391   SETUP();
5392 
5393   COMPARE_MACRO(Sdot(z0.VnS(), z0.VnS(), z2.VnB(), z4.VnB(), 0),
5394                 "sdot z0.s, z2.b, z4.b[0]");
5395   COMPARE_MACRO(Sdot(z3.VnD(), z4.VnD(), z3.VnH(), z5.VnH(), 1),
5396                 "movprfx z31, z4\n"
5397                 "sdot z31.d, z3.h, z5.h[1]\n"
5398                 "mov z3.d, z31.d");
5399   COMPARE_MACRO(Sdot(z4.VnS(), z5.VnS(), z6.VnB(), z4.VnB(), 2),
5400                 "movprfx z31, z5\n"
5401                 "sdot z31.s, z6.b, z4.b[2]\n"
5402                 "mov z4.d, z31.d");
5403   COMPARE_MACRO(Sdot(z6.VnD(), z7.VnD(), z8.VnH(), z9.VnH(), 0),
5404                 "movprfx z6, z7\n"
5405                 "sdot z6.d, z8.h, z9.h[0]");
5406   COMPARE_MACRO(Sdot(z5.VnD(), z5.VnD(), z5.VnH(), z5.VnH(), 1),
5407                 "sdot z5.d, z5.h, z5.h[1]");
5408 
5409   COMPARE_MACRO(Udot(z0.VnD(), z0.VnD(), z2.VnH(), z4.VnH(), 1),
5410                 "udot z0.d, z2.h, z4.h[1]");
5411   COMPARE_MACRO(Udot(z3.VnS(), z4.VnS(), z3.VnB(), z5.VnB(), 3),
5412                 "movprfx z31, z4\n"
5413                 "udot z31.s, z3.b, z5.b[3]\n"
5414                 "mov z3.d, z31.d");
5415   COMPARE_MACRO(Udot(z4.VnD(), z5.VnD(), z6.VnH(), z4.VnH(), 0),
5416                 "movprfx z31, z5\n"
5417                 "udot z31.d, z6.h, z4.h[0]\n"
5418                 "mov z4.d, z31.d");
5419   COMPARE_MACRO(Udot(z9.VnS(), z8.VnS(), z7.VnB(), z6.VnB(), 2),
5420                 "movprfx z9, z8\n"
5421                 "udot z9.s, z7.b, z6.b[2]");
5422   COMPARE_MACRO(Udot(z5.VnS(), z5.VnS(), z5.VnB(), z5.VnB(), 1),
5423                 "udot z5.s, z5.b, z5.b[1]");
5424   CLEANUP();
5425 }
5426 
TEST(sve_partition_break)5427 TEST(sve_partition_break) {
5428   SETUP();
5429 
5430   COMPARE(brkas(p8.VnB(), p5.Zeroing(), p4.VnB()), "brkas p8.b, p5/z, p4.b");
5431   COMPARE(brka(p11.VnB(), p7.Zeroing(), p15.VnB()), "brka p11.b, p7/z, p15.b");
5432   COMPARE(brka(p12.VnB(), p8.Merging(), p13.VnB()), "brka p12.b, p8/m, p13.b");
5433   COMPARE(brkbs(p6.VnB(), p9.Zeroing(), p14.VnB()), "brkbs p6.b, p9/z, p14.b");
5434   COMPARE(brkb(p11.VnB(), p6.Zeroing(), p4.VnB()), "brkb p11.b, p6/z, p4.b");
5435   COMPARE(brkb(p12.VnB(), p7.Merging(), p5.VnB()), "brkb p12.b, p7/m, p5.b");
5436   COMPARE(brkns(p2.VnB(), p11.Zeroing(), p0.VnB(), p2.VnB()),
5437           "brkns p2.b, p11/z, p0.b, p2.b");
5438   COMPARE(brkn(p4.VnB(), p3.Zeroing(), p1.VnB(), p4.VnB()),
5439           "brkn p4.b, p3/z, p1.b, p4.b");
5440 
5441   COMPARE_MACRO(Brkns(p3.VnB(), p10.Zeroing(), p2.VnB(), p5.VnB()),
5442                 "mov p3.b, p5.b\n"
5443                 "brkns p3.b, p10/z, p2.b, p3.b");
5444   COMPARE_MACRO(Brkn(p5.VnB(), p4.Zeroing(), p3.VnB(), p7.VnB()),
5445                 "mov p5.b, p7.b\n"
5446                 "brkn p5.b, p4/z, p3.b, p5.b");
5447 
5448   CLEANUP();
5449 }
5450 
TEST(sve_permute_predicate)5451 TEST(sve_permute_predicate) {
5452   SETUP();
5453 
5454   COMPARE(rev(p15.VnB(), p6.VnB()), "rev p15.b, p6.b");
5455   COMPARE(rev(p15.VnH(), p6.VnH()), "rev p15.h, p6.h");
5456   COMPARE(rev(p15.VnS(), p6.VnS()), "rev p15.s, p6.s");
5457   COMPARE(rev(p15.VnD(), p6.VnD()), "rev p15.d, p6.d");
5458   COMPARE(trn1(p13.VnB(), p15.VnB(), p12.VnB()), "trn1 p13.b, p15.b, p12.b");
5459   COMPARE(trn1(p13.VnH(), p15.VnH(), p12.VnH()), "trn1 p13.h, p15.h, p12.h");
5460   COMPARE(trn1(p13.VnS(), p15.VnS(), p12.VnS()), "trn1 p13.s, p15.s, p12.s");
5461   COMPARE(trn1(p13.VnD(), p15.VnD(), p12.VnD()), "trn1 p13.d, p15.d, p12.d");
5462   COMPARE(trn2(p5.VnB(), p5.VnB(), p6.VnB()), "trn2 p5.b, p5.b, p6.b");
5463   COMPARE(trn2(p5.VnH(), p5.VnH(), p6.VnH()), "trn2 p5.h, p5.h, p6.h");
5464   COMPARE(trn2(p5.VnS(), p5.VnS(), p6.VnS()), "trn2 p5.s, p5.s, p6.s");
5465   COMPARE(trn2(p5.VnD(), p5.VnD(), p6.VnD()), "trn2 p5.d, p5.d, p6.d");
5466   COMPARE(uzp1(p14.VnB(), p4.VnB(), p14.VnB()), "uzp1 p14.b, p4.b, p14.b");
5467   COMPARE(uzp1(p14.VnH(), p4.VnH(), p14.VnH()), "uzp1 p14.h, p4.h, p14.h");
5468   COMPARE(uzp1(p14.VnS(), p4.VnS(), p14.VnS()), "uzp1 p14.s, p4.s, p14.s");
5469   COMPARE(uzp1(p14.VnD(), p4.VnD(), p14.VnD()), "uzp1 p14.d, p4.d, p14.d");
5470   COMPARE(uzp2(p6.VnB(), p11.VnB(), p2.VnB()), "uzp2 p6.b, p11.b, p2.b");
5471   COMPARE(uzp2(p6.VnH(), p11.VnH(), p2.VnH()), "uzp2 p6.h, p11.h, p2.h");
5472   COMPARE(uzp2(p6.VnS(), p11.VnS(), p2.VnS()), "uzp2 p6.s, p11.s, p2.s");
5473   COMPARE(uzp2(p6.VnD(), p11.VnD(), p2.VnD()), "uzp2 p6.d, p11.d, p2.d");
5474   COMPARE(zip1(p13.VnB(), p4.VnB(), p12.VnB()), "zip1 p13.b, p4.b, p12.b");
5475   COMPARE(zip1(p13.VnH(), p4.VnH(), p12.VnH()), "zip1 p13.h, p4.h, p12.h");
5476   COMPARE(zip1(p13.VnS(), p4.VnS(), p12.VnS()), "zip1 p13.s, p4.s, p12.s");
5477   COMPARE(zip1(p13.VnD(), p4.VnD(), p12.VnD()), "zip1 p13.d, p4.d, p12.d");
5478   COMPARE(zip2(p1.VnB(), p15.VnB(), p2.VnB()), "zip2 p1.b, p15.b, p2.b");
5479   COMPARE(zip2(p1.VnH(), p15.VnH(), p2.VnH()), "zip2 p1.h, p15.h, p2.h");
5480   COMPARE(zip2(p1.VnS(), p15.VnS(), p2.VnS()), "zip2 p1.s, p15.s, p2.s");
5481   COMPARE(zip2(p1.VnD(), p15.VnD(), p2.VnD()), "zip2 p1.d, p15.d, p2.d");
5482   COMPARE(punpkhi(p12.VnH(), p6.VnB()), "punpkhi p12.h, p6.b");
5483   COMPARE(punpklo(p4.VnH(), p14.VnB()), "punpklo p4.h, p14.b");
5484 
5485   CLEANUP();
5486 }
5487 
TEST(sve_permute_vector_extract)5488 TEST(sve_permute_vector_extract) {
5489   SETUP();
5490 
5491   COMPARE_MACRO(Ext(z10.VnB(), z10.VnB(), z2.VnB(), 0),
5492                 "ext z10.b, z10.b, z2.b, #0");
5493   COMPARE_MACRO(Ext(z10.VnB(), z10.VnB(), z2.VnB(), 1),
5494                 "ext z10.b, z10.b, z2.b, #1");
5495   COMPARE_MACRO(Ext(z2.VnB(), z2.VnB(), z10.VnB(), 254),
5496                 "ext z2.b, z2.b, z10.b, #254");
5497   COMPARE_MACRO(Ext(z2.VnB(), z2.VnB(), z10.VnB(), 255),
5498                 "ext z2.b, z2.b, z10.b, #255");
5499 
5500   CLEANUP();
5501 }
5502 
TEST(sve_permute_vector_interleaving)5503 TEST(sve_permute_vector_interleaving) {
5504   SETUP();
5505 
5506   COMPARE(trn1(z25.VnB(), z31.VnB(), z17.VnB()), "trn1 z25.b, z31.b, z17.b");
5507   COMPARE(trn1(z25.VnH(), z31.VnH(), z17.VnH()), "trn1 z25.h, z31.h, z17.h");
5508   COMPARE(trn1(z25.VnS(), z31.VnS(), z17.VnS()), "trn1 z25.s, z31.s, z17.s");
5509   COMPARE(trn1(z25.VnD(), z31.VnD(), z17.VnD()), "trn1 z25.d, z31.d, z17.d");
5510   COMPARE(trn2(z23.VnB(), z19.VnB(), z5.VnB()), "trn2 z23.b, z19.b, z5.b");
5511   COMPARE(trn2(z23.VnH(), z19.VnH(), z5.VnH()), "trn2 z23.h, z19.h, z5.h");
5512   COMPARE(trn2(z23.VnS(), z19.VnS(), z5.VnS()), "trn2 z23.s, z19.s, z5.s");
5513   COMPARE(trn2(z23.VnD(), z19.VnD(), z5.VnD()), "trn2 z23.d, z19.d, z5.d");
5514   COMPARE(uzp1(z3.VnB(), z27.VnB(), z10.VnB()), "uzp1 z3.b, z27.b, z10.b");
5515   COMPARE(uzp1(z3.VnH(), z27.VnH(), z10.VnH()), "uzp1 z3.h, z27.h, z10.h");
5516   COMPARE(uzp1(z3.VnS(), z27.VnS(), z10.VnS()), "uzp1 z3.s, z27.s, z10.s");
5517   COMPARE(uzp1(z3.VnD(), z27.VnD(), z10.VnD()), "uzp1 z3.d, z27.d, z10.d");
5518   COMPARE(uzp2(z22.VnB(), z26.VnB(), z15.VnB()), "uzp2 z22.b, z26.b, z15.b");
5519   COMPARE(uzp2(z22.VnH(), z26.VnH(), z15.VnH()), "uzp2 z22.h, z26.h, z15.h");
5520   COMPARE(uzp2(z22.VnS(), z26.VnS(), z15.VnS()), "uzp2 z22.s, z26.s, z15.s");
5521   COMPARE(uzp2(z22.VnD(), z26.VnD(), z15.VnD()), "uzp2 z22.d, z26.d, z15.d");
5522   COMPARE(zip1(z31.VnB(), z2.VnB(), z20.VnB()), "zip1 z31.b, z2.b, z20.b");
5523   COMPARE(zip1(z31.VnH(), z2.VnH(), z20.VnH()), "zip1 z31.h, z2.h, z20.h");
5524   COMPARE(zip1(z31.VnS(), z2.VnS(), z20.VnS()), "zip1 z31.s, z2.s, z20.s");
5525   COMPARE(zip1(z31.VnD(), z2.VnD(), z20.VnD()), "zip1 z31.d, z2.d, z20.d");
5526   COMPARE(zip2(z15.VnB(), z23.VnB(), z12.VnB()), "zip2 z15.b, z23.b, z12.b");
5527   COMPARE(zip2(z15.VnH(), z23.VnH(), z12.VnH()), "zip2 z15.h, z23.h, z12.h");
5528   COMPARE(zip2(z15.VnS(), z23.VnS(), z12.VnS()), "zip2 z15.s, z23.s, z12.s");
5529   COMPARE(zip2(z15.VnD(), z23.VnD(), z12.VnD()), "zip2 z15.d, z23.d, z12.d");
5530 
5531   CLEANUP();
5532 }
5533 
TEST(sve_cpy_reg)5534 TEST(sve_cpy_reg) {
5535   SETUP();
5536 
5537   COMPARE(cpy(z1.VnB(), p2.Merging(), wsp), "mov z1.b, p2/m, wsp");
5538   COMPARE(cpy(z2.VnH(), p6.Merging(), w3), "mov z2.h, p6/m, w3");
5539   COMPARE(cpy(z3.VnS(), p7.Merging(), x5), "mov z3.s, p7/m, w5");
5540   COMPARE(cpy(z4.VnD(), p7.Merging(), x30), "mov z4.d, p7/m, x30");
5541   COMPARE(cpy(z5.VnD(), p7.Merging(), sp), "mov z5.d, p7/m, sp");
5542 
5543   COMPARE(cpy(z27.VnB(), p3.Merging(), b23), "mov z27.b, p3/m, b23");
5544   COMPARE(cpy(z27.VnH(), p3.Merging(), h23), "mov z27.h, p3/m, h23");
5545   COMPARE(cpy(z27.VnS(), p3.Merging(), s23), "mov z27.s, p3/m, s23");
5546   COMPARE(cpy(z27.VnD(), p3.Merging(), d23), "mov z27.d, p3/m, d23");
5547 
5548   COMPARE(mov(z1.VnB(), p2.Merging(), wsp), "mov z1.b, p2/m, wsp");
5549   COMPARE(mov(z4.VnD(), p7.Merging(), x30), "mov z4.d, p7/m, x30");
5550   COMPARE(mov(z5.VnD(), p7.Merging(), sp), "mov z5.d, p7/m, sp");
5551   COMPARE(mov(z27.VnB(), p3.Merging(), b23), "mov z27.b, p3/m, b23");
5552   COMPARE(mov(z27.VnD(), p3.Merging(), d23), "mov z27.d, p3/m, d23");
5553 
5554   COMPARE_MACRO(Mov(z1.VnB(), p2.Merging(), wsp), "mov z1.b, p2/m, wsp");
5555   COMPARE_MACRO(Mov(z4.VnD(), p7.Merging(), x30), "mov z4.d, p7/m, x30");
5556   COMPARE_MACRO(Mov(z5.VnD(), p7.Merging(), sp), "mov z5.d, p7/m, sp");
5557   COMPARE_MACRO(Mov(z27.VnB(), p3.Merging(), b23), "mov z27.b, p3/m, b23");
5558   COMPARE_MACRO(Mov(z27.VnD(), p3.Merging(), d23), "mov z27.d, p3/m, d23");
5559 
5560   CLEANUP();
5561 }
5562 
TEST(sve_permute_vector_predicated)5563 TEST(sve_permute_vector_predicated) {
5564   SETUP();
5565 
5566   COMPARE(compact(z13.VnS(), p7, z1.VnS()), "compact z13.s, p7, z1.s");
5567   COMPARE(compact(z13.VnD(), p7, z1.VnD()), "compact z13.d, p7, z1.d");
5568   COMPARE(splice(z7.VnB(), p6, z7.VnB(), z2.VnB()),
5569           "splice z7.b, p6, z7.b, z2.b");
5570   COMPARE(splice(z7.VnH(), p6, z7.VnH(), z2.VnH()),
5571           "splice z7.h, p6, z7.h, z2.h");
5572   COMPARE(splice(z7.VnS(), p6, z7.VnS(), z2.VnS()),
5573           "splice z7.s, p6, z7.s, z2.s");
5574   COMPARE(splice(z7.VnD(), p6, z7.VnD(), z2.VnD()),
5575           "splice z7.d, p6, z7.d, z2.d");
5576 
5577   COMPARE_MACRO(Splice(z0.VnB(), p1, z2.VnB(), z4.VnB()),
5578                 "movprfx z0, z2\n"
5579                 "splice z0.b, p1, z0.b, z4.b");
5580   COMPARE_MACRO(Splice(z0.VnH(), p1, z2.VnH(), z0.VnH()),
5581                 "movprfx z31, z2\n"
5582                 "splice z31.h, p1, z31.h, z0.h\n"
5583                 "mov z0.d, z31.d");
5584 
5585   COMPARE(clasta(z4.VnB(), p2, z4.VnB(), z12.VnB()),
5586           "clasta z4.b, p2, z4.b, z12.b");
5587   COMPARE(clasta(z4.VnH(), p2, z4.VnH(), z12.VnH()),
5588           "clasta z4.h, p2, z4.h, z12.h");
5589   COMPARE(clasta(z4.VnS(), p2, z4.VnS(), z12.VnS()),
5590           "clasta z4.s, p2, z4.s, z12.s");
5591   COMPARE(clasta(z4.VnD(), p2, z4.VnD(), z12.VnD()),
5592           "clasta z4.d, p2, z4.d, z12.d");
5593   COMPARE(clastb(z29.VnB(), p7, z29.VnB(), z26.VnB()),
5594           "clastb z29.b, p7, z29.b, z26.b");
5595   COMPARE(clastb(z29.VnH(), p7, z29.VnH(), z26.VnH()),
5596           "clastb z29.h, p7, z29.h, z26.h");
5597   COMPARE(clastb(z29.VnS(), p7, z29.VnS(), z26.VnS()),
5598           "clastb z29.s, p7, z29.s, z26.s");
5599   COMPARE(clastb(z29.VnD(), p7, z29.VnD(), z26.VnD()),
5600           "clastb z29.d, p7, z29.d, z26.d");
5601 
5602   COMPARE_MACRO(Clasta(z5.VnD(), p2, z4.VnD(), z12.VnD()),
5603                 "movprfx z5, z4\n"
5604                 "clasta z5.d, p2, z5.d, z12.d");
5605   COMPARE_MACRO(Clastb(z30.VnD(), p7, z29.VnD(), z26.VnD()),
5606                 "movprfx z30, z29\n"
5607                 "clastb z30.d, p7, z30.d, z26.d");
5608   COMPARE_MACRO(Clasta(z9.VnH(), p3, z8.VnH(), z9.VnH()),
5609                 "movprfx z31, z8\n"
5610                 "clasta z31.h, p3, z31.h, z9.h\n"
5611                 "mov z9.d, z31.d");
5612   COMPARE_MACRO(Clastb(z1.VnS(), p1, z1.VnS(), z1.VnS()),
5613                 "clastb z1.s, p1, z1.s, z1.s");
5614 
5615   COMPARE(clasta(w6, p0, w6, z13.VnB()), "clasta w6, p0, w6, z13.b");
5616   COMPARE(clasta(w6, p0, w6, z13.VnH()), "clasta w6, p0, w6, z13.h");
5617   COMPARE(clasta(w6, p0, w6, z13.VnS()), "clasta w6, p0, w6, z13.s");
5618   COMPARE(clasta(x6, p0, x6, z13.VnD()), "clasta x6, p0, x6, z13.d");
5619   COMPARE(clastb(w21, p2, w21, z27.VnB()), "clastb w21, p2, w21, z27.b");
5620   COMPARE(clastb(w21, p2, w21, z27.VnH()), "clastb w21, p2, w21, z27.h");
5621   COMPARE(clastb(w21, p2, w21, z27.VnS()), "clastb w21, p2, w21, z27.s");
5622   COMPARE(clastb(x21, p2, x21, z27.VnD()), "clastb x21, p2, x21, z27.d");
5623 
5624   COMPARE(clasta(b8, p6, b8, z7.VnB()), "clasta b8, p6, b8, z7.b");
5625   COMPARE(clasta(h8, p6, h8, z7.VnH()), "clasta h8, p6, h8, z7.h");
5626   COMPARE(clasta(s8, p6, s8, z7.VnS()), "clasta s8, p6, s8, z7.s");
5627   COMPARE(clasta(d8, p6, d8, z7.VnD()), "clasta d8, p6, d8, z7.d");
5628   COMPARE(clastb(b17, p0, b17, z19.VnB()), "clastb b17, p0, b17, z19.b");
5629   COMPARE(clastb(h17, p0, h17, z19.VnH()), "clastb h17, p0, h17, z19.h");
5630   COMPARE(clastb(s17, p0, s17, z19.VnS()), "clastb s17, p0, s17, z19.s");
5631   COMPARE(clastb(d17, p0, d17, z19.VnD()), "clastb d17, p0, d17, z19.d");
5632 
5633   COMPARE(lasta(w15, p3, z3.VnB()), "lasta w15, p3, z3.b");
5634   COMPARE(lasta(w15, p3, z3.VnH()), "lasta w15, p3, z3.h");
5635   COMPARE(lasta(w15, p3, z3.VnS()), "lasta w15, p3, z3.s");
5636   COMPARE(lasta(x15, p3, z3.VnD()), "lasta x15, p3, z3.d");
5637   COMPARE(lasta(b30, p4, z24.VnB()), "lasta b30, p4, z24.b");
5638   COMPARE(lasta(h30, p4, z24.VnH()), "lasta h30, p4, z24.h");
5639   COMPARE(lasta(s30, p4, z24.VnS()), "lasta s30, p4, z24.s");
5640   COMPARE(lasta(d30, p4, z24.VnD()), "lasta d30, p4, z24.d");
5641 
5642   COMPARE(lastb(w9, p2, z16.VnB()), "lastb w9, p2, z16.b");
5643   COMPARE(lastb(w9, p2, z16.VnH()), "lastb w9, p2, z16.h");
5644   COMPARE(lastb(w9, p2, z16.VnS()), "lastb w9, p2, z16.s");
5645   COMPARE(lastb(x9, p2, z16.VnD()), "lastb x9, p2, z16.d");
5646   COMPARE(lastb(b14, p5, z2.VnB()), "lastb b14, p5, z2.b");
5647   COMPARE(lastb(h14, p5, z2.VnH()), "lastb h14, p5, z2.h");
5648   COMPARE(lastb(s14, p5, z2.VnS()), "lastb s14, p5, z2.s");
5649   COMPARE(lastb(d14, p5, z2.VnD()), "lastb d14, p5, z2.d");
5650 
5651   CLEANUP();
5652 }
5653 
TEST(sve_reverse)5654 TEST(sve_reverse) {
5655   SETUP();
5656 
5657   COMPARE_MACRO(Rbit(z22.VnB(), p2.Merging(), z24.VnB()),
5658                 "rbit z22.b, p2/m, z24.b");
5659   COMPARE_MACRO(Rbit(z22.VnH(), p2.Merging(), z24.VnH()),
5660                 "rbit z22.h, p2/m, z24.h");
5661   COMPARE_MACRO(Rbit(z22.VnS(), p2.Merging(), z24.VnS()),
5662                 "rbit z22.s, p2/m, z24.s");
5663   COMPARE_MACRO(Rbit(z22.VnD(), p2.Merging(), z24.VnD()),
5664                 "rbit z22.d, p2/m, z24.d");
5665   COMPARE_MACRO(Revb(z14.VnH(), p7.Merging(), z25.VnH()),
5666                 "revb z14.h, p7/m, z25.h");
5667   COMPARE_MACRO(Revb(z14.VnS(), p7.Merging(), z25.VnS()),
5668                 "revb z14.s, p7/m, z25.s");
5669   COMPARE_MACRO(Revb(z14.VnD(), p7.Merging(), z25.VnD()),
5670                 "revb z14.d, p7/m, z25.d");
5671   COMPARE_MACRO(Revh(z16.VnS(), p2.Merging(), z4.VnS()),
5672                 "revh z16.s, p2/m, z4.s");
5673   COMPARE_MACRO(Revh(z16.VnD(), p2.Merging(), z4.VnD()),
5674                 "revh z16.d, p2/m, z4.d");
5675   COMPARE_MACRO(Revw(z26.VnD(), p5.Merging(), z10.VnD()),
5676                 "revw z26.d, p5/m, z10.d");
5677 
5678   CLEANUP();
5679 }
5680 
TEST(sve_permute_vector_unpredicated)5681 TEST(sve_permute_vector_unpredicated) {
5682   SETUP();
5683 
5684   COMPARE(dup(z4.VnB(), w7), "mov z4.b, w7");
5685   COMPARE(dup(z5.VnH(), w6), "mov z5.h, w6");
5686   COMPARE(dup(z6.VnS(), sp), "mov z6.s, wsp");
5687   COMPARE(dup(z7.VnD(), x4), "mov z7.d, x4");
5688   COMPARE(dup(z25.VnQ(), z28.VnQ(), 2), "mov z25.q, z28.q[2]");
5689   COMPARE(dup(z26.VnH(), z12.VnH(), 0), "mov z26.h, h12");
5690 
5691   COMPARE(mov(z4.VnB(), w7), "mov z4.b, w7");
5692   COMPARE(mov(z5.VnH(), w6), "mov z5.h, w6");
5693   COMPARE(mov(z6.VnS(), sp), "mov z6.s, wsp");
5694   COMPARE(mov(z7.VnD(), x4), "mov z7.d, x4");
5695   COMPARE(mov(z25.VnQ(), z28.VnQ(), 2), "mov z25.q, z28.q[2]");
5696   COMPARE(mov(z0.VnS(), s1), "mov z0.s, s1");
5697 
5698   COMPARE_MACRO(Mov(z7.VnD(), x4), "mov z7.d, x4");
5699   COMPARE_MACRO(Mov(z25.VnQ(), z28.VnQ(), 2), "mov z25.q, z28.q[2]");
5700   COMPARE_MACRO(Mov(z2.VnB(), b13), "mov z2.b, b13");
5701   COMPARE_MACRO(Mov(z31.VnQ(), q31), "mov z31.q, q31");
5702 
5703   // Test dup with reserved tsz field.
5704   COMPARE_PREFIX(dci(0x05202000), "unimplemented");
5705 
5706   COMPARE(insr(z15.VnB(), w13), "insr z15.b, w13");
5707   COMPARE(insr(z16.VnH(), w14), "insr z16.h, w14");
5708   COMPARE(insr(z17.VnS(), w15), "insr z17.s, w15");
5709   COMPARE(insr(z18.VnD(), x16), "insr z18.d, x16");
5710   COMPARE(insr(z5.VnB(), b3), "insr z5.b, b3");
5711   COMPARE(insr(z6.VnH(), h15), "insr z6.h, h15");
5712   COMPARE(insr(z7.VnS(), s22), "insr z7.s, s22");
5713   COMPARE(insr(z8.VnD(), d30), "insr z8.d, d30");
5714   COMPARE(rev(z13.VnB(), z10.VnB()), "rev z13.b, z10.b");
5715   COMPARE(rev(z14.VnH(), z10.VnH()), "rev z14.h, z10.h");
5716   COMPARE(rev(z15.VnS(), z10.VnS()), "rev z15.s, z10.s");
5717   COMPARE(rev(z16.VnD(), z10.VnD()), "rev z16.d, z10.d");
5718   COMPARE(sunpkhi(z10.VnH(), z11.VnB()), "sunpkhi z10.h, z11.b");
5719   COMPARE(sunpkhi(z11.VnS(), z11.VnH()), "sunpkhi z11.s, z11.h");
5720   COMPARE(sunpkhi(z12.VnD(), z11.VnS()), "sunpkhi z12.d, z11.s");
5721   COMPARE(sunpklo(z20.VnH(), z12.VnB()), "sunpklo z20.h, z12.b");
5722   COMPARE(sunpklo(z21.VnS(), z12.VnH()), "sunpklo z21.s, z12.h");
5723   COMPARE(sunpklo(z22.VnD(), z12.VnS()), "sunpklo z22.d, z12.s");
5724   COMPARE(uunpkhi(z17.VnH(), z14.VnB()), "uunpkhi z17.h, z14.b");
5725   COMPARE(uunpkhi(z18.VnS(), z14.VnH()), "uunpkhi z18.s, z14.h");
5726   COMPARE(uunpkhi(z19.VnD(), z14.VnS()), "uunpkhi z19.d, z14.s");
5727   COMPARE(uunpklo(z27.VnH(), z6.VnB()), "uunpklo z27.h, z6.b");
5728   COMPARE(uunpklo(z28.VnS(), z6.VnH()), "uunpklo z28.s, z6.h");
5729   COMPARE(uunpklo(z29.VnD(), z6.VnS()), "uunpklo z29.d, z6.s");
5730   COMPARE(tbl(z24.VnB(), z29.VnB(), z0.VnB()), "tbl z24.b, {z29.b}, z0.b");
5731   COMPARE(tbl(z25.VnH(), z29.VnH(), z1.VnH()), "tbl z25.h, {z29.h}, z1.h");
5732   COMPARE(tbl(z26.VnS(), z29.VnS(), z2.VnS()), "tbl z26.s, {z29.s}, z2.s");
5733   COMPARE(tbl(z27.VnD(), z29.VnD(), z3.VnD()), "tbl z27.d, {z29.d}, z3.d");
5734 
5735   CLEANUP();
5736 }
5737 
TEST(sve_predicate_count)5738 TEST(sve_predicate_count) {
5739   SETUP();
5740 
5741   COMPARE(cntp(x9, p1, p0.VnB()), "cntp x9, p1, p0.b");
5742   COMPARE(cntp(x10, p12, p1.VnH()), "cntp x10, p12, p1.h");
5743   COMPARE(cntp(x11, p13, p14.VnS()), "cntp x11, p13, p14.s");
5744   COMPARE(cntp(x12, p4, p15.VnD()), "cntp x12, p4, p15.d");
5745 
5746   COMPARE_MACRO(Cntp(x0, p1, p2.VnB()), "cntp x0, p1, p2.b");
5747   COMPARE_MACRO(Cntp(w10, p11, p12.VnH()), "cntp x10, p11, p12.h");
5748 
5749   CLEANUP();
5750 }
5751 
TEST(sve_predicate_logical_op)5752 TEST(sve_predicate_logical_op) {
5753   SETUP();
5754 
5755   COMPARE(ands(p13.VnB(), p9.Zeroing(), p5.VnB(), p15.VnB()),
5756           "ands p13.b, p9/z, p5.b, p15.b");
5757   COMPARE(and_(p9.VnB(), p3.Zeroing(), p0.VnB(), p14.VnB()),
5758           "and p9.b, p3/z, p0.b, p14.b");
5759   COMPARE(bics(p8.VnB(), p5.Zeroing(), p3.VnB(), p1.VnB()),
5760           "bics p8.b, p5/z, p3.b, p1.b");
5761   COMPARE(bic(p5.VnB(), p5.Zeroing(), p9.VnB(), p9.VnB()),
5762           "bic p5.b, p5/z, p9.b, p9.b");
5763   COMPARE(eors(p11.VnB(), p1.Zeroing(), p1.VnB(), p2.VnB()),
5764           "eors p11.b, p1/z, p1.b, p2.b");
5765   COMPARE(eor(p8.VnB(), p6.Zeroing(), p1.VnB(), p11.VnB()),
5766           "eor p8.b, p6/z, p1.b, p11.b");
5767   COMPARE(nands(p13.VnB(), p0.Zeroing(), p9.VnB(), p4.VnB()),
5768           "nands p13.b, p0/z, p9.b, p4.b");
5769   COMPARE(nand(p7.VnB(), p7.Zeroing(), p15.VnB(), p2.VnB()),
5770           "nand p7.b, p7/z, p15.b, p2.b");
5771   COMPARE(nors(p8.VnB(), p8.Zeroing(), p12.VnB(), p11.VnB()),
5772           "nors p8.b, p8/z, p12.b, p11.b");
5773   COMPARE(nor(p3.VnB(), p6.Zeroing(), p15.VnB(), p12.VnB()),
5774           "nor p3.b, p6/z, p15.b, p12.b");
5775   COMPARE(orns(p10.VnB(), p11.Zeroing(), p0.VnB(), p15.VnB()),
5776           "orns p10.b, p11/z, p0.b, p15.b");
5777   COMPARE(orn(p0.VnB(), p1.Zeroing(), p7.VnB(), p4.VnB()),
5778           "orn p0.b, p1/z, p7.b, p4.b");
5779   COMPARE(orrs(p14.VnB(), p6.Zeroing(), p1.VnB(), p5.VnB()),
5780           "orrs p14.b, p6/z, p1.b, p5.b");
5781   COMPARE(orr(p13.VnB(), p7.Zeroing(), p10.VnB(), p4.VnB()),
5782           "orr p13.b, p7/z, p10.b, p4.b");
5783   COMPARE(sel(p9.VnB(), p15, p15.VnB(), p7.VnB()),
5784           "sel p9.b, p15, p15.b, p7.b");
5785 
5786   // Aliases.
5787   COMPARE(eor(p7.VnB(), p6.Zeroing(), p1.VnB(), p6.VnB()),
5788           "not p7.b, p6/z, p1.b");
5789   COMPARE(not_(p7.VnB(), p6.Zeroing(), p1.VnB()), "not p7.b, p6/z, p1.b");
5790   COMPARE(eors(p6.VnB(), p5.Zeroing(), p2.VnB(), p5.VnB()),
5791           "nots p6.b, p5/z, p2.b");
5792   COMPARE(nots(p6.VnB(), p5.Zeroing(), p2.VnB()), "nots p6.b, p5/z, p2.b");
5793   COMPARE(ands(p5.VnB(), p4.Zeroing(), p3.VnB(), p3.VnB()),
5794           "movs p5.b, p4/z, p3.b");
5795   COMPARE(movs(p5.VnB(), p4.Zeroing(), p3.VnB()), "movs p5.b, p4/z, p3.b");
5796   COMPARE(and_(p5.VnB(), p4.Zeroing(), p3.VnB(), p3.VnB()),
5797           "mov p5.b, p4/z, p3.b");
5798   COMPARE(mov(p5.VnB(), p4.Zeroing(), p3.VnB()), "mov p5.b, p4/z, p3.b");
5799   COMPARE(orrs(p4.VnB(), p3.Zeroing(), p3.VnB(), p3.VnB()), "movs p4.b, p3.b");
5800   COMPARE(movs(p4.VnB(), p3.VnB()), "movs p4.b, p3.b");
5801   COMPARE(orr(p4.VnB(), p3.Zeroing(), p3.VnB(), p3.VnB()), "mov p4.b, p3.b");
5802   COMPARE(mov(p4.VnB(), p3.VnB()), "mov p4.b, p3.b");
5803   COMPARE(sel(p3.VnB(), p2, p4.VnB(), p3.VnB()), "mov p3.b, p2/m, p4.b");
5804   COMPARE(mov(p3.VnB(), p2.Merging(), p4.VnB()), "mov p3.b, p2/m, p4.b");
5805 
5806   COMPARE_MACRO(Not(p7.VnB(), p6.Zeroing(), p1.VnB()), "not p7.b, p6/z, p1.b");
5807   COMPARE_MACRO(Nots(p6.VnB(), p5.Zeroing(), p2.VnB()),
5808                 "nots p6.b, p5/z, p2.b");
5809   COMPARE_MACRO(Movs(p5.VnB(), p4.Zeroing(), p3.VnB()),
5810                 "movs p5.b, p4/z, p3.b");
5811   COMPARE_MACRO(Mov(p5.VnB(), p4.Zeroing(), p3.VnB()), "mov p5.b, p4/z, p3.b");
5812   COMPARE_MACRO(Movs(p4.VnB(), p3.VnB()), "movs p4.b, p3.b");
5813   COMPARE_MACRO(Mov(p4, p3), "mov p4.b, p3.b");
5814   COMPARE_MACRO(Mov(p3.VnB(), p2.Merging(), p4.VnB()), "mov p3.b, p2/m, p4.b");
5815 
5816   CLEANUP();
5817 }
5818 
TEST(sve_predicate_first_active)5819 TEST(sve_predicate_first_active) {
5820   SETUP();
5821 
5822   COMPARE(pfirst(p0.VnB(), p7, p0.VnB()), "pfirst p0.b, p7, p0.b");
5823   COMPARE(pfirst(p7.VnB(), p0, p7.VnB()), "pfirst p7.b, p0, p7.b");
5824 
5825   COMPARE_MACRO(Pfirst(p1.VnB(), p2, p1.VnB()), "pfirst p1.b, p2, p1.b");
5826   COMPARE_MACRO(Pfirst(p3.VnB(), p4, p5.VnB()),
5827                 "mov p3.b, p5.b\n"
5828                 "pfirst p3.b, p4, p3.b");
5829 
5830   {
5831     UseScratchRegisterScope temps(&masm);
5832     temps.Include(p7, p15);
5833     COMPARE_MACRO(Pfirst(p6.VnB(), p6, p0.VnB()),
5834                   "mov p15.b, p6.b\n"
5835                   "mov p6.b, p0.b\n"
5836                   "pfirst p6.b, p15, p6.b");
5837   }
5838 
5839   CLEANUP();
5840 }
5841 
TEST(sve_predicate_next_active)5842 TEST(sve_predicate_next_active) {
5843   SETUP();
5844 
5845   COMPARE(pnext(p0.VnB(), p8, p0.VnB()), "pnext p0.b, p8, p0.b");
5846   COMPARE(pnext(p1.VnH(), p9, p1.VnH()), "pnext p1.h, p9, p1.h");
5847   COMPARE(pnext(p2.VnS(), p10, p2.VnS()), "pnext p2.s, p10, p2.s");
5848   COMPARE(pnext(p3.VnD(), p11, p3.VnD()), "pnext p3.d, p11, p3.d");
5849 
5850   COMPARE(pnext(p12.VnB(), p4, p12.VnB()), "pnext p12.b, p4, p12.b");
5851   COMPARE(pnext(p13.VnH(), p5, p13.VnH()), "pnext p13.h, p5, p13.h");
5852   COMPARE(pnext(p14.VnS(), p6, p14.VnS()), "pnext p14.s, p6, p14.s");
5853   COMPARE(pnext(p15.VnD(), p7, p15.VnD()), "pnext p15.d, p7, p15.d");
5854 
5855   COMPARE_MACRO(Pnext(p5.VnB(), p9, p5.VnB()), "pnext p5.b, p9, p5.b");
5856   COMPARE_MACRO(Pnext(p6.VnH(), p8, p6.VnH()), "pnext p6.h, p8, p6.h");
5857   COMPARE_MACRO(Pnext(p7.VnS(), p5, p7.VnS()), "pnext p7.s, p5, p7.s");
5858   COMPARE_MACRO(Pnext(p8.VnD(), p6, p8.VnD()), "pnext p8.d, p6, p8.d");
5859 
5860   COMPARE_MACRO(Pnext(p6.VnB(), p4, p5.VnB()),
5861                 "mov p6.b, p5.b\n"
5862                 "pnext p6.b, p4, p6.b");
5863   COMPARE_MACRO(Pnext(p7.VnH(), p3, p8.VnH()),
5864                 "mov p7.b, p8.b\n"
5865                 "pnext p7.h, p3, p7.h");
5866   COMPARE_MACRO(Pnext(p8.VnS(), p2, p9.VnS()),
5867                 "mov p8.b, p9.b\n"
5868                 "pnext p8.s, p2, p8.s");
5869   COMPARE_MACRO(Pnext(p9.VnD(), p1, p10.VnD()),
5870                 "mov p9.b, p10.b\n"
5871                 "pnext p9.d, p1, p9.d");
5872 
5873   {
5874     UseScratchRegisterScope temps(&masm);
5875     temps.Include(p7, p8);
5876     COMPARE_MACRO(Pnext(p6.VnB(), p6, p0.VnB()),
5877                   "mov p8.b, p6.b\n"
5878                   "mov p6.b, p0.b\n"
5879                   "pnext p6.b, p8, p6.b");
5880     COMPARE_MACRO(Pnext(p7.VnH(), p7, p1.VnH()),
5881                   "mov p8.b, p7.b\n"
5882                   "mov p7.b, p1.b\n"
5883                   "pnext p7.h, p8, p7.h");
5884     COMPARE_MACRO(Pnext(p10.VnS(), p10, p2.VnS()),
5885                   "mov p8.b, p10.b\n"
5886                   "mov p10.b, p2.b\n"
5887                   "pnext p10.s, p8, p10.s");
5888     COMPARE_MACRO(Pnext(p11.VnD(), p11, p3.VnD()),
5889                   "mov p8.b, p11.b\n"
5890                   "mov p11.b, p3.b\n"
5891                   "pnext p11.d, p8, p11.d");
5892   }
5893 
5894   CLEANUP();
5895 }
5896 
TEST(sve_predicate_initialize)5897 TEST(sve_predicate_initialize) {
5898   SETUP();
5899 
5900   // Basic forms.
5901   COMPARE(ptrue(p0.VnB(), SVE_POW2), "ptrue p0.b, pow2");
5902   COMPARE(ptrue(p1.VnH(), SVE_VL1), "ptrue p1.h, vl1");
5903   COMPARE(ptrue(p2.VnS(), SVE_VL8), "ptrue p2.s, vl8");
5904   COMPARE(ptrue(p3.VnD(), SVE_VL16), "ptrue p3.d, vl16");
5905   COMPARE(ptrue(p4.VnB(), SVE_VL256), "ptrue p4.b, vl256");
5906   COMPARE(ptrue(p5.VnH(), SVE_MUL3), "ptrue p5.h, mul3");
5907   COMPARE(ptrue(p6.VnS(), SVE_MUL4), "ptrue p6.s, mul4");
5908   COMPARE(ptrue(p7.VnD(), SVE_ALL), "ptrue p7.d");
5909 
5910   COMPARE(ptrues(p8.VnB(), SVE_ALL), "ptrues p8.b");
5911   COMPARE(ptrues(p9.VnH(), SVE_MUL4), "ptrues p9.h, mul4");
5912   COMPARE(ptrues(p10.VnS(), SVE_MUL3), "ptrues p10.s, mul3");
5913   COMPARE(ptrues(p11.VnD(), SVE_VL256), "ptrues p11.d, vl256");
5914   COMPARE(ptrues(p12.VnB(), SVE_VL16), "ptrues p12.b, vl16");
5915   COMPARE(ptrues(p13.VnH(), SVE_VL8), "ptrues p13.h, vl8");
5916   COMPARE(ptrues(p14.VnS(), SVE_VL1), "ptrues p14.s, vl1");
5917   COMPARE(ptrues(p15.VnD(), SVE_POW2), "ptrues p15.d, pow2");
5918 
5919   // The Assembler supports arbitrary immediates.
5920   COMPARE(ptrue(p7.VnS(), 0xd), "ptrue p7.s, vl256");
5921   COMPARE(ptrue(p8.VnD(), 0xe), "ptrue p8.d, #0xe");
5922   COMPARE(ptrue(p9.VnB(), 0x15), "ptrue p9.b, #0x15");
5923   COMPARE(ptrue(p10.VnH(), 0x19), "ptrue p10.h, #0x19");
5924   COMPARE(ptrue(p11.VnS(), 0x1a), "ptrue p11.s, #0x1a");
5925   COMPARE(ptrue(p12.VnD(), 0x1c), "ptrue p12.d, #0x1c");
5926   COMPARE(ptrue(p13.VnB(), 0x1d), "ptrue p13.b, mul4");
5927 
5928   COMPARE(ptrues(p14.VnS(), 0xd), "ptrues p14.s, vl256");
5929   COMPARE(ptrues(p15.VnD(), 0xe), "ptrues p15.d, #0xe");
5930   COMPARE(ptrues(p0.VnB(), 0x15), "ptrues p0.b, #0x15");
5931   COMPARE(ptrues(p1.VnH(), 0x19), "ptrues p1.h, #0x19");
5932   COMPARE(ptrues(p2.VnS(), 0x1a), "ptrues p2.s, #0x1a");
5933   COMPARE(ptrues(p3.VnD(), 0x1c), "ptrues p3.d, #0x1c");
5934   COMPARE(ptrues(p4.VnB(), 0x1d), "ptrues p4.b, mul4");
5935 
5936   // SVE_ALL is the default.
5937   COMPARE(ptrue(p15.VnS()), "ptrue p15.s");
5938   COMPARE(ptrues(p0.VnS()), "ptrues p0.s");
5939 
5940   // The MacroAssembler provides a `FlagsUpdate` argument.
5941   COMPARE_MACRO(Ptrue(p0.VnB(), SVE_MUL3), "ptrue p0.b, mul3");
5942   COMPARE_MACRO(Ptrues(p1.VnH(), SVE_MUL4), "ptrues p1.h, mul4");
5943   COMPARE_MACRO(Ptrue(p2.VnS(), SVE_VL32, LeaveFlags), "ptrue p2.s, vl32");
5944   COMPARE_MACRO(Ptrue(p3.VnD(), SVE_VL64, SetFlags), "ptrues p3.d, vl64");
5945 }
5946 
TEST(sve_pfalse)5947 TEST(sve_pfalse) {
5948   SETUP();
5949 
5950   COMPARE(pfalse(p0.VnB()), "pfalse p0.b");
5951   COMPARE(pfalse(p15.VnB()), "pfalse p15.b");
5952 
5953   COMPARE_MACRO(Pfalse(p1.VnB()), "pfalse p1.b");
5954   COMPARE_MACRO(Pfalse(p4.VnH()), "pfalse p4.b");
5955   COMPARE_MACRO(Pfalse(p9.VnS()), "pfalse p9.b");
5956   COMPARE_MACRO(Pfalse(p14.VnD()), "pfalse p14.b");
5957 }
5958 
TEST(sve_ptest)5959 TEST(sve_ptest) {
5960   SETUP();
5961 
5962   COMPARE(ptest(p15, p0.VnB()), "ptest p15, p0.b");
5963   COMPARE(ptest(p0, p15.VnB()), "ptest p0, p15.b");
5964   COMPARE(ptest(p6, p6.VnB()), "ptest p6, p6.b");
5965 
5966   COMPARE_MACRO(Ptest(p0, p1.VnB()), "ptest p0, p1.b");
5967 }
5968 
TEST(sve_lane_size_relaxing)5969 TEST(sve_lane_size_relaxing) {
5970   SETUP();
5971 
5972   COMPARE_MACRO(Rdffr(p3), "rdffr p3.b");
5973   COMPARE_MACRO(Rdffr(p8.VnB()), "rdffr p8.b");
5974 
5975   COMPARE_MACRO(Wrffr(p9), "wrffr p9.b");
5976   COMPARE_MACRO(Wrffr(p8.VnB()), "wrffr p8.b");
5977 
5978   COMPARE_MACRO(And(z10, z1, z15), "and z10.d, z1.d, z15.d");
5979   COMPARE_MACRO(Bic(z11, z2, z16), "bic z11.d, z2.d, z16.d");
5980   COMPARE_MACRO(Eor(z12, z3, z17), "eor z12.d, z3.d, z17.d");
5981   COMPARE_MACRO(Orr(z13, z4, z18), "orr z13.d, z4.d, z18.d");
5982 
5983   COMPARE_MACRO(And(z10.VnD(), z1.VnD(), z15.VnD()), "and z10.d, z1.d, z15.d");
5984   COMPARE_MACRO(Bic(z11.VnS(), z2.VnS(), z16.VnS()), "bic z11.d, z2.d, z16.d");
5985   COMPARE_MACRO(Eor(z12.VnH(), z3.VnH(), z17.VnH()), "eor z12.d, z3.d, z17.d");
5986   COMPARE_MACRO(Orr(z13.VnB(), z4.VnB(), z18.VnB()), "orr z13.d, z4.d, z18.d");
5987 
5988   COMPARE_MACRO(Pfalse(p1), "pfalse p1.b");
5989 
5990   CLEANUP();
5991 }
5992 
TEST(sve_read_ffr)5993 TEST(sve_read_ffr) {
5994   SETUP();
5995 
5996   COMPARE(rdffr(p13.VnB()), "rdffr p13.b");
5997   COMPARE(rdffrs(p14.VnB(), p9.Zeroing()), "rdffrs p14.b, p9/z");
5998   COMPARE(rdffr(p5.VnB(), p14.Zeroing()), "rdffr p5.b, p14/z");
5999 
6000   CLEANUP();
6001 }
6002 
TEST(sve_propagate_break)6003 TEST(sve_propagate_break) {
6004   SETUP();
6005 
6006   COMPARE(brkpas(p12.VnB(), p0.Zeroing(), p12.VnB(), p11.VnB()),
6007           "brkpas p12.b, p0/z, p12.b, p11.b");
6008   COMPARE(brkpa(p1.VnB(), p2.Zeroing(), p13.VnB(), p8.VnB()),
6009           "brkpa p1.b, p2/z, p13.b, p8.b");
6010   COMPARE(brkpbs(p14.VnB(), p1.Zeroing(), p8.VnB(), p3.VnB()),
6011           "brkpbs p14.b, p1/z, p8.b, p3.b");
6012   COMPARE(brkpb(p2.VnB(), p5.Zeroing(), p0.VnB(), p14.VnB()),
6013           "brkpb p2.b, p5/z, p0.b, p14.b");
6014 
6015   CLEANUP();
6016 }
6017 
TEST(sve_stack_allocation)6018 TEST(sve_stack_allocation) {
6019   SETUP();
6020 
6021   COMPARE(rdvl(x26, 0), "rdvl x26, #0");
6022   COMPARE(rdvl(x27, 31), "rdvl x27, #31");
6023   COMPARE(rdvl(x28, -32), "rdvl x28, #-32");
6024   COMPARE(rdvl(xzr, 9), "rdvl xzr, #9");
6025 
6026   COMPARE(addvl(x6, x20, 0), "addvl x6, x20, #0");
6027   COMPARE(addvl(x7, x21, 31), "addvl x7, x21, #31");
6028   COMPARE(addvl(x8, x22, -32), "addvl x8, x22, #-32");
6029   COMPARE(addvl(sp, x1, 5), "addvl sp, x1, #5");
6030   COMPARE(addvl(x9, sp, -16), "addvl x9, sp, #-16");
6031 
6032   COMPARE(addpl(x20, x6, 0), "addpl x20, x6, #0");
6033   COMPARE(addpl(x21, x7, 31), "addpl x21, x7, #31");
6034   COMPARE(addpl(x22, x8, -32), "addpl x22, x8, #-32");
6035   COMPARE(addpl(sp, x1, 5), "addpl sp, x1, #5");
6036   COMPARE(addpl(x9, sp, -16), "addpl x9, sp, #-16");
6037 
6038   CLEANUP();
6039 }
6040 
TEST(sve_rdvl_macro)6041 TEST(sve_rdvl_macro) {
6042   SETUP();
6043 
6044   // Encodable cases use rdvl directly.
6045   COMPARE_MACRO(Rdvl(x0, 3), "rdvl x0, #3");
6046   COMPARE_MACRO(Rdvl(x0, 31), "rdvl x0, #31");
6047   COMPARE_MACRO(Rdvl(x0, -32), "rdvl x0, #-32");
6048 
6049   // Unencodable cases fall back on `xn + (VL * multiplier)`.
6050   COMPARE_MACRO(Rdvl(x2, 0x1234),
6051                 "mov x2, #0x1234\n"
6052                 "rdvl x16, #1\n"
6053                 "mul x2, x2, x16");
6054 
6055   CLEANUP();
6056 }
6057 
TEST(sve_addvl_macro)6058 TEST(sve_addvl_macro) {
6059   SETUP();
6060 
6061   // Encodable cases use addvl directly.
6062   COMPARE_MACRO(Addvl(sp, sp, -3), "addvl sp, sp, #-3");
6063   COMPARE_MACRO(Addvl(x0, x1, 8), "addvl x0, x1, #8");
6064 
6065   // If xn is xzr, `Addvl` behaves like `Rdvl`.
6066   COMPARE_MACRO(Addvl(x7, xzr, 8), "rdvl x7, #8");
6067 
6068   // Unencodable cases fall back on `xn + (VL * multiplier)`.
6069   COMPARE_MACRO(Addvl(x7, x8, 42),
6070                 "mov x7, #0x2a\n"
6071                 "rdvl x16, #1\n"
6072                 "madd x7, x7, x16, x8");
6073   COMPARE_MACRO(Addvl(x10, x10, 42),
6074                 "mov x16, #0x2a\n"
6075                 "rdvl x17, #1\n"
6076                 "madd x10, x16, x17, x10");
6077   COMPARE_MACRO(Addvl(x10, sp, 42),
6078                 "mov x10, #0x2a\n"
6079                 "rdvl x16, #1\n"
6080                 "mul x10, x10, x16\n"
6081                 "add x10, sp, x10");
6082   COMPARE_MACRO(Addvl(sp, x10, 42),
6083                 "mov x16, #0x2a\n"
6084                 "rdvl x17, #1\n"
6085                 "mul x16, x16, x17\n"
6086                 "add sp, x10, x16");
6087 
6088   CLEANUP();
6089 }
6090 
TEST(sve_rdpl_macro)6091 TEST(sve_rdpl_macro) {
6092   SETUP();
6093 
6094   // There is no `rdpl` instruction. `Rdpl` is implemented as `Addpl` (with
6095   // xzr). However, since `addpl` operates on the stack pointer, some special
6096   // cases exist.
6097 
6098   // If the multiplier is a multiple of 8, `Rdpl` will pass through to `Rdvl`.
6099   COMPARE_MACRO(Rdpl(x0, 0), "rdvl x0, #0");
6100   COMPARE_MACRO(Rdpl(x0, 8), "rdvl x0, #1");
6101 
6102   // If the multiplier is encodable with `addpl`, we use that with an
6103   // explicitly-zeroed register.
6104   COMPARE_MACRO(Rdpl(x1, 7),
6105                 "mov x1, #0x0\n"
6106                 "addpl x1, x1, #7");
6107   COMPARE_MACRO(Rdpl(x1, -31),
6108                 "mov x1, #0x0\n"
6109                 "addpl x1, x1, #-31");
6110 
6111   // All other cases use `Rdvl`, and scale the result.
6112   COMPARE_MACRO(Rdpl(x2, 37),
6113                 "mov x2, #0x25\n"
6114                 "rdvl x16, #1\n"
6115                 "mul x2, x2, x16\n"
6116                 "asr x2, x2, #3");
6117 
6118   CLEANUP();
6119 }
6120 
TEST(sve_addpl_macro)6121 TEST(sve_addpl_macro) {
6122   SETUP();
6123 
6124   // Encodable cases use addpl directly.
6125   COMPARE_MACRO(Addpl(x22, x22, -3), "addpl x22, x22, #-3");
6126   COMPARE_MACRO(Addpl(x10, x11, 8), "addpl x10, x11, #8");
6127   COMPARE_MACRO(Addpl(x7, sp, 31), "addpl x7, sp, #31");
6128 
6129   // Otherwise, if the multiplier is a multiple of 8, `Addpl` will pass through
6130   // to `Addvl`.
6131   COMPARE_MACRO(Addpl(sp, x0, 48), "addvl sp, x0, #6");
6132   COMPARE_MACRO(Addpl(x2, sp, -48), "addvl x2, sp, #-6");
6133 
6134   // If xn is xzr, `Addpl` behaves like `Rdpl`.
6135   COMPARE_MACRO(Addpl(x7, xzr, 8), "rdvl x7, #1");
6136   COMPARE_MACRO(Addpl(x29, xzr, 13),
6137                 "mov x29, #0x0\n"
6138                 "addpl x29, x29, #13");
6139 
6140   // All other cases use `Rdvl`, and scale the result before adding it to `xn`.
6141   // Where possible, the scaling `asr` is merged with the `add`.
6142   COMPARE_MACRO(Addpl(x7, x8, 123),
6143                 "mov x7, #0x7b\n"
6144                 "rdvl x16, #1\n"
6145                 "mul x7, x7, x16\n"
6146                 "add x7, x8, x7, asr #3");
6147   COMPARE_MACRO(Addpl(x9, x9, 122),
6148                 "mov x16, #0x7a\n"
6149                 "rdvl x17, #1\n"
6150                 "mul x16, x16, x17\n"
6151                 "add x9, x9, x16, asr #3");
6152   // If the stack pointer is used, the `asr` and `add` must be separate.
6153   COMPARE_MACRO(Addpl(sp, x0, 33),
6154                 "mov x16, #0x21\n"
6155                 "rdvl x17, #1\n"
6156                 "mul x16, x16, x17\n"
6157                 "asr x16, x16, #3\n"
6158                 "add sp, x0, x16");
6159 
6160   CLEANUP();
6161 }
6162 
TEST(sve_vector_select)6163 TEST(sve_vector_select) {
6164   SETUP();
6165 
6166   COMPARE_MACRO(Sel(z13.VnB(), p3, z3.VnB(), z25.VnB()),
6167                 "sel z13.b, p3, z3.b, z25.b");
6168   COMPARE_MACRO(Sel(z13.VnH(), p3, z3.VnH(), z25.VnH()),
6169                 "sel z13.h, p3, z3.h, z25.h");
6170   COMPARE_MACRO(Sel(z13.VnS(), p3, z3.VnS(), z25.VnS()),
6171                 "sel z13.s, p3, z3.s, z25.s");
6172   COMPARE_MACRO(Sel(z13.VnD(), p3, z3.VnD(), z25.VnD()),
6173                 "sel z13.d, p3, z3.d, z25.d");
6174 
6175   // Check sel() where zd == zm disassemble as predicated mov.
6176   COMPARE_MACRO(Sel(z1.VnB(), p4.Merging(), z30.VnB(), z1.VnB()),
6177                 "mov z1.b, p4/m, z30.b");
6178   COMPARE_MACRO(Sel(z1.VnH(), p4.Merging(), z30.VnH(), z1.VnH()),
6179                 "mov z1.h, p4/m, z30.h");
6180   COMPARE_MACRO(Sel(z1.VnS(), p4.Merging(), z30.VnS(), z1.VnS()),
6181                 "mov z1.s, p4/m, z30.s");
6182   COMPARE_MACRO(Sel(z1.VnD(), p4.Merging(), z30.VnD(), z1.VnD()),
6183                 "mov z1.d, p4/m, z30.d");
6184 
6185   // Check predicated mov() directly.
6186   COMPARE_MACRO(Mov(z2.VnB(), p10.Merging(), z22.VnB()),
6187                 "mov z2.b, p10/m, z22.b");
6188   COMPARE_MACRO(Mov(z2.VnH(), p10.Merging(), z22.VnH()),
6189                 "mov z2.h, p10/m, z22.h");
6190   COMPARE_MACRO(Mov(z2.VnS(), p10.Merging(), z22.VnS()),
6191                 "mov z2.s, p10/m, z22.s");
6192   COMPARE_MACRO(Mov(z2.VnD(), p10.Merging(), z22.VnD()),
6193                 "mov z2.d, p10/m, z22.d");
6194 
6195   CLEANUP();
6196 }
6197 
TEST(sve_write_ffr)6198 TEST(sve_write_ffr) {
6199   SETUP();
6200 
6201   COMPARE_PREFIX(setffr(), "setffr");
6202   COMPARE(wrffr(p9.VnB()), "wrffr p9.b");
6203 
6204   CLEANUP();
6205 }
6206 
TEST(sve2_match_nmatch)6207 TEST(sve2_match_nmatch) {
6208   SETUP();
6209 
6210   COMPARE(match(p15.VnB(), p1.Zeroing(), z18.VnB(), z5.VnB()),
6211           "match p15.b, p1/z, z18.b, z5.b");
6212   COMPARE(match(p15.VnH(), p1.Zeroing(), z18.VnH(), z5.VnH()),
6213           "match p15.h, p1/z, z18.h, z5.h");
6214   COMPARE(nmatch(p1.VnB(), p1.Zeroing(), z20.VnB(), z17.VnB()),
6215           "nmatch p1.b, p1/z, z20.b, z17.b");
6216   COMPARE(nmatch(p1.VnH(), p1.Zeroing(), z20.VnH(), z17.VnH()),
6217           "nmatch p1.h, p1/z, z20.h, z17.h");
6218 
6219   CLEANUP();
6220 }
6221 
TEST(sve2_saba_uaba)6222 TEST(sve2_saba_uaba) {
6223   SETUP();
6224 
6225   COMPARE(saba(z13.VnB(), z2.VnB(), z31.VnB()), "saba z13.b, z2.b, z31.b");
6226   COMPARE(saba(z13.VnD(), z2.VnD(), z31.VnD()), "saba z13.d, z2.d, z31.d");
6227   COMPARE(saba(z13.VnH(), z2.VnH(), z31.VnH()), "saba z13.h, z2.h, z31.h");
6228   COMPARE(saba(z13.VnS(), z2.VnS(), z31.VnS()), "saba z13.s, z2.s, z31.s");
6229   COMPARE(uaba(z23.VnB(), z22.VnB(), z20.VnB()), "uaba z23.b, z22.b, z20.b");
6230   COMPARE(uaba(z23.VnD(), z22.VnD(), z20.VnD()), "uaba z23.d, z22.d, z20.d");
6231   COMPARE(uaba(z23.VnH(), z22.VnH(), z20.VnH()), "uaba z23.h, z22.h, z20.h");
6232   COMPARE(uaba(z23.VnS(), z22.VnS(), z20.VnS()), "uaba z23.s, z22.s, z20.s");
6233 
6234   COMPARE_MACRO(Saba(z12.VnB(), z12.VnB(), z3.VnB(), z30.VnB()),
6235                 "saba z12.b, z3.b, z30.b");
6236   COMPARE_MACRO(Saba(z12.VnB(), z12.VnB(), z3.VnB(), z12.VnB()),
6237                 "saba z12.b, z3.b, z12.b");
6238   COMPARE_MACRO(Saba(z12.VnB(), z12.VnB(), z12.VnB(), z30.VnB()),
6239                 "saba z12.b, z12.b, z30.b");
6240   COMPARE_MACRO(Saba(z12.VnB(), z12.VnB(), z12.VnB(), z12.VnB()), "");
6241   COMPARE_MACRO(Saba(z12.VnB(), z13.VnB(), z3.VnB(), z30.VnB()),
6242                 "movprfx z12, z13\n"
6243                 "saba z12.b, z3.b, z30.b");
6244   COMPARE_MACRO(Saba(z12.VnB(), z3.VnB(), z3.VnB(), z30.VnB()),
6245                 "movprfx z12, z3\n"
6246                 "saba z12.b, z3.b, z30.b");
6247   COMPARE_MACRO(Saba(z12.VnB(), z30.VnB(), z3.VnB(), z30.VnB()),
6248                 "movprfx z12, z30\n"
6249                 "saba z12.b, z3.b, z30.b");
6250   COMPARE_MACRO(Saba(z12.VnB(), z3.VnB(), z3.VnB(), z3.VnB()),
6251                 "mov z12.d, z3.d");
6252   COMPARE_MACRO(Saba(z12.VnB(), z3.VnB(), z12.VnB(), z3.VnB()),
6253                 "mov z31.d, z12.d\n"
6254                 "movprfx z12, z3\n"
6255                 "saba z12.b, z31.b, z3.b");
6256   COMPARE_MACRO(Saba(z12.VnB(), z3.VnB(), z3.VnB(), z12.VnB()),
6257                 "mov z31.d, z12.d\n"
6258                 "movprfx z12, z3\n"
6259                 "saba z12.b, z3.b, z31.b");
6260 
6261   COMPARE_MACRO(Uaba(z12.VnB(), z12.VnB(), z3.VnB(), z30.VnB()),
6262                 "uaba z12.b, z3.b, z30.b");
6263   COMPARE_MACRO(Uaba(z12.VnB(), z12.VnB(), z3.VnB(), z12.VnB()),
6264                 "uaba z12.b, z3.b, z12.b");
6265   COMPARE_MACRO(Uaba(z12.VnB(), z12.VnB(), z12.VnB(), z30.VnB()),
6266                 "uaba z12.b, z12.b, z30.b");
6267   COMPARE_MACRO(Uaba(z12.VnB(), z12.VnB(), z12.VnB(), z12.VnB()), "");
6268   COMPARE_MACRO(Uaba(z12.VnB(), z13.VnB(), z3.VnB(), z30.VnB()),
6269                 "movprfx z12, z13\n"
6270                 "uaba z12.b, z3.b, z30.b");
6271   COMPARE_MACRO(Uaba(z12.VnB(), z3.VnB(), z3.VnB(), z30.VnB()),
6272                 "movprfx z12, z3\n"
6273                 "uaba z12.b, z3.b, z30.b");
6274   COMPARE_MACRO(Uaba(z12.VnB(), z30.VnB(), z3.VnB(), z30.VnB()),
6275                 "movprfx z12, z30\n"
6276                 "uaba z12.b, z3.b, z30.b");
6277   COMPARE_MACRO(Uaba(z12.VnB(), z3.VnB(), z3.VnB(), z3.VnB()),
6278                 "mov z12.d, z3.d");
6279   COMPARE_MACRO(Uaba(z12.VnB(), z3.VnB(), z12.VnB(), z3.VnB()),
6280                 "mov z31.d, z12.d\n"
6281                 "movprfx z12, z3\n"
6282                 "uaba z12.b, z31.b, z3.b");
6283   COMPARE_MACRO(Uaba(z12.VnB(), z3.VnB(), z3.VnB(), z12.VnB()),
6284                 "mov z31.d, z12.d\n"
6285                 "movprfx z12, z3\n"
6286                 "uaba z12.b, z3.b, z31.b");
6287 
6288   CLEANUP();
6289 }
6290 
TEST(sve2_halving_arithmetic)6291 TEST(sve2_halving_arithmetic) {
6292   SETUP();
6293 
6294   COMPARE(shadd(z20.VnB(), p3.Merging(), z20.VnB(), z7.VnB()),
6295           "shadd z20.b, p3/m, z20.b, z7.b");
6296   COMPARE(shadd(z20.VnD(), p3.Merging(), z20.VnD(), z7.VnD()),
6297           "shadd z20.d, p3/m, z20.d, z7.d");
6298   COMPARE(shadd(z20.VnH(), p3.Merging(), z20.VnH(), z7.VnH()),
6299           "shadd z20.h, p3/m, z20.h, z7.h");
6300   COMPARE(shadd(z20.VnS(), p3.Merging(), z20.VnS(), z7.VnS()),
6301           "shadd z20.s, p3/m, z20.s, z7.s");
6302   COMPARE(shsub(z21.VnB(), p0.Merging(), z21.VnB(), z0.VnB()),
6303           "shsub z21.b, p0/m, z21.b, z0.b");
6304   COMPARE(shsub(z21.VnD(), p0.Merging(), z21.VnD(), z0.VnD()),
6305           "shsub z21.d, p0/m, z21.d, z0.d");
6306   COMPARE(shsub(z21.VnH(), p0.Merging(), z21.VnH(), z0.VnH()),
6307           "shsub z21.h, p0/m, z21.h, z0.h");
6308   COMPARE(shsub(z21.VnS(), p0.Merging(), z21.VnS(), z0.VnS()),
6309           "shsub z21.s, p0/m, z21.s, z0.s");
6310   COMPARE(shsubr(z1.VnB(), p0.Merging(), z1.VnB(), z2.VnB()),
6311           "shsubr z1.b, p0/m, z1.b, z2.b");
6312   COMPARE(shsubr(z1.VnD(), p0.Merging(), z1.VnD(), z2.VnD()),
6313           "shsubr z1.d, p0/m, z1.d, z2.d");
6314   COMPARE(shsubr(z1.VnH(), p0.Merging(), z1.VnH(), z2.VnH()),
6315           "shsubr z1.h, p0/m, z1.h, z2.h");
6316   COMPARE(shsubr(z1.VnS(), p0.Merging(), z1.VnS(), z2.VnS()),
6317           "shsubr z1.s, p0/m, z1.s, z2.s");
6318   COMPARE(srhadd(z23.VnB(), p4.Merging(), z23.VnB(), z14.VnB()),
6319           "srhadd z23.b, p4/m, z23.b, z14.b");
6320   COMPARE(srhadd(z23.VnD(), p4.Merging(), z23.VnD(), z14.VnD()),
6321           "srhadd z23.d, p4/m, z23.d, z14.d");
6322   COMPARE(srhadd(z23.VnH(), p4.Merging(), z23.VnH(), z14.VnH()),
6323           "srhadd z23.h, p4/m, z23.h, z14.h");
6324   COMPARE(srhadd(z23.VnS(), p4.Merging(), z23.VnS(), z14.VnS()),
6325           "srhadd z23.s, p4/m, z23.s, z14.s");
6326 
6327   COMPARE(uhadd(z21.VnB(), p2.Merging(), z21.VnB(), z19.VnB()),
6328           "uhadd z21.b, p2/m, z21.b, z19.b");
6329   COMPARE(uhadd(z21.VnD(), p2.Merging(), z21.VnD(), z19.VnD()),
6330           "uhadd z21.d, p2/m, z21.d, z19.d");
6331   COMPARE(uhadd(z21.VnH(), p2.Merging(), z21.VnH(), z19.VnH()),
6332           "uhadd z21.h, p2/m, z21.h, z19.h");
6333   COMPARE(uhadd(z21.VnS(), p2.Merging(), z21.VnS(), z19.VnS()),
6334           "uhadd z21.s, p2/m, z21.s, z19.s");
6335   COMPARE(uhsub(z1.VnB(), p4.Merging(), z1.VnB(), z9.VnB()),
6336           "uhsub z1.b, p4/m, z1.b, z9.b");
6337   COMPARE(uhsub(z1.VnD(), p4.Merging(), z1.VnD(), z9.VnD()),
6338           "uhsub z1.d, p4/m, z1.d, z9.d");
6339   COMPARE(uhsub(z1.VnH(), p4.Merging(), z1.VnH(), z9.VnH()),
6340           "uhsub z1.h, p4/m, z1.h, z9.h");
6341   COMPARE(uhsub(z1.VnS(), p4.Merging(), z1.VnS(), z9.VnS()),
6342           "uhsub z1.s, p4/m, z1.s, z9.s");
6343   COMPARE(uhsubr(z18.VnB(), p0.Merging(), z18.VnB(), z1.VnB()),
6344           "uhsubr z18.b, p0/m, z18.b, z1.b");
6345   COMPARE(uhsubr(z18.VnD(), p0.Merging(), z18.VnD(), z1.VnD()),
6346           "uhsubr z18.d, p0/m, z18.d, z1.d");
6347   COMPARE(uhsubr(z18.VnH(), p0.Merging(), z18.VnH(), z1.VnH()),
6348           "uhsubr z18.h, p0/m, z18.h, z1.h");
6349   COMPARE(uhsubr(z18.VnS(), p0.Merging(), z18.VnS(), z1.VnS()),
6350           "uhsubr z18.s, p0/m, z18.s, z1.s");
6351   COMPARE(urhadd(z29.VnB(), p4.Merging(), z29.VnB(), z10.VnB()),
6352           "urhadd z29.b, p4/m, z29.b, z10.b");
6353   COMPARE(urhadd(z29.VnD(), p4.Merging(), z29.VnD(), z10.VnD()),
6354           "urhadd z29.d, p4/m, z29.d, z10.d");
6355   COMPARE(urhadd(z29.VnH(), p4.Merging(), z29.VnH(), z10.VnH()),
6356           "urhadd z29.h, p4/m, z29.h, z10.h");
6357   COMPARE(urhadd(z29.VnS(), p4.Merging(), z29.VnS(), z10.VnS()),
6358           "urhadd z29.s, p4/m, z29.s, z10.s");
6359 
6360   COMPARE_MACRO(Shadd(z0.VnB(), p0.Merging(), z1.VnB(), z2.VnB()),
6361                 "movprfx z0.b, p0/m, z1.b\n"
6362                 "shadd z0.b, p0/m, z0.b, z2.b");
6363   COMPARE_MACRO(Shadd(z0.VnB(), p0.Merging(), z1.VnB(), z0.VnB()),
6364                 "shadd z0.b, p0/m, z0.b, z1.b");
6365   COMPARE_MACRO(Srhadd(z0.VnB(), p0.Merging(), z1.VnB(), z2.VnB()),
6366                 "movprfx z0.b, p0/m, z1.b\n"
6367                 "srhadd z0.b, p0/m, z0.b, z2.b");
6368   COMPARE_MACRO(Srhadd(z0.VnB(), p0.Merging(), z1.VnB(), z0.VnB()),
6369                 "srhadd z0.b, p0/m, z0.b, z1.b");
6370   COMPARE_MACRO(Uhadd(z0.VnB(), p0.Merging(), z1.VnB(), z2.VnB()),
6371                 "movprfx z0.b, p0/m, z1.b\n"
6372                 "uhadd z0.b, p0/m, z0.b, z2.b");
6373   COMPARE_MACRO(Uhadd(z0.VnB(), p0.Merging(), z1.VnB(), z0.VnB()),
6374                 "uhadd z0.b, p0/m, z0.b, z1.b");
6375   COMPARE_MACRO(Urhadd(z0.VnB(), p0.Merging(), z1.VnB(), z2.VnB()),
6376                 "movprfx z0.b, p0/m, z1.b\n"
6377                 "urhadd z0.b, p0/m, z0.b, z2.b");
6378   COMPARE_MACRO(Urhadd(z0.VnB(), p0.Merging(), z1.VnB(), z0.VnB()),
6379                 "urhadd z0.b, p0/m, z0.b, z1.b");
6380 
6381   COMPARE_MACRO(Shsub(z0.VnB(), p0.Merging(), z0.VnB(), z1.VnB()),
6382                 "shsub z0.b, p0/m, z0.b, z1.b");
6383   COMPARE_MACRO(Shsub(z0.VnB(), p0.Merging(), z1.VnB(), z0.VnB()),
6384                 "shsubr z0.b, p0/m, z0.b, z1.b");
6385   COMPARE_MACRO(Uhsub(z0.VnB(), p0.Merging(), z0.VnB(), z1.VnB()),
6386                 "uhsub z0.b, p0/m, z0.b, z1.b");
6387   COMPARE_MACRO(Uhsub(z0.VnB(), p0.Merging(), z1.VnB(), z0.VnB()),
6388                 "uhsubr z0.b, p0/m, z0.b, z1.b");
6389 
6390   CLEANUP();
6391 }
6392 
TEST(sve2_sra)6393 TEST(sve2_sra) {
6394   SETUP();
6395 
6396   COMPARE(ssra(z0.VnB(), z8.VnB(), 1), "ssra z0.b, z8.b, #1");
6397   COMPARE(ssra(z0.VnB(), z8.VnB(), 2), "ssra z0.b, z8.b, #2");
6398   COMPARE(ssra(z0.VnB(), z8.VnB(), 5), "ssra z0.b, z8.b, #5");
6399   COMPARE(ssra(z0.VnB(), z8.VnB(), 8), "ssra z0.b, z8.b, #8");
6400   COMPARE(ssra(z0.VnH(), z8.VnH(), 1), "ssra z0.h, z8.h, #1");
6401   COMPARE(ssra(z0.VnH(), z8.VnH(), 16), "ssra z0.h, z8.h, #16");
6402   COMPARE(ssra(z0.VnS(), z8.VnS(), 1), "ssra z0.s, z8.s, #1");
6403   COMPARE(ssra(z0.VnS(), z8.VnS(), 31), "ssra z0.s, z8.s, #31");
6404   COMPARE(ssra(z0.VnD(), z8.VnD(), 1), "ssra z0.d, z8.d, #1");
6405   COMPARE(ssra(z0.VnD(), z8.VnD(), 64), "ssra z0.d, z8.d, #64");
6406 
6407   COMPARE(srsra(z0.VnB(), z8.VnB(), 1), "srsra z0.b, z8.b, #1");
6408   COMPARE(srsra(z0.VnB(), z8.VnB(), 2), "srsra z0.b, z8.b, #2");
6409   COMPARE(srsra(z0.VnB(), z8.VnB(), 5), "srsra z0.b, z8.b, #5");
6410   COMPARE(srsra(z0.VnB(), z8.VnB(), 8), "srsra z0.b, z8.b, #8");
6411   COMPARE(srsra(z0.VnH(), z8.VnH(), 1), "srsra z0.h, z8.h, #1");
6412   COMPARE(srsra(z0.VnH(), z8.VnH(), 16), "srsra z0.h, z8.h, #16");
6413   COMPARE(srsra(z0.VnS(), z8.VnS(), 1), "srsra z0.s, z8.s, #1");
6414   COMPARE(srsra(z0.VnS(), z8.VnS(), 31), "srsra z0.s, z8.s, #31");
6415   COMPARE(srsra(z0.VnD(), z8.VnD(), 1), "srsra z0.d, z8.d, #1");
6416   COMPARE(srsra(z0.VnD(), z8.VnD(), 64), "srsra z0.d, z8.d, #64");
6417 
6418   COMPARE(usra(z0.VnB(), z8.VnB(), 1), "usra z0.b, z8.b, #1");
6419   COMPARE(usra(z0.VnB(), z8.VnB(), 2), "usra z0.b, z8.b, #2");
6420   COMPARE(usra(z0.VnB(), z8.VnB(), 5), "usra z0.b, z8.b, #5");
6421   COMPARE(usra(z0.VnB(), z8.VnB(), 8), "usra z0.b, z8.b, #8");
6422   COMPARE(usra(z0.VnH(), z8.VnH(), 1), "usra z0.h, z8.h, #1");
6423   COMPARE(usra(z0.VnH(), z8.VnH(), 16), "usra z0.h, z8.h, #16");
6424   COMPARE(usra(z0.VnS(), z8.VnS(), 1), "usra z0.s, z8.s, #1");
6425   COMPARE(usra(z0.VnS(), z8.VnS(), 31), "usra z0.s, z8.s, #31");
6426   COMPARE(usra(z0.VnD(), z8.VnD(), 1), "usra z0.d, z8.d, #1");
6427   COMPARE(usra(z0.VnD(), z8.VnD(), 64), "usra z0.d, z8.d, #64");
6428 
6429   COMPARE(ursra(z0.VnB(), z8.VnB(), 1), "ursra z0.b, z8.b, #1");
6430   COMPARE(ursra(z0.VnB(), z8.VnB(), 2), "ursra z0.b, z8.b, #2");
6431   COMPARE(ursra(z0.VnB(), z8.VnB(), 5), "ursra z0.b, z8.b, #5");
6432   COMPARE(ursra(z0.VnB(), z8.VnB(), 8), "ursra z0.b, z8.b, #8");
6433   COMPARE(ursra(z0.VnH(), z8.VnH(), 1), "ursra z0.h, z8.h, #1");
6434   COMPARE(ursra(z0.VnH(), z8.VnH(), 16), "ursra z0.h, z8.h, #16");
6435   COMPARE(ursra(z0.VnS(), z8.VnS(), 1), "ursra z0.s, z8.s, #1");
6436   COMPARE(ursra(z0.VnS(), z8.VnS(), 31), "ursra z0.s, z8.s, #31");
6437   COMPARE(ursra(z0.VnD(), z8.VnD(), 1), "ursra z0.d, z8.d, #1");
6438   COMPARE(ursra(z0.VnD(), z8.VnD(), 64), "ursra z0.d, z8.d, #64");
6439 
6440   COMPARE_MACRO(Ssra(z0.VnB(), z1.VnB(), z2.VnB(), 2),
6441                 "movprfx z0, z1\n"
6442                 "ssra z0.b, z2.b, #2");
6443   COMPARE_MACRO(Ssra(z0.VnB(), z0.VnB(), z2.VnB(), 2), "ssra z0.b, z2.b, #2");
6444   COMPARE_MACRO(Ssra(z0.VnB(), z1.VnB(), z1.VnB(), 2),
6445                 "movprfx z0, z1\n"
6446                 "ssra z0.b, z1.b, #2");
6447   COMPARE_MACRO(Ssra(z2.VnB(), z1.VnB(), z2.VnB(), 2),
6448                 "mov z31.d, z2.d\n"
6449                 "movprfx z2, z1\n"
6450                 "ssra z2.b, z31.b, #2");
6451   COMPARE_MACRO(Ssra(z0.VnB(), z0.VnB(), z0.VnB(), 2), "ssra z0.b, z0.b, #2");
6452 
6453   COMPARE_MACRO(Srsra(z2.VnB(), z1.VnB(), z2.VnB(), 2),
6454                 "mov z31.d, z2.d\n"
6455                 "movprfx z2, z1\n"
6456                 "srsra z2.b, z31.b, #2");
6457   COMPARE_MACRO(Usra(z2.VnB(), z1.VnB(), z2.VnB(), 2),
6458                 "mov z31.d, z2.d\n"
6459                 "movprfx z2, z1\n"
6460                 "usra z2.b, z31.b, #2");
6461   COMPARE_MACRO(Ursra(z2.VnB(), z1.VnB(), z2.VnB(), 2),
6462                 "mov z31.d, z2.d\n"
6463                 "movprfx z2, z1\n"
6464                 "ursra z2.b, z31.b, #2");
6465   CLEANUP();
6466 }
6467 
TEST(sve2_sri_sli)6468 TEST(sve2_sri_sli) {
6469   SETUP();
6470 
6471   COMPARE(sri(z6.VnB(), z9.VnB(), 1), "sri z6.b, z9.b, #1");
6472   COMPARE(sri(z6.VnB(), z9.VnB(), 2), "sri z6.b, z9.b, #2");
6473   COMPARE(sri(z6.VnB(), z9.VnB(), 5), "sri z6.b, z9.b, #5");
6474   COMPARE(sri(z6.VnB(), z9.VnB(), 8), "sri z6.b, z9.b, #8");
6475   COMPARE(sri(z6.VnH(), z9.VnH(), 1), "sri z6.h, z9.h, #1");
6476   COMPARE(sri(z6.VnH(), z9.VnH(), 16), "sri z6.h, z9.h, #16");
6477   COMPARE(sri(z6.VnS(), z9.VnS(), 1), "sri z6.s, z9.s, #1");
6478   COMPARE(sri(z6.VnS(), z9.VnS(), 31), "sri z6.s, z9.s, #31");
6479   COMPARE(sri(z6.VnD(), z9.VnD(), 1), "sri z6.d, z9.d, #1");
6480   COMPARE(sri(z6.VnD(), z9.VnD(), 64), "sri z6.d, z9.d, #64");
6481 
6482   COMPARE(sli(z29.VnB(), z7.VnB(), 0), "sli z29.b, z7.b, #0");
6483   COMPARE(sli(z29.VnB(), z7.VnB(), 2), "sli z29.b, z7.b, #2");
6484   COMPARE(sli(z29.VnB(), z7.VnB(), 5), "sli z29.b, z7.b, #5");
6485   COMPARE(sli(z29.VnB(), z7.VnB(), 7), "sli z29.b, z7.b, #7");
6486   COMPARE(sli(z29.VnH(), z7.VnH(), 0), "sli z29.h, z7.h, #0");
6487   COMPARE(sli(z29.VnH(), z7.VnH(), 15), "sli z29.h, z7.h, #15");
6488   COMPARE(sli(z29.VnS(), z7.VnS(), 0), "sli z29.s, z7.s, #0");
6489   COMPARE(sli(z29.VnS(), z7.VnS(), 31), "sli z29.s, z7.s, #31");
6490   COMPARE(sli(z29.VnD(), z7.VnD(), 0), "sli z29.d, z7.d, #0");
6491   COMPARE(sli(z29.VnD(), z7.VnD(), 63), "sli z29.d, z7.d, #63");
6492 
6493   CLEANUP();
6494 }
6495 
TEST(sve2_shift_imm)6496 TEST(sve2_shift_imm) {
6497   SETUP();
6498 
6499   COMPARE(sqshl(z0.VnB(), p5.Merging(), z0.VnB(), 0),
6500           "sqshl z0.b, p5/m, z0.b, #0");
6501   COMPARE(sqshl(z0.VnB(), p5.Merging(), z0.VnB(), 2),
6502           "sqshl z0.b, p5/m, z0.b, #2");
6503   COMPARE(sqshl(z0.VnB(), p5.Merging(), z0.VnB(), 5),
6504           "sqshl z0.b, p5/m, z0.b, #5");
6505   COMPARE(sqshl(z0.VnB(), p5.Merging(), z0.VnB(), 7),
6506           "sqshl z0.b, p5/m, z0.b, #7");
6507   COMPARE(sqshl(z0.VnH(), p5.Merging(), z0.VnH(), 0),
6508           "sqshl z0.h, p5/m, z0.h, #0");
6509   COMPARE(sqshl(z0.VnH(), p5.Merging(), z0.VnH(), 15),
6510           "sqshl z0.h, p5/m, z0.h, #15");
6511   COMPARE(sqshl(z0.VnS(), p5.Merging(), z0.VnS(), 0),
6512           "sqshl z0.s, p5/m, z0.s, #0");
6513   COMPARE(sqshl(z0.VnS(), p5.Merging(), z0.VnS(), 31),
6514           "sqshl z0.s, p5/m, z0.s, #31");
6515   COMPARE(sqshl(z0.VnD(), p5.Merging(), z0.VnD(), 0),
6516           "sqshl z0.d, p5/m, z0.d, #0");
6517   COMPARE(sqshl(z0.VnD(), p5.Merging(), z0.VnD(), 63),
6518           "sqshl z0.d, p5/m, z0.d, #63");
6519 
6520   COMPARE(sqshlu(z10.VnB(), p1.Merging(), z10.VnB(), 0),
6521           "sqshlu z10.b, p1/m, z10.b, #0");
6522   COMPARE(sqshlu(z10.VnB(), p1.Merging(), z10.VnB(), 2),
6523           "sqshlu z10.b, p1/m, z10.b, #2");
6524   COMPARE(sqshlu(z10.VnB(), p1.Merging(), z10.VnB(), 5),
6525           "sqshlu z10.b, p1/m, z10.b, #5");
6526   COMPARE(sqshlu(z10.VnB(), p1.Merging(), z10.VnB(), 7),
6527           "sqshlu z10.b, p1/m, z10.b, #7");
6528   COMPARE(sqshlu(z10.VnH(), p1.Merging(), z10.VnH(), 0),
6529           "sqshlu z10.h, p1/m, z10.h, #0");
6530   COMPARE(sqshlu(z10.VnH(), p1.Merging(), z10.VnH(), 15),
6531           "sqshlu z10.h, p1/m, z10.h, #15");
6532   COMPARE(sqshlu(z10.VnS(), p1.Merging(), z10.VnS(), 0),
6533           "sqshlu z10.s, p1/m, z10.s, #0");
6534   COMPARE(sqshlu(z10.VnS(), p1.Merging(), z10.VnS(), 31),
6535           "sqshlu z10.s, p1/m, z10.s, #31");
6536   COMPARE(sqshlu(z10.VnD(), p1.Merging(), z10.VnD(), 0),
6537           "sqshlu z10.d, p1/m, z10.d, #0");
6538   COMPARE(sqshlu(z10.VnD(), p1.Merging(), z10.VnD(), 63),
6539           "sqshlu z10.d, p1/m, z10.d, #63");
6540 
6541   COMPARE(srshr(z12.VnB(), p0.Merging(), z12.VnB(), 1),
6542           "srshr z12.b, p0/m, z12.b, #1");
6543   COMPARE(srshr(z12.VnB(), p0.Merging(), z12.VnB(), 2),
6544           "srshr z12.b, p0/m, z12.b, #2");
6545   COMPARE(srshr(z12.VnB(), p0.Merging(), z12.VnB(), 5),
6546           "srshr z12.b, p0/m, z12.b, #5");
6547   COMPARE(srshr(z12.VnB(), p0.Merging(), z12.VnB(), 8),
6548           "srshr z12.b, p0/m, z12.b, #8");
6549   COMPARE(srshr(z12.VnH(), p0.Merging(), z12.VnH(), 1),
6550           "srshr z12.h, p0/m, z12.h, #1");
6551   COMPARE(srshr(z12.VnH(), p0.Merging(), z12.VnH(), 16),
6552           "srshr z12.h, p0/m, z12.h, #16");
6553   COMPARE(srshr(z12.VnS(), p0.Merging(), z12.VnS(), 1),
6554           "srshr z12.s, p0/m, z12.s, #1");
6555   COMPARE(srshr(z12.VnS(), p0.Merging(), z12.VnS(), 32),
6556           "srshr z12.s, p0/m, z12.s, #32");
6557   COMPARE(srshr(z12.VnD(), p0.Merging(), z12.VnD(), 1),
6558           "srshr z12.d, p0/m, z12.d, #1");
6559   COMPARE(srshr(z12.VnD(), p0.Merging(), z12.VnD(), 64),
6560           "srshr z12.d, p0/m, z12.d, #64");
6561 
6562   COMPARE(uqshl(z29.VnB(), p7.Merging(), z29.VnB(), 0),
6563           "uqshl z29.b, p7/m, z29.b, #0");
6564   COMPARE(uqshl(z29.VnB(), p7.Merging(), z29.VnB(), 2),
6565           "uqshl z29.b, p7/m, z29.b, #2");
6566   COMPARE(uqshl(z29.VnB(), p7.Merging(), z29.VnB(), 5),
6567           "uqshl z29.b, p7/m, z29.b, #5");
6568   COMPARE(uqshl(z29.VnB(), p7.Merging(), z29.VnB(), 7),
6569           "uqshl z29.b, p7/m, z29.b, #7");
6570   COMPARE(uqshl(z29.VnH(), p7.Merging(), z29.VnH(), 0),
6571           "uqshl z29.h, p7/m, z29.h, #0");
6572   COMPARE(uqshl(z29.VnH(), p7.Merging(), z29.VnH(), 15),
6573           "uqshl z29.h, p7/m, z29.h, #15");
6574   COMPARE(uqshl(z29.VnS(), p7.Merging(), z29.VnS(), 0),
6575           "uqshl z29.s, p7/m, z29.s, #0");
6576   COMPARE(uqshl(z29.VnS(), p7.Merging(), z29.VnS(), 31),
6577           "uqshl z29.s, p7/m, z29.s, #31");
6578   COMPARE(uqshl(z29.VnD(), p7.Merging(), z29.VnD(), 0),
6579           "uqshl z29.d, p7/m, z29.d, #0");
6580   COMPARE(uqshl(z29.VnD(), p7.Merging(), z29.VnD(), 63),
6581           "uqshl z29.d, p7/m, z29.d, #63");
6582 
6583   COMPARE(urshr(z31.VnB(), p2.Merging(), z31.VnB(), 1),
6584           "urshr z31.b, p2/m, z31.b, #1");
6585   COMPARE(urshr(z31.VnB(), p2.Merging(), z31.VnB(), 2),
6586           "urshr z31.b, p2/m, z31.b, #2");
6587   COMPARE(urshr(z31.VnB(), p2.Merging(), z31.VnB(), 5),
6588           "urshr z31.b, p2/m, z31.b, #5");
6589   COMPARE(urshr(z31.VnB(), p2.Merging(), z31.VnB(), 8),
6590           "urshr z31.b, p2/m, z31.b, #8");
6591   COMPARE(urshr(z31.VnH(), p2.Merging(), z31.VnH(), 1),
6592           "urshr z31.h, p2/m, z31.h, #1");
6593   COMPARE(urshr(z31.VnH(), p2.Merging(), z31.VnH(), 16),
6594           "urshr z31.h, p2/m, z31.h, #16");
6595   COMPARE(urshr(z31.VnS(), p2.Merging(), z31.VnS(), 1),
6596           "urshr z31.s, p2/m, z31.s, #1");
6597   COMPARE(urshr(z31.VnS(), p2.Merging(), z31.VnS(), 32),
6598           "urshr z31.s, p2/m, z31.s, #32");
6599   COMPARE(urshr(z31.VnD(), p2.Merging(), z31.VnD(), 1),
6600           "urshr z31.d, p2/m, z31.d, #1");
6601   COMPARE(urshr(z31.VnD(), p2.Merging(), z31.VnD(), 64),
6602           "urshr z31.d, p2/m, z31.d, #64");
6603 
6604   CLEANUP();
6605 }
6606 
TEST(sve2_shift_sat)6607 TEST(sve2_shift_sat) {
6608   SETUP();
6609 
6610   COMPARE(srshl(z31.VnB(), p7.Merging(), z31.VnB(), z3.VnB()),
6611           "srshl z31.b, p7/m, z31.b, z3.b");
6612   COMPARE(srshl(z31.VnD(), p7.Merging(), z31.VnD(), z3.VnD()),
6613           "srshl z31.d, p7/m, z31.d, z3.d");
6614   COMPARE(srshl(z31.VnH(), p7.Merging(), z31.VnH(), z3.VnH()),
6615           "srshl z31.h, p7/m, z31.h, z3.h");
6616   COMPARE(srshl(z31.VnS(), p7.Merging(), z31.VnS(), z3.VnS()),
6617           "srshl z31.s, p7/m, z31.s, z3.s");
6618 
6619   COMPARE(srshlr(z16.VnB(), p7.Merging(), z16.VnB(), z29.VnB()),
6620           "srshlr z16.b, p7/m, z16.b, z29.b");
6621   COMPARE(srshlr(z16.VnD(), p7.Merging(), z16.VnD(), z29.VnD()),
6622           "srshlr z16.d, p7/m, z16.d, z29.d");
6623   COMPARE(srshlr(z16.VnH(), p7.Merging(), z16.VnH(), z29.VnH()),
6624           "srshlr z16.h, p7/m, z16.h, z29.h");
6625   COMPARE(srshlr(z16.VnS(), p7.Merging(), z16.VnS(), z29.VnS()),
6626           "srshlr z16.s, p7/m, z16.s, z29.s");
6627 
6628   COMPARE(urshl(z15.VnB(), p2.Merging(), z15.VnB(), z3.VnB()),
6629           "urshl z15.b, p2/m, z15.b, z3.b");
6630   COMPARE(urshl(z15.VnD(), p2.Merging(), z15.VnD(), z3.VnD()),
6631           "urshl z15.d, p2/m, z15.d, z3.d");
6632   COMPARE(urshl(z15.VnH(), p2.Merging(), z15.VnH(), z3.VnH()),
6633           "urshl z15.h, p2/m, z15.h, z3.h");
6634   COMPARE(urshl(z15.VnS(), p2.Merging(), z15.VnS(), z3.VnS()),
6635           "urshl z15.s, p2/m, z15.s, z3.s");
6636 
6637   COMPARE(urshlr(z27.VnB(), p1.Merging(), z27.VnB(), z30.VnB()),
6638           "urshlr z27.b, p1/m, z27.b, z30.b");
6639   COMPARE(urshlr(z27.VnD(), p1.Merging(), z27.VnD(), z30.VnD()),
6640           "urshlr z27.d, p1/m, z27.d, z30.d");
6641   COMPARE(urshlr(z27.VnH(), p1.Merging(), z27.VnH(), z30.VnH()),
6642           "urshlr z27.h, p1/m, z27.h, z30.h");
6643   COMPARE(urshlr(z27.VnS(), p1.Merging(), z27.VnS(), z30.VnS()),
6644           "urshlr z27.s, p1/m, z27.s, z30.s");
6645 
6646   COMPARE(sqshl(z22.VnB(), p4.Merging(), z22.VnB(), z21.VnB()),
6647           "sqshl z22.b, p4/m, z22.b, z21.b");
6648   COMPARE(sqshl(z22.VnD(), p4.Merging(), z22.VnD(), z21.VnD()),
6649           "sqshl z22.d, p4/m, z22.d, z21.d");
6650   COMPARE(sqshl(z22.VnH(), p4.Merging(), z22.VnH(), z21.VnH()),
6651           "sqshl z22.h, p4/m, z22.h, z21.h");
6652   COMPARE(sqshl(z22.VnS(), p4.Merging(), z22.VnS(), z21.VnS()),
6653           "sqshl z22.s, p4/m, z22.s, z21.s");
6654 
6655   COMPARE(sqshlr(z7.VnB(), p3.Merging(), z7.VnB(), z5.VnB()),
6656           "sqshlr z7.b, p3/m, z7.b, z5.b");
6657   COMPARE(sqshlr(z7.VnD(), p3.Merging(), z7.VnD(), z5.VnD()),
6658           "sqshlr z7.d, p3/m, z7.d, z5.d");
6659   COMPARE(sqshlr(z7.VnH(), p3.Merging(), z7.VnH(), z5.VnH()),
6660           "sqshlr z7.h, p3/m, z7.h, z5.h");
6661   COMPARE(sqshlr(z7.VnS(), p3.Merging(), z7.VnS(), z5.VnS()),
6662           "sqshlr z7.s, p3/m, z7.s, z5.s");
6663 
6664   COMPARE(uqshl(z10.VnB(), p0.Merging(), z10.VnB(), z21.VnB()),
6665           "uqshl z10.b, p0/m, z10.b, z21.b");
6666   COMPARE(uqshl(z10.VnD(), p0.Merging(), z10.VnD(), z21.VnD()),
6667           "uqshl z10.d, p0/m, z10.d, z21.d");
6668   COMPARE(uqshl(z10.VnH(), p0.Merging(), z10.VnH(), z21.VnH()),
6669           "uqshl z10.h, p0/m, z10.h, z21.h");
6670   COMPARE(uqshl(z10.VnS(), p0.Merging(), z10.VnS(), z21.VnS()),
6671           "uqshl z10.s, p0/m, z10.s, z21.s");
6672 
6673   COMPARE(uqshlr(z12.VnB(), p1.Merging(), z12.VnB(), z12.VnB()),
6674           "uqshlr z12.b, p1/m, z12.b, z12.b");
6675   COMPARE(uqshlr(z12.VnD(), p1.Merging(), z12.VnD(), z12.VnD()),
6676           "uqshlr z12.d, p1/m, z12.d, z12.d");
6677   COMPARE(uqshlr(z12.VnH(), p1.Merging(), z12.VnH(), z12.VnH()),
6678           "uqshlr z12.h, p1/m, z12.h, z12.h");
6679   COMPARE(uqshlr(z12.VnS(), p1.Merging(), z12.VnS(), z12.VnS()),
6680           "uqshlr z12.s, p1/m, z12.s, z12.s");
6681 
6682   COMPARE(sqrshl(z31.VnB(), p5.Merging(), z31.VnB(), z27.VnB()),
6683           "sqrshl z31.b, p5/m, z31.b, z27.b");
6684   COMPARE(sqrshl(z31.VnD(), p5.Merging(), z31.VnD(), z27.VnD()),
6685           "sqrshl z31.d, p5/m, z31.d, z27.d");
6686   COMPARE(sqrshl(z31.VnH(), p5.Merging(), z31.VnH(), z27.VnH()),
6687           "sqrshl z31.h, p5/m, z31.h, z27.h");
6688   COMPARE(sqrshl(z31.VnS(), p5.Merging(), z31.VnS(), z27.VnS()),
6689           "sqrshl z31.s, p5/m, z31.s, z27.s");
6690 
6691   COMPARE(sqrshlr(z25.VnB(), p6.Merging(), z25.VnB(), z7.VnB()),
6692           "sqrshlr z25.b, p6/m, z25.b, z7.b");
6693   COMPARE(sqrshlr(z25.VnD(), p6.Merging(), z25.VnD(), z7.VnD()),
6694           "sqrshlr z25.d, p6/m, z25.d, z7.d");
6695   COMPARE(sqrshlr(z25.VnH(), p6.Merging(), z25.VnH(), z7.VnH()),
6696           "sqrshlr z25.h, p6/m, z25.h, z7.h");
6697   COMPARE(sqrshlr(z25.VnS(), p6.Merging(), z25.VnS(), z7.VnS()),
6698           "sqrshlr z25.s, p6/m, z25.s, z7.s");
6699 
6700   COMPARE(uqrshl(z20.VnB(), p1.Merging(), z20.VnB(), z30.VnB()),
6701           "uqrshl z20.b, p1/m, z20.b, z30.b");
6702   COMPARE(uqrshl(z20.VnD(), p1.Merging(), z20.VnD(), z30.VnD()),
6703           "uqrshl z20.d, p1/m, z20.d, z30.d");
6704   COMPARE(uqrshl(z20.VnH(), p1.Merging(), z20.VnH(), z30.VnH()),
6705           "uqrshl z20.h, p1/m, z20.h, z30.h");
6706   COMPARE(uqrshl(z20.VnS(), p1.Merging(), z20.VnS(), z30.VnS()),
6707           "uqrshl z20.s, p1/m, z20.s, z30.s");
6708 
6709   COMPARE(uqrshlr(z8.VnB(), p5.Merging(), z8.VnB(), z9.VnB()),
6710           "uqrshlr z8.b, p5/m, z8.b, z9.b");
6711   COMPARE(uqrshlr(z8.VnD(), p5.Merging(), z8.VnD(), z9.VnD()),
6712           "uqrshlr z8.d, p5/m, z8.d, z9.d");
6713   COMPARE(uqrshlr(z8.VnH(), p5.Merging(), z8.VnH(), z9.VnH()),
6714           "uqrshlr z8.h, p5/m, z8.h, z9.h");
6715   COMPARE(uqrshlr(z8.VnS(), p5.Merging(), z8.VnS(), z9.VnS()),
6716           "uqrshlr z8.s, p5/m, z8.s, z9.s");
6717 
6718   CLEANUP();
6719 }
6720 
TEST(sve2_sat_arith)6721 TEST(sve2_sat_arith) {
6722   SETUP();
6723 
6724   COMPARE(sqadd(z28.VnB(), p0.Merging(), z28.VnB(), z3.VnB()),
6725           "sqadd z28.b, p0/m, z28.b, z3.b");
6726   COMPARE(sqadd(z28.VnD(), p0.Merging(), z28.VnD(), z3.VnD()),
6727           "sqadd z28.d, p0/m, z28.d, z3.d");
6728   COMPARE(sqadd(z28.VnH(), p0.Merging(), z28.VnH(), z3.VnH()),
6729           "sqadd z28.h, p0/m, z28.h, z3.h");
6730   COMPARE(sqadd(z28.VnS(), p0.Merging(), z28.VnS(), z3.VnS()),
6731           "sqadd z28.s, p0/m, z28.s, z3.s");
6732   COMPARE(sqsub(z6.VnB(), p0.Merging(), z6.VnB(), z12.VnB()),
6733           "sqsub z6.b, p0/m, z6.b, z12.b");
6734   COMPARE(sqsub(z6.VnD(), p0.Merging(), z6.VnD(), z12.VnD()),
6735           "sqsub z6.d, p0/m, z6.d, z12.d");
6736   COMPARE(sqsub(z6.VnH(), p0.Merging(), z6.VnH(), z12.VnH()),
6737           "sqsub z6.h, p0/m, z6.h, z12.h");
6738   COMPARE(sqsub(z6.VnS(), p0.Merging(), z6.VnS(), z12.VnS()),
6739           "sqsub z6.s, p0/m, z6.s, z12.s");
6740   COMPARE(sqsubr(z16.VnB(), p7.Merging(), z16.VnB(), z22.VnB()),
6741           "sqsubr z16.b, p7/m, z16.b, z22.b");
6742   COMPARE(sqsubr(z16.VnD(), p7.Merging(), z16.VnD(), z22.VnD()),
6743           "sqsubr z16.d, p7/m, z16.d, z22.d");
6744   COMPARE(sqsubr(z16.VnH(), p7.Merging(), z16.VnH(), z22.VnH()),
6745           "sqsubr z16.h, p7/m, z16.h, z22.h");
6746   COMPARE(sqsubr(z16.VnS(), p7.Merging(), z16.VnS(), z22.VnS()),
6747           "sqsubr z16.s, p7/m, z16.s, z22.s");
6748   COMPARE(suqadd(z26.VnB(), p2.Merging(), z26.VnB(), z28.VnB()),
6749           "suqadd z26.b, p2/m, z26.b, z28.b");
6750   COMPARE(suqadd(z26.VnD(), p2.Merging(), z26.VnD(), z28.VnD()),
6751           "suqadd z26.d, p2/m, z26.d, z28.d");
6752   COMPARE(suqadd(z26.VnH(), p2.Merging(), z26.VnH(), z28.VnH()),
6753           "suqadd z26.h, p2/m, z26.h, z28.h");
6754   COMPARE(suqadd(z26.VnS(), p2.Merging(), z26.VnS(), z28.VnS()),
6755           "suqadd z26.s, p2/m, z26.s, z28.s");
6756   COMPARE(usqadd(z25.VnB(), p4.Merging(), z25.VnB(), z6.VnB()),
6757           "usqadd z25.b, p4/m, z25.b, z6.b");
6758   COMPARE(usqadd(z25.VnD(), p4.Merging(), z25.VnD(), z6.VnD()),
6759           "usqadd z25.d, p4/m, z25.d, z6.d");
6760   COMPARE(usqadd(z25.VnH(), p4.Merging(), z25.VnH(), z6.VnH()),
6761           "usqadd z25.h, p4/m, z25.h, z6.h");
6762   COMPARE(usqadd(z25.VnS(), p4.Merging(), z25.VnS(), z6.VnS()),
6763           "usqadd z25.s, p4/m, z25.s, z6.s");
6764   COMPARE(uqadd(z24.VnB(), p7.Merging(), z24.VnB(), z1.VnB()),
6765           "uqadd z24.b, p7/m, z24.b, z1.b");
6766   COMPARE(uqadd(z24.VnD(), p7.Merging(), z24.VnD(), z1.VnD()),
6767           "uqadd z24.d, p7/m, z24.d, z1.d");
6768   COMPARE(uqadd(z24.VnH(), p7.Merging(), z24.VnH(), z1.VnH()),
6769           "uqadd z24.h, p7/m, z24.h, z1.h");
6770   COMPARE(uqadd(z24.VnS(), p7.Merging(), z24.VnS(), z1.VnS()),
6771           "uqadd z24.s, p7/m, z24.s, z1.s");
6772   COMPARE(uqsub(z10.VnB(), p3.Merging(), z10.VnB(), z1.VnB()),
6773           "uqsub z10.b, p3/m, z10.b, z1.b");
6774   COMPARE(uqsub(z10.VnD(), p3.Merging(), z10.VnD(), z1.VnD()),
6775           "uqsub z10.d, p3/m, z10.d, z1.d");
6776   COMPARE(uqsub(z10.VnH(), p3.Merging(), z10.VnH(), z1.VnH()),
6777           "uqsub z10.h, p3/m, z10.h, z1.h");
6778   COMPARE(uqsub(z10.VnS(), p3.Merging(), z10.VnS(), z1.VnS()),
6779           "uqsub z10.s, p3/m, z10.s, z1.s");
6780   COMPARE(uqsubr(z20.VnB(), p0.Merging(), z20.VnB(), z6.VnB()),
6781           "uqsubr z20.b, p0/m, z20.b, z6.b");
6782   COMPARE(uqsubr(z20.VnD(), p0.Merging(), z20.VnD(), z6.VnD()),
6783           "uqsubr z20.d, p0/m, z20.d, z6.d");
6784   COMPARE(uqsubr(z20.VnH(), p0.Merging(), z20.VnH(), z6.VnH()),
6785           "uqsubr z20.h, p0/m, z20.h, z6.h");
6786   COMPARE(uqsubr(z20.VnS(), p0.Merging(), z20.VnS(), z6.VnS()),
6787           "uqsubr z20.s, p0/m, z20.s, z6.s");
6788 
6789   COMPARE_MACRO(Sqadd(z28.VnB(), p0.Merging(), z28.VnB(), z28.VnB()),
6790                 "sqadd z28.b, p0/m, z28.b, z28.b");
6791   COMPARE_MACRO(Sqadd(z29.VnB(), p0.Merging(), z28.VnB(), z3.VnB()),
6792                 "movprfx z29.b, p0/m, z28.b\n"
6793                 "sqadd z29.b, p0/m, z29.b, z3.b");
6794   COMPARE_MACRO(Sqadd(z29.VnB(), p0.Merging(), z28.VnB(), z29.VnB()),
6795                 "sqadd z29.b, p0/m, z29.b, z28.b");
6796   COMPARE_MACRO(Uqadd(z28.VnB(), p0.Merging(), z28.VnB(), z28.VnB()),
6797                 "uqadd z28.b, p0/m, z28.b, z28.b");
6798   COMPARE_MACRO(Uqadd(z29.VnB(), p0.Merging(), z28.VnB(), z3.VnB()),
6799                 "movprfx z29.b, p0/m, z28.b\n"
6800                 "uqadd z29.b, p0/m, z29.b, z3.b");
6801   COMPARE_MACRO(Uqadd(z29.VnB(), p0.Merging(), z28.VnB(), z29.VnB()),
6802                 "uqadd z29.b, p0/m, z29.b, z28.b");
6803 
6804   COMPARE_MACRO(Sqsub(z28.VnB(), p0.Merging(), z28.VnB(), z28.VnB()),
6805                 "sqsub z28.b, p0/m, z28.b, z28.b");
6806   COMPARE_MACRO(Sqsub(z29.VnB(), p0.Merging(), z28.VnB(), z3.VnB()),
6807                 "movprfx z29.b, p0/m, z28.b\n"
6808                 "sqsub z29.b, p0/m, z29.b, z3.b");
6809   COMPARE_MACRO(Sqsub(z29.VnB(), p0.Merging(), z28.VnB(), z29.VnB()),
6810                 "sqsubr z29.b, p0/m, z29.b, z28.b");
6811   COMPARE_MACRO(Uqsub(z28.VnB(), p0.Merging(), z28.VnB(), z28.VnB()),
6812                 "uqsub z28.b, p0/m, z28.b, z28.b");
6813   COMPARE_MACRO(Uqsub(z29.VnB(), p0.Merging(), z28.VnB(), z3.VnB()),
6814                 "movprfx z29.b, p0/m, z28.b\n"
6815                 "uqsub z29.b, p0/m, z29.b, z3.b");
6816   COMPARE_MACRO(Uqsub(z29.VnB(), p0.Merging(), z28.VnB(), z29.VnB()),
6817                 "uqsubr z29.b, p0/m, z29.b, z28.b");
6818 
6819   COMPARE_MACRO(Suqadd(z28.VnB(), p0.Merging(), z28.VnB(), z28.VnB()),
6820                 "suqadd z28.b, p0/m, z28.b, z28.b");
6821   COMPARE_MACRO(Suqadd(z29.VnB(), p0.Merging(), z28.VnB(), z3.VnB()),
6822                 "movprfx z29.b, p0/m, z28.b\n"
6823                 "suqadd z29.b, p0/m, z29.b, z3.b");
6824   COMPARE_MACRO(Suqadd(z29.VnB(), p0.Merging(), z28.VnB(), z29.VnB()),
6825                 "mov z31.d, z29.d\n"
6826                 "movprfx z29.b, p0/m, z28.b\n"
6827                 "suqadd z29.b, p0/m, z29.b, z31.b");
6828   COMPARE_MACRO(Usqadd(z28.VnB(), p0.Merging(), z28.VnB(), z28.VnB()),
6829                 "usqadd z28.b, p0/m, z28.b, z28.b");
6830   COMPARE_MACRO(Usqadd(z29.VnB(), p0.Merging(), z28.VnB(), z3.VnB()),
6831                 "movprfx z29.b, p0/m, z28.b\n"
6832                 "usqadd z29.b, p0/m, z29.b, z3.b");
6833   COMPARE_MACRO(Usqadd(z29.VnB(), p0.Merging(), z28.VnB(), z29.VnB()),
6834                 "mov z31.d, z29.d\n"
6835                 "movprfx z29.b, p0/m, z28.b\n"
6836                 "usqadd z29.b, p0/m, z29.b, z31.b");
6837 
6838   CLEANUP();
6839 }
6840 
TEST(sve2_pair_arith)6841 TEST(sve2_pair_arith) {
6842   SETUP();
6843 
6844   COMPARE(addp(z3.VnB(), p1.Merging(), z3.VnB(), z0.VnB()),
6845           "addp z3.b, p1/m, z3.b, z0.b");
6846   COMPARE(addp(z3.VnD(), p1.Merging(), z3.VnD(), z0.VnD()),
6847           "addp z3.d, p1/m, z3.d, z0.d");
6848   COMPARE(addp(z3.VnH(), p1.Merging(), z3.VnH(), z0.VnH()),
6849           "addp z3.h, p1/m, z3.h, z0.h");
6850   COMPARE(addp(z3.VnS(), p1.Merging(), z3.VnS(), z0.VnS()),
6851           "addp z3.s, p1/m, z3.s, z0.s");
6852   COMPARE(smaxp(z5.VnB(), p4.Merging(), z5.VnB(), z10.VnB()),
6853           "smaxp z5.b, p4/m, z5.b, z10.b");
6854   COMPARE(smaxp(z5.VnD(), p4.Merging(), z5.VnD(), z10.VnD()),
6855           "smaxp z5.d, p4/m, z5.d, z10.d");
6856   COMPARE(smaxp(z5.VnH(), p4.Merging(), z5.VnH(), z10.VnH()),
6857           "smaxp z5.h, p4/m, z5.h, z10.h");
6858   COMPARE(smaxp(z5.VnS(), p4.Merging(), z5.VnS(), z10.VnS()),
6859           "smaxp z5.s, p4/m, z5.s, z10.s");
6860   COMPARE(sminp(z27.VnB(), p3.Merging(), z27.VnB(), z1.VnB()),
6861           "sminp z27.b, p3/m, z27.b, z1.b");
6862   COMPARE(sminp(z27.VnD(), p3.Merging(), z27.VnD(), z1.VnD()),
6863           "sminp z27.d, p3/m, z27.d, z1.d");
6864   COMPARE(sminp(z27.VnH(), p3.Merging(), z27.VnH(), z1.VnH()),
6865           "sminp z27.h, p3/m, z27.h, z1.h");
6866   COMPARE(sminp(z27.VnS(), p3.Merging(), z27.VnS(), z1.VnS()),
6867           "sminp z27.s, p3/m, z27.s, z1.s");
6868   COMPARE(umaxp(z7.VnB(), p2.Merging(), z7.VnB(), z23.VnB()),
6869           "umaxp z7.b, p2/m, z7.b, z23.b");
6870   COMPARE(umaxp(z7.VnD(), p2.Merging(), z7.VnD(), z23.VnD()),
6871           "umaxp z7.d, p2/m, z7.d, z23.d");
6872   COMPARE(umaxp(z7.VnH(), p2.Merging(), z7.VnH(), z23.VnH()),
6873           "umaxp z7.h, p2/m, z7.h, z23.h");
6874   COMPARE(umaxp(z7.VnS(), p2.Merging(), z7.VnS(), z23.VnS()),
6875           "umaxp z7.s, p2/m, z7.s, z23.s");
6876   COMPARE(uminp(z10.VnB(), p0.Merging(), z10.VnB(), z22.VnB()),
6877           "uminp z10.b, p0/m, z10.b, z22.b");
6878   COMPARE(uminp(z10.VnD(), p0.Merging(), z10.VnD(), z22.VnD()),
6879           "uminp z10.d, p0/m, z10.d, z22.d");
6880   COMPARE(uminp(z10.VnH(), p0.Merging(), z10.VnH(), z22.VnH()),
6881           "uminp z10.h, p0/m, z10.h, z22.h");
6882   COMPARE(uminp(z10.VnS(), p0.Merging(), z10.VnS(), z22.VnS()),
6883           "uminp z10.s, p0/m, z10.s, z22.s");
6884 
6885   COMPARE_MACRO(Addp(z3.VnB(), p1.Merging(), z3.VnB(), z3.VnB()),
6886                 "addp z3.b, p1/m, z3.b, z3.b");
6887   COMPARE_MACRO(Addp(z4.VnB(), p1.Merging(), z3.VnB(), z3.VnB()),
6888                 "movprfx z4.b, p1/m, z3.b\n"
6889                 "addp z4.b, p1/m, z4.b, z3.b");
6890   COMPARE_MACRO(Addp(z4.VnB(), p1.Merging(), z3.VnB(), z4.VnB()),
6891                 "mov z31.d, z4.d\n"
6892                 "movprfx z4.b, p1/m, z3.b\n"
6893                 "addp z4.b, p1/m, z4.b, z31.b");
6894   COMPARE_MACRO(Smaxp(z4.VnB(), p1.Merging(), z3.VnB(), z4.VnB()),
6895                 "mov z31.d, z4.d\n"
6896                 "movprfx z4.b, p1/m, z3.b\n"
6897                 "smaxp z4.b, p1/m, z4.b, z31.b");
6898   COMPARE_MACRO(Sminp(z4.VnB(), p1.Merging(), z3.VnB(), z4.VnB()),
6899                 "mov z31.d, z4.d\n"
6900                 "movprfx z4.b, p1/m, z3.b\n"
6901                 "sminp z4.b, p1/m, z4.b, z31.b");
6902   COMPARE_MACRO(Umaxp(z4.VnB(), p1.Merging(), z3.VnB(), z4.VnB()),
6903                 "mov z31.d, z4.d\n"
6904                 "movprfx z4.b, p1/m, z3.b\n"
6905                 "umaxp z4.b, p1/m, z4.b, z31.b");
6906   COMPARE_MACRO(Uminp(z4.VnB(), p1.Merging(), z3.VnB(), z4.VnB()),
6907                 "mov z31.d, z4.d\n"
6908                 "movprfx z4.b, p1/m, z3.b\n"
6909                 "uminp z4.b, p1/m, z4.b, z31.b");
6910   CLEANUP();
6911 }
6912 
TEST(sve2_extract_narrow)6913 TEST(sve2_extract_narrow) {
6914   SETUP();
6915 
6916   COMPARE(sqxtnb(z2.VnB(), z0.VnH()), "sqxtnb z2.b, z0.h");
6917   COMPARE(sqxtnb(z2.VnH(), z0.VnS()), "sqxtnb z2.h, z0.s");
6918   COMPARE(sqxtnb(z2.VnS(), z0.VnD()), "sqxtnb z2.s, z0.d");
6919   COMPARE(sqxtnt(z31.VnB(), z18.VnH()), "sqxtnt z31.b, z18.h");
6920   COMPARE(sqxtnt(z31.VnH(), z18.VnS()), "sqxtnt z31.h, z18.s");
6921   COMPARE(sqxtnt(z31.VnS(), z18.VnD()), "sqxtnt z31.s, z18.d");
6922   COMPARE(sqxtunb(z28.VnB(), z6.VnH()), "sqxtunb z28.b, z6.h");
6923   COMPARE(sqxtunb(z28.VnH(), z6.VnS()), "sqxtunb z28.h, z6.s");
6924   COMPARE(sqxtunb(z28.VnS(), z6.VnD()), "sqxtunb z28.s, z6.d");
6925   COMPARE(sqxtunt(z14.VnB(), z31.VnH()), "sqxtunt z14.b, z31.h");
6926   COMPARE(sqxtunt(z14.VnH(), z31.VnS()), "sqxtunt z14.h, z31.s");
6927   COMPARE(sqxtunt(z14.VnS(), z31.VnD()), "sqxtunt z14.s, z31.d");
6928   COMPARE(uqxtnb(z28.VnB(), z4.VnH()), "uqxtnb z28.b, z4.h");
6929   COMPARE(uqxtnb(z28.VnH(), z4.VnS()), "uqxtnb z28.h, z4.s");
6930   COMPARE(uqxtnb(z28.VnS(), z4.VnD()), "uqxtnb z28.s, z4.d");
6931   COMPARE(uqxtnt(z19.VnB(), z7.VnH()), "uqxtnt z19.b, z7.h");
6932   COMPARE(uqxtnt(z19.VnH(), z7.VnS()), "uqxtnt z19.h, z7.s");
6933   COMPARE(uqxtnt(z19.VnS(), z7.VnD()), "uqxtnt z19.s, z7.d");
6934 
6935   CLEANUP();
6936 }
6937 
TEST(sve2_eorbt_eortb)6938 TEST(sve2_eorbt_eortb) {
6939   SETUP();
6940 
6941   COMPARE(eorbt(z3.VnB(), z10.VnB(), z8.VnB()), "eorbt z3.b, z10.b, z8.b");
6942   COMPARE(eorbt(z3.VnD(), z10.VnD(), z8.VnD()), "eorbt z3.d, z10.d, z8.d");
6943   COMPARE(eorbt(z3.VnH(), z10.VnH(), z8.VnH()), "eorbt z3.h, z10.h, z8.h");
6944   COMPARE(eorbt(z3.VnS(), z10.VnS(), z8.VnS()), "eorbt z3.s, z10.s, z8.s");
6945   COMPARE(eortb(z21.VnB(), z21.VnB(), z15.VnB()), "eortb z21.b, z21.b, z15.b");
6946   COMPARE(eortb(z21.VnD(), z21.VnD(), z15.VnD()), "eortb z21.d, z21.d, z15.d");
6947   COMPARE(eortb(z21.VnH(), z21.VnH(), z15.VnH()), "eortb z21.h, z21.h, z15.h");
6948   COMPARE(eortb(z21.VnS(), z21.VnS(), z15.VnS()), "eortb z21.s, z21.s, z15.s");
6949 
6950   CLEANUP();
6951 }
6952 
TEST(sve2_saturating_multiply_add_high)6953 TEST(sve2_saturating_multiply_add_high) {
6954   SETUP();
6955 
6956   COMPARE(sqrdmlah(z27.VnB(), z28.VnB(), z19.VnB()),
6957           "sqrdmlah z27.b, z28.b, z19.b");
6958   COMPARE(sqrdmlah(z27.VnD(), z28.VnD(), z19.VnD()),
6959           "sqrdmlah z27.d, z28.d, z19.d");
6960   COMPARE(sqrdmlah(z27.VnH(), z28.VnH(), z19.VnH()),
6961           "sqrdmlah z27.h, z28.h, z19.h");
6962   COMPARE(sqrdmlah(z27.VnS(), z28.VnS(), z19.VnS()),
6963           "sqrdmlah z27.s, z28.s, z19.s");
6964   COMPARE(sqrdmlsh(z11.VnB(), z16.VnB(), z31.VnB()),
6965           "sqrdmlsh z11.b, z16.b, z31.b");
6966   COMPARE(sqrdmlsh(z11.VnD(), z16.VnD(), z31.VnD()),
6967           "sqrdmlsh z11.d, z16.d, z31.d");
6968   COMPARE(sqrdmlsh(z11.VnH(), z16.VnH(), z31.VnH()),
6969           "sqrdmlsh z11.h, z16.h, z31.h");
6970   COMPARE(sqrdmlsh(z11.VnS(), z16.VnS(), z31.VnS()),
6971           "sqrdmlsh z11.s, z16.s, z31.s");
6972 
6973   COMPARE_MACRO(Sqrdmlah(z29.VnD(), z0.VnD(), z29.VnD(), z26.VnD()),
6974                 "movprfx z31, z0\n"
6975                 "sqrdmlah z31.d, z29.d, z26.d\n"
6976                 "mov z29.d, z31.d");
6977   COMPARE_MACRO(Sqrdmlah(z26.VnH(), z0.VnH(), z29.VnH(), z26.VnH()),
6978                 "movprfx z31, z0\n"
6979                 "sqrdmlah z31.h, z29.h, z26.h\n"
6980                 "mov z26.d, z31.d");
6981   COMPARE_MACRO(Sqrdmlsh(z23.VnS(), z31.VnS(), z26.VnS(), z29.VnS()),
6982                 "movprfx z23, z31\n"
6983                 "sqrdmlsh z23.s, z26.s, z29.s");
6984   COMPARE_MACRO(Sqrdmlsh(z4.VnB(), z31.VnB(), z4.VnB(), z4.VnB()),
6985                 "sqrdmlsh z31.b, z4.b, z4.b\n"
6986                 "mov z4.d, z31.d");
6987 
6988   COMPARE(sqrdmlah(z10.VnD(), z30.VnD(), z11.VnD(), 1),
6989           "sqrdmlah z10.d, z30.d, z11.d[1]");
6990   COMPARE(sqrdmlah(z11.VnH(), z8.VnH(), z3.VnH(), 7),
6991           "sqrdmlah z11.h, z8.h, z3.h[7]");
6992   COMPARE(sqrdmlah(z21.VnS(), z29.VnS(), z7.VnS(), 3),
6993           "sqrdmlah z21.s, z29.s, z7.s[3]");
6994   COMPARE(sqrdmlsh(z2.VnD(), z16.VnD(), z14.VnD(), 0),
6995           "sqrdmlsh z2.d, z16.d, z14.d[0]");
6996   COMPARE(sqrdmlsh(z23.VnH(), z13.VnH(), z6.VnH(), 5),
6997           "sqrdmlsh z23.h, z13.h, z6.h[5]");
6998   COMPARE(sqrdmlsh(z27.VnS(), z8.VnS(), z4.VnS(), 2),
6999           "sqrdmlsh z27.s, z8.s, z4.s[2]");
7000 
7001   COMPARE_MACRO(Sqrdmlah(z24.VnD(), z0.VnD(), z24.VnD(), z13.VnD(), 0),
7002                 "movprfx z31, z0\n"
7003                 "sqrdmlah z31.d, z24.d, z13.d[0]\n"
7004                 "mov z24.d, z31.d");
7005   COMPARE_MACRO(Sqrdmlah(z4.VnH(), z0.VnH(), z29.VnH(), z4.VnH(), 6),
7006                 "movprfx z31, z0\n"
7007                 "sqrdmlah z31.h, z29.h, z4.h[6]\n"
7008                 "mov z4.d, z31.d");
7009   COMPARE_MACRO(Sqrdmlsh(z12.VnS(), z31.VnS(), z26.VnS(), z2.VnS(), 2),
7010                 "movprfx z12, z31\n"
7011                 "sqrdmlsh z12.s, z26.s, z2.s[2]");
7012   COMPARE_MACRO(Sqrdmlsh(z0.VnD(), z31.VnD(), z0.VnD(), z0.VnD(), 1),
7013                 "sqrdmlsh z31.d, z0.d, z0.d[1]\n"
7014                 "mov z0.d, z31.d");
7015 
7016   CLEANUP();
7017 }
7018 
TEST(sve2_integer_pairwise_add_accumulate_long)7019 TEST(sve2_integer_pairwise_add_accumulate_long) {
7020   SETUP();
7021 
7022   COMPARE(sadalp(z19.VnD(), p5.Merging(), z9.VnS()),
7023           "sadalp z19.d, p5/m, z9.s");
7024   COMPARE(sadalp(z19.VnH(), p5.Merging(), z9.VnB()),
7025           "sadalp z19.h, p5/m, z9.b");
7026   COMPARE(sadalp(z19.VnS(), p5.Merging(), z9.VnH()),
7027           "sadalp z19.s, p5/m, z9.h");
7028   COMPARE(uadalp(z20.VnD(), p4.Merging(), z5.VnS()),
7029           "uadalp z20.d, p4/m, z5.s");
7030   COMPARE(uadalp(z20.VnH(), p4.Merging(), z5.VnB()),
7031           "uadalp z20.h, p4/m, z5.b");
7032   COMPARE(uadalp(z20.VnS(), p4.Merging(), z5.VnH()),
7033           "uadalp z20.s, p4/m, z5.h");
7034 
7035   CLEANUP();
7036 }
7037 
TEST(sve2_integer_multiply_vectors_unpredicated)7038 TEST(sve2_integer_multiply_vectors_unpredicated) {
7039   SETUP();
7040 
7041   COMPARE(mul(z23.VnB(), z0.VnB(), z12.VnB()), "mul z23.b, z0.b, z12.b");
7042   COMPARE(mul(z24.VnD(), z1.VnD(), z14.VnD()), "mul z24.d, z1.d, z14.d");
7043   COMPARE(mul(z25.VnH(), z2.VnH(), z16.VnH()), "mul z25.h, z2.h, z16.h");
7044   COMPARE(mul(z26.VnS(), z3.VnS(), z18.VnS()), "mul z26.s, z3.s, z18.s");
7045 
7046   COMPARE(pmul(z0.VnB(), z5.VnB(), z5.VnB()), "pmul z0.b, z5.b, z5.b");
7047 
7048   COMPARE(smulh(z11.VnB(), z9.VnB(), z1.VnB()), "smulh z11.b, z9.b, z1.b");
7049   COMPARE(smulh(z21.VnD(), z19.VnD(), z16.VnD()), "smulh z21.d, z19.d, z16.d");
7050   COMPARE(smulh(z11.VnH(), z9.VnH(), z1.VnH()), "smulh z11.h, z9.h, z1.h");
7051   COMPARE(smulh(z21.VnS(), z19.VnS(), z16.VnS()), "smulh z21.s, z19.s, z16.s");
7052 
7053   COMPARE(umulh(z5.VnB(), z9.VnB(), z5.VnB()), "umulh z5.b, z9.b, z5.b");
7054   COMPARE(umulh(z18.VnD(), z9.VnD(), z5.VnD()), "umulh z18.d, z9.d, z5.d");
7055   COMPARE(umulh(z18.VnH(), z9.VnH(), z9.VnH()), "umulh z18.h, z9.h, z9.h");
7056   COMPARE(umulh(z18.VnS(), z9.VnS(), z18.VnS()), "umulh z18.s, z9.s, z18.s");
7057 
7058   CLEANUP();
7059 }
7060 
TEST(sve2_arith_interleaved_long)7061 TEST(sve2_arith_interleaved_long) {
7062   SETUP();
7063 
7064   COMPARE(saddlbt(z15.VnD(), z6.VnS(), z18.VnS()),
7065           "saddlbt z15.d, z6.s, z18.s");
7066   COMPARE(saddlbt(z15.VnH(), z6.VnB(), z18.VnB()),
7067           "saddlbt z15.h, z6.b, z18.b");
7068   COMPARE(saddlbt(z15.VnS(), z6.VnH(), z18.VnH()),
7069           "saddlbt z15.s, z6.h, z18.h");
7070   COMPARE(ssublbt(z6.VnD(), z28.VnS(), z12.VnS()),
7071           "ssublbt z6.d, z28.s, z12.s");
7072   COMPARE(ssublbt(z6.VnH(), z28.VnB(), z12.VnB()),
7073           "ssublbt z6.h, z28.b, z12.b");
7074   COMPARE(ssublbt(z6.VnS(), z28.VnH(), z12.VnH()),
7075           "ssublbt z6.s, z28.h, z12.h");
7076   COMPARE(ssubltb(z11.VnD(), z18.VnS(), z19.VnS()),
7077           "ssubltb z11.d, z18.s, z19.s");
7078   COMPARE(ssubltb(z11.VnH(), z18.VnB(), z19.VnB()),
7079           "ssubltb z11.h, z18.b, z19.b");
7080   COMPARE(ssubltb(z11.VnS(), z18.VnH(), z19.VnH()),
7081           "ssubltb z11.s, z18.h, z19.h");
7082 
7083   CLEANUP();
7084 }
7085 
TEST(sve2_int_unary_predicated)7086 TEST(sve2_int_unary_predicated) {
7087   SETUP();
7088 
7089   COMPARE_MACRO(Sqabs(z29.VnB(), p1.Merging(), z18.VnB()),
7090                 "sqabs z29.b, p1/m, z18.b");
7091   COMPARE_MACRO(Sqabs(z29.VnD(), p1.Merging(), z18.VnD()),
7092                 "sqabs z29.d, p1/m, z18.d");
7093   COMPARE_MACRO(Sqabs(z29.VnH(), p1.Merging(), z18.VnH()),
7094                 "sqabs z29.h, p1/m, z18.h");
7095   COMPARE_MACRO(Sqabs(z29.VnS(), p1.Merging(), z18.VnS()),
7096                 "sqabs z29.s, p1/m, z18.s");
7097   COMPARE_MACRO(Sqneg(z21.VnB(), p0.Merging(), z17.VnB()),
7098                 "sqneg z21.b, p0/m, z17.b");
7099   COMPARE_MACRO(Sqneg(z21.VnD(), p0.Merging(), z17.VnD()),
7100                 "sqneg z21.d, p0/m, z17.d");
7101   COMPARE_MACRO(Sqneg(z21.VnH(), p0.Merging(), z17.VnH()),
7102                 "sqneg z21.h, p0/m, z17.h");
7103   COMPARE_MACRO(Sqneg(z21.VnS(), p0.Merging(), z17.VnS()),
7104                 "sqneg z21.s, p0/m, z17.s");
7105   COMPARE_MACRO(Urecpe(z25.VnS(), p7.Merging(), z2.VnS()),
7106                 "urecpe z25.s, p7/m, z2.s");
7107   COMPARE_MACRO(Ursqrte(z4.VnS(), p3.Merging(), z3.VnS()),
7108                 "ursqrte z4.s, p3/m, z3.s");
7109 
7110   COMPARE_MACRO(Sqabs(z29.VnS(), p1.Zeroing(), z18.VnS()),
7111                 "movprfx z29.s, p1/z, z29.s\n"
7112                 "sqabs z29.s, p1/m, z18.s");
7113   COMPARE_MACRO(Sqneg(z21.VnB(), p0.Zeroing(), z17.VnB()),
7114                 "movprfx z21.b, p0/z, z21.b\n"
7115                 "sqneg z21.b, p0/m, z17.b");
7116   COMPARE_MACRO(Urecpe(z25.VnS(), p7.Zeroing(), z2.VnS()),
7117                 "movprfx z25.s, p7/z, z25.s\n"
7118                 "urecpe z25.s, p7/m, z2.s");
7119   COMPARE_MACRO(Ursqrte(z4.VnS(), p3.Zeroing(), z3.VnS()),
7120                 "movprfx z4.s, p3/z, z4.s\n"
7121                 "ursqrte z4.s, p3/m, z3.s");
7122   CLEANUP();
7123 }
7124 
TEST(sve2_arith_long)7125 TEST(sve2_arith_long) {
7126   SETUP();
7127 
7128   COMPARE_MACRO(Sabdlb(z2.VnD(), z21.VnS(), z3.VnS()),
7129                 "sabdlb z2.d, z21.s, z3.s");
7130   COMPARE_MACRO(Sabdlb(z2.VnH(), z21.VnB(), z3.VnB()),
7131                 "sabdlb z2.h, z21.b, z3.b");
7132   COMPARE_MACRO(Sabdlb(z2.VnS(), z21.VnH(), z3.VnH()),
7133                 "sabdlb z2.s, z21.h, z3.h");
7134   COMPARE_MACRO(Sabdlt(z25.VnD(), z23.VnS(), z17.VnS()),
7135                 "sabdlt z25.d, z23.s, z17.s");
7136   COMPARE_MACRO(Sabdlt(z25.VnH(), z23.VnB(), z17.VnB()),
7137                 "sabdlt z25.h, z23.b, z17.b");
7138   COMPARE_MACRO(Sabdlt(z25.VnS(), z23.VnH(), z17.VnH()),
7139                 "sabdlt z25.s, z23.h, z17.h");
7140   COMPARE_MACRO(Saddlb(z24.VnD(), z30.VnS(), z16.VnS()),
7141                 "saddlb z24.d, z30.s, z16.s");
7142   COMPARE_MACRO(Saddlb(z24.VnH(), z30.VnB(), z16.VnB()),
7143                 "saddlb z24.h, z30.b, z16.b");
7144   COMPARE_MACRO(Saddlb(z24.VnS(), z30.VnH(), z16.VnH()),
7145                 "saddlb z24.s, z30.h, z16.h");
7146   COMPARE_MACRO(Saddlt(z21.VnD(), z29.VnS(), z31.VnS()),
7147                 "saddlt z21.d, z29.s, z31.s");
7148   COMPARE_MACRO(Saddlt(z21.VnH(), z29.VnB(), z31.VnB()),
7149                 "saddlt z21.h, z29.b, z31.b");
7150   COMPARE_MACRO(Saddlt(z21.VnS(), z29.VnH(), z31.VnH()),
7151                 "saddlt z21.s, z29.h, z31.h");
7152   COMPARE_MACRO(Ssublb(z4.VnD(), z23.VnS(), z7.VnS()),
7153                 "ssublb z4.d, z23.s, z7.s");
7154   COMPARE_MACRO(Ssublb(z4.VnH(), z23.VnB(), z7.VnB()),
7155                 "ssublb z4.h, z23.b, z7.b");
7156   COMPARE_MACRO(Ssublb(z4.VnS(), z23.VnH(), z7.VnH()),
7157                 "ssublb z4.s, z23.h, z7.h");
7158   COMPARE_MACRO(Ssublt(z12.VnD(), z13.VnS(), z6.VnS()),
7159                 "ssublt z12.d, z13.s, z6.s");
7160   COMPARE_MACRO(Ssublt(z12.VnH(), z13.VnB(), z6.VnB()),
7161                 "ssublt z12.h, z13.b, z6.b");
7162   COMPARE_MACRO(Ssublt(z12.VnS(), z13.VnH(), z6.VnH()),
7163                 "ssublt z12.s, z13.h, z6.h");
7164   COMPARE_MACRO(Uabdlb(z1.VnD(), z26.VnS(), z12.VnS()),
7165                 "uabdlb z1.d, z26.s, z12.s");
7166   COMPARE_MACRO(Uabdlb(z1.VnH(), z26.VnB(), z12.VnB()),
7167                 "uabdlb z1.h, z26.b, z12.b");
7168   COMPARE_MACRO(Uabdlb(z1.VnS(), z26.VnH(), z12.VnH()),
7169                 "uabdlb z1.s, z26.h, z12.h");
7170   COMPARE_MACRO(Uabdlt(z25.VnD(), z29.VnS(), z14.VnS()),
7171                 "uabdlt z25.d, z29.s, z14.s");
7172   COMPARE_MACRO(Uabdlt(z25.VnH(), z29.VnB(), z14.VnB()),
7173                 "uabdlt z25.h, z29.b, z14.b");
7174   COMPARE_MACRO(Uabdlt(z25.VnS(), z29.VnH(), z14.VnH()),
7175                 "uabdlt z25.s, z29.h, z14.h");
7176   COMPARE_MACRO(Uaddlb(z3.VnD(), z5.VnS(), z2.VnS()),
7177                 "uaddlb z3.d, z5.s, z2.s");
7178   COMPARE_MACRO(Uaddlb(z3.VnH(), z5.VnB(), z2.VnB()),
7179                 "uaddlb z3.h, z5.b, z2.b");
7180   COMPARE_MACRO(Uaddlb(z3.VnS(), z5.VnH(), z2.VnH()),
7181                 "uaddlb z3.s, z5.h, z2.h");
7182   COMPARE_MACRO(Uaddlt(z15.VnD(), z28.VnS(), z20.VnS()),
7183                 "uaddlt z15.d, z28.s, z20.s");
7184   COMPARE_MACRO(Uaddlt(z15.VnH(), z28.VnB(), z20.VnB()),
7185                 "uaddlt z15.h, z28.b, z20.b");
7186   COMPARE_MACRO(Uaddlt(z15.VnS(), z28.VnH(), z20.VnH()),
7187                 "uaddlt z15.s, z28.h, z20.h");
7188   COMPARE_MACRO(Usublb(z25.VnD(), z9.VnS(), z17.VnS()),
7189                 "usublb z25.d, z9.s, z17.s");
7190   COMPARE_MACRO(Usublb(z25.VnH(), z9.VnB(), z17.VnB()),
7191                 "usublb z25.h, z9.b, z17.b");
7192   COMPARE_MACRO(Usublb(z25.VnS(), z9.VnH(), z17.VnH()),
7193                 "usublb z25.s, z9.h, z17.h");
7194   COMPARE_MACRO(Usublt(z5.VnD(), z11.VnS(), z15.VnS()),
7195                 "usublt z5.d, z11.s, z15.s");
7196   COMPARE_MACRO(Usublt(z5.VnH(), z11.VnB(), z15.VnB()),
7197                 "usublt z5.h, z11.b, z15.b");
7198   COMPARE_MACRO(Usublt(z5.VnS(), z11.VnH(), z15.VnH()),
7199                 "usublt z5.s, z11.h, z15.h");
7200 
7201   CLEANUP();
7202 }
7203 
TEST(sve2_arith_wide)7204 TEST(sve2_arith_wide) {
7205   SETUP();
7206 
7207   COMPARE_MACRO(Saddwb(z12.VnD(), z8.VnD(), z8.VnS()),
7208                 "saddwb z12.d, z8.d, z8.s");
7209   COMPARE_MACRO(Saddwb(z12.VnH(), z8.VnH(), z8.VnB()),
7210                 "saddwb z12.h, z8.h, z8.b");
7211   COMPARE_MACRO(Saddwb(z12.VnS(), z8.VnS(), z8.VnH()),
7212                 "saddwb z12.s, z8.s, z8.h");
7213   COMPARE_MACRO(Saddwt(z24.VnD(), z0.VnD(), z3.VnS()),
7214                 "saddwt z24.d, z0.d, z3.s");
7215   COMPARE_MACRO(Saddwt(z24.VnH(), z0.VnH(), z3.VnB()),
7216                 "saddwt z24.h, z0.h, z3.b");
7217   COMPARE_MACRO(Saddwt(z24.VnS(), z0.VnS(), z3.VnH()),
7218                 "saddwt z24.s, z0.s, z3.h");
7219   COMPARE_MACRO(Ssubwb(z7.VnD(), z28.VnD(), z11.VnS()),
7220                 "ssubwb z7.d, z28.d, z11.s");
7221   COMPARE_MACRO(Ssubwb(z7.VnH(), z28.VnH(), z11.VnB()),
7222                 "ssubwb z7.h, z28.h, z11.b");
7223   COMPARE_MACRO(Ssubwb(z7.VnS(), z28.VnS(), z11.VnH()),
7224                 "ssubwb z7.s, z28.s, z11.h");
7225   COMPARE_MACRO(Ssubwt(z29.VnD(), z25.VnD(), z20.VnS()),
7226                 "ssubwt z29.d, z25.d, z20.s");
7227   COMPARE_MACRO(Ssubwt(z29.VnH(), z25.VnH(), z20.VnB()),
7228                 "ssubwt z29.h, z25.h, z20.b");
7229   COMPARE_MACRO(Ssubwt(z29.VnS(), z25.VnS(), z20.VnH()),
7230                 "ssubwt z29.s, z25.s, z20.h");
7231   COMPARE_MACRO(Uaddwb(z31.VnD(), z8.VnD(), z25.VnS()),
7232                 "uaddwb z31.d, z8.d, z25.s");
7233   COMPARE_MACRO(Uaddwb(z31.VnH(), z8.VnH(), z25.VnB()),
7234                 "uaddwb z31.h, z8.h, z25.b");
7235   COMPARE_MACRO(Uaddwb(z31.VnS(), z8.VnS(), z25.VnH()),
7236                 "uaddwb z31.s, z8.s, z25.h");
7237   COMPARE_MACRO(Uaddwt(z17.VnD(), z15.VnD(), z2.VnS()),
7238                 "uaddwt z17.d, z15.d, z2.s");
7239   COMPARE_MACRO(Uaddwt(z17.VnH(), z15.VnH(), z2.VnB()),
7240                 "uaddwt z17.h, z15.h, z2.b");
7241   COMPARE_MACRO(Uaddwt(z17.VnS(), z15.VnS(), z2.VnH()),
7242                 "uaddwt z17.s, z15.s, z2.h");
7243   COMPARE_MACRO(Usubwb(z10.VnD(), z13.VnD(), z20.VnS()),
7244                 "usubwb z10.d, z13.d, z20.s");
7245   COMPARE_MACRO(Usubwb(z10.VnH(), z13.VnH(), z20.VnB()),
7246                 "usubwb z10.h, z13.h, z20.b");
7247   COMPARE_MACRO(Usubwb(z10.VnS(), z13.VnS(), z20.VnH()),
7248                 "usubwb z10.s, z13.s, z20.h");
7249   COMPARE_MACRO(Usubwt(z15.VnD(), z8.VnD(), z23.VnS()),
7250                 "usubwt z15.d, z8.d, z23.s");
7251   COMPARE_MACRO(Usubwt(z15.VnH(), z8.VnH(), z23.VnB()),
7252                 "usubwt z15.h, z8.h, z23.b");
7253   COMPARE_MACRO(Usubwt(z15.VnS(), z8.VnS(), z23.VnH()),
7254                 "usubwt z15.s, z8.s, z23.h");
7255 
7256   CLEANUP();
7257 }
7258 
TEST(sve2_shift_long)7259 TEST(sve2_shift_long) {
7260   SETUP();
7261 
7262   COMPARE_MACRO(Sshllb(z2.VnH(), z20.VnB(), 0), "sshllb z2.h, z20.b, #0");
7263   COMPARE_MACRO(Sshllb(z2.VnH(), z20.VnB(), 1), "sshllb z2.h, z20.b, #1");
7264   COMPARE_MACRO(Sshllb(z2.VnH(), z20.VnB(), 5), "sshllb z2.h, z20.b, #5");
7265   COMPARE_MACRO(Sshllb(z2.VnH(), z20.VnB(), 7), "sshllb z2.h, z20.b, #7");
7266   COMPARE_MACRO(Sshllb(z2.VnS(), z20.VnH(), 0), "sshllb z2.s, z20.h, #0");
7267   COMPARE_MACRO(Sshllb(z2.VnS(), z20.VnH(), 15), "sshllb z2.s, z20.h, #15");
7268   COMPARE_MACRO(Sshllb(z2.VnD(), z20.VnS(), 0), "sshllb z2.d, z20.s, #0");
7269   COMPARE_MACRO(Sshllb(z2.VnD(), z20.VnS(), 31), "sshllb z2.d, z20.s, #31");
7270   COMPARE_MACRO(Sshllt(z27.VnH(), z8.VnB(), 0), "sshllt z27.h, z8.b, #0");
7271   COMPARE_MACRO(Sshllt(z27.VnH(), z8.VnB(), 7), "sshllt z27.h, z8.b, #7");
7272   COMPARE_MACRO(Sshllt(z27.VnS(), z8.VnH(), 0), "sshllt z27.s, z8.h, #0");
7273   COMPARE_MACRO(Sshllt(z27.VnS(), z8.VnH(), 15), "sshllt z27.s, z8.h, #15");
7274   COMPARE_MACRO(Sshllt(z27.VnD(), z8.VnS(), 0), "sshllt z27.d, z8.s, #0");
7275   COMPARE_MACRO(Sshllt(z27.VnD(), z8.VnS(), 31), "sshllt z27.d, z8.s, #31");
7276   COMPARE_MACRO(Ushllb(z8.VnH(), z31.VnB(), 0), "ushllb z8.h, z31.b, #0");
7277   COMPARE_MACRO(Ushllb(z8.VnH(), z31.VnB(), 7), "ushllb z8.h, z31.b, #7");
7278   COMPARE_MACRO(Ushllb(z8.VnS(), z31.VnH(), 0), "ushllb z8.s, z31.h, #0");
7279   COMPARE_MACRO(Ushllb(z8.VnS(), z31.VnH(), 15), "ushllb z8.s, z31.h, #15");
7280   COMPARE_MACRO(Ushllb(z8.VnD(), z31.VnS(), 0), "ushllb z8.d, z31.s, #0");
7281   COMPARE_MACRO(Ushllb(z8.VnD(), z31.VnS(), 31), "ushllb z8.d, z31.s, #31");
7282   COMPARE_MACRO(Ushllt(z3.VnH(), z21.VnB(), 0), "ushllt z3.h, z21.b, #0");
7283   COMPARE_MACRO(Ushllt(z3.VnH(), z21.VnB(), 7), "ushllt z3.h, z21.b, #7");
7284   COMPARE_MACRO(Ushllt(z3.VnS(), z21.VnH(), 0), "ushllt z3.s, z21.h, #0");
7285   COMPARE_MACRO(Ushllt(z3.VnS(), z21.VnH(), 15), "ushllt z3.s, z21.h, #15");
7286   COMPARE_MACRO(Ushllt(z3.VnD(), z21.VnS(), 0), "ushllt z3.d, z21.s, #0");
7287   COMPARE_MACRO(Ushllt(z3.VnD(), z21.VnS(), 31), "ushllt z3.d, z21.s, #31");
7288 
7289   CLEANUP();
7290 }
7291 
TEST(sve2_shift_narrow)7292 TEST(sve2_shift_narrow) {
7293   SETUP();
7294 
7295   COMPARE_MACRO(Shrnb(z7.VnB(), z4.VnH(), 1), "shrnb z7.b, z4.h, #1");
7296   COMPARE_MACRO(Shrnb(z7.VnB(), z4.VnH(), 2), "shrnb z7.b, z4.h, #2");
7297   COMPARE_MACRO(Shrnb(z7.VnB(), z4.VnH(), 5), "shrnb z7.b, z4.h, #5");
7298   COMPARE_MACRO(Shrnb(z7.VnB(), z4.VnH(), 8), "shrnb z7.b, z4.h, #8");
7299   COMPARE_MACRO(Shrnb(z7.VnH(), z4.VnS(), 1), "shrnb z7.h, z4.s, #1");
7300   COMPARE_MACRO(Shrnb(z7.VnH(), z4.VnS(), 16), "shrnb z7.h, z4.s, #16");
7301   COMPARE_MACRO(Shrnb(z7.VnS(), z4.VnD(), 1), "shrnb z7.s, z4.d, #1");
7302   COMPARE_MACRO(Shrnb(z7.VnS(), z4.VnD(), 32), "shrnb z7.s, z4.d, #32");
7303   COMPARE_MACRO(Shrnt(z21.VnB(), z29.VnH(), 1), "shrnt z21.b, z29.h, #1");
7304   COMPARE_MACRO(Shrnt(z21.VnB(), z29.VnH(), 8), "shrnt z21.b, z29.h, #8");
7305   COMPARE_MACRO(Shrnt(z21.VnH(), z29.VnS(), 1), "shrnt z21.h, z29.s, #1");
7306   COMPARE_MACRO(Shrnt(z21.VnH(), z29.VnS(), 16), "shrnt z21.h, z29.s, #16");
7307   COMPARE_MACRO(Shrnt(z21.VnS(), z29.VnD(), 1), "shrnt z21.s, z29.d, #1");
7308   COMPARE_MACRO(Shrnt(z21.VnS(), z29.VnD(), 32), "shrnt z21.s, z29.d, #32");
7309 
7310   COMPARE_MACRO(Rshrnb(z5.VnB(), z1.VnH(), 1), "rshrnb z5.b, z1.h, #1");
7311   COMPARE_MACRO(Rshrnb(z5.VnB(), z1.VnH(), 8), "rshrnb z5.b, z1.h, #8");
7312   COMPARE_MACRO(Rshrnb(z5.VnH(), z1.VnS(), 16), "rshrnb z5.h, z1.s, #16");
7313   COMPARE_MACRO(Rshrnb(z5.VnS(), z1.VnD(), 32), "rshrnb z5.s, z1.d, #32");
7314   COMPARE_MACRO(Rshrnt(z5.VnB(), z1.VnH(), 8), "rshrnt z5.b, z1.h, #8");
7315   COMPARE_MACRO(Rshrnt(z5.VnH(), z1.VnS(), 16), "rshrnt z5.h, z1.s, #16");
7316   COMPARE_MACRO(Rshrnt(z5.VnS(), z1.VnD(), 32), "rshrnt z5.s, z1.d, #32");
7317 
7318   COMPARE_MACRO(Sqrshrnb(z1.VnB(), z1.VnH(), 1), "sqrshrnb z1.b, z1.h, #1");
7319   COMPARE_MACRO(Sqrshrnb(z1.VnB(), z1.VnH(), 8), "sqrshrnb z1.b, z1.h, #8");
7320   COMPARE_MACRO(Sqrshrnb(z1.VnH(), z1.VnS(), 16), "sqrshrnb z1.h, z1.s, #16");
7321   COMPARE_MACRO(Sqrshrnb(z1.VnS(), z1.VnD(), 32), "sqrshrnb z1.s, z1.d, #32");
7322   COMPARE_MACRO(Sqrshrnt(z24.VnB(), z19.VnH(), 8), "sqrshrnt z24.b, z19.h, #8");
7323   COMPARE_MACRO(Sqrshrnt(z24.VnH(), z19.VnS(), 16),
7324                 "sqrshrnt z24.h, z19.s, #16");
7325   COMPARE_MACRO(Sqrshrnt(z24.VnS(), z19.VnD(), 32),
7326                 "sqrshrnt z24.s, z19.d, #32");
7327 
7328   COMPARE_MACRO(Sqshrnb(z25.VnB(), z1.VnH(), 1), "sqshrnb z25.b, z1.h, #1");
7329   COMPARE_MACRO(Sqshrnb(z25.VnB(), z1.VnH(), 8), "sqshrnb z25.b, z1.h, #8");
7330   COMPARE_MACRO(Sqshrnb(z25.VnH(), z1.VnS(), 16), "sqshrnb z25.h, z1.s, #16");
7331   COMPARE_MACRO(Sqshrnb(z25.VnS(), z1.VnD(), 32), "sqshrnb z25.s, z1.d, #32");
7332   COMPARE_MACRO(Sqshrnt(z0.VnB(), z25.VnH(), 8), "sqshrnt z0.b, z25.h, #8");
7333   COMPARE_MACRO(Sqshrnt(z0.VnH(), z25.VnS(), 16), "sqshrnt z0.h, z25.s, #16");
7334   COMPARE_MACRO(Sqshrnt(z0.VnS(), z25.VnD(), 32), "sqshrnt z0.s, z25.d, #32");
7335 
7336   COMPARE_MACRO(Uqrshrnb(z30.VnB(), z25.VnH(), 1), "uqrshrnb z30.b, z25.h, #1");
7337   COMPARE_MACRO(Uqrshrnb(z30.VnB(), z25.VnH(), 8), "uqrshrnb z30.b, z25.h, #8");
7338   COMPARE_MACRO(Uqrshrnb(z30.VnH(), z25.VnS(), 16),
7339                 "uqrshrnb z30.h, z25.s, #16");
7340   COMPARE_MACRO(Uqrshrnb(z30.VnS(), z25.VnD(), 32),
7341                 "uqrshrnb z30.s, z25.d, #32");
7342   COMPARE_MACRO(Uqrshrnt(z3.VnB(), z25.VnH(), 8), "uqrshrnt z3.b, z25.h, #8");
7343   COMPARE_MACRO(Uqrshrnt(z3.VnH(), z25.VnS(), 16), "uqrshrnt z3.h, z25.s, #16");
7344   COMPARE_MACRO(Uqrshrnt(z3.VnS(), z25.VnD(), 32), "uqrshrnt z3.s, z25.d, #32");
7345 
7346   COMPARE_MACRO(Uqshrnb(z17.VnB(), z4.VnH(), 1), "uqshrnb z17.b, z4.h, #1");
7347   COMPARE_MACRO(Uqshrnb(z17.VnB(), z4.VnH(), 8), "uqshrnb z17.b, z4.h, #8");
7348   COMPARE_MACRO(Uqshrnb(z17.VnH(), z4.VnS(), 16), "uqshrnb z17.h, z4.s, #16");
7349   COMPARE_MACRO(Uqshrnb(z17.VnS(), z4.VnD(), 32), "uqshrnb z17.s, z4.d, #32");
7350   COMPARE_MACRO(Uqshrnt(z28.VnB(), z18.VnH(), 8), "uqshrnt z28.b, z18.h, #8");
7351   COMPARE_MACRO(Uqshrnt(z28.VnH(), z18.VnS(), 16), "uqshrnt z28.h, z18.s, #16");
7352   COMPARE_MACRO(Uqshrnt(z28.VnS(), z18.VnD(), 32), "uqshrnt z28.s, z18.d, #32");
7353 
7354   COMPARE_MACRO(Sqrshrunb(z23.VnB(), z28.VnH(), 1),
7355                 "sqrshrunb z23.b, z28.h, #1");
7356   COMPARE_MACRO(Sqrshrunb(z23.VnB(), z28.VnH(), 8),
7357                 "sqrshrunb z23.b, z28.h, #8");
7358   COMPARE_MACRO(Sqrshrunb(z23.VnH(), z28.VnS(), 16),
7359                 "sqrshrunb z23.h, z28.s, #16");
7360   COMPARE_MACRO(Sqrshrunb(z23.VnS(), z28.VnD(), 32),
7361                 "sqrshrunb z23.s, z28.d, #32");
7362   COMPARE_MACRO(Sqrshrunt(z9.VnB(), z15.VnH(), 8), "sqrshrunt z9.b, z15.h, #8");
7363   COMPARE_MACRO(Sqrshrunt(z9.VnH(), z15.VnS(), 16),
7364                 "sqrshrunt z9.h, z15.s, #16");
7365   COMPARE_MACRO(Sqrshrunt(z9.VnS(), z15.VnD(), 32),
7366                 "sqrshrunt z9.s, z15.d, #32");
7367 
7368   COMPARE_MACRO(Sqshrunb(z25.VnB(), z10.VnH(), 1), "sqshrunb z25.b, z10.h, #1");
7369   COMPARE_MACRO(Sqshrunb(z25.VnB(), z10.VnH(), 8), "sqshrunb z25.b, z10.h, #8");
7370   COMPARE_MACRO(Sqshrunb(z25.VnH(), z10.VnS(), 16),
7371                 "sqshrunb z25.h, z10.s, #16");
7372   COMPARE_MACRO(Sqshrunb(z25.VnS(), z10.VnD(), 32),
7373                 "sqshrunb z25.s, z10.d, #32");
7374   COMPARE_MACRO(Sqshrunt(z20.VnB(), z3.VnH(), 8), "sqshrunt z20.b, z3.h, #8");
7375   COMPARE_MACRO(Sqshrunt(z20.VnH(), z3.VnS(), 16), "sqshrunt z20.h, z3.s, #16");
7376   COMPARE_MACRO(Sqshrunt(z20.VnS(), z3.VnD(), 32), "sqshrunt z20.s, z3.d, #32");
7377 
7378   CLEANUP();
7379 }
7380 
TEST(sve2_aba_long)7381 TEST(sve2_aba_long) {
7382   SETUP();
7383 
7384   COMPARE(sabalb(z13.VnD(), z20.VnS(), z26.VnS()),
7385           "sabalb z13.d, z20.s, z26.s");
7386   COMPARE(sabalb(z13.VnH(), z20.VnB(), z26.VnB()),
7387           "sabalb z13.h, z20.b, z26.b");
7388   COMPARE(sabalb(z13.VnS(), z20.VnH(), z26.VnH()),
7389           "sabalb z13.s, z20.h, z26.h");
7390   COMPARE(sabalt(z14.VnD(), z19.VnS(), z10.VnS()),
7391           "sabalt z14.d, z19.s, z10.s");
7392   COMPARE(sabalt(z14.VnH(), z19.VnB(), z10.VnB()),
7393           "sabalt z14.h, z19.b, z10.b");
7394   COMPARE(sabalt(z14.VnS(), z19.VnH(), z10.VnH()),
7395           "sabalt z14.s, z19.h, z10.h");
7396   COMPARE(uabalb(z11.VnD(), z25.VnS(), z11.VnS()),
7397           "uabalb z11.d, z25.s, z11.s");
7398   COMPARE(uabalb(z11.VnH(), z25.VnB(), z11.VnB()),
7399           "uabalb z11.h, z25.b, z11.b");
7400   COMPARE(uabalb(z11.VnS(), z25.VnH(), z11.VnH()),
7401           "uabalb z11.s, z25.h, z11.h");
7402   COMPARE(uabalt(z4.VnD(), z2.VnS(), z31.VnS()), "uabalt z4.d, z2.s, z31.s");
7403   COMPARE(uabalt(z4.VnH(), z2.VnB(), z31.VnB()), "uabalt z4.h, z2.b, z31.b");
7404   COMPARE(uabalt(z4.VnS(), z2.VnH(), z31.VnH()), "uabalt z4.s, z2.h, z31.h");
7405 
7406   COMPARE_MACRO(Sabalb(z12.VnH(), z12.VnH(), z3.VnB(), z30.VnB()),
7407                 "sabalb z12.h, z3.b, z30.b");
7408   COMPARE_MACRO(Sabalt(z12.VnH(), z12.VnH(), z3.VnB(), z12.VnB()),
7409                 "sabalt z12.h, z3.b, z12.b");
7410   COMPARE_MACRO(Sabalb(z12.VnH(), z12.VnH(), z12.VnB(), z30.VnB()),
7411                 "sabalb z12.h, z12.b, z30.b");
7412   COMPARE_MACRO(Sabalt(z12.VnH(), z12.VnH(), z12.VnB(), z12.VnB()), "");
7413   COMPARE_MACRO(Sabalb(z12.VnH(), z13.VnH(), z3.VnB(), z30.VnB()),
7414                 "movprfx z12, z13\n"
7415                 "sabalb z12.h, z3.b, z30.b");
7416   COMPARE_MACRO(Sabalt(z12.VnH(), z3.VnH(), z3.VnB(), z30.VnB()),
7417                 "movprfx z12, z3\n"
7418                 "sabalt z12.h, z3.b, z30.b");
7419   COMPARE_MACRO(Sabalb(z12.VnH(), z30.VnH(), z3.VnB(), z30.VnB()),
7420                 "movprfx z12, z30\n"
7421                 "sabalb z12.h, z3.b, z30.b");
7422   COMPARE_MACRO(Sabalt(z12.VnH(), z3.VnH(), z3.VnB(), z3.VnB()),
7423                 "mov z12.d, z3.d");
7424   COMPARE_MACRO(Sabalb(z12.VnH(), z3.VnH(), z12.VnB(), z3.VnB()),
7425                 "mov z31.d, z12.d\n"
7426                 "movprfx z12, z3\n"
7427                 "sabalb z12.h, z31.b, z3.b");
7428   COMPARE_MACRO(Sabalt(z12.VnH(), z3.VnH(), z3.VnB(), z12.VnB()),
7429                 "mov z31.d, z12.d\n"
7430                 "movprfx z12, z3\n"
7431                 "sabalt z12.h, z3.b, z31.b");
7432 
7433   COMPARE_MACRO(Uabalt(z12.VnH(), z12.VnH(), z3.VnB(), z30.VnB()),
7434                 "uabalt z12.h, z3.b, z30.b");
7435   COMPARE_MACRO(Uabalb(z12.VnH(), z12.VnH(), z3.VnB(), z12.VnB()),
7436                 "uabalb z12.h, z3.b, z12.b");
7437   COMPARE_MACRO(Uabalt(z12.VnH(), z12.VnH(), z12.VnB(), z30.VnB()),
7438                 "uabalt z12.h, z12.b, z30.b");
7439   COMPARE_MACRO(Uabalb(z12.VnH(), z12.VnH(), z12.VnB(), z12.VnB()), "");
7440   COMPARE_MACRO(Uabalt(z12.VnH(), z13.VnH(), z3.VnB(), z30.VnB()),
7441                 "movprfx z12, z13\n"
7442                 "uabalt z12.h, z3.b, z30.b");
7443   COMPARE_MACRO(Uabalb(z12.VnH(), z3.VnH(), z3.VnB(), z30.VnB()),
7444                 "movprfx z12, z3\n"
7445                 "uabalb z12.h, z3.b, z30.b");
7446   COMPARE_MACRO(Uabalt(z12.VnH(), z30.VnH(), z3.VnB(), z30.VnB()),
7447                 "movprfx z12, z30\n"
7448                 "uabalt z12.h, z3.b, z30.b");
7449   COMPARE_MACRO(Uabalb(z12.VnH(), z3.VnH(), z3.VnB(), z3.VnB()),
7450                 "mov z12.d, z3.d");
7451   COMPARE_MACRO(Uabalt(z12.VnH(), z3.VnH(), z12.VnB(), z3.VnB()),
7452                 "mov z31.d, z12.d\n"
7453                 "movprfx z12, z3\n"
7454                 "uabalt z12.h, z31.b, z3.b");
7455   COMPARE_MACRO(Uabalb(z12.VnH(), z3.VnH(), z3.VnB(), z12.VnB()),
7456                 "mov z31.d, z12.d\n"
7457                 "movprfx z12, z3\n"
7458                 "uabalb z12.h, z3.b, z31.b");
7459   CLEANUP();
7460 }
7461 
TEST(sve2_add_sub_carry)7462 TEST(sve2_add_sub_carry) {
7463   SETUP();
7464 
7465   COMPARE(adclb(z25.VnS(), z17.VnS(), z24.VnS()), "adclb z25.s, z17.s, z24.s");
7466   COMPARE(adclb(z25.VnD(), z17.VnD(), z24.VnD()), "adclb z25.d, z17.d, z24.d");
7467   COMPARE(adclt(z0.VnS(), z2.VnS(), z15.VnS()), "adclt z0.s, z2.s, z15.s");
7468   COMPARE(adclt(z0.VnD(), z2.VnD(), z15.VnD()), "adclt z0.d, z2.d, z15.d");
7469   COMPARE(sbclb(z17.VnS(), z10.VnS(), z8.VnS()), "sbclb z17.s, z10.s, z8.s");
7470   COMPARE(sbclb(z17.VnD(), z10.VnD(), z8.VnD()), "sbclb z17.d, z10.d, z8.d");
7471   COMPARE(sbclt(z20.VnS(), z0.VnS(), z13.VnS()), "sbclt z20.s, z0.s, z13.s");
7472   COMPARE(sbclt(z20.VnD(), z0.VnD(), z13.VnD()), "sbclt z20.d, z0.d, z13.d");
7473 
7474   COMPARE_MACRO(Adclb(z25.VnS(), z25.VnS(), z17.VnS(), z24.VnS()),
7475                 "adclb z25.s, z17.s, z24.s");
7476   COMPARE_MACRO(Adclb(z25.VnS(), z20.VnS(), z17.VnS(), z24.VnS()),
7477                 "movprfx z25, z20\n"
7478                 "adclb z25.s, z17.s, z24.s");
7479   COMPARE_MACRO(Adclb(z25.VnS(), z20.VnS(), z25.VnS(), z24.VnS()),
7480                 "movprfx z31, z20\n"
7481                 "adclb z31.s, z25.s, z24.s\n"
7482                 "mov z25.d, z31.d");
7483   COMPARE_MACRO(Adclb(z25.VnS(), z20.VnS(), z24.VnS(), z25.VnS()),
7484                 "movprfx z31, z20\n"
7485                 "adclb z31.s, z24.s, z25.s\n"
7486                 "mov z25.d, z31.d");
7487   COMPARE_MACRO(Adclb(z25.VnS(), z20.VnS(), z25.VnS(), z25.VnS()),
7488                 "movprfx z31, z20\n"
7489                 "adclb z31.s, z25.s, z25.s\n"
7490                 "mov z25.d, z31.d");
7491   COMPARE_MACRO(Adclt(z25.VnS(), z20.VnS(), z25.VnS(), z25.VnS()),
7492                 "movprfx z31, z20\n"
7493                 "adclt z31.s, z25.s, z25.s\n"
7494                 "mov z25.d, z31.d");
7495 
7496   COMPARE_MACRO(Sbclb(z30.VnS(), z30.VnS(), z7.VnS(), z29.VnS()),
7497                 "sbclb z30.s, z7.s, z29.s");
7498   COMPARE_MACRO(Sbclb(z30.VnS(), z2.VnS(), z7.VnS(), z29.VnS()),
7499                 "movprfx z30, z2\n"
7500                 "sbclb z30.s, z7.s, z29.s");
7501   COMPARE_MACRO(Sbclb(z30.VnS(), z2.VnS(), z30.VnS(), z29.VnS()),
7502                 "movprfx z31, z2\n"
7503                 "sbclb z31.s, z30.s, z29.s\n"
7504                 "mov z30.d, z31.d");
7505   COMPARE_MACRO(Sbclb(z30.VnS(), z2.VnS(), z29.VnS(), z30.VnS()),
7506                 "movprfx z31, z2\n"
7507                 "sbclb z31.s, z29.s, z30.s\n"
7508                 "mov z30.d, z31.d");
7509   COMPARE_MACRO(Sbclb(z30.VnS(), z2.VnS(), z30.VnS(), z30.VnS()),
7510                 "movprfx z31, z2\n"
7511                 "sbclb z31.s, z30.s, z30.s\n"
7512                 "mov z30.d, z31.d");
7513   COMPARE_MACRO(Sbclt(z30.VnS(), z2.VnS(), z30.VnS(), z30.VnS()),
7514                 "movprfx z31, z2\n"
7515                 "sbclt z31.s, z30.s, z30.s\n"
7516                 "mov z30.d, z31.d");
7517   CLEANUP();
7518 }
7519 
TEST(sve2_add_sub_high)7520 TEST(sve2_add_sub_high) {
7521   SETUP();
7522 
7523   COMPARE_MACRO(Addhnb(z29.VnS(), z19.VnD(), z2.VnD()),
7524                 "addhnb z29.s, z19.d, z2.d");
7525   COMPARE_MACRO(Addhnb(z29.VnB(), z19.VnH(), z2.VnH()),
7526                 "addhnb z29.b, z19.h, z2.h");
7527   COMPARE_MACRO(Addhnb(z29.VnH(), z19.VnS(), z2.VnS()),
7528                 "addhnb z29.h, z19.s, z2.s");
7529   COMPARE_MACRO(Addhnt(z8.VnS(), z12.VnD(), z6.VnD()),
7530                 "addhnt z8.s, z12.d, z6.d");
7531   COMPARE_MACRO(Addhnt(z8.VnB(), z12.VnH(), z6.VnH()),
7532                 "addhnt z8.b, z12.h, z6.h");
7533   COMPARE_MACRO(Addhnt(z8.VnH(), z12.VnS(), z6.VnS()),
7534                 "addhnt z8.h, z12.s, z6.s");
7535   COMPARE_MACRO(Raddhnb(z0.VnS(), z11.VnD(), z10.VnD()),
7536                 "raddhnb z0.s, z11.d, z10.d");
7537   COMPARE_MACRO(Raddhnb(z0.VnB(), z11.VnH(), z10.VnH()),
7538                 "raddhnb z0.b, z11.h, z10.h");
7539   COMPARE_MACRO(Raddhnb(z0.VnH(), z11.VnS(), z10.VnS()),
7540                 "raddhnb z0.h, z11.s, z10.s");
7541   COMPARE_MACRO(Raddhnt(z23.VnS(), z27.VnD(), z9.VnD()),
7542                 "raddhnt z23.s, z27.d, z9.d");
7543   COMPARE_MACRO(Raddhnt(z23.VnB(), z27.VnH(), z9.VnH()),
7544                 "raddhnt z23.b, z27.h, z9.h");
7545   COMPARE_MACRO(Raddhnt(z23.VnH(), z27.VnS(), z9.VnS()),
7546                 "raddhnt z23.h, z27.s, z9.s");
7547   COMPARE_MACRO(Rsubhnb(z30.VnS(), z29.VnD(), z11.VnD()),
7548                 "rsubhnb z30.s, z29.d, z11.d");
7549   COMPARE_MACRO(Rsubhnb(z30.VnB(), z29.VnH(), z11.VnH()),
7550                 "rsubhnb z30.b, z29.h, z11.h");
7551   COMPARE_MACRO(Rsubhnb(z30.VnH(), z29.VnS(), z11.VnS()),
7552                 "rsubhnb z30.h, z29.s, z11.s");
7553   COMPARE_MACRO(Rsubhnt(z25.VnS(), z7.VnD(), z18.VnD()),
7554                 "rsubhnt z25.s, z7.d, z18.d");
7555   COMPARE_MACRO(Rsubhnt(z25.VnB(), z7.VnH(), z18.VnH()),
7556                 "rsubhnt z25.b, z7.h, z18.h");
7557   COMPARE_MACRO(Rsubhnt(z25.VnH(), z7.VnS(), z18.VnS()),
7558                 "rsubhnt z25.h, z7.s, z18.s");
7559   COMPARE_MACRO(Subhnb(z31.VnS(), z31.VnD(), z7.VnD()),
7560                 "subhnb z31.s, z31.d, z7.d");
7561   COMPARE_MACRO(Subhnb(z31.VnB(), z31.VnH(), z7.VnH()),
7562                 "subhnb z31.b, z31.h, z7.h");
7563   COMPARE_MACRO(Subhnb(z31.VnH(), z31.VnS(), z7.VnS()),
7564                 "subhnb z31.h, z31.s, z7.s");
7565   COMPARE_MACRO(Subhnt(z31.VnS(), z22.VnD(), z27.VnD()),
7566                 "subhnt z31.s, z22.d, z27.d");
7567   COMPARE_MACRO(Subhnt(z31.VnB(), z22.VnH(), z27.VnH()),
7568                 "subhnt z31.b, z22.h, z27.h");
7569   COMPARE_MACRO(Subhnt(z31.VnH(), z22.VnS(), z27.VnS()),
7570                 "subhnt z31.h, z22.s, z27.s");
7571 
7572   CLEANUP();
7573 }
7574 
TEST(sve2_complex_addition)7575 TEST(sve2_complex_addition) {
7576   SETUP();
7577 
7578   COMPARE_MACRO(Cadd(z5.VnB(), z5.VnB(), z12.VnB(), 90),
7579                 "cadd z5.b, z5.b, z12.b, #90");
7580   COMPARE_MACRO(Cadd(z5.VnD(), z5.VnD(), z12.VnD(), 90),
7581                 "cadd z5.d, z5.d, z12.d, #90");
7582   COMPARE_MACRO(Cadd(z5.VnH(), z5.VnH(), z12.VnH(), 90),
7583                 "cadd z5.h, z5.h, z12.h, #90");
7584   COMPARE_MACRO(Cadd(z5.VnS(), z5.VnS(), z12.VnS(), 90),
7585                 "cadd z5.s, z5.s, z12.s, #90");
7586   COMPARE_MACRO(Cadd(z5.VnB(), z5.VnB(), z12.VnB(), 270),
7587                 "cadd z5.b, z5.b, z12.b, #270");
7588   COMPARE_MACRO(Cadd(z5.VnD(), z5.VnD(), z12.VnD(), 270),
7589                 "cadd z5.d, z5.d, z12.d, #270");
7590   COMPARE_MACRO(Cadd(z5.VnH(), z5.VnH(), z12.VnH(), 270),
7591                 "cadd z5.h, z5.h, z12.h, #270");
7592   COMPARE_MACRO(Cadd(z5.VnS(), z5.VnS(), z12.VnS(), 270),
7593                 "cadd z5.s, z5.s, z12.s, #270");
7594   COMPARE_MACRO(Cadd(z5.VnS(), z6.VnS(), z12.VnS(), 270),
7595                 "movprfx z5, z6\n"
7596                 "cadd z5.s, z5.s, z12.s, #270");
7597   COMPARE_MACRO(Cadd(z5.VnS(), z6.VnS(), z5.VnS(), 270),
7598                 "mov z31.d, z5.d\n"
7599                 "movprfx z5, z6\n"
7600                 "cadd z5.s, z5.s, z31.s, #270");
7601 
7602   COMPARE_MACRO(Sqcadd(z20.VnB(), z20.VnB(), z23.VnB(), 90),
7603                 "sqcadd z20.b, z20.b, z23.b, #90");
7604   COMPARE_MACRO(Sqcadd(z20.VnD(), z20.VnD(), z23.VnD(), 90),
7605                 "sqcadd z20.d, z20.d, z23.d, #90");
7606   COMPARE_MACRO(Sqcadd(z20.VnH(), z20.VnH(), z23.VnH(), 90),
7607                 "sqcadd z20.h, z20.h, z23.h, #90");
7608   COMPARE_MACRO(Sqcadd(z20.VnB(), z20.VnB(), z23.VnB(), 270),
7609                 "sqcadd z20.b, z20.b, z23.b, #270");
7610   COMPARE_MACRO(Sqcadd(z20.VnD(), z20.VnD(), z23.VnD(), 270),
7611                 "sqcadd z20.d, z20.d, z23.d, #270");
7612   COMPARE_MACRO(Sqcadd(z20.VnH(), z20.VnH(), z23.VnH(), 270),
7613                 "sqcadd z20.h, z20.h, z23.h, #270");
7614   COMPARE_MACRO(Sqcadd(z20.VnS(), z20.VnS(), z23.VnS(), 270),
7615                 "sqcadd z20.s, z20.s, z23.s, #270");
7616   COMPARE_MACRO(Sqcadd(z20.VnH(), z21.VnH(), z23.VnH(), 270),
7617                 "movprfx z20, z21\n"
7618                 "sqcadd z20.h, z20.h, z23.h, #270");
7619   COMPARE_MACRO(Sqcadd(z20.VnH(), z21.VnH(), z20.VnH(), 270),
7620                 "mov z31.d, z20.d\n"
7621                 "movprfx z20, z21\n"
7622                 "sqcadd z20.h, z20.h, z31.h, #270");
7623 
7624   CLEANUP();
7625 }
7626 
TEST(sve2_bit_permute)7627 TEST(sve2_bit_permute) {
7628   SETUP();
7629 
7630   COMPARE_MACRO(Bdep(z18.VnB(), z10.VnB(), z0.VnB()),
7631                 "bdep z18.b, z10.b, z0.b");
7632   COMPARE_MACRO(Bdep(z18.VnD(), z10.VnD(), z0.VnD()),
7633                 "bdep z18.d, z10.d, z0.d");
7634   COMPARE_MACRO(Bdep(z18.VnH(), z10.VnH(), z0.VnH()),
7635                 "bdep z18.h, z10.h, z0.h");
7636   COMPARE_MACRO(Bdep(z18.VnS(), z10.VnS(), z0.VnS()),
7637                 "bdep z18.s, z10.s, z0.s");
7638   COMPARE_MACRO(Bext(z6.VnB(), z2.VnB(), z5.VnB()), "bext z6.b, z2.b, z5.b");
7639   COMPARE_MACRO(Bext(z6.VnD(), z2.VnD(), z5.VnD()), "bext z6.d, z2.d, z5.d");
7640   COMPARE_MACRO(Bext(z6.VnH(), z2.VnH(), z5.VnH()), "bext z6.h, z2.h, z5.h");
7641   COMPARE_MACRO(Bext(z6.VnS(), z2.VnS(), z5.VnS()), "bext z6.s, z2.s, z5.s");
7642   COMPARE_MACRO(Bgrp(z24.VnB(), z9.VnB(), z5.VnB()), "bgrp z24.b, z9.b, z5.b");
7643   COMPARE_MACRO(Bgrp(z24.VnD(), z9.VnD(), z5.VnD()), "bgrp z24.d, z9.d, z5.d");
7644   COMPARE_MACRO(Bgrp(z24.VnH(), z9.VnH(), z5.VnH()), "bgrp z24.h, z9.h, z5.h");
7645   COMPARE_MACRO(Bgrp(z24.VnS(), z9.VnS(), z5.VnS()), "bgrp z24.s, z9.s, z5.s");
7646 
7647   CLEANUP();
7648 }
7649 
TEST(sve2_integer_multiply_long_vector)7650 TEST(sve2_integer_multiply_long_vector) {
7651   SETUP();
7652 
7653   COMPARE(sqdmullb(z1.VnD(), z31.VnS(), z21.VnS()),
7654           "sqdmullb z1.d, z31.s, z21.s");
7655   COMPARE(sqdmullb(z2.VnH(), z30.VnB(), z22.VnB()),
7656           "sqdmullb z2.h, z30.b, z22.b");
7657   COMPARE(sqdmullb(z3.VnS(), z29.VnH(), z23.VnH()),
7658           "sqdmullb z3.s, z29.h, z23.h");
7659   COMPARE(sqdmullb(z1.VnS(), z27.VnH(), z3.VnH(), 7),
7660           "sqdmullb z1.s, z27.h, z3.h[7]");
7661   COMPARE(sqdmullb(z27.VnD(), z16.VnS(), z5.VnS(), 3),
7662           "sqdmullb z27.d, z16.s, z5.s[3]");
7663 
7664   COMPARE(sqdmullt(z2.VnD(), z1.VnS(), z5.VnS()), "sqdmullt z2.d, z1.s, z5.s");
7665   COMPARE(sqdmullt(z12.VnH(), z11.VnB(), z15.VnB()),
7666           "sqdmullt z12.h, z11.b, z15.b");
7667   COMPARE(sqdmullt(z20.VnS(), z21.VnH(), z25.VnH()),
7668           "sqdmullt z20.s, z21.h, z25.h");
7669   COMPARE(sqdmullt(z23.VnS(), z28.VnH(), z2.VnH(), 0),
7670           "sqdmullt z23.s, z28.h, z2.h[0]");
7671   COMPARE(sqdmullt(z7.VnD(), z4.VnS(), z0.VnS(), 0),
7672           "sqdmullt z7.d, z4.s, z0.s[0]");
7673 
7674   // Feature `SVEPmull128` is not supported.
7675   // COMPARE(pmullb(z12.VnQ(), z21.VnD(), z12.VnD()),
7676   //                "pmullb z12.q, z21.d, z12.d");
7677   COMPARE(pmullb(z12.VnH(), z21.VnB(), z12.VnB()),
7678           "pmullb z12.h, z21.b, z12.b");
7679   COMPARE(pmullt(z31.VnD(), z30.VnS(), z26.VnS()),
7680           "pmullt z31.d, z30.s, z26.s");
7681 
7682   COMPARE(smullb(z10.VnD(), z4.VnS(), z4.VnS()), "smullb z10.d, z4.s, z4.s");
7683   COMPARE(smullb(z11.VnH(), z14.VnB(), z14.VnB()),
7684           "smullb z11.h, z14.b, z14.b");
7685   COMPARE(smullb(z12.VnS(), z24.VnH(), z24.VnH()),
7686           "smullb z12.s, z24.h, z24.h");
7687 
7688   COMPARE(smullt(z31.VnD(), z26.VnS(), z5.VnS()), "smullt z31.d, z26.s, z5.s");
7689   COMPARE(smullt(z21.VnH(), z16.VnB(), z5.VnB()), "smullt z21.h, z16.b, z5.b");
7690   COMPARE(smullt(z11.VnS(), z6.VnH(), z5.VnH()), "smullt z11.s, z6.h, z5.h");
7691 
7692   COMPARE(umullb(z12.VnD(), z5.VnS(), z2.VnS()), "umullb z12.d, z5.s, z2.s");
7693   COMPARE(umullb(z12.VnH(), z15.VnB(), z12.VnB()),
7694           "umullb z12.h, z15.b, z12.b");
7695   COMPARE(umullb(z12.VnS(), z25.VnH(), z22.VnH()),
7696           "umullb z12.s, z25.h, z22.h");
7697 
7698   COMPARE(umullt(z24.VnD(), z6.VnS(), z6.VnS()), "umullt z24.d, z6.s, z6.s");
7699   COMPARE(umullt(z24.VnH(), z7.VnB(), z16.VnB()), "umullt z24.h, z7.b, z16.b");
7700   COMPARE(umullt(z24.VnS(), z8.VnH(), z26.VnH()), "umullt z24.s, z8.h, z26.h");
7701 
7702   CLEANUP();
7703 }
7704 
TEST(sve2_xar)7705 TEST(sve2_xar) {
7706   SETUP();
7707 
7708   COMPARE_MACRO(Xar(z16.VnB(), z16.VnB(), z13.VnB(), 1),
7709                 "xar z16.b, z16.b, z13.b, #1");
7710   COMPARE_MACRO(Xar(z16.VnB(), z16.VnB(), z13.VnB(), 8),
7711                 "xar z16.b, z16.b, z13.b, #8");
7712   COMPARE_MACRO(Xar(z16.VnH(), z16.VnH(), z13.VnH(), 1),
7713                 "xar z16.h, z16.h, z13.h, #1");
7714   COMPARE_MACRO(Xar(z16.VnH(), z16.VnH(), z13.VnH(), 16),
7715                 "xar z16.h, z16.h, z13.h, #16");
7716   COMPARE_MACRO(Xar(z16.VnS(), z16.VnS(), z13.VnS(), 1),
7717                 "xar z16.s, z16.s, z13.s, #1");
7718   COMPARE_MACRO(Xar(z16.VnS(), z16.VnS(), z13.VnS(), 32),
7719                 "xar z16.s, z16.s, z13.s, #32");
7720   COMPARE_MACRO(Xar(z16.VnD(), z16.VnD(), z13.VnD(), 1),
7721                 "xar z16.d, z16.d, z13.d, #1");
7722   COMPARE_MACRO(Xar(z16.VnD(), z16.VnD(), z13.VnD(), 64),
7723                 "xar z16.d, z16.d, z13.d, #64");
7724 
7725   COMPARE_MACRO(Xar(z16.VnD(), z13.VnD(), z16.VnD(), 64),
7726                 "xar z16.d, z16.d, z13.d, #64");
7727   COMPARE_MACRO(Xar(z16.VnD(), z13.VnD(), z12.VnD(), 64),
7728                 "movprfx z16, z13\n"
7729                 "xar z16.d, z16.d, z12.d, #64");
7730   COMPARE_MACRO(Xar(z16.VnD(), z16.VnD(), z16.VnD(), 64),
7731                 "xar z16.d, z16.d, z16.d, #64");
7732 
7733   CLEANUP();
7734 }
7735 
TEST(sve2_histogram)7736 TEST(sve2_histogram) {
7737   SETUP();
7738 
7739   COMPARE_MACRO(Histcnt(z24.VnS(), p6.Zeroing(), z3.VnS(), z10.VnS()),
7740                 "histcnt z24.s, p6/z, z3.s, z10.s");
7741   COMPARE_MACRO(Histcnt(z24.VnD(), p6.Zeroing(), z3.VnD(), z10.VnD()),
7742                 "histcnt z24.d, p6/z, z3.d, z10.d");
7743   COMPARE_MACRO(Histseg(z22.VnB(), z14.VnB(), z8.VnB()),
7744                 "histseg z22.b, z14.b, z8.b");
7745 
7746   CLEANUP();
7747 }
7748 
TEST(sve2_table)7749 TEST(sve2_table) {
7750   SETUP();
7751 
7752   COMPARE_MACRO(Tbl(z17.VnB(), z1.VnB(), z2.VnB(), z22.VnB()),
7753                 "tbl z17.b, {z3.b, z4.b}, z22.b");
7754   COMPARE_MACRO(Tbl(z17.VnD(), z1.VnD(), z2.VnD(), z22.VnD()),
7755                 "tbl z17.d, {z3.d, z4.d}, z22.d");
7756   COMPARE_MACRO(Tbl(z17.VnH(), z1.VnH(), z2.VnH(), z22.VnH()),
7757                 "tbl z17.h, {z3.h, z4.h}, z22.h");
7758   COMPARE_MACRO(Tbl(z17.VnS(), z31.VnS(), z0.VnS(), z22.VnS()),
7759                 "tbl z17.s, {z31.s, z0.s}, z22.s");
7760   COMPARE_MACRO(Tbx(z22.VnB(), z15.VnB(), z19.VnB()),
7761                 "tbx z22.b, z15.b, z19.b");
7762   COMPARE_MACRO(Tbx(z22.VnD(), z15.VnD(), z19.VnD()),
7763                 "tbx z22.d, z15.d, z19.d");
7764   COMPARE_MACRO(Tbx(z22.VnH(), z15.VnH(), z19.VnH()),
7765                 "tbx z22.h, z15.h, z19.h");
7766   COMPARE_MACRO(Tbx(z22.VnS(), z15.VnS(), z19.VnS()),
7767                 "tbx z22.s, z15.s, z19.s");
7768 
7769   CLEANUP();
7770 }
7771 
TEST(sve2_cdot)7772 TEST(sve2_cdot) {
7773   SETUP();
7774 
7775   COMPARE_MACRO(Cdot(z7.VnS(), z7.VnS(), z4.VnB(), z10.VnB(), 0),
7776                 "cdot z7.s, z4.b, z10.b, #0");
7777   COMPARE_MACRO(Cdot(z7.VnD(), z7.VnD(), z4.VnH(), z10.VnH(), 0),
7778                 "cdot z7.d, z4.h, z10.h, #0");
7779   COMPARE_MACRO(Cdot(z7.VnS(), z7.VnS(), z4.VnB(), z10.VnB(), 90),
7780                 "cdot z7.s, z4.b, z10.b, #90");
7781   COMPARE_MACRO(Cdot(z7.VnD(), z7.VnD(), z4.VnH(), z10.VnH(), 90),
7782                 "cdot z7.d, z4.h, z10.h, #90");
7783   COMPARE_MACRO(Cdot(z7.VnS(), z7.VnS(), z4.VnB(), z10.VnB(), 180),
7784                 "cdot z7.s, z4.b, z10.b, #180");
7785   COMPARE_MACRO(Cdot(z7.VnD(), z7.VnD(), z4.VnH(), z10.VnH(), 180),
7786                 "cdot z7.d, z4.h, z10.h, #180");
7787   COMPARE_MACRO(Cdot(z7.VnS(), z7.VnS(), z4.VnB(), z10.VnB(), 270),
7788                 "cdot z7.s, z4.b, z10.b, #270");
7789   COMPARE_MACRO(Cdot(z7.VnD(), z7.VnD(), z4.VnH(), z10.VnH(), 270),
7790                 "cdot z7.d, z4.h, z10.h, #270");
7791 
7792   COMPARE_MACRO(Cdot(z0.VnS(), z1.VnS(), z2.VnB(), z3.VnB(), 0),
7793                 "movprfx z0, z1\n"
7794                 "cdot z0.s, z2.b, z3.b, #0");
7795   COMPARE_MACRO(Cdot(z0.VnS(), z1.VnS(), z0.VnB(), z3.VnB(), 0),
7796                 "mov z31.d, z0.d\n"
7797                 "movprfx z0, z1\n"
7798                 "cdot z0.s, z31.b, z3.b, #0");
7799   COMPARE_MACRO(Cdot(z0.VnS(), z1.VnS(), z2.VnB(), z0.VnB(), 0),
7800                 "mov z31.d, z0.d\n"
7801                 "movprfx z0, z1\n"
7802                 "cdot z0.s, z2.b, z31.b, #0");
7803   COMPARE_MACRO(Cdot(z0.VnS(), z1.VnS(), z0.VnB(), z0.VnB(), 0),
7804                 "mov z31.d, z0.d\n"
7805                 "movprfx z0, z1\n"
7806                 "cdot z0.s, z31.b, z31.b, #0");
7807 
7808   COMPARE_MACRO(Cdot(z18.VnS(), z18.VnS(), z26.VnB(), z7.VnB(), 0, 0),
7809                 "cdot z18.s, z26.b, z7.b[0], #0");
7810   COMPARE_MACRO(Cdot(z18.VnS(), z18.VnS(), z26.VnB(), z7.VnB(), 1, 0),
7811                 "cdot z18.s, z26.b, z7.b[1], #0");
7812   COMPARE_MACRO(Cdot(z18.VnS(), z18.VnS(), z26.VnB(), z7.VnB(), 2, 0),
7813                 "cdot z18.s, z26.b, z7.b[2], #0");
7814   COMPARE_MACRO(Cdot(z18.VnS(), z18.VnS(), z26.VnB(), z7.VnB(), 3, 0),
7815                 "cdot z18.s, z26.b, z7.b[3], #0");
7816   COMPARE_MACRO(Cdot(z18.VnS(), z18.VnS(), z26.VnB(), z7.VnB(), 2, 90),
7817                 "cdot z18.s, z26.b, z7.b[2], #90");
7818   COMPARE_MACRO(Cdot(z18.VnS(), z18.VnS(), z26.VnB(), z7.VnB(), 2, 180),
7819                 "cdot z18.s, z26.b, z7.b[2], #180");
7820   COMPARE_MACRO(Cdot(z18.VnS(), z18.VnS(), z26.VnB(), z7.VnB(), 2, 270),
7821                 "cdot z18.s, z26.b, z7.b[2], #270");
7822   COMPARE_MACRO(Cdot(z5.VnD(), z5.VnD(), z7.VnH(), z1.VnH(), 0, 0),
7823                 "cdot z5.d, z7.h, z1.h[0], #0");
7824   COMPARE_MACRO(Cdot(z5.VnD(), z5.VnD(), z7.VnH(), z1.VnH(), 1, 0),
7825                 "cdot z5.d, z7.h, z1.h[1], #0");
7826   COMPARE_MACRO(Cdot(z5.VnD(), z5.VnD(), z7.VnH(), z1.VnH(), 1, 90),
7827                 "cdot z5.d, z7.h, z1.h[1], #90");
7828   COMPARE_MACRO(Cdot(z5.VnD(), z5.VnD(), z7.VnH(), z1.VnH(), 1, 180),
7829                 "cdot z5.d, z7.h, z1.h[1], #180");
7830   COMPARE_MACRO(Cdot(z5.VnD(), z5.VnD(), z7.VnH(), z1.VnH(), 1, 270),
7831                 "cdot z5.d, z7.h, z1.h[1], #270");
7832 
7833   COMPARE_MACRO(Cdot(z0.VnS(), z1.VnS(), z2.VnB(), z3.VnB(), 0, 0),
7834                 "movprfx z0, z1\n"
7835                 "cdot z0.s, z2.b, z3.b[0], #0");
7836   COMPARE_MACRO(Cdot(z0.VnS(), z1.VnS(), z0.VnB(), z3.VnB(), 1, 90),
7837                 "movprfx z31, z1\n"
7838                 "cdot z31.s, z0.b, z3.b[1], #90\n"
7839                 "mov z0.d, z31.d");
7840   COMPARE_MACRO(Cdot(z0.VnS(), z1.VnS(), z2.VnB(), z0.VnB(), 2, 180),
7841                 "movprfx z31, z1\n"
7842                 "cdot z31.s, z2.b, z0.b[2], #180\n"
7843                 "mov z0.d, z31.d");
7844   COMPARE_MACRO(Cdot(z0.VnS(), z1.VnS(), z0.VnB(), z0.VnB(), 3, 270),
7845                 "movprfx z31, z1\n"
7846                 "cdot z31.s, z0.b, z0.b[3], #270\n"
7847                 "mov z0.d, z31.d");
7848 
7849   CLEANUP();
7850 }
7851 
TEST(sve2_ldnt1)7852 TEST(sve2_ldnt1) {
7853   SETUP();
7854 
7855   COMPARE_MACRO(Ldnt1b(z24.VnS(), p4.Zeroing(), SVEMemOperand(z18.VnS(), x13)),
7856                 "ldnt1b {z24.s}, p4/z, [z18.s, x13]");
7857   COMPARE_MACRO(Ldnt1h(z3.VnS(), p4.Zeroing(), SVEMemOperand(z15.VnS(), x14)),
7858                 "ldnt1h {z3.s}, p4/z, [z15.s, x14]");
7859   COMPARE_MACRO(Ldnt1sb(z7.VnS(), p3.Zeroing(), SVEMemOperand(z18.VnS(), x11)),
7860                 "ldnt1sb {z7.s}, p3/z, [z18.s, x11]");
7861   COMPARE_MACRO(Ldnt1sh(z17.VnS(), p5.Zeroing(), SVEMemOperand(z31.VnS(), x19)),
7862                 "ldnt1sh {z17.s}, p5/z, [z31.s, x19]");
7863   COMPARE_MACRO(Ldnt1w(z18.VnS(), p5.Zeroing(), SVEMemOperand(z9.VnS(), x17)),
7864                 "ldnt1w {z18.s}, p5/z, [z9.s, x17]");
7865 
7866   COMPARE_MACRO(Ldnt1b(z27.VnD(), p4.Zeroing(), SVEMemOperand(z27.VnD(), x24)),
7867                 "ldnt1b {z27.d}, p4/z, [z27.d, x24]");
7868   COMPARE_MACRO(Ldnt1d(z25.VnD(), p0.Zeroing(), SVEMemOperand(z10.VnD(), x0)),
7869                 "ldnt1d {z25.d}, p0/z, [z10.d, x0]");
7870   COMPARE_MACRO(Ldnt1h(z16.VnD(), p2.Zeroing(), SVEMemOperand(z10.VnD(), x9)),
7871                 "ldnt1h {z16.d}, p2/z, [z10.d, x9]");
7872   COMPARE_MACRO(Ldnt1sb(z25.VnD(), p0.Zeroing(), SVEMemOperand(z0.VnD(), x3)),
7873                 "ldnt1sb {z25.d}, p0/z, [z0.d, x3]");
7874   COMPARE_MACRO(Ldnt1sh(z4.VnD(), p1.Zeroing(), SVEMemOperand(z31.VnD(), x4)),
7875                 "ldnt1sh {z4.d}, p1/z, [z31.d, x4]");
7876   COMPARE_MACRO(Ldnt1sw(z3.VnD(), p7.Zeroing(), SVEMemOperand(z1.VnD(), x10)),
7877                 "ldnt1sw {z3.d}, p7/z, [z1.d, x10]");
7878   COMPARE_MACRO(Ldnt1w(z17.VnD(), p5.Zeroing(), SVEMemOperand(z8.VnD(), x12)),
7879                 "ldnt1w {z17.d}, p5/z, [z8.d, x12]");
7880 
7881   CLEANUP();
7882 }
7883 
TEST(sve2_stnt1)7884 TEST(sve2_stnt1) {
7885   SETUP();
7886 
7887   COMPARE_MACRO(Stnt1b(z29.VnD(), p7, SVEMemOperand(z29.VnD(), x21)),
7888                 "stnt1b {z29.d}, p7, [z29.d, x21]");
7889   COMPARE_MACRO(Stnt1d(z19.VnD(), p4, SVEMemOperand(z3.VnD(), x16)),
7890                 "stnt1d {z19.d}, p4, [z3.d, x16]");
7891   COMPARE_MACRO(Stnt1h(z11.VnS(), p3, SVEMemOperand(z2.VnS(), x16)),
7892                 "stnt1h {z11.s}, p3, [z2.s, x16]");
7893   COMPARE_MACRO(Stnt1h(z3.VnD(), p3, SVEMemOperand(z10.VnD(), x16)),
7894                 "stnt1h {z3.d}, p3, [z10.d, x16]");
7895   COMPARE_MACRO(Stnt1w(z11.VnS(), p4, SVEMemOperand(z14.VnS(), x15)),
7896                 "stnt1w {z11.s}, p4, [z14.s, x15]");
7897   COMPARE_MACRO(Stnt1w(z7.VnD(), p0, SVEMemOperand(z11.VnD(), x10)),
7898                 "stnt1w {z7.d}, p0, [z11.d, x10]");
7899 
7900   CLEANUP();
7901 }
7902 
TEST(sve2_bitwise_ternary)7903 TEST(sve2_bitwise_ternary) {
7904   SETUP();
7905 
7906   COMPARE_MACRO(Bcax(z6.VnD(), z6.VnD(), z12.VnD(), z1.VnD()),
7907                 "bcax z6.d, z6.d, z12.d, z1.d");
7908   COMPARE_MACRO(Bsl(z21.VnD(), z21.VnD(), z2.VnD(), z2.VnD()),
7909                 "bsl z21.d, z21.d, z2.d, z2.d");
7910   COMPARE_MACRO(Bsl1n(z18.VnD(), z18.VnD(), z8.VnD(), z7.VnD()),
7911                 "bsl1n z18.d, z18.d, z8.d, z7.d");
7912   COMPARE_MACRO(Bsl2n(z7.VnD(), z7.VnD(), z3.VnD(), z19.VnD()),
7913                 "bsl2n z7.d, z7.d, z3.d, z19.d");
7914   COMPARE_MACRO(Eor3(z10.VnD(), z10.VnD(), z24.VnD(), z23.VnD()),
7915                 "eor3 z10.d, z10.d, z24.d, z23.d");
7916   COMPARE_MACRO(Nbsl(z17.VnD(), z17.VnD(), z21.VnD(), z27.VnD()),
7917                 "nbsl z17.d, z17.d, z21.d, z27.d");
7918 
7919   COMPARE_MACRO(Nbsl(z17.VnD(), z18.VnD(), z21.VnD(), z27.VnD()),
7920                 "movprfx z17, z18\n"
7921                 "nbsl z17.d, z17.d, z21.d, z27.d");
7922   COMPARE_MACRO(Nbsl(z17.VnD(), z18.VnD(), z17.VnD(), z27.VnD()),
7923                 "movprfx z31, z18\n"
7924                 "nbsl z31.d, z31.d, z17.d, z27.d\n"
7925                 "mov z17.d, z31.d");
7926   COMPARE_MACRO(Nbsl(z17.VnD(), z18.VnD(), z21.VnD(), z17.VnD()),
7927                 "movprfx z31, z18\n"
7928                 "nbsl z31.d, z31.d, z21.d, z17.d\n"
7929                 "mov z17.d, z31.d");
7930   COMPARE_MACRO(Nbsl(z17.VnD(), z18.VnD(), z17.VnD(), z17.VnD()),
7931                 "movprfx z31, z18\n"
7932                 "nbsl z31.d, z31.d, z17.d, z17.d\n"
7933                 "mov z17.d, z31.d");
7934 
7935   CLEANUP();
7936 }
7937 
TEST(sve2_int_compare_scalars)7938 TEST(sve2_int_compare_scalars) {
7939   SETUP();
7940 
7941   COMPARE_MACRO(Whilege(p0.VnB(), w20, w29), "whilege p0.b, w20, w29");
7942   COMPARE_MACRO(Whilege(p0.VnB(), x20, x29), "whilege p0.b, x20, x29");
7943   COMPARE_MACRO(Whilege(p0.VnD(), w20, w29), "whilege p0.d, w20, w29");
7944   COMPARE_MACRO(Whilege(p0.VnD(), x20, x29), "whilege p0.d, x20, x29");
7945   COMPARE_MACRO(Whilege(p0.VnH(), w20, w29), "whilege p0.h, w20, w29");
7946   COMPARE_MACRO(Whilege(p0.VnH(), x20, x29), "whilege p0.h, x20, x29");
7947   COMPARE_MACRO(Whilege(p0.VnS(), w20, w29), "whilege p0.s, w20, w29");
7948   COMPARE_MACRO(Whilege(p0.VnS(), x20, x29), "whilege p0.s, x20, x29");
7949   COMPARE_MACRO(Whilegt(p11.VnB(), w24, w3), "whilegt p11.b, w24, w3");
7950   COMPARE_MACRO(Whilegt(p11.VnD(), w24, w3), "whilegt p11.d, w24, w3");
7951   COMPARE_MACRO(Whilegt(p11.VnH(), x24, x3), "whilegt p11.h, x24, x3");
7952   COMPARE_MACRO(Whilegt(p11.VnS(), x24, x3), "whilegt p11.s, x24, x3");
7953   COMPARE_MACRO(Whilehi(p2.VnB(), x20, x8), "whilehi p2.b, x20, x8");
7954   COMPARE_MACRO(Whilehi(p2.VnD(), x20, x8), "whilehi p2.d, x20, x8");
7955   COMPARE_MACRO(Whilehi(p2.VnH(), w20, w8), "whilehi p2.h, w20, w8");
7956   COMPARE_MACRO(Whilehi(p2.VnS(), w20, w8), "whilehi p2.s, w20, w8");
7957   COMPARE_MACRO(Whilehs(p4.VnB(), w22, w9), "whilehs p4.b, w22, w9");
7958   COMPARE_MACRO(Whilehs(p4.VnD(), x22, x9), "whilehs p4.d, x22, x9");
7959   COMPARE_MACRO(Whilehs(p4.VnH(), w22, w9), "whilehs p4.h, w22, w9");
7960   COMPARE_MACRO(Whilehs(p4.VnS(), x22, x9), "whilehs p4.s, x22, x9");
7961 
7962   COMPARE_MACRO(Whilerw(p7.VnB(), x25, x27), "whilerw p7.b, x25, x27");
7963   COMPARE_MACRO(Whilerw(p7.VnD(), x25, x28), "whilerw p7.d, x25, x28");
7964   COMPARE_MACRO(Whilerw(p7.VnH(), x25, x29), "whilerw p7.h, x25, x29");
7965   COMPARE_MACRO(Whilerw(p7.VnS(), x25, x30), "whilerw p7.s, x25, x30");
7966   COMPARE_MACRO(Whilerw(p7.VnS(), x25, xzr), "whilerw p7.s, x25, xzr");
7967   COMPARE_MACRO(Whilewr(p8.VnB(), x14, x14), "whilewr p8.b, x14, x14");
7968   COMPARE_MACRO(Whilewr(p8.VnD(), x14, x13), "whilewr p8.d, x14, x13");
7969   COMPARE_MACRO(Whilewr(p8.VnH(), x14, x12), "whilewr p8.h, x14, x12");
7970   COMPARE_MACRO(Whilewr(p8.VnS(), x14, x11), "whilewr p8.s, x14, x11");
7971   COMPARE_MACRO(Whilewr(p8.VnS(), xzr, x11), "whilewr p8.s, xzr, x11");
7972 
7973   CLEANUP();
7974 }
7975 
TEST(sve2_splice)7976 TEST(sve2_splice) {
7977   SETUP();
7978 
7979   COMPARE_MACRO(Splice(z31.VnB(), p0, z21.VnB(), z22.VnB()),
7980                 "splice z31.b, p0, {z21.b, z22.b}");
7981   COMPARE_MACRO(Splice(z31.VnD(), p0, z21.VnD(), z22.VnD()),
7982                 "splice z31.d, p0, {z21.d, z22.d}");
7983   COMPARE_MACRO(Splice(z31.VnH(), p0, z21.VnH(), z22.VnH()),
7984                 "splice z31.h, p0, {z21.h, z22.h}");
7985   COMPARE_MACRO(Splice(z31.VnS(), p0, z31.VnS(), z0.VnS()),
7986                 "splice z31.s, p0, z31.s, z0.s");
7987   COMPARE_MACRO(Splice(z30.VnS(), p0, z31.VnS(), z0.VnS()),
7988                 "splice z30.s, p0, {z31.s, z0.s}");
7989 
7990   CLEANUP();
7991 }
7992 
TEST(sve2_mul_index)7993 TEST(sve2_mul_index) {
7994   SETUP();
7995 
7996   COMPARE_MACRO(Mul(z18.VnH(), z5.VnH(), z7.VnH(), 0),
7997                 "mul z18.h, z5.h, z7.h[0]");
7998   COMPARE_MACRO(Mul(z18.VnH(), z5.VnH(), z2.VnH(), 2),
7999                 "mul z18.h, z5.h, z2.h[2]");
8000   COMPARE_MACRO(Mul(z18.VnH(), z5.VnH(), z2.VnH(), 6),
8001                 "mul z18.h, z5.h, z2.h[6]");
8002   COMPARE_MACRO(Mul(z18.VnH(), z5.VnH(), z2.VnH(), 7),
8003                 "mul z18.h, z5.h, z2.h[7]");
8004   COMPARE_MACRO(Mul(z8.VnS(), z15.VnS(), z7.VnS(), 0),
8005                 "mul z8.s, z15.s, z7.s[0]");
8006   COMPARE_MACRO(Mul(z8.VnS(), z15.VnS(), z0.VnS(), 3),
8007                 "mul z8.s, z15.s, z0.s[3]");
8008   COMPARE_MACRO(Mul(z8.VnD(), z15.VnD(), z15.VnD(), 0),
8009                 "mul z8.d, z15.d, z15.d[0]");
8010   COMPARE_MACRO(Mul(z8.VnD(), z15.VnD(), z0.VnD(), 1),
8011                 "mul z8.d, z15.d, z0.d[1]");
8012 
8013   CLEANUP();
8014 }
8015 
TEST(sve2_mla_mls_index)8016 TEST(sve2_mla_mls_index) {
8017   SETUP();
8018 
8019   COMPARE_MACRO(Mla(z1.VnH(), z1.VnH(), z9.VnH(), z0.VnH(), 0),
8020                 "mla z1.h, z9.h, z0.h[0]");
8021   COMPARE_MACRO(Mla(z1.VnH(), z1.VnH(), z9.VnH(), z1.VnH(), 2),
8022                 "mla z1.h, z9.h, z1.h[2]");
8023   COMPARE_MACRO(Mla(z1.VnH(), z1.VnH(), z9.VnH(), z2.VnH(), 6),
8024                 "mla z1.h, z9.h, z2.h[6]");
8025   COMPARE_MACRO(Mla(z1.VnH(), z1.VnH(), z9.VnH(), z3.VnH(), 7),
8026                 "mla z1.h, z9.h, z3.h[7]");
8027   COMPARE_MACRO(Mla(z10.VnS(), z10.VnS(), z22.VnS(), z7.VnS(), 0),
8028                 "mla z10.s, z22.s, z7.s[0]");
8029   COMPARE_MACRO(Mla(z10.VnS(), z10.VnS(), z22.VnS(), z0.VnS(), 3),
8030                 "mla z10.s, z22.s, z0.s[3]");
8031   COMPARE_MACRO(Mla(z4.VnD(), z4.VnD(), z0.VnD(), z15.VnD(), 0),
8032                 "mla z4.d, z0.d, z15.d[0]");
8033   COMPARE_MACRO(Mla(z4.VnD(), z4.VnD(), z0.VnD(), z0.VnD(), 1),
8034                 "mla z4.d, z0.d, z0.d[1]");
8035 
8036   COMPARE_MACRO(Mla(z4.VnH(), z5.VnH(), z0.VnH(), z1.VnH(), 0),
8037                 "movprfx z4, z5\n"
8038                 "mla z4.h, z0.h, z1.h[0]");
8039   COMPARE_MACRO(Mla(z4.VnH(), z5.VnH(), z4.VnH(), z1.VnH(), 0),
8040                 "movprfx z31, z5\n"
8041                 "mla z31.h, z4.h, z1.h[0]\n"
8042                 "mov z4.d, z31.d");
8043   COMPARE_MACRO(Mla(z4.VnH(), z5.VnH(), z0.VnH(), z4.VnH(), 0),
8044                 "movprfx z31, z5\n"
8045                 "mla z31.h, z0.h, z4.h[0]\n"
8046                 "mov z4.d, z31.d");
8047   COMPARE_MACRO(Mla(z4.VnH(), z5.VnH(), z4.VnH(), z4.VnH(), 0),
8048                 "movprfx z31, z5\n"
8049                 "mla z31.h, z4.h, z4.h[0]\n"
8050                 "mov z4.d, z31.d");
8051 
8052   COMPARE_MACRO(Mls(z1.VnH(), z1.VnH(), z9.VnH(), z0.VnH(), 0),
8053                 "mls z1.h, z9.h, z0.h[0]");
8054   COMPARE_MACRO(Mls(z1.VnH(), z1.VnH(), z9.VnH(), z1.VnH(), 2),
8055                 "mls z1.h, z9.h, z1.h[2]");
8056   COMPARE_MACRO(Mls(z1.VnH(), z1.VnH(), z9.VnH(), z2.VnH(), 6),
8057                 "mls z1.h, z9.h, z2.h[6]");
8058   COMPARE_MACRO(Mls(z1.VnH(), z1.VnH(), z9.VnH(), z3.VnH(), 7),
8059                 "mls z1.h, z9.h, z3.h[7]");
8060   COMPARE_MACRO(Mls(z10.VnS(), z10.VnS(), z22.VnS(), z7.VnS(), 0),
8061                 "mls z10.s, z22.s, z7.s[0]");
8062   COMPARE_MACRO(Mls(z10.VnS(), z10.VnS(), z22.VnS(), z0.VnS(), 3),
8063                 "mls z10.s, z22.s, z0.s[3]");
8064   COMPARE_MACRO(Mls(z4.VnD(), z4.VnD(), z0.VnD(), z15.VnD(), 0),
8065                 "mls z4.d, z0.d, z15.d[0]");
8066   COMPARE_MACRO(Mls(z4.VnD(), z4.VnD(), z0.VnD(), z0.VnD(), 1),
8067                 "mls z4.d, z0.d, z0.d[1]");
8068 
8069   COMPARE_MACRO(Mls(z4.VnS(), z5.VnS(), z0.VnS(), z1.VnS(), 0),
8070                 "movprfx z4, z5\n"
8071                 "mls z4.s, z0.s, z1.s[0]");
8072   COMPARE_MACRO(Mls(z4.VnS(), z5.VnS(), z4.VnS(), z1.VnS(), 0),
8073                 "movprfx z31, z5\n"
8074                 "mls z31.s, z4.s, z1.s[0]\n"
8075                 "mov z4.d, z31.d");
8076   COMPARE_MACRO(Mls(z4.VnS(), z5.VnS(), z0.VnS(), z4.VnS(), 0),
8077                 "movprfx z31, z5\n"
8078                 "mls z31.s, z0.s, z4.s[0]\n"
8079                 "mov z4.d, z31.d");
8080   COMPARE_MACRO(Mls(z4.VnS(), z5.VnS(), z4.VnS(), z4.VnS(), 0),
8081                 "movprfx z31, z5\n"
8082                 "mls z31.s, z4.s, z4.s[0]\n"
8083                 "mov z4.d, z31.d");
8084 
8085   CLEANUP();
8086 }
8087 
TEST(sve2_mla_long)8088 TEST(sve2_mla_long) {
8089   SETUP();
8090 
8091   COMPARE_MACRO(Smlalb(z1.VnD(), z1.VnD(), z3.VnS(), z23.VnS()),
8092                 "smlalb z1.d, z3.s, z23.s");
8093   COMPARE_MACRO(Smlalb(z1.VnH(), z1.VnH(), z3.VnB(), z23.VnB()),
8094                 "smlalb z1.h, z3.b, z23.b");
8095   COMPARE_MACRO(Smlalb(z1.VnS(), z1.VnS(), z3.VnH(), z23.VnH()),
8096                 "smlalb z1.s, z3.h, z23.h");
8097   COMPARE_MACRO(Smlalt(z31.VnD(), z31.VnD(), z24.VnS(), z29.VnS()),
8098                 "smlalt z31.d, z24.s, z29.s");
8099   COMPARE_MACRO(Smlalt(z31.VnH(), z31.VnH(), z24.VnB(), z29.VnB()),
8100                 "smlalt z31.h, z24.b, z29.b");
8101   COMPARE_MACRO(Smlalt(z31.VnS(), z31.VnS(), z24.VnH(), z29.VnH()),
8102                 "smlalt z31.s, z24.h, z29.h");
8103   COMPARE_MACRO(Smlslb(z5.VnD(), z5.VnD(), z26.VnS(), z27.VnS()),
8104                 "smlslb z5.d, z26.s, z27.s");
8105   COMPARE_MACRO(Smlslb(z5.VnH(), z5.VnH(), z26.VnB(), z27.VnB()),
8106                 "smlslb z5.h, z26.b, z27.b");
8107   COMPARE_MACRO(Smlslb(z5.VnS(), z5.VnS(), z26.VnH(), z27.VnH()),
8108                 "smlslb z5.s, z26.h, z27.h");
8109   COMPARE_MACRO(Smlslt(z23.VnD(), z23.VnD(), z24.VnS(), z25.VnS()),
8110                 "smlslt z23.d, z24.s, z25.s");
8111   COMPARE_MACRO(Smlslt(z23.VnH(), z23.VnH(), z24.VnB(), z25.VnB()),
8112                 "smlslt z23.h, z24.b, z25.b");
8113   COMPARE_MACRO(Smlslt(z23.VnS(), z23.VnS(), z24.VnH(), z25.VnH()),
8114                 "smlslt z23.s, z24.h, z25.h");
8115   COMPARE_MACRO(Umlalb(z31.VnD(), z31.VnD(), z9.VnS(), z21.VnS()),
8116                 "umlalb z31.d, z9.s, z21.s");
8117   COMPARE_MACRO(Umlalb(z31.VnH(), z31.VnH(), z9.VnB(), z21.VnB()),
8118                 "umlalb z31.h, z9.b, z21.b");
8119   COMPARE_MACRO(Umlalb(z31.VnS(), z31.VnS(), z9.VnH(), z21.VnH()),
8120                 "umlalb z31.s, z9.h, z21.h");
8121   COMPARE_MACRO(Umlalt(z11.VnD(), z11.VnD(), z5.VnS(), z22.VnS()),
8122                 "umlalt z11.d, z5.s, z22.s");
8123   COMPARE_MACRO(Umlalt(z11.VnH(), z11.VnH(), z5.VnB(), z22.VnB()),
8124                 "umlalt z11.h, z5.b, z22.b");
8125   COMPARE_MACRO(Umlalt(z11.VnS(), z11.VnS(), z5.VnH(), z22.VnH()),
8126                 "umlalt z11.s, z5.h, z22.h");
8127   COMPARE_MACRO(Umlslb(z28.VnD(), z28.VnD(), z13.VnS(), z9.VnS()),
8128                 "umlslb z28.d, z13.s, z9.s");
8129   COMPARE_MACRO(Umlslb(z28.VnH(), z28.VnH(), z13.VnB(), z9.VnB()),
8130                 "umlslb z28.h, z13.b, z9.b");
8131   COMPARE_MACRO(Umlslb(z28.VnS(), z28.VnS(), z13.VnH(), z9.VnH()),
8132                 "umlslb z28.s, z13.h, z9.h");
8133   COMPARE_MACRO(Umlslt(z9.VnD(), z9.VnD(), z12.VnS(), z30.VnS()),
8134                 "umlslt z9.d, z12.s, z30.s");
8135   COMPARE_MACRO(Umlslt(z9.VnH(), z9.VnH(), z12.VnB(), z30.VnB()),
8136                 "umlslt z9.h, z12.b, z30.b");
8137   COMPARE_MACRO(Umlslt(z9.VnS(), z9.VnS(), z12.VnH(), z30.VnH()),
8138                 "umlslt z9.s, z12.h, z30.h");
8139 
8140   COMPARE_MACRO(Smlalt(z0.VnD(), z1.VnD(), z2.VnS(), z3.VnS()),
8141                 "movprfx z0, z1\n"
8142                 "smlalt z0.d, z2.s, z3.s");
8143   COMPARE_MACRO(Smlalt(z0.VnD(), z1.VnD(), z0.VnS(), z3.VnS()),
8144                 "movprfx z31, z1\n"
8145                 "smlalt z31.d, z0.s, z3.s\n"
8146                 "mov z0.d, z31.d");
8147   COMPARE_MACRO(Smlalt(z0.VnD(), z1.VnD(), z2.VnS(), z0.VnS()),
8148                 "movprfx z31, z1\n"
8149                 "smlalt z31.d, z2.s, z0.s\n"
8150                 "mov z0.d, z31.d");
8151   COMPARE_MACRO(Smlalt(z0.VnD(), z1.VnD(), z0.VnS(), z0.VnS()),
8152                 "movprfx z31, z1\n"
8153                 "smlalt z31.d, z0.s, z0.s\n"
8154                 "mov z0.d, z31.d");
8155 
8156   CLEANUP();
8157 }
8158 
TEST(sve2_complex_integer_multiply_add)8159 TEST(sve2_complex_integer_multiply_add) {
8160   SETUP();
8161 
8162   COMPARE(sqrdcmlah(z31.VnB(), z15.VnB(), z20.VnB(), 0),
8163           "sqrdcmlah z31.b, z15.b, z20.b, #0");
8164   COMPARE(sqrdcmlah(z31.VnD(), z15.VnD(), z20.VnD(), 90),
8165           "sqrdcmlah z31.d, z15.d, z20.d, #90");
8166   COMPARE(sqrdcmlah(z31.VnH(), z15.VnH(), z20.VnH(), 180),
8167           "sqrdcmlah z31.h, z15.h, z20.h, #180");
8168   COMPARE(sqrdcmlah(z31.VnS(), z15.VnS(), z20.VnS(), 270),
8169           "sqrdcmlah z31.s, z15.s, z20.s, #270");
8170 
8171   COMPARE(sqrdcmlah(z14.VnS(), z11.VnS(), z8.VnS(), 1, 0),
8172           "sqrdcmlah z14.s, z11.s, z8.s[1], #0");
8173   COMPARE(sqrdcmlah(z31.VnH(), z2.VnH(), z3.VnH(), 2, 180),
8174           "sqrdcmlah z31.h, z2.h, z3.h[2], #180");
8175 
8176   COMPARE_MACRO(Sqrdcmlah(z0.VnB(), z1.VnB(), z0.VnB(), z3.VnB(), 0),
8177                 "mov z31.d, z0.d\n"
8178                 "movprfx z0, z1\n"
8179                 "sqrdcmlah z0.b, z31.b, z3.b, #0");
8180   COMPARE_MACRO(Sqrdcmlah(z0.VnH(), z1.VnH(), z2.VnH(), z0.VnH(), 90),
8181                 "mov z31.d, z0.d\n"
8182                 "movprfx z0, z1\n"
8183                 "sqrdcmlah z0.h, z2.h, z31.h, #90");
8184   COMPARE_MACRO(Sqrdcmlah(z0.VnS(), z1.VnS(), z0.VnS(), z0.VnS(), 0, 180),
8185                 "movprfx z31, z1\n"
8186                 "sqrdcmlah z31.s, z0.s, z0.s[0], #180\n"
8187                 "mov z0.d, z31.d");
8188   COMPARE_MACRO(Sqrdcmlah(z5.VnH(), z1.VnH(), z2.VnH(), z5.VnH(), 3, 270),
8189                 "movprfx z31, z1\n"
8190                 "sqrdcmlah z31.h, z2.h, z5.h[3], #270\n"
8191                 "mov z5.d, z31.d");
8192   COMPARE_MACRO(Sqrdcmlah(z3.VnH(), z3.VnH(), z3.VnH(), z3.VnH(), 2, 90),
8193                 "sqrdcmlah z3.h, z3.h, z3.h[2], #90");
8194 
8195   COMPARE(cmla(z19.VnB(), z7.VnB(), z2.VnB(), 0), "cmla z19.b, z7.b, z2.b, #0");
8196   COMPARE(cmla(z19.VnD(), z7.VnD(), z2.VnD(), 90),
8197           "cmla z19.d, z7.d, z2.d, #90");
8198   COMPARE(cmla(z19.VnH(), z7.VnH(), z2.VnH(), 180),
8199           "cmla z19.h, z7.h, z2.h, #180");
8200   COMPARE(cmla(z19.VnS(), z7.VnS(), z2.VnS(), 270),
8201           "cmla z19.s, z7.s, z2.s, #270");
8202 
8203   COMPARE_MACRO(Cmla(z0.VnB(), z1.VnB(), z0.VnB(), z3.VnB(), 0),
8204                 "mov z31.d, z0.d\n"
8205                 "movprfx z0, z1\n"
8206                 "cmla z0.b, z31.b, z3.b, #0");
8207   COMPARE_MACRO(Cmla(z0.VnH(), z1.VnH(), z2.VnH(), z0.VnH(), 90),
8208                 "mov z31.d, z0.d\n"
8209                 "movprfx z0, z1\n"
8210                 "cmla z0.h, z2.h, z31.h, #90");
8211   COMPARE_MACRO(Cmla(z0.VnS(), z1.VnS(), z0.VnS(), z0.VnS(), 180),
8212                 "mov z31.d, z0.d\n"
8213                 "movprfx z0, z1\n"
8214                 "cmla z0.s, z31.s, z31.s, #180");
8215   COMPARE_MACRO(Cmla(z0.VnD(), z1.VnD(), z2.VnD(), z0.VnD(), 270),
8216                 "mov z31.d, z0.d\n"
8217                 "movprfx z0, z1\n"
8218                 "cmla z0.d, z2.d, z31.d, #270");
8219 
8220   COMPARE_MACRO(Cmla(z17.VnS(), z17.VnS(), z29.VnS(), z0.VnS(), 1, 0),
8221                 "cmla z17.s, z29.s, z0.s[1], #0");
8222   COMPARE_MACRO(Cmla(z17.VnS(), z17.VnS(), z29.VnS(), z1.VnS(), 0, 0),
8223                 "cmla z17.s, z29.s, z1.s[0], #0");
8224   COMPARE_MACRO(Cmla(z17.VnS(), z17.VnS(), z29.VnS(), z8.VnS(), 1, 90),
8225                 "cmla z17.s, z29.s, z8.s[1], #90");
8226   COMPARE_MACRO(Cmla(z17.VnS(), z17.VnS(), z29.VnS(), z15.VnS(), 0, 180),
8227                 "cmla z17.s, z29.s, z15.s[0], #180");
8228   COMPARE_MACRO(Cmla(z18.VnH(), z18.VnH(), z22.VnH(), z0.VnH(), 3, 0),
8229                 "cmla z18.h, z22.h, z0.h[3], #0");
8230   COMPARE_MACRO(Cmla(z18.VnH(), z18.VnH(), z22.VnH(), z1.VnH(), 2, 0),
8231                 "cmla z18.h, z22.h, z1.h[2], #0");
8232   COMPARE_MACRO(Cmla(z18.VnH(), z18.VnH(), z22.VnH(), z4.VnH(), 1, 270),
8233                 "cmla z18.h, z22.h, z4.h[1], #270");
8234   COMPARE_MACRO(Cmla(z18.VnH(), z18.VnH(), z22.VnH(), z7.VnH(), 0, 90),
8235                 "cmla z18.h, z22.h, z7.h[0], #90");
8236 
8237   COMPARE_MACRO(Cmla(z1.VnH(), z19.VnH(), z22.VnH(), z7.VnH(), 0, 90),
8238                 "movprfx z1, z19\n"
8239                 "cmla z1.h, z22.h, z7.h[0], #90");
8240   COMPARE_MACRO(Cmla(z1.VnH(), z19.VnH(), z1.VnH(), z7.VnH(), 0, 90),
8241                 "movprfx z31, z19\n"
8242                 "cmla z31.h, z1.h, z7.h[0], #90\n"
8243                 "mov z1.d, z31.d");
8244   COMPARE_MACRO(Cmla(z1.VnH(), z19.VnH(), z22.VnH(), z1.VnH(), 0, 90),
8245                 "movprfx z31, z19\n"
8246                 "cmla z31.h, z22.h, z1.h[0], #90\n"
8247                 "mov z1.d, z31.d");
8248   COMPARE_MACRO(Cmla(z1.VnH(), z19.VnH(), z1.VnH(), z1.VnH(), 0, 90),
8249                 "movprfx z31, z19\n"
8250                 "cmla z31.h, z1.h, z1.h[0], #90\n"
8251                 "mov z1.d, z31.d");
8252 
8253   CLEANUP();
8254 }
8255 
TEST(sve2_saturating_multiply_add_long)8256 TEST(sve2_saturating_multiply_add_long) {
8257   SETUP();
8258 
8259   COMPARE(sqdmlalb(z6.VnD(), z19.VnS(), z25.VnS()),
8260           "sqdmlalb z6.d, z19.s, z25.s");
8261   COMPARE(sqdmlalb(z6.VnH(), z19.VnB(), z25.VnB()),
8262           "sqdmlalb z6.h, z19.b, z25.b");
8263   COMPARE(sqdmlalb(z6.VnS(), z19.VnH(), z25.VnH()),
8264           "sqdmlalb z6.s, z19.h, z25.h");
8265   COMPARE(sqdmlalt(z11.VnD(), z0.VnS(), z10.VnS()),
8266           "sqdmlalt z11.d, z0.s, z10.s");
8267   COMPARE(sqdmlalt(z11.VnH(), z0.VnB(), z10.VnB()),
8268           "sqdmlalt z11.h, z0.b, z10.b");
8269   COMPARE(sqdmlalt(z11.VnS(), z0.VnH(), z10.VnH()),
8270           "sqdmlalt z11.s, z0.h, z10.h");
8271   COMPARE(sqdmlslb(z16.VnD(), z26.VnS(), z25.VnS()),
8272           "sqdmlslb z16.d, z26.s, z25.s");
8273   COMPARE(sqdmlslb(z16.VnH(), z26.VnB(), z25.VnB()),
8274           "sqdmlslb z16.h, z26.b, z25.b");
8275   COMPARE(sqdmlslb(z16.VnS(), z26.VnH(), z25.VnH()),
8276           "sqdmlslb z16.s, z26.h, z25.h");
8277   COMPARE(sqdmlslt(z21.VnD(), z23.VnS(), z9.VnS()),
8278           "sqdmlslt z21.d, z23.s, z9.s");
8279   COMPARE(sqdmlslt(z21.VnH(), z23.VnB(), z9.VnB()),
8280           "sqdmlslt z21.h, z23.b, z9.b");
8281   COMPARE(sqdmlslt(z21.VnS(), z23.VnH(), z9.VnH()),
8282           "sqdmlslt z21.s, z23.h, z9.h");
8283 
8284   COMPARE(sqdmlalb(z1.VnD(), z27.VnS(), z11.VnS(), 0),
8285           "sqdmlalb z1.d, z27.s, z11.s[0]");
8286   COMPARE(sqdmlalb(z30.VnS(), z6.VnH(), z3.VnH(), 0),
8287           "sqdmlalb z30.s, z6.h, z3.h[0]");
8288   COMPARE(sqdmlalt(z30.VnD(), z25.VnS(), z15.VnS(), 1),
8289           "sqdmlalt z30.d, z25.s, z15.s[1]");
8290   COMPARE(sqdmlalt(z10.VnS(), z1.VnH(), z1.VnH(), 3),
8291           "sqdmlalt z10.s, z1.h, z1.h[3]");
8292   COMPARE(sqdmlslb(z15.VnD(), z27.VnS(), z15.VnS(), 2),
8293           "sqdmlslb z15.d, z27.s, z15.s[2]");
8294   COMPARE(sqdmlslb(z5.VnS(), z5.VnH(), z7.VnH(), 6),
8295           "sqdmlslb z5.s, z5.h, z7.h[6]");
8296   COMPARE(sqdmlslt(z21.VnD(), z28.VnS(), z13.VnS(), 3),
8297           "sqdmlslt z21.d, z28.s, z13.s[3]");
8298   COMPARE(sqdmlslt(z5.VnS(), z3.VnH(), z1.VnH(), 7),
8299           "sqdmlslt z5.s, z3.h, z1.h[7]");
8300 
8301   COMPARE_MACRO(Sqdmlalb(z6.VnD(), z16.VnD(), z19.VnS(), z25.VnS()),
8302                 "movprfx z6, z16\n"
8303                 "sqdmlalb z6.d, z19.s, z25.s");
8304   COMPARE_MACRO(Sqdmlalt(z4.VnH(), z26.VnH(), z4.VnB(), z24.VnB()),
8305                 "movprfx z31, z26\n"
8306                 "sqdmlalt z31.h, z4.b, z24.b\n"
8307                 "mov z4.d, z31.d");
8308   COMPARE_MACRO(Sqdmlslb(z2.VnS(), z6.VnS(), z17.VnH(), z2.VnH()),
8309                 "movprfx z31, z6\n"
8310                 "sqdmlslb z31.s, z17.h, z2.h\n"
8311                 "mov z2.d, z31.d");
8312   COMPARE_MACRO(Sqdmlslt(z0.VnD(), z1.VnD(), z0.VnS(), z0.VnS()),
8313                 "movprfx z31, z1\n"
8314                 "sqdmlslt z31.d, z0.s, z0.s\n"
8315                 "mov z0.d, z31.d");
8316 
8317   COMPARE_MACRO(Sqdmlalb(z6.VnD(), z16.VnD(), z9.VnS(), z15.VnS(), 0),
8318                 "movprfx z6, z16\n"
8319                 "sqdmlalb z6.d, z9.s, z15.s[0]");
8320   COMPARE_MACRO(Sqdmlalt(z4.VnS(), z6.VnS(), z4.VnH(), z4.VnH(), 3),
8321                 "movprfx z31, z6\n"
8322                 "sqdmlalt z31.s, z4.h, z4.h[3]\n"
8323                 "mov z4.d, z31.d");
8324   COMPARE_MACRO(Sqdmlslb(z2.VnS(), z16.VnS(), z17.VnH(), z2.VnH(), 6),
8325                 "movprfx z31, z16\n"
8326                 "sqdmlslb z31.s, z17.h, z2.h[6]\n"
8327                 "mov z2.d, z31.d");
8328   COMPARE_MACRO(Sqdmlslt(z6.VnD(), z1.VnD(), z6.VnS(), z6.VnS(), 2),
8329                 "movprfx z31, z1\n"
8330                 "sqdmlslt z31.d, z6.s, z6.s[2]\n"
8331                 "mov z6.d, z31.d");
8332 
8333   CLEANUP();
8334 }
8335 
TEST(sve2_saturating_multiply_add_interleaved_long)8336 TEST(sve2_saturating_multiply_add_interleaved_long) {
8337   SETUP();
8338 
8339   COMPARE(sqdmlalbt(z23.VnD(), z29.VnS(), z26.VnS()),
8340           "sqdmlalbt z23.d, z29.s, z26.s");
8341   COMPARE(sqdmlalbt(z23.VnH(), z29.VnB(), z26.VnB()),
8342           "sqdmlalbt z23.h, z29.b, z26.b");
8343   COMPARE(sqdmlalbt(z23.VnS(), z29.VnH(), z26.VnH()),
8344           "sqdmlalbt z23.s, z29.h, z26.h");
8345   COMPARE(sqdmlslbt(z26.VnD(), z23.VnS(), z4.VnS()),
8346           "sqdmlslbt z26.d, z23.s, z4.s");
8347   COMPARE(sqdmlslbt(z26.VnH(), z23.VnB(), z4.VnB()),
8348           "sqdmlslbt z26.h, z23.b, z4.b");
8349   COMPARE(sqdmlslbt(z26.VnS(), z23.VnH(), z4.VnH()),
8350           "sqdmlslbt z26.s, z23.h, z4.h");
8351 
8352   COMPARE_MACRO(Sqdmlalbt(z29.VnD(), z0.VnD(), z29.VnS(), z26.VnS()),
8353                 "movprfx z31, z0\n"
8354                 "sqdmlalbt z31.d, z29.s, z26.s\n"
8355                 "mov z29.d, z31.d");
8356   COMPARE_MACRO(Sqdmlalbt(z26.VnH(), z0.VnH(), z29.VnB(), z26.VnB()),
8357                 "movprfx z31, z0\n"
8358                 "sqdmlalbt z31.h, z29.b, z26.b\n"
8359                 "mov z26.d, z31.d");
8360   COMPARE_MACRO(Sqdmlslbt(z23.VnS(), z31.VnS(), z26.VnH(), z29.VnH()),
8361                 "movprfx z23, z31\n"
8362                 "sqdmlslbt z23.s, z26.h, z29.h");
8363   COMPARE_MACRO(Sqdmlslbt(z4.VnD(), z31.VnD(), z4.VnS(), z4.VnS()),
8364                 "sqdmlslbt z31.d, z4.s, z4.s\n"
8365                 "mov z4.d, z31.d");
8366 
8367   CLEANUP();
8368 }
8369 
TEST(sve2_floating_multiply_add_long_vector)8370 TEST(sve2_floating_multiply_add_long_vector) {
8371   SETUP();
8372 
8373   COMPARE(fmlalb(z16.VnS(), z18.VnH(), z29.VnH()),
8374           "fmlalb z16.s, z18.h, z29.h");
8375   COMPARE(fmlalb(z3.VnS(), z8.VnH(), z7.VnH()), "fmlalb z3.s, z8.h, z7.h");
8376   COMPARE(fmlalt(z18.VnS(), z13.VnH(), z5.VnH()), "fmlalt z18.s, z13.h, z5.h");
8377   COMPARE(fmlalt(z18.VnS(), z7.VnH(), z16.VnH()), "fmlalt z18.s, z7.h, z16.h");
8378   COMPARE(fmlslb(z16.VnS(), z10.VnH(), z1.VnH()), "fmlslb z16.s, z10.h, z1.h");
8379   COMPARE(fmlslb(z25.VnS(), z11.VnH(), z0.VnH()), "fmlslb z25.s, z11.h, z0.h");
8380   COMPARE(fmlslt(z3.VnS(), z17.VnH(), z14.VnH()), "fmlslt z3.s, z17.h, z14.h");
8381   COMPARE(fmlslt(z5.VnS(), z1.VnH(), z7.VnH()), "fmlslt z5.s, z1.h, z7.h");
8382 
8383   CLEANUP();
8384 }
8385 
TEST(sve2_mla_long_index)8386 TEST(sve2_mla_long_index) {
8387   SETUP();
8388 
8389   COMPARE_MACRO(Smlalb(z11.VnD(), z11.VnD(), z29.VnS(), z0.VnS(), 3),
8390                 "smlalb z11.d, z29.s, z0.s[3]");
8391   COMPARE_MACRO(Smlalb(z18.VnS(), z18.VnS(), z17.VnH(), z0.VnH(), 7),
8392                 "smlalb z18.s, z17.h, z0.h[7]");
8393   COMPARE_MACRO(Smlalt(z10.VnD(), z10.VnD(), z30.VnS(), z15.VnS(), 0),
8394                 "smlalt z10.d, z30.s, z15.s[0]");
8395   COMPARE_MACRO(Smlalt(z23.VnS(), z23.VnS(), z31.VnH(), z7.VnH(), 0),
8396                 "smlalt z23.s, z31.h, z7.h[0]");
8397   COMPARE_MACRO(Smlslb(z12.VnD(), z12.VnD(), z23.VnS(), z3.VnS(), 1),
8398                 "smlslb z12.d, z23.s, z3.s[1]");
8399   COMPARE_MACRO(Smlslb(z5.VnS(), z5.VnS(), z4.VnH(), z4.VnH(), 2),
8400                 "smlslb z5.s, z4.h, z4.h[2]");
8401   COMPARE_MACRO(Smlslt(z7.VnD(), z7.VnD(), z9.VnS(), z6.VnS(), 3),
8402                 "smlslt z7.d, z9.s, z6.s[3]");
8403   COMPARE_MACRO(Smlslt(z9.VnS(), z9.VnS(), z21.VnH(), z3.VnH(), 4),
8404                 "smlslt z9.s, z21.h, z3.h[4]");
8405   COMPARE_MACRO(Umlalb(z9.VnD(), z9.VnD(), z1.VnS(), z11.VnS(), 0),
8406                 "umlalb z9.d, z1.s, z11.s[0]");
8407   COMPARE_MACRO(Umlalb(z9.VnS(), z9.VnS(), z5.VnH(), z1.VnH(), 6),
8408                 "umlalb z9.s, z5.h, z1.h[6]");
8409   COMPARE_MACRO(Umlalt(z6.VnD(), z6.VnD(), z17.VnS(), z14.VnS(), 1),
8410                 "umlalt z6.d, z17.s, z14.s[1]");
8411   COMPARE_MACRO(Umlalt(z9.VnS(), z9.VnS(), z11.VnH(), z3.VnH(), 7),
8412                 "umlalt z9.s, z11.h, z3.h[7]");
8413   COMPARE_MACRO(Umlslb(z12.VnD(), z12.VnD(), z15.VnS(), z9.VnS(), 2),
8414                 "umlslb z12.d, z15.s, z9.s[2]");
8415   COMPARE_MACRO(Umlslb(z14.VnS(), z14.VnS(), z10.VnH(), z2.VnH(), 0),
8416                 "umlslb z14.s, z10.h, z2.h[0]");
8417   COMPARE_MACRO(Umlslt(z12.VnD(), z12.VnD(), z28.VnS(), z8.VnS(), 3),
8418                 "umlslt z12.d, z28.s, z8.s[3]");
8419   COMPARE_MACRO(Umlslt(z24.VnS(), z24.VnS(), z12.VnH(), z6.VnH(), 1),
8420                 "umlslt z24.s, z12.h, z6.h[1]");
8421 
8422   COMPARE_MACRO(Umlslt(z2.VnS(), z23.VnS(), z12.VnH(), z6.VnH(), 1),
8423                 "movprfx z2, z23\n"
8424                 "umlslt z2.s, z12.h, z6.h[1]");
8425   COMPARE_MACRO(Umlslt(z2.VnS(), z23.VnS(), z2.VnH(), z6.VnH(), 1),
8426                 "movprfx z31, z23\n"
8427                 "umlslt z31.s, z2.h, z6.h[1]\n"
8428                 "mov z2.d, z31.d");
8429   COMPARE_MACRO(Umlslt(z2.VnS(), z23.VnS(), z12.VnH(), z2.VnH(), 1),
8430                 "movprfx z31, z23\n"
8431                 "umlslt z31.s, z12.h, z2.h[1]\n"
8432                 "mov z2.d, z31.d");
8433   COMPARE_MACRO(Umlslt(z2.VnS(), z23.VnS(), z2.VnH(), z2.VnH(), 1),
8434                 "movprfx z31, z23\n"
8435                 "umlslt z31.s, z2.h, z2.h[1]\n"
8436                 "mov z2.d, z31.d");
8437 
8438   CLEANUP();
8439 }
8440 
TEST(sve2_mul_long_index)8441 TEST(sve2_mul_long_index) {
8442   SETUP();
8443 
8444   COMPARE_MACRO(Smullb(z13.VnS(), z31.VnH(), z0.VnH(), 0),
8445                 "smullb z13.s, z31.h, z0.h[0]");
8446   COMPARE_MACRO(Smullb(z8.VnD(), z22.VnS(), z0.VnS(), 0),
8447                 "smullb z8.d, z22.s, z0.s[0]");
8448   COMPARE_MACRO(Smullt(z14.VnS(), z30.VnH(), z7.VnH(), 7),
8449                 "smullt z14.s, z30.h, z7.h[7]");
8450   COMPARE_MACRO(Smullt(z22.VnD(), z28.VnS(), z15.VnS(), 3),
8451                 "smullt z22.d, z28.s, z15.s[3]");
8452   COMPARE_MACRO(Umullb(z24.VnD(), z20.VnS(), z5.VnS(), 1),
8453                 "umullb z24.d, z20.s, z5.s[1]");
8454   COMPARE_MACRO(Umullb(z28.VnS(), z19.VnH(), z3.VnH(), 4),
8455                 "umullb z28.s, z19.h, z3.h[4]");
8456   COMPARE_MACRO(Umullt(z0.VnD(), z31.VnS(), z8.VnS(), 2),
8457                 "umullt z0.d, z31.s, z8.s[2]");
8458   COMPARE_MACRO(Umullt(z14.VnS(), z20.VnH(), z5.VnH(), 6),
8459                 "umullt z14.s, z20.h, z5.h[6]");
8460 
8461   CLEANUP();
8462 }
8463 
TEST(sve2_sat_double_mul_high)8464 TEST(sve2_sat_double_mul_high) {
8465   SETUP();
8466 
8467   COMPARE_MACRO(Sqdmulh(z18.VnB(), z25.VnB(), z1.VnB()),
8468                 "sqdmulh z18.b, z25.b, z1.b");
8469   COMPARE_MACRO(Sqdmulh(z18.VnD(), z25.VnD(), z1.VnD()),
8470                 "sqdmulh z18.d, z25.d, z1.d");
8471   COMPARE_MACRO(Sqdmulh(z18.VnH(), z25.VnH(), z1.VnH()),
8472                 "sqdmulh z18.h, z25.h, z1.h");
8473   COMPARE_MACRO(Sqdmulh(z18.VnS(), z25.VnS(), z1.VnS()),
8474                 "sqdmulh z18.s, z25.s, z1.s");
8475   COMPARE_MACRO(Sqrdmulh(z21.VnB(), z21.VnB(), z27.VnB()),
8476                 "sqrdmulh z21.b, z21.b, z27.b");
8477   COMPARE_MACRO(Sqrdmulh(z21.VnD(), z21.VnD(), z27.VnD()),
8478                 "sqrdmulh z21.d, z21.d, z27.d");
8479   COMPARE_MACRO(Sqrdmulh(z21.VnH(), z21.VnH(), z27.VnH()),
8480                 "sqrdmulh z21.h, z21.h, z27.h");
8481   COMPARE_MACRO(Sqrdmulh(z21.VnS(), z21.VnS(), z27.VnS()),
8482                 "sqrdmulh z21.s, z21.s, z27.s");
8483 
8484   CLEANUP();
8485 }
8486 
TEST(sve2_flogb)8487 TEST(sve2_flogb) {
8488   SETUP();
8489 
8490   COMPARE_MACRO(Flogb(z15.VnH(), p0.Merging(), z3.VnH()),
8491                 "flogb z15.h, p0/m, z3.h");
8492   COMPARE_MACRO(Flogb(z15.VnS(), p0.Merging(), z3.VnS()),
8493                 "flogb z15.s, p0/m, z3.s");
8494   COMPARE_MACRO(Flogb(z15.VnD(), p0.Merging(), z3.VnD()),
8495                 "flogb z15.d, p0/m, z3.d");
8496   COMPARE_MACRO(Flogb(z15.VnD(), p0.Zeroing(), z3.VnD()),
8497                 "movprfx z15.d, p0/z, z15.d\n"
8498                 "flogb z15.d, p0/m, z3.d");
8499 
8500   CLEANUP();
8501 }
8502 
TEST(sve2_fp_pair)8503 TEST(sve2_fp_pair) {
8504   SETUP();
8505 
8506   COMPARE_MACRO(Faddp(z14.VnD(), p1.Merging(), z14.VnD(), z26.VnD()),
8507                 "faddp z14.d, p1/m, z14.d, z26.d");
8508   COMPARE_MACRO(Faddp(z14.VnH(), p1.Merging(), z14.VnH(), z26.VnH()),
8509                 "faddp z14.h, p1/m, z14.h, z26.h");
8510   COMPARE_MACRO(Faddp(z14.VnS(), p1.Merging(), z14.VnS(), z26.VnS()),
8511                 "faddp z14.s, p1/m, z14.s, z26.s");
8512   COMPARE_MACRO(Fmaxnmp(z2.VnD(), p1.Merging(), z2.VnD(), z14.VnD()),
8513                 "fmaxnmp z2.d, p1/m, z2.d, z14.d");
8514   COMPARE_MACRO(Fmaxnmp(z2.VnH(), p1.Merging(), z2.VnH(), z14.VnH()),
8515                 "fmaxnmp z2.h, p1/m, z2.h, z14.h");
8516   COMPARE_MACRO(Fmaxnmp(z2.VnS(), p1.Merging(), z2.VnS(), z14.VnS()),
8517                 "fmaxnmp z2.s, p1/m, z2.s, z14.s");
8518   COMPARE_MACRO(Fmaxp(z22.VnD(), p1.Merging(), z22.VnD(), z3.VnD()),
8519                 "fmaxp z22.d, p1/m, z22.d, z3.d");
8520   COMPARE_MACRO(Fmaxp(z22.VnH(), p1.Merging(), z22.VnH(), z3.VnH()),
8521                 "fmaxp z22.h, p1/m, z22.h, z3.h");
8522   COMPARE_MACRO(Fmaxp(z22.VnS(), p1.Merging(), z22.VnS(), z3.VnS()),
8523                 "fmaxp z22.s, p1/m, z22.s, z3.s");
8524   COMPARE_MACRO(Fminnmp(z1.VnD(), p0.Merging(), z1.VnD(), z14.VnD()),
8525                 "fminnmp z1.d, p0/m, z1.d, z14.d");
8526   COMPARE_MACRO(Fminnmp(z1.VnH(), p0.Merging(), z1.VnH(), z14.VnH()),
8527                 "fminnmp z1.h, p0/m, z1.h, z14.h");
8528   COMPARE_MACRO(Fminnmp(z1.VnS(), p0.Merging(), z1.VnS(), z14.VnS()),
8529                 "fminnmp z1.s, p0/m, z1.s, z14.s");
8530   COMPARE_MACRO(Fminp(z16.VnD(), p3.Merging(), z16.VnD(), z11.VnD()),
8531                 "fminp z16.d, p3/m, z16.d, z11.d");
8532   COMPARE_MACRO(Fminp(z16.VnH(), p3.Merging(), z16.VnH(), z11.VnH()),
8533                 "fminp z16.h, p3/m, z16.h, z11.h");
8534   COMPARE_MACRO(Fminp(z16.VnS(), p3.Merging(), z16.VnS(), z11.VnS()),
8535                 "fminp z16.s, p3/m, z16.s, z11.s");
8536 
8537   COMPARE_MACRO(Faddp(z14.VnD(), p1.Merging(), z13.VnD(), z26.VnD()),
8538                 "movprfx z14.d, p1/m, z13.d\n"
8539                 "faddp z14.d, p1/m, z14.d, z26.d");
8540   COMPARE_MACRO(Fmaxnmp(z2.VnD(), p1.Merging(), z3.VnD(), z2.VnD()),
8541                 "mov z31.d, z2.d\n"
8542                 "movprfx z2.d, p1/m, z3.d\n"
8543                 "fmaxnmp z2.d, p1/m, z2.d, z31.d");
8544   COMPARE_MACRO(Fmaxp(z22.VnH(), p1.Merging(), z23.VnH(), z3.VnH()),
8545                 "movprfx z22.h, p1/m, z23.h\n"
8546                 "fmaxp z22.h, p1/m, z22.h, z3.h");
8547   COMPARE_MACRO(Fminnmp(z1.VnH(), p0.Merging(), z4.VnH(), z1.VnH()),
8548                 "mov z31.d, z1.d\n"
8549                 "movprfx z1.h, p0/m, z4.h\n"
8550                 "fminnmp z1.h, p0/m, z1.h, z31.h");
8551   COMPARE_MACRO(Fminp(z16.VnS(), p3.Merging(), z11.VnS(), z11.VnS()),
8552                 "movprfx z16.s, p3/m, z11.s\n"
8553                 "fminp z16.s, p3/m, z16.s, z11.s");
8554   CLEANUP();
8555 }
8556 
TEST(sve2_fmlal_fmlsl_index)8557 TEST(sve2_fmlal_fmlsl_index) {
8558   SETUP();
8559 
8560   COMPARE_MACRO(Fmlalb(z16.VnS(), z16.VnS(), z18.VnH(), z2.VnH(), 0),
8561                 "fmlalb z16.s, z18.h, z2.h[0]");
8562   COMPARE_MACRO(Fmlalb(z3.VnS(), z3.VnS(), z8.VnH(), z7.VnH(), 7),
8563                 "fmlalb z3.s, z8.h, z7.h[7]");
8564   COMPARE_MACRO(Fmlalt(z18.VnS(), z18.VnS(), z13.VnH(), z5.VnH(), 6),
8565                 "fmlalt z18.s, z13.h, z5.h[6]");
8566   COMPARE_MACRO(Fmlalt(z18.VnS(), z18.VnS(), z7.VnH(), z6.VnH(), 5),
8567                 "fmlalt z18.s, z7.h, z6.h[5]");
8568   COMPARE_MACRO(Fmlslb(z16.VnS(), z16.VnS(), z10.VnH(), z1.VnH(), 4),
8569                 "fmlslb z16.s, z10.h, z1.h[4]");
8570   COMPARE_MACRO(Fmlslb(z25.VnS(), z25.VnS(), z11.VnH(), z0.VnH(), 3),
8571                 "fmlslb z25.s, z11.h, z0.h[3]");
8572   COMPARE_MACRO(Fmlslt(z3.VnS(), z3.VnS(), z17.VnH(), z4.VnH(), 2),
8573                 "fmlslt z3.s, z17.h, z4.h[2]");
8574   COMPARE_MACRO(Fmlslt(z5.VnS(), z5.VnS(), z1.VnH(), z7.VnH(), 1),
8575                 "fmlslt z5.s, z1.h, z7.h[1]");
8576 
8577   COMPARE_MACRO(Fmlalb(z5.VnS(), z4.VnS(), z1.VnH(), z7.VnH(), 1),
8578                 "movprfx z5, z4\n"
8579                 "fmlalb z5.s, z1.h, z7.h[1]");
8580   COMPARE_MACRO(Fmlalt(z5.VnS(), z4.VnS(), z5.VnH(), z7.VnH(), 1),
8581                 "movprfx z31, z4\n"
8582                 "fmlalt z31.s, z5.h, z7.h[1]\n"
8583                 "mov z5.d, z31.d");
8584   COMPARE_MACRO(Fmlslb(z5.VnS(), z4.VnS(), z1.VnH(), z5.VnH(), 1),
8585                 "movprfx z31, z4\n"
8586                 "fmlslb z31.s, z1.h, z5.h[1]\n"
8587                 "mov z5.d, z31.d");
8588   COMPARE_MACRO(Fmlslt(z5.VnS(), z4.VnS(), z5.VnH(), z5.VnH(), 1),
8589                 "movprfx z31, z4\n"
8590                 "fmlslt z31.s, z5.h, z5.h[1]\n"
8591                 "mov z5.d, z31.d");
8592   CLEANUP();
8593 }
8594 
TEST(sve2_fp_convert)8595 TEST(sve2_fp_convert) {
8596   SETUP();
8597 
8598   COMPARE_MACRO(Fcvtx(z14.VnS(), p4.Merging(), z0.VnD()),
8599                 "fcvtx z14.s, p4/m, z0.d");
8600   COMPARE_MACRO(Fcvtx(z14.VnS(), p4.Zeroing(), z0.VnD()),
8601                 "movprfx z14.d, p4/z, z14.d\n"
8602                 "fcvtx z14.s, p4/m, z0.d");
8603   COMPARE_MACRO(Fcvtlt(z1.VnD(), p1.Merging(), z28.VnS()),
8604                 "fcvtlt z1.d, p1/m, z28.s");
8605   COMPARE_MACRO(Fcvtlt(z10.VnS(), p5.Merging(), z0.VnH()),
8606                 "fcvtlt z10.s, p5/m, z0.h");
8607   COMPARE_MACRO(Fcvtnt(z4.VnH(), p7.Merging(), z0.VnS()),
8608                 "fcvtnt z4.h, p7/m, z0.s");
8609   COMPARE_MACRO(Fcvtnt(z8.VnS(), p0.Merging(), z4.VnD()),
8610                 "fcvtnt z8.s, p0/m, z4.d");
8611   COMPARE_MACRO(Fcvtx(z14.VnS(), p4.Merging(), z0.VnD()),
8612                 "fcvtx z14.s, p4/m, z0.d");
8613   COMPARE_MACRO(Fcvtxnt(z27.VnS(), p0.Merging(), z17.VnD()),
8614                 "fcvtxnt z27.s, p0/m, z17.d");
8615 
8616   CLEANUP();
8617 }
8618 
TEST(sve2_sat_double_mul_high_index)8619 TEST(sve2_sat_double_mul_high_index) {
8620   SETUP();
8621 
8622   COMPARE_MACRO(Sqdmulh(z11.VnH(), z20.VnH(), z7.VnH(), 1),
8623                 "sqdmulh z11.h, z20.h, z7.h[1]");
8624   COMPARE_MACRO(Sqdmulh(z11.VnH(), z20.VnH(), z2.VnH(), 7),
8625                 "sqdmulh z11.h, z20.h, z2.h[7]");
8626   COMPARE_MACRO(Sqdmulh(z8.VnS(), z4.VnS(), z7.VnS(), 1),
8627                 "sqdmulh z8.s, z4.s, z7.s[1]");
8628   COMPARE_MACRO(Sqdmulh(z8.VnS(), z4.VnS(), z3.VnS(), 3),
8629                 "sqdmulh z8.s, z4.s, z3.s[3]");
8630   COMPARE_MACRO(Sqdmulh(z6.VnD(), z13.VnD(), z0.VnD(), 1),
8631                 "sqdmulh z6.d, z13.d, z0.d[1]");
8632   COMPARE_MACRO(Sqdmulh(z6.VnD(), z13.VnD(), z15.VnD(), 0),
8633                 "sqdmulh z6.d, z13.d, z15.d[0]");
8634 
8635   COMPARE_MACRO(Sqrdmulh(z3.VnH(), z29.VnH(), z7.VnH(), 2),
8636                 "sqrdmulh z3.h, z29.h, z7.h[2]");
8637   COMPARE_MACRO(Sqrdmulh(z3.VnH(), z29.VnH(), z3.VnH(), 7),
8638                 "sqrdmulh z3.h, z29.h, z3.h[7]");
8639   COMPARE_MACRO(Sqrdmulh(z19.VnS(), z15.VnS(), z7.VnS(), 0),
8640                 "sqrdmulh z19.s, z15.s, z7.s[0]");
8641   COMPARE_MACRO(Sqrdmulh(z19.VnS(), z15.VnS(), z2.VnS(), 3),
8642                 "sqrdmulh z19.s, z15.s, z2.s[3]");
8643   COMPARE_MACRO(Sqrdmulh(z29.VnD(), z13.VnD(), z0.VnD(), 1),
8644                 "sqrdmulh z29.d, z13.d, z0.d[1]");
8645   COMPARE_MACRO(Sqrdmulh(z29.VnD(), z13.VnD(), z15.VnD(), 0),
8646                 "sqrdmulh z29.d, z13.d, z15.d[0]");
8647 
8648   CLEANUP();
8649 }
8650 
TEST(sve2_extract)8651 TEST(sve2_extract) {
8652   SETUP();
8653 
8654   COMPARE_MACRO(Ext(z0.VnB(), z1.VnB(), z2.VnB(), 2),
8655                 "ext z0.b, {z1.b, z2.b}, #2");
8656   COMPARE_MACRO(Ext(z0.VnB(), z31.VnB(), z0.VnB(), 255),
8657                 "ext z0.b, {z31.b, z0.b}, #255");
8658   COMPARE_MACRO(Ext(z0.VnB(), z31.VnB(), z0.VnB(), 0),
8659                 "ext z0.b, {z31.b, z0.b}, #0");
8660 
8661   // Check destructive form is preferred over constructive.
8662   COMPARE_MACRO(Ext(z0.VnB(), z0.VnB(), z1.VnB(), 42),
8663                 "ext z0.b, z0.b, z1.b, #42");
8664 
8665   CLEANUP();
8666 }
8667 
TEST(sve_matmul)8668 TEST(sve_matmul) {
8669   SETUP();
8670 
8671   COMPARE_MACRO(Fmmla(z2.VnS(), z2.VnS(), z3.VnS(), z20.VnS()),
8672                 "fmmla z2.s, z3.s, z20.s");
8673   COMPARE_MACRO(Fmmla(z21.VnD(), z21.VnD(), z30.VnD(), z2.VnD()),
8674                 "fmmla z21.d, z30.d, z2.d");
8675   COMPARE_MACRO(Smmla(z31.VnS(), z31.VnS(), z7.VnB(), z19.VnB()),
8676                 "smmla z31.s, z7.b, z19.b");
8677   COMPARE_MACRO(Ummla(z0.VnS(), z0.VnS(), z1.VnB(), z2.VnB()),
8678                 "ummla z0.s, z1.b, z2.b");
8679   COMPARE_MACRO(Usmmla(z30.VnS(), z30.VnS(), z31.VnB(), z4.VnB()),
8680                 "usmmla z30.s, z31.b, z4.b");
8681 
8682   COMPARE_MACRO(Fmmla(z0.VnS(), z1.VnS(), z2.VnS(), z3.VnS()),
8683                 "movprfx z0, z1\n"
8684                 "fmmla z0.s, z2.s, z3.s");
8685   COMPARE_MACRO(Smmla(z0.VnS(), z1.VnS(), z0.VnB(), z3.VnB()),
8686                 "movprfx z31, z1\n"
8687                 "smmla z31.s, z0.b, z3.b\n"
8688                 "mov z0.d, z31.d");
8689   COMPARE_MACRO(Ummla(z0.VnS(), z1.VnS(), z2.VnB(), z0.VnB()),
8690                 "movprfx z31, z1\n"
8691                 "ummla z31.s, z2.b, z0.b\n"
8692                 "mov z0.d, z31.d");
8693   COMPARE_MACRO(Usmmla(z0.VnS(), z1.VnS(), z0.VnB(), z0.VnB()),
8694                 "movprfx z31, z1\n"
8695                 "usmmla z31.s, z0.b, z0.b\n"
8696                 "mov z0.d, z31.d");
8697 
8698   CLEANUP();
8699 }
8700 
TEST(sve_usdot_sudot)8701 TEST(sve_usdot_sudot) {
8702   SETUP();
8703 
8704   COMPARE_MACRO(Usdot(z30.VnS(), z30.VnS(), z31.VnB(), z4.VnB()),
8705                 "usdot z30.s, z31.b, z4.b");
8706   COMPARE_MACRO(Usdot(z30.VnS(), z30.VnS(), z31.VnB(), z4.VnB(), 0),
8707                 "usdot z30.s, z31.b, z4.b[0]");
8708   COMPARE_MACRO(Sudot(z30.VnS(), z30.VnS(), z31.VnB(), z4.VnB(), 3),
8709                 "sudot z30.s, z31.b, z4.b[3]");
8710 
8711   COMPARE_MACRO(Usdot(z0.VnS(), z30.VnS(), z29.VnB(), z28.VnB()),
8712                 "movprfx z0, z30\n"
8713                 "usdot z0.s, z29.b, z28.b");
8714   COMPARE_MACRO(Usdot(z0.VnS(), z30.VnS(), z29.VnB(), z0.VnB()),
8715                 "movprfx z31, z30\n"
8716                 "usdot z31.s, z29.b, z0.b\n"
8717                 "mov z0.d, z31.d");
8718   COMPARE_MACRO(Usdot(z0.VnS(), z30.VnS(), z0.VnB(), z28.VnB()),
8719                 "movprfx z31, z30\n"
8720                 "usdot z31.s, z0.b, z28.b\n"
8721                 "mov z0.d, z31.d");
8722   COMPARE_MACRO(Usdot(z0.VnS(), z30.VnS(), z0.VnB(), z0.VnB()),
8723                 "movprfx z31, z30\n"
8724                 "usdot z31.s, z0.b, z0.b\n"
8725                 "mov z0.d, z31.d");
8726   COMPARE_MACRO(Usdot(z0.VnS(), z30.VnS(), z29.VnB(), z4.VnB(), 0),
8727                 "movprfx z0, z30\n"
8728                 "usdot z0.s, z29.b, z4.b[0]");
8729   COMPARE_MACRO(Usdot(z0.VnS(), z30.VnS(), z0.VnB(), z4.VnB(), 0),
8730                 "movprfx z31, z30\n"
8731                 "usdot z31.s, z0.b, z4.b[0]\n"
8732                 "mov z0.d, z31.d");
8733   COMPARE_MACRO(Sudot(z0.VnS(), z30.VnS(), z29.VnB(), z0.VnB(), 0),
8734                 "movprfx z31, z30\n"
8735                 "sudot z31.s, z29.b, z0.b[0]\n"
8736                 "mov z0.d, z31.d");
8737   COMPARE_MACRO(Usdot(z0.VnS(), z30.VnS(), z0.VnB(), z0.VnB(), 0),
8738                 "movprfx z31, z30\n"
8739                 "usdot z31.s, z0.b, z0.b[0]\n"
8740                 "mov z0.d, z31.d");
8741 
8742   CLEANUP();
8743 }
8744 }  // namespace aarch64
8745 }  // namespace vixl
8746