@@ -30,6 +30,36 @@ entry:
30
30
ret <vscale x 16 x i1 > %active.lane.mask.alias
31
31
}
32
32
33
+ define <vscale x 16 x i1 > @whilerw_8 (ptr noalias %a , ptr %b , ptr %c , i32 %n ) {
34
+ ; CHECK-SVE2-LABEL: whilerw_8:
35
+ ; CHECK-SVE2: // %bb.0: // %entry
36
+ ; CHECK-SVE2-NEXT: whilerw p0.b, x2, x1
37
+ ; CHECK-SVE2-NEXT: ret
38
+ ;
39
+ ; CHECK-NOSVE2-LABEL: whilerw_8:
40
+ ; CHECK-NOSVE2: // %bb.0: // %entry
41
+ ; CHECK-NOSVE2-NEXT: subs x8, x2, x1
42
+ ; CHECK-NOSVE2-NEXT: cneg x8, x8, mi
43
+ ; CHECK-NOSVE2-NEXT: cmp x8, #1
44
+ ; CHECK-NOSVE2-NEXT: cset w9, lt
45
+ ; CHECK-NOSVE2-NEXT: whilelo p0.b, xzr, x8
46
+ ; CHECK-NOSVE2-NEXT: sbfx x8, x9, #0, #1
47
+ ; CHECK-NOSVE2-NEXT: whilelo p1.b, xzr, x8
48
+ ; CHECK-NOSVE2-NEXT: sel p0.b, p0, p0.b, p1.b
49
+ ; CHECK-NOSVE2-NEXT: ret
50
+ entry:
51
+ %b24 = ptrtoint ptr %b to i64
52
+ %c25 = ptrtoint ptr %c to i64
53
+ %sub.diff = sub i64 %c25 , %b24
54
+ %0 = tail call i64 @llvm.abs.i64 (i64 %sub.diff , i1 false )
55
+ %neg.compare = icmp slt i64 %0 , 1
56
+ %.splatinsert = insertelement <vscale x 16 x i1 > poison, i1 %neg.compare , i64 0
57
+ %.splat = shufflevector <vscale x 16 x i1 > %.splatinsert , <vscale x 16 x i1 > poison, <vscale x 16 x i32 > zeroinitializer
58
+ %ptr.diff.lane.mask = tail call <vscale x 16 x i1 > @llvm.get.active.lane.mask.nxv16i1.i64 (i64 0 , i64 %0 )
59
+ %active.lane.mask.alias = or <vscale x 16 x i1 > %ptr.diff.lane.mask , %.splat
60
+ ret <vscale x 16 x i1 > %active.lane.mask.alias
61
+ }
62
+
33
63
define <vscale x 16 x i1 > @whilewr_commutative (ptr noalias %a , ptr %b , ptr %c , i32 %n ) {
34
64
; CHECK-LABEL: whilewr_commutative:
35
65
; CHECK: // %bb.0: // %entry
@@ -89,6 +119,39 @@ entry:
89
119
ret <vscale x 8 x i1 > %active.lane.mask.alias
90
120
}
91
121
122
+ define <vscale x 8 x i1 > @whilerw_16 (ptr noalias %a , ptr %b , ptr %c , i32 %n ) {
123
+ ; CHECK-SVE2-LABEL: whilerw_16:
124
+ ; CHECK-SVE2: // %bb.0: // %entry
125
+ ; CHECK-SVE2-NEXT: whilerw p0.h, x2, x1
126
+ ; CHECK-SVE2-NEXT: ret
127
+ ;
128
+ ; CHECK-NOSVE2-LABEL: whilerw_16:
129
+ ; CHECK-NOSVE2: // %bb.0: // %entry
130
+ ; CHECK-NOSVE2-NEXT: subs x8, x2, x1
131
+ ; CHECK-NOSVE2-NEXT: cneg x8, x8, mi
132
+ ; CHECK-NOSVE2-NEXT: cmp x8, #2
133
+ ; CHECK-NOSVE2-NEXT: add x8, x8, x8, lsr #63
134
+ ; CHECK-NOSVE2-NEXT: cset w9, lt
135
+ ; CHECK-NOSVE2-NEXT: sbfx x9, x9, #0, #1
136
+ ; CHECK-NOSVE2-NEXT: asr x8, x8, #1
137
+ ; CHECK-NOSVE2-NEXT: whilelo p0.h, xzr, x9
138
+ ; CHECK-NOSVE2-NEXT: whilelo p1.h, xzr, x8
139
+ ; CHECK-NOSVE2-NEXT: mov p0.b, p1/m, p1.b
140
+ ; CHECK-NOSVE2-NEXT: ret
141
+ entry:
142
+ %b24 = ptrtoint ptr %b to i64
143
+ %c25 = ptrtoint ptr %c to i64
144
+ %sub.diff = sub i64 %c25 , %b24
145
+ %0 = tail call i64 @llvm.abs.i64 (i64 %sub.diff , i1 false )
146
+ %diff = sdiv i64 %0 , 2
147
+ %neg.compare = icmp slt i64 %0 , 2
148
+ %.splatinsert = insertelement <vscale x 8 x i1 > poison, i1 %neg.compare , i64 0
149
+ %.splat = shufflevector <vscale x 8 x i1 > %.splatinsert , <vscale x 8 x i1 > poison, <vscale x 8 x i32 > zeroinitializer
150
+ %ptr.diff.lane.mask = tail call <vscale x 8 x i1 > @llvm.get.active.lane.mask.nxv8i1.i64 (i64 0 , i64 %diff )
151
+ %active.lane.mask.alias = or <vscale x 8 x i1 > %ptr.diff.lane.mask , %.splat
152
+ ret <vscale x 8 x i1 > %active.lane.mask.alias
153
+ }
154
+
92
155
define <vscale x 4 x i1 > @whilewr_32 (ptr noalias %a , ptr %b , ptr %c , i32 %n ) {
93
156
; CHECK-LABEL: whilewr_32:
94
157
; CHECK: // %bb.0: // %entry
@@ -122,6 +185,41 @@ entry:
122
185
ret <vscale x 4 x i1 > %active.lane.mask.alias
123
186
}
124
187
188
+ define <vscale x 4 x i1 > @whilerw_32 (ptr noalias %a , ptr %b , ptr %c , i32 %n ) {
189
+ ; CHECK-SVE2-LABEL: whilerw_32:
190
+ ; CHECK-SVE2: // %bb.0: // %entry
191
+ ; CHECK-SVE2-NEXT: whilerw p0.s, x2, x1
192
+ ; CHECK-SVE2-NEXT: ret
193
+ ;
194
+ ; CHECK-NOSVE2-LABEL: whilerw_32:
195
+ ; CHECK-NOSVE2: // %bb.0: // %entry
196
+ ; CHECK-NOSVE2-NEXT: subs x8, x2, x1
197
+ ; CHECK-NOSVE2-NEXT: cneg x8, x8, mi
198
+ ; CHECK-NOSVE2-NEXT: add x9, x8, #3
199
+ ; CHECK-NOSVE2-NEXT: cmp x8, #0
200
+ ; CHECK-NOSVE2-NEXT: csel x9, x9, x8, lt
201
+ ; CHECK-NOSVE2-NEXT: cmp x8, #4
202
+ ; CHECK-NOSVE2-NEXT: cset w8, lt
203
+ ; CHECK-NOSVE2-NEXT: asr x9, x9, #2
204
+ ; CHECK-NOSVE2-NEXT: sbfx x8, x8, #0, #1
205
+ ; CHECK-NOSVE2-NEXT: whilelo p1.s, xzr, x9
206
+ ; CHECK-NOSVE2-NEXT: whilelo p0.s, xzr, x8
207
+ ; CHECK-NOSVE2-NEXT: mov p0.b, p1/m, p1.b
208
+ ; CHECK-NOSVE2-NEXT: ret
209
+ entry:
210
+ %b24 = ptrtoint ptr %b to i64
211
+ %c25 = ptrtoint ptr %c to i64
212
+ %sub.diff = sub i64 %c25 , %b24
213
+ %0 = tail call i64 @llvm.abs.i64 (i64 %sub.diff , i1 false )
214
+ %diff = sdiv i64 %0 , 4
215
+ %neg.compare = icmp slt i64 %0 , 4
216
+ %.splatinsert = insertelement <vscale x 4 x i1 > poison, i1 %neg.compare , i64 0
217
+ %.splat = shufflevector <vscale x 4 x i1 > %.splatinsert , <vscale x 4 x i1 > poison, <vscale x 4 x i32 > zeroinitializer
218
+ %ptr.diff.lane.mask = tail call <vscale x 4 x i1 > @llvm.get.active.lane.mask.nxv4i1.i64 (i64 0 , i64 %diff )
219
+ %active.lane.mask.alias = or <vscale x 4 x i1 > %ptr.diff.lane.mask , %.splat
220
+ ret <vscale x 4 x i1 > %active.lane.mask.alias
221
+ }
222
+
125
223
define <vscale x 2 x i1 > @whilewr_64 (ptr noalias %a , ptr %b , ptr %c , i32 %n ) {
126
224
; CHECK-LABEL: whilewr_64:
127
225
; CHECK: // %bb.0: // %entry
@@ -155,6 +253,41 @@ entry:
155
253
ret <vscale x 2 x i1 > %active.lane.mask.alias
156
254
}
157
255
256
+ define <vscale x 2 x i1 > @whilerw_64 (ptr noalias %a , ptr %b , ptr %c , i32 %n ) {
257
+ ; CHECK-SVE2-LABEL: whilerw_64:
258
+ ; CHECK-SVE2: // %bb.0: // %entry
259
+ ; CHECK-SVE2-NEXT: whilerw p0.d, x2, x1
260
+ ; CHECK-SVE2-NEXT: ret
261
+ ;
262
+ ; CHECK-NOSVE2-LABEL: whilerw_64:
263
+ ; CHECK-NOSVE2: // %bb.0: // %entry
264
+ ; CHECK-NOSVE2-NEXT: subs x8, x2, x1
265
+ ; CHECK-NOSVE2-NEXT: cneg x8, x8, mi
266
+ ; CHECK-NOSVE2-NEXT: add x9, x8, #7
267
+ ; CHECK-NOSVE2-NEXT: cmp x8, #0
268
+ ; CHECK-NOSVE2-NEXT: csel x9, x9, x8, lt
269
+ ; CHECK-NOSVE2-NEXT: cmp x8, #8
270
+ ; CHECK-NOSVE2-NEXT: cset w8, lt
271
+ ; CHECK-NOSVE2-NEXT: asr x9, x9, #3
272
+ ; CHECK-NOSVE2-NEXT: sbfx x8, x8, #0, #1
273
+ ; CHECK-NOSVE2-NEXT: whilelo p1.d, xzr, x9
274
+ ; CHECK-NOSVE2-NEXT: whilelo p0.d, xzr, x8
275
+ ; CHECK-NOSVE2-NEXT: mov p0.b, p1/m, p1.b
276
+ ; CHECK-NOSVE2-NEXT: ret
277
+ entry:
278
+ %b24 = ptrtoint ptr %b to i64
279
+ %c25 = ptrtoint ptr %c to i64
280
+ %sub.diff = sub i64 %c25 , %b24
281
+ %0 = tail call i64 @llvm.abs.i64 (i64 %sub.diff , i1 false )
282
+ %diff = sdiv i64 %0 , 8
283
+ %neg.compare = icmp slt i64 %0 , 8
284
+ %.splatinsert = insertelement <vscale x 2 x i1 > poison, i1 %neg.compare , i64 0
285
+ %.splat = shufflevector <vscale x 2 x i1 > %.splatinsert , <vscale x 2 x i1 > poison, <vscale x 2 x i32 > zeroinitializer
286
+ %ptr.diff.lane.mask = tail call <vscale x 2 x i1 > @llvm.get.active.lane.mask.nxv2i1.i64 (i64 0 , i64 %diff )
287
+ %active.lane.mask.alias = or <vscale x 2 x i1 > %ptr.diff.lane.mask , %.splat
288
+ ret <vscale x 2 x i1 > %active.lane.mask.alias
289
+ }
290
+
158
291
define <vscale x 1 x i1 > @no_whilewr_128 (ptr noalias %a , ptr %b , ptr %c , i32 %n ) {
159
292
; CHECK-LABEL: no_whilewr_128:
160
293
; CHECK: // %bb.0: // %entry
0 commit comments