245 lines · plain
1; Test the use of TM and TMY.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s4 5@g = global i32 06 7; Check a simple branching use of TM.8define void @f1(ptr %src) {9; CHECK-LABEL: f1:10; CHECK: tm 0(%r2), 111; CHECK: ber %r1412; CHECK: br %r1413entry:14 %byte = load i8, ptr %src15 %and = and i8 %byte, 116 %cmp = icmp eq i8 %and, 017 br i1 %cmp, label %exit, label %store18 19store:20 store i32 1, ptr@g21 br label %exit22 23exit:24 ret void25}26 27 28; Check that we do not fold across an aliasing store.29define void @f2(ptr %src) {30; CHECK-LABEL: f2:31; CHECK: tm 0(%r2), 132; CHECK: mvi 0(%r2), 033; CHECK: ber %r1434; CHECK: br %r1435entry:36 %byte = load i8, ptr %src37 store i8 0, ptr %src38 %and = and i8 %byte, 139 %cmp = icmp eq i8 %and, 040 br i1 %cmp, label %exit, label %store41 42store:43 store i32 1, ptr@g44 br label %exit45 46exit:47 ret void48}49 50; Check a simple select-based use of TM.51define double @f3(ptr %src, double %a, double %b) {52; CHECK-LABEL: f3:53; CHECK: tm 0(%r2), 154; CHECK: je {{\.L.*}}55; CHECK: br %r1456 %byte = load i8, ptr %src57 %and = and i8 %byte, 158 %cmp = icmp eq i8 %and, 059 %res = select i1 %cmp, double %b, double %a60 ret double %res61}62 63; Check that we do not fold across an aliasing store.64define double @f4(ptr %src, double %a, double %b) {65; CHECK-LABEL: f4:66; CHECK: tm 0(%r2), 167; CHECK: je {{\.L.*}}68; CHECK: mvi 0(%r2), 069; CHECK: br %r1470 %byte = load i8, ptr %src71 %and = and i8 %byte, 172 %cmp = icmp eq i8 %and, 073 %res = select i1 %cmp, double %b, double %a74 store i8 0, ptr %src75 ret double %res76}77 78; Check an inequality check.79define double @f5(ptr %src, double %a, double %b) {80; CHECK-LABEL: f5:81; CHECK: tm 0(%r2), 182; CHECK: jne {{\.L.*}}83; CHECK: br %r1484 %byte = load i8, ptr %src85 %and = and i8 %byte, 186 %cmp = icmp ne i8 %and, 087 %res = select i1 %cmp, double %b, double %a88 ret double %res89}90 91; Check that we can also use TM for equality comparisons with the mask.92define double @f6(ptr %src, double %a, double %b) {93; CHECK-LABEL: f6:94; CHECK: tm 0(%r2), 25495; CHECK: jo {{\.L.*}}96; CHECK: br %r1497 %byte = load i8, ptr %src98 %and = and i8 %byte, 25499 %cmp = icmp eq i8 %and, 254100 %res = select i1 %cmp, double %b, double %a101 ret double %res102}103 104; Check inequality comparisons with the mask.105define double @f7(ptr %src, double %a, double %b) {106; CHECK-LABEL: f7:107; CHECK: tm 0(%r2), 254108; CHECK: jno {{\.L.*}}109; CHECK: br %r14110 %byte = load i8, ptr %src111 %and = and i8 %byte, 254112 %cmp = icmp ne i8 %and, 254113 %res = select i1 %cmp, double %b, double %a114 ret double %res115}116 117; Check that we do not use the memory TM instruction when CC is being tested118; for 2.119define double @f8(ptr %src, double %a, double %b) {120; CHECK-LABEL: f8:121; CHECK: llc [[REG:%r[0-5]]], 0(%r2)122; CHECK: tmll [[REG]], 3123; CHECK: jh {{\.L.*}}124; CHECK: br %r14125 %byte = load i8, ptr %src126 %and = and i8 %byte, 3127 %cmp = icmp eq i8 %and, 2128 %res = select i1 %cmp, double %b, double %a129 ret double %res130}131 132; ...likewise 1.133define double @f9(ptr %src, double %a, double %b) {134; CHECK-LABEL: f9:135; CHECK: llc [[REG:%r[0-5]]], 0(%r2)136; CHECK: tmll [[REG]], 3137; CHECK: jl {{\.L.*}}138; CHECK: br %r14139 %byte = load i8, ptr %src140 %and = and i8 %byte, 3141 %cmp = icmp eq i8 %and, 1142 %res = select i1 %cmp, double %b, double %a143 ret double %res144}145 146; Check the high end of the TM range.147define double @f10(ptr %src, double %a, double %b) {148; CHECK-LABEL: f10:149; CHECK: tm 4095(%r2), 1150; CHECK: je {{\.L.*}}151; CHECK: br %r14152 %ptr = getelementptr i8, ptr %src, i64 4095153 %byte = load i8, ptr %ptr154 %and = and i8 %byte, 1155 %cmp = icmp eq i8 %and, 0156 %res = select i1 %cmp, double %b, double %a157 ret double %res158}159 160; Check the low end of the positive TMY range.161define double @f11(ptr %src, double %a, double %b) {162; CHECK-LABEL: f11:163; CHECK: tmy 4096(%r2), 1164; CHECK: je {{\.L.*}}165; CHECK: br %r14166 %ptr = getelementptr i8, ptr %src, i64 4096167 %byte = load i8, ptr %ptr168 %and = and i8 %byte, 1169 %cmp = icmp eq i8 %and, 0170 %res = select i1 %cmp, double %b, double %a171 ret double %res172}173 174; Check the high end of the TMY range.175define double @f12(ptr %src, double %a, double %b) {176; CHECK-LABEL: f12:177; CHECK: tmy 524287(%r2), 1178; CHECK: je {{\.L.*}}179; CHECK: br %r14180 %ptr = getelementptr i8, ptr %src, i64 524287181 %byte = load i8, ptr %ptr182 %and = and i8 %byte, 1183 %cmp = icmp eq i8 %and, 0184 %res = select i1 %cmp, double %b, double %a185 ret double %res186}187 188; Check the next byte up, which needs separate address logic.189define double @f13(ptr %src, double %a, double %b) {190; CHECK-LABEL: f13:191; CHECK: agfi %r2, 524288192; CHECK: tm 0(%r2), 1193; CHECK: je {{\.L.*}}194; CHECK: br %r14195 %ptr = getelementptr i8, ptr %src, i64 524288196 %byte = load i8, ptr %ptr197 %and = and i8 %byte, 1198 %cmp = icmp eq i8 %and, 0199 %res = select i1 %cmp, double %b, double %a200 ret double %res201}202 203; Check the low end of the TMY range.204define double @f14(ptr %src, double %a, double %b) {205; CHECK-LABEL: f14:206; CHECK: tmy -524288(%r2), 1207; CHECK: je {{\.L.*}}208; CHECK: br %r14209 %ptr = getelementptr i8, ptr %src, i64 -524288210 %byte = load i8, ptr %ptr211 %and = and i8 %byte, 1212 %cmp = icmp eq i8 %and, 0213 %res = select i1 %cmp, double %b, double %a214 ret double %res215}216 217; Check the next byte down, which needs separate address logic.218define double @f15(ptr %src, double %a, double %b) {219; CHECK-LABEL: f15:220; CHECK: agfi %r2, -524289221; CHECK: tm 0(%r2), 1222; CHECK: je {{\.L.*}}223; CHECK: br %r14224 %ptr = getelementptr i8, ptr %src, i64 -524289225 %byte = load i8, ptr %ptr226 %and = and i8 %byte, 1227 %cmp = icmp eq i8 %and, 0228 %res = select i1 %cmp, double %b, double %a229 ret double %res230}231 232; Check that TM(Y) does not allow an index233define double @f16(ptr %src, i64 %index, double %a, double %b) {234; CHECK-LABEL: f16:235; CHECK: tm 0({{%r[1-5]}}), 1236; CHECK: je {{\.L.*}}237; CHECK: br %r14238 %ptr = getelementptr i8, ptr %src, i64 %index239 %byte = load i8, ptr %ptr240 %and = and i8 %byte, 1241 %cmp = icmp eq i8 %and, 0242 %res = select i1 %cmp, double %b, double %a243 ret double %res244}245