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