1c3e457f92cb81e74a5407df5e0dc9828a3cb5b5
[oota-llvm.git] / test / CodeGen / PowerPC / vsx-fma-sp.ll
1 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -mattr=+vsx | FileCheck %s
2 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -mattr=+vsx -fast-isel -O0 | FileCheck -check-prefix=CHECK-FISL %s
3 define void @test1sp(float %a, float %b, float %c, float %e, float* nocapture %d) #0 {
4 entry:
5   %0 = tail call float @llvm.fma.f32(float %b, float %c, float %a)
6   store float %0, float* %d, align 4
7   %1 = tail call float @llvm.fma.f32(float %b, float %e, float %a)
8   %arrayidx1 = getelementptr inbounds float, float* %d, i64 1
9   store float %1, float* %arrayidx1, align 4
10   ret void
11
12 ; CHECK-LABEL: @test1sp
13 ; CHECK-DAG: li [[C1:[0-9]+]], 4
14 ; CHECK-DAG: xsmaddmsp 3, 2, 1
15 ; CHECK-DAG: xsmaddasp 1, 2, 4
16 ; CHECK-DAG: stxsspx 3, 0, 7
17 ; CHECK-DAG: stxsspx 1, 7, [[C1]]
18 ; CHECK: blr
19
20 ; CHECK-FISL-LABEL: @test1sp
21 ; CHECK-FISL-DAG: fmr 0, 1
22 ; CHECK-FISL-DAG: xsmaddasp 0, 2, 3
23 ; CHECK-FISL-DAG: stxsspx 0, 0, 7
24 ; CHECK-FISL-DAG: xsmaddasp 1, 2, 4
25 ; CHECK-FISL-DAG: li [[C1:[0-9]+]], 4
26 ; CHECK-FISL-DAG: stxsspx 1, 7, [[C1]]
27 ; CHECK-FISL: blr
28 }
29
30 define void @test2sp(float %a, float %b, float %c, float %e, float %f, float* nocapture %d) #0 {
31 entry:
32   %0 = tail call float @llvm.fma.f32(float %b, float %c, float %a)
33   store float %0, float* %d, align 4
34   %1 = tail call float @llvm.fma.f32(float %b, float %e, float %a)
35   %arrayidx1 = getelementptr inbounds float, float* %d, i64 1
36   store float %1, float* %arrayidx1, align 4
37   %2 = tail call float @llvm.fma.f32(float %b, float %f, float %a)
38   %arrayidx2 = getelementptr inbounds float, float* %d, i64 2
39   store float %2, float* %arrayidx2, align 4
40   ret void
41
42 ; CHECK-LABEL: @test2sp
43 ; CHECK-DAG: li [[C1:[0-9]+]], 4
44 ; CHECK-DAG: li [[C2:[0-9]+]], 8
45 ; CHECK-DAG: xsmaddmsp 3, 2, 1
46 ; CHECK-DAG: xsmaddmsp 4, 2, 1
47 ; CHECK-DAG: xsmaddasp 1, 2, 5
48 ; CHECK-DAG: stxsspx 3, 0, 8
49 ; CHECK-DAG: stxsspx 4, 8, [[C1]]
50 ; CHECK-DAG: stxsspx 1, 8, [[C2]]
51 ; CHECK: blr
52
53 ; CHECK-FISL-LABEL: @test2sp
54 ; CHECK-FISL-DAG: fmr 0, 1
55 ; CHECK-FISL-DAG: xsmaddasp 0, 2, 3
56 ; CHECK-FISL-DAG: stxsspx 0, 0, 8
57 ; CHECK-FISL-DAG: fmr 0, 1
58 ; CHECK-FISL-DAG: xsmaddasp 0, 2, 4
59 ; CHECK-FISL-DAG: li [[C1:[0-9]+]], 4
60 ; CHECK-FISL-DAG: stxsspx 0, 8, [[C1]]
61 ; CHECK-FISL-DAG: xsmaddasp 1, 2, 5
62 ; CHECK-FISL-DAG: li [[C2:[0-9]+]], 8
63 ; CHECK-FISL-DAG: stxsspx 1, 8, [[C2]]
64 ; CHECK-FISL: blr
65 }
66
67 define void @test3sp(float %a, float %b, float %c, float %e, float %f, float* nocapture %d) #0 {
68 entry:
69   %0 = tail call float @llvm.fma.f32(float %b, float %c, float %a)
70   store float %0, float* %d, align 4
71   %1 = tail call float @llvm.fma.f32(float %b, float %e, float %a)
72   %2 = tail call float @llvm.fma.f32(float %b, float %c, float %1)
73   %arrayidx1 = getelementptr inbounds float, float* %d, i64 3
74   store float %2, float* %arrayidx1, align 4
75   %3 = tail call float @llvm.fma.f32(float %b, float %f, float %a)
76   %arrayidx2 = getelementptr inbounds float, float* %d, i64 2
77   store float %3, float* %arrayidx2, align 4
78   %arrayidx3 = getelementptr inbounds float, float* %d, i64 1
79   store float %1, float* %arrayidx3, align 4
80   ret void
81
82 ; CHECK-LABEL: @test3sp
83 ; CHECK-DAG: fmr [[F1:[0-9]+]], 1
84 ; CHECK-DAG: li [[C1:[0-9]+]], 12
85 ; CHECK-DAG: li [[C2:[0-9]+]], 8
86 ; CHECK-DAG: li [[C3:[0-9]+]], 4
87 ; CHECK-DAG: xsmaddmsp 4, 2, 1
88 ; CHECK-DAG: xsmaddasp 1, 2, 5
89
90 ; Note: We could convert this next FMA to M-type as well, but it would require
91 ; re-ordering the instructions.
92 ; CHECK-DAG: xsmaddasp [[F1]], 2, 3
93
94 ; CHECK-DAG: xsmaddmsp 3, 2, 4
95 ; CHECK-DAG: stxsspx [[F1]], 0, 8
96 ; CHECK-DAG: stxsspx 3, 8, [[C1]]
97 ; CHECK-DAG: stxsspx 1, 8, [[C2]]
98 ; CHECK-DAG: stxsspx 4, 8, [[C3]]
99 ; CHECK: blr
100
101 ; CHECK-FISL-LABEL: @test3sp
102 ; CHECK-FISL-DAG: fmr [[F1:[0-9]+]], 1
103 ; CHECK-FISL-DAG: xsmaddasp [[F1]], 2, 4
104 ; CHECK-FISL-DAG: fmr 4, [[F1]]
105 ; CHECK-FISL-DAG: xsmaddasp 4, 2, 3
106 ; CHECK-FISL-DAG: li [[C1:[0-9]+]], 12
107 ; CHECK-FISL-DAG: stxsspx 4, 8, [[C1]]
108 ; CHECK-FISL-DAG: xsmaddasp 1, 2, 5
109 ; CHECK-FISL-DAG: li [[C2:[0-9]+]], 8
110 ; CHECK-FISL-DAG: stxsspx 1, 8, [[C2]]
111 ; CHECK-FISL-DAG: li [[C3:[0-9]+]], 4
112 ; CHECK-FISL-DAG: stxsspx 0, 8, [[C3]]
113 ; CHECK-FISL: blr
114 }
115
116 define void @test4sp(float %a, float %b, float %c, float %e, float %f, float* nocapture %d) #0 {
117 entry:
118   %0 = tail call float @llvm.fma.f32(float %b, float %c, float %a)
119   store float %0, float* %d, align 4
120   %1 = tail call float @llvm.fma.f32(float %b, float %e, float %a)
121   %arrayidx1 = getelementptr inbounds float, float* %d, i64 1
122   store float %1, float* %arrayidx1, align 4
123   %2 = tail call float @llvm.fma.f32(float %b, float %c, float %1)
124   %arrayidx3 = getelementptr inbounds float, float* %d, i64 3
125   store float %2, float* %arrayidx3, align 4
126   %3 = tail call float @llvm.fma.f32(float %b, float %f, float %a)
127   %arrayidx4 = getelementptr inbounds float, float* %d, i64 2
128   store float %3, float* %arrayidx4, align 4
129   ret void
130
131 ; CHECK-LABEL: @test4sp
132 ; CHECK-DAG: fmr [[F1:[0-9]+]], 1
133 ; CHECK-DAG: li [[C1:[0-9]+]], 4
134 ; CHECK-DAG: li [[C2:[0-9]+]], 8
135 ; CHECK-DAG: xsmaddmsp 4, 2, 1
136
137 ; Note: We could convert this next FMA to M-type as well, but it would require
138 ; re-ordering the instructions.
139 ; CHECK-DAG: xsmaddasp 1, 2, 5
140
141 ; CHECK-DAG: xsmaddasp [[F1]], 2, 3
142 ; CHECK-DAG: stxsspx [[F1]], 0, 8
143 ; CHECK-DAG: stxsspx 4, 8, [[C1]]
144 ; CHECK-DAG: li [[C3:[0-9]+]], 12
145 ; CHECK-DAG: xsmaddasp 4, 2, 3
146 ; CHECK-DAG: stxsspx 4, 8, [[C3]]
147 ; CHECK-DAG: stxsspx 1, 8, [[C2]]
148 ; CHECK: blr
149
150 ; CHECK-FISL-LABEL: @test4sp
151 ; CHECK-FISL-DAG: fmr [[F1:[0-9]+]], 1
152 ; CHECK-FISL-DAG: xsmaddasp [[F1]], 2, 3
153 ; CHECK-FISL-DAG: stxsspx 0, 0, 8
154 ; CHECK-FISL-DAG: fmr [[F1]], 1
155 ; CHECK-FISL-DAG: xsmaddasp [[F1]], 2, 4
156 ; CHECK-FISL-DAG: li [[C3:[0-9]+]], 4
157 ; CHECK-FISL-DAG: stxsspx 0, 8, [[C3]]
158 ; CHECK-FISL-DAG: xsmaddasp 0, 2, 3
159 ; CHECK-FISL-DAG: li [[C1:[0-9]+]], 12
160 ; CHECK-FISL-DAG: stxsspx 0, 8, [[C1]]
161 ; CHECK-FISL-DAG: xsmaddasp 1, 2, 5
162 ; CHECK-FISL-DAG: li [[C2:[0-9]+]], 8
163 ; CHECK-FISL-DAG: stxsspx 1, 8, [[C2]]
164 ; CHECK-FISL: blr
165 }
166
167 declare float @llvm.fma.f32(float, float, float) #0