140 lines · plain
1; Test 32-bit unsigned comparisons between memory and a constant.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Check ordered comparisons with a constant near the low end of the unsigned6; 16-bit range.7define double @f1(double %a, double %b, ptr %ptr) {8; CHECK-LABEL: f1:9; CHECK: clfhsi 0(%r2), 110; CHECK-NEXT: bhr %r1411; CHECK: ldr %f0, %f212; CHECK: br %r1413 %val = load i32, ptr %ptr14 %cond = icmp ugt i32 %val, 115 %res = select i1 %cond, double %a, double %b16 ret double %res17}18 19; Check ordered comparisons with the high end of the unsigned 16-bit range.20define double @f2(double %a, double %b, ptr %ptr) {21; CHECK-LABEL: f2:22; CHECK: clfhsi 0(%r2), 6553523; CHECK-NEXT: blr %r1424; CHECK: ldr %f0, %f225; CHECK: br %r1426 %val = load i32, ptr %ptr27 %cond = icmp ult i32 %val, 6553528 %res = select i1 %cond, double %a, double %b29 ret double %res30}31 32; Check the next value up, which can't use CLFHSI.33define double @f3(double %a, double %b, ptr %ptr) {34; CHECK-LABEL: f3:35; CHECK-NOT: clfhsi36; CHECK: br %r1437 %val = load i32, ptr %ptr38 %cond = icmp ult i32 %val, 6553639 %res = select i1 %cond, double %a, double %b40 ret double %res41}42 43; Check equality comparisons with 32768, the lowest value for which44; we prefer CLFHSI to CHSI.45define double @f4(double %a, double %b, ptr %ptr) {46; CHECK-LABEL: f4:47; CHECK: clfhsi 0(%r2), 3276848; CHECK-NEXT: ber %r1449; CHECK: ldr %f0, %f250; CHECK: br %r1451 %val = load i32, ptr %ptr52 %cond = icmp eq i32 %val, 3276853 %res = select i1 %cond, double %a, double %b54 ret double %res55}56 57; Check equality comparisons with the high end of the unsigned 16-bit range.58define double @f5(double %a, double %b, ptr %ptr) {59; CHECK-LABEL: f5:60; CHECK: clfhsi 0(%r2), 6553561; CHECK-NEXT: ber %r1462; CHECK: ldr %f0, %f263; CHECK: br %r1464 %val = load i32, ptr %ptr65 %cond = icmp eq i32 %val, 6553566 %res = select i1 %cond, double %a, double %b67 ret double %res68}69 70; Check the next value up, which can't use CLFHSI.71define double @f6(double %a, double %b, ptr %ptr) {72; CHECK-LABEL: f6:73; CHECK-NOT: clfhsi74; CHECK: br %r1475 %val = load i32, ptr %ptr76 %cond = icmp eq i32 %val, 6553677 %res = select i1 %cond, double %a, double %b78 ret double %res79}80 81; Check the high end of the CLFHSI range.82define double @f7(double %a, double %b, i32 %i1, ptr %base) {83; CHECK-LABEL: f7:84; CHECK: clfhsi 4092(%r3), 185; CHECK-NEXT: bhr %r1486; CHECK: ldr %f0, %f287; CHECK: br %r1488 %ptr = getelementptr i32, ptr %base, i64 102389 %val = load i32, ptr %ptr90 %cond = icmp ugt i32 %val, 191 %res = select i1 %cond, double %a, double %b92 ret double %res93}94 95; Check the next word up, which needs separate address logic,96define double @f8(double %a, double %b, ptr %base) {97; CHECK-LABEL: f8:98; CHECK: aghi %r2, 409699; CHECK: clfhsi 0(%r2), 1100; CHECK-NEXT: bhr %r14101; CHECK: ldr %f0, %f2102; CHECK: br %r14103 %ptr = getelementptr i32, ptr %base, i64 1024104 %val = load i32, ptr %ptr105 %cond = icmp ugt i32 %val, 1106 %res = select i1 %cond, double %a, double %b107 ret double %res108}109 110; Check negative offsets, which also need separate address logic.111define double @f9(double %a, double %b, ptr %base) {112; CHECK-LABEL: f9:113; CHECK: aghi %r2, -4114; CHECK: clfhsi 0(%r2), 1115; CHECK-NEXT: bhr %r14116; CHECK: ldr %f0, %f2117; CHECK: br %r14118 %ptr = getelementptr i32, ptr %base, i64 -1119 %val = load i32, ptr %ptr120 %cond = icmp ugt i32 %val, 1121 %res = select i1 %cond, double %a, double %b122 ret double %res123}124 125; Check that CLFHSI does not allow indices.126define double @f10(double %a, double %b, i64 %base, i64 %index) {127; CHECK-LABEL: f10:128; CHECK: agr {{%r2, %r3|%r3, %r2}}129; CHECK: clfhsi 0({{%r[23]}}), 1130; CHECK-NEXT: bhr %r14131; CHECK: ldr %f0, %f2132; CHECK: br %r14133 %add = add i64 %base, %index134 %ptr = inttoptr i64 %add to ptr135 %val = load i32, ptr %ptr136 %cond = icmp ugt i32 %val, 1137 %res = select i1 %cond, double %a, double %b138 ret double %res139}140