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: maebr %f4, %f0, %f2
10 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
14 define float @f2(float %f1, float *%ptr, float %acc) {
16 ; CHECK: maeb %f2, %f0, 0(%r2)
19 %f2 = load float *%ptr
20 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
24 define float @f3(float %f1, float *%base, float %acc) {
26 ; CHECK: maeb %f2, %f0, 4092(%r2)
29 %ptr = getelementptr float *%base, i64 1023
30 %f2 = load float *%ptr
31 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
35 define float @f4(float %f1, float *%base, float %acc) {
36 ; The important thing here is that we don't generate an out-of-range
37 ; displacement. Other sequences besides this one would be OK.
40 ; CHECK: aghi %r2, 4096
41 ; CHECK: maeb %f2, %f0, 0(%r2)
44 %ptr = getelementptr float *%base, i64 1024
45 %f2 = load float *%ptr
46 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
50 define float @f5(float %f1, float *%base, float %acc) {
51 ; Here too the important thing is that we don't generate an out-of-range
52 ; displacement. Other sequences besides this one would be OK.
56 ; CHECK: maeb %f2, %f0, 0(%r2)
59 %ptr = getelementptr float *%base, i64 -1
60 %f2 = load float *%ptr
61 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
65 define float @f6(float %f1, float *%base, i64 %index, float %acc) {
67 ; CHECK: sllg %r1, %r3, 2
68 ; CHECK: maeb %f2, %f0, 0(%r1,%r2)
71 %ptr = getelementptr float *%base, i64 %index
72 %f2 = load float *%ptr
73 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
77 define float @f7(float %f1, float *%base, i64 %index, float %acc) {
79 ; CHECK: sllg %r1, %r3, 2
80 ; CHECK: maeb %f2, %f0, 4092({{%r1,%r2|%r2,%r1}})
83 %index2 = add i64 %index, 1023
84 %ptr = getelementptr float *%base, i64 %index2
85 %f2 = load float *%ptr
86 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
90 define float @f8(float %f1, float *%base, i64 %index, float %acc) {
92 ; CHECK: sllg %r1, %r3, 2
93 ; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})
94 ; CHECK: maeb %f2, %f0, 0(%r1)
97 %index2 = add i64 %index, 1024
98 %ptr = getelementptr float *%base, i64 %index2
99 %f2 = load float *%ptr
100 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)