1 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64-unknown-unknown < %s | FileCheck %s
2 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s
4 ; Function Attrs: nounwind
5 define zeroext i8 @_Z6testcff(float %arg) {
7 %arg.addr = alloca float, align 4
8 store float %arg, float* %arg.addr, align 4
9 %0 = load float, float* %arg.addr, align 4
10 %conv = fptoui float %0 to i8
12 ; CHECK-LABEL: @_Z6testcff
13 ; CHECK: xscvdpsxws [[CONVREG01:[0-9]+]], 1
14 ; CHECK: mfvsrwz 3, [[CONVREG01]]
17 ; Function Attrs: nounwind
18 define float @_Z6testfcc(i8 zeroext %arg) {
20 %arg.addr = alloca i8, align 1
21 store i8 %arg, i8* %arg.addr, align 1
22 %0 = load i8, i8* %arg.addr, align 1
23 %conv = uitofp i8 %0 to float
25 ; CHECK-LABEL: @_Z6testfcc
26 ; CHECK: mtvsrwz [[MOVEREG01:[0-9]+]], 3
27 ; FIXME: Once we have XSCVUXDSP implemented, this will change
28 ; CHECK: fcfidus 1, [[MOVEREG01]]
31 ; Function Attrs: nounwind
32 define zeroext i8 @_Z6testcdd(double %arg) {
34 %arg.addr = alloca double, align 8
35 store double %arg, double* %arg.addr, align 8
36 %0 = load double, double* %arg.addr, align 8
37 %conv = fptoui double %0 to i8
39 ; CHECK-LABEL: @_Z6testcdd
40 ; CHECK: xscvdpsxws [[CONVREG02:[0-9]+]], 1
41 ; CHECK: mfvsrwz 3, [[CONVREG02]]
44 ; Function Attrs: nounwind
45 define double @_Z6testdcc(i8 zeroext %arg) {
47 %arg.addr = alloca i8, align 1
48 store i8 %arg, i8* %arg.addr, align 1
49 %0 = load i8, i8* %arg.addr, align 1
50 %conv = uitofp i8 %0 to double
52 ; CHECK-LABEL: @_Z6testdcc
53 ; CHECK: mtvsrwz [[MOVEREG02:[0-9]+]], 3
54 ; CHECK: xscvuxddp 1, [[MOVEREG02]]
57 ; Function Attrs: nounwind
58 define zeroext i8 @_Z7testucff(float %arg) {
60 %arg.addr = alloca float, align 4
61 store float %arg, float* %arg.addr, align 4
62 %0 = load float, float* %arg.addr, align 4
63 %conv = fptoui float %0 to i8
65 ; CHECK-LABEL: @_Z7testucff
66 ; CHECK: xscvdpsxws [[CONVREG03:[0-9]+]], 1
67 ; CHECK: mfvsrwz 3, [[CONVREG03]]
70 ; Function Attrs: nounwind
71 define float @_Z7testfuch(i8 zeroext %arg) {
73 %arg.addr = alloca i8, align 1
74 store i8 %arg, i8* %arg.addr, align 1
75 %0 = load i8, i8* %arg.addr, align 1
76 %conv = uitofp i8 %0 to float
78 ; CHECK-LABEL: @_Z7testfuch
79 ; CHECK: mtvsrwz [[MOVEREG03:[0-9]+]], 3
80 ; FIXME: Once we have XSCVUXDSP implemented, this will change
81 ; CHECK: fcfidus 1, [[MOVEREG03]]
84 ; Function Attrs: nounwind
85 define zeroext i8 @_Z7testucdd(double %arg) {
87 %arg.addr = alloca double, align 8
88 store double %arg, double* %arg.addr, align 8
89 %0 = load double, double* %arg.addr, align 8
90 %conv = fptoui double %0 to i8
92 ; CHECK-LABEL: @_Z7testucdd
93 ; CHECK: xscvdpsxws [[CONVREG04:[0-9]+]], 1
94 ; CHECK: mfvsrwz 3, [[CONVREG04]]
97 ; Function Attrs: nounwind
98 define double @_Z7testduch(i8 zeroext %arg) {
100 %arg.addr = alloca i8, align 1
101 store i8 %arg, i8* %arg.addr, align 1
102 %0 = load i8, i8* %arg.addr, align 1
103 %conv = uitofp i8 %0 to double
105 ; CHECK-LABEL: @_Z7testduch
106 ; CHECK: mtvsrwz [[MOVEREG04:[0-9]+]], 3
107 ; CHECK: xscvuxddp 1, [[MOVEREG04]]
110 ; Function Attrs: nounwind
111 define signext i16 @_Z6testsff(float %arg) {
113 %arg.addr = alloca float, align 4
114 store float %arg, float* %arg.addr, align 4
115 %0 = load float, float* %arg.addr, align 4
116 %conv = fptosi float %0 to i16
118 ; CHECK-LABEL: @_Z6testsff
119 ; CHECK: xscvdpsxws [[CONVREG05:[0-9]+]], 1
120 ; CHECK: mfvsrwz 3, [[CONVREG05]]
123 ; Function Attrs: nounwind
124 define float @_Z6testfss(i16 signext %arg) {
126 %arg.addr = alloca i16, align 2
127 store i16 %arg, i16* %arg.addr, align 2
128 %0 = load i16, i16* %arg.addr, align 2
129 %conv = sitofp i16 %0 to float
131 ; CHECK-LABEL: @_Z6testfss
132 ; CHECK: mtvsrwa [[MOVEREG05:[0-9]+]], 3
133 ; FIXME: Once we have XSCVSXDSP implemented, this will change
134 ; CHECK: fcfids 1, [[MOVEREG05]]
137 ; Function Attrs: nounwind
138 define signext i16 @_Z6testsdd(double %arg) {
140 %arg.addr = alloca double, align 8
141 store double %arg, double* %arg.addr, align 8
142 %0 = load double, double* %arg.addr, align 8
143 %conv = fptosi double %0 to i16
145 ; CHECK-LABEL: @_Z6testsdd
146 ; CHECK: xscvdpsxws [[CONVREG06:[0-9]+]], 1
147 ; CHECK: mfvsrwz 3, [[CONVREG06]]
150 ; Function Attrs: nounwind
151 define double @_Z6testdss(i16 signext %arg) {
153 %arg.addr = alloca i16, align 2
154 store i16 %arg, i16* %arg.addr, align 2
155 %0 = load i16, i16* %arg.addr, align 2
156 %conv = sitofp i16 %0 to double
158 ; CHECK-LABEL: @_Z6testdss
159 ; CHECK: mtvsrwa [[MOVEREG06:[0-9]+]], 3
160 ; CHECK: xscvsxddp 1, [[MOVEREG06]]
163 ; Function Attrs: nounwind
164 define zeroext i16 @_Z7testusff(float %arg) {
166 %arg.addr = alloca float, align 4
167 store float %arg, float* %arg.addr, align 4
168 %0 = load float, float* %arg.addr, align 4
169 %conv = fptoui float %0 to i16
171 ; CHECK-LABEL: @_Z7testusff
172 ; CHECK: xscvdpsxws [[CONVREG07:[0-9]+]], 1
173 ; CHECK: mfvsrwz 3, [[CONVREG07]]
176 ; Function Attrs: nounwind
177 define float @_Z7testfust(i16 zeroext %arg) {
179 %arg.addr = alloca i16, align 2
180 store i16 %arg, i16* %arg.addr, align 2
181 %0 = load i16, i16* %arg.addr, align 2
182 %conv = uitofp i16 %0 to float
184 ; CHECK-LABEL: @_Z7testfust
185 ; CHECK: mtvsrwz [[MOVEREG07:[0-9]+]], 3
186 ; FIXME: Once we have XSCVUXDSP implemented, this will change
187 ; CHECK: fcfidus 1, [[MOVEREG07]]
190 ; Function Attrs: nounwind
191 define zeroext i16 @_Z7testusdd(double %arg) {
193 %arg.addr = alloca double, align 8
194 store double %arg, double* %arg.addr, align 8
195 %0 = load double, double* %arg.addr, align 8
196 %conv = fptoui double %0 to i16
198 ; CHECK-LABEL: @_Z7testusdd
199 ; CHECK: xscvdpsxws [[CONVREG08:[0-9]+]], 1
200 ; CHECK: mfvsrwz 3, [[CONVREG08]]
203 ; Function Attrs: nounwind
204 define double @_Z7testdust(i16 zeroext %arg) {
206 %arg.addr = alloca i16, align 2
207 store i16 %arg, i16* %arg.addr, align 2
208 %0 = load i16, i16* %arg.addr, align 2
209 %conv = uitofp i16 %0 to double
211 ; CHECK-LABEL: @_Z7testdust
212 ; CHECK: mtvsrwz [[MOVEREG08:[0-9]+]], 3
213 ; CHECK: xscvuxddp 1, [[MOVEREG08]]
216 ; Function Attrs: nounwind
217 define signext i32 @_Z6testiff(float %arg) {
219 %arg.addr = alloca float, align 4
220 store float %arg, float* %arg.addr, align 4
221 %0 = load float, float* %arg.addr, align 4
222 %conv = fptosi float %0 to i32
224 ; CHECK-LABEL: @_Z6testiff
225 ; CHECK: xscvdpsxws [[CONVREG09:[0-9]+]], 1
226 ; CHECK: mfvsrwz 3, [[CONVREG09]]
229 ; Function Attrs: nounwind
230 define float @_Z6testfii(i32 signext %arg) {
232 %arg.addr = alloca i32, align 4
233 store i32 %arg, i32* %arg.addr, align 4
234 %0 = load i32, i32* %arg.addr, align 4
235 %conv = sitofp i32 %0 to float
237 ; CHECK-LABEL: @_Z6testfii
238 ; CHECK: mtvsrwa [[MOVEREG09:[0-9]+]], 3
239 ; FIXME: Once we have XSCVSXDSP implemented, this will change
240 ; CHECK: fcfids 1, [[MOVEREG09]]
243 ; Function Attrs: nounwind
244 define signext i32 @_Z6testidd(double %arg) {
246 %arg.addr = alloca double, align 8
247 store double %arg, double* %arg.addr, align 8
248 %0 = load double, double* %arg.addr, align 8
249 %conv = fptosi double %0 to i32
251 ; CHECK-LABEL: @_Z6testidd
252 ; CHECK: xscvdpsxws [[CONVREG10:[0-9]+]], 1
253 ; CHECK: mfvsrwz 3, [[CONVREG10]]
256 ; Function Attrs: nounwind
257 define double @_Z6testdii(i32 signext %arg) {
259 %arg.addr = alloca i32, align 4
260 store i32 %arg, i32* %arg.addr, align 4
261 %0 = load i32, i32* %arg.addr, align 4
262 %conv = sitofp i32 %0 to double
264 ; CHECK-LABEL: @_Z6testdii
265 ; CHECK: mtvsrwa [[MOVEREG10:[0-9]+]], 3
266 ; CHECK: xscvsxddp 1, [[MOVEREG10]]
269 ; Function Attrs: nounwind
270 define zeroext i32 @_Z7testuiff(float %arg) {
272 %arg.addr = alloca float, align 4
273 store float %arg, float* %arg.addr, align 4
274 %0 = load float, float* %arg.addr, align 4
275 %conv = fptoui float %0 to i32
277 ; CHECK-LABEL: @_Z7testuiff
278 ; CHECK: xscvdpuxws [[CONVREG11:[0-9]+]], 1
279 ; CHECK: mfvsrwz 3, [[CONVREG11]]
282 ; Function Attrs: nounwind
283 define float @_Z7testfuij(i32 zeroext %arg) {
285 %arg.addr = alloca i32, align 4
286 store i32 %arg, i32* %arg.addr, align 4
287 %0 = load i32, i32* %arg.addr, align 4
288 %conv = uitofp i32 %0 to float
290 ; CHECK-LABEL: @_Z7testfuij
291 ; CHECK: mtvsrwz [[MOVEREG11:[0-9]+]], 3
292 ; FIXME: Once we have XSCVUXDSP implemented, this will change
293 ; CHECK: fcfidus 1, [[MOVEREG11]]
296 ; Function Attrs: nounwind
297 define zeroext i32 @_Z7testuidd(double %arg) {
299 %arg.addr = alloca double, align 8
300 store double %arg, double* %arg.addr, align 8
301 %0 = load double, double* %arg.addr, align 8
302 %conv = fptoui double %0 to i32
304 ; CHECK-LABEL: @_Z7testuidd
305 ; CHECK: xscvdpuxws [[CONVREG12:[0-9]+]], 1
306 ; CHECK: mfvsrwz 3, [[CONVREG12]]
309 ; Function Attrs: nounwind
310 define double @_Z7testduij(i32 zeroext %arg) {
312 %arg.addr = alloca i32, align 4
313 store i32 %arg, i32* %arg.addr, align 4
314 %0 = load i32, i32* %arg.addr, align 4
315 %conv = uitofp i32 %0 to double
317 ; CHECK-LABEL: @_Z7testduij
318 ; CHECK: mtvsrwz [[MOVEREG12:[0-9]+]], 3
319 ; CHECK: xscvuxddp 1, [[MOVEREG12]]
322 ; Function Attrs: nounwind
323 define i64 @_Z7testllff(float %arg) {
325 %arg.addr = alloca float, align 4
326 store float %arg, float* %arg.addr, align 4
327 %0 = load float, float* %arg.addr, align 4
328 %conv = fptosi float %0 to i64
330 ; CHECK-LABEL: @_Z7testllff
331 ; CHECK: xscvdpsxds [[CONVREG13:[0-9]+]], 1
332 ; CHECK: mfvsrd 3, [[CONVREG13]]
335 ; Function Attrs: nounwind
336 define float @_Z7testfllx(i64 %arg) {
338 %arg.addr = alloca i64, align 8
339 store i64 %arg, i64* %arg.addr, align 8
340 %0 = load i64, i64* %arg.addr, align 8
341 %conv = sitofp i64 %0 to float
343 ; CHECK-LABEL:@_Z7testfllx
344 ; CHECK: mtvsrd [[MOVEREG13:[0-9]+]], 3
345 ; FIXME: Once we have XSCVSXDSP implemented, this will change
346 ; CHECK: fcfids 1, [[MOVEREG13]]
349 ; Function Attrs: nounwind
350 define i64 @_Z7testlldd(double %arg) {
352 %arg.addr = alloca double, align 8
353 store double %arg, double* %arg.addr, align 8
354 %0 = load double, double* %arg.addr, align 8
355 %conv = fptosi double %0 to i64
357 ; CHECK-LABEL: @_Z7testlldd
358 ; CHECK: xscvdpsxds [[CONVREG14:[0-9]+]], 1
359 ; CHECK: mfvsrd 3, [[CONVREG14]]
362 ; Function Attrs: nounwind
363 define double @_Z7testdllx(i64 %arg) {
365 %arg.addr = alloca i64, align 8
366 store i64 %arg, i64* %arg.addr, align 8
367 %0 = load i64, i64* %arg.addr, align 8
368 %conv = sitofp i64 %0 to double
370 ; CHECK-LABEL: @_Z7testdllx
371 ; CHECK: mtvsrd [[MOVEREG14:[0-9]+]], 3
372 ; CHECK: xscvsxddp 1, [[MOVEREG14]]
375 ; Function Attrs: nounwind
376 define i64 @_Z8testullff(float %arg) {
378 %arg.addr = alloca float, align 4
379 store float %arg, float* %arg.addr, align 4
380 %0 = load float, float* %arg.addr, align 4
381 %conv = fptoui float %0 to i64
383 ; CHECK-LABEL: @_Z8testullff
384 ; CHECK: xscvdpuxds [[CONVREG15:[0-9]+]], 1
385 ; CHECK: mfvsrd 3, [[CONVREG15]]
388 ; Function Attrs: nounwind
389 define float @_Z8testfully(i64 %arg) {
391 %arg.addr = alloca i64, align 8
392 store i64 %arg, i64* %arg.addr, align 8
393 %0 = load i64, i64* %arg.addr, align 8
394 %conv = uitofp i64 %0 to float
396 ; CHECK-LABEL: @_Z8testfully
397 ; CHECK: mtvsrd [[MOVEREG15:[0-9]+]], 3
398 ; FIXME: Once we have XSCVUXDSP implemented, this will change
399 ; CHECK: fcfidus 1, [[MOVEREG15]]
402 ; Function Attrs: nounwind
403 define i64 @_Z8testulldd(double %arg) {
405 %arg.addr = alloca double, align 8
406 store double %arg, double* %arg.addr, align 8
407 %0 = load double, double* %arg.addr, align 8
408 %conv = fptoui double %0 to i64
410 ; CHECK-LABEL: @_Z8testulldd
411 ; CHECK: xscvdpuxds [[CONVREG16:[0-9]+]], 1
412 ; CHECK: mfvsrd 3, [[CONVREG16]]
415 ; Function Attrs: nounwind
416 define double @_Z8testdully(i64 %arg) {
418 %arg.addr = alloca i64, align 8
419 store i64 %arg, i64* %arg.addr, align 8
420 %0 = load i64, i64* %arg.addr, align 8
421 %conv = uitofp i64 %0 to double
423 ; CHECK-LABEL: @_Z8testdully
424 ; CHECK: mtvsrd [[MOVEREG16:[0-9]+]], 3
425 ; CHECK: xscvuxddp 1, [[MOVEREG16]]