1 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
3 declare double @llvm.fma.f64(double %f1, double %f2, double %f3)
5 define double @f1(double %f1, double %f2, double %acc) {
7 ; CHECK: msdbr %f4, %f0, %f2
10 %negacc = fsub double -0.0, %acc
11 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)
15 define double @f2(double %f1, double *%ptr, double %acc) {
17 ; CHECK: msdb %f2, %f0, 0(%r2)
20 %f2 = load double *%ptr
21 %negacc = fsub double -0.0, %acc
22 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)
26 define double @f3(double %f1, double *%base, double %acc) {
28 ; CHECK: msdb %f2, %f0, 4088(%r2)
31 %ptr = getelementptr double *%base, i64 511
32 %f2 = load double *%ptr
33 %negacc = fsub double -0.0, %acc
34 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)
38 define double @f4(double %f1, double *%base, double %acc) {
39 ; The important thing here is that we don't generate an out-of-range
40 ; displacement. Other sequences besides this one would be OK.
43 ; CHECK: aghi %r2, 4096
44 ; CHECK: msdb %f2, %f0, 0(%r2)
47 %ptr = getelementptr double *%base, i64 512
48 %f2 = load double *%ptr
49 %negacc = fsub double -0.0, %acc
50 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)
54 define double @f5(double %f1, double *%base, double %acc) {
55 ; Here too the important thing is that we don't generate an out-of-range
56 ; displacement. Other sequences besides this one would be OK.
60 ; CHECK: msdb %f2, %f0, 0(%r2)
63 %ptr = getelementptr double *%base, i64 -1
64 %f2 = load double *%ptr
65 %negacc = fsub double -0.0, %acc
66 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)
70 define double @f6(double %f1, double *%base, i64 %index, double %acc) {
72 ; CHECK: sllg %r1, %r3, 3
73 ; CHECK: msdb %f2, %f0, 0(%r1,%r2)
76 %ptr = getelementptr double *%base, i64 %index
77 %f2 = load double *%ptr
78 %negacc = fsub double -0.0, %acc
79 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)
83 define double @f7(double %f1, double *%base, i64 %index, double %acc) {
85 ; CHECK: sllg %r1, %r3, 3
86 ; CHECK: msdb %f2, %f0, 4088({{%r1,%r2|%r2,%r1}})
89 %index2 = add i64 %index, 511
90 %ptr = getelementptr double *%base, i64 %index2
91 %f2 = load double *%ptr
92 %negacc = fsub double -0.0, %acc
93 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)
97 define double @f8(double %f1, double *%base, i64 %index, double %acc) {
99 ; CHECK: sllg %r1, %r3, 3
100 ; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})
101 ; CHECK: msdb %f2, %f0, 0(%r1)
102 ; CHECK: ldr %f0, %f2
104 %index2 = add i64 %index, 512
105 %ptr = getelementptr double *%base, i64 %index2
106 %f2 = load double *%ptr
107 %negacc = fsub double -0.0, %acc
108 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)