225 lines · plain
1; Test negative integer absolute.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Test i32->i32 negative absolute using slt.6define i32 @f1(i32 %val) {7; CHECK-LABEL: f1:8; CHECK: lnr %r2, %r29; CHECK: br %r1410 %cmp = icmp slt i32 %val, 011 %neg = sub i32 0, %val12 %abs = select i1 %cmp, i32 %neg, i32 %val13 %res = sub i32 0, %abs14 ret i32 %res15}16 17; Test i32->i32 negative absolute using sle.18define i32 @f2(i32 %val) {19; CHECK-LABEL: f2:20; CHECK: lnr %r2, %r221; CHECK: br %r1422 %cmp = icmp sle i32 %val, 023 %neg = sub i32 0, %val24 %abs = select i1 %cmp, i32 %neg, i32 %val25 %res = sub i32 0, %abs26 ret i32 %res27}28 29; Test i32->i32 negative absolute using sgt.30define i32 @f3(i32 %val) {31; CHECK-LABEL: f3:32; CHECK: lnr %r2, %r233; CHECK: br %r1434 %cmp = icmp sgt i32 %val, 035 %neg = sub i32 0, %val36 %abs = select i1 %cmp, i32 %val, i32 %neg37 %res = sub i32 0, %abs38 ret i32 %res39}40 41; Test i32->i32 negative absolute using sge.42define i32 @f4(i32 %val) {43; CHECK-LABEL: f4:44; CHECK: lnr %r2, %r245; CHECK: br %r1446 %cmp = icmp sge i32 %val, 047 %neg = sub i32 0, %val48 %abs = select i1 %cmp, i32 %val, i32 %neg49 %res = sub i32 0, %abs50 ret i32 %res51}52 53; Test i32->i64 negative absolute.54define i64 @f5(i32 %val) {55; CHECK-LABEL: f5:56; CHECK: lngfr %r2, %r257; CHECK: br %r1458 %ext = sext i32 %val to i6459 %cmp = icmp slt i64 %ext, 060 %neg = sub i64 0, %ext61 %abs = select i1 %cmp, i64 %neg, i64 %ext62 %res = sub i64 0, %abs63 ret i64 %res64}65 66; Test i32->i64 negative absolute that uses an "in-register" form of67; sign extension.68define i64 @f6(i64 %val) {69; CHECK-LABEL: f6:70; CHECK: lngfr %r2, %r271; CHECK: br %r1472 %trunc = trunc i64 %val to i3273 %ext = sext i32 %trunc to i6474 %cmp = icmp slt i64 %ext, 075 %neg = sub i64 0, %ext76 %abs = select i1 %cmp, i64 %neg, i64 %ext77 %res = sub i64 0, %abs78 ret i64 %res79}80 81; Test i64 negative absolute.82define i64 @f7(i64 %val) {83; CHECK-LABEL: f7:84; CHECK: lngr %r2, %r285; CHECK: br %r1486 %cmp = icmp slt i64 %val, 087 %neg = sub i64 0, %val88 %abs = select i1 %cmp, i64 %neg, i64 %val89 %res = sub i64 0, %abs90 ret i64 %res91}92 93; Test another form of f6, which is that produced by InstCombine.94define i64 @f8(i64 %val) {95; CHECK-LABEL: f8:96; CHECK: lngfr %r2, %r297; CHECK: br %r1498 %shl = shl i64 %val, 3299 %ashr = ashr i64 %shl, 32100 %neg = sub i64 0, %ashr101 %cmp = icmp slt i64 %shl, 0102 %abs = select i1 %cmp, i64 %neg, i64 %ashr103 %res = sub i64 0, %abs104 ret i64 %res105}106 107; Try again with sle rather than slt.108define i64 @f9(i64 %val) {109; CHECK-LABEL: f9:110; CHECK: lngfr %r2, %r2111; CHECK: br %r14112 %shl = shl i64 %val, 32113 %ashr = ashr i64 %shl, 32114 %neg = sub i64 0, %ashr115 %cmp = icmp sle i64 %shl, 0116 %abs = select i1 %cmp, i64 %neg, i64 %ashr117 %res = sub i64 0, %abs118 ret i64 %res119}120 121; Repeat f8 with the operands reversed.122define i64 @f10(i64 %val) {123; CHECK-LABEL: f10:124; CHECK: lngfr %r2, %r2125; CHECK: br %r14126 %shl = shl i64 %val, 32127 %ashr = ashr i64 %shl, 32128 %neg = sub i64 0, %ashr129 %cmp = icmp sgt i64 %shl, 0130 %abs = select i1 %cmp, i64 %ashr, i64 %neg131 %res = sub i64 0, %abs132 ret i64 %res133}134 135; Try again with sge rather than sgt.136define i64 @f11(i64 %val) {137; CHECK-LABEL: f11:138; CHECK: lngfr %r2, %r2139; CHECK: br %r14140 %shl = shl i64 %val, 32141 %ashr = ashr i64 %shl, 32142 %neg = sub i64 0, %ashr143 %cmp = icmp sge i64 %shl, 0144 %abs = select i1 %cmp, i64 %ashr, i64 %neg145 %res = sub i64 0, %abs146 ret i64 %res147}148 149; Repeat f8 with the negation coming from swapped operands.150define i64 @f12(i64 %val) {151; CHECK-LABEL: f12:152; CHECK: lngfr %r2, %r2153; CHECK: br %r14154 %shl = shl i64 %val, 32155 %ashr = ashr i64 %shl, 32156 %neg = sub i64 0, %ashr157 %cmp = icmp slt i64 %shl, 0158 %negabs = select i1 %cmp, i64 %ashr, i64 %neg159 ret i64 %negabs160}161 162; Likewise f9.163define i64 @f13(i64 %val) {164; CHECK-LABEL: f13:165; CHECK: lngfr %r2, %r2166; CHECK: br %r14167 %shl = shl i64 %val, 32168 %ashr = ashr i64 %shl, 32169 %neg = sub i64 0, %ashr170 %cmp = icmp sle i64 %shl, 0171 %negabs = select i1 %cmp, i64 %ashr, i64 %neg172 ret i64 %negabs173}174 175; Likewise f10.176define i64 @f14(i64 %val) {177; CHECK-LABEL: f14:178; CHECK: lngfr %r2, %r2179; CHECK: br %r14180 %shl = shl i64 %val, 32181 %ashr = ashr i64 %shl, 32182 %neg = sub i64 0, %ashr183 %cmp = icmp sgt i64 %shl, 0184 %negabs = select i1 %cmp, i64 %neg, i64 %ashr185 ret i64 %negabs186}187 188; Likewise f11.189define i64 @f15(i64 %val) {190; CHECK-LABEL: f15:191; CHECK: lngfr %r2, %r2192; CHECK: br %r14193 %shl = shl i64 %val, 32194 %ashr = ashr i64 %shl, 32195 %neg = sub i64 0, %ashr196 %cmp = icmp sge i64 %shl, 0197 %negabs = select i1 %cmp, i64 %neg, i64 %ashr198 ret i64 %negabs199}200 201; Repeat f5 with the comparison on the unextended value.202define i64 @f16(i32 %val) {203; CHECK-LABEL: f16:204; CHECK: lngfr %r2, %r2205; CHECK: br %r14206 %ext = sext i32 %val to i64207 %cmp = icmp slt i32 %val, 0208 %neg = sub i64 0, %ext209 %abs = select i1 %cmp, i64 %neg, i64 %ext210 %res = sub i64 0, %abs211 ret i64 %res212}213 214; And again with the negation coming from swapped operands.215define i64 @f17(i32 %val) {216; CHECK-LABEL: f17:217; CHECK: lngfr %r2, %r2218; CHECK: br %r14219 %ext = sext i32 %val to i64220 %cmp = icmp slt i32 %val, 0221 %neg = sub i64 0, %ext222 %abs = select i1 %cmp, i64 %ext, i64 %neg223 ret i64 %abs224}225