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 *%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 *%base, i64 1023
32
%f2 = load 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 *%base, i64 1024
48
%f2 = load 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 *%base, i64 -1
64
%f2 = load 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 *%base, i64 %index
77
%f2 = load 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 *%base, i64 %index2
91
%f2 = load 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 *%base, i64 %index2
106
%f2 = load float *%ptr
107
%negacc = fsub float -0.0, %acc
108
%res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)