@@ -125,6 +125,117 @@ entry:
125
125
ret <2 x i32 > %t
126
126
}
127
127
128
+ define <2 x i32 > @vqmovni64_smaxmin_u (<2 x i64 > %s0 ) {
129
+ ; CHECK-LABEL: vqmovni64_smaxmin_u:
130
+ ; CHECK: // %bb.0: // %entry
131
+ ; CHECK-NEXT: movi v1.2d, #0x000000ffffffff
132
+ ; CHECK-NEXT: cmgt v2.2d, v1.2d, v0.2d
133
+ ; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b
134
+ ; CHECK-NEXT: cmgt v1.2d, v0.2d, #0
135
+ ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
136
+ ; CHECK-NEXT: xtn v0.2s, v0.2d
137
+ ; CHECK-NEXT: ret
138
+ entry:
139
+ %c1 = icmp slt <2 x i64 > %s0 , <i64 4294967295 , i64 4294967295 >
140
+ %s1 = select <2 x i1 > %c1 , <2 x i64 > %s0 , <2 x i64 > <i64 4294967295 , i64 4294967295 >
141
+ %c2 = icmp sgt <2 x i64 > %s1 , zeroinitializer
142
+ %s2 = select <2 x i1 > %c2 , <2 x i64 > %s1 , <2 x i64 > zeroinitializer
143
+ %t = trunc <2 x i64 > %s2 to <2 x i32 >
144
+ ret <2 x i32 > %t
145
+ }
146
+
147
+ define <2 x i32 > @vqmovni64_sminmax_u (<2 x i64 > %s0 ) {
148
+ ; CHECK-LABEL: vqmovni64_sminmax_u:
149
+ ; CHECK: // %bb.0: // %entry
150
+ ; CHECK-NEXT: cmgt v1.2d, v0.2d, #0
151
+ ; CHECK-NEXT: movi v2.2d, #0x000000ffffffff
152
+ ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
153
+ ; CHECK-NEXT: cmgt v1.2d, v2.2d, v0.2d
154
+ ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
155
+ ; CHECK-NEXT: orn v0.16b, v0.16b, v1.16b
156
+ ; CHECK-NEXT: xtn v0.2s, v0.2d
157
+ ; CHECK-NEXT: ret
158
+ entry:
159
+ %c1 = icmp sgt <2 x i64 > %s0 , zeroinitializer
160
+ %s1 = select <2 x i1 > %c1 , <2 x i64 > %s0 , <2 x i64 > zeroinitializer
161
+ %c2 = icmp slt <2 x i64 > %s1 , <i64 4294967295 , i64 4294967295 >
162
+ %s2 = select <2 x i1 > %c2 , <2 x i64 > %s1 , <2 x i64 > <i64 4294967295 , i64 4294967295 >
163
+ %t = trunc <2 x i64 > %s2 to <2 x i32 >
164
+ ret <2 x i32 > %t
165
+ }
166
+
167
+ define <4 x i16 > @vqmovni32_smaxmin_u (<4 x i32 > %s0 ) {
168
+ ; CHECK-LABEL: vqmovni32_smaxmin_u:
169
+ ; CHECK: // %bb.0: // %entry
170
+ ; CHECK-NEXT: movi v1.2d, #0x00ffff0000ffff
171
+ ; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s
172
+ ; CHECK-NEXT: movi v1.2d, #0000000000000000
173
+ ; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s
174
+ ; CHECK-NEXT: xtn v0.4h, v0.4s
175
+ ; CHECK-NEXT: ret
176
+ entry:
177
+ %c1 = icmp slt <4 x i32 > %s0 , <i32 65535 , i32 65535 , i32 65535 , i32 65535 >
178
+ %s1 = select <4 x i1 > %c1 , <4 x i32 > %s0 , <4 x i32 > <i32 65535 , i32 65535 , i32 65535 , i32 65535 >
179
+ %c2 = icmp sgt <4 x i32 > %s1 , zeroinitializer
180
+ %s2 = select <4 x i1 > %c2 , <4 x i32 > %s1 , <4 x i32 > zeroinitializer
181
+ %t = trunc <4 x i32 > %s2 to <4 x i16 >
182
+ ret <4 x i16 > %t
183
+ }
184
+
185
+ define <4 x i16 > @vqmovni32_sminmax_u (<4 x i32 > %s0 ) {
186
+ ; CHECK-LABEL: vqmovni32_sminmax_u:
187
+ ; CHECK: // %bb.0: // %entry
188
+ ; CHECK-NEXT: movi v1.2d, #0000000000000000
189
+ ; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s
190
+ ; CHECK-NEXT: movi v1.2d, #0x00ffff0000ffff
191
+ ; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s
192
+ ; CHECK-NEXT: xtn v0.4h, v0.4s
193
+ ; CHECK-NEXT: ret
194
+ entry:
195
+ %c1 = icmp sgt <4 x i32 > %s0 , zeroinitializer
196
+ %s1 = select <4 x i1 > %c1 , <4 x i32 > %s0 , <4 x i32 > zeroinitializer
197
+ %c2 = icmp slt <4 x i32 > %s1 , <i32 65535 , i32 65535 , i32 65535 , i32 65535 >
198
+ %s2 = select <4 x i1 > %c2 , <4 x i32 > %s1 , <4 x i32 > <i32 65535 , i32 65535 , i32 65535 , i32 65535 >
199
+ %t = trunc <4 x i32 > %s2 to <4 x i16 >
200
+ ret <4 x i16 > %t
201
+ }
202
+
203
+ define <8 x i8 > @vqmovni16_smaxmin_u (<8 x i16 > %s0 ) {
204
+ ; CHECK-LABEL: vqmovni16_smaxmin_u:
205
+ ; CHECK: // %bb.0: // %entry
206
+ ; CHECK-NEXT: movi v1.2d, #0xff00ff00ff00ff
207
+ ; CHECK-NEXT: movi v2.2d, #0000000000000000
208
+ ; CHECK-NEXT: smin v0.8h, v0.8h, v1.8h
209
+ ; CHECK-NEXT: smax v0.8h, v0.8h, v2.8h
210
+ ; CHECK-NEXT: xtn v0.8b, v0.8h
211
+ ; CHECK-NEXT: ret
212
+ entry:
213
+ %c1 = icmp slt <8 x i16 > %s0 , <i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 >
214
+ %s1 = select <8 x i1 > %c1 , <8 x i16 > %s0 , <8 x i16 > <i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 >
215
+ %c2 = icmp sgt <8 x i16 > %s1 , zeroinitializer
216
+ %s2 = select <8 x i1 > %c2 , <8 x i16 > %s1 , <8 x i16 > zeroinitializer
217
+ %t = trunc <8 x i16 > %s2 to <8 x i8 >
218
+ ret <8 x i8 > %t
219
+ }
220
+
221
+ define <8 x i8 > @vqmovni16_sminmax_u (<8 x i16 > %s0 ) {
222
+ ; CHECK-LABEL: vqmovni16_sminmax_u:
223
+ ; CHECK: // %bb.0: // %entry
224
+ ; CHECK-NEXT: movi v1.2d, #0000000000000000
225
+ ; CHECK-NEXT: movi v2.2d, #0xff00ff00ff00ff
226
+ ; CHECK-NEXT: smax v0.8h, v0.8h, v1.8h
227
+ ; CHECK-NEXT: smin v0.8h, v0.8h, v2.8h
228
+ ; CHECK-NEXT: xtn v0.8b, v0.8h
229
+ ; CHECK-NEXT: ret
230
+ entry:
231
+ %c1 = icmp sgt <8 x i16 > %s0 , zeroinitializer
232
+ %s1 = select <8 x i1 > %c1 , <8 x i16 > %s0 , <8 x i16 > zeroinitializer
233
+ %c2 = icmp slt <8 x i16 > %s1 , <i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 >
234
+ %s2 = select <8 x i1 > %c2 , <8 x i16 > %s1 , <8 x i16 > <i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 >
235
+ %t = trunc <8 x i16 > %s2 to <8 x i8 >
236
+ ret <8 x i8 > %t
237
+ }
238
+
128
239
define <2 x i32 > @vqmovni64_umaxmin (<2 x i64 > %s0 ) {
129
240
; CHECK-LABEL: vqmovni64_umaxmin:
130
241
; CHECK: // %bb.0: // %entry
@@ -347,3 +458,61 @@ entry:
347
458
%shuffle = shufflevector <2 x i32 > %x , <2 x i32 > %trunc , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
348
459
ret <4 x i32 > %shuffle
349
460
}
461
+
462
+ ; Test the (concat_vectors (X), (trunc(smin(smax(Y, 0), 2^n))))) pattern.
463
+
464
+ define <16 x i8 > @sminsmax_range_unsigned_i16_to_i8 (<8 x i8 > %x , <8 x i16 > %y ) {
465
+ ; CHECK-LABEL: sminsmax_range_unsigned_i16_to_i8:
466
+ ; CHECK: // %bb.0: // %entry
467
+ ; CHECK-NEXT: movi v2.2d, #0000000000000000
468
+ ; CHECK-NEXT: movi v3.2d, #0xff00ff00ff00ff
469
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
470
+ ; CHECK-NEXT: smax v1.8h, v1.8h, v2.8h
471
+ ; CHECK-NEXT: smin v1.8h, v1.8h, v3.8h
472
+ ; CHECK-NEXT: xtn2 v0.16b, v1.8h
473
+ ; CHECK-NEXT: ret
474
+ entry:
475
+ %min = call <8 x i16 > @llvm.smax.v8i16 (<8 x i16 > %y , <8 x i16 > zeroinitializer )
476
+ %max = call <8 x i16 > @llvm.smin.v8i16 (<8 x i16 > %min , <8 x i16 > <i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 , i16 255 >)
477
+ %trunc = trunc <8 x i16 > %max to <8 x i8 >
478
+ %shuffle = shufflevector <8 x i8 > %x , <8 x i8 > %trunc , <16 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 , i32 8 , i32 9 , i32 10 , i32 11 , i32 12 , i32 13 , i32 14 , i32 15 >
479
+ ret <16 x i8 > %shuffle
480
+ }
481
+
482
+ define <8 x i16 > @sminsmax_range_unsigned_i32_to_i16 (<4 x i16 > %x , <4 x i32 > %y ) {
483
+ ; CHECK-LABEL: sminsmax_range_unsigned_i32_to_i16:
484
+ ; CHECK: // %bb.0: // %entry
485
+ ; CHECK-NEXT: movi v2.2d, #0000000000000000
486
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
487
+ ; CHECK-NEXT: smax v1.4s, v1.4s, v2.4s
488
+ ; CHECK-NEXT: movi v2.2d, #0x00ffff0000ffff
489
+ ; CHECK-NEXT: smin v1.4s, v1.4s, v2.4s
490
+ ; CHECK-NEXT: xtn2 v0.8h, v1.4s
491
+ ; CHECK-NEXT: ret
492
+ entry:
493
+ %smax = call <4 x i32 > @llvm.smax.v4i32 (<4 x i32 > %y , <4 x i32 > zeroinitializer )
494
+ %smin = call <4 x i32 > @llvm.smin.v4i32 (<4 x i32 > %smax , <4 x i32 > <i32 65535 , i32 65535 , i32 65535 , i32 65535 >)
495
+ %trunc = trunc <4 x i32 > %smin to <4 x i16 >
496
+ %shuffle = shufflevector <4 x i16 > %x , <4 x i16 > %trunc , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
497
+ ret <8 x i16 > %shuffle
498
+ }
499
+
500
+ define <4 x i32 > @sminsmax_range_unsigned_i64_to_i32 (<2 x i32 > %x , <2 x i64 > %y ) {
501
+ ; CHECK-LABEL: sminsmax_range_unsigned_i64_to_i32:
502
+ ; CHECK: // %bb.0: // %entry
503
+ ; CHECK-NEXT: cmgt v2.2d, v1.2d, #0
504
+ ; CHECK-NEXT: movi v3.2d, #0x000000ffffffff
505
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
506
+ ; CHECK-NEXT: and v1.16b, v1.16b, v2.16b
507
+ ; CHECK-NEXT: cmgt v2.2d, v3.2d, v1.2d
508
+ ; CHECK-NEXT: and v1.16b, v1.16b, v2.16b
509
+ ; CHECK-NEXT: orn v1.16b, v1.16b, v2.16b
510
+ ; CHECK-NEXT: xtn2 v0.4s, v1.2d
511
+ ; CHECK-NEXT: ret
512
+ entry:
513
+ %smax = call <2 x i64 > @llvm.smax.v2i64 (<2 x i64 > %y , <2 x i64 > zeroinitializer )
514
+ %smin = call <2 x i64 > @llvm.smin.v2i64 (<2 x i64 > %smax , <2 x i64 > <i64 4294967295 , i64 4294967295 >)
515
+ %trunc = trunc <2 x i64 > %smin to <2 x i32 >
516
+ %shuffle = shufflevector <2 x i32 > %x , <2 x i32 > %trunc , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
517
+ ret <4 x i32 > %shuffle
518
+ }
0 commit comments