1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \ 2*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 \ 4*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double %f1, double %f2, double %f3) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine double @f1(double %f1, double %f2, double %acc) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 10*9880d681SAndroid Build Coastguard Worker; CHECK-SCALAR: msdbr %f4, %f0, %f2 11*9880d681SAndroid Build Coastguard Worker; CHECK-SCALAR: ldr %f0, %f4 12*9880d681SAndroid Build Coastguard Worker; CHECK-VECTOR: wfmsdb %f0, %f0, %f2, %f4 13*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 14*9880d681SAndroid Build Coastguard Worker %negacc = fsub double -0.0, %acc 15*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc) 16*9880d681SAndroid Build Coastguard Worker ret double %res 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine double @f2(double %f1, double *%ptr, double %acc) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: msdb %f2, %f0, 0(%r2) 22*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 23*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 24*9880d681SAndroid Build Coastguard Worker %f2 = load double , double *%ptr 25*9880d681SAndroid Build Coastguard Worker %negacc = fsub double -0.0, %acc 26*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc) 27*9880d681SAndroid Build Coastguard Worker ret double %res 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine double @f3(double %f1, double *%base, double %acc) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 32*9880d681SAndroid Build Coastguard Worker; CHECK: msdb %f2, %f0, 4088(%r2) 33*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 34*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 35*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 511 36*9880d681SAndroid Build Coastguard Worker %f2 = load double , double *%ptr 37*9880d681SAndroid Build Coastguard Worker %negacc = fsub double -0.0, %acc 38*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc) 39*9880d681SAndroid Build Coastguard Worker ret double %res 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine double @f4(double %f1, double *%base, double %acc) { 43*9880d681SAndroid Build Coastguard Worker; The important thing here is that we don't generate an out-of-range 44*9880d681SAndroid Build Coastguard Worker; displacement. Other sequences besides this one would be OK. 45*9880d681SAndroid Build Coastguard Worker; 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 48*9880d681SAndroid Build Coastguard Worker; CHECK: msdb %f2, %f0, 0(%r2) 49*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 50*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 51*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 512 52*9880d681SAndroid Build Coastguard Worker %f2 = load double , double *%ptr 53*9880d681SAndroid Build Coastguard Worker %negacc = fsub double -0.0, %acc 54*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc) 55*9880d681SAndroid Build Coastguard Worker ret double %res 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine double @f5(double %f1, double *%base, double %acc) { 59*9880d681SAndroid Build Coastguard Worker; Here too the important thing is that we don't generate an out-of-range 60*9880d681SAndroid Build Coastguard Worker; displacement. Other sequences besides this one would be OK. 61*9880d681SAndroid Build Coastguard Worker; 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 63*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, -8 64*9880d681SAndroid Build Coastguard Worker; CHECK: msdb %f2, %f0, 0(%r2) 65*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 66*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 67*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 -1 68*9880d681SAndroid Build Coastguard Worker %f2 = load double , double *%ptr 69*9880d681SAndroid Build Coastguard Worker %negacc = fsub double -0.0, %acc 70*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc) 71*9880d681SAndroid Build Coastguard Worker ret double %res 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine double @f6(double %f1, double *%base, i64 %index, double %acc) { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 76*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r1, %r3, 3 77*9880d681SAndroid Build Coastguard Worker; CHECK: msdb %f2, %f0, 0(%r1,%r2) 78*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 79*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 80*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 %index 81*9880d681SAndroid Build Coastguard Worker %f2 = load double , double *%ptr 82*9880d681SAndroid Build Coastguard Worker %negacc = fsub double -0.0, %acc 83*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc) 84*9880d681SAndroid Build Coastguard Worker ret double %res 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine double @f7(double %f1, double *%base, i64 %index, double %acc) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 89*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r1, %r3, 3 90*9880d681SAndroid Build Coastguard Worker; CHECK: msdb %f2, %f0, 4088({{%r1,%r2|%r2,%r1}}) 91*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 92*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 93*9880d681SAndroid Build Coastguard Worker %index2 = add i64 %index, 511 94*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 %index2 95*9880d681SAndroid Build Coastguard Worker %f2 = load double , double *%ptr 96*9880d681SAndroid Build Coastguard Worker %negacc = fsub double -0.0, %acc 97*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc) 98*9880d681SAndroid Build Coastguard Worker ret double %res 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine double @f8(double %f1, double *%base, i64 %index, double %acc) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 103*9880d681SAndroid Build Coastguard Worker; CHECK: sllg %r1, %r3, 3 104*9880d681SAndroid Build Coastguard Worker; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}}) 105*9880d681SAndroid Build Coastguard Worker; CHECK: msdb %f2, %f0, 0(%r1) 106*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 107*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 108*9880d681SAndroid Build Coastguard Worker %index2 = add i64 %index, 512 109*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i64 %index2 110*9880d681SAndroid Build Coastguard Worker %f2 = load double , double *%ptr 111*9880d681SAndroid Build Coastguard Worker %negacc = fsub double -0.0, %acc 112*9880d681SAndroid Build Coastguard Worker %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc) 113*9880d681SAndroid Build Coastguard Worker ret double %res 114*9880d681SAndroid Build Coastguard Worker} 115