@@ -324,3 +324,109 @@ define void @and_not_combine_splatimm_v4i64(ptr %res, ptr %a0) nounwind {
324
324
store <4 x i64 > %xor , ptr %res
325
325
ret void
326
326
}
327
+
328
+ define void @and_or_not_combine_v32i8 (ptr %pa , ptr %pb , ptr %pv , ptr %dst ) nounwind {
329
+ ; CHECK-LABEL: and_or_not_combine_v32i8:
330
+ ; CHECK: # %bb.0:
331
+ ; CHECK-NEXT: xvld $xr0, $a0, 0
332
+ ; CHECK-NEXT: xvld $xr1, $a2, 0
333
+ ; CHECK-NEXT: xvld $xr2, $a1, 0
334
+ ; CHECK-NEXT: xvseq.b $xr0, $xr1, $xr0
335
+ ; CHECK-NEXT: xvxori.b $xr0, $xr0, 255
336
+ ; CHECK-NEXT: xvseq.b $xr1, $xr1, $xr2
337
+ ; CHECK-NEXT: xvorn.v $xr0, $xr0, $xr1
338
+ ; CHECK-NEXT: xvandi.b $xr0, $xr0, 4
339
+ ; CHECK-NEXT: xvst $xr0, $a3, 0
340
+ ; CHECK-NEXT: ret
341
+ %a = load <32 x i8 >, ptr %pa
342
+ %b = load <32 x i8 >, ptr %pb
343
+ %v = load <32 x i8 >, ptr %pv
344
+ %ca = icmp ne <32 x i8 > %v , %a
345
+ %cb = icmp ne <32 x i8 > %v , %b
346
+ %or = or <32 x i1 > %ca , %cb
347
+ %ext = sext <32 x i1 > %or to <32 x i8 >
348
+ %and = and <32 x i8 > %ext , splat (i8 4 )
349
+ store <32 x i8 > %and , ptr %dst
350
+ ret void
351
+ }
352
+
353
+ define void @and_or_not_combine_v16i16 (ptr %pa , ptr %pb , ptr %pv , ptr %dst ) nounwind {
354
+ ; CHECK-LABEL: and_or_not_combine_v16i16:
355
+ ; CHECK: # %bb.0:
356
+ ; CHECK-NEXT: xvld $xr0, $a0, 0
357
+ ; CHECK-NEXT: xvld $xr1, $a2, 0
358
+ ; CHECK-NEXT: xvld $xr2, $a1, 0
359
+ ; CHECK-NEXT: xvseq.h $xr0, $xr1, $xr0
360
+ ; CHECK-NEXT: xvrepli.b $xr3, -1
361
+ ; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr3
362
+ ; CHECK-NEXT: xvseq.h $xr1, $xr1, $xr2
363
+ ; CHECK-NEXT: xvorn.v $xr0, $xr0, $xr1
364
+ ; CHECK-NEXT: xvrepli.h $xr1, 4
365
+ ; CHECK-NEXT: xvand.v $xr0, $xr0, $xr1
366
+ ; CHECK-NEXT: xvst $xr0, $a3, 0
367
+ ; CHECK-NEXT: ret
368
+ %a = load <16 x i16 >, ptr %pa
369
+ %b = load <16 x i16 >, ptr %pb
370
+ %v = load <16 x i16 >, ptr %pv
371
+ %ca = icmp ne <16 x i16 > %v , %a
372
+ %cb = icmp ne <16 x i16 > %v , %b
373
+ %or = or <16 x i1 > %ca , %cb
374
+ %ext = sext <16 x i1 > %or to <16 x i16 >
375
+ %and = and <16 x i16 > %ext , splat (i16 4 )
376
+ store <16 x i16 > %and , ptr %dst
377
+ ret void
378
+ }
379
+
380
+ define void @and_or_not_combine_v8i32 (ptr %pa , ptr %pb , ptr %pv , ptr %dst ) nounwind {
381
+ ; CHECK-LABEL: and_or_not_combine_v8i32:
382
+ ; CHECK: # %bb.0:
383
+ ; CHECK-NEXT: xvld $xr0, $a0, 0
384
+ ; CHECK-NEXT: xvld $xr1, $a2, 0
385
+ ; CHECK-NEXT: xvld $xr2, $a1, 0
386
+ ; CHECK-NEXT: xvseq.w $xr0, $xr1, $xr0
387
+ ; CHECK-NEXT: xvrepli.b $xr3, -1
388
+ ; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr3
389
+ ; CHECK-NEXT: xvseq.w $xr1, $xr1, $xr2
390
+ ; CHECK-NEXT: xvorn.v $xr0, $xr0, $xr1
391
+ ; CHECK-NEXT: xvrepli.w $xr1, 4
392
+ ; CHECK-NEXT: xvand.v $xr0, $xr0, $xr1
393
+ ; CHECK-NEXT: xvst $xr0, $a3, 0
394
+ ; CHECK-NEXT: ret
395
+ %a = load <8 x i32 >, ptr %pa
396
+ %b = load <8 x i32 >, ptr %pb
397
+ %v = load <8 x i32 >, ptr %pv
398
+ %ca = icmp ne <8 x i32 > %v , %a
399
+ %cb = icmp ne <8 x i32 > %v , %b
400
+ %or = or <8 x i1 > %ca , %cb
401
+ %ext = sext <8 x i1 > %or to <8 x i32 >
402
+ %and = and <8 x i32 > %ext , splat (i32 4 )
403
+ store <8 x i32 > %and , ptr %dst
404
+ ret void
405
+ }
406
+
407
+ define void @and_or_not_combine_v4i64 (ptr %pa , ptr %pb , ptr %pv , ptr %dst ) nounwind {
408
+ ; CHECK-LABEL: and_or_not_combine_v4i64:
409
+ ; CHECK: # %bb.0:
410
+ ; CHECK-NEXT: xvld $xr0, $a0, 0
411
+ ; CHECK-NEXT: xvld $xr1, $a2, 0
412
+ ; CHECK-NEXT: xvld $xr2, $a1, 0
413
+ ; CHECK-NEXT: xvseq.d $xr0, $xr1, $xr0
414
+ ; CHECK-NEXT: xvrepli.b $xr3, -1
415
+ ; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr3
416
+ ; CHECK-NEXT: xvseq.d $xr1, $xr1, $xr2
417
+ ; CHECK-NEXT: xvorn.v $xr0, $xr0, $xr1
418
+ ; CHECK-NEXT: xvrepli.d $xr1, 4
419
+ ; CHECK-NEXT: xvand.v $xr0, $xr0, $xr1
420
+ ; CHECK-NEXT: xvst $xr0, $a3, 0
421
+ ; CHECK-NEXT: ret
422
+ %a = load <4 x i64 >, ptr %pa
423
+ %b = load <4 x i64 >, ptr %pb
424
+ %v = load <4 x i64 >, ptr %pv
425
+ %ca = icmp ne <4 x i64 > %v , %a
426
+ %cb = icmp ne <4 x i64 > %v , %b
427
+ %or = or <4 x i1 > %ca , %cb
428
+ %ext = sext <4 x i1 > %or to <4 x i64 >
429
+ %and = and <4 x i64 > %ext , splat (i64 4 )
430
+ store <4 x i64 > %and , ptr %dst
431
+ ret void
432
+ }
0 commit comments