Skip to content

Commit 625c2d4

Browse files
committed
[AArch64][llvm] Armv9.7-A: Add support for SVE2p3 shift operations
Add instructions for SVE2p3 shift operations: - SQRSHRN - SQRSHRUN - SQSHRN - SQSHRUN - UQRSHRN - UQSHRN as documented here: * https://developer.arm.com/documentation/ddi0602/2025-09/ * https://developer.arm.com/documentation/109697/2025_09/2025-Architecture-Extensions
1 parent 485a25e commit 625c2d4

File tree

4 files changed

+550
-10
lines changed

4 files changed

+550
-10
lines changed

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4272,9 +4272,9 @@ def : Pat<(nxv4i32 (partial_reduce_smla nxv4i32:$Acc, nxv8i16:$MulLHS, nxv8i16:$
42724272
defm SQCVTN_Z2Z_StoH : sve2p1_multi_vec_extract_narrow<"sqcvtn", 0b00, int_aarch64_sve_sqcvtn_x2>;
42734273
defm UQCVTN_Z2Z_StoH : sve2p1_multi_vec_extract_narrow<"uqcvtn", 0b01, int_aarch64_sve_uqcvtn_x2>;
42744274
defm SQCVTUN_Z2Z_StoH : sve2p1_multi_vec_extract_narrow<"sqcvtun", 0b10, int_aarch64_sve_sqcvtun_x2>;
4275-
defm SQRSHRN_Z2ZI_StoH : sve2p1_multi_vec_shift_narrow<"sqrshrn", 0b101, int_aarch64_sve_sqrshrn_x2>;
4276-
defm UQRSHRN_Z2ZI_StoH : sve2p1_multi_vec_shift_narrow<"uqrshrn", 0b111, int_aarch64_sve_uqrshrn_x2>;
4277-
defm SQRSHRUN_Z2ZI_StoH : sve2p1_multi_vec_shift_narrow<"sqrshrun", 0b001, int_aarch64_sve_sqrshrun_x2>;
4275+
defm SQRSHRN_Z2ZI_StoH : sve_multi_vec_shift_narrow<"sqrshrn", 0b101, int_aarch64_sve_sqrshrn_x2>;
4276+
defm UQRSHRN_Z2ZI_StoH : sve_multi_vec_shift_narrow<"uqrshrn", 0b111, int_aarch64_sve_uqrshrn_x2>;
4277+
defm SQRSHRUN_Z2ZI_StoH : sve_multi_vec_shift_narrow<"sqrshrun", 0b001, int_aarch64_sve_sqrshrun_x2>;
42784278

42794279
defm WHILEGE_2PXX : sve2p1_int_while_rr_pair<"whilege", 0b000>;
42804280
defm WHILEGT_2PXX : sve2p1_int_while_rr_pair<"whilegt", 0b001>;
@@ -4648,6 +4648,17 @@ let Predicates = [HasSVE2p3_or_SME2p3] in {
46484648
defm SCVTFLT_ZZ : sve2_int_to_fp_upcvt<"scvtflt", 0b10>;
46494649
defm UCVTF_ZZ : sve2_int_to_fp_upcvt<"ucvtf", 0b01>;
46504650
defm UCVTFLT_ZZ : sve2_int_to_fp_upcvt<"ucvtflt", 0b11>;
4651+
4652+
// SVE2 saturating shift right narrow by immediate and interleave
4653+
defm SQRSHRN_Z2ZI_HtoB : sve_multi_vec_round_shift_narrow<"sqrshrn", 0b101>;
4654+
defm SQRSHRUN_Z2ZI_HtoB : sve_multi_vec_round_shift_narrow<"sqrshrun", 0b001>;
4655+
defm SQSHRN_Z2ZI_HtoB : sve_multi_vec_round_shift_narrow<"sqshrn", 0b000>;
4656+
defm SQSHRUN_Z2ZI_HtoB : sve_multi_vec_round_shift_narrow<"sqshrun", 0b100>;
4657+
defm UQRSHRN_Z2ZI_HtoB : sve_multi_vec_round_shift_narrow<"uqrshrn", 0b111>;
4658+
defm UQSHRN_Z2ZI_HtoB : sve_multi_vec_round_shift_narrow<"uqshrn", 0b010>;
4659+
defm SQSHRUN_Z2ZI_StoH : sve_multi_vec_shift_narrow<"sqshrun", 0b100, null_frag>;
4660+
defm SQSHRN_Z2ZI_StoH : sve_multi_vec_shift_narrow<"sqshrn", 0b000, null_frag>;
4661+
defm UQSHRN_Z2ZI_StoH : sve_multi_vec_shift_narrow<"uqshrn", 0b010, null_frag>;
46514662
} // End HasSME2p3orSVE2p3
46524663

46534664
//===----------------------------------------------------------------------===//

llvm/lib/Target/AArch64/SVEInstrFormats.td

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10050,18 +10050,19 @@ multiclass sve2p1_multi_vec_extract_narrow<string mnemonic, bits<2> opc, SDPatte
1005010050
}
1005110051

1005210052
// SVE2 multi-vec shift narrow
10053-
class sve2p1_multi_vec_shift_narrow<string mnemonic, bits<3> opc, bits<2> tsz>
10054-
: I<(outs ZPR16:$Zd), (ins ZZ_s_mul_r:$Zn, vecshiftR16:$imm4),
10055-
mnemonic, "\t$Zd, $Zn, $imm4",
10053+
class sve2p1_multi_vec_shift_narrow<string mnemonic, ZPRRegOp ZdRC, RegisterOperand ZSrcOp,
10054+
Operand immtype, bits<3> opc, bits<2> tsz>
10055+
: I<(outs ZdRC:$Zd), (ins ZSrcOp:$Zn, immtype:$imm),
10056+
mnemonic, "\t$Zd, $Zn, $imm",
1005610057
"", []>, Sched<[]> {
1005710058
bits<5> Zd;
1005810059
bits<4> Zn;
10059-
bits<4> imm4;
10060+
bits<4> imm;
1006010061
let Inst{31-23} = 0b010001011;
1006110062
let Inst{22} = tsz{1};
1006210063
let Inst{21} = 0b1;
1006310064
let Inst{20} = tsz{0};
10064-
let Inst{19-16} = imm4;
10065+
let Inst{18-16} = imm{2-0}; // imm3
1006510066
let Inst{15-14} = 0b00;
1006610067
let Inst{13-11} = opc;
1006710068
let Inst{10} = 0b0;
@@ -10072,12 +10073,19 @@ class sve2p1_multi_vec_shift_narrow<string mnemonic, bits<3> opc, bits<2> tsz>
1007210073
let hasSideEffects = 0;
1007310074
}
1007410075

10075-
multiclass sve2p1_multi_vec_shift_narrow<string mnemonic, bits<3> opc, SDPatternOperator intrinsic> {
10076-
def NAME : sve2p1_multi_vec_shift_narrow<mnemonic, opc, 0b01>;
10076+
multiclass sve_multi_vec_shift_narrow<string mnemonic, bits<3> opc, SDPatternOperator intrinsic> {
10077+
def NAME : sve2p1_multi_vec_shift_narrow<mnemonic, ZPR16, ZZ_s_mul_r, vecshiftR16, opc, 0b01> {
10078+
let Inst{19} = imm{3}; // imm4
10079+
}
1007710080

1007810081
def : SVE2p1_Sat_Shift_VG2_Pat<NAME, intrinsic, nxv8i16, nxv4i32, vecshiftR16>;
1007910082
}
1008010083

10084+
multiclass sve_multi_vec_round_shift_narrow<string mnemonic, bits<3> opc> {
10085+
def NAME : sve2p1_multi_vec_shift_narrow<mnemonic, ZPR8, ZZ_h_mul_r, vecshiftR8, opc, 0b00> {
10086+
let Inst{19} = 0b1; // always 1 for imm3 version
10087+
}
10088+
}
1008110089

1008210090
// SME2 multi-vec contiguous load (scalar plus scalar, two registers)
1008310091
class sve2p1_mem_cld_ss_2z<string mnemonic, bits<2> msz, bit n,
Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p3 2>&1 < %s| FileCheck %s
2+
3+
// --------------------------------------------------------------------------//
4+
// Invalid element width
5+
6+
sqrshrn z10.s, { z0.s, z1.s }, #1
7+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
8+
// CHECK-NEXT: sqrshrn z10.s, { z0.s, z1.s }, #1
9+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
10+
11+
sqrshrn z10.d, { z0.d, z1.d }, #1
12+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
13+
// CHECK-NEXT: sqrshrn z10.d, { z0.d, z1.d }, #1
14+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
15+
16+
// --------------------------------------------------------------------------//
17+
// Invalid operand for instruction
18+
19+
sqrshrn z10.h, { z0.b, z1.b }, #1
20+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
21+
// CHECK-NEXT: sqrshrn z10.h, { z0.b, z1.b }, #1
22+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
23+
24+
// --------------------------------------------------------------------------//
25+
// Intermediate out of range
26+
27+
sqrshrn z10.b, { z0.h, z1.h }, #0
28+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
29+
// CHECK-NEXT: sqrshrn z10.b, { z0.h, z1.h }, #0
30+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
31+
32+
sqrshrn z10.b, { z0.h, z1.h }, #9
33+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
34+
// CHECK-NEXT: sqrshrn z10.b, { z0.h, z1.h }, #9
35+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
36+
37+
// --------------------------------------------------------------------------//
38+
// Negative tests for instructions that are incompatible with movprfx
39+
40+
movprfx z0, z7
41+
sqrshrn z10.b, { z0.h, z1.h }, #1
42+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
43+
// CHECK-NEXT: sqrshrn z10.b, { z0.h, z1.h }, #1
44+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
45+
46+
// --------------------------------------------------------------------------//
47+
// Invalid element width
48+
49+
sqrshrun z10.s, { z0.s, z1.s }, #1
50+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
51+
// CHECK-NEXT: sqrshrun z10.s, { z0.s, z1.s }, #1
52+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
53+
54+
sqrshrun z10.d, { z0.d, z1.d }, #1
55+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
56+
// CHECK-NEXT: sqrshrun z10.d, { z0.d, z1.d }, #1
57+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
58+
59+
// --------------------------------------------------------------------------//
60+
// Invalid operand for instruction
61+
62+
sqrshrun z10.h, { z0.b, z1.b }, #1
63+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
64+
// CHECK-NEXT: sqrshrun z10.h, { z0.b, z1.b }, #1
65+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
66+
67+
// --------------------------------------------------------------------------//
68+
// Intermediate out of range
69+
70+
sqrshrun z10.b, { z0.h, z1.h }, #0
71+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
72+
// CHECK-NEXT: sqrshrun z10.b, { z0.h, z1.h }, #0
73+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
74+
75+
sqrshrun z10.b, { z0.h, z1.h }, #9
76+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
77+
// CHECK-NEXT: sqrshrun z10.b, { z0.h, z1.h }, #9
78+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
79+
80+
// --------------------------------------------------------------------------//
81+
// Negative tests for instructions that are incompatible with movprfx
82+
83+
movprfx z0, z7
84+
sqrshrun z10.b, { z0.h, z1.h }, #1
85+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
86+
// CHECK-NEXT: sqrshrun z10.b, { z0.h, z1.h }, #1
87+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
88+
89+
// --------------------------------------------------------------------------//
90+
// Invalid element width
91+
92+
sqshrn z10.s, { z0.s, z1.s }, #1
93+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
94+
// CHECK-NEXT: sqshrn z10.s, { z0.s, z1.s }, #1
95+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
96+
97+
sqshrn z10.d, { z0.d, z1.d }, #1
98+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
99+
// CHECK-NEXT: sqshrn z10.d, { z0.d, z1.d }, #1
100+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
101+
102+
// --------------------------------------------------------------------------//
103+
// Intermediate out of range
104+
105+
sqshrn z10.b, { z0.h, z1.h }, #0
106+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
107+
// CHECK-NEXT: sqshrn z10.b, { z0.h, z1.h }, #0
108+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
109+
110+
sqshrn z10.b, { z0.h, z1.h }, #9
111+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
112+
// CHECK-NEXT: sqshrn z10.b, { z0.h, z1.h }, #9
113+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
114+
115+
sqshrn z0.h, { z0.s, z1.s }, #0
116+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 16].
117+
// CHECK-NEXT: sqshrn z0.h, { z0.s, z1.s }, #0
118+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
119+
120+
sqshrn z0.h, { z0.s, z1.s }, #17
121+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 16].
122+
// CHECK-NEXT: sqshrn z0.h, { z0.s, z1.s }, #17
123+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
124+
125+
126+
// --------------------------------------------------------------------------//
127+
// Negative tests for instructions that are incompatible with movprfx
128+
129+
movprfx z0, z7
130+
sqshrn z10.b, { z0.h, z1.h }, #1
131+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
132+
// CHECK-NEXT: sqshrn z10.b, { z0.h, z1.h }, #1
133+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
134+
135+
// --------------------------------------------------------------------------//
136+
// Invalid element width
137+
138+
sqshrun z10.s, { z0.s, z1.s }, #1
139+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
140+
// CHECK-NEXT: sqshrun z10.s, { z0.s, z1.s }, #1
141+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
142+
143+
sqshrun z10.d, { z0.d, z1.d }, #1
144+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
145+
// CHECK-NEXT: sqshrun z10.d, { z0.d, z1.d }, #1
146+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
147+
148+
// --------------------------------------------------------------------------//
149+
// Intermediate out of range
150+
151+
sqshrun z10.b, { z0.h, z1.h }, #0
152+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
153+
// CHECK-NEXT: sqshrun z10.b, { z0.h, z1.h }, #0
154+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
155+
156+
sqshrun z10.b, { z0.h, z1.h }, #9
157+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
158+
// CHECK-NEXT: sqshrun z10.b, { z0.h, z1.h }, #9
159+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
160+
161+
sqshrun z10.h, { z0.s, z1.s }, #0
162+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 16].
163+
// CHECK-NEXT: sqshrun z10.h, { z0.s, z1.s }, #0
164+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
165+
166+
sqshrun z10.h, { z0.s, z1.s }, #17
167+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 16].
168+
// CHECK-NEXT: sqshrun z10.h, { z0.s, z1.s }, #17
169+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
170+
171+
// --------------------------------------------------------------------------//
172+
// Negative tests for instructions that are incompatible with movprfx
173+
174+
movprfx z0, z7
175+
sqshrun z10.b, { z0.h, z1.h }, #1
176+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
177+
// CHECK-NEXT: sqshrun z10.b, { z0.h, z1.h }, #1
178+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
179+
180+
// --------------------------------------------------------------------------//
181+
// Invalid element width
182+
183+
uqrshrn z10.s, { z0.s, z1.s }, #1
184+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
185+
// CHECK-NEXT: uqrshrn z10.s, { z0.s, z1.s }, #1
186+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
187+
188+
uqrshrn z10.d, { z0.d, z1.d }, #1
189+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
190+
// CHECK-NEXT: uqrshrn z10.d, { z0.d, z1.d }, #1
191+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
192+
193+
// --------------------------------------------------------------------------//
194+
// Invalid operand for instruction
195+
196+
uqrshrn z10.h, { z0.b, z1.b }, #1
197+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
198+
// CHECK-NEXT: uqrshrn z10.h, { z0.b, z1.b }, #1
199+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
200+
201+
// --------------------------------------------------------------------------//
202+
// Intermediate out of range
203+
204+
uqrshrn z10.b, { z0.h, z1.h }, #0
205+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
206+
// CHECK-NEXT: uqrshrn z10.b, { z0.h, z1.h }, #0
207+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
208+
209+
uqrshrn z10.b, { z0.h, z1.h }, #9
210+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
211+
// CHECK-NEXT: uqrshrn z10.b, { z0.h, z1.h }, #9
212+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
213+
214+
// --------------------------------------------------------------------------//
215+
// Negative tests for instructions that are incompatible with movprfx
216+
217+
movprfx z0, z7
218+
uqrshrn z10.b, { z0.h, z1.h }, #1
219+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
220+
// CHECK-NEXT: uqrshrn z10.b, { z0.h, z1.h }, #1
221+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
222+
223+
// --------------------------------------------------------------------------//
224+
// Invalid element width
225+
226+
uqshrn z10.s, { z0.s, z1.s }, #1
227+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
228+
// CHECK-NEXT: uqshrn z10.s, { z0.s, z1.s }, #1
229+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
230+
231+
uqshrn z10.d, { z0.d, z1.d }, #1
232+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
233+
// CHECK-NEXT: uqshrn z10.d, { z0.d, z1.d }, #1
234+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
235+
236+
// --------------------------------------------------------------------------//
237+
// Intermediate out of range
238+
239+
uqshrn z10.b, { z0.h, z1.h }, #0
240+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
241+
// CHECK-NEXT: uqshrn z10.b, { z0.h, z1.h }, #0
242+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
243+
244+
uqshrn z10.b, { z0.h, z1.h }, #9
245+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 8].
246+
// CHECK-NEXT: uqshrn z10.b, { z0.h, z1.h }, #9
247+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
248+
249+
uqshrn z0.h, { z0.s, z1.s }, #0
250+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 16].
251+
// CHECK-NEXT: uqshrn z0.h, { z0.s, z1.s }, #0
252+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
253+
254+
uqshrn z0.h, { z0.s, z1.s }, #17
255+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [1, 16].
256+
// CHECK-NEXT: uqshrn z0.h, { z0.s, z1.s }, #17
257+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
258+
259+
// --------------------------------------------------------------------------//
260+
// Negative tests for instructions that are incompatible with movprfx
261+
262+
movprfx z0, z7
263+
uqshrn z10.b, { z0.h, z1.h }, #1
264+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: instruction is unpredictable when following a movprfx, suggest replacing movprfx with mov
265+
// CHECK-NEXT: uqshrn z10.b, { z0.h, z1.h }, #1
266+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

0 commit comments

Comments
 (0)