brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 7f3f637 Raw
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