1*9880d681SAndroid Build Coastguard Worker; Test 32-bit floating-point stores. 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 Worker; Test the low end of the STE range. 6*9880d681SAndroid Build Coastguard Workerdefine void @f1(float *%ptr, float %val) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: ste %f0, 0(%r2) 9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 10*9880d681SAndroid Build Coastguard Worker store float %val, float *%ptr 11*9880d681SAndroid Build Coastguard Worker ret void 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; Test the high end of the STE range. 15*9880d681SAndroid Build Coastguard Workerdefine void @f2(float *%src, float %val) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 17*9880d681SAndroid Build Coastguard Worker; CHECK: ste %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 store float %val, float *%ptr 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; Check the next word up, which should use STEY instead of STE. 25*9880d681SAndroid Build Coastguard Workerdefine void @f3(float *%src, float %val) { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 27*9880d681SAndroid Build Coastguard Worker; CHECK: stey %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 store float %val, float *%ptr 31*9880d681SAndroid Build Coastguard Worker ret void 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; Check the high end of the aligned STEY range. 35*9880d681SAndroid Build Coastguard Workerdefine void @f4(float *%src, float %val) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 37*9880d681SAndroid Build Coastguard Worker; CHECK: stey %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 store float %val, float *%ptr 41*9880d681SAndroid Build Coastguard Worker ret void 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 void @f5(float *%src, float %val) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 48*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r2, 524288 49*9880d681SAndroid Build Coastguard Worker; CHECK: ste %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 store float %val, float *%ptr 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; Check the high end of the negative aligned STEY range. 57*9880d681SAndroid Build Coastguard Workerdefine void @f6(float *%src, float %val) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 59*9880d681SAndroid Build Coastguard Worker; CHECK: stey %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 store float %val, float *%ptr 63*9880d681SAndroid Build Coastguard Worker ret void 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; Check the low end of the STEY range. 67*9880d681SAndroid Build Coastguard Workerdefine void @f7(float *%src, float %val) { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 69*9880d681SAndroid Build Coastguard Worker; CHECK: stey %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 store float %val, float *%ptr 73*9880d681SAndroid Build Coastguard Worker ret void 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 void @f8(float *%src, float %val) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 80*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r2, -524292 81*9880d681SAndroid Build Coastguard Worker; CHECK: ste %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 store float %val, float *%ptr 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; Check that STE allows an index. 89*9880d681SAndroid Build Coastguard Workerdefine void @f9(i64 %src, i64 %index, float %val) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 91*9880d681SAndroid Build Coastguard Worker; CHECK: ste %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 store float %val, float *%ptr 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; Check that STEY allows an index. 101*9880d681SAndroid Build Coastguard Workerdefine void @f10(i64 %src, i64 %index, float %val) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 103*9880d681SAndroid Build Coastguard Worker; CHECK: stey %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 store float %val, float *%ptr 109*9880d681SAndroid Build Coastguard Worker ret void 110*9880d681SAndroid Build Coastguard Worker} 111