1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple aarch64-unknown-linux-gnu < %s | FileCheck %s 3 4; SABA from ADD(ABS(SUB NSW)) 5 6define <4 x i32> @saba_abs_4s(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) #0 { 7; CHECK-LABEL: saba_abs_4s: 8; CHECK: // %bb.0: 9; CHECK-NEXT: saba v0.4s, v1.4s, v2.4s 10; CHECK-NEXT: ret 11 %sub = sub nsw <4 x i32> %b, %c 12 %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true) 13 %add = add <4 x i32> %a, %abs 14 ret <4 x i32> %add 15} 16 17define <2 x i32> @saba_abs_2s(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c) #0 { 18; CHECK-LABEL: saba_abs_2s: 19; CHECK: // %bb.0: 20; CHECK-NEXT: saba v0.2s, v1.2s, v2.2s 21; CHECK-NEXT: ret 22 %sub = sub nsw <2 x i32> %b, %c 23 %abs = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %sub, i1 true) 24 %add = add <2 x i32> %a, %abs 25 ret <2 x i32> %add 26} 27 28define <8 x i16> @saba_abs_8h(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) #0 { 29; CHECK-LABEL: saba_abs_8h: 30; CHECK: // %bb.0: 31; CHECK-NEXT: saba v0.8h, v1.8h, v2.8h 32; CHECK-NEXT: ret 33 %sub = sub nsw <8 x i16> %b, %c 34 %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 true) 35 %add = add <8 x i16> %a, %abs 36 ret <8 x i16> %add 37} 38 39define <4 x i16> @saba_abs_4h(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 { 40; CHECK-LABEL: saba_abs_4h: 41; CHECK: // %bb.0: 42; CHECK-NEXT: saba v0.4h, v1.4h, v2.4h 43; CHECK-NEXT: ret 44 %sub = sub nsw <4 x i16> %b, %c 45 %abs = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %sub, i1 true) 46 %add = add <4 x i16> %a, %abs 47 ret <4 x i16> %add 48} 49 50define <16 x i8> @saba_abs_16b(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #0 { 51; CHECK-LABEL: saba_abs_16b: 52; CHECK: // %bb.0: 53; CHECK-NEXT: saba v0.16b, v1.16b, v2.16b 54; CHECK-NEXT: ret 55 %sub = sub nsw <16 x i8> %b, %c 56 %abs = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %sub, i1 true) 57 %add = add <16 x i8> %a, %abs 58 ret <16 x i8> %add 59} 60 61define <8 x i8> @saba_abs_8b(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 { 62; CHECK-LABEL: saba_abs_8b: 63; CHECK: // %bb.0: 64; CHECK-NEXT: saba v0.8b, v1.8b, v2.8b 65; CHECK-NEXT: ret 66 %sub = sub nsw <8 x i8> %b, %c 67 %abs = call <8 x i8> @llvm.abs.v8i8(<8 x i8> %sub, i1 true) 68 %add = add <8 x i8> %a, %abs 69 ret <8 x i8> %add 70} 71 72; SABA from ADD(SABD) 73 74define <4 x i32> @saba_sabd_4s(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) #0 { 75; CHECK-LABEL: saba_sabd_4s: 76; CHECK: // %bb.0: 77; CHECK-NEXT: saba v0.4s, v1.4s, v2.4s 78; CHECK-NEXT: ret 79 %sabd = call <4 x i32> @llvm.aarch64.neon.sabd.v4i32(<4 x i32> %b, <4 x i32> %c) 80 %add = add <4 x i32> %sabd, %a 81 ret <4 x i32> %add 82} 83 84define <2 x i32> @saba_sabd_2s(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c) #0 { 85; CHECK-LABEL: saba_sabd_2s: 86; CHECK: // %bb.0: 87; CHECK-NEXT: saba v0.2s, v1.2s, v2.2s 88; CHECK-NEXT: ret 89 %sabd = call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> %b, <2 x i32> %c) 90 %add = add <2 x i32> %sabd, %a 91 ret <2 x i32> %add 92} 93 94define <8 x i16> @saba_sabd_8h(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) #0 { 95; CHECK-LABEL: saba_sabd_8h: 96; CHECK: // %bb.0: 97; CHECK-NEXT: saba v0.8h, v1.8h, v2.8h 98; CHECK-NEXT: ret 99 %sabd = call <8 x i16> @llvm.aarch64.neon.sabd.v8i16(<8 x i16> %b, <8 x i16> %c) 100 %add = add <8 x i16> %sabd, %a 101 ret <8 x i16> %add 102} 103 104define <4 x i16> @saba_sabd_4h(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 { 105; CHECK-LABEL: saba_sabd_4h: 106; CHECK: // %bb.0: 107; CHECK-NEXT: saba v0.4h, v1.4h, v2.4h 108; CHECK-NEXT: ret 109 %sabd = call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> %b, <4 x i16> %c) 110 %add = add <4 x i16> %sabd, %a 111 ret <4 x i16> %add 112} 113 114define <16 x i8> @saba_sabd_16b(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #0 { 115; CHECK-LABEL: saba_sabd_16b: 116; CHECK: // %bb.0: 117; CHECK-NEXT: saba v0.16b, v1.16b, v2.16b 118; CHECK-NEXT: ret 119 %sabd = call <16 x i8> @llvm.aarch64.neon.sabd.v16i8(<16 x i8> %b, <16 x i8> %c) 120 %add = add <16 x i8> %sabd, %a 121 ret <16 x i8> %add 122} 123 124define <8 x i8> @saba_sabd_8b(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 { 125; CHECK-LABEL: saba_sabd_8b: 126; CHECK: // %bb.0: 127; CHECK-NEXT: saba v0.8b, v1.8b, v2.8b 128; CHECK-NEXT: ret 129 %sabd = call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %b, <8 x i8> %c) 130 %add = add <8 x i8> %sabd, %a 131 ret <8 x i8> %add 132} 133 134declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1) 135declare <2 x i32> @llvm.abs.v2i32(<2 x i32>, i1) 136declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1) 137declare <4 x i16> @llvm.abs.v4i16(<4 x i16>, i1) 138declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1) 139declare <8 x i8> @llvm.abs.v8i8(<8 x i8>, i1) 140 141declare <4 x i32> @llvm.aarch64.neon.sabd.v4i32(<4 x i32>, <4 x i32>) 142declare <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32>, <2 x i32>) 143declare <8 x i16> @llvm.aarch64.neon.sabd.v8i16(<8 x i16>, <8 x i16>) 144declare <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16>, <4 x i16>) 145declare <16 x i8> @llvm.aarch64.neon.sabd.v16i8(<16 x i8>, <16 x i8>) 146declare <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8>, <8 x i8>) 147