1; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s --check-prefix=ELF64
2
3; Test sitofp
4
5define void @sitofp_single_i64(i64 %a, float %b) nounwind ssp {
6entry:
7; ELF64: sitofp_single_i64
8  %b.addr = alloca float, align 4
9  %conv = sitofp i64 %a to float
10; ELF64: std
11; ELF64: lfd
12; ELF64: fcfids
13  store float %conv, float* %b.addr, align 4
14  ret void
15}
16
17define void @sitofp_single_i32(i32 %a, float %b) nounwind ssp {
18entry:
19; ELF64: sitofp_single_i32
20  %b.addr = alloca float, align 4
21  %conv = sitofp i32 %a to float
22; ELF64: std
23; ELF64: lfiwax
24; ELF64: fcfids
25  store float %conv, float* %b.addr, align 4
26  ret void
27}
28
29define void @sitofp_single_i16(i16 %a, float %b) nounwind ssp {
30entry:
31; ELF64: sitofp_single_i16
32  %b.addr = alloca float, align 4
33  %conv = sitofp i16 %a to float
34; ELF64: extsh
35; ELF64: std
36; ELF64: lfd
37; ELF64: fcfids
38  store float %conv, float* %b.addr, align 4
39  ret void
40}
41
42define void @sitofp_single_i8(i8 %a) nounwind ssp {
43entry:
44; ELF64: sitofp_single_i8
45  %b.addr = alloca float, align 4
46  %conv = sitofp i8 %a to float
47; ELF64: extsb
48; ELF64: std
49; ELF64: lfd
50; ELF64: fcfids
51  store float %conv, float* %b.addr, align 4
52  ret void
53}
54
55define void @sitofp_double_i32(i32 %a, double %b) nounwind ssp {
56entry:
57; ELF64: sitofp_double_i32
58  %b.addr = alloca double, align 8
59  %conv = sitofp i32 %a to double
60; ELF64: std
61; ELF64: lfiwax
62; ELF64: fcfid
63  store double %conv, double* %b.addr, align 8
64  ret void
65}
66
67define void @sitofp_double_i64(i64 %a, double %b) nounwind ssp {
68entry:
69; ELF64: sitofp_double_i64
70  %b.addr = alloca double, align 8
71  %conv = sitofp i64 %a to double
72; ELF64: std
73; ELF64: lfd
74; ELF64: fcfid
75  store double %conv, double* %b.addr, align 8
76  ret void
77}
78
79define void @sitofp_double_i16(i16 %a, double %b) nounwind ssp {
80entry:
81; ELF64: sitofp_double_i16
82  %b.addr = alloca double, align 8
83  %conv = sitofp i16 %a to double
84; ELF64: extsh
85; ELF64: std
86; ELF64: lfd
87; ELF64: fcfid
88  store double %conv, double* %b.addr, align 8
89  ret void
90}
91
92define void @sitofp_double_i8(i8 %a, double %b) nounwind ssp {
93entry:
94; ELF64: sitofp_double_i8
95  %b.addr = alloca double, align 8
96  %conv = sitofp i8 %a to double
97; ELF64: extsb
98; ELF64: std
99; ELF64: lfd
100; ELF64: fcfid
101  store double %conv, double* %b.addr, align 8
102  ret void
103}
104
105; Test uitofp
106
107define void @uitofp_single_i64(i64 %a, float %b) nounwind ssp {
108entry:
109; ELF64: uitofp_single_i64
110  %b.addr = alloca float, align 4
111  %conv = uitofp i64 %a to float
112; ELF64: std
113; ELF64: lfd
114; ELF64: fcfidus
115  store float %conv, float* %b.addr, align 4
116  ret void
117}
118
119define void @uitofp_single_i32(i32 %a, float %b) nounwind ssp {
120entry:
121; ELF64: uitofp_single_i32
122  %b.addr = alloca float, align 4
123  %conv = uitofp i32 %a to float
124; ELF64: std
125; ELF64: lfiwzx
126; ELF64: fcfidus
127  store float %conv, float* %b.addr, align 4
128  ret void
129}
130
131define void @uitofp_single_i16(i16 %a, float %b) nounwind ssp {
132entry:
133; ELF64: uitofp_single_i16
134  %b.addr = alloca float, align 4
135  %conv = uitofp i16 %a to float
136; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 48
137; ELF64: std
138; ELF64: lfd
139; ELF64: fcfidus
140  store float %conv, float* %b.addr, align 4
141  ret void
142}
143
144define void @uitofp_single_i8(i8 %a) nounwind ssp {
145entry:
146; ELF64: uitofp_single_i8
147  %b.addr = alloca float, align 4
148  %conv = uitofp i8 %a to float
149; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 56
150; ELF64: std
151; ELF64: lfd
152; ELF64: fcfidus
153  store float %conv, float* %b.addr, align 4
154  ret void
155}
156
157define void @uitofp_double_i64(i64 %a, double %b) nounwind ssp {
158entry:
159; ELF64: uitofp_double_i64
160  %b.addr = alloca double, align 8
161  %conv = uitofp i64 %a to double
162; ELF64: std
163; ELF64: lfd
164; ELF64: fcfidu
165  store double %conv, double* %b.addr, align 8
166  ret void
167}
168
169define void @uitofp_double_i32(i32 %a, double %b) nounwind ssp {
170entry:
171; ELF64: uitofp_double_i32
172  %b.addr = alloca double, align 8
173  %conv = uitofp i32 %a to double
174; ELF64: std
175; ELF64: lfiwzx
176; ELF64: fcfidu
177  store double %conv, double* %b.addr, align 8
178  ret void
179}
180
181define void @uitofp_double_i16(i16 %a, double %b) nounwind ssp {
182entry:
183; ELF64: uitofp_double_i16
184  %b.addr = alloca double, align 8
185  %conv = uitofp i16 %a to double
186; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 48
187; ELF64: std
188; ELF64: lfd
189; ELF64: fcfidu
190  store double %conv, double* %b.addr, align 8
191  ret void
192}
193
194define void @uitofp_double_i8(i8 %a, double %b) nounwind ssp {
195entry:
196; ELF64: uitofp_double_i8
197  %b.addr = alloca double, align 8
198  %conv = uitofp i8 %a to double
199; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 56
200; ELF64: std
201; ELF64: lfd
202; ELF64: fcfidu
203  store double %conv, double* %b.addr, align 8
204  ret void
205}
206
207; Test fptosi
208
209define void @fptosi_float_i32(float %a) nounwind ssp {
210entry:
211; ELF64: fptosi_float_i32
212  %b.addr = alloca i32, align 4
213  %conv = fptosi float %a to i32
214; ELF64: fctiwz
215; ELF64: stfd
216; ELF64: lwa
217  store i32 %conv, i32* %b.addr, align 4
218  ret void
219}
220
221define void @fptosi_float_i64(float %a) nounwind ssp {
222entry:
223; ELF64: fptosi_float_i64
224  %b.addr = alloca i64, align 4
225  %conv = fptosi float %a to i64
226; ELF64: fctidz
227; ELF64: stfd
228; ELF64: ld
229  store i64 %conv, i64* %b.addr, align 4
230  ret void
231}
232
233define void @fptosi_double_i32(double %a) nounwind ssp {
234entry:
235; ELF64: fptosi_double_i32
236  %b.addr = alloca i32, align 8
237  %conv = fptosi double %a to i32
238; ELF64: fctiwz
239; ELF64: stfd
240; ELF64: lwa
241  store i32 %conv, i32* %b.addr, align 8
242  ret void
243}
244
245define void @fptosi_double_i64(double %a) nounwind ssp {
246entry:
247; ELF64: fptosi_double_i64
248  %b.addr = alloca i64, align 8
249  %conv = fptosi double %a to i64
250; ELF64: fctidz
251; ELF64: stfd
252; ELF64: ld
253  store i64 %conv, i64* %b.addr, align 8
254  ret void
255}
256
257; Test fptoui
258
259define void @fptoui_float_i32(float %a) nounwind ssp {
260entry:
261; ELF64: fptoui_float_i32
262  %b.addr = alloca i32, align 4
263  %conv = fptoui float %a to i32
264; ELF64: fctiwuz
265; ELF64: stfd
266; ELF64: lwz
267  store i32 %conv, i32* %b.addr, align 4
268  ret void
269}
270
271define void @fptoui_float_i64(float %a) nounwind ssp {
272entry:
273; ELF64: fptoui_float_i64
274  %b.addr = alloca i64, align 4
275  %conv = fptoui float %a to i64
276; ELF64: fctiduz
277; ELF64: stfd
278; ELF64: ld
279  store i64 %conv, i64* %b.addr, align 4
280  ret void
281}
282
283define void @fptoui_double_i32(double %a) nounwind ssp {
284entry:
285; ELF64: fptoui_double_i32
286  %b.addr = alloca i32, align 8
287  %conv = fptoui double %a to i32
288; ELF64: fctiwuz
289; ELF64: stfd
290; ELF64: lwz
291  store i32 %conv, i32* %b.addr, align 8
292  ret void
293}
294
295define void @fptoui_double_i64(double %a) nounwind ssp {
296entry:
297; ELF64: fptoui_double_i64
298  %b.addr = alloca i64, align 8
299  %conv = fptoui double %a to i64
300; ELF64: fctiduz
301; ELF64: stfd
302; ELF64: ld
303  store i64 %conv, i64* %b.addr, align 8
304  ret void
305}
306