1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \
3; RUN:   -verify-machineinstrs < %s | FileCheck %s
4; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \
5; RUN:   -verify-machineinstrs < %s | FileCheck -check-prefix=CHECK-PWR8 %s
6
7; ==========================================
8; Tests for store of fp_to_sint converstions
9; ==========================================
10
11; Function Attrs: norecurse nounwind
12define void @qpConv2sdw(fp128* nocapture readonly %a, i64* nocapture %b) {
13; CHECK-LABEL: qpConv2sdw:
14; CHECK:       # %bb.0: # %entry
15; CHECK-NEXT:    lxv 2, 0(3)
16; CHECK-NEXT:    xscvqpsdz 2, 2
17; CHECK-NEXT:    stxsd 2, 0(4)
18; CHECK-NEXT:    blr
19;
20; CHECK-PWR8-LABEL: qpConv2sdw:
21; CHECK-PWR8:       # %bb.0: # %entry
22; CHECK-PWR8-NEXT:    mflr 0
23; CHECK-PWR8-NEXT:    .cfi_def_cfa_offset 48
24; CHECK-PWR8-NEXT:    .cfi_offset lr, 16
25; CHECK-PWR8-NEXT:    .cfi_offset r30, -16
26; CHECK-PWR8-NEXT:    std 30, -16(1) # 8-byte Folded Spill
27; CHECK-PWR8-NEXT:    std 0, 16(1)
28; CHECK-PWR8-NEXT:    stdu 1, -48(1)
29; CHECK-PWR8-NEXT:    lvx 2, 0, 3
30; CHECK-PWR8-NEXT:    mr 30, 4
31; CHECK-PWR8-NEXT:    bl __fixkfdi
32; CHECK-PWR8-NEXT:    nop
33; CHECK-PWR8-NEXT:    std 3, 0(30)
34; CHECK-PWR8-NEXT:    addi 1, 1, 48
35; CHECK-PWR8-NEXT:    ld 0, 16(1)
36; CHECK-PWR8-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
37; CHECK-PWR8-NEXT:    mtlr 0
38; CHECK-PWR8-NEXT:    blr
39entry:
40  %0 = load fp128, fp128* %a, align 16
41  %conv = fptosi fp128 %0 to i64
42  store i64 %conv, i64* %b, align 8
43  ret void
44
45
46}
47
48; Function Attrs: norecurse nounwind
49define void @qpConv2sw(fp128* nocapture readonly %a, i32* nocapture %b) {
50; CHECK-LABEL: qpConv2sw:
51; CHECK:       # %bb.0: # %entry
52; CHECK-NEXT:    lxv 2, 0(3)
53; CHECK-NEXT:    xscvqpswz 2, 2
54; CHECK-NEXT:    stxsiwx 2, 0, 4
55; CHECK-NEXT:    blr
56;
57; CHECK-PWR8-LABEL: qpConv2sw:
58; CHECK-PWR8:       # %bb.0: # %entry
59; CHECK-PWR8-NEXT:    mflr 0
60; CHECK-PWR8-NEXT:    .cfi_def_cfa_offset 48
61; CHECK-PWR8-NEXT:    .cfi_offset lr, 16
62; CHECK-PWR8-NEXT:    .cfi_offset r30, -16
63; CHECK-PWR8-NEXT:    std 30, -16(1) # 8-byte Folded Spill
64; CHECK-PWR8-NEXT:    std 0, 16(1)
65; CHECK-PWR8-NEXT:    stdu 1, -48(1)
66; CHECK-PWR8-NEXT:    lvx 2, 0, 3
67; CHECK-PWR8-NEXT:    mr 30, 4
68; CHECK-PWR8-NEXT:    bl __fixkfsi
69; CHECK-PWR8-NEXT:    nop
70; CHECK-PWR8-NEXT:    stw 3, 0(30)
71; CHECK-PWR8-NEXT:    addi 1, 1, 48
72; CHECK-PWR8-NEXT:    ld 0, 16(1)
73; CHECK-PWR8-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
74; CHECK-PWR8-NEXT:    mtlr 0
75; CHECK-PWR8-NEXT:    blr
76entry:
77  %0 = load fp128, fp128* %a, align 16
78  %conv = fptosi fp128 %0 to i32
79  store i32 %conv, i32* %b, align 4
80  ret void
81
82
83}
84
85; Function Attrs: norecurse nounwind
86define void @qpConv2udw(fp128* nocapture readonly %a, i64* nocapture %b) {
87; CHECK-LABEL: qpConv2udw:
88; CHECK:       # %bb.0: # %entry
89; CHECK-NEXT:    lxv 2, 0(3)
90; CHECK-NEXT:    xscvqpudz 2, 2
91; CHECK-NEXT:    stxsd 2, 0(4)
92; CHECK-NEXT:    blr
93;
94; CHECK-PWR8-LABEL: qpConv2udw:
95; CHECK-PWR8:       # %bb.0: # %entry
96; CHECK-PWR8-NEXT:    mflr 0
97; CHECK-PWR8-NEXT:    .cfi_def_cfa_offset 48
98; CHECK-PWR8-NEXT:    .cfi_offset lr, 16
99; CHECK-PWR8-NEXT:    .cfi_offset r30, -16
100; CHECK-PWR8-NEXT:    std 30, -16(1) # 8-byte Folded Spill
101; CHECK-PWR8-NEXT:    std 0, 16(1)
102; CHECK-PWR8-NEXT:    stdu 1, -48(1)
103; CHECK-PWR8-NEXT:    lvx 2, 0, 3
104; CHECK-PWR8-NEXT:    mr 30, 4
105; CHECK-PWR8-NEXT:    bl __fixunskfdi
106; CHECK-PWR8-NEXT:    nop
107; CHECK-PWR8-NEXT:    std 3, 0(30)
108; CHECK-PWR8-NEXT:    addi 1, 1, 48
109; CHECK-PWR8-NEXT:    ld 0, 16(1)
110; CHECK-PWR8-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
111; CHECK-PWR8-NEXT:    mtlr 0
112; CHECK-PWR8-NEXT:    blr
113entry:
114  %0 = load fp128, fp128* %a, align 16
115  %conv = fptoui fp128 %0 to i64
116  store i64 %conv, i64* %b, align 8
117  ret void
118
119
120}
121
122; Function Attrs: norecurse nounwind
123define void @qpConv2uw(fp128* nocapture readonly %a, i32* nocapture %b) {
124; CHECK-LABEL: qpConv2uw:
125; CHECK:       # %bb.0: # %entry
126; CHECK-NEXT:    lxv 2, 0(3)
127; CHECK-NEXT:    xscvqpuwz 2, 2
128; CHECK-NEXT:    stxsiwx 2, 0, 4
129; CHECK-NEXT:    blr
130;
131; CHECK-PWR8-LABEL: qpConv2uw:
132; CHECK-PWR8:       # %bb.0: # %entry
133; CHECK-PWR8-NEXT:    mflr 0
134; CHECK-PWR8-NEXT:    .cfi_def_cfa_offset 48
135; CHECK-PWR8-NEXT:    .cfi_offset lr, 16
136; CHECK-PWR8-NEXT:    .cfi_offset r30, -16
137; CHECK-PWR8-NEXT:    std 30, -16(1) # 8-byte Folded Spill
138; CHECK-PWR8-NEXT:    std 0, 16(1)
139; CHECK-PWR8-NEXT:    stdu 1, -48(1)
140; CHECK-PWR8-NEXT:    lvx 2, 0, 3
141; CHECK-PWR8-NEXT:    mr 30, 4
142; CHECK-PWR8-NEXT:    bl __fixunskfsi
143; CHECK-PWR8-NEXT:    nop
144; CHECK-PWR8-NEXT:    stw 3, 0(30)
145; CHECK-PWR8-NEXT:    addi 1, 1, 48
146; CHECK-PWR8-NEXT:    ld 0, 16(1)
147; CHECK-PWR8-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
148; CHECK-PWR8-NEXT:    mtlr 0
149; CHECK-PWR8-NEXT:    blr
150entry:
151  %0 = load fp128, fp128* %a, align 16
152  %conv = fptoui fp128 %0 to i32
153  store i32 %conv, i32* %b, align 4
154  ret void
155
156
157}
158
159; Function Attrs: norecurse nounwind
160define void @dpConv2sdw(double* nocapture readonly %a, i64* nocapture %b) {
161; CHECK-LABEL: dpConv2sdw:
162; CHECK:       # %bb.0: # %entry
163; CHECK-NEXT:    lfd 0, 0(3)
164; CHECK-NEXT:    xscvdpsxds 2, 0
165; CHECK-NEXT:    stxsd 2, 0(4)
166; CHECK-NEXT:    blr
167;
168; CHECK-PWR8-LABEL: dpConv2sdw:
169; CHECK-PWR8:       # %bb.0: # %entry
170; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
171; CHECK-PWR8-NEXT:    xscvdpsxds 0, 0
172; CHECK-PWR8-NEXT:    stxsdx 0, 0, 4
173; CHECK-PWR8-NEXT:    blr
174entry:
175  %0 = load double, double* %a, align 8
176  %conv = fptosi double %0 to i64
177  store i64 %conv, i64* %b, align 8
178  ret void
179
180
181}
182
183; Function Attrs: norecurse nounwind
184define void @dpConv2sw(double* nocapture readonly %a, i32* nocapture %b) {
185; CHECK-LABEL: dpConv2sw:
186; CHECK:       # %bb.0: # %entry
187; CHECK-NEXT:    lfd 0, 0(3)
188; CHECK-NEXT:    xscvdpsxws 0, 0
189; CHECK-NEXT:    stfiwx 0, 0, 4
190; CHECK-NEXT:    blr
191;
192; CHECK-PWR8-LABEL: dpConv2sw:
193; CHECK-PWR8:       # %bb.0: # %entry
194; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
195; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
196; CHECK-PWR8-NEXT:    stfiwx 0, 0, 4
197; CHECK-PWR8-NEXT:    blr
198entry:
199  %0 = load double, double* %a, align 8
200  %conv = fptosi double %0 to i32
201  store i32 %conv, i32* %b, align 4
202  ret void
203
204
205}
206
207; Function Attrs: norecurse nounwind
208define void @dpConv2shw(double* nocapture readonly %a, i16* nocapture %b) {
209; CHECK-LABEL: dpConv2shw:
210; CHECK:       # %bb.0: # %entry
211; CHECK-NEXT:    lfd 0, 0(3)
212; CHECK-NEXT:    xscvdpsxws 0, 0
213; CHECK-NEXT:    stxsihx 0, 0, 4
214; CHECK-NEXT:    blr
215;
216; CHECK-PWR8-LABEL: dpConv2shw:
217; CHECK-PWR8:       # %bb.0: # %entry
218; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
219; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
220; CHECK-PWR8-NEXT:    mffprwz 3, 0
221; CHECK-PWR8-NEXT:    sth 3, 0(4)
222; CHECK-PWR8-NEXT:    blr
223entry:
224  %0 = load double, double* %a, align 8
225  %conv = fptosi double %0 to i16
226  store i16 %conv, i16* %b, align 2
227  ret void
228
229
230}
231
232; Function Attrs: norecurse nounwind
233define void @dpConv2sb(double* nocapture readonly %a, i8* nocapture %b) {
234; CHECK-LABEL: dpConv2sb:
235; CHECK:       # %bb.0: # %entry
236; CHECK-NEXT:    lfd 0, 0(3)
237; CHECK-NEXT:    xscvdpsxws 0, 0
238; CHECK-NEXT:    stxsibx 0, 0, 4
239; CHECK-NEXT:    blr
240;
241; CHECK-PWR8-LABEL: dpConv2sb:
242; CHECK-PWR8:       # %bb.0: # %entry
243; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
244; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
245; CHECK-PWR8-NEXT:    mffprwz 3, 0
246; CHECK-PWR8-NEXT:    stb 3, 0(4)
247; CHECK-PWR8-NEXT:    blr
248entry:
249  %0 = load double, double* %a, align 8
250  %conv = fptosi double %0 to i8
251  store i8 %conv, i8* %b, align 1
252  ret void
253
254
255}
256
257; Function Attrs: norecurse nounwind
258define void @spConv2sdw(float* nocapture readonly %a, i64* nocapture %b) {
259; CHECK-LABEL: spConv2sdw:
260; CHECK:       # %bb.0: # %entry
261; CHECK-NEXT:    lfs 0, 0(3)
262; CHECK-NEXT:    xscvdpsxds 2, 0
263; CHECK-NEXT:    stxsd 2, 0(4)
264; CHECK-NEXT:    blr
265;
266; CHECK-PWR8-LABEL: spConv2sdw:
267; CHECK-PWR8:       # %bb.0: # %entry
268; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
269; CHECK-PWR8-NEXT:    xscvdpsxds 0, 0
270; CHECK-PWR8-NEXT:    stxsdx 0, 0, 4
271; CHECK-PWR8-NEXT:    blr
272entry:
273  %0 = load float, float* %a, align 4
274  %conv = fptosi float %0 to i64
275  store i64 %conv, i64* %b, align 8
276  ret void
277
278
279}
280
281; Function Attrs: norecurse nounwind
282define void @spConv2sw(float* nocapture readonly %a, i32* nocapture %b) {
283; CHECK-LABEL: spConv2sw:
284; CHECK:       # %bb.0: # %entry
285; CHECK-NEXT:    lfs 0, 0(3)
286; CHECK-NEXT:    xscvdpsxws 0, 0
287; CHECK-NEXT:    stfiwx 0, 0, 4
288; CHECK-NEXT:    blr
289;
290; CHECK-PWR8-LABEL: spConv2sw:
291; CHECK-PWR8:       # %bb.0: # %entry
292; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
293; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
294; CHECK-PWR8-NEXT:    stfiwx 0, 0, 4
295; CHECK-PWR8-NEXT:    blr
296entry:
297  %0 = load float, float* %a, align 4
298  %conv = fptosi float %0 to i32
299  store i32 %conv, i32* %b, align 4
300  ret void
301
302
303}
304
305; Function Attrs: norecurse nounwind
306define void @spConv2shw(float* nocapture readonly %a, i16* nocapture %b) {
307; CHECK-LABEL: spConv2shw:
308; CHECK:       # %bb.0: # %entry
309; CHECK-NEXT:    lfs 0, 0(3)
310; CHECK-NEXT:    xscvdpsxws 0, 0
311; CHECK-NEXT:    stxsihx 0, 0, 4
312; CHECK-NEXT:    blr
313;
314; CHECK-PWR8-LABEL: spConv2shw:
315; CHECK-PWR8:       # %bb.0: # %entry
316; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
317; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
318; CHECK-PWR8-NEXT:    mffprwz 3, 0
319; CHECK-PWR8-NEXT:    sth 3, 0(4)
320; CHECK-PWR8-NEXT:    blr
321entry:
322  %0 = load float, float* %a, align 4
323  %conv = fptosi float %0 to i16
324  store i16 %conv, i16* %b, align 2
325  ret void
326
327
328}
329
330; Function Attrs: norecurse nounwind
331define void @spConv2sb(float* nocapture readonly %a, i8* nocapture %b) {
332; CHECK-LABEL: spConv2sb:
333; CHECK:       # %bb.0: # %entry
334; CHECK-NEXT:    lfs 0, 0(3)
335; CHECK-NEXT:    xscvdpsxws 0, 0
336; CHECK-NEXT:    stxsibx 0, 0, 4
337; CHECK-NEXT:    blr
338;
339; CHECK-PWR8-LABEL: spConv2sb:
340; CHECK-PWR8:       # %bb.0: # %entry
341; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
342; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
343; CHECK-PWR8-NEXT:    mffprwz 3, 0
344; CHECK-PWR8-NEXT:    stb 3, 0(4)
345; CHECK-PWR8-NEXT:    blr
346entry:
347  %0 = load float, float* %a, align 4
348  %conv = fptosi float %0 to i8
349  store i8 %conv, i8* %b, align 1
350  ret void
351
352
353}
354
355; Function Attrs: norecurse nounwind
356define void @dpConv2sdw_x(double* nocapture readonly %a, i64* nocapture %b,
357; CHECK-LABEL: dpConv2sdw_x:
358; CHECK:       # %bb.0: # %entry
359; CHECK-NEXT:    lfd 0, 0(3)
360; CHECK-NEXT:    sldi 3, 5, 3
361; CHECK-NEXT:    xscvdpsxds 0, 0
362; CHECK-NEXT:    stxsdx 0, 4, 3
363; CHECK-NEXT:    blr
364;
365; CHECK-PWR8-LABEL: dpConv2sdw_x:
366; CHECK-PWR8:       # %bb.0: # %entry
367; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
368; CHECK-PWR8-NEXT:    sldi 3, 5, 3
369; CHECK-PWR8-NEXT:    xscvdpsxds 0, 0
370; CHECK-PWR8-NEXT:    stxsdx 0, 4, 3
371; CHECK-PWR8-NEXT:    blr
372                          i32 signext %idx) {
373entry:
374  %0 = load double, double* %a, align 8
375  %conv = fptosi double %0 to i64
376  %idxprom = sext i32 %idx to i64
377  %arrayidx = getelementptr inbounds i64, i64* %b, i64 %idxprom
378  store i64 %conv, i64* %arrayidx, align 8
379  ret void
380
381
382}
383
384; Function Attrs: norecurse nounwind
385define void @dpConv2sw_x(double* nocapture readonly %a, i32* nocapture %b,
386; CHECK-LABEL: dpConv2sw_x:
387; CHECK:       # %bb.0: # %entry
388; CHECK-NEXT:    lfd 0, 0(3)
389; CHECK-NEXT:    sldi 3, 5, 2
390; CHECK-NEXT:    xscvdpsxws 0, 0
391; CHECK-NEXT:    stfiwx 0, 4, 3
392; CHECK-NEXT:    blr
393;
394; CHECK-PWR8-LABEL: dpConv2sw_x:
395; CHECK-PWR8:       # %bb.0: # %entry
396; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
397; CHECK-PWR8-NEXT:    sldi 3, 5, 2
398; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
399; CHECK-PWR8-NEXT:    stfiwx 0, 4, 3
400; CHECK-PWR8-NEXT:    blr
401                          i32 signext %idx) {
402entry:
403  %0 = load double, double* %a, align 8
404  %conv = fptosi double %0 to i32
405  %idxprom = sext i32 %idx to i64
406  %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom
407  store i32 %conv, i32* %arrayidx, align 4
408  ret void
409
410
411}
412
413; Function Attrs: norecurse nounwind
414define void @dpConv2shw_x(double* nocapture readonly %a, i16* nocapture %b,
415; CHECK-LABEL: dpConv2shw_x:
416; CHECK:       # %bb.0: # %entry
417; CHECK-NEXT:    lfd 0, 0(3)
418; CHECK-NEXT:    sldi 3, 5, 1
419; CHECK-NEXT:    xscvdpsxws 0, 0
420; CHECK-NEXT:    stxsihx 0, 4, 3
421; CHECK-NEXT:    blr
422;
423; CHECK-PWR8-LABEL: dpConv2shw_x:
424; CHECK-PWR8:       # %bb.0: # %entry
425; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
426; CHECK-PWR8-NEXT:    sldi 5, 5, 1
427; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
428; CHECK-PWR8-NEXT:    mffprwz 3, 0
429; CHECK-PWR8-NEXT:    sthx 3, 4, 5
430; CHECK-PWR8-NEXT:    blr
431                          i32 signext %idx) {
432entry:
433  %0 = load double, double* %a, align 8
434  %conv = fptosi double %0 to i16
435  %idxprom = sext i32 %idx to i64
436  %arrayidx = getelementptr inbounds i16, i16* %b, i64 %idxprom
437  store i16 %conv, i16* %arrayidx, align 2
438  ret void
439
440
441}
442
443; Function Attrs: norecurse nounwind
444define void @dpConv2sb_x(double* nocapture readonly %a, i8* nocapture %b,
445; CHECK-LABEL: dpConv2sb_x:
446; CHECK:       # %bb.0: # %entry
447; CHECK-NEXT:    lfd 0, 0(3)
448; CHECK-NEXT:    xscvdpsxws 0, 0
449; CHECK-NEXT:    stxsibx 0, 4, 5
450; CHECK-NEXT:    blr
451;
452; CHECK-PWR8-LABEL: dpConv2sb_x:
453; CHECK-PWR8:       # %bb.0: # %entry
454; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
455; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
456; CHECK-PWR8-NEXT:    mffprwz 3, 0
457; CHECK-PWR8-NEXT:    stbx 3, 4, 5
458; CHECK-PWR8-NEXT:    blr
459                          i32 signext %idx) {
460entry:
461  %0 = load double, double* %a, align 8
462  %conv = fptosi double %0 to i8
463  %idxprom = sext i32 %idx to i64
464  %arrayidx = getelementptr inbounds i8, i8* %b, i64 %idxprom
465  store i8 %conv, i8* %arrayidx, align 1
466  ret void
467
468
469}
470
471; Function Attrs: norecurse nounwind
472define void @spConv2sdw_x(float* nocapture readonly %a, i64* nocapture %b,
473; CHECK-LABEL: spConv2sdw_x:
474; CHECK:       # %bb.0: # %entry
475; CHECK-NEXT:    lfs 0, 0(3)
476; CHECK-NEXT:    xscvdpsxds 0, 0
477; CHECK-NEXT:    sldi 5, 5, 3
478; CHECK-NEXT:    stxsdx 0, 4, 5
479; CHECK-NEXT:    blr
480;
481; CHECK-PWR8-LABEL: spConv2sdw_x:
482; CHECK-PWR8:       # %bb.0: # %entry
483; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
484; CHECK-PWR8-NEXT:    sldi 3, 5, 3
485; CHECK-PWR8-NEXT:    xscvdpsxds 0, 0
486; CHECK-PWR8-NEXT:    stxsdx 0, 4, 3
487; CHECK-PWR8-NEXT:    blr
488                          i32 signext %idx) {
489entry:
490  %0 = load float, float* %a, align 4
491  %conv = fptosi float %0 to i64
492  %idxprom = sext i32 %idx to i64
493  %arrayidx = getelementptr inbounds i64, i64* %b, i64 %idxprom
494  store i64 %conv, i64* %arrayidx, align 8
495  ret void
496
497
498}
499
500; Function Attrs: norecurse nounwind
501define void @spConv2sw_x(float* nocapture readonly %a, i32* nocapture %b,
502; CHECK-LABEL: spConv2sw_x:
503; CHECK:       # %bb.0: # %entry
504; CHECK-NEXT:    lfs 0, 0(3)
505; CHECK-NEXT:    xscvdpsxws 0, 0
506; CHECK-NEXT:    sldi 5, 5, 2
507; CHECK-NEXT:    stfiwx 0, 4, 5
508; CHECK-NEXT:    blr
509;
510; CHECK-PWR8-LABEL: spConv2sw_x:
511; CHECK-PWR8:       # %bb.0: # %entry
512; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
513; CHECK-PWR8-NEXT:    sldi 3, 5, 2
514; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
515; CHECK-PWR8-NEXT:    stfiwx 0, 4, 3
516; CHECK-PWR8-NEXT:    blr
517                          i32 signext %idx) {
518entry:
519  %0 = load float, float* %a, align 4
520  %conv = fptosi float %0 to i32
521  %idxprom = sext i32 %idx to i64
522  %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom
523  store i32 %conv, i32* %arrayidx, align 4
524  ret void
525
526
527}
528
529; Function Attrs: norecurse nounwind
530define void @spConv2shw_x(float* nocapture readonly %a, i16* nocapture %b,
531; CHECK-LABEL: spConv2shw_x:
532; CHECK:       # %bb.0: # %entry
533; CHECK-NEXT:    lfs 0, 0(3)
534; CHECK-NEXT:    xscvdpsxws 0, 0
535; CHECK-NEXT:    sldi 5, 5, 1
536; CHECK-NEXT:    stxsihx 0, 4, 5
537; CHECK-NEXT:    blr
538;
539; CHECK-PWR8-LABEL: spConv2shw_x:
540; CHECK-PWR8:       # %bb.0: # %entry
541; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
542; CHECK-PWR8-NEXT:    sldi 5, 5, 1
543; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
544; CHECK-PWR8-NEXT:    mffprwz 3, 0
545; CHECK-PWR8-NEXT:    sthx 3, 4, 5
546; CHECK-PWR8-NEXT:    blr
547                          i32 signext %idx) {
548entry:
549  %0 = load float, float* %a, align 4
550  %conv = fptosi float %0 to i16
551  %idxprom = sext i32 %idx to i64
552  %arrayidx = getelementptr inbounds i16, i16* %b, i64 %idxprom
553  store i16 %conv, i16* %arrayidx, align 2
554  ret void
555
556
557}
558
559; Function Attrs: norecurse nounwind
560define void @spConv2sb_x(float* nocapture readonly %a, i8* nocapture %b,
561; CHECK-LABEL: spConv2sb_x:
562; CHECK:       # %bb.0: # %entry
563; CHECK-NEXT:    lfs 0, 0(3)
564; CHECK-NEXT:    xscvdpsxws 0, 0
565; CHECK-NEXT:    stxsibx 0, 4, 5
566; CHECK-NEXT:    blr
567;
568; CHECK-PWR8-LABEL: spConv2sb_x:
569; CHECK-PWR8:       # %bb.0: # %entry
570; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
571; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
572; CHECK-PWR8-NEXT:    mffprwz 3, 0
573; CHECK-PWR8-NEXT:    stbx 3, 4, 5
574; CHECK-PWR8-NEXT:    blr
575                          i32 signext %idx) {
576entry:
577  %0 = load float, float* %a, align 4
578  %conv = fptosi float %0 to i8
579  %idxprom = sext i32 %idx to i64
580  %arrayidx = getelementptr inbounds i8, i8* %b, i64 %idxprom
581  store i8 %conv, i8* %arrayidx, align 1
582  ret void
583
584
585}
586
587; ==========================================
588; Tests for store of fp_to_uint converstions
589; ==========================================
590
591; Function Attrs: norecurse nounwind
592define void @dpConv2udw(double* nocapture readonly %a, i64* nocapture %b) {
593; CHECK-LABEL: dpConv2udw:
594; CHECK:       # %bb.0: # %entry
595; CHECK-NEXT:    lfd 0, 0(3)
596; CHECK-NEXT:    xscvdpuxds 2, 0
597; CHECK-NEXT:    stxsd 2, 0(4)
598; CHECK-NEXT:    blr
599;
600; CHECK-PWR8-LABEL: dpConv2udw:
601; CHECK-PWR8:       # %bb.0: # %entry
602; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
603; CHECK-PWR8-NEXT:    xscvdpuxds 0, 0
604; CHECK-PWR8-NEXT:    stxsdx 0, 0, 4
605; CHECK-PWR8-NEXT:    blr
606entry:
607  %0 = load double, double* %a, align 8
608  %conv = fptoui double %0 to i64
609  store i64 %conv, i64* %b, align 8
610  ret void
611
612
613}
614
615; Function Attrs: norecurse nounwind
616define void @dpConv2uw(double* nocapture readonly %a, i32* nocapture %b) {
617; CHECK-LABEL: dpConv2uw:
618; CHECK:       # %bb.0: # %entry
619; CHECK-NEXT:    lfd 0, 0(3)
620; CHECK-NEXT:    xscvdpuxws 0, 0
621; CHECK-NEXT:    stfiwx 0, 0, 4
622; CHECK-NEXT:    blr
623;
624; CHECK-PWR8-LABEL: dpConv2uw:
625; CHECK-PWR8:       # %bb.0: # %entry
626; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
627; CHECK-PWR8-NEXT:    xscvdpuxws 0, 0
628; CHECK-PWR8-NEXT:    stfiwx 0, 0, 4
629; CHECK-PWR8-NEXT:    blr
630entry:
631  %0 = load double, double* %a, align 8
632  %conv = fptoui double %0 to i32
633  store i32 %conv, i32* %b, align 4
634  ret void
635
636
637}
638
639; Function Attrs: norecurse nounwind
640define void @dpConv2uhw(double* nocapture readonly %a, i16* nocapture %b) {
641; CHECK-LABEL: dpConv2uhw:
642; CHECK:       # %bb.0: # %entry
643; CHECK-NEXT:    lfd 0, 0(3)
644; CHECK-NEXT:    xscvdpuxws 0, 0
645; CHECK-NEXT:    stxsihx 0, 0, 4
646; CHECK-NEXT:    blr
647;
648; CHECK-PWR8-LABEL: dpConv2uhw:
649; CHECK-PWR8:       # %bb.0: # %entry
650; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
651; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
652; CHECK-PWR8-NEXT:    mffprwz 3, 0
653; CHECK-PWR8-NEXT:    sth 3, 0(4)
654; CHECK-PWR8-NEXT:    blr
655entry:
656  %0 = load double, double* %a, align 8
657  %conv = fptoui double %0 to i16
658  store i16 %conv, i16* %b, align 2
659  ret void
660
661
662}
663
664; Function Attrs: norecurse nounwind
665define void @dpConv2ub(double* nocapture readonly %a, i8* nocapture %b) {
666; CHECK-LABEL: dpConv2ub:
667; CHECK:       # %bb.0: # %entry
668; CHECK-NEXT:    lfd 0, 0(3)
669; CHECK-NEXT:    xscvdpuxws 0, 0
670; CHECK-NEXT:    stxsibx 0, 0, 4
671; CHECK-NEXT:    blr
672;
673; CHECK-PWR8-LABEL: dpConv2ub:
674; CHECK-PWR8:       # %bb.0: # %entry
675; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
676; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
677; CHECK-PWR8-NEXT:    mffprwz 3, 0
678; CHECK-PWR8-NEXT:    stb 3, 0(4)
679; CHECK-PWR8-NEXT:    blr
680entry:
681  %0 = load double, double* %a, align 8
682  %conv = fptoui double %0 to i8
683  store i8 %conv, i8* %b, align 1
684  ret void
685
686
687}
688
689; Function Attrs: norecurse nounwind
690define void @spConv2udw(float* nocapture readonly %a, i64* nocapture %b) {
691; CHECK-LABEL: spConv2udw:
692; CHECK:       # %bb.0: # %entry
693; CHECK-NEXT:    lfs 0, 0(3)
694; CHECK-NEXT:    xscvdpuxds 2, 0
695; CHECK-NEXT:    stxsd 2, 0(4)
696; CHECK-NEXT:    blr
697;
698; CHECK-PWR8-LABEL: spConv2udw:
699; CHECK-PWR8:       # %bb.0: # %entry
700; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
701; CHECK-PWR8-NEXT:    xscvdpuxds 0, 0
702; CHECK-PWR8-NEXT:    stxsdx 0, 0, 4
703; CHECK-PWR8-NEXT:    blr
704entry:
705  %0 = load float, float* %a, align 4
706  %conv = fptoui float %0 to i64
707  store i64 %conv, i64* %b, align 8
708  ret void
709
710
711}
712
713; Function Attrs: norecurse nounwind
714define void @spConv2uw(float* nocapture readonly %a, i32* nocapture %b) {
715; CHECK-LABEL: spConv2uw:
716; CHECK:       # %bb.0: # %entry
717; CHECK-NEXT:    lfs 0, 0(3)
718; CHECK-NEXT:    xscvdpuxws 0, 0
719; CHECK-NEXT:    stfiwx 0, 0, 4
720; CHECK-NEXT:    blr
721;
722; CHECK-PWR8-LABEL: spConv2uw:
723; CHECK-PWR8:       # %bb.0: # %entry
724; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
725; CHECK-PWR8-NEXT:    xscvdpuxws 0, 0
726; CHECK-PWR8-NEXT:    stfiwx 0, 0, 4
727; CHECK-PWR8-NEXT:    blr
728entry:
729  %0 = load float, float* %a, align 4
730  %conv = fptoui float %0 to i32
731  store i32 %conv, i32* %b, align 4
732  ret void
733
734
735}
736
737; Function Attrs: norecurse nounwind
738define void @spConv2uhw(float* nocapture readonly %a, i16* nocapture %b) {
739; CHECK-LABEL: spConv2uhw:
740; CHECK:       # %bb.0: # %entry
741; CHECK-NEXT:    lfs 0, 0(3)
742; CHECK-NEXT:    xscvdpuxws 0, 0
743; CHECK-NEXT:    stxsihx 0, 0, 4
744; CHECK-NEXT:    blr
745;
746; CHECK-PWR8-LABEL: spConv2uhw:
747; CHECK-PWR8:       # %bb.0: # %entry
748; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
749; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
750; CHECK-PWR8-NEXT:    mffprwz 3, 0
751; CHECK-PWR8-NEXT:    sth 3, 0(4)
752; CHECK-PWR8-NEXT:    blr
753entry:
754  %0 = load float, float* %a, align 4
755  %conv = fptoui float %0 to i16
756  store i16 %conv, i16* %b, align 2
757  ret void
758
759
760}
761
762; Function Attrs: norecurse nounwind
763define void @spConv2ub(float* nocapture readonly %a, i8* nocapture %b) {
764; CHECK-LABEL: spConv2ub:
765; CHECK:       # %bb.0: # %entry
766; CHECK-NEXT:    lfs 0, 0(3)
767; CHECK-NEXT:    xscvdpuxws 0, 0
768; CHECK-NEXT:    stxsibx 0, 0, 4
769; CHECK-NEXT:    blr
770;
771; CHECK-PWR8-LABEL: spConv2ub:
772; CHECK-PWR8:       # %bb.0: # %entry
773; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
774; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
775; CHECK-PWR8-NEXT:    mffprwz 3, 0
776; CHECK-PWR8-NEXT:    stb 3, 0(4)
777; CHECK-PWR8-NEXT:    blr
778entry:
779  %0 = load float, float* %a, align 4
780  %conv = fptoui float %0 to i8
781  store i8 %conv, i8* %b, align 1
782  ret void
783
784
785}
786
787; Function Attrs: norecurse nounwind
788define void @dpConv2udw_x(double* nocapture readonly %a, i64* nocapture %b,
789; CHECK-LABEL: dpConv2udw_x:
790; CHECK:       # %bb.0: # %entry
791; CHECK-NEXT:    lfd 0, 0(3)
792; CHECK-NEXT:    sldi 3, 5, 3
793; CHECK-NEXT:    xscvdpuxds 0, 0
794; CHECK-NEXT:    stxsdx 0, 4, 3
795; CHECK-NEXT:    blr
796;
797; CHECK-PWR8-LABEL: dpConv2udw_x:
798; CHECK-PWR8:       # %bb.0: # %entry
799; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
800; CHECK-PWR8-NEXT:    sldi 3, 5, 3
801; CHECK-PWR8-NEXT:    xscvdpuxds 0, 0
802; CHECK-PWR8-NEXT:    stxsdx 0, 4, 3
803; CHECK-PWR8-NEXT:    blr
804                          i32 zeroext %idx) {
805entry:
806  %0 = load double, double* %a, align 8
807  %conv = fptoui double %0 to i64
808  %idxprom = zext i32 %idx to i64
809  %arrayidx = getelementptr inbounds i64, i64* %b, i64 %idxprom
810  store i64 %conv, i64* %arrayidx, align 8
811  ret void
812
813
814}
815
816; Function Attrs: norecurse nounwind
817define void @dpConv2uw_x(double* nocapture readonly %a, i32* nocapture %b,
818; CHECK-LABEL: dpConv2uw_x:
819; CHECK:       # %bb.0: # %entry
820; CHECK-NEXT:    lfd 0, 0(3)
821; CHECK-NEXT:    sldi 3, 5, 2
822; CHECK-NEXT:    xscvdpuxws 0, 0
823; CHECK-NEXT:    stfiwx 0, 4, 3
824; CHECK-NEXT:    blr
825;
826; CHECK-PWR8-LABEL: dpConv2uw_x:
827; CHECK-PWR8:       # %bb.0: # %entry
828; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
829; CHECK-PWR8-NEXT:    sldi 3, 5, 2
830; CHECK-PWR8-NEXT:    xscvdpuxws 0, 0
831; CHECK-PWR8-NEXT:    stfiwx 0, 4, 3
832; CHECK-PWR8-NEXT:    blr
833                          i32 zeroext %idx) {
834entry:
835  %0 = load double, double* %a, align 8
836  %conv = fptoui double %0 to i32
837  %idxprom = zext i32 %idx to i64
838  %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom
839  store i32 %conv, i32* %arrayidx, align 4
840  ret void
841
842
843}
844
845; Function Attrs: norecurse nounwind
846define void @dpConv2uhw_x(double* nocapture readonly %a, i16* nocapture %b,
847; CHECK-LABEL: dpConv2uhw_x:
848; CHECK:       # %bb.0: # %entry
849; CHECK-NEXT:    lfd 0, 0(3)
850; CHECK-NEXT:    sldi 3, 5, 1
851; CHECK-NEXT:    xscvdpuxws 0, 0
852; CHECK-NEXT:    stxsihx 0, 4, 3
853; CHECK-NEXT:    blr
854;
855; CHECK-PWR8-LABEL: dpConv2uhw_x:
856; CHECK-PWR8:       # %bb.0: # %entry
857; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
858; CHECK-PWR8-NEXT:    sldi 5, 5, 1
859; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
860; CHECK-PWR8-NEXT:    mffprwz 3, 0
861; CHECK-PWR8-NEXT:    sthx 3, 4, 5
862; CHECK-PWR8-NEXT:    blr
863                          i32 zeroext %idx) {
864entry:
865  %0 = load double, double* %a, align 8
866  %conv = fptoui double %0 to i16
867  %idxprom = zext i32 %idx to i64
868  %arrayidx = getelementptr inbounds i16, i16* %b, i64 %idxprom
869  store i16 %conv, i16* %arrayidx, align 2
870  ret void
871
872
873}
874
875; Function Attrs: norecurse nounwind
876define void @dpConv2ub_x(double* nocapture readonly %a, i8* nocapture %b,
877; CHECK-LABEL: dpConv2ub_x:
878; CHECK:       # %bb.0: # %entry
879; CHECK-NEXT:    lfd 0, 0(3)
880; CHECK-NEXT:    xscvdpuxws 0, 0
881; CHECK-NEXT:    stxsibx 0, 4, 5
882; CHECK-NEXT:    blr
883;
884; CHECK-PWR8-LABEL: dpConv2ub_x:
885; CHECK-PWR8:       # %bb.0: # %entry
886; CHECK-PWR8-NEXT:    lfdx 0, 0, 3
887; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
888; CHECK-PWR8-NEXT:    mffprwz 3, 0
889; CHECK-PWR8-NEXT:    stbx 3, 4, 5
890; CHECK-PWR8-NEXT:    blr
891                          i32 zeroext %idx) {
892entry:
893  %0 = load double, double* %a, align 8
894  %conv = fptoui double %0 to i8
895  %idxprom = zext i32 %idx to i64
896  %arrayidx = getelementptr inbounds i8, i8* %b, i64 %idxprom
897  store i8 %conv, i8* %arrayidx, align 1
898  ret void
899
900
901}
902
903; Function Attrs: norecurse nounwind
904define void @spConv2udw_x(float* nocapture readonly %a, i64* nocapture %b,
905; CHECK-LABEL: spConv2udw_x:
906; CHECK:       # %bb.0: # %entry
907; CHECK-NEXT:    lfs 0, 0(3)
908; CHECK-NEXT:    xscvdpuxds 0, 0
909; CHECK-NEXT:    sldi 5, 5, 3
910; CHECK-NEXT:    stxsdx 0, 4, 5
911; CHECK-NEXT:    blr
912;
913; CHECK-PWR8-LABEL: spConv2udw_x:
914; CHECK-PWR8:       # %bb.0: # %entry
915; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
916; CHECK-PWR8-NEXT:    sldi 3, 5, 3
917; CHECK-PWR8-NEXT:    xscvdpuxds 0, 0
918; CHECK-PWR8-NEXT:    stxsdx 0, 4, 3
919; CHECK-PWR8-NEXT:    blr
920                          i32 zeroext %idx) {
921entry:
922  %0 = load float, float* %a, align 4
923  %conv = fptoui float %0 to i64
924  %idxprom = zext i32 %idx to i64
925  %arrayidx = getelementptr inbounds i64, i64* %b, i64 %idxprom
926  store i64 %conv, i64* %arrayidx, align 8
927  ret void
928
929
930}
931
932; Function Attrs: norecurse nounwind
933define void @spConv2uw_x(float* nocapture readonly %a, i32* nocapture %b,
934; CHECK-LABEL: spConv2uw_x:
935; CHECK:       # %bb.0: # %entry
936; CHECK-NEXT:    lfs 0, 0(3)
937; CHECK-NEXT:    xscvdpuxws 0, 0
938; CHECK-NEXT:    sldi 5, 5, 2
939; CHECK-NEXT:    stfiwx 0, 4, 5
940; CHECK-NEXT:    blr
941;
942; CHECK-PWR8-LABEL: spConv2uw_x:
943; CHECK-PWR8:       # %bb.0: # %entry
944; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
945; CHECK-PWR8-NEXT:    sldi 3, 5, 2
946; CHECK-PWR8-NEXT:    xscvdpuxws 0, 0
947; CHECK-PWR8-NEXT:    stfiwx 0, 4, 3
948; CHECK-PWR8-NEXT:    blr
949                          i32 zeroext %idx) {
950entry:
951  %0 = load float, float* %a, align 4
952  %conv = fptoui float %0 to i32
953  %idxprom = zext i32 %idx to i64
954  %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom
955  store i32 %conv, i32* %arrayidx, align 4
956  ret void
957
958
959}
960
961; Function Attrs: norecurse nounwind
962define void @spConv2uhw_x(float* nocapture readonly %a, i16* nocapture %b,
963; CHECK-LABEL: spConv2uhw_x:
964; CHECK:       # %bb.0: # %entry
965; CHECK-NEXT:    lfs 0, 0(3)
966; CHECK-NEXT:    xscvdpuxws 0, 0
967; CHECK-NEXT:    sldi 5, 5, 1
968; CHECK-NEXT:    stxsihx 0, 4, 5
969; CHECK-NEXT:    blr
970;
971; CHECK-PWR8-LABEL: spConv2uhw_x:
972; CHECK-PWR8:       # %bb.0: # %entry
973; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
974; CHECK-PWR8-NEXT:    sldi 5, 5, 1
975; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
976; CHECK-PWR8-NEXT:    mffprwz 3, 0
977; CHECK-PWR8-NEXT:    sthx 3, 4, 5
978; CHECK-PWR8-NEXT:    blr
979                          i32 zeroext %idx) {
980entry:
981  %0 = load float, float* %a, align 4
982  %conv = fptoui float %0 to i16
983  %idxprom = zext i32 %idx to i64
984  %arrayidx = getelementptr inbounds i16, i16* %b, i64 %idxprom
985  store i16 %conv, i16* %arrayidx, align 2
986  ret void
987
988
989}
990
991; Function Attrs: norecurse nounwind
992define void @spConv2ub_x(float* nocapture readonly %a, i8* nocapture %b,
993; CHECK-LABEL: spConv2ub_x:
994; CHECK:       # %bb.0: # %entry
995; CHECK-NEXT:    lfs 0, 0(3)
996; CHECK-NEXT:    xscvdpuxws 0, 0
997; CHECK-NEXT:    stxsibx 0, 4, 5
998; CHECK-NEXT:    blr
999;
1000; CHECK-PWR8-LABEL: spConv2ub_x:
1001; CHECK-PWR8:       # %bb.0: # %entry
1002; CHECK-PWR8-NEXT:    lfsx 0, 0, 3
1003; CHECK-PWR8-NEXT:    xscvdpsxws 0, 0
1004; CHECK-PWR8-NEXT:    mffprwz 3, 0
1005; CHECK-PWR8-NEXT:    stbx 3, 4, 5
1006; CHECK-PWR8-NEXT:    blr
1007                          i32 zeroext %idx) {
1008entry:
1009  %0 = load float, float* %a, align 4
1010  %conv = fptoui float %0 to i8
1011  %idxprom = zext i32 %idx to i64
1012  %arrayidx = getelementptr inbounds i8, i8* %b, i64 %idxprom
1013  store i8 %conv, i8* %arrayidx, align 1
1014  ret void
1015
1016
1017}
1018