brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · a882ce1 Raw
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