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