1*9880d681SAndroid Build Coastguard Worker; Test 32-bit floating-point loads for z13. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Test that we use LDE instead of LE - low end of the LE range. 6*9880d681SAndroid Build Coastguard Workerdefine float @f1(float *%src) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: lde %f0, 0(%r2) 9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 10*9880d681SAndroid Build Coastguard Worker %val = load float, float *%src 11*9880d681SAndroid Build Coastguard Worker ret float %val 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; Test that we use LDE instead of LE - high end of the LE range. 15*9880d681SAndroid Build Coastguard Workerdefine float @f2(float *%src) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 17*9880d681SAndroid Build Coastguard Worker; CHECK: lde %f0, 4092(%r2) 18*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 19*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%src, i64 1023 20*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 21*9880d681SAndroid Build Coastguard Worker ret float %val 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; Check the next word up, which should use LEY instead of LDE. 25*9880d681SAndroid Build Coastguard Workerdefine float @f3(float *%src) { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 27*9880d681SAndroid Build Coastguard Worker; CHECK: ley %f0, 4096(%r2) 28*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 29*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%src, i64 1024 30*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 31*9880d681SAndroid Build Coastguard Worker ret float %val 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; Check the high end of the aligned LEY range. 35*9880d681SAndroid Build Coastguard Workerdefine float @f4(float *%src) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 37*9880d681SAndroid Build Coastguard Worker; CHECK: ley %f0, 524284(%r2) 38*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 39*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%src, i64 131071 40*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 41*9880d681SAndroid Build Coastguard Worker ret float %val 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Check the next word up, which needs separate address logic. 45*9880d681SAndroid Build Coastguard Worker; Other sequences besides this one would be OK. 46*9880d681SAndroid Build Coastguard Workerdefine float @f5(float *%src) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 48*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r2, 524288 49*9880d681SAndroid Build Coastguard Worker; CHECK: lde %f0, 0(%r2) 50*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 51*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%src, i64 131072 52*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 53*9880d681SAndroid Build Coastguard Worker ret float %val 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; Check the high end of the negative aligned LEY range. 57*9880d681SAndroid Build Coastguard Workerdefine float @f6(float *%src) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 59*9880d681SAndroid Build Coastguard Worker; CHECK: ley %f0, -4(%r2) 60*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 61*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%src, i64 -1 62*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 63*9880d681SAndroid Build Coastguard Worker ret float %val 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; Check the low end of the LEY range. 67*9880d681SAndroid Build Coastguard Workerdefine float @f7(float *%src) { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 69*9880d681SAndroid Build Coastguard Worker; CHECK: ley %f0, -524288(%r2) 70*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 71*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%src, i64 -131072 72*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 73*9880d681SAndroid Build Coastguard Worker ret float %val 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; Check the next word down, which needs separate address logic. 77*9880d681SAndroid Build Coastguard Worker; Other sequences besides this one would be OK. 78*9880d681SAndroid Build Coastguard Workerdefine float @f8(float *%src) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 80*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r2, -524292 81*9880d681SAndroid Build Coastguard Worker; CHECK: lde %f0, 0(%r2) 82*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 83*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%src, i64 -131073 84*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 85*9880d681SAndroid Build Coastguard Worker ret float %val 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; Check that LDE allows an index. 89*9880d681SAndroid Build Coastguard Workerdefine float @f9(i64 %src, i64 %index) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 91*9880d681SAndroid Build Coastguard Worker; CHECK: lde %f0, 4092({{%r3,%r2|%r2,%r3}}) 92*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 93*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %src, %index 94*9880d681SAndroid Build Coastguard Worker %add2 = add i64 %add1, 4092 95*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add2 to float * 96*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 97*9880d681SAndroid Build Coastguard Worker ret float %val 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; Check that LEY allows an index. 101*9880d681SAndroid Build Coastguard Workerdefine float @f10(i64 %src, i64 %index) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 103*9880d681SAndroid Build Coastguard Worker; CHECK: ley %f0, 4096({{%r3,%r2|%r2,%r3}}) 104*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 105*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %src, %index 106*9880d681SAndroid Build Coastguard Worker %add2 = add i64 %add1, 4096 107*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add2 to float * 108*9880d681SAndroid Build Coastguard Worker %val = load float, float *%ptr 109*9880d681SAndroid Build Coastguard Worker ret float %val 110*9880d681SAndroid Build Coastguard Worker} 111