@@ -323,3 +323,111 @@ define <4 x i32> @nbsl_v4i32(<4 x i32> %0, <4 x i32> %1, <4 x i32> %2) {
323323 %8 = xor <4 x i32 > %7 , splat (i32 -1 )
324324 ret <4 x i32 > %8
325325}
326+
327+ ; Test types that need promotion.
328+
329+ define <4 x i8 > @bsl_v4i8 (<4 x i8 > %0 , <4 x i8 > %1 , <4 x i8 > %2 ) {
330+ ; NEON-LABEL: bsl_v4i8:
331+ ; NEON: // %bb.0:
332+ ; NEON-NEXT: movi d3, #0xff00ff00ff00ff
333+ ; NEON-NEXT: and v0.8b, v2.8b, v0.8b
334+ ; NEON-NEXT: eor v3.8b, v2.8b, v3.8b
335+ ; NEON-NEXT: and v1.8b, v1.8b, v3.8b
336+ ; NEON-NEXT: orr v0.8b, v0.8b, v1.8b
337+ ; NEON-NEXT: ret
338+ ;
339+ ; SVE2-LABEL: bsl_v4i8:
340+ ; SVE2: // %bb.0:
341+ ; SVE2-NEXT: movi d3, #0xff00ff00ff00ff
342+ ; SVE2-NEXT: and v0.8b, v2.8b, v0.8b
343+ ; SVE2-NEXT: eor v3.8b, v2.8b, v3.8b
344+ ; SVE2-NEXT: and v1.8b, v1.8b, v3.8b
345+ ; SVE2-NEXT: orr v0.8b, v0.8b, v1.8b
346+ ; SVE2-NEXT: ret
347+ %4 = and <4 x i8 > %2 , %0
348+ %5 = xor <4 x i8 > %2 , splat (i8 -1 )
349+ %6 = and <4 x i8 > %1 , %5
350+ %7 = or <4 x i8 > %4 , %6
351+ ret <4 x i8 > %7
352+ }
353+
354+ define <4 x i8 > @nbsl_v4i8 (<4 x i8 > %0 , <4 x i8 > %1 , <4 x i8 > %2 ) {
355+ ; NEON-LABEL: nbsl_v4i8:
356+ ; NEON: // %bb.0:
357+ ; NEON-NEXT: movi d3, #0xff00ff00ff00ff
358+ ; NEON-NEXT: and v0.8b, v2.8b, v0.8b
359+ ; NEON-NEXT: eor v4.8b, v2.8b, v3.8b
360+ ; NEON-NEXT: and v1.8b, v1.8b, v4.8b
361+ ; NEON-NEXT: orr v0.8b, v0.8b, v1.8b
362+ ; NEON-NEXT: eor v0.8b, v0.8b, v3.8b
363+ ; NEON-NEXT: ret
364+ ;
365+ ; SVE2-LABEL: nbsl_v4i8:
366+ ; SVE2: // %bb.0:
367+ ; SVE2-NEXT: movi d3, #0xff00ff00ff00ff
368+ ; SVE2-NEXT: and v0.8b, v2.8b, v0.8b
369+ ; SVE2-NEXT: eor v4.8b, v2.8b, v3.8b
370+ ; SVE2-NEXT: and v1.8b, v1.8b, v4.8b
371+ ; SVE2-NEXT: orr v0.8b, v0.8b, v1.8b
372+ ; SVE2-NEXT: eor v0.8b, v0.8b, v3.8b
373+ ; SVE2-NEXT: ret
374+ %4 = and <4 x i8 > %2 , %0
375+ %5 = xor <4 x i8 > %2 , splat (i8 -1 )
376+ %6 = and <4 x i8 > %1 , %5
377+ %7 = or <4 x i8 > %4 , %6
378+ %8 = xor <4 x i8 > %7 , splat (i8 -1 )
379+ ret <4 x i8 > %8
380+ }
381+
382+ define <4 x i8 > @bsl1n_v4i8 (<4 x i8 > %0 , <4 x i8 > %1 , <4 x i8 > %2 ) {
383+ ; NEON-LABEL: bsl1n_v4i8:
384+ ; NEON: // %bb.0:
385+ ; NEON-NEXT: movi d3, #0xff00ff00ff00ff
386+ ; NEON-NEXT: eor v0.8b, v0.8b, v3.8b
387+ ; NEON-NEXT: eor v3.8b, v2.8b, v3.8b
388+ ; NEON-NEXT: and v0.8b, v2.8b, v0.8b
389+ ; NEON-NEXT: and v1.8b, v1.8b, v3.8b
390+ ; NEON-NEXT: orr v0.8b, v0.8b, v1.8b
391+ ; NEON-NEXT: ret
392+ ;
393+ ; SVE2-LABEL: bsl1n_v4i8:
394+ ; SVE2: // %bb.0:
395+ ; SVE2-NEXT: movi d3, #0xff00ff00ff00ff
396+ ; SVE2-NEXT: eor v0.8b, v0.8b, v3.8b
397+ ; SVE2-NEXT: eor v3.8b, v2.8b, v3.8b
398+ ; SVE2-NEXT: and v0.8b, v2.8b, v0.8b
399+ ; SVE2-NEXT: and v1.8b, v1.8b, v3.8b
400+ ; SVE2-NEXT: orr v0.8b, v0.8b, v1.8b
401+ ; SVE2-NEXT: ret
402+ %4 = xor <4 x i8 > %0 , splat (i8 -1 )
403+ %5 = and <4 x i8 > %2 , %4
404+ %6 = xor <4 x i8 > %2 , splat (i8 -1 )
405+ %7 = and <4 x i8 > %1 , %6
406+ %8 = or <4 x i8 > %5 , %7
407+ ret <4 x i8 > %8
408+ }
409+
410+ define <4 x i8 > @bsl2n_v4i8 (<4 x i8 > %0 , <4 x i8 > %1 , <4 x i8 > %2 ) {
411+ ; NEON-LABEL: bsl2n_v4i8:
412+ ; NEON: // %bb.0:
413+ ; NEON-NEXT: movi d3, #0xff00ff00ff00ff
414+ ; NEON-NEXT: orr v1.8b, v2.8b, v1.8b
415+ ; NEON-NEXT: and v0.8b, v2.8b, v0.8b
416+ ; NEON-NEXT: eor v1.8b, v1.8b, v3.8b
417+ ; NEON-NEXT: orr v0.8b, v0.8b, v1.8b
418+ ; NEON-NEXT: ret
419+ ;
420+ ; SVE2-LABEL: bsl2n_v4i8:
421+ ; SVE2: // %bb.0:
422+ ; SVE2-NEXT: movi d3, #0xff00ff00ff00ff
423+ ; SVE2-NEXT: orr v1.8b, v2.8b, v1.8b
424+ ; SVE2-NEXT: and v0.8b, v2.8b, v0.8b
425+ ; SVE2-NEXT: eor v1.8b, v1.8b, v3.8b
426+ ; SVE2-NEXT: orr v0.8b, v0.8b, v1.8b
427+ ; SVE2-NEXT: ret
428+ %4 = and <4 x i8 > %2 , %0
429+ %5 = or <4 x i8 > %2 , %1
430+ %6 = xor <4 x i8 > %5 , splat (i8 -1 )
431+ %7 = or <4 x i8 > %4 , %6
432+ ret <4 x i8 > %7
433+ }
0 commit comments