1 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
3 declare float @llvm.fma.f32(float %f1, float %f2, float %f3)
5 define float @f1(float %f1, float %f2, float %acc) {
7 ; CHECK: msebr %f4, %f0, %f2
10 %negacc = fsub float -0.0, %acc
11 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)
15 define float @f2(float %f1, float *%ptr, float %acc) {
17 ; CHECK: mseb %f2, %f0, 0(%r2)
20 %f2 = load float , float *%ptr
21 %negacc = fsub float -0.0, %acc
22 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)
26 define float @f3(float %f1, float *%base, float %acc) {
28 ; CHECK: mseb %f2, %f0, 4092(%r2)
31 %ptr = getelementptr float, float *%base, i64 1023
32 %f2 = load float , float *%ptr
33 %negacc = fsub float -0.0, %acc
34 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)
38 define float @f4(float %f1, float *%base, float %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: mseb %f2, %f0, 0(%r2)
47 %ptr = getelementptr float, float *%base, i64 1024
48 %f2 = load float , float *%ptr
49 %negacc = fsub float -0.0, %acc
50 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)
54 define float @f5(float %f1, float *%base, float %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: mseb %f2, %f0, 0(%r2)
63 %ptr = getelementptr float, float *%base, i64 -1
64 %f2 = load float , float *%ptr
65 %negacc = fsub float -0.0, %acc
66 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)
70 define float @f6(float %f1, float *%base, i64 %index, float %acc) {
72 ; CHECK: sllg %r1, %r3, 2
73 ; CHECK: mseb %f2, %f0, 0(%r1,%r2)
76 %ptr = getelementptr float, float *%base, i64 %index
77 %f2 = load float , float *%ptr
78 %negacc = fsub float -0.0, %acc
79 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)
83 define float @f7(float %f1, float *%base, i64 %index, float %acc) {
85 ; CHECK: sllg %r1, %r3, 2
86 ; CHECK: mseb %f2, %f0, 4092({{%r1,%r2|%r2,%r1}})
89 %index2 = add i64 %index, 1023
90 %ptr = getelementptr float, float *%base, i64 %index2
91 %f2 = load float , float *%ptr
92 %negacc = fsub float -0.0, %acc
93 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)
97 define float @f8(float %f1, float *%base, i64 %index, float %acc) {
99 ; CHECK: sllg %r1, %r3, 2
100 ; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})
101 ; CHECK: mseb %f2, %f0, 0(%r1)
102 ; CHECK: ler %f0, %f2
104 %index2 = add i64 %index, 1024
105 %ptr = getelementptr float, float *%base, i64 %index2
106 %f2 = load float , float *%ptr
107 %negacc = fsub float -0.0, %acc
108 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)