1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
3; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \
4; RUN:   --check-prefix=P8
5; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
6; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s
7; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -mattr=-hard-float \
8; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \
9; RUN:   --check-prefix=SOFT
10
11; Tests for various operations on half precison float. Much of the test is
12; copied from test/CodeGen/X86/half.ll.
13define dso_local double @loadd(i16* nocapture readonly %a) local_unnamed_addr #0 {
14; P8-LABEL: loadd:
15; P8:       # %bb.0: # %entry
16; P8-NEXT:    mflr r0
17; P8-NEXT:    std r0, 16(r1)
18; P8-NEXT:    stdu r1, -32(r1)
19; P8-NEXT:    lhz r3, 2(r3)
20; P8-NEXT:    bl __gnu_h2f_ieee
21; P8-NEXT:    nop
22; P8-NEXT:    addi r1, r1, 32
23; P8-NEXT:    ld r0, 16(r1)
24; P8-NEXT:    mtlr r0
25; P8-NEXT:    blr
26;
27; CHECK-LABEL: loadd:
28; CHECK:       # %bb.0: # %entry
29; CHECK-NEXT:    addi r3, r3, 2
30; CHECK-NEXT:    lxsihzx f0, 0, r3
31; CHECK-NEXT:    xscvhpdp f1, f0
32; CHECK-NEXT:    blr
33;
34; SOFT-LABEL: loadd:
35; SOFT:       # %bb.0: # %entry
36; SOFT-NEXT:    mflr r0
37; SOFT-NEXT:    std r0, 16(r1)
38; SOFT-NEXT:    stdu r1, -32(r1)
39; SOFT-NEXT:    lhz r3, 2(r3)
40; SOFT-NEXT:    bl __gnu_h2f_ieee
41; SOFT-NEXT:    nop
42; SOFT-NEXT:    bl __extendsfdf2
43; SOFT-NEXT:    nop
44; SOFT-NEXT:    addi r1, r1, 32
45; SOFT-NEXT:    ld r0, 16(r1)
46; SOFT-NEXT:    mtlr r0
47; SOFT-NEXT:    blr
48entry:
49  %arrayidx = getelementptr inbounds i16, i16* %a, i64 1
50  %0 = load i16, i16* %arrayidx, align 2
51  %1 = tail call double @llvm.convert.from.fp16.f64(i16 %0)
52  ret double %1
53}
54
55declare double @llvm.convert.from.fp16.f64(i16)
56
57define dso_local float @loadf(i16* nocapture readonly %a) local_unnamed_addr #0 {
58; P8-LABEL: loadf:
59; P8:       # %bb.0: # %entry
60; P8-NEXT:    mflr r0
61; P8-NEXT:    std r0, 16(r1)
62; P8-NEXT:    stdu r1, -32(r1)
63; P8-NEXT:    lhz r3, 2(r3)
64; P8-NEXT:    bl __gnu_h2f_ieee
65; P8-NEXT:    nop
66; P8-NEXT:    addi r1, r1, 32
67; P8-NEXT:    ld r0, 16(r1)
68; P8-NEXT:    mtlr r0
69; P8-NEXT:    blr
70;
71; CHECK-LABEL: loadf:
72; CHECK:       # %bb.0: # %entry
73; CHECK-NEXT:    addi r3, r3, 2
74; CHECK-NEXT:    lxsihzx f0, 0, r3
75; CHECK-NEXT:    xscvhpdp f1, f0
76; CHECK-NEXT:    blr
77;
78; SOFT-LABEL: loadf:
79; SOFT:       # %bb.0: # %entry
80; SOFT-NEXT:    mflr r0
81; SOFT-NEXT:    std r0, 16(r1)
82; SOFT-NEXT:    stdu r1, -32(r1)
83; SOFT-NEXT:    lhz r3, 2(r3)
84; SOFT-NEXT:    bl __gnu_h2f_ieee
85; SOFT-NEXT:    nop
86; SOFT-NEXT:    addi r1, r1, 32
87; SOFT-NEXT:    ld r0, 16(r1)
88; SOFT-NEXT:    mtlr r0
89; SOFT-NEXT:    blr
90entry:
91  %arrayidx = getelementptr inbounds i16, i16* %a, i64 1
92  %0 = load i16, i16* %arrayidx, align 2
93  %1 = tail call float @llvm.convert.from.fp16.f32(i16 %0)
94  ret float %1
95}
96
97declare float @llvm.convert.from.fp16.f32(i16)
98
99define dso_local void @stored(i16* nocapture %a, double %b) local_unnamed_addr #0 {
100; P8-LABEL: stored:
101; P8:       # %bb.0: # %entry
102; P8-NEXT:    mflr r0
103; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
104; P8-NEXT:    std r0, 16(r1)
105; P8-NEXT:    stdu r1, -48(r1)
106; P8-NEXT:    mr r30, r3
107; P8-NEXT:    bl __truncdfhf2
108; P8-NEXT:    nop
109; P8-NEXT:    sth r3, 0(r30)
110; P8-NEXT:    addi r1, r1, 48
111; P8-NEXT:    ld r0, 16(r1)
112; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
113; P8-NEXT:    mtlr r0
114; P8-NEXT:    blr
115;
116; CHECK-LABEL: stored:
117; CHECK:       # %bb.0: # %entry
118; CHECK-NEXT:    xscvdphp f0, f1
119; CHECK-NEXT:    stxsihx f0, 0, r3
120; CHECK-NEXT:    blr
121;
122; SOFT-LABEL: stored:
123; SOFT:       # %bb.0: # %entry
124; SOFT-NEXT:    mflr r0
125; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
126; SOFT-NEXT:    std r0, 16(r1)
127; SOFT-NEXT:    stdu r1, -48(r1)
128; SOFT-NEXT:    mr r30, r3
129; SOFT-NEXT:    mr r3, r4
130; SOFT-NEXT:    bl __truncdfhf2
131; SOFT-NEXT:    nop
132; SOFT-NEXT:    clrldi r3, r3, 48
133; SOFT-NEXT:    bl __gnu_h2f_ieee
134; SOFT-NEXT:    nop
135; SOFT-NEXT:    bl __gnu_f2h_ieee
136; SOFT-NEXT:    nop
137; SOFT-NEXT:    sth r3, 0(r30)
138; SOFT-NEXT:    addi r1, r1, 48
139; SOFT-NEXT:    ld r0, 16(r1)
140; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
141; SOFT-NEXT:    mtlr r0
142; SOFT-NEXT:    blr
143entry:
144  %0 = tail call i16 @llvm.convert.to.fp16.f64(double %b)
145  store i16 %0, i16* %a, align 2
146  ret void
147}
148
149declare i16 @llvm.convert.to.fp16.f64(double)
150
151define dso_local void @storef(i16* nocapture %a, float %b) local_unnamed_addr #0 {
152; P8-LABEL: storef:
153; P8:       # %bb.0: # %entry
154; P8-NEXT:    mflr r0
155; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
156; P8-NEXT:    std r0, 16(r1)
157; P8-NEXT:    stdu r1, -48(r1)
158; P8-NEXT:    mr r30, r3
159; P8-NEXT:    bl __gnu_f2h_ieee
160; P8-NEXT:    nop
161; P8-NEXT:    sth r3, 0(r30)
162; P8-NEXT:    addi r1, r1, 48
163; P8-NEXT:    ld r0, 16(r1)
164; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
165; P8-NEXT:    mtlr r0
166; P8-NEXT:    blr
167;
168; CHECK-LABEL: storef:
169; CHECK:       # %bb.0: # %entry
170; CHECK-NEXT:    xscvdphp f0, f1
171; CHECK-NEXT:    stxsihx f0, 0, r3
172; CHECK-NEXT:    blr
173;
174; SOFT-LABEL: storef:
175; SOFT:       # %bb.0: # %entry
176; SOFT-NEXT:    mflr r0
177; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
178; SOFT-NEXT:    std r0, 16(r1)
179; SOFT-NEXT:    stdu r1, -48(r1)
180; SOFT-NEXT:    mr r30, r3
181; SOFT-NEXT:    clrldi r3, r4, 32
182; SOFT-NEXT:    bl __gnu_f2h_ieee
183; SOFT-NEXT:    nop
184; SOFT-NEXT:    clrldi r3, r3, 48
185; SOFT-NEXT:    bl __gnu_h2f_ieee
186; SOFT-NEXT:    nop
187; SOFT-NEXT:    bl __gnu_f2h_ieee
188; SOFT-NEXT:    nop
189; SOFT-NEXT:    sth r3, 0(r30)
190; SOFT-NEXT:    addi r1, r1, 48
191; SOFT-NEXT:    ld r0, 16(r1)
192; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
193; SOFT-NEXT:    mtlr r0
194; SOFT-NEXT:    blr
195entry:
196  %0 = tail call i16 @llvm.convert.to.fp16.f32(float %b)
197  store i16 %0, i16* %a, align 2
198  ret void
199}
200
201declare i16 @llvm.convert.to.fp16.f32(float)
202define void @test_load_store(half* %in, half* %out) #0 {
203; P8-LABEL: test_load_store:
204; P8:       # %bb.0:
205; P8-NEXT:    lhz r3, 0(r3)
206; P8-NEXT:    sth r3, 0(r4)
207; P8-NEXT:    blr
208;
209; CHECK-LABEL: test_load_store:
210; CHECK:       # %bb.0:
211; CHECK-NEXT:    lhz r3, 0(r3)
212; CHECK-NEXT:    sth r3, 0(r4)
213; CHECK-NEXT:    blr
214;
215; SOFT-LABEL: test_load_store:
216; SOFT:       # %bb.0:
217; SOFT-NEXT:    mflr r0
218; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
219; SOFT-NEXT:    std r0, 16(r1)
220; SOFT-NEXT:    stdu r1, -48(r1)
221; SOFT-NEXT:    lhz r3, 0(r3)
222; SOFT-NEXT:    mr r30, r4
223; SOFT-NEXT:    bl __gnu_h2f_ieee
224; SOFT-NEXT:    nop
225; SOFT-NEXT:    bl __gnu_f2h_ieee
226; SOFT-NEXT:    nop
227; SOFT-NEXT:    sth r3, 0(r30)
228; SOFT-NEXT:    addi r1, r1, 48
229; SOFT-NEXT:    ld r0, 16(r1)
230; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
231; SOFT-NEXT:    mtlr r0
232; SOFT-NEXT:    blr
233  %val = load half, half* %in
234  store half %val, half* %out
235  ret void
236}
237define i16 @test_bitcast_from_half(half* %addr) #0 {
238; P8-LABEL: test_bitcast_from_half:
239; P8:       # %bb.0:
240; P8-NEXT:    lhz r3, 0(r3)
241; P8-NEXT:    blr
242;
243; CHECK-LABEL: test_bitcast_from_half:
244; CHECK:       # %bb.0:
245; CHECK-NEXT:    lhz r3, 0(r3)
246; CHECK-NEXT:    blr
247;
248; SOFT-LABEL: test_bitcast_from_half:
249; SOFT:       # %bb.0:
250; SOFT-NEXT:    lhz r3, 0(r3)
251; SOFT-NEXT:    blr
252  %val = load half, half* %addr
253  %val_int = bitcast half %val to i16
254  ret i16 %val_int
255}
256define void @test_bitcast_to_half(half* %addr, i16 %in) #0 {
257; P8-LABEL: test_bitcast_to_half:
258; P8:       # %bb.0:
259; P8-NEXT:    sth r4, 0(r3)
260; P8-NEXT:    blr
261;
262; CHECK-LABEL: test_bitcast_to_half:
263; CHECK:       # %bb.0:
264; CHECK-NEXT:    sth r4, 0(r3)
265; CHECK-NEXT:    blr
266;
267; SOFT-LABEL: test_bitcast_to_half:
268; SOFT:       # %bb.0:
269; SOFT-NEXT:    sth r4, 0(r3)
270; SOFT-NEXT:    blr
271  %val_fp = bitcast i16 %in to half
272  store half %val_fp, half* %addr
273  ret void
274}
275define float @test_extend32(half* %addr) #0 {
276; P8-LABEL: test_extend32:
277; P8:       # %bb.0:
278; P8-NEXT:    mflr r0
279; P8-NEXT:    std r0, 16(r1)
280; P8-NEXT:    stdu r1, -32(r1)
281; P8-NEXT:    lhz r3, 0(r3)
282; P8-NEXT:    bl __gnu_h2f_ieee
283; P8-NEXT:    nop
284; P8-NEXT:    addi r1, r1, 32
285; P8-NEXT:    ld r0, 16(r1)
286; P8-NEXT:    mtlr r0
287; P8-NEXT:    blr
288;
289; CHECK-LABEL: test_extend32:
290; CHECK:       # %bb.0:
291; CHECK-NEXT:    lxsihzx f0, 0, r3
292; CHECK-NEXT:    xscvhpdp f1, f0
293; CHECK-NEXT:    blr
294;
295; SOFT-LABEL: test_extend32:
296; SOFT:       # %bb.0:
297; SOFT-NEXT:    mflr r0
298; SOFT-NEXT:    std r0, 16(r1)
299; SOFT-NEXT:    stdu r1, -32(r1)
300; SOFT-NEXT:    lhz r3, 0(r3)
301; SOFT-NEXT:    bl __gnu_h2f_ieee
302; SOFT-NEXT:    nop
303; SOFT-NEXT:    addi r1, r1, 32
304; SOFT-NEXT:    ld r0, 16(r1)
305; SOFT-NEXT:    mtlr r0
306; SOFT-NEXT:    blr
307  %val16 = load half, half* %addr
308  %val32 = fpext half %val16 to float
309  ret float %val32
310}
311define double @test_extend64(half* %addr) #0 {
312; P8-LABEL: test_extend64:
313; P8:       # %bb.0:
314; P8-NEXT:    mflr r0
315; P8-NEXT:    std r0, 16(r1)
316; P8-NEXT:    stdu r1, -32(r1)
317; P8-NEXT:    lhz r3, 0(r3)
318; P8-NEXT:    bl __gnu_h2f_ieee
319; P8-NEXT:    nop
320; P8-NEXT:    addi r1, r1, 32
321; P8-NEXT:    ld r0, 16(r1)
322; P8-NEXT:    mtlr r0
323; P8-NEXT:    blr
324;
325; CHECK-LABEL: test_extend64:
326; CHECK:       # %bb.0:
327; CHECK-NEXT:    lxsihzx f0, 0, r3
328; CHECK-NEXT:    xscvhpdp f1, f0
329; CHECK-NEXT:    blr
330;
331; SOFT-LABEL: test_extend64:
332; SOFT:       # %bb.0:
333; SOFT-NEXT:    mflr r0
334; SOFT-NEXT:    std r0, 16(r1)
335; SOFT-NEXT:    stdu r1, -32(r1)
336; SOFT-NEXT:    lhz r3, 0(r3)
337; SOFT-NEXT:    bl __gnu_h2f_ieee
338; SOFT-NEXT:    nop
339; SOFT-NEXT:    bl __extendsfdf2
340; SOFT-NEXT:    nop
341; SOFT-NEXT:    addi r1, r1, 32
342; SOFT-NEXT:    ld r0, 16(r1)
343; SOFT-NEXT:    mtlr r0
344; SOFT-NEXT:    blr
345  %val16 = load half, half* %addr
346  %val32 = fpext half %val16 to double
347  ret double %val32
348}
349define void @test_trunc32(float %in, half* %addr) #0 {
350; P8-LABEL: test_trunc32:
351; P8:       # %bb.0:
352; P8-NEXT:    mflr r0
353; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
354; P8-NEXT:    std r0, 16(r1)
355; P8-NEXT:    stdu r1, -48(r1)
356; P8-NEXT:    mr r30, r4
357; P8-NEXT:    bl __gnu_f2h_ieee
358; P8-NEXT:    nop
359; P8-NEXT:    sth r3, 0(r30)
360; P8-NEXT:    addi r1, r1, 48
361; P8-NEXT:    ld r0, 16(r1)
362; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
363; P8-NEXT:    mtlr r0
364; P8-NEXT:    blr
365;
366; CHECK-LABEL: test_trunc32:
367; CHECK:       # %bb.0:
368; CHECK-NEXT:    xscvdphp f0, f1
369; CHECK-NEXT:    stxsihx f0, 0, r4
370; CHECK-NEXT:    blr
371;
372; SOFT-LABEL: test_trunc32:
373; SOFT:       # %bb.0:
374; SOFT-NEXT:    mflr r0
375; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
376; SOFT-NEXT:    std r0, 16(r1)
377; SOFT-NEXT:    stdu r1, -48(r1)
378; SOFT-NEXT:    clrldi r3, r3, 32
379; SOFT-NEXT:    mr r30, r4
380; SOFT-NEXT:    bl __gnu_f2h_ieee
381; SOFT-NEXT:    nop
382; SOFT-NEXT:    clrldi r3, r3, 48
383; SOFT-NEXT:    bl __gnu_h2f_ieee
384; SOFT-NEXT:    nop
385; SOFT-NEXT:    bl __gnu_f2h_ieee
386; SOFT-NEXT:    nop
387; SOFT-NEXT:    sth r3, 0(r30)
388; SOFT-NEXT:    addi r1, r1, 48
389; SOFT-NEXT:    ld r0, 16(r1)
390; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
391; SOFT-NEXT:    mtlr r0
392; SOFT-NEXT:    blr
393  %val16 = fptrunc float %in to half
394  store half %val16, half* %addr
395  ret void
396}
397define void @test_trunc64(double %in, half* %addr) #0 {
398; P8-LABEL: test_trunc64:
399; P8:       # %bb.0:
400; P8-NEXT:    mflr r0
401; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
402; P8-NEXT:    std r0, 16(r1)
403; P8-NEXT:    stdu r1, -48(r1)
404; P8-NEXT:    mr r30, r4
405; P8-NEXT:    bl __truncdfhf2
406; P8-NEXT:    nop
407; P8-NEXT:    sth r3, 0(r30)
408; P8-NEXT:    addi r1, r1, 48
409; P8-NEXT:    ld r0, 16(r1)
410; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
411; P8-NEXT:    mtlr r0
412; P8-NEXT:    blr
413;
414; CHECK-LABEL: test_trunc64:
415; CHECK:       # %bb.0:
416; CHECK-NEXT:    xscvdphp f0, f1
417; CHECK-NEXT:    stxsihx f0, 0, r4
418; CHECK-NEXT:    blr
419;
420; SOFT-LABEL: test_trunc64:
421; SOFT:       # %bb.0:
422; SOFT-NEXT:    mflr r0
423; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
424; SOFT-NEXT:    std r0, 16(r1)
425; SOFT-NEXT:    stdu r1, -48(r1)
426; SOFT-NEXT:    mr r30, r4
427; SOFT-NEXT:    bl __truncdfhf2
428; SOFT-NEXT:    nop
429; SOFT-NEXT:    clrldi r3, r3, 48
430; SOFT-NEXT:    bl __gnu_h2f_ieee
431; SOFT-NEXT:    nop
432; SOFT-NEXT:    bl __gnu_f2h_ieee
433; SOFT-NEXT:    nop
434; SOFT-NEXT:    sth r3, 0(r30)
435; SOFT-NEXT:    addi r1, r1, 48
436; SOFT-NEXT:    ld r0, 16(r1)
437; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
438; SOFT-NEXT:    mtlr r0
439; SOFT-NEXT:    blr
440  %val16 = fptrunc double %in to half
441  store half %val16, half* %addr
442  ret void
443}
444define i64 @test_fptosi_i64(half* %p) #0 {
445; P8-LABEL: test_fptosi_i64:
446; P8:       # %bb.0:
447; P8-NEXT:    mflr r0
448; P8-NEXT:    std r0, 16(r1)
449; P8-NEXT:    stdu r1, -32(r1)
450; P8-NEXT:    lhz r3, 0(r3)
451; P8-NEXT:    bl __gnu_h2f_ieee
452; P8-NEXT:    nop
453; P8-NEXT:    xscvdpsxds f0, f1
454; P8-NEXT:    mffprd r3, f0
455; P8-NEXT:    addi r1, r1, 32
456; P8-NEXT:    ld r0, 16(r1)
457; P8-NEXT:    mtlr r0
458; P8-NEXT:    blr
459;
460; CHECK-LABEL: test_fptosi_i64:
461; CHECK:       # %bb.0:
462; CHECK-NEXT:    lhz r3, 0(r3)
463; CHECK-NEXT:    mtfprwz f0, r3
464; CHECK-NEXT:    xscvhpdp f0, f0
465; CHECK-NEXT:    xscvdpsxds f0, f0
466; CHECK-NEXT:    mffprd r3, f0
467; CHECK-NEXT:    blr
468;
469; SOFT-LABEL: test_fptosi_i64:
470; SOFT:       # %bb.0:
471; SOFT-NEXT:    mflr r0
472; SOFT-NEXT:    std r0, 16(r1)
473; SOFT-NEXT:    stdu r1, -32(r1)
474; SOFT-NEXT:    lhz r3, 0(r3)
475; SOFT-NEXT:    bl __gnu_h2f_ieee
476; SOFT-NEXT:    nop
477; SOFT-NEXT:    bl __fixsfdi
478; SOFT-NEXT:    nop
479; SOFT-NEXT:    addi r1, r1, 32
480; SOFT-NEXT:    ld r0, 16(r1)
481; SOFT-NEXT:    mtlr r0
482; SOFT-NEXT:    blr
483  %a = load half, half* %p, align 2
484  %r = fptosi half %a to i64
485  ret i64 %r
486}
487define void @test_sitofp_i64(i64 %a, half* %p) #0 {
488; P8-LABEL: test_sitofp_i64:
489; P8:       # %bb.0:
490; P8-NEXT:    mflr r0
491; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
492; P8-NEXT:    std r0, 16(r1)
493; P8-NEXT:    stdu r1, -48(r1)
494; P8-NEXT:    mtfprd f0, r3
495; P8-NEXT:    mr r30, r4
496; P8-NEXT:    xscvsxdsp f1, f0
497; P8-NEXT:    bl __gnu_f2h_ieee
498; P8-NEXT:    nop
499; P8-NEXT:    sth r3, 0(r30)
500; P8-NEXT:    addi r1, r1, 48
501; P8-NEXT:    ld r0, 16(r1)
502; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
503; P8-NEXT:    mtlr r0
504; P8-NEXT:    blr
505;
506; CHECK-LABEL: test_sitofp_i64:
507; CHECK:       # %bb.0:
508; CHECK-NEXT:    mtfprd f0, r3
509; CHECK-NEXT:    xscvsxdsp f0, f0
510; CHECK-NEXT:    xscvdphp f0, f0
511; CHECK-NEXT:    mffprwz r3, f0
512; CHECK-NEXT:    sth r3, 0(r4)
513; CHECK-NEXT:    blr
514;
515; SOFT-LABEL: test_sitofp_i64:
516; SOFT:       # %bb.0:
517; SOFT-NEXT:    mflr r0
518; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
519; SOFT-NEXT:    std r0, 16(r1)
520; SOFT-NEXT:    stdu r1, -48(r1)
521; SOFT-NEXT:    mr r30, r4
522; SOFT-NEXT:    bl __floatdisf
523; SOFT-NEXT:    nop
524; SOFT-NEXT:    clrldi r3, r3, 32
525; SOFT-NEXT:    bl __gnu_f2h_ieee
526; SOFT-NEXT:    nop
527; SOFT-NEXT:    clrldi r3, r3, 48
528; SOFT-NEXT:    bl __gnu_h2f_ieee
529; SOFT-NEXT:    nop
530; SOFT-NEXT:    bl __gnu_f2h_ieee
531; SOFT-NEXT:    nop
532; SOFT-NEXT:    sth r3, 0(r30)
533; SOFT-NEXT:    addi r1, r1, 48
534; SOFT-NEXT:    ld r0, 16(r1)
535; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
536; SOFT-NEXT:    mtlr r0
537; SOFT-NEXT:    blr
538  %r = sitofp i64 %a to half
539  store half %r, half* %p
540  ret void
541}
542define i64 @test_fptoui_i64(half* %p) #0 {
543; P8-LABEL: test_fptoui_i64:
544; P8:       # %bb.0:
545; P8-NEXT:    mflr r0
546; P8-NEXT:    std r0, 16(r1)
547; P8-NEXT:    stdu r1, -32(r1)
548; P8-NEXT:    lhz r3, 0(r3)
549; P8-NEXT:    bl __gnu_h2f_ieee
550; P8-NEXT:    nop
551; P8-NEXT:    xscvdpuxds f0, f1
552; P8-NEXT:    mffprd r3, f0
553; P8-NEXT:    addi r1, r1, 32
554; P8-NEXT:    ld r0, 16(r1)
555; P8-NEXT:    mtlr r0
556; P8-NEXT:    blr
557;
558; CHECK-LABEL: test_fptoui_i64:
559; CHECK:       # %bb.0:
560; CHECK-NEXT:    lhz r3, 0(r3)
561; CHECK-NEXT:    mtfprwz f0, r3
562; CHECK-NEXT:    xscvhpdp f0, f0
563; CHECK-NEXT:    xscvdpuxds f0, f0
564; CHECK-NEXT:    mffprd r3, f0
565; CHECK-NEXT:    blr
566;
567; SOFT-LABEL: test_fptoui_i64:
568; SOFT:       # %bb.0:
569; SOFT-NEXT:    mflr r0
570; SOFT-NEXT:    std r0, 16(r1)
571; SOFT-NEXT:    stdu r1, -32(r1)
572; SOFT-NEXT:    lhz r3, 0(r3)
573; SOFT-NEXT:    bl __gnu_h2f_ieee
574; SOFT-NEXT:    nop
575; SOFT-NEXT:    bl __fixunssfdi
576; SOFT-NEXT:    nop
577; SOFT-NEXT:    addi r1, r1, 32
578; SOFT-NEXT:    ld r0, 16(r1)
579; SOFT-NEXT:    mtlr r0
580; SOFT-NEXT:    blr
581  %a = load half, half* %p, align 2
582  %r = fptoui half %a to i64
583  ret i64 %r
584}
585define void @test_uitofp_i64(i64 %a, half* %p) #0 {
586; P8-LABEL: test_uitofp_i64:
587; P8:       # %bb.0:
588; P8-NEXT:    mflr r0
589; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
590; P8-NEXT:    std r0, 16(r1)
591; P8-NEXT:    stdu r1, -48(r1)
592; P8-NEXT:    mtfprd f0, r3
593; P8-NEXT:    mr r30, r4
594; P8-NEXT:    xscvuxdsp f1, f0
595; P8-NEXT:    bl __gnu_f2h_ieee
596; P8-NEXT:    nop
597; P8-NEXT:    sth r3, 0(r30)
598; P8-NEXT:    addi r1, r1, 48
599; P8-NEXT:    ld r0, 16(r1)
600; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
601; P8-NEXT:    mtlr r0
602; P8-NEXT:    blr
603;
604; CHECK-LABEL: test_uitofp_i64:
605; CHECK:       # %bb.0:
606; CHECK-NEXT:    mtfprd f0, r3
607; CHECK-NEXT:    xscvuxdsp f0, f0
608; CHECK-NEXT:    xscvdphp f0, f0
609; CHECK-NEXT:    mffprwz r3, f0
610; CHECK-NEXT:    sth r3, 0(r4)
611; CHECK-NEXT:    blr
612;
613; SOFT-LABEL: test_uitofp_i64:
614; SOFT:       # %bb.0:
615; SOFT-NEXT:    mflr r0
616; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
617; SOFT-NEXT:    std r0, 16(r1)
618; SOFT-NEXT:    stdu r1, -48(r1)
619; SOFT-NEXT:    mr r30, r4
620; SOFT-NEXT:    bl __floatundisf
621; SOFT-NEXT:    nop
622; SOFT-NEXT:    bl __gnu_f2h_ieee
623; SOFT-NEXT:    nop
624; SOFT-NEXT:    clrldi r3, r3, 48
625; SOFT-NEXT:    bl __gnu_h2f_ieee
626; SOFT-NEXT:    nop
627; SOFT-NEXT:    bl __gnu_f2h_ieee
628; SOFT-NEXT:    nop
629; SOFT-NEXT:    sth r3, 0(r30)
630; SOFT-NEXT:    addi r1, r1, 48
631; SOFT-NEXT:    ld r0, 16(r1)
632; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
633; SOFT-NEXT:    mtlr r0
634; SOFT-NEXT:    blr
635  %r = uitofp i64 %a to half
636  store half %r, half* %p
637  ret void
638}
639define <4 x float> @test_extend32_vec4(<4 x half>* %p) #0 {
640; P8-LABEL: test_extend32_vec4:
641; P8:       # %bb.0:
642; P8-NEXT:    mflr r0
643; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
644; P8-NEXT:    std r0, 16(r1)
645; P8-NEXT:    stdu r1, -112(r1)
646; P8-NEXT:    mr r30, r3
647; P8-NEXT:    lhz r3, 6(r3)
648; P8-NEXT:    bl __gnu_h2f_ieee
649; P8-NEXT:    nop
650; P8-NEXT:    li r3, 80
651; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
652; P8-NEXT:    stxvd2x vs1, r1, r3 # 16-byte Folded Spill
653; P8-NEXT:    lhz r3, 2(r30)
654; P8-NEXT:    bl __gnu_h2f_ieee
655; P8-NEXT:    nop
656; P8-NEXT:    li r3, 64
657; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
658; P8-NEXT:    stxvd2x vs1, r1, r3 # 16-byte Folded Spill
659; P8-NEXT:    lhz r3, 4(r30)
660; P8-NEXT:    bl __gnu_h2f_ieee
661; P8-NEXT:    nop
662; P8-NEXT:    li r3, 48
663; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
664; P8-NEXT:    stxvd2x vs1, r1, r3 # 16-byte Folded Spill
665; P8-NEXT:    lhz r3, 0(r30)
666; P8-NEXT:    bl __gnu_h2f_ieee
667; P8-NEXT:    nop
668; P8-NEXT:    li r3, 80
669; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
670; P8-NEXT:    lxvd2x vs0, r1, r3 # 16-byte Folded Reload
671; P8-NEXT:    li r3, 64
672; P8-NEXT:    lxvd2x vs2, r1, r3 # 16-byte Folded Reload
673; P8-NEXT:    li r3, 48
674; P8-NEXT:    xxmrghd vs0, vs0, vs2
675; P8-NEXT:    lxvd2x vs2, r1, r3 # 16-byte Folded Reload
676; P8-NEXT:    xxmrghd vs1, vs2, vs1
677; P8-NEXT:    xvcvdpsp vs34, vs0
678; P8-NEXT:    xvcvdpsp vs35, vs1
679; P8-NEXT:    vmrgew v2, v2, v3
680; P8-NEXT:    addi r1, r1, 112
681; P8-NEXT:    ld r0, 16(r1)
682; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
683; P8-NEXT:    mtlr r0
684; P8-NEXT:    blr
685;
686; CHECK-LABEL: test_extend32_vec4:
687; CHECK:       # %bb.0:
688; CHECK-NEXT:    lhz r4, 6(r3)
689; CHECK-NEXT:    mtfprwz f0, r4
690; CHECK-NEXT:    xscvhpdp f0, f0
691; CHECK-NEXT:    lhz r4, 2(r3)
692; CHECK-NEXT:    mtfprwz f1, r4
693; CHECK-NEXT:    xscvhpdp f1, f1
694; CHECK-NEXT:    lhz r4, 4(r3)
695; CHECK-NEXT:    mtfprwz f2, r4
696; CHECK-NEXT:    xscvhpdp f2, f2
697; CHECK-NEXT:    lhz r3, 0(r3)
698; CHECK-NEXT:    xxmrghd vs0, vs0, vs1
699; CHECK-NEXT:    mtfprwz f3, r3
700; CHECK-NEXT:    xvcvdpsp vs35, vs0
701; CHECK-NEXT:    xscvhpdp f3, f3
702; CHECK-NEXT:    xxmrghd vs2, vs2, vs3
703; CHECK-NEXT:    xvcvdpsp vs34, vs2
704; CHECK-NEXT:    vmrgew v2, v3, v2
705; CHECK-NEXT:    blr
706;
707; SOFT-LABEL: test_extend32_vec4:
708; SOFT:       # %bb.0:
709; SOFT-NEXT:    mflr r0
710; SOFT-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
711; SOFT-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
712; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
713; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
714; SOFT-NEXT:    std r0, 16(r1)
715; SOFT-NEXT:    stdu r1, -80(r1)
716; SOFT-NEXT:    mr r30, r3
717; SOFT-NEXT:    lhz r3, 0(r3)
718; SOFT-NEXT:    bl __gnu_h2f_ieee
719; SOFT-NEXT:    nop
720; SOFT-NEXT:    mr r29, r3
721; SOFT-NEXT:    lhz r3, 2(r30)
722; SOFT-NEXT:    bl __gnu_h2f_ieee
723; SOFT-NEXT:    nop
724; SOFT-NEXT:    mr r28, r3
725; SOFT-NEXT:    lhz r3, 4(r30)
726; SOFT-NEXT:    bl __gnu_h2f_ieee
727; SOFT-NEXT:    nop
728; SOFT-NEXT:    mr r27, r3
729; SOFT-NEXT:    lhz r3, 6(r30)
730; SOFT-NEXT:    bl __gnu_h2f_ieee
731; SOFT-NEXT:    nop
732; SOFT-NEXT:    mr r6, r3
733; SOFT-NEXT:    mr r3, r29
734; SOFT-NEXT:    mr r4, r28
735; SOFT-NEXT:    mr r5, r27
736; SOFT-NEXT:    addi r1, r1, 80
737; SOFT-NEXT:    ld r0, 16(r1)
738; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
739; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
740; SOFT-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
741; SOFT-NEXT:    mtlr r0
742; SOFT-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
743; SOFT-NEXT:    blr
744  %a = load <4 x half>, <4 x half>* %p, align 8
745  %b = fpext <4 x half> %a to <4 x float>
746  ret <4 x float> %b
747}
748define <4 x double> @test_extend64_vec4(<4 x half>* %p) #0 {
749; P8-LABEL: test_extend64_vec4:
750; P8:       # %bb.0:
751; P8-NEXT:    mflr r0
752; P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
753; P8-NEXT:    std r0, 16(r1)
754; P8-NEXT:    stdu r1, -112(r1)
755; P8-NEXT:    mr r30, r3
756; P8-NEXT:    lhz r3, 6(r3)
757; P8-NEXT:    bl __gnu_h2f_ieee
758; P8-NEXT:    nop
759; P8-NEXT:    li r3, 80
760; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
761; P8-NEXT:    stxvd2x vs1, r1, r3 # 16-byte Folded Spill
762; P8-NEXT:    lhz r3, 4(r30)
763; P8-NEXT:    bl __gnu_h2f_ieee
764; P8-NEXT:    nop
765; P8-NEXT:    li r3, 64
766; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
767; P8-NEXT:    stxvd2x vs1, r1, r3 # 16-byte Folded Spill
768; P8-NEXT:    lhz r3, 2(r30)
769; P8-NEXT:    bl __gnu_h2f_ieee
770; P8-NEXT:    nop
771; P8-NEXT:    li r3, 48
772; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
773; P8-NEXT:    stxvd2x vs1, r1, r3 # 16-byte Folded Spill
774; P8-NEXT:    lhz r3, 0(r30)
775; P8-NEXT:    bl __gnu_h2f_ieee
776; P8-NEXT:    nop
777; P8-NEXT:    li r3, 80
778; P8-NEXT:    # kill: def $f1 killed $f1 def $vsl1
779; P8-NEXT:    lxvd2x vs0, r1, r3 # 16-byte Folded Reload
780; P8-NEXT:    li r3, 64
781; P8-NEXT:    lxvd2x vs2, r1, r3 # 16-byte Folded Reload
782; P8-NEXT:    li r3, 48
783; P8-NEXT:    xxmrghd vs35, vs0, vs2
784; P8-NEXT:    lxvd2x vs0, r1, r3 # 16-byte Folded Reload
785; P8-NEXT:    xxmrghd vs34, vs0, vs1
786; P8-NEXT:    addi r1, r1, 112
787; P8-NEXT:    ld r0, 16(r1)
788; P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
789; P8-NEXT:    mtlr r0
790; P8-NEXT:    blr
791;
792; CHECK-LABEL: test_extend64_vec4:
793; CHECK:       # %bb.0:
794; CHECK-NEXT:    lhz r4, 6(r3)
795; CHECK-NEXT:    lhz r5, 4(r3)
796; CHECK-NEXT:    lhz r6, 2(r3)
797; CHECK-NEXT:    lhz r3, 0(r3)
798; CHECK-NEXT:    mtfprwz f0, r3
799; CHECK-NEXT:    mtfprwz f1, r6
800; CHECK-NEXT:    xscvhpdp f0, f0
801; CHECK-NEXT:    xscvhpdp f1, f1
802; CHECK-NEXT:    xxmrghd vs34, vs1, vs0
803; CHECK-NEXT:    mtfprwz f0, r5
804; CHECK-NEXT:    mtfprwz f1, r4
805; CHECK-NEXT:    xscvhpdp f0, f0
806; CHECK-NEXT:    xscvhpdp f1, f1
807; CHECK-NEXT:    xxmrghd vs35, vs1, vs0
808; CHECK-NEXT:    blr
809;
810; SOFT-LABEL: test_extend64_vec4:
811; SOFT:       # %bb.0:
812; SOFT-NEXT:    mflr r0
813; SOFT-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
814; SOFT-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
815; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
816; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
817; SOFT-NEXT:    std r0, 16(r1)
818; SOFT-NEXT:    stdu r1, -80(r1)
819; SOFT-NEXT:    mr r30, r3
820; SOFT-NEXT:    lhz r3, 0(r3)
821; SOFT-NEXT:    bl __gnu_h2f_ieee
822; SOFT-NEXT:    nop
823; SOFT-NEXT:    bl __extendsfdf2
824; SOFT-NEXT:    nop
825; SOFT-NEXT:    mr r29, r3
826; SOFT-NEXT:    lhz r3, 2(r30)
827; SOFT-NEXT:    bl __gnu_h2f_ieee
828; SOFT-NEXT:    nop
829; SOFT-NEXT:    bl __extendsfdf2
830; SOFT-NEXT:    nop
831; SOFT-NEXT:    mr r28, r3
832; SOFT-NEXT:    lhz r3, 4(r30)
833; SOFT-NEXT:    bl __gnu_h2f_ieee
834; SOFT-NEXT:    nop
835; SOFT-NEXT:    bl __extendsfdf2
836; SOFT-NEXT:    nop
837; SOFT-NEXT:    mr r27, r3
838; SOFT-NEXT:    lhz r3, 6(r30)
839; SOFT-NEXT:    bl __gnu_h2f_ieee
840; SOFT-NEXT:    nop
841; SOFT-NEXT:    bl __extendsfdf2
842; SOFT-NEXT:    nop
843; SOFT-NEXT:    mr r6, r3
844; SOFT-NEXT:    mr r3, r29
845; SOFT-NEXT:    mr r4, r28
846; SOFT-NEXT:    mr r5, r27
847; SOFT-NEXT:    addi r1, r1, 80
848; SOFT-NEXT:    ld r0, 16(r1)
849; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
850; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
851; SOFT-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
852; SOFT-NEXT:    mtlr r0
853; SOFT-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
854; SOFT-NEXT:    blr
855  %a = load <4 x half>, <4 x half>* %p, align 8
856  %b = fpext <4 x half> %a to <4 x double>
857  ret <4 x double> %b
858}
859define void @test_trunc32_vec4(<4 x float> %a, <4 x half>* %p) #0 {
860; P8-LABEL: test_trunc32_vec4:
861; P8:       # %bb.0:
862; P8-NEXT:    mflr r0
863; P8-NEXT:    std r0, 16(r1)
864; P8-NEXT:    stdu r1, -112(r1)
865; P8-NEXT:    xxsldwi vs0, vs34, vs34, 3
866; P8-NEXT:    li r3, 48
867; P8-NEXT:    std r27, 72(r1) # 8-byte Folded Spill
868; P8-NEXT:    std r28, 80(r1) # 8-byte Folded Spill
869; P8-NEXT:    std r29, 88(r1) # 8-byte Folded Spill
870; P8-NEXT:    std r30, 96(r1) # 8-byte Folded Spill
871; P8-NEXT:    mr r30, r5
872; P8-NEXT:    xscvspdpn f1, vs0
873; P8-NEXT:    stxvd2x vs63, r1, r3 # 16-byte Folded Spill
874; P8-NEXT:    vmr v31, v2
875; P8-NEXT:    bl __gnu_f2h_ieee
876; P8-NEXT:    nop
877; P8-NEXT:    xxswapd vs0, vs63
878; P8-NEXT:    mr r29, r3
879; P8-NEXT:    xscvspdpn f1, vs0
880; P8-NEXT:    bl __gnu_f2h_ieee
881; P8-NEXT:    nop
882; P8-NEXT:    xxsldwi vs0, vs63, vs63, 1
883; P8-NEXT:    mr r28, r3
884; P8-NEXT:    xscvspdpn f1, vs0
885; P8-NEXT:    bl __gnu_f2h_ieee
886; P8-NEXT:    nop
887; P8-NEXT:    xscvspdpn f1, vs63
888; P8-NEXT:    mr r27, r3
889; P8-NEXT:    bl __gnu_f2h_ieee
890; P8-NEXT:    nop
891; P8-NEXT:    sth r3, 6(r30)
892; P8-NEXT:    li r3, 48
893; P8-NEXT:    sth r27, 4(r30)
894; P8-NEXT:    ld r27, 72(r1) # 8-byte Folded Reload
895; P8-NEXT:    sth r28, 2(r30)
896; P8-NEXT:    sth r29, 0(r30)
897; P8-NEXT:    ld r30, 96(r1) # 8-byte Folded Reload
898; P8-NEXT:    ld r29, 88(r1) # 8-byte Folded Reload
899; P8-NEXT:    lxvd2x vs63, r1, r3 # 16-byte Folded Reload
900; P8-NEXT:    ld r28, 80(r1) # 8-byte Folded Reload
901; P8-NEXT:    addi r1, r1, 112
902; P8-NEXT:    ld r0, 16(r1)
903; P8-NEXT:    mtlr r0
904; P8-NEXT:    blr
905;
906; CHECK-LABEL: test_trunc32_vec4:
907; CHECK:       # %bb.0:
908; CHECK-NEXT:    xxsldwi vs0, vs34, vs34, 3
909; CHECK-NEXT:    xxsldwi vs1, vs34, vs34, 1
910; CHECK-NEXT:    xscvspdpn f0, vs0
911; CHECK-NEXT:    xscvspdpn f1, vs1
912; CHECK-NEXT:    xscvdphp f0, f0
913; CHECK-NEXT:    mffprwz r3, f0
914; CHECK-NEXT:    xxswapd vs0, vs34
915; CHECK-NEXT:    xscvspdpn f0, vs0
916; CHECK-NEXT:    xscvdphp f0, f0
917; CHECK-NEXT:    xscvdphp f1, f1
918; CHECK-NEXT:    mffprwz r4, f1
919; CHECK-NEXT:    xscvspdpn f1, vs34
920; CHECK-NEXT:    xscvdphp f1, f1
921; CHECK-NEXT:    sth r4, 4(r5)
922; CHECK-NEXT:    mffprwz r4, f0
923; CHECK-NEXT:    sth r3, 0(r5)
924; CHECK-NEXT:    sth r4, 2(r5)
925; CHECK-NEXT:    mffprwz r6, f1
926; CHECK-NEXT:    sth r6, 6(r5)
927; CHECK-NEXT:    blr
928;
929; SOFT-LABEL: test_trunc32_vec4:
930; SOFT:       # %bb.0:
931; SOFT-NEXT:    mflr r0
932; SOFT-NEXT:    std r26, -48(r1) # 8-byte Folded Spill
933; SOFT-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
934; SOFT-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
935; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
936; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
937; SOFT-NEXT:    std r0, 16(r1)
938; SOFT-NEXT:    stdu r1, -80(r1)
939; SOFT-NEXT:    mr r27, r3
940; SOFT-NEXT:    clrldi r3, r6, 32
941; SOFT-NEXT:    mr r30, r7
942; SOFT-NEXT:    mr r29, r5
943; SOFT-NEXT:    mr r28, r4
944; SOFT-NEXT:    bl __gnu_f2h_ieee
945; SOFT-NEXT:    nop
946; SOFT-NEXT:    mr r26, r3
947; SOFT-NEXT:    clrldi r3, r29, 32
948; SOFT-NEXT:    bl __gnu_f2h_ieee
949; SOFT-NEXT:    nop
950; SOFT-NEXT:    mr r29, r3
951; SOFT-NEXT:    clrldi r3, r28, 32
952; SOFT-NEXT:    bl __gnu_f2h_ieee
953; SOFT-NEXT:    nop
954; SOFT-NEXT:    mr r28, r3
955; SOFT-NEXT:    clrldi r3, r27, 32
956; SOFT-NEXT:    bl __gnu_f2h_ieee
957; SOFT-NEXT:    nop
958; SOFT-NEXT:    clrldi r3, r3, 48
959; SOFT-NEXT:    bl __gnu_h2f_ieee
960; SOFT-NEXT:    nop
961; SOFT-NEXT:    mr r27, r3
962; SOFT-NEXT:    clrldi r3, r28, 48
963; SOFT-NEXT:    bl __gnu_h2f_ieee
964; SOFT-NEXT:    nop
965; SOFT-NEXT:    mr r28, r3
966; SOFT-NEXT:    clrldi r3, r29, 48
967; SOFT-NEXT:    bl __gnu_h2f_ieee
968; SOFT-NEXT:    nop
969; SOFT-NEXT:    mr r29, r3
970; SOFT-NEXT:    clrldi r3, r26, 48
971; SOFT-NEXT:    bl __gnu_h2f_ieee
972; SOFT-NEXT:    nop
973; SOFT-NEXT:    bl __gnu_f2h_ieee
974; SOFT-NEXT:    nop
975; SOFT-NEXT:    sth r3, 6(r30)
976; SOFT-NEXT:    mr r3, r29
977; SOFT-NEXT:    bl __gnu_f2h_ieee
978; SOFT-NEXT:    nop
979; SOFT-NEXT:    sth r3, 4(r30)
980; SOFT-NEXT:    mr r3, r28
981; SOFT-NEXT:    bl __gnu_f2h_ieee
982; SOFT-NEXT:    nop
983; SOFT-NEXT:    sth r3, 2(r30)
984; SOFT-NEXT:    mr r3, r27
985; SOFT-NEXT:    bl __gnu_f2h_ieee
986; SOFT-NEXT:    nop
987; SOFT-NEXT:    sth r3, 0(r30)
988; SOFT-NEXT:    addi r1, r1, 80
989; SOFT-NEXT:    ld r0, 16(r1)
990; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
991; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
992; SOFT-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
993; SOFT-NEXT:    mtlr r0
994; SOFT-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
995; SOFT-NEXT:    ld r26, -48(r1) # 8-byte Folded Reload
996; SOFT-NEXT:    blr
997  %v = fptrunc <4 x float> %a to <4 x half>
998  store <4 x half> %v, <4 x half>* %p
999  ret void
1000}
1001define void @test_trunc64_vec4(<4 x double> %a, <4 x half>* %p) #0 {
1002; P8-LABEL: test_trunc64_vec4:
1003; P8:       # %bb.0:
1004; P8-NEXT:    mflr r0
1005; P8-NEXT:    std r0, 16(r1)
1006; P8-NEXT:    stdu r1, -128(r1)
1007; P8-NEXT:    li r3, 48
1008; P8-NEXT:    xxswapd vs1, vs34
1009; P8-NEXT:    std r27, 88(r1) # 8-byte Folded Spill
1010; P8-NEXT:    std r28, 96(r1) # 8-byte Folded Spill
1011; P8-NEXT:    std r29, 104(r1) # 8-byte Folded Spill
1012; P8-NEXT:    std r30, 112(r1) # 8-byte Folded Spill
1013; P8-NEXT:    mr r30, r7
1014; P8-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1015; P8-NEXT:    stxvd2x vs62, r1, r3 # 16-byte Folded Spill
1016; P8-NEXT:    li r3, 64
1017; P8-NEXT:    vmr v30, v2
1018; P8-NEXT:    stxvd2x vs63, r1, r3 # 16-byte Folded Spill
1019; P8-NEXT:    vmr v31, v3
1020; P8-NEXT:    bl __truncdfhf2
1021; P8-NEXT:    nop
1022; P8-NEXT:    xxswapd vs1, vs63
1023; P8-NEXT:    mr r29, r3
1024; P8-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1025; P8-NEXT:    bl __truncdfhf2
1026; P8-NEXT:    nop
1027; P8-NEXT:    xxlor f1, vs62, vs62
1028; P8-NEXT:    mr r28, r3
1029; P8-NEXT:    bl __truncdfhf2
1030; P8-NEXT:    nop
1031; P8-NEXT:    xxlor f1, vs63, vs63
1032; P8-NEXT:    mr r27, r3
1033; P8-NEXT:    bl __truncdfhf2
1034; P8-NEXT:    nop
1035; P8-NEXT:    sth r3, 6(r30)
1036; P8-NEXT:    li r3, 64
1037; P8-NEXT:    sth r27, 2(r30)
1038; P8-NEXT:    ld r27, 88(r1) # 8-byte Folded Reload
1039; P8-NEXT:    sth r28, 4(r30)
1040; P8-NEXT:    sth r29, 0(r30)
1041; P8-NEXT:    ld r30, 112(r1) # 8-byte Folded Reload
1042; P8-NEXT:    ld r29, 104(r1) # 8-byte Folded Reload
1043; P8-NEXT:    lxvd2x vs63, r1, r3 # 16-byte Folded Reload
1044; P8-NEXT:    li r3, 48
1045; P8-NEXT:    ld r28, 96(r1) # 8-byte Folded Reload
1046; P8-NEXT:    lxvd2x vs62, r1, r3 # 16-byte Folded Reload
1047; P8-NEXT:    addi r1, r1, 128
1048; P8-NEXT:    ld r0, 16(r1)
1049; P8-NEXT:    mtlr r0
1050; P8-NEXT:    blr
1051;
1052; CHECK-LABEL: test_trunc64_vec4:
1053; CHECK:       # %bb.0:
1054; CHECK-NEXT:    xxswapd vs0, vs34
1055; CHECK-NEXT:    xscvdphp f0, f0
1056; CHECK-NEXT:    mffprwz r3, f0
1057; CHECK-NEXT:    xxswapd vs0, vs35
1058; CHECK-NEXT:    xscvdphp f0, f0
1059; CHECK-NEXT:    xscvdphp f1, vs34
1060; CHECK-NEXT:    mffprwz r4, f1
1061; CHECK-NEXT:    xscvdphp f1, vs35
1062; CHECK-NEXT:    sth r3, 0(r7)
1063; CHECK-NEXT:    sth r4, 2(r7)
1064; CHECK-NEXT:    mffprwz r4, f0
1065; CHECK-NEXT:    sth r4, 4(r7)
1066; CHECK-NEXT:    mffprwz r5, f1
1067; CHECK-NEXT:    sth r5, 6(r7)
1068; CHECK-NEXT:    blr
1069;
1070; SOFT-LABEL: test_trunc64_vec4:
1071; SOFT:       # %bb.0:
1072; SOFT-NEXT:    mflr r0
1073; SOFT-NEXT:    std r26, -48(r1) # 8-byte Folded Spill
1074; SOFT-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
1075; SOFT-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
1076; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
1077; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1078; SOFT-NEXT:    std r0, 16(r1)
1079; SOFT-NEXT:    stdu r1, -80(r1)
1080; SOFT-NEXT:    mr r27, r3
1081; SOFT-NEXT:    mr r3, r6
1082; SOFT-NEXT:    mr r30, r7
1083; SOFT-NEXT:    mr r29, r5
1084; SOFT-NEXT:    mr r28, r4
1085; SOFT-NEXT:    bl __truncdfhf2
1086; SOFT-NEXT:    nop
1087; SOFT-NEXT:    mr r26, r3
1088; SOFT-NEXT:    mr r3, r29
1089; SOFT-NEXT:    bl __truncdfhf2
1090; SOFT-NEXT:    nop
1091; SOFT-NEXT:    mr r29, r3
1092; SOFT-NEXT:    mr r3, r28
1093; SOFT-NEXT:    bl __truncdfhf2
1094; SOFT-NEXT:    nop
1095; SOFT-NEXT:    mr r28, r3
1096; SOFT-NEXT:    mr r3, r27
1097; SOFT-NEXT:    bl __truncdfhf2
1098; SOFT-NEXT:    nop
1099; SOFT-NEXT:    clrldi r3, r3, 48
1100; SOFT-NEXT:    bl __gnu_h2f_ieee
1101; SOFT-NEXT:    nop
1102; SOFT-NEXT:    mr r27, r3
1103; SOFT-NEXT:    clrldi r3, r28, 48
1104; SOFT-NEXT:    bl __gnu_h2f_ieee
1105; SOFT-NEXT:    nop
1106; SOFT-NEXT:    mr r28, r3
1107; SOFT-NEXT:    clrldi r3, r29, 48
1108; SOFT-NEXT:    bl __gnu_h2f_ieee
1109; SOFT-NEXT:    nop
1110; SOFT-NEXT:    mr r29, r3
1111; SOFT-NEXT:    clrldi r3, r26, 48
1112; SOFT-NEXT:    bl __gnu_h2f_ieee
1113; SOFT-NEXT:    nop
1114; SOFT-NEXT:    bl __gnu_f2h_ieee
1115; SOFT-NEXT:    nop
1116; SOFT-NEXT:    sth r3, 6(r30)
1117; SOFT-NEXT:    mr r3, r29
1118; SOFT-NEXT:    bl __gnu_f2h_ieee
1119; SOFT-NEXT:    nop
1120; SOFT-NEXT:    sth r3, 4(r30)
1121; SOFT-NEXT:    mr r3, r28
1122; SOFT-NEXT:    bl __gnu_f2h_ieee
1123; SOFT-NEXT:    nop
1124; SOFT-NEXT:    sth r3, 2(r30)
1125; SOFT-NEXT:    mr r3, r27
1126; SOFT-NEXT:    bl __gnu_f2h_ieee
1127; SOFT-NEXT:    nop
1128; SOFT-NEXT:    sth r3, 0(r30)
1129; SOFT-NEXT:    addi r1, r1, 80
1130; SOFT-NEXT:    ld r0, 16(r1)
1131; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1132; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
1133; SOFT-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
1134; SOFT-NEXT:    mtlr r0
1135; SOFT-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
1136; SOFT-NEXT:    ld r26, -48(r1) # 8-byte Folded Reload
1137; SOFT-NEXT:    blr
1138  %v = fptrunc <4 x double> %a to <4 x half>
1139  store <4 x half> %v, <4 x half>* %p
1140  ret void
1141}
1142define float @test_sitofp_fadd_i32(i32 %a, half* %b) #0 {
1143; P8-LABEL: test_sitofp_fadd_i32:
1144; P8:       # %bb.0:
1145; P8-NEXT:    mflr r0
1146; P8-NEXT:    std r30, -24(r1) # 8-byte Folded Spill
1147; P8-NEXT:    stfd f31, -8(r1) # 8-byte Folded Spill
1148; P8-NEXT:    std r0, 16(r1)
1149; P8-NEXT:    stdu r1, -64(r1)
1150; P8-NEXT:    mr r30, r3
1151; P8-NEXT:    lhz r3, 0(r4)
1152; P8-NEXT:    bl __gnu_h2f_ieee
1153; P8-NEXT:    nop
1154; P8-NEXT:    mtfprwa f0, r30
1155; P8-NEXT:    fmr f31, f1
1156; P8-NEXT:    xscvsxdsp f1, f0
1157; P8-NEXT:    bl __gnu_f2h_ieee
1158; P8-NEXT:    nop
1159; P8-NEXT:    clrldi r3, r3, 48
1160; P8-NEXT:    bl __gnu_h2f_ieee
1161; P8-NEXT:    nop
1162; P8-NEXT:    xsaddsp f1, f31, f1
1163; P8-NEXT:    addi r1, r1, 64
1164; P8-NEXT:    ld r0, 16(r1)
1165; P8-NEXT:    lfd f31, -8(r1) # 8-byte Folded Reload
1166; P8-NEXT:    ld r30, -24(r1) # 8-byte Folded Reload
1167; P8-NEXT:    mtlr r0
1168; P8-NEXT:    blr
1169;
1170; CHECK-LABEL: test_sitofp_fadd_i32:
1171; CHECK:       # %bb.0:
1172; CHECK-NEXT:    mtfprwa f1, r3
1173; CHECK-NEXT:    lhz r4, 0(r4)
1174; CHECK-NEXT:    xscvsxdsp f1, f1
1175; CHECK-NEXT:    mtfprwz f0, r4
1176; CHECK-NEXT:    xscvhpdp f0, f0
1177; CHECK-NEXT:    xscvdphp f1, f1
1178; CHECK-NEXT:    mffprwz r3, f1
1179; CHECK-NEXT:    clrlwi r3, r3, 16
1180; CHECK-NEXT:    mtfprwz f1, r3
1181; CHECK-NEXT:    xscvhpdp f1, f1
1182; CHECK-NEXT:    xsaddsp f1, f0, f1
1183; CHECK-NEXT:    blr
1184;
1185; SOFT-LABEL: test_sitofp_fadd_i32:
1186; SOFT:       # %bb.0:
1187; SOFT-NEXT:    mflr r0
1188; SOFT-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
1189; SOFT-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
1190; SOFT-NEXT:    std r0, 16(r1)
1191; SOFT-NEXT:    stdu r1, -64(r1)
1192; SOFT-NEXT:    mr r30, r3
1193; SOFT-NEXT:    lhz r3, 0(r4)
1194; SOFT-NEXT:    bl __gnu_h2f_ieee
1195; SOFT-NEXT:    nop
1196; SOFT-NEXT:    mr r29, r3
1197; SOFT-NEXT:    extsw r3, r30
1198; SOFT-NEXT:    bl __floatsisf
1199; SOFT-NEXT:    nop
1200; SOFT-NEXT:    clrldi r3, r3, 32
1201; SOFT-NEXT:    bl __gnu_f2h_ieee
1202; SOFT-NEXT:    nop
1203; SOFT-NEXT:    clrldi r3, r3, 48
1204; SOFT-NEXT:    bl __gnu_h2f_ieee
1205; SOFT-NEXT:    nop
1206; SOFT-NEXT:    mr r4, r3
1207; SOFT-NEXT:    mr r3, r29
1208; SOFT-NEXT:    bl __addsf3
1209; SOFT-NEXT:    nop
1210; SOFT-NEXT:    addi r1, r1, 64
1211; SOFT-NEXT:    ld r0, 16(r1)
1212; SOFT-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
1213; SOFT-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
1214; SOFT-NEXT:    mtlr r0
1215; SOFT-NEXT:    blr
1216  %tmp0 = load half, half* %b
1217  %tmp1 = sitofp i32 %a to half
1218  %tmp2 = fadd half %tmp0, %tmp1
1219  %tmp3 = fpext half %tmp2 to float
1220  ret float %tmp3
1221}
1222define half @PR40273(half) #0 {
1223; P8-LABEL: PR40273:
1224; P8:       # %bb.0:
1225; P8-NEXT:    mflr r0
1226; P8-NEXT:    std r0, 16(r1)
1227; P8-NEXT:    stdu r1, -32(r1)
1228; P8-NEXT:    bl __gnu_f2h_ieee
1229; P8-NEXT:    nop
1230; P8-NEXT:    clrldi r3, r3, 48
1231; P8-NEXT:    bl __gnu_h2f_ieee
1232; P8-NEXT:    nop
1233; P8-NEXT:    xxlxor f0, f0, f0
1234; P8-NEXT:    fcmpu cr0, f1, f0
1235; P8-NEXT:    beq cr0, .LBB20_2
1236; P8-NEXT:  # %bb.1:
1237; P8-NEXT:    addis r3, r2, .LCPI20_0@toc@ha
1238; P8-NEXT:    lfs f0, .LCPI20_0@toc@l(r3)
1239; P8-NEXT:  .LBB20_2:
1240; P8-NEXT:    fmr f1, f0
1241; P8-NEXT:    addi r1, r1, 32
1242; P8-NEXT:    ld r0, 16(r1)
1243; P8-NEXT:    mtlr r0
1244; P8-NEXT:    blr
1245;
1246; CHECK-LABEL: PR40273:
1247; CHECK:       # %bb.0:
1248; CHECK-NEXT:    xscvdphp f0, f1
1249; CHECK-NEXT:    xxlxor f1, f1, f1
1250; CHECK-NEXT:    mffprwz r3, f0
1251; CHECK-NEXT:    clrlwi r3, r3, 16
1252; CHECK-NEXT:    mtfprwz f0, r3
1253; CHECK-NEXT:    xscvhpdp f0, f0
1254; CHECK-NEXT:    fcmpu cr0, f0, f1
1255; CHECK-NEXT:    beqlr cr0
1256; CHECK-NEXT:  # %bb.1:
1257; CHECK-NEXT:    addis r3, r2, .LCPI20_0@toc@ha
1258; CHECK-NEXT:    lfs f1, .LCPI20_0@toc@l(r3)
1259; CHECK-NEXT:    blr
1260;
1261; SOFT-LABEL: PR40273:
1262; SOFT:       # %bb.0:
1263; SOFT-NEXT:    mflr r0
1264; SOFT-NEXT:    std r0, 16(r1)
1265; SOFT-NEXT:    stdu r1, -32(r1)
1266; SOFT-NEXT:    clrldi r3, r3, 48
1267; SOFT-NEXT:    bl __gnu_h2f_ieee
1268; SOFT-NEXT:    nop
1269; SOFT-NEXT:    li r4, 0
1270; SOFT-NEXT:    bl __nesf2
1271; SOFT-NEXT:    nop
1272; SOFT-NEXT:    cmplwi r3, 0
1273; SOFT-NEXT:    lis r3, 16256
1274; SOFT-NEXT:    iseleq r3, 0, r3
1275; SOFT-NEXT:    bl __gnu_f2h_ieee
1276; SOFT-NEXT:    nop
1277; SOFT-NEXT:    addi r1, r1, 32
1278; SOFT-NEXT:    ld r0, 16(r1)
1279; SOFT-NEXT:    mtlr r0
1280; SOFT-NEXT:    blr
1281  %2 = fcmp une half %0, 0xH0000
1282  %3 = uitofp i1 %2 to half
1283  ret half %3
1284}
1285attributes #0 = { nounwind }
1286