@@ -408,10 +408,9 @@ define i8 @abd_select_i8(i8 %a, i8 %b) nounwind {
408408; CHECK-LABEL: abd_select_i8:
409409; CHECK: // %bb.0:
410410; CHECK-NEXT: and w8, w0, #0xff
411- ; CHECK-NEXT: cmp w8, w1, uxtb
412- ; CHECK-NEXT: csel w8, w0, w1, lo
413- ; CHECK-NEXT: csel w9, w1, w0, lo
414- ; CHECK-NEXT: sub w0, w9, w8
411+ ; CHECK-NEXT: sub w8, w8, w1, uxtb
412+ ; CHECK-NEXT: cmp w8, #0
413+ ; CHECK-NEXT: cneg w0, w8, mi
415414; CHECK-NEXT: ret
416415 %cmp = icmp ult i8 %a , %b
417416 %ab = select i1 %cmp , i8 %a , i8 %b
@@ -424,10 +423,9 @@ define i16 @abd_select_i16(i16 %a, i16 %b) nounwind {
424423; CHECK-LABEL: abd_select_i16:
425424; CHECK: // %bb.0:
426425; CHECK-NEXT: and w8, w0, #0xffff
427- ; CHECK-NEXT: cmp w8, w1, uxth
428- ; CHECK-NEXT: csel w8, w0, w1, ls
429- ; CHECK-NEXT: csel w9, w1, w0, ls
430- ; CHECK-NEXT: sub w0, w9, w8
426+ ; CHECK-NEXT: sub w8, w8, w1, uxth
427+ ; CHECK-NEXT: cmp w8, #0
428+ ; CHECK-NEXT: cneg w0, w8, mi
431429; CHECK-NEXT: ret
432430 %cmp = icmp ule i16 %a , %b
433431 %ab = select i1 %cmp , i16 %a , i16 %b
@@ -439,10 +437,9 @@ define i16 @abd_select_i16(i16 %a, i16 %b) nounwind {
439437define i32 @abd_select_i32 (i32 %a , i32 %b ) nounwind {
440438; CHECK-LABEL: abd_select_i32:
441439; CHECK: // %bb.0:
442- ; CHECK-NEXT: cmp w0, w1
443- ; CHECK-NEXT: csel w8, w0, w1, hi
444- ; CHECK-NEXT: csel w9, w1, w0, hi
445- ; CHECK-NEXT: sub w0, w8, w9
440+ ; CHECK-NEXT: sub w8, w1, w0
441+ ; CHECK-NEXT: subs w9, w0, w1
442+ ; CHECK-NEXT: csel w0, w9, w8, hi
446443; CHECK-NEXT: ret
447444 %cmp = icmp ugt i32 %a , %b
448445 %ab = select i1 %cmp , i32 %a , i32 %b
@@ -454,10 +451,9 @@ define i32 @abd_select_i32(i32 %a, i32 %b) nounwind {
454451define i64 @abd_select_i64 (i64 %a , i64 %b ) nounwind {
455452; CHECK-LABEL: abd_select_i64:
456453; CHECK: // %bb.0:
457- ; CHECK-NEXT: cmp x0, x1
458- ; CHECK-NEXT: csel x8, x0, x1, hs
459- ; CHECK-NEXT: csel x9, x1, x0, hs
460- ; CHECK-NEXT: sub x0, x8, x9
454+ ; CHECK-NEXT: sub x8, x1, x0
455+ ; CHECK-NEXT: subs x9, x0, x1
456+ ; CHECK-NEXT: csel x0, x9, x8, hi
461457; CHECK-NEXT: ret
462458 %cmp = icmp uge i64 %a , %b
463459 %ab = select i1 %cmp , i64 %a , i64 %b
@@ -469,14 +465,14 @@ define i64 @abd_select_i64(i64 %a, i64 %b) nounwind {
469465define i128 @abd_select_i128 (i128 %a , i128 %b ) nounwind {
470466; CHECK-LABEL: abd_select_i128:
471467; CHECK: // %bb.0:
472- ; CHECK-NEXT: cmp x0, x2
473- ; CHECK-NEXT: sbcs xzr , x1, x3
474- ; CHECK-NEXT: csel x8, x0, x2 , lo
475- ; CHECK-NEXT: csel x9, x2, x0, lo
476- ; CHECK-NEXT: csel x10, x1, x3, lo
477- ; CHECK-NEXT: csel x11, x3, x1, lo
478- ; CHECK-NEXT: subs x0, x9, x8
479- ; CHECK-NEXT: sbc x1, x11 , x10
468+ ; CHECK-NEXT: subs x8, x0, x2
469+ ; CHECK-NEXT: sbcs x9 , x1, x3
470+ ; CHECK-NEXT: cset w10 , lo
471+ ; CHECK-NEXT: sbfx x10, x10, #0, #1
472+ ; CHECK-NEXT: eor x8, x8, x10
473+ ; CHECK-NEXT: eor x9, x9, x10
474+ ; CHECK-NEXT: subs x0, x8, x10
475+ ; CHECK-NEXT: sbc x1, x9 , x10
480476; CHECK-NEXT: ret
481477 %cmp = icmp ult i128 %a , %b
482478 %ab = select i1 %cmp , i128 %a , i128 %b
0 commit comments