1*9880d681SAndroid Build Coastguard Worker; Test data prefetching. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.prefetch(i8*, i32, i32, i32) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker@g = global [4096 x i8] zeroinitializer 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; Check that instruction read prefetches are ignored. 10*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8 *%ptr) { 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 12*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r2 13*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 14*9880d681SAndroid Build Coastguard Worker call void @llvm.prefetch(i8 *%ptr, i32 0, i32 0, i32 0) 15*9880d681SAndroid Build Coastguard Worker ret void 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Check that instruction write prefetches are ignored. 19*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8 *%ptr) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r2 22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 23*9880d681SAndroid Build Coastguard Worker call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 0) 24*9880d681SAndroid Build Coastguard Worker ret void 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; Check data read prefetches. 28*9880d681SAndroid Build Coastguard Workerdefine void @f3(i8 *%ptr) { 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 30*9880d681SAndroid Build Coastguard Worker; CHECK: pfd 1, 0(%r2) 31*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 32*9880d681SAndroid Build Coastguard Worker call void @llvm.prefetch(i8 *%ptr, i32 0, i32 0, i32 1) 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; Check data write prefetches. 37*9880d681SAndroid Build Coastguard Workerdefine void @f4(i8 *%ptr) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 39*9880d681SAndroid Build Coastguard Worker; CHECK: pfd 2, 0(%r2) 40*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 41*9880d681SAndroid Build Coastguard Worker call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1) 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; Check an address at the negative end of the range. 46*9880d681SAndroid Build Coastguard Workerdefine void @f5(i8 *%base, i64 %index) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 48*9880d681SAndroid Build Coastguard Worker; CHECK: pfd 2, -524288({{%r2,%r3|%r3,%r2}}) 49*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 50*9880d681SAndroid Build Coastguard Worker %add = add i64 %index, -524288 51*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i8, i8 *%base, i64 %add 52*9880d681SAndroid Build Coastguard Worker call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1) 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; Check an address at the positive end of the range. 57*9880d681SAndroid Build Coastguard Workerdefine void @f6(i8 *%base, i64 %index) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 59*9880d681SAndroid Build Coastguard Worker; CHECK: pfd 2, 524287({{%r2,%r3|%r3,%r2}}) 60*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 61*9880d681SAndroid Build Coastguard Worker %add = add i64 %index, 524287 62*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i8, i8 *%base, i64 %add 63*9880d681SAndroid Build Coastguard Worker call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1) 64*9880d681SAndroid Build Coastguard Worker ret void 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; Check that the next address up still compiles. 68*9880d681SAndroid Build Coastguard Workerdefine void @f7(i8 *%base, i64 %index) { 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 70*9880d681SAndroid Build Coastguard Worker; CHECK: 524288 71*9880d681SAndroid Build Coastguard Worker; CHECK: pfd 2, 72*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 73*9880d681SAndroid Build Coastguard Worker %add = add i64 %index, 524288 74*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i8, i8 *%base, i64 %add 75*9880d681SAndroid Build Coastguard Worker call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1) 76*9880d681SAndroid Build Coastguard Worker ret void 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker; Check pc-relative prefetches. 80*9880d681SAndroid Build Coastguard Workerdefine void @f8() { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 82*9880d681SAndroid Build Coastguard Worker; CHECK: pfdrl 2, g 83*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 84*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr [4096 x i8], [4096 x i8] *@g, i64 0, i64 0 85*9880d681SAndroid Build Coastguard Worker call void @llvm.prefetch(i8 *%ptr, i32 1, i32 0, i32 1) 86*9880d681SAndroid Build Coastguard Worker ret void 87*9880d681SAndroid Build Coastguard Worker} 88