brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · f86b77c Raw
160 lines · plain
1; Test LOCFH.  See comments in asm-18.ll about testing high-word operations.2;3; RUN: llc < %s -verify-machineinstrs -mtriple=s390x-linux-gnu -mcpu=z13 \4; RUN:   -no-integrated-as | FileCheck -allow-deprecated-dag-overlap %s5 6declare void @foo(ptr)7 8; Test the simple case.9define void @f1(ptr %ptr, i32 %limit) {10; CHECK-LABEL: f1:11; CHECK-DAG: stepa [[REG:%r[0-5]]]12; CHECK-DAG: clfi %r3, 4213; CHECK: locfhhe [[REG]], 0(%r2)14; CHECK: br %r1415  %easy = call i32 asm "stepa $0", "=h"()16  %cond = icmp ult i32 %limit, 4217  %other = load i32, ptr %ptr18  %res = select i1 %cond, i32 %easy, i32 %other19  call void asm sideeffect "stepb $0", "h"(i32 %res)20  ret void21}22 23; ...and again with the operands swapped.24define void @f2(ptr %ptr, i32 %limit) {25; CHECK-LABEL: f2:26; CHECK-DAG: stepa [[REG:%r[0-5]]]27; CHECK-DAG: clfi %r3, 4228; CHECK: locfhl [[REG]], 0(%r2)29; CHECK: br %r1430  %easy = call i32 asm "stepa $0", "=h"()31  %cond = icmp ult i32 %limit, 4232  %other = load i32, ptr %ptr33  %res = select i1 %cond, i32 %other, i32 %easy34  call void asm sideeffect "stepb $0", "h"(i32 %res)35  ret void36}37 38; Check the high end of the aligned LOC range.39define void @f3(ptr %base, i32 %limit) {40; CHECK-LABEL: f3:41; CHECK-DAG: stepa [[REG:%r[0-5]]]42; CHECK-DAG: clfi %r3, 4243; CHECK: locfhhe [[REG]], 524284(%r2)44; CHECK: br %r1445  %easy = call i32 asm "stepa $0", "=h"()46  %ptr = getelementptr i32, ptr %base, i64 13107147  %cond = icmp ult i32 %limit, 4248  %other = load i32, ptr %ptr49  %res = select i1 %cond, i32 %easy, i32 %other50  call void asm sideeffect "stepb $0", "h"(i32 %res)51  ret void52}53 54; Check the next word up.  Other sequences besides this one would be OK.55define void @f4(ptr %base, i32 %limit) {56; CHECK-LABEL: f4:57; CHECK-DAG: stepa [[REG:%r[0-5]]]58; CHECK-DAG: agfi %r2, 52428859; CHECK-DAG: clfi %r3, 4260; CHECK: locfhhe [[REG]], 0(%r2)61; CHECK: br %r1462  %easy = call i32 asm "stepa $0", "=h"()63  %ptr = getelementptr i32, ptr %base, i64 13107264  %cond = icmp ult i32 %limit, 4265  %other = load i32, ptr %ptr66  %res = select i1 %cond, i32 %easy, i32 %other67  call void asm sideeffect "stepb $0", "h"(i32 %res)68  ret void69}70 71; Check the low end of the LOC range.72define void @f5(ptr %base, i32 %limit) {73; CHECK-LABEL: f5:74; CHECK-DAG: stepa [[REG:%r[0-5]]]75; CHECK-DAG: clfi %r3, 4276; CHECK: locfhhe [[REG]], -524288(%r2)77; CHECK: br %r1478  %easy = call i32 asm "stepa $0", "=h"()79  %ptr = getelementptr i32, ptr %base, i64 -13107280  %cond = icmp ult i32 %limit, 4281  %other = load i32, ptr %ptr82  %res = select i1 %cond, i32 %easy, i32 %other83  call void asm sideeffect "stepb $0", "h"(i32 %res)84  ret void85}86 87; Check the next word down, with the same comments as f4.88define void @f6(ptr %base, i32 %limit) {89; CHECK-LABEL: f6:90; CHECK-DAG: stepa [[REG:%r[0-5]]]91; CHECK-DAG: clfi %r3, 4292; CHECK-DAG: agfi %r2, -52429293; CHECK-DAG: clfi %r3, 4294; CHECK: locfhhe [[REG]], 0(%r2)95; CHECK: br %r1496  %easy = call i32 asm "stepa $0", "=h"()97  %ptr = getelementptr i32, ptr %base, i64 -13107398  %cond = icmp ult i32 %limit, 4299  %other = load i32, ptr %ptr100  %res = select i1 %cond, i32 %easy, i32 %other101  call void asm sideeffect "stepb $0", "h"(i32 %res)102  ret void103}104 105; Try a frame index base.106define void @f7(i32 %alt, i32 %limit) {107; CHECK-LABEL: f7:108; CHECK: brasl %r14, foo@PLT109; CHECK: stepa [[REG:%r[0-5]]]110; CHECK: locfhhe [[REG]], {{[0-9]+}}(%r15)111; CHECK: br %r14112  %ptr = alloca i32113  call void @foo(ptr %ptr)114  %easy = call i32 asm "stepa $0", "=h"()115  %cond = icmp ult i32 %limit, 42116  %other = load i32, ptr %ptr117  %res = select i1 %cond, i32 %easy, i32 %other118  call void asm sideeffect "stepb $0", "h"(i32 %res)119  ret void120}121 122; Try a case when an index is involved.123define void @f8(i32 %limit, i64 %base, i64 %index) {124; CHECK-LABEL: f8:125; CHECK-DAG: stepa [[REG:%r[0-5]]]126; CHECK-DAG: clfi %r2, 42127; CHECK: locfhhe [[REG]], 0({{%r[1-5]}})128; CHECK: br %r14129  %easy = call i32 asm "stepa $0", "=h"()130  %add = add i64 %base, %index131  %ptr = inttoptr i64 %add to ptr132  %cond = icmp ult i32 %limit, 42133  %other = load i32, ptr %ptr134  %res = select i1 %cond, i32 %easy, i32 %other135  call void asm sideeffect "stepb $0", "h"(i32 %res)136  ret void137}138 139; Test that conditionally-executed loads do not use LOC, since it is allowed140; to trap even when the condition is false.141define void @f9(i32 %limit, ptr %ptr) {142; CHECK-LABEL: f9:143; CHECK-NOT: loc144; CHECK: lfh145; CHECK: br %r14146entry:147  %easy = call i32 asm "stepa $0", "=h"()148  %cmp = icmp ule i32 %easy, %limit149  br i1 %cmp, label %load, label %exit150 151load:152  %other = load i32, ptr %ptr153  br label %exit154 155exit:156  %res = phi i32 [ %easy, %entry ], [ %other, %load ]157  call void asm sideeffect "stepb $0", "h"(i32 %res)158  ret void159}160