238 lines · plain
1; Test 64-bit signed comparisons between memory and a constant.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Check ordered comparisons with 0.6define double @f1(double %a, double %b, ptr %ptr) {7; CHECK-LABEL: f1:8; CHECK: cghsi 0(%r2), 09; CHECK-NEXT: blr %r1410; CHECK: ldr %f0, %f211; CHECK: br %r1412 %val = load i64, ptr %ptr13 %cond = icmp slt i64 %val, 014 %res = select i1 %cond, double %a, double %b15 ret double %res16}17 18; Check ordered comparisons with 1.19define double @f2(double %a, double %b, ptr %ptr) {20; CHECK-LABEL: f2:21; CHECK: cghsi 0(%r2), 022; CHECK-NEXT: bler %r1423; CHECK: ldr %f0, %f224; CHECK: br %r1425 %val = load i64, ptr %ptr26 %cond = icmp slt i64 %val, 127 %res = select i1 %cond, double %a, double %b28 ret double %res29}30 31; Check ordered comparisons with the high end of the signed 16-bit range.32define double @f3(double %a, double %b, ptr %ptr) {33; CHECK-LABEL: f3:34; CHECK: cghsi 0(%r2), 3276735; CHECK-NEXT: blr %r1436; CHECK: ldr %f0, %f237; CHECK: br %r1438 %val = load i64, ptr %ptr39 %cond = icmp slt i64 %val, 3276740 %res = select i1 %cond, double %a, double %b41 ret double %res42}43 44; Check the next value up, which can't use CGHSI.45define double @f4(double %a, double %b, ptr %ptr) {46; CHECK-LABEL: f4:47; CHECK-NOT: cghsi48; CHECK: br %r1449 %val = load i64, ptr %ptr50 %cond = icmp slt i64 %val, 3276851 %res = select i1 %cond, double %a, double %b52 ret double %res53}54 55; Check ordered comparisons with -1.56define double @f5(double %a, double %b, ptr %ptr) {57; CHECK-LABEL: f5:58; CHECK: cghsi 0(%r2), -159; CHECK-NEXT: blr %r1460; CHECK: ldr %f0, %f261; CHECK: br %r1462 %val = load i64, ptr %ptr63 %cond = icmp slt i64 %val, -164 %res = select i1 %cond, double %a, double %b65 ret double %res66}67 68; Check ordered comparisons with the low end of the 16-bit signed range.69define double @f6(double %a, double %b, ptr %ptr) {70; CHECK-LABEL: f6:71; CHECK: cghsi 0(%r2), -3276872; CHECK-NEXT: blr %r1473; CHECK: ldr %f0, %f274; CHECK: br %r1475 %val = load i64, ptr %ptr76 %cond = icmp slt i64 %val, -3276877 %res = select i1 %cond, double %a, double %b78 ret double %res79}80 81; Check the next value down, which should be treated as a positive value.82define double @f7(double %a, double %b, ptr %ptr) {83; CHECK-LABEL: f7:84; CHECK-NOT: cghsi85; CHECK: br %r1486 %val = load i64, ptr %ptr87 %cond = icmp slt i64 %val, -3276988 %res = select i1 %cond, double %a, double %b89 ret double %res90}91 92; Check equality comparisons with 0.93define double @f8(double %a, double %b, ptr %ptr) {94; CHECK-LABEL: f8:95; CHECK: cghsi 0(%r2), 096; CHECK-NEXT: ber %r1497; CHECK: ldr %f0, %f298; CHECK: br %r1499 %val = load i64, ptr %ptr100 %cond = icmp eq i64 %val, 0101 %res = select i1 %cond, double %a, double %b102 ret double %res103}104 105; Check equality comparisons with 1.106define double @f9(double %a, double %b, ptr %ptr) {107; CHECK-LABEL: f9:108; CHECK: cghsi 0(%r2), 1109; CHECK-NEXT: ber %r14110; CHECK: ldr %f0, %f2111; CHECK: br %r14112 %val = load i64, ptr %ptr113 %cond = icmp eq i64 %val, 1114 %res = select i1 %cond, double %a, double %b115 ret double %res116}117 118; Check equality comparisons with the high end of the signed 16-bit range.119define double @f10(double %a, double %b, ptr %ptr) {120; CHECK-LABEL: f10:121; CHECK: cghsi 0(%r2), 32767122; CHECK-NEXT: ber %r14123; CHECK: ldr %f0, %f2124; CHECK: br %r14125 %val = load i64, ptr %ptr126 %cond = icmp eq i64 %val, 32767127 %res = select i1 %cond, double %a, double %b128 ret double %res129}130 131; Check the next value up, which can't use CGHSI.132define double @f11(double %a, double %b, ptr %ptr) {133; CHECK-LABEL: f11:134; CHECK-NOT: cghsi135; CHECK: br %r14136 %val = load i64, ptr %ptr137 %cond = icmp eq i64 %val, 32768138 %res = select i1 %cond, double %a, double %b139 ret double %res140}141 142; Check equality comparisons with -1.143define double @f12(double %a, double %b, ptr %ptr) {144; CHECK-LABEL: f12:145; CHECK: cghsi 0(%r2), -1146; CHECK-NEXT: ber %r14147; CHECK: ldr %f0, %f2148; CHECK: br %r14149 %val = load i64, ptr %ptr150 %cond = icmp eq i64 %val, -1151 %res = select i1 %cond, double %a, double %b152 ret double %res153}154 155; Check equality comparisons with the low end of the 16-bit signed range.156define double @f13(double %a, double %b, ptr %ptr) {157; CHECK-LABEL: f13:158; CHECK: cghsi 0(%r2), -32768159; CHECK-NEXT: ber %r14160; CHECK: ldr %f0, %f2161; CHECK: br %r14162 %val = load i64, ptr %ptr163 %cond = icmp eq i64 %val, -32768164 %res = select i1 %cond, double %a, double %b165 ret double %res166}167 168; Check the next value down, which should be treated as a positive value.169define double @f14(double %a, double %b, ptr %ptr) {170; CHECK-LABEL: f14:171; CHECK-NOT: cghsi172; CHECK: br %r14173 %val = load i64, ptr %ptr174 %cond = icmp eq i64 %val, -32769175 %res = select i1 %cond, double %a, double %b176 ret double %res177}178 179; Check the high end of the CGHSI range.180define double @f15(double %a, double %b, i64 %i1, ptr %base) {181; CHECK-LABEL: f15:182; CHECK: cghsi 4088(%r3), 0183; CHECK-NEXT: blr %r14184; CHECK: ldr %f0, %f2185; CHECK: br %r14186 %ptr = getelementptr i64, ptr %base, i64 511187 %val = load i64, ptr %ptr188 %cond = icmp slt i64 %val, 0189 %res = select i1 %cond, double %a, double %b190 ret double %res191}192 193; Check the next doubleword up, which needs separate address logic,194define double @f16(double %a, double %b, ptr %base) {195; CHECK-LABEL: f16:196; CHECK: aghi %r2, 4096197; CHECK: cghsi 0(%r2), 0198; CHECK-NEXT: blr %r14199; CHECK: ldr %f0, %f2200; CHECK: br %r14201 %ptr = getelementptr i64, ptr %base, i64 512202 %val = load i64, ptr %ptr203 %cond = icmp slt i64 %val, 0204 %res = select i1 %cond, double %a, double %b205 ret double %res206}207 208; Check negative offsets, which also need separate address logic.209define double @f17(double %a, double %b, ptr %base) {210; CHECK-LABEL: f17:211; CHECK: aghi %r2, -8212; CHECK: cghsi 0(%r2), 0213; CHECK-NEXT: blr %r14214; CHECK: ldr %f0, %f2215; CHECK: br %r14216 %ptr = getelementptr i64, ptr %base, i64 -1217 %val = load i64, ptr %ptr218 %cond = icmp slt i64 %val, 0219 %res = select i1 %cond, double %a, double %b220 ret double %res221}222 223; Check that CGHSI does not allow indices.224define double @f18(double %a, double %b, i64 %base, i64 %index) {225; CHECK-LABEL: f18:226; CHECK: agr {{%r2, %r3|%r3, %r2}}227; CHECK: cghsi 0({{%r[23]}}), 0228; CHECK-NEXT: blr %r14229; CHECK: ldr %f0, %f2230; CHECK: br %r14231 %add = add i64 %base, %index232 %ptr = inttoptr i64 %add to ptr233 %val = load i64, ptr %ptr234 %cond = icmp slt i64 %val, 0235 %res = select i1 %cond, double %a, double %b236 ret double %res237}238