1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -O3 -mtriple=powerpc64le-linux-gnu < %s | FileCheck --check-prefix=PC64LE %s
3; RUN: llc -O3 -mtriple=powerpc64le-linux-gnu -mcpu=pwr9 < %s | FileCheck --check-prefix=PC64LE9 %s
4; RUN: llc -O3 -mtriple=powerpc64-linux-gnu < %s | FileCheck --check-prefix=PC64 %s
5
6define ppc_fp128 @test_fadd_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
7; PC64LE-LABEL: test_fadd_ppc_fp128:
8; PC64LE:       # %bb.0: # %entry
9; PC64LE-NEXT:    mflr 0
10; PC64LE-NEXT:    std 0, 16(1)
11; PC64LE-NEXT:    stdu 1, -32(1)
12; PC64LE-NEXT:    bl __gcc_qadd
13; PC64LE-NEXT:    nop
14; PC64LE-NEXT:    addi 1, 1, 32
15; PC64LE-NEXT:    ld 0, 16(1)
16; PC64LE-NEXT:    mtlr 0
17; PC64LE-NEXT:    blr
18;
19; PC64LE9-LABEL: test_fadd_ppc_fp128:
20; PC64LE9:       # %bb.0: # %entry
21; PC64LE9-NEXT:    mflr 0
22; PC64LE9-NEXT:    std 0, 16(1)
23; PC64LE9-NEXT:    stdu 1, -32(1)
24; PC64LE9-NEXT:    bl __gcc_qadd
25; PC64LE9-NEXT:    nop
26; PC64LE9-NEXT:    addi 1, 1, 32
27; PC64LE9-NEXT:    ld 0, 16(1)
28; PC64LE9-NEXT:    mtlr 0
29; PC64LE9-NEXT:    blr
30;
31; PC64-LABEL: test_fadd_ppc_fp128:
32; PC64:       # %bb.0: # %entry
33; PC64-NEXT:    mflr 0
34; PC64-NEXT:    std 0, 16(1)
35; PC64-NEXT:    stdu 1, -112(1)
36; PC64-NEXT:    bl __gcc_qadd
37; PC64-NEXT:    nop
38; PC64-NEXT:    addi 1, 1, 112
39; PC64-NEXT:    ld 0, 16(1)
40; PC64-NEXT:    mtlr 0
41; PC64-NEXT:    blr
42entry:
43  %add = call ppc_fp128 @llvm.experimental.constrained.fadd.ppcf128(
44                    ppc_fp128 %first,
45                    ppc_fp128 %second,
46                    metadata !"round.dynamic",
47                    metadata !"fpexcept.strict") #1
48  ret ppc_fp128 %add
49}
50
51define ppc_fp128 @test_fsub_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
52; PC64LE-LABEL: test_fsub_ppc_fp128:
53; PC64LE:       # %bb.0: # %entry
54; PC64LE-NEXT:    mflr 0
55; PC64LE-NEXT:    std 0, 16(1)
56; PC64LE-NEXT:    stdu 1, -32(1)
57; PC64LE-NEXT:    bl __gcc_qsub
58; PC64LE-NEXT:    nop
59; PC64LE-NEXT:    addi 1, 1, 32
60; PC64LE-NEXT:    ld 0, 16(1)
61; PC64LE-NEXT:    mtlr 0
62; PC64LE-NEXT:    blr
63;
64; PC64LE9-LABEL: test_fsub_ppc_fp128:
65; PC64LE9:       # %bb.0: # %entry
66; PC64LE9-NEXT:    mflr 0
67; PC64LE9-NEXT:    std 0, 16(1)
68; PC64LE9-NEXT:    stdu 1, -32(1)
69; PC64LE9-NEXT:    bl __gcc_qsub
70; PC64LE9-NEXT:    nop
71; PC64LE9-NEXT:    addi 1, 1, 32
72; PC64LE9-NEXT:    ld 0, 16(1)
73; PC64LE9-NEXT:    mtlr 0
74; PC64LE9-NEXT:    blr
75;
76; PC64-LABEL: test_fsub_ppc_fp128:
77; PC64:       # %bb.0: # %entry
78; PC64-NEXT:    mflr 0
79; PC64-NEXT:    std 0, 16(1)
80; PC64-NEXT:    stdu 1, -112(1)
81; PC64-NEXT:    bl __gcc_qsub
82; PC64-NEXT:    nop
83; PC64-NEXT:    addi 1, 1, 112
84; PC64-NEXT:    ld 0, 16(1)
85; PC64-NEXT:    mtlr 0
86; PC64-NEXT:    blr
87entry:
88  %sub = call ppc_fp128 @llvm.experimental.constrained.fsub.ppcf128(
89                    ppc_fp128 %first,
90                    ppc_fp128 %second,
91                    metadata !"round.dynamic",
92                    metadata !"fpexcept.strict") #1
93  ret ppc_fp128 %sub
94}
95
96define ppc_fp128 @test_fmul_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
97; PC64LE-LABEL: test_fmul_ppc_fp128:
98; PC64LE:       # %bb.0: # %entry
99; PC64LE-NEXT:    mflr 0
100; PC64LE-NEXT:    std 0, 16(1)
101; PC64LE-NEXT:    stdu 1, -32(1)
102; PC64LE-NEXT:    bl __gcc_qmul
103; PC64LE-NEXT:    nop
104; PC64LE-NEXT:    addi 1, 1, 32
105; PC64LE-NEXT:    ld 0, 16(1)
106; PC64LE-NEXT:    mtlr 0
107; PC64LE-NEXT:    blr
108;
109; PC64LE9-LABEL: test_fmul_ppc_fp128:
110; PC64LE9:       # %bb.0: # %entry
111; PC64LE9-NEXT:    mflr 0
112; PC64LE9-NEXT:    std 0, 16(1)
113; PC64LE9-NEXT:    stdu 1, -32(1)
114; PC64LE9-NEXT:    bl __gcc_qmul
115; PC64LE9-NEXT:    nop
116; PC64LE9-NEXT:    addi 1, 1, 32
117; PC64LE9-NEXT:    ld 0, 16(1)
118; PC64LE9-NEXT:    mtlr 0
119; PC64LE9-NEXT:    blr
120;
121; PC64-LABEL: test_fmul_ppc_fp128:
122; PC64:       # %bb.0: # %entry
123; PC64-NEXT:    mflr 0
124; PC64-NEXT:    std 0, 16(1)
125; PC64-NEXT:    stdu 1, -112(1)
126; PC64-NEXT:    bl __gcc_qmul
127; PC64-NEXT:    nop
128; PC64-NEXT:    addi 1, 1, 112
129; PC64-NEXT:    ld 0, 16(1)
130; PC64-NEXT:    mtlr 0
131; PC64-NEXT:    blr
132entry:
133  %mul = call ppc_fp128 @llvm.experimental.constrained.fmul.ppcf128(
134                    ppc_fp128 %first,
135                    ppc_fp128 %second,
136                    metadata !"round.dynamic",
137                    metadata !"fpexcept.strict") #1
138  ret ppc_fp128 %mul
139}
140
141define ppc_fp128 @test_fdiv_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
142; PC64LE-LABEL: test_fdiv_ppc_fp128:
143; PC64LE:       # %bb.0: # %entry
144; PC64LE-NEXT:    mflr 0
145; PC64LE-NEXT:    std 0, 16(1)
146; PC64LE-NEXT:    stdu 1, -32(1)
147; PC64LE-NEXT:    bl __gcc_qdiv
148; PC64LE-NEXT:    nop
149; PC64LE-NEXT:    addi 1, 1, 32
150; PC64LE-NEXT:    ld 0, 16(1)
151; PC64LE-NEXT:    mtlr 0
152; PC64LE-NEXT:    blr
153;
154; PC64LE9-LABEL: test_fdiv_ppc_fp128:
155; PC64LE9:       # %bb.0: # %entry
156; PC64LE9-NEXT:    mflr 0
157; PC64LE9-NEXT:    std 0, 16(1)
158; PC64LE9-NEXT:    stdu 1, -32(1)
159; PC64LE9-NEXT:    bl __gcc_qdiv
160; PC64LE9-NEXT:    nop
161; PC64LE9-NEXT:    addi 1, 1, 32
162; PC64LE9-NEXT:    ld 0, 16(1)
163; PC64LE9-NEXT:    mtlr 0
164; PC64LE9-NEXT:    blr
165;
166; PC64-LABEL: test_fdiv_ppc_fp128:
167; PC64:       # %bb.0: # %entry
168; PC64-NEXT:    mflr 0
169; PC64-NEXT:    std 0, 16(1)
170; PC64-NEXT:    stdu 1, -112(1)
171; PC64-NEXT:    bl __gcc_qdiv
172; PC64-NEXT:    nop
173; PC64-NEXT:    addi 1, 1, 112
174; PC64-NEXT:    ld 0, 16(1)
175; PC64-NEXT:    mtlr 0
176; PC64-NEXT:    blr
177entry:
178  %div = call ppc_fp128 @llvm.experimental.constrained.fdiv.ppcf128(
179                    ppc_fp128 %first,
180                    ppc_fp128 %second,
181                    metadata !"round.dynamic",
182                    metadata !"fpexcept.strict") #1
183  ret ppc_fp128 %div
184}
185
186define ppc_fp128 @test_frem_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
187; PC64LE-LABEL: test_frem_ppc_fp128:
188; PC64LE:       # %bb.0: # %entry
189; PC64LE-NEXT:    mflr 0
190; PC64LE-NEXT:    std 0, 16(1)
191; PC64LE-NEXT:    stdu 1, -32(1)
192; PC64LE-NEXT:    bl fmodl
193; PC64LE-NEXT:    nop
194; PC64LE-NEXT:    addi 1, 1, 32
195; PC64LE-NEXT:    ld 0, 16(1)
196; PC64LE-NEXT:    mtlr 0
197; PC64LE-NEXT:    blr
198;
199; PC64LE9-LABEL: test_frem_ppc_fp128:
200; PC64LE9:       # %bb.0: # %entry
201; PC64LE9-NEXT:    mflr 0
202; PC64LE9-NEXT:    std 0, 16(1)
203; PC64LE9-NEXT:    stdu 1, -32(1)
204; PC64LE9-NEXT:    bl fmodl
205; PC64LE9-NEXT:    nop
206; PC64LE9-NEXT:    addi 1, 1, 32
207; PC64LE9-NEXT:    ld 0, 16(1)
208; PC64LE9-NEXT:    mtlr 0
209; PC64LE9-NEXT:    blr
210;
211; PC64-LABEL: test_frem_ppc_fp128:
212; PC64:       # %bb.0: # %entry
213; PC64-NEXT:    mflr 0
214; PC64-NEXT:    std 0, 16(1)
215; PC64-NEXT:    stdu 1, -112(1)
216; PC64-NEXT:    bl fmodl
217; PC64-NEXT:    nop
218; PC64-NEXT:    addi 1, 1, 112
219; PC64-NEXT:    ld 0, 16(1)
220; PC64-NEXT:    mtlr 0
221; PC64-NEXT:    blr
222entry:
223  %rem = call ppc_fp128 @llvm.experimental.constrained.frem.ppcf128(
224                    ppc_fp128 %first,
225                    ppc_fp128 %second,
226                    metadata !"round.dynamic",
227                    metadata !"fpexcept.strict") #1
228  ret ppc_fp128 %rem
229}
230
231define ppc_fp128 @test_fma_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second, ppc_fp128 %third) #0 {
232; PC64LE-LABEL: test_fma_ppc_fp128:
233; PC64LE:       # %bb.0: # %entry
234; PC64LE-NEXT:    mflr 0
235; PC64LE-NEXT:    std 0, 16(1)
236; PC64LE-NEXT:    stdu 1, -32(1)
237; PC64LE-NEXT:    bl fmal
238; PC64LE-NEXT:    nop
239; PC64LE-NEXT:    addi 1, 1, 32
240; PC64LE-NEXT:    ld 0, 16(1)
241; PC64LE-NEXT:    mtlr 0
242; PC64LE-NEXT:    blr
243;
244; PC64LE9-LABEL: test_fma_ppc_fp128:
245; PC64LE9:       # %bb.0: # %entry
246; PC64LE9-NEXT:    mflr 0
247; PC64LE9-NEXT:    std 0, 16(1)
248; PC64LE9-NEXT:    stdu 1, -32(1)
249; PC64LE9-NEXT:    bl fmal
250; PC64LE9-NEXT:    nop
251; PC64LE9-NEXT:    addi 1, 1, 32
252; PC64LE9-NEXT:    ld 0, 16(1)
253; PC64LE9-NEXT:    mtlr 0
254; PC64LE9-NEXT:    blr
255;
256; PC64-LABEL: test_fma_ppc_fp128:
257; PC64:       # %bb.0: # %entry
258; PC64-NEXT:    mflr 0
259; PC64-NEXT:    std 0, 16(1)
260; PC64-NEXT:    stdu 1, -112(1)
261; PC64-NEXT:    bl fmal
262; PC64-NEXT:    nop
263; PC64-NEXT:    addi 1, 1, 112
264; PC64-NEXT:    ld 0, 16(1)
265; PC64-NEXT:    mtlr 0
266; PC64-NEXT:    blr
267entry:
268  %add = call ppc_fp128 @llvm.experimental.constrained.fma.ppcf128(
269                    ppc_fp128 %first,
270                    ppc_fp128 %second,
271                    ppc_fp128 %third,
272                    metadata !"round.dynamic",
273                    metadata !"fpexcept.strict") #1
274  ret ppc_fp128 %add
275}
276
277define ppc_fp128 @test_sqrt_ppc_fp128(ppc_fp128 %first) #0 {
278; PC64LE-LABEL: test_sqrt_ppc_fp128:
279; PC64LE:       # %bb.0: # %entry
280; PC64LE-NEXT:    mflr 0
281; PC64LE-NEXT:    std 0, 16(1)
282; PC64LE-NEXT:    stdu 1, -32(1)
283; PC64LE-NEXT:    bl sqrtl
284; PC64LE-NEXT:    nop
285; PC64LE-NEXT:    addi 1, 1, 32
286; PC64LE-NEXT:    ld 0, 16(1)
287; PC64LE-NEXT:    mtlr 0
288; PC64LE-NEXT:    blr
289;
290; PC64LE9-LABEL: test_sqrt_ppc_fp128:
291; PC64LE9:       # %bb.0: # %entry
292; PC64LE9-NEXT:    mflr 0
293; PC64LE9-NEXT:    std 0, 16(1)
294; PC64LE9-NEXT:    stdu 1, -32(1)
295; PC64LE9-NEXT:    bl sqrtl
296; PC64LE9-NEXT:    nop
297; PC64LE9-NEXT:    addi 1, 1, 32
298; PC64LE9-NEXT:    ld 0, 16(1)
299; PC64LE9-NEXT:    mtlr 0
300; PC64LE9-NEXT:    blr
301;
302; PC64-LABEL: test_sqrt_ppc_fp128:
303; PC64:       # %bb.0: # %entry
304; PC64-NEXT:    mflr 0
305; PC64-NEXT:    std 0, 16(1)
306; PC64-NEXT:    stdu 1, -112(1)
307; PC64-NEXT:    bl sqrtl
308; PC64-NEXT:    nop
309; PC64-NEXT:    addi 1, 1, 112
310; PC64-NEXT:    ld 0, 16(1)
311; PC64-NEXT:    mtlr 0
312; PC64-NEXT:    blr
313entry:
314  %sqrt = call ppc_fp128 @llvm.experimental.constrained.sqrt.ppcf128(
315                    ppc_fp128 %first,
316                    metadata !"round.dynamic",
317                    metadata !"fpexcept.strict") #1
318  ret ppc_fp128 %sqrt
319}
320
321define ppc_fp128 @test_pow_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
322; PC64LE-LABEL: test_pow_ppc_fp128:
323; PC64LE:       # %bb.0: # %entry
324; PC64LE-NEXT:    mflr 0
325; PC64LE-NEXT:    std 0, 16(1)
326; PC64LE-NEXT:    stdu 1, -32(1)
327; PC64LE-NEXT:    bl powl
328; PC64LE-NEXT:    nop
329; PC64LE-NEXT:    addi 1, 1, 32
330; PC64LE-NEXT:    ld 0, 16(1)
331; PC64LE-NEXT:    mtlr 0
332; PC64LE-NEXT:    blr
333;
334; PC64LE9-LABEL: test_pow_ppc_fp128:
335; PC64LE9:       # %bb.0: # %entry
336; PC64LE9-NEXT:    mflr 0
337; PC64LE9-NEXT:    std 0, 16(1)
338; PC64LE9-NEXT:    stdu 1, -32(1)
339; PC64LE9-NEXT:    bl powl
340; PC64LE9-NEXT:    nop
341; PC64LE9-NEXT:    addi 1, 1, 32
342; PC64LE9-NEXT:    ld 0, 16(1)
343; PC64LE9-NEXT:    mtlr 0
344; PC64LE9-NEXT:    blr
345;
346; PC64-LABEL: test_pow_ppc_fp128:
347; PC64:       # %bb.0: # %entry
348; PC64-NEXT:    mflr 0
349; PC64-NEXT:    std 0, 16(1)
350; PC64-NEXT:    stdu 1, -112(1)
351; PC64-NEXT:    bl powl
352; PC64-NEXT:    nop
353; PC64-NEXT:    addi 1, 1, 112
354; PC64-NEXT:    ld 0, 16(1)
355; PC64-NEXT:    mtlr 0
356; PC64-NEXT:    blr
357entry:
358  %pow = call ppc_fp128 @llvm.experimental.constrained.pow.ppcf128(
359                    ppc_fp128 %first,
360                    ppc_fp128 %second,
361                    metadata !"round.dynamic",
362                    metadata !"fpexcept.strict") #1
363  ret ppc_fp128 %pow
364}
365
366define ppc_fp128 @test_powi_ppc_fp128(ppc_fp128 %first, i32 %second) #0 {
367; PC64LE-LABEL: test_powi_ppc_fp128:
368; PC64LE:       # %bb.0: # %entry
369; PC64LE-NEXT:    mflr 0
370; PC64LE-NEXT:    std 0, 16(1)
371; PC64LE-NEXT:    stdu 1, -32(1)
372; PC64LE-NEXT:    clrldi 5, 5, 32
373; PC64LE-NEXT:    bl __powitf2
374; PC64LE-NEXT:    nop
375; PC64LE-NEXT:    addi 1, 1, 32
376; PC64LE-NEXT:    ld 0, 16(1)
377; PC64LE-NEXT:    mtlr 0
378; PC64LE-NEXT:    blr
379;
380; PC64LE9-LABEL: test_powi_ppc_fp128:
381; PC64LE9:       # %bb.0: # %entry
382; PC64LE9-NEXT:    mflr 0
383; PC64LE9-NEXT:    std 0, 16(1)
384; PC64LE9-NEXT:    stdu 1, -32(1)
385; PC64LE9-NEXT:    clrldi 5, 5, 32
386; PC64LE9-NEXT:    bl __powitf2
387; PC64LE9-NEXT:    nop
388; PC64LE9-NEXT:    addi 1, 1, 32
389; PC64LE9-NEXT:    ld 0, 16(1)
390; PC64LE9-NEXT:    mtlr 0
391; PC64LE9-NEXT:    blr
392;
393; PC64-LABEL: test_powi_ppc_fp128:
394; PC64:       # %bb.0: # %entry
395; PC64-NEXT:    mflr 0
396; PC64-NEXT:    std 0, 16(1)
397; PC64-NEXT:    stdu 1, -112(1)
398; PC64-NEXT:    clrldi 5, 5, 32
399; PC64-NEXT:    bl __powitf2
400; PC64-NEXT:    nop
401; PC64-NEXT:    addi 1, 1, 112
402; PC64-NEXT:    ld 0, 16(1)
403; PC64-NEXT:    mtlr 0
404; PC64-NEXT:    blr
405entry:
406  %powi = call ppc_fp128 @llvm.experimental.constrained.powi.ppcf128(
407                    ppc_fp128 %first,
408                    i32 %second,
409                    metadata !"round.dynamic",
410                    metadata !"fpexcept.strict") #1
411  ret ppc_fp128 %powi
412}
413
414define ppc_fp128 @test_sin_ppc_fp128(ppc_fp128 %first) #0 {
415; PC64LE-LABEL: test_sin_ppc_fp128:
416; PC64LE:       # %bb.0: # %entry
417; PC64LE-NEXT:    mflr 0
418; PC64LE-NEXT:    std 0, 16(1)
419; PC64LE-NEXT:    stdu 1, -32(1)
420; PC64LE-NEXT:    bl sinl
421; PC64LE-NEXT:    nop
422; PC64LE-NEXT:    addi 1, 1, 32
423; PC64LE-NEXT:    ld 0, 16(1)
424; PC64LE-NEXT:    mtlr 0
425; PC64LE-NEXT:    blr
426;
427; PC64LE9-LABEL: test_sin_ppc_fp128:
428; PC64LE9:       # %bb.0: # %entry
429; PC64LE9-NEXT:    mflr 0
430; PC64LE9-NEXT:    std 0, 16(1)
431; PC64LE9-NEXT:    stdu 1, -32(1)
432; PC64LE9-NEXT:    bl sinl
433; PC64LE9-NEXT:    nop
434; PC64LE9-NEXT:    addi 1, 1, 32
435; PC64LE9-NEXT:    ld 0, 16(1)
436; PC64LE9-NEXT:    mtlr 0
437; PC64LE9-NEXT:    blr
438;
439; PC64-LABEL: test_sin_ppc_fp128:
440; PC64:       # %bb.0: # %entry
441; PC64-NEXT:    mflr 0
442; PC64-NEXT:    std 0, 16(1)
443; PC64-NEXT:    stdu 1, -112(1)
444; PC64-NEXT:    bl sinl
445; PC64-NEXT:    nop
446; PC64-NEXT:    addi 1, 1, 112
447; PC64-NEXT:    ld 0, 16(1)
448; PC64-NEXT:    mtlr 0
449; PC64-NEXT:    blr
450entry:
451  %sin = call ppc_fp128 @llvm.experimental.constrained.sin.ppcf128(
452                    ppc_fp128 %first,
453                    metadata !"round.dynamic",
454                    metadata !"fpexcept.strict") #1
455  ret ppc_fp128 %sin
456}
457
458define ppc_fp128 @test_cos_ppc_fp128(ppc_fp128 %first) #0 {
459; PC64LE-LABEL: test_cos_ppc_fp128:
460; PC64LE:       # %bb.0: # %entry
461; PC64LE-NEXT:    mflr 0
462; PC64LE-NEXT:    std 0, 16(1)
463; PC64LE-NEXT:    stdu 1, -32(1)
464; PC64LE-NEXT:    bl cosl
465; PC64LE-NEXT:    nop
466; PC64LE-NEXT:    addi 1, 1, 32
467; PC64LE-NEXT:    ld 0, 16(1)
468; PC64LE-NEXT:    mtlr 0
469; PC64LE-NEXT:    blr
470;
471; PC64LE9-LABEL: test_cos_ppc_fp128:
472; PC64LE9:       # %bb.0: # %entry
473; PC64LE9-NEXT:    mflr 0
474; PC64LE9-NEXT:    std 0, 16(1)
475; PC64LE9-NEXT:    stdu 1, -32(1)
476; PC64LE9-NEXT:    bl cosl
477; PC64LE9-NEXT:    nop
478; PC64LE9-NEXT:    addi 1, 1, 32
479; PC64LE9-NEXT:    ld 0, 16(1)
480; PC64LE9-NEXT:    mtlr 0
481; PC64LE9-NEXT:    blr
482;
483; PC64-LABEL: test_cos_ppc_fp128:
484; PC64:       # %bb.0: # %entry
485; PC64-NEXT:    mflr 0
486; PC64-NEXT:    std 0, 16(1)
487; PC64-NEXT:    stdu 1, -112(1)
488; PC64-NEXT:    bl cosl
489; PC64-NEXT:    nop
490; PC64-NEXT:    addi 1, 1, 112
491; PC64-NEXT:    ld 0, 16(1)
492; PC64-NEXT:    mtlr 0
493; PC64-NEXT:    blr
494entry:
495  %cos = call ppc_fp128 @llvm.experimental.constrained.cos.ppcf128(
496                    ppc_fp128 %first,
497                    metadata !"round.dynamic",
498                    metadata !"fpexcept.strict") #1
499  ret ppc_fp128 %cos
500}
501
502define ppc_fp128 @test_exp_ppc_fp128(ppc_fp128 %first) #0 {
503; PC64LE-LABEL: test_exp_ppc_fp128:
504; PC64LE:       # %bb.0: # %entry
505; PC64LE-NEXT:    mflr 0
506; PC64LE-NEXT:    std 0, 16(1)
507; PC64LE-NEXT:    stdu 1, -32(1)
508; PC64LE-NEXT:    bl expl
509; PC64LE-NEXT:    nop
510; PC64LE-NEXT:    addi 1, 1, 32
511; PC64LE-NEXT:    ld 0, 16(1)
512; PC64LE-NEXT:    mtlr 0
513; PC64LE-NEXT:    blr
514;
515; PC64LE9-LABEL: test_exp_ppc_fp128:
516; PC64LE9:       # %bb.0: # %entry
517; PC64LE9-NEXT:    mflr 0
518; PC64LE9-NEXT:    std 0, 16(1)
519; PC64LE9-NEXT:    stdu 1, -32(1)
520; PC64LE9-NEXT:    bl expl
521; PC64LE9-NEXT:    nop
522; PC64LE9-NEXT:    addi 1, 1, 32
523; PC64LE9-NEXT:    ld 0, 16(1)
524; PC64LE9-NEXT:    mtlr 0
525; PC64LE9-NEXT:    blr
526;
527; PC64-LABEL: test_exp_ppc_fp128:
528; PC64:       # %bb.0: # %entry
529; PC64-NEXT:    mflr 0
530; PC64-NEXT:    std 0, 16(1)
531; PC64-NEXT:    stdu 1, -112(1)
532; PC64-NEXT:    bl expl
533; PC64-NEXT:    nop
534; PC64-NEXT:    addi 1, 1, 112
535; PC64-NEXT:    ld 0, 16(1)
536; PC64-NEXT:    mtlr 0
537; PC64-NEXT:    blr
538entry:
539  %exp = call ppc_fp128 @llvm.experimental.constrained.exp.ppcf128(
540                    ppc_fp128 %first,
541                    metadata !"round.dynamic",
542                    metadata !"fpexcept.strict") #1
543  ret ppc_fp128 %exp
544}
545
546define ppc_fp128 @test_exp2_ppc_fp128(ppc_fp128 %first) #0 {
547; PC64LE-LABEL: test_exp2_ppc_fp128:
548; PC64LE:       # %bb.0: # %entry
549; PC64LE-NEXT:    mflr 0
550; PC64LE-NEXT:    std 0, 16(1)
551; PC64LE-NEXT:    stdu 1, -32(1)
552; PC64LE-NEXT:    bl exp2l
553; PC64LE-NEXT:    nop
554; PC64LE-NEXT:    addi 1, 1, 32
555; PC64LE-NEXT:    ld 0, 16(1)
556; PC64LE-NEXT:    mtlr 0
557; PC64LE-NEXT:    blr
558;
559; PC64LE9-LABEL: test_exp2_ppc_fp128:
560; PC64LE9:       # %bb.0: # %entry
561; PC64LE9-NEXT:    mflr 0
562; PC64LE9-NEXT:    std 0, 16(1)
563; PC64LE9-NEXT:    stdu 1, -32(1)
564; PC64LE9-NEXT:    bl exp2l
565; PC64LE9-NEXT:    nop
566; PC64LE9-NEXT:    addi 1, 1, 32
567; PC64LE9-NEXT:    ld 0, 16(1)
568; PC64LE9-NEXT:    mtlr 0
569; PC64LE9-NEXT:    blr
570;
571; PC64-LABEL: test_exp2_ppc_fp128:
572; PC64:       # %bb.0: # %entry
573; PC64-NEXT:    mflr 0
574; PC64-NEXT:    std 0, 16(1)
575; PC64-NEXT:    stdu 1, -112(1)
576; PC64-NEXT:    bl exp2l
577; PC64-NEXT:    nop
578; PC64-NEXT:    addi 1, 1, 112
579; PC64-NEXT:    ld 0, 16(1)
580; PC64-NEXT:    mtlr 0
581; PC64-NEXT:    blr
582entry:
583  %exp2 = call ppc_fp128 @llvm.experimental.constrained.exp2.ppcf128(
584                    ppc_fp128 %first,
585                    metadata !"round.dynamic",
586                    metadata !"fpexcept.strict") #1
587  ret ppc_fp128 %exp2
588}
589
590define ppc_fp128 @test_log_ppc_fp128(ppc_fp128 %first) #0 {
591; PC64LE-LABEL: test_log_ppc_fp128:
592; PC64LE:       # %bb.0: # %entry
593; PC64LE-NEXT:    mflr 0
594; PC64LE-NEXT:    std 0, 16(1)
595; PC64LE-NEXT:    stdu 1, -32(1)
596; PC64LE-NEXT:    bl logl
597; PC64LE-NEXT:    nop
598; PC64LE-NEXT:    addi 1, 1, 32
599; PC64LE-NEXT:    ld 0, 16(1)
600; PC64LE-NEXT:    mtlr 0
601; PC64LE-NEXT:    blr
602;
603; PC64LE9-LABEL: test_log_ppc_fp128:
604; PC64LE9:       # %bb.0: # %entry
605; PC64LE9-NEXT:    mflr 0
606; PC64LE9-NEXT:    std 0, 16(1)
607; PC64LE9-NEXT:    stdu 1, -32(1)
608; PC64LE9-NEXT:    bl logl
609; PC64LE9-NEXT:    nop
610; PC64LE9-NEXT:    addi 1, 1, 32
611; PC64LE9-NEXT:    ld 0, 16(1)
612; PC64LE9-NEXT:    mtlr 0
613; PC64LE9-NEXT:    blr
614;
615; PC64-LABEL: test_log_ppc_fp128:
616; PC64:       # %bb.0: # %entry
617; PC64-NEXT:    mflr 0
618; PC64-NEXT:    std 0, 16(1)
619; PC64-NEXT:    stdu 1, -112(1)
620; PC64-NEXT:    bl logl
621; PC64-NEXT:    nop
622; PC64-NEXT:    addi 1, 1, 112
623; PC64-NEXT:    ld 0, 16(1)
624; PC64-NEXT:    mtlr 0
625; PC64-NEXT:    blr
626entry:
627  %log = call ppc_fp128 @llvm.experimental.constrained.log.ppcf128(
628                    ppc_fp128 %first,
629                    metadata !"round.dynamic",
630                    metadata !"fpexcept.strict") #1
631  ret ppc_fp128 %log
632}
633
634define ppc_fp128 @test_log2_ppc_fp128(ppc_fp128 %first) #0 {
635; PC64LE-LABEL: test_log2_ppc_fp128:
636; PC64LE:       # %bb.0: # %entry
637; PC64LE-NEXT:    mflr 0
638; PC64LE-NEXT:    std 0, 16(1)
639; PC64LE-NEXT:    stdu 1, -32(1)
640; PC64LE-NEXT:    bl log2l
641; PC64LE-NEXT:    nop
642; PC64LE-NEXT:    addi 1, 1, 32
643; PC64LE-NEXT:    ld 0, 16(1)
644; PC64LE-NEXT:    mtlr 0
645; PC64LE-NEXT:    blr
646;
647; PC64LE9-LABEL: test_log2_ppc_fp128:
648; PC64LE9:       # %bb.0: # %entry
649; PC64LE9-NEXT:    mflr 0
650; PC64LE9-NEXT:    std 0, 16(1)
651; PC64LE9-NEXT:    stdu 1, -32(1)
652; PC64LE9-NEXT:    bl log2l
653; PC64LE9-NEXT:    nop
654; PC64LE9-NEXT:    addi 1, 1, 32
655; PC64LE9-NEXT:    ld 0, 16(1)
656; PC64LE9-NEXT:    mtlr 0
657; PC64LE9-NEXT:    blr
658;
659; PC64-LABEL: test_log2_ppc_fp128:
660; PC64:       # %bb.0: # %entry
661; PC64-NEXT:    mflr 0
662; PC64-NEXT:    std 0, 16(1)
663; PC64-NEXT:    stdu 1, -112(1)
664; PC64-NEXT:    bl log2l
665; PC64-NEXT:    nop
666; PC64-NEXT:    addi 1, 1, 112
667; PC64-NEXT:    ld 0, 16(1)
668; PC64-NEXT:    mtlr 0
669; PC64-NEXT:    blr
670entry:
671  %log2 = call ppc_fp128 @llvm.experimental.constrained.log2.ppcf128(
672                    ppc_fp128 %first,
673                    metadata !"round.dynamic",
674                    metadata !"fpexcept.strict") #1
675  ret ppc_fp128 %log2
676}
677
678define ppc_fp128 @test_log10_ppc_fp128(ppc_fp128 %first) #0 {
679; PC64LE-LABEL: test_log10_ppc_fp128:
680; PC64LE:       # %bb.0: # %entry
681; PC64LE-NEXT:    mflr 0
682; PC64LE-NEXT:    std 0, 16(1)
683; PC64LE-NEXT:    stdu 1, -32(1)
684; PC64LE-NEXT:    bl log10l
685; PC64LE-NEXT:    nop
686; PC64LE-NEXT:    addi 1, 1, 32
687; PC64LE-NEXT:    ld 0, 16(1)
688; PC64LE-NEXT:    mtlr 0
689; PC64LE-NEXT:    blr
690;
691; PC64LE9-LABEL: test_log10_ppc_fp128:
692; PC64LE9:       # %bb.0: # %entry
693; PC64LE9-NEXT:    mflr 0
694; PC64LE9-NEXT:    std 0, 16(1)
695; PC64LE9-NEXT:    stdu 1, -32(1)
696; PC64LE9-NEXT:    bl log10l
697; PC64LE9-NEXT:    nop
698; PC64LE9-NEXT:    addi 1, 1, 32
699; PC64LE9-NEXT:    ld 0, 16(1)
700; PC64LE9-NEXT:    mtlr 0
701; PC64LE9-NEXT:    blr
702;
703; PC64-LABEL: test_log10_ppc_fp128:
704; PC64:       # %bb.0: # %entry
705; PC64-NEXT:    mflr 0
706; PC64-NEXT:    std 0, 16(1)
707; PC64-NEXT:    stdu 1, -112(1)
708; PC64-NEXT:    bl log10l
709; PC64-NEXT:    nop
710; PC64-NEXT:    addi 1, 1, 112
711; PC64-NEXT:    ld 0, 16(1)
712; PC64-NEXT:    mtlr 0
713; PC64-NEXT:    blr
714entry:
715  %log10 = call ppc_fp128 @llvm.experimental.constrained.log10.ppcf128(
716                    ppc_fp128 %first,
717                    metadata !"round.dynamic",
718                    metadata !"fpexcept.strict") #1
719  ret ppc_fp128 %log10
720}
721
722define ppc_fp128 @test_rint_ppc_fp128(ppc_fp128 %first) #0 {
723; PC64LE-LABEL: test_rint_ppc_fp128:
724; PC64LE:       # %bb.0: # %entry
725; PC64LE-NEXT:    mflr 0
726; PC64LE-NEXT:    std 0, 16(1)
727; PC64LE-NEXT:    stdu 1, -32(1)
728; PC64LE-NEXT:    bl rintl
729; PC64LE-NEXT:    nop
730; PC64LE-NEXT:    addi 1, 1, 32
731; PC64LE-NEXT:    ld 0, 16(1)
732; PC64LE-NEXT:    mtlr 0
733; PC64LE-NEXT:    blr
734;
735; PC64LE9-LABEL: test_rint_ppc_fp128:
736; PC64LE9:       # %bb.0: # %entry
737; PC64LE9-NEXT:    mflr 0
738; PC64LE9-NEXT:    std 0, 16(1)
739; PC64LE9-NEXT:    stdu 1, -32(1)
740; PC64LE9-NEXT:    bl rintl
741; PC64LE9-NEXT:    nop
742; PC64LE9-NEXT:    addi 1, 1, 32
743; PC64LE9-NEXT:    ld 0, 16(1)
744; PC64LE9-NEXT:    mtlr 0
745; PC64LE9-NEXT:    blr
746;
747; PC64-LABEL: test_rint_ppc_fp128:
748; PC64:       # %bb.0: # %entry
749; PC64-NEXT:    mflr 0
750; PC64-NEXT:    std 0, 16(1)
751; PC64-NEXT:    stdu 1, -112(1)
752; PC64-NEXT:    bl rintl
753; PC64-NEXT:    nop
754; PC64-NEXT:    addi 1, 1, 112
755; PC64-NEXT:    ld 0, 16(1)
756; PC64-NEXT:    mtlr 0
757; PC64-NEXT:    blr
758entry:
759  %rint = call ppc_fp128 @llvm.experimental.constrained.rint.ppcf128(
760                    ppc_fp128 %first,
761                    metadata !"round.dynamic",
762                    metadata !"fpexcept.strict") #1
763  ret ppc_fp128 %rint
764}
765
766define ppc_fp128 @test_nearbyint_ppc_fp128(ppc_fp128 %first) #0 {
767; PC64LE-LABEL: test_nearbyint_ppc_fp128:
768; PC64LE:       # %bb.0: # %entry
769; PC64LE-NEXT:    mflr 0
770; PC64LE-NEXT:    std 0, 16(1)
771; PC64LE-NEXT:    stdu 1, -32(1)
772; PC64LE-NEXT:    bl nearbyintl
773; PC64LE-NEXT:    nop
774; PC64LE-NEXT:    addi 1, 1, 32
775; PC64LE-NEXT:    ld 0, 16(1)
776; PC64LE-NEXT:    mtlr 0
777; PC64LE-NEXT:    blr
778;
779; PC64LE9-LABEL: test_nearbyint_ppc_fp128:
780; PC64LE9:       # %bb.0: # %entry
781; PC64LE9-NEXT:    mflr 0
782; PC64LE9-NEXT:    std 0, 16(1)
783; PC64LE9-NEXT:    stdu 1, -32(1)
784; PC64LE9-NEXT:    bl nearbyintl
785; PC64LE9-NEXT:    nop
786; PC64LE9-NEXT:    addi 1, 1, 32
787; PC64LE9-NEXT:    ld 0, 16(1)
788; PC64LE9-NEXT:    mtlr 0
789; PC64LE9-NEXT:    blr
790;
791; PC64-LABEL: test_nearbyint_ppc_fp128:
792; PC64:       # %bb.0: # %entry
793; PC64-NEXT:    mflr 0
794; PC64-NEXT:    std 0, 16(1)
795; PC64-NEXT:    stdu 1, -112(1)
796; PC64-NEXT:    bl nearbyintl
797; PC64-NEXT:    nop
798; PC64-NEXT:    addi 1, 1, 112
799; PC64-NEXT:    ld 0, 16(1)
800; PC64-NEXT:    mtlr 0
801; PC64-NEXT:    blr
802entry:
803  %nearbyint = call ppc_fp128 @llvm.experimental.constrained.nearbyint.ppcf128(
804                    ppc_fp128 %first,
805                    metadata !"round.dynamic",
806                    metadata !"fpexcept.strict") #1
807  ret ppc_fp128 %nearbyint
808}
809
810define ppc_fp128 @test_maxnum_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
811; PC64LE-LABEL: test_maxnum_ppc_fp128:
812; PC64LE:       # %bb.0: # %entry
813; PC64LE-NEXT:    mflr 0
814; PC64LE-NEXT:    std 0, 16(1)
815; PC64LE-NEXT:    stdu 1, -32(1)
816; PC64LE-NEXT:    bl fmaxl
817; PC64LE-NEXT:    nop
818; PC64LE-NEXT:    addi 1, 1, 32
819; PC64LE-NEXT:    ld 0, 16(1)
820; PC64LE-NEXT:    mtlr 0
821; PC64LE-NEXT:    blr
822;
823; PC64LE9-LABEL: test_maxnum_ppc_fp128:
824; PC64LE9:       # %bb.0: # %entry
825; PC64LE9-NEXT:    mflr 0
826; PC64LE9-NEXT:    std 0, 16(1)
827; PC64LE9-NEXT:    stdu 1, -32(1)
828; PC64LE9-NEXT:    bl fmaxl
829; PC64LE9-NEXT:    nop
830; PC64LE9-NEXT:    addi 1, 1, 32
831; PC64LE9-NEXT:    ld 0, 16(1)
832; PC64LE9-NEXT:    mtlr 0
833; PC64LE9-NEXT:    blr
834;
835; PC64-LABEL: test_maxnum_ppc_fp128:
836; PC64:       # %bb.0: # %entry
837; PC64-NEXT:    mflr 0
838; PC64-NEXT:    std 0, 16(1)
839; PC64-NEXT:    stdu 1, -112(1)
840; PC64-NEXT:    bl fmaxl
841; PC64-NEXT:    nop
842; PC64-NEXT:    addi 1, 1, 112
843; PC64-NEXT:    ld 0, 16(1)
844; PC64-NEXT:    mtlr 0
845; PC64-NEXT:    blr
846entry:
847  %maxnum = call ppc_fp128 @llvm.experimental.constrained.maxnum.ppcf128(
848                    ppc_fp128 %first,
849                    ppc_fp128 %second,
850                    metadata !"fpexcept.strict") #1
851  ret ppc_fp128 %maxnum
852}
853
854define ppc_fp128 @test_minnum_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
855; PC64LE-LABEL: test_minnum_ppc_fp128:
856; PC64LE:       # %bb.0: # %entry
857; PC64LE-NEXT:    mflr 0
858; PC64LE-NEXT:    std 0, 16(1)
859; PC64LE-NEXT:    stdu 1, -32(1)
860; PC64LE-NEXT:    bl fminl
861; PC64LE-NEXT:    nop
862; PC64LE-NEXT:    addi 1, 1, 32
863; PC64LE-NEXT:    ld 0, 16(1)
864; PC64LE-NEXT:    mtlr 0
865; PC64LE-NEXT:    blr
866;
867; PC64LE9-LABEL: test_minnum_ppc_fp128:
868; PC64LE9:       # %bb.0: # %entry
869; PC64LE9-NEXT:    mflr 0
870; PC64LE9-NEXT:    std 0, 16(1)
871; PC64LE9-NEXT:    stdu 1, -32(1)
872; PC64LE9-NEXT:    bl fminl
873; PC64LE9-NEXT:    nop
874; PC64LE9-NEXT:    addi 1, 1, 32
875; PC64LE9-NEXT:    ld 0, 16(1)
876; PC64LE9-NEXT:    mtlr 0
877; PC64LE9-NEXT:    blr
878;
879; PC64-LABEL: test_minnum_ppc_fp128:
880; PC64:       # %bb.0: # %entry
881; PC64-NEXT:    mflr 0
882; PC64-NEXT:    std 0, 16(1)
883; PC64-NEXT:    stdu 1, -112(1)
884; PC64-NEXT:    bl fminl
885; PC64-NEXT:    nop
886; PC64-NEXT:    addi 1, 1, 112
887; PC64-NEXT:    ld 0, 16(1)
888; PC64-NEXT:    mtlr 0
889; PC64-NEXT:    blr
890entry:
891  %minnum = call ppc_fp128 @llvm.experimental.constrained.minnum.ppcf128(
892                    ppc_fp128 %first,
893                    ppc_fp128 %second,
894                    metadata !"fpexcept.strict") #1
895  ret ppc_fp128 %minnum
896}
897
898define ppc_fp128 @test_ceil_ppc_fp128(ppc_fp128 %first) #0 {
899; PC64LE-LABEL: test_ceil_ppc_fp128:
900; PC64LE:       # %bb.0: # %entry
901; PC64LE-NEXT:    mflr 0
902; PC64LE-NEXT:    std 0, 16(1)
903; PC64LE-NEXT:    stdu 1, -32(1)
904; PC64LE-NEXT:    bl ceill
905; PC64LE-NEXT:    nop
906; PC64LE-NEXT:    addi 1, 1, 32
907; PC64LE-NEXT:    ld 0, 16(1)
908; PC64LE-NEXT:    mtlr 0
909; PC64LE-NEXT:    blr
910;
911; PC64LE9-LABEL: test_ceil_ppc_fp128:
912; PC64LE9:       # %bb.0: # %entry
913; PC64LE9-NEXT:    mflr 0
914; PC64LE9-NEXT:    std 0, 16(1)
915; PC64LE9-NEXT:    stdu 1, -32(1)
916; PC64LE9-NEXT:    bl ceill
917; PC64LE9-NEXT:    nop
918; PC64LE9-NEXT:    addi 1, 1, 32
919; PC64LE9-NEXT:    ld 0, 16(1)
920; PC64LE9-NEXT:    mtlr 0
921; PC64LE9-NEXT:    blr
922;
923; PC64-LABEL: test_ceil_ppc_fp128:
924; PC64:       # %bb.0: # %entry
925; PC64-NEXT:    mflr 0
926; PC64-NEXT:    std 0, 16(1)
927; PC64-NEXT:    stdu 1, -112(1)
928; PC64-NEXT:    bl ceill
929; PC64-NEXT:    nop
930; PC64-NEXT:    addi 1, 1, 112
931; PC64-NEXT:    ld 0, 16(1)
932; PC64-NEXT:    mtlr 0
933; PC64-NEXT:    blr
934entry:
935  %ceil = call ppc_fp128 @llvm.experimental.constrained.ceil.ppcf128(
936                    ppc_fp128 %first,
937                    metadata !"fpexcept.strict") #1
938  ret ppc_fp128 %ceil
939}
940
941define ppc_fp128 @test_floor_ppc_fp128(ppc_fp128 %first) #0 {
942; PC64LE-LABEL: test_floor_ppc_fp128:
943; PC64LE:       # %bb.0: # %entry
944; PC64LE-NEXT:    mflr 0
945; PC64LE-NEXT:    std 0, 16(1)
946; PC64LE-NEXT:    stdu 1, -32(1)
947; PC64LE-NEXT:    bl floorl
948; PC64LE-NEXT:    nop
949; PC64LE-NEXT:    addi 1, 1, 32
950; PC64LE-NEXT:    ld 0, 16(1)
951; PC64LE-NEXT:    mtlr 0
952; PC64LE-NEXT:    blr
953;
954; PC64LE9-LABEL: test_floor_ppc_fp128:
955; PC64LE9:       # %bb.0: # %entry
956; PC64LE9-NEXT:    mflr 0
957; PC64LE9-NEXT:    std 0, 16(1)
958; PC64LE9-NEXT:    stdu 1, -32(1)
959; PC64LE9-NEXT:    bl floorl
960; PC64LE9-NEXT:    nop
961; PC64LE9-NEXT:    addi 1, 1, 32
962; PC64LE9-NEXT:    ld 0, 16(1)
963; PC64LE9-NEXT:    mtlr 0
964; PC64LE9-NEXT:    blr
965;
966; PC64-LABEL: test_floor_ppc_fp128:
967; PC64:       # %bb.0: # %entry
968; PC64-NEXT:    mflr 0
969; PC64-NEXT:    std 0, 16(1)
970; PC64-NEXT:    stdu 1, -112(1)
971; PC64-NEXT:    bl floorl
972; PC64-NEXT:    nop
973; PC64-NEXT:    addi 1, 1, 112
974; PC64-NEXT:    ld 0, 16(1)
975; PC64-NEXT:    mtlr 0
976; PC64-NEXT:    blr
977entry:
978  %floor = call ppc_fp128 @llvm.experimental.constrained.floor.ppcf128(
979                    ppc_fp128 %first,
980                    metadata !"fpexcept.strict") #1
981  ret ppc_fp128 %floor
982}
983
984define ppc_fp128 @test_round_ppc_fp128(ppc_fp128 %first) #0 {
985; PC64LE-LABEL: test_round_ppc_fp128:
986; PC64LE:       # %bb.0: # %entry
987; PC64LE-NEXT:    mflr 0
988; PC64LE-NEXT:    std 0, 16(1)
989; PC64LE-NEXT:    stdu 1, -32(1)
990; PC64LE-NEXT:    bl roundl
991; PC64LE-NEXT:    nop
992; PC64LE-NEXT:    addi 1, 1, 32
993; PC64LE-NEXT:    ld 0, 16(1)
994; PC64LE-NEXT:    mtlr 0
995; PC64LE-NEXT:    blr
996;
997; PC64LE9-LABEL: test_round_ppc_fp128:
998; PC64LE9:       # %bb.0: # %entry
999; PC64LE9-NEXT:    mflr 0
1000; PC64LE9-NEXT:    std 0, 16(1)
1001; PC64LE9-NEXT:    stdu 1, -32(1)
1002; PC64LE9-NEXT:    bl roundl
1003; PC64LE9-NEXT:    nop
1004; PC64LE9-NEXT:    addi 1, 1, 32
1005; PC64LE9-NEXT:    ld 0, 16(1)
1006; PC64LE9-NEXT:    mtlr 0
1007; PC64LE9-NEXT:    blr
1008;
1009; PC64-LABEL: test_round_ppc_fp128:
1010; PC64:       # %bb.0: # %entry
1011; PC64-NEXT:    mflr 0
1012; PC64-NEXT:    std 0, 16(1)
1013; PC64-NEXT:    stdu 1, -112(1)
1014; PC64-NEXT:    bl roundl
1015; PC64-NEXT:    nop
1016; PC64-NEXT:    addi 1, 1, 112
1017; PC64-NEXT:    ld 0, 16(1)
1018; PC64-NEXT:    mtlr 0
1019; PC64-NEXT:    blr
1020entry:
1021  %round = call ppc_fp128 @llvm.experimental.constrained.round.ppcf128(
1022                    ppc_fp128 %first,
1023                    metadata !"fpexcept.strict") #1
1024  ret ppc_fp128 %round
1025}
1026
1027define ppc_fp128 @test_trunc_ppc_fp128(ppc_fp128 %first) #0 {
1028; PC64LE-LABEL: test_trunc_ppc_fp128:
1029; PC64LE:       # %bb.0: # %entry
1030; PC64LE-NEXT:    mflr 0
1031; PC64LE-NEXT:    std 0, 16(1)
1032; PC64LE-NEXT:    stdu 1, -32(1)
1033; PC64LE-NEXT:    bl truncl
1034; PC64LE-NEXT:    nop
1035; PC64LE-NEXT:    addi 1, 1, 32
1036; PC64LE-NEXT:    ld 0, 16(1)
1037; PC64LE-NEXT:    mtlr 0
1038; PC64LE-NEXT:    blr
1039;
1040; PC64LE9-LABEL: test_trunc_ppc_fp128:
1041; PC64LE9:       # %bb.0: # %entry
1042; PC64LE9-NEXT:    mflr 0
1043; PC64LE9-NEXT:    std 0, 16(1)
1044; PC64LE9-NEXT:    stdu 1, -32(1)
1045; PC64LE9-NEXT:    bl truncl
1046; PC64LE9-NEXT:    nop
1047; PC64LE9-NEXT:    addi 1, 1, 32
1048; PC64LE9-NEXT:    ld 0, 16(1)
1049; PC64LE9-NEXT:    mtlr 0
1050; PC64LE9-NEXT:    blr
1051;
1052; PC64-LABEL: test_trunc_ppc_fp128:
1053; PC64:       # %bb.0: # %entry
1054; PC64-NEXT:    mflr 0
1055; PC64-NEXT:    std 0, 16(1)
1056; PC64-NEXT:    stdu 1, -112(1)
1057; PC64-NEXT:    bl truncl
1058; PC64-NEXT:    nop
1059; PC64-NEXT:    addi 1, 1, 112
1060; PC64-NEXT:    ld 0, 16(1)
1061; PC64-NEXT:    mtlr 0
1062; PC64-NEXT:    blr
1063entry:
1064  %trunc = call ppc_fp128 @llvm.experimental.constrained.trunc.ppcf128(
1065                    ppc_fp128 %first,
1066                    metadata !"fpexcept.strict") #1
1067  ret ppc_fp128 %trunc
1068}
1069
1070define float @test_fptrunc_ppc_fp128_f32(ppc_fp128 %first) #0 {
1071; PC64LE-LABEL: test_fptrunc_ppc_fp128_f32:
1072; PC64LE:       # %bb.0: # %entry
1073; PC64LE-NEXT:    xsrsp 1, 1
1074; PC64LE-NEXT:    blr
1075;
1076; PC64LE9-LABEL: test_fptrunc_ppc_fp128_f32:
1077; PC64LE9:       # %bb.0: # %entry
1078; PC64LE9-NEXT:    xsrsp 1, 1
1079; PC64LE9-NEXT:    blr
1080;
1081; PC64-LABEL: test_fptrunc_ppc_fp128_f32:
1082; PC64:       # %bb.0: # %entry
1083; PC64-NEXT:    frsp 1, 1
1084; PC64-NEXT:    blr
1085entry:
1086  %fptrunc = call float @llvm.experimental.constrained.fptrunc.ppcf128.f32(
1087                    ppc_fp128 %first,
1088                    metadata !"round.dynamic",
1089                    metadata !"fpexcept.strict") #1
1090  ret float %fptrunc
1091}
1092
1093define double @test_fptrunc_ppc_fp128_f64(ppc_fp128 %first) #0 {
1094; PC64LE-LABEL: test_fptrunc_ppc_fp128_f64:
1095; PC64LE:       # %bb.0: # %entry
1096; PC64LE-NEXT:    blr
1097;
1098; PC64LE9-LABEL: test_fptrunc_ppc_fp128_f64:
1099; PC64LE9:       # %bb.0: # %entry
1100; PC64LE9-NEXT:    blr
1101;
1102; PC64-LABEL: test_fptrunc_ppc_fp128_f64:
1103; PC64:       # %bb.0: # %entry
1104; PC64-NEXT:    blr
1105entry:
1106  %fptrunc = call double @llvm.experimental.constrained.fptrunc.ppcf128.f64(
1107                    ppc_fp128 %first,
1108                    metadata !"round.dynamic",
1109                    metadata !"fpexcept.strict") #1
1110  ret double %fptrunc
1111}
1112
1113define ppc_fp128 @test_fpext_ppc_fp128_f32(float %first) #0 {
1114; PC64LE-LABEL: test_fpext_ppc_fp128_f32:
1115; PC64LE:       # %bb.0: # %entry
1116; PC64LE-NEXT:    xxlxor 2, 2, 2
1117; PC64LE-NEXT:    blr
1118;
1119; PC64LE9-LABEL: test_fpext_ppc_fp128_f32:
1120; PC64LE9:       # %bb.0: # %entry
1121; PC64LE9-NEXT:    xxlxor 2, 2, 2
1122; PC64LE9-NEXT:    blr
1123;
1124; PC64-LABEL: test_fpext_ppc_fp128_f32:
1125; PC64:       # %bb.0: # %entry
1126; PC64-NEXT:    addis 3, 2, .LCPI26_0@toc@ha
1127; PC64-NEXT:    lfs 2, .LCPI26_0@toc@l(3)
1128; PC64-NEXT:    blr
1129entry:
1130  %fpext = call ppc_fp128 @llvm.experimental.constrained.fpext.f32.ppcf128(
1131                    float %first,
1132                    metadata !"fpexcept.strict") #1
1133  ret ppc_fp128 %fpext
1134}
1135
1136define ppc_fp128 @test_fpext_ppc_fp128_f64(double %first) #0 {
1137; PC64LE-LABEL: test_fpext_ppc_fp128_f64:
1138; PC64LE:       # %bb.0: # %entry
1139; PC64LE-NEXT:    xxlxor 2, 2, 2
1140; PC64LE-NEXT:    blr
1141;
1142; PC64LE9-LABEL: test_fpext_ppc_fp128_f64:
1143; PC64LE9:       # %bb.0: # %entry
1144; PC64LE9-NEXT:    xxlxor 2, 2, 2
1145; PC64LE9-NEXT:    blr
1146;
1147; PC64-LABEL: test_fpext_ppc_fp128_f64:
1148; PC64:       # %bb.0: # %entry
1149; PC64-NEXT:    addis 3, 2, .LCPI27_0@toc@ha
1150; PC64-NEXT:    lfs 2, .LCPI27_0@toc@l(3)
1151; PC64-NEXT:    blr
1152entry:
1153  %fpext = call ppc_fp128 @llvm.experimental.constrained.fpext.f64.ppcf128(
1154                    double %first,
1155                    metadata !"fpexcept.strict") #1
1156  ret ppc_fp128 %fpext
1157}
1158
1159define i64 @test_fptosi_ppc_i64_ppc_fp128(ppc_fp128 %first) #0 {
1160; PC64LE-LABEL: test_fptosi_ppc_i64_ppc_fp128:
1161; PC64LE:       # %bb.0: # %entry
1162; PC64LE-NEXT:    mflr 0
1163; PC64LE-NEXT:    std 0, 16(1)
1164; PC64LE-NEXT:    stdu 1, -32(1)
1165; PC64LE-NEXT:    bl __fixtfdi
1166; PC64LE-NEXT:    nop
1167; PC64LE-NEXT:    addi 1, 1, 32
1168; PC64LE-NEXT:    ld 0, 16(1)
1169; PC64LE-NEXT:    mtlr 0
1170; PC64LE-NEXT:    blr
1171;
1172; PC64LE9-LABEL: test_fptosi_ppc_i64_ppc_fp128:
1173; PC64LE9:       # %bb.0: # %entry
1174; PC64LE9-NEXT:    mflr 0
1175; PC64LE9-NEXT:    std 0, 16(1)
1176; PC64LE9-NEXT:    stdu 1, -32(1)
1177; PC64LE9-NEXT:    bl __fixtfdi
1178; PC64LE9-NEXT:    nop
1179; PC64LE9-NEXT:    addi 1, 1, 32
1180; PC64LE9-NEXT:    ld 0, 16(1)
1181; PC64LE9-NEXT:    mtlr 0
1182; PC64LE9-NEXT:    blr
1183;
1184; PC64-LABEL: test_fptosi_ppc_i64_ppc_fp128:
1185; PC64:       # %bb.0: # %entry
1186; PC64-NEXT:    mflr 0
1187; PC64-NEXT:    std 0, 16(1)
1188; PC64-NEXT:    stdu 1, -112(1)
1189; PC64-NEXT:    bl __fixtfdi
1190; PC64-NEXT:    nop
1191; PC64-NEXT:    addi 1, 1, 112
1192; PC64-NEXT:    ld 0, 16(1)
1193; PC64-NEXT:    mtlr 0
1194; PC64-NEXT:    blr
1195entry:
1196  %fpext = call i64 @llvm.experimental.constrained.fptosi.i64.ppcf128(
1197                    ppc_fp128 %first,
1198                    metadata !"fpexcept.strict") #1
1199  ret i64 %fpext
1200}
1201
1202define i32 @test_fptosi_ppc_i32_ppc_fp128(ppc_fp128 %first) #0 {
1203; PC64LE-LABEL: test_fptosi_ppc_i32_ppc_fp128:
1204; PC64LE:       # %bb.0: # %entry
1205; PC64LE-NEXT:    mffs 0
1206; PC64LE-NEXT:    mtfsb1 31
1207; PC64LE-NEXT:    mtfsb0 30
1208; PC64LE-NEXT:    fadd 1, 2, 1
1209; PC64LE-NEXT:    mtfsf 1, 0
1210; PC64LE-NEXT:    xscvdpsxws 0, 1
1211; PC64LE-NEXT:    mffprwz 3, 0
1212; PC64LE-NEXT:    blr
1213;
1214; PC64LE9-LABEL: test_fptosi_ppc_i32_ppc_fp128:
1215; PC64LE9:       # %bb.0: # %entry
1216; PC64LE9-NEXT:    mffs 0
1217; PC64LE9-NEXT:    mtfsb1 31
1218; PC64LE9-NEXT:    mtfsb0 30
1219; PC64LE9-NEXT:    fadd 1, 2, 1
1220; PC64LE9-NEXT:    mtfsf 1, 0
1221; PC64LE9-NEXT:    xscvdpsxws 0, 1
1222; PC64LE9-NEXT:    mffprwz 3, 0
1223; PC64LE9-NEXT:    blr
1224;
1225; PC64-LABEL: test_fptosi_ppc_i32_ppc_fp128:
1226; PC64:       # %bb.0: # %entry
1227; PC64-NEXT:    mffs 0
1228; PC64-NEXT:    mtfsb1 31
1229; PC64-NEXT:    mtfsb0 30
1230; PC64-NEXT:    fadd 1, 2, 1
1231; PC64-NEXT:    mtfsf 1, 0
1232; PC64-NEXT:    fctiwz 0, 1
1233; PC64-NEXT:    stfd 0, -8(1)
1234; PC64-NEXT:    lwz 3, -4(1)
1235; PC64-NEXT:    blr
1236entry:
1237  %fpext = call i32 @llvm.experimental.constrained.fptosi.i32.ppcf128(
1238                    ppc_fp128  %first,
1239                    metadata !"fpexcept.strict") #1
1240  ret i32 %fpext
1241}
1242
1243define i64 @test_fptoui_ppc_i64_ppc_fp128(ppc_fp128 %first) #0 {
1244; PC64LE-LABEL: test_fptoui_ppc_i64_ppc_fp128:
1245; PC64LE:       # %bb.0: # %entry
1246; PC64LE-NEXT:    mflr 0
1247; PC64LE-NEXT:    std 0, 16(1)
1248; PC64LE-NEXT:    stdu 1, -32(1)
1249; PC64LE-NEXT:    bl __fixunstfdi
1250; PC64LE-NEXT:    nop
1251; PC64LE-NEXT:    addi 1, 1, 32
1252; PC64LE-NEXT:    ld 0, 16(1)
1253; PC64LE-NEXT:    mtlr 0
1254; PC64LE-NEXT:    blr
1255;
1256; PC64LE9-LABEL: test_fptoui_ppc_i64_ppc_fp128:
1257; PC64LE9:       # %bb.0: # %entry
1258; PC64LE9-NEXT:    mflr 0
1259; PC64LE9-NEXT:    std 0, 16(1)
1260; PC64LE9-NEXT:    stdu 1, -32(1)
1261; PC64LE9-NEXT:    bl __fixunstfdi
1262; PC64LE9-NEXT:    nop
1263; PC64LE9-NEXT:    addi 1, 1, 32
1264; PC64LE9-NEXT:    ld 0, 16(1)
1265; PC64LE9-NEXT:    mtlr 0
1266; PC64LE9-NEXT:    blr
1267;
1268; PC64-LABEL: test_fptoui_ppc_i64_ppc_fp128:
1269; PC64:       # %bb.0: # %entry
1270; PC64-NEXT:    mflr 0
1271; PC64-NEXT:    std 0, 16(1)
1272; PC64-NEXT:    stdu 1, -112(1)
1273; PC64-NEXT:    bl __fixunstfdi
1274; PC64-NEXT:    nop
1275; PC64-NEXT:    addi 1, 1, 112
1276; PC64-NEXT:    ld 0, 16(1)
1277; PC64-NEXT:    mtlr 0
1278; PC64-NEXT:    blr
1279entry:
1280  %fpext = call i64 @llvm.experimental.constrained.fptoui.i64.ppcf128(
1281                    ppc_fp128   %first,
1282                    metadata !"fpexcept.strict") #1
1283  ret i64 %fpext
1284}
1285
1286define i32 @test_fptoui_ppc_i32_ppc_fp128(ppc_fp128 %first) #0 {
1287; PC64LE-LABEL: test_fptoui_ppc_i32_ppc_fp128:
1288; PC64LE:       # %bb.0: # %entry
1289; PC64LE-NEXT:    mflr 0
1290; PC64LE-NEXT:    std 30, -16(1) # 8-byte Folded Spill
1291; PC64LE-NEXT:    std 0, 16(1)
1292; PC64LE-NEXT:    stdu 1, -48(1)
1293; PC64LE-NEXT:    addis 3, 2, .LCPI31_0@toc@ha
1294; PC64LE-NEXT:    xxlxor 3, 3, 3
1295; PC64LE-NEXT:    lfs 0, .LCPI31_0@toc@l(3)
1296; PC64LE-NEXT:    fcmpo 0, 2, 3
1297; PC64LE-NEXT:    lis 3, -32768
1298; PC64LE-NEXT:    xxlxor 3, 3, 3
1299; PC64LE-NEXT:    fcmpo 1, 1, 0
1300; PC64LE-NEXT:    crand 20, 6, 0
1301; PC64LE-NEXT:    crandc 21, 4, 6
1302; PC64LE-NEXT:    cror 20, 21, 20
1303; PC64LE-NEXT:    isel 30, 0, 3, 20
1304; PC64LE-NEXT:    bc 12, 20, .LBB31_2
1305; PC64LE-NEXT:  # %bb.1: # %entry
1306; PC64LE-NEXT:    fmr 3, 0
1307; PC64LE-NEXT:  .LBB31_2: # %entry
1308; PC64LE-NEXT:    xxlxor 4, 4, 4
1309; PC64LE-NEXT:    bl __gcc_qsub
1310; PC64LE-NEXT:    nop
1311; PC64LE-NEXT:    mffs 0
1312; PC64LE-NEXT:    mtfsb1 31
1313; PC64LE-NEXT:    mtfsb0 30
1314; PC64LE-NEXT:    fadd 1, 2, 1
1315; PC64LE-NEXT:    mtfsf 1, 0
1316; PC64LE-NEXT:    xscvdpsxws 0, 1
1317; PC64LE-NEXT:    mffprwz 3, 0
1318; PC64LE-NEXT:    xor 3, 3, 30
1319; PC64LE-NEXT:    addi 1, 1, 48
1320; PC64LE-NEXT:    ld 0, 16(1)
1321; PC64LE-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
1322; PC64LE-NEXT:    mtlr 0
1323; PC64LE-NEXT:    blr
1324;
1325; PC64LE9-LABEL: test_fptoui_ppc_i32_ppc_fp128:
1326; PC64LE9:       # %bb.0: # %entry
1327; PC64LE9-NEXT:    mflr 0
1328; PC64LE9-NEXT:    std 30, -16(1) # 8-byte Folded Spill
1329; PC64LE9-NEXT:    std 0, 16(1)
1330; PC64LE9-NEXT:    stdu 1, -48(1)
1331; PC64LE9-NEXT:    addis 3, 2, .LCPI31_0@toc@ha
1332; PC64LE9-NEXT:    xxlxor 3, 3, 3
1333; PC64LE9-NEXT:    lfs 0, .LCPI31_0@toc@l(3)
1334; PC64LE9-NEXT:    fcmpo 1, 2, 3
1335; PC64LE9-NEXT:    lis 3, -32768
1336; PC64LE9-NEXT:    fcmpo 0, 1, 0
1337; PC64LE9-NEXT:    xxlxor 3, 3, 3
1338; PC64LE9-NEXT:    crand 20, 2, 4
1339; PC64LE9-NEXT:    crandc 21, 0, 2
1340; PC64LE9-NEXT:    cror 20, 21, 20
1341; PC64LE9-NEXT:    isel 30, 0, 3, 20
1342; PC64LE9-NEXT:    bc 12, 20, .LBB31_2
1343; PC64LE9-NEXT:  # %bb.1: # %entry
1344; PC64LE9-NEXT:    fmr 3, 0
1345; PC64LE9-NEXT:  .LBB31_2: # %entry
1346; PC64LE9-NEXT:    xxlxor 4, 4, 4
1347; PC64LE9-NEXT:    bl __gcc_qsub
1348; PC64LE9-NEXT:    nop
1349; PC64LE9-NEXT:    mffs 0
1350; PC64LE9-NEXT:    mtfsb1 31
1351; PC64LE9-NEXT:    mtfsb0 30
1352; PC64LE9-NEXT:    fadd 1, 2, 1
1353; PC64LE9-NEXT:    mtfsf 1, 0
1354; PC64LE9-NEXT:    xscvdpsxws 0, 1
1355; PC64LE9-NEXT:    mffprwz 3, 0
1356; PC64LE9-NEXT:    xor 3, 3, 30
1357; PC64LE9-NEXT:    addi 1, 1, 48
1358; PC64LE9-NEXT:    ld 0, 16(1)
1359; PC64LE9-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
1360; PC64LE9-NEXT:    mtlr 0
1361; PC64LE9-NEXT:    blr
1362;
1363; PC64-LABEL: test_fptoui_ppc_i32_ppc_fp128:
1364; PC64:       # %bb.0: # %entry
1365; PC64-NEXT:    mflr 0
1366; PC64-NEXT:    std 0, 16(1)
1367; PC64-NEXT:    mfcr 12
1368; PC64-NEXT:    stw 12, 8(1)
1369; PC64-NEXT:    stdu 1, -128(1)
1370; PC64-NEXT:    addis 3, 2, .LCPI31_0@toc@ha
1371; PC64-NEXT:    lfs 0, .LCPI31_0@toc@l(3)
1372; PC64-NEXT:    addis 3, 2, .LCPI31_1@toc@ha
1373; PC64-NEXT:    lfs 4, .LCPI31_1@toc@l(3)
1374; PC64-NEXT:    fcmpo 0, 1, 0
1375; PC64-NEXT:    crandc 21, 0, 2
1376; PC64-NEXT:    fcmpo 1, 2, 4
1377; PC64-NEXT:    crand 20, 2, 4
1378; PC64-NEXT:    cror 8, 21, 20
1379; PC64-NEXT:    fmr 3, 4
1380; PC64-NEXT:    bc 12, 8, .LBB31_2
1381; PC64-NEXT:  # %bb.1: # %entry
1382; PC64-NEXT:    fmr 3, 0
1383; PC64-NEXT:  .LBB31_2: # %entry
1384; PC64-NEXT:    bl __gcc_qsub
1385; PC64-NEXT:    nop
1386; PC64-NEXT:    mffs 0
1387; PC64-NEXT:    mtfsb1 31
1388; PC64-NEXT:    lis 4, -32768
1389; PC64-NEXT:    bc 12, 8, .LBB31_3
1390; PC64-NEXT:    b .LBB31_4
1391; PC64-NEXT:  .LBB31_3: # %entry
1392; PC64-NEXT:    li 4, 0
1393; PC64-NEXT:  .LBB31_4: # %entry
1394; PC64-NEXT:    mtfsb0 30
1395; PC64-NEXT:    fadd 1, 2, 1
1396; PC64-NEXT:    mtfsf 1, 0
1397; PC64-NEXT:    fctiwz 0, 1
1398; PC64-NEXT:    stfd 0, 120(1)
1399; PC64-NEXT:    lwz 3, 124(1)
1400; PC64-NEXT:    xor 3, 3, 4
1401; PC64-NEXT:    addi 1, 1, 128
1402; PC64-NEXT:    ld 0, 16(1)
1403; PC64-NEXT:    lwz 12, 8(1)
1404; PC64-NEXT:    mtlr 0
1405; PC64-NEXT:    mtcrf 32, 12 # cr2
1406; PC64-NEXT:    blr
1407entry:
1408  %fpext = call i32 @llvm.experimental.constrained.fptoui.i32.ppcf128(
1409                    ppc_fp128   %first,
1410                    metadata !"fpexcept.strict") #1
1411  ret i32 %fpext
1412}
1413
1414; Test that resultant libcalls retain order even when their non-strict FLOP form could be
1415; trivially optimized into differing sequences.
1416define void @test_constrained_libcall_multichain(float* %firstptr, ppc_fp128* %result) #0 {
1417; PC64LE-LABEL: test_constrained_libcall_multichain:
1418; PC64LE:       # %bb.0:
1419; PC64LE-NEXT:    mflr 0
1420; PC64LE-NEXT:    std 29, -48(1) # 8-byte Folded Spill
1421; PC64LE-NEXT:    std 30, -40(1) # 8-byte Folded Spill
1422; PC64LE-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
1423; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1424; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1425; PC64LE-NEXT:    std 0, 16(1)
1426; PC64LE-NEXT:    stdu 1, -80(1)
1427; PC64LE-NEXT:    mr 29, 3
1428; PC64LE-NEXT:    xxlxor 2, 2, 2
1429; PC64LE-NEXT:    li 3, 0
1430; PC64LE-NEXT:    mr 30, 4
1431; PC64LE-NEXT:    lfsx 31, 0, 29
1432; PC64LE-NEXT:    xxlxor 4, 4, 4
1433; PC64LE-NEXT:    std 3, 8(4)
1434; PC64LE-NEXT:    fmr 1, 31
1435; PC64LE-NEXT:    fmr 3, 31
1436; PC64LE-NEXT:    stfdx 31, 0, 4
1437; PC64LE-NEXT:    bl __gcc_qadd
1438; PC64LE-NEXT:    nop
1439; PC64LE-NEXT:    fmr 3, 1
1440; PC64LE-NEXT:    fmr 4, 2
1441; PC64LE-NEXT:    fmr 30, 1
1442; PC64LE-NEXT:    fmr 29, 2
1443; PC64LE-NEXT:    stfd 2, 24(30)
1444; PC64LE-NEXT:    stfd 1, 16(30)
1445; PC64LE-NEXT:    bl __gcc_qmul
1446; PC64LE-NEXT:    nop
1447; PC64LE-NEXT:    fmr 1, 31
1448; PC64LE-NEXT:    xxlxor 2, 2, 2
1449; PC64LE-NEXT:    li 5, 2
1450; PC64LE-NEXT:    stfd 29, 40(30)
1451; PC64LE-NEXT:    stfd 30, 32(30)
1452; PC64LE-NEXT:    bl __powitf2
1453; PC64LE-NEXT:    nop
1454; PC64LE-NEXT:    xsrsp 0, 1
1455; PC64LE-NEXT:    stfsx 0, 0, 29
1456; PC64LE-NEXT:    stfd 1, -16(30)
1457; PC64LE-NEXT:    stfd 2, -8(30)
1458; PC64LE-NEXT:    addi 1, 1, 80
1459; PC64LE-NEXT:    ld 0, 16(1)
1460; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1461; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
1462; PC64LE-NEXT:    ld 30, -40(1) # 8-byte Folded Reload
1463; PC64LE-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
1464; PC64LE-NEXT:    ld 29, -48(1) # 8-byte Folded Reload
1465; PC64LE-NEXT:    mtlr 0
1466; PC64LE-NEXT:    blr
1467;
1468; PC64LE9-LABEL: test_constrained_libcall_multichain:
1469; PC64LE9:       # %bb.0:
1470; PC64LE9-NEXT:    mflr 0
1471; PC64LE9-NEXT:    std 29, -48(1) # 8-byte Folded Spill
1472; PC64LE9-NEXT:    std 30, -40(1) # 8-byte Folded Spill
1473; PC64LE9-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
1474; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1475; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1476; PC64LE9-NEXT:    std 0, 16(1)
1477; PC64LE9-NEXT:    stdu 1, -80(1)
1478; PC64LE9-NEXT:    lfs 31, 0(3)
1479; PC64LE9-NEXT:    mr 29, 3
1480; PC64LE9-NEXT:    li 3, 0
1481; PC64LE9-NEXT:    xxlxor 2, 2, 2
1482; PC64LE9-NEXT:    xxlxor 4, 4, 4
1483; PC64LE9-NEXT:    mr 30, 4
1484; PC64LE9-NEXT:    std 3, 8(4)
1485; PC64LE9-NEXT:    fmr 1, 31
1486; PC64LE9-NEXT:    fmr 3, 31
1487; PC64LE9-NEXT:    stfd 31, 0(4)
1488; PC64LE9-NEXT:    bl __gcc_qadd
1489; PC64LE9-NEXT:    nop
1490; PC64LE9-NEXT:    fmr 3, 1
1491; PC64LE9-NEXT:    fmr 4, 2
1492; PC64LE9-NEXT:    fmr 30, 1
1493; PC64LE9-NEXT:    fmr 29, 2
1494; PC64LE9-NEXT:    stfd 2, 24(30)
1495; PC64LE9-NEXT:    stfd 1, 16(30)
1496; PC64LE9-NEXT:    bl __gcc_qmul
1497; PC64LE9-NEXT:    nop
1498; PC64LE9-NEXT:    fmr 1, 31
1499; PC64LE9-NEXT:    xxlxor 2, 2, 2
1500; PC64LE9-NEXT:    li 5, 2
1501; PC64LE9-NEXT:    stfd 29, 40(30)
1502; PC64LE9-NEXT:    stfd 30, 32(30)
1503; PC64LE9-NEXT:    bl __powitf2
1504; PC64LE9-NEXT:    nop
1505; PC64LE9-NEXT:    xsrsp 0, 1
1506; PC64LE9-NEXT:    stfs 0, 0(29)
1507; PC64LE9-NEXT:    stfd 1, -16(30)
1508; PC64LE9-NEXT:    stfd 2, -8(30)
1509; PC64LE9-NEXT:    addi 1, 1, 80
1510; PC64LE9-NEXT:    ld 0, 16(1)
1511; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1512; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
1513; PC64LE9-NEXT:    ld 30, -40(1) # 8-byte Folded Reload
1514; PC64LE9-NEXT:    ld 29, -48(1) # 8-byte Folded Reload
1515; PC64LE9-NEXT:    mtlr 0
1516; PC64LE9-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
1517; PC64LE9-NEXT:    blr
1518;
1519; PC64-LABEL: test_constrained_libcall_multichain:
1520; PC64:       # %bb.0:
1521; PC64-NEXT:    mflr 0
1522; PC64-NEXT:    std 0, 16(1)
1523; PC64-NEXT:    stdu 1, -176(1)
1524; PC64-NEXT:    std 29, 120(1) # 8-byte Folded Spill
1525; PC64-NEXT:    mr 29, 3
1526; PC64-NEXT:    li 3, 0
1527; PC64-NEXT:    stfd 31, 168(1) # 8-byte Folded Spill
1528; PC64-NEXT:    std 30, 128(1) # 8-byte Folded Spill
1529; PC64-NEXT:    mr 30, 4
1530; PC64-NEXT:    lfs 31, 0(29)
1531; PC64-NEXT:    std 3, 8(4)
1532; PC64-NEXT:    addis 3, 2, .LCPI32_0@toc@ha
1533; PC64-NEXT:    stfd 30, 160(1) # 8-byte Folded Spill
1534; PC64-NEXT:    lfs 30, .LCPI32_0@toc@l(3)
1535; PC64-NEXT:    fmr 1, 31
1536; PC64-NEXT:    fmr 3, 31
1537; PC64-NEXT:    stfd 28, 144(1) # 8-byte Folded Spill
1538; PC64-NEXT:    fmr 2, 30
1539; PC64-NEXT:    fmr 4, 30
1540; PC64-NEXT:    stfd 29, 152(1) # 8-byte Folded Spill
1541; PC64-NEXT:    stfd 31, 0(4)
1542; PC64-NEXT:    bl __gcc_qadd
1543; PC64-NEXT:    nop
1544; PC64-NEXT:    fmr 3, 1
1545; PC64-NEXT:    fmr 4, 2
1546; PC64-NEXT:    fmr 29, 1
1547; PC64-NEXT:    fmr 28, 2
1548; PC64-NEXT:    stfd 2, 24(30)
1549; PC64-NEXT:    stfd 1, 16(30)
1550; PC64-NEXT:    bl __gcc_qmul
1551; PC64-NEXT:    nop
1552; PC64-NEXT:    fmr 1, 31
1553; PC64-NEXT:    fmr 2, 30
1554; PC64-NEXT:    li 5, 2
1555; PC64-NEXT:    stfd 28, 40(30)
1556; PC64-NEXT:    stfd 29, 32(30)
1557; PC64-NEXT:    bl __powitf2
1558; PC64-NEXT:    nop
1559; PC64-NEXT:    frsp 0, 1
1560; PC64-NEXT:    stfs 0, 0(29)
1561; PC64-NEXT:    ld 29, 120(1) # 8-byte Folded Reload
1562; PC64-NEXT:    stfd 1, -16(30)
1563; PC64-NEXT:    stfd 2, -8(30)
1564; PC64-NEXT:    ld 30, 128(1) # 8-byte Folded Reload
1565; PC64-NEXT:    lfd 31, 168(1) # 8-byte Folded Reload
1566; PC64-NEXT:    lfd 30, 160(1) # 8-byte Folded Reload
1567; PC64-NEXT:    lfd 29, 152(1) # 8-byte Folded Reload
1568; PC64-NEXT:    lfd 28, 144(1) # 8-byte Folded Reload
1569; PC64-NEXT:    addi 1, 1, 176
1570; PC64-NEXT:    ld 0, 16(1)
1571; PC64-NEXT:    mtlr 0
1572; PC64-NEXT:    blr
1573  %load = load float, float* %firstptr
1574  %first = call ppc_fp128 @llvm.experimental.constrained.fpext.f32.ppcf128(
1575                    float %load,
1576                    metadata !"fpexcept.strict") #1
1577  store ppc_fp128 %first, ppc_fp128* %result
1578
1579  ; For unconstrained FLOPs, these next two FP instructions would necessarily
1580  ; be executed in series with one another.
1581  %fadd = call ppc_fp128 @llvm.experimental.constrained.fadd.ppcf128(
1582                    ppc_fp128 %first,
1583                    ppc_fp128 %first,
1584                    metadata !"round.dynamic",
1585                    metadata !"fpexcept.strict") #1
1586  %stridx1 = getelementptr ppc_fp128, ppc_fp128* %result, i32 1
1587  store ppc_fp128 %fadd, ppc_fp128* %stridx1
1588  %fmul = call ppc_fp128 @llvm.experimental.constrained.fmul.ppcf128(
1589                    ppc_fp128 %fadd,
1590                    ppc_fp128 %fadd,
1591                    metadata !"round.dynamic",
1592                    metadata !"fpexcept.strict") #1
1593  %stridx2 = getelementptr ppc_fp128, ppc_fp128* %stridx1, i32 1
1594  store ppc_fp128 %fadd, ppc_fp128* %stridx2
1595
1596  ; For unconstrained FLOPs, these next two FP instructions could be reordered
1597  ; or even executed in parallel with respect to the previous two instructions.
1598  ; However, strict floating point rules would not allow this.
1599  %powi = call ppc_fp128 @llvm.experimental.constrained.powi.ppcf128(
1600                    ppc_fp128 %first,
1601                    i32 2,
1602                    metadata !"round.dynamic",
1603                    metadata !"fpexcept.strict") #1
1604  %tinypow = call float @llvm.experimental.constrained.fptrunc.ppcf128.f32(
1605                    ppc_fp128 %powi,
1606                    metadata !"round.dynamic",
1607                    metadata !"fpexcept.strict") #1
1608  store float %tinypow, float* %firstptr
1609  %stridxn1 = getelementptr ppc_fp128, ppc_fp128* %result, i32 -1
1610  store ppc_fp128 %powi, ppc_fp128* %stridxn1
1611  ret void
1612}
1613
1614define ppc_fp128 @i32_to_ppcq(i32 signext %m) #0 {
1615; PC64LE-LABEL: i32_to_ppcq:
1616; PC64LE:       # %bb.0: # %entry
1617; PC64LE-NEXT:    mtfprwa 0, 3
1618; PC64LE-NEXT:    xxlxor 2, 2, 2
1619; PC64LE-NEXT:    xscvsxddp 1, 0
1620; PC64LE-NEXT:    blr
1621;
1622; PC64LE9-LABEL: i32_to_ppcq:
1623; PC64LE9:       # %bb.0: # %entry
1624; PC64LE9-NEXT:    mtfprwa 0, 3
1625; PC64LE9-NEXT:    xxlxor 2, 2, 2
1626; PC64LE9-NEXT:    xscvsxddp 1, 0
1627; PC64LE9-NEXT:    blr
1628;
1629; PC64-LABEL: i32_to_ppcq:
1630; PC64:       # %bb.0: # %entry
1631; PC64-NEXT:    std 3, -8(1)
1632; PC64-NEXT:    addis 3, 2, .LCPI33_0@toc@ha
1633; PC64-NEXT:    lfd 0, -8(1)
1634; PC64-NEXT:    lfs 2, .LCPI33_0@toc@l(3)
1635; PC64-NEXT:    fcfid 1, 0
1636; PC64-NEXT:    blr
1637entry:
1638  %conv = tail call ppc_fp128 @llvm.experimental.constrained.sitofp.ppcf128.i32(i32 %m, metadata !"round.dynamic", metadata !"fpexcept.strict") #1
1639  ret ppc_fp128 %conv
1640}
1641
1642define ppc_fp128 @i64_to_ppcq(i64 %m) #0 {
1643; PC64LE-LABEL: i64_to_ppcq:
1644; PC64LE:       # %bb.0: # %entry
1645; PC64LE-NEXT:    mflr 0
1646; PC64LE-NEXT:    std 0, 16(1)
1647; PC64LE-NEXT:    stdu 1, -32(1)
1648; PC64LE-NEXT:    bl __floatditf
1649; PC64LE-NEXT:    nop
1650; PC64LE-NEXT:    addi 1, 1, 32
1651; PC64LE-NEXT:    ld 0, 16(1)
1652; PC64LE-NEXT:    mtlr 0
1653; PC64LE-NEXT:    blr
1654;
1655; PC64LE9-LABEL: i64_to_ppcq:
1656; PC64LE9:       # %bb.0: # %entry
1657; PC64LE9-NEXT:    mflr 0
1658; PC64LE9-NEXT:    std 0, 16(1)
1659; PC64LE9-NEXT:    stdu 1, -32(1)
1660; PC64LE9-NEXT:    bl __floatditf
1661; PC64LE9-NEXT:    nop
1662; PC64LE9-NEXT:    addi 1, 1, 32
1663; PC64LE9-NEXT:    ld 0, 16(1)
1664; PC64LE9-NEXT:    mtlr 0
1665; PC64LE9-NEXT:    blr
1666;
1667; PC64-LABEL: i64_to_ppcq:
1668; PC64:       # %bb.0: # %entry
1669; PC64-NEXT:    mflr 0
1670; PC64-NEXT:    std 0, 16(1)
1671; PC64-NEXT:    stdu 1, -112(1)
1672; PC64-NEXT:    bl __floatditf
1673; PC64-NEXT:    nop
1674; PC64-NEXT:    addi 1, 1, 112
1675; PC64-NEXT:    ld 0, 16(1)
1676; PC64-NEXT:    mtlr 0
1677; PC64-NEXT:    blr
1678entry:
1679  %conv = tail call ppc_fp128 @llvm.experimental.constrained.sitofp.ppcf128.i64(i64 %m, metadata !"round.dynamic", metadata !"fpexcept.strict") #1
1680  ret ppc_fp128 %conv
1681}
1682
1683define ppc_fp128 @u32_to_ppcq(i32 zeroext %m) #0 {
1684; PC64LE-LABEL: u32_to_ppcq:
1685; PC64LE:       # %bb.0: # %entry
1686; PC64LE-NEXT:    mtfprwz 0, 3
1687; PC64LE-NEXT:    xxlxor 2, 2, 2
1688; PC64LE-NEXT:    xscvuxddp 1, 0
1689; PC64LE-NEXT:    blr
1690;
1691; PC64LE9-LABEL: u32_to_ppcq:
1692; PC64LE9:       # %bb.0: # %entry
1693; PC64LE9-NEXT:    mtfprwz 0, 3
1694; PC64LE9-NEXT:    xxlxor 2, 2, 2
1695; PC64LE9-NEXT:    xscvuxddp 1, 0
1696; PC64LE9-NEXT:    blr
1697;
1698; PC64-LABEL: u32_to_ppcq:
1699; PC64:       # %bb.0: # %entry
1700; PC64-NEXT:    lis 4, 17200
1701; PC64-NEXT:    stw 3, -4(1)
1702; PC64-NEXT:    addis 3, 2, .LCPI35_0@toc@ha
1703; PC64-NEXT:    stw 4, -8(1)
1704; PC64-NEXT:    lfs 0, .LCPI35_0@toc@l(3)
1705; PC64-NEXT:    addis 3, 2, .LCPI35_1@toc@ha
1706; PC64-NEXT:    lfd 1, -8(1)
1707; PC64-NEXT:    lfs 2, .LCPI35_1@toc@l(3)
1708; PC64-NEXT:    fsub 1, 1, 0
1709; PC64-NEXT:    blr
1710entry:
1711  %conv = tail call ppc_fp128 @llvm.experimental.constrained.uitofp.ppcf128.i32(i32 %m, metadata !"round.dynamic", metadata !"fpexcept.strict") #1
1712  ret ppc_fp128 %conv
1713}
1714
1715define ppc_fp128 @u64_to_ppcq(i64 %m) #0 {
1716; PC64LE-LABEL: u64_to_ppcq:
1717; PC64LE:       # %bb.0: # %entry
1718; PC64LE-NEXT:    mflr 0
1719; PC64LE-NEXT:    std 30, -32(1) # 8-byte Folded Spill
1720; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1721; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1722; PC64LE-NEXT:    std 0, 16(1)
1723; PC64LE-NEXT:    stdu 1, -64(1)
1724; PC64LE-NEXT:    mr 30, 3
1725; PC64LE-NEXT:    bl __floatditf
1726; PC64LE-NEXT:    nop
1727; PC64LE-NEXT:    addis 3, 2, .LCPI36_0@toc@ha
1728; PC64LE-NEXT:    xxlxor 4, 4, 4
1729; PC64LE-NEXT:    fmr 30, 1
1730; PC64LE-NEXT:    fmr 31, 2
1731; PC64LE-NEXT:    lfs 3, .LCPI36_0@toc@l(3)
1732; PC64LE-NEXT:    bl __gcc_qadd
1733; PC64LE-NEXT:    nop
1734; PC64LE-NEXT:    cmpdi 30, 0
1735; PC64LE-NEXT:    blt 0, .LBB36_2
1736; PC64LE-NEXT:  # %bb.1: # %entry
1737; PC64LE-NEXT:    fmr 1, 30
1738; PC64LE-NEXT:  .LBB36_2: # %entry
1739; PC64LE-NEXT:    blt 0, .LBB36_4
1740; PC64LE-NEXT:  # %bb.3: # %entry
1741; PC64LE-NEXT:    fmr 2, 31
1742; PC64LE-NEXT:  .LBB36_4: # %entry
1743; PC64LE-NEXT:    addi 1, 1, 64
1744; PC64LE-NEXT:    ld 0, 16(1)
1745; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1746; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
1747; PC64LE-NEXT:    ld 30, -32(1) # 8-byte Folded Reload
1748; PC64LE-NEXT:    mtlr 0
1749; PC64LE-NEXT:    blr
1750;
1751; PC64LE9-LABEL: u64_to_ppcq:
1752; PC64LE9:       # %bb.0: # %entry
1753; PC64LE9-NEXT:    mflr 0
1754; PC64LE9-NEXT:    std 30, -32(1) # 8-byte Folded Spill
1755; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1756; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1757; PC64LE9-NEXT:    std 0, 16(1)
1758; PC64LE9-NEXT:    stdu 1, -64(1)
1759; PC64LE9-NEXT:    mr 30, 3
1760; PC64LE9-NEXT:    bl __floatditf
1761; PC64LE9-NEXT:    nop
1762; PC64LE9-NEXT:    addis 3, 2, .LCPI36_0@toc@ha
1763; PC64LE9-NEXT:    xxlxor 4, 4, 4
1764; PC64LE9-NEXT:    fmr 30, 1
1765; PC64LE9-NEXT:    fmr 31, 2
1766; PC64LE9-NEXT:    lfs 3, .LCPI36_0@toc@l(3)
1767; PC64LE9-NEXT:    bl __gcc_qadd
1768; PC64LE9-NEXT:    nop
1769; PC64LE9-NEXT:    cmpdi 30, 0
1770; PC64LE9-NEXT:    blt 0, .LBB36_2
1771; PC64LE9-NEXT:  # %bb.1: # %entry
1772; PC64LE9-NEXT:    fmr 1, 30
1773; PC64LE9-NEXT:  .LBB36_2: # %entry
1774; PC64LE9-NEXT:    blt 0, .LBB36_4
1775; PC64LE9-NEXT:  # %bb.3: # %entry
1776; PC64LE9-NEXT:    fmr 2, 31
1777; PC64LE9-NEXT:  .LBB36_4: # %entry
1778; PC64LE9-NEXT:    addi 1, 1, 64
1779; PC64LE9-NEXT:    ld 0, 16(1)
1780; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1781; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
1782; PC64LE9-NEXT:    ld 30, -32(1) # 8-byte Folded Reload
1783; PC64LE9-NEXT:    mtlr 0
1784; PC64LE9-NEXT:    blr
1785;
1786; PC64-LABEL: u64_to_ppcq:
1787; PC64:       # %bb.0: # %entry
1788; PC64-NEXT:    mflr 0
1789; PC64-NEXT:    std 0, 16(1)
1790; PC64-NEXT:    stdu 1, -144(1)
1791; PC64-NEXT:    std 30, 112(1) # 8-byte Folded Spill
1792; PC64-NEXT:    stfd 30, 128(1) # 8-byte Folded Spill
1793; PC64-NEXT:    mr 30, 3
1794; PC64-NEXT:    stfd 31, 136(1) # 8-byte Folded Spill
1795; PC64-NEXT:    bl __floatditf
1796; PC64-NEXT:    nop
1797; PC64-NEXT:    addis 3, 2, .LCPI36_0@toc@ha
1798; PC64-NEXT:    fmr 31, 2
1799; PC64-NEXT:    lfs 3, .LCPI36_0@toc@l(3)
1800; PC64-NEXT:    addis 3, 2, .LCPI36_1@toc@ha
1801; PC64-NEXT:    fmr 30, 1
1802; PC64-NEXT:    lfs 4, .LCPI36_1@toc@l(3)
1803; PC64-NEXT:    bl __gcc_qadd
1804; PC64-NEXT:    nop
1805; PC64-NEXT:    cmpdi 30, 0
1806; PC64-NEXT:    blt 0, .LBB36_2
1807; PC64-NEXT:  # %bb.1: # %entry
1808; PC64-NEXT:    fmr 1, 30
1809; PC64-NEXT:  .LBB36_2: # %entry
1810; PC64-NEXT:    blt 0, .LBB36_4
1811; PC64-NEXT:  # %bb.3: # %entry
1812; PC64-NEXT:    fmr 2, 31
1813; PC64-NEXT:  .LBB36_4: # %entry
1814; PC64-NEXT:    lfd 31, 136(1) # 8-byte Folded Reload
1815; PC64-NEXT:    ld 30, 112(1) # 8-byte Folded Reload
1816; PC64-NEXT:    lfd 30, 128(1) # 8-byte Folded Reload
1817; PC64-NEXT:    addi 1, 1, 144
1818; PC64-NEXT:    ld 0, 16(1)
1819; PC64-NEXT:    mtlr 0
1820; PC64-NEXT:    blr
1821entry:
1822  %conv = tail call ppc_fp128 @llvm.experimental.constrained.uitofp.ppcf128.i64(i64 %m, metadata !"round.dynamic", metadata !"fpexcept.strict") #1
1823  ret ppc_fp128 %conv
1824}
1825
1826define ppc_fp128 @i128_to_ppcq(i128 %m) #0 {
1827; PC64LE-LABEL: i128_to_ppcq:
1828; PC64LE:       # %bb.0: # %entry
1829; PC64LE-NEXT:    mflr 0
1830; PC64LE-NEXT:    std 0, 16(1)
1831; PC64LE-NEXT:    stdu 1, -32(1)
1832; PC64LE-NEXT:    bl __floattitf
1833; PC64LE-NEXT:    nop
1834; PC64LE-NEXT:    addi 1, 1, 32
1835; PC64LE-NEXT:    ld 0, 16(1)
1836; PC64LE-NEXT:    mtlr 0
1837; PC64LE-NEXT:    blr
1838;
1839; PC64LE9-LABEL: i128_to_ppcq:
1840; PC64LE9:       # %bb.0: # %entry
1841; PC64LE9-NEXT:    mflr 0
1842; PC64LE9-NEXT:    std 0, 16(1)
1843; PC64LE9-NEXT:    stdu 1, -32(1)
1844; PC64LE9-NEXT:    bl __floattitf
1845; PC64LE9-NEXT:    nop
1846; PC64LE9-NEXT:    addi 1, 1, 32
1847; PC64LE9-NEXT:    ld 0, 16(1)
1848; PC64LE9-NEXT:    mtlr 0
1849; PC64LE9-NEXT:    blr
1850;
1851; PC64-LABEL: i128_to_ppcq:
1852; PC64:       # %bb.0: # %entry
1853; PC64-NEXT:    mflr 0
1854; PC64-NEXT:    std 0, 16(1)
1855; PC64-NEXT:    stdu 1, -112(1)
1856; PC64-NEXT:    bl __floattitf
1857; PC64-NEXT:    nop
1858; PC64-NEXT:    addi 1, 1, 112
1859; PC64-NEXT:    ld 0, 16(1)
1860; PC64-NEXT:    mtlr 0
1861; PC64-NEXT:    blr
1862entry:
1863  %conv = tail call ppc_fp128 @llvm.experimental.constrained.sitofp.ppcf128.i128(i128 %m, metadata !"round.dynamic", metadata !"fpexcept.strict") #1
1864  ret ppc_fp128 %conv
1865}
1866
1867define ppc_fp128 @u128_to_ppcq(i128 %m) #0 {
1868; PC64LE-LABEL: u128_to_ppcq:
1869; PC64LE:       # %bb.0: # %entry
1870; PC64LE-NEXT:    mflr 0
1871; PC64LE-NEXT:    std 30, -32(1) # 8-byte Folded Spill
1872; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1873; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1874; PC64LE-NEXT:    std 0, 16(1)
1875; PC64LE-NEXT:    stdu 1, -64(1)
1876; PC64LE-NEXT:    mr 30, 4
1877; PC64LE-NEXT:    bl __floattitf
1878; PC64LE-NEXT:    nop
1879; PC64LE-NEXT:    addis 3, 2, .LCPI38_0@toc@ha
1880; PC64LE-NEXT:    xxlxor 4, 4, 4
1881; PC64LE-NEXT:    fmr 30, 1
1882; PC64LE-NEXT:    fmr 31, 2
1883; PC64LE-NEXT:    lfd 3, .LCPI38_0@toc@l(3)
1884; PC64LE-NEXT:    bl __gcc_qadd
1885; PC64LE-NEXT:    nop
1886; PC64LE-NEXT:    cmpdi 30, 0
1887; PC64LE-NEXT:    blt 0, .LBB38_2
1888; PC64LE-NEXT:  # %bb.1: # %entry
1889; PC64LE-NEXT:    fmr 1, 30
1890; PC64LE-NEXT:  .LBB38_2: # %entry
1891; PC64LE-NEXT:    blt 0, .LBB38_4
1892; PC64LE-NEXT:  # %bb.3: # %entry
1893; PC64LE-NEXT:    fmr 2, 31
1894; PC64LE-NEXT:  .LBB38_4: # %entry
1895; PC64LE-NEXT:    addi 1, 1, 64
1896; PC64LE-NEXT:    ld 0, 16(1)
1897; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1898; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
1899; PC64LE-NEXT:    ld 30, -32(1) # 8-byte Folded Reload
1900; PC64LE-NEXT:    mtlr 0
1901; PC64LE-NEXT:    blr
1902;
1903; PC64LE9-LABEL: u128_to_ppcq:
1904; PC64LE9:       # %bb.0: # %entry
1905; PC64LE9-NEXT:    mflr 0
1906; PC64LE9-NEXT:    std 30, -32(1) # 8-byte Folded Spill
1907; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1908; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1909; PC64LE9-NEXT:    std 0, 16(1)
1910; PC64LE9-NEXT:    stdu 1, -64(1)
1911; PC64LE9-NEXT:    mr 30, 4
1912; PC64LE9-NEXT:    bl __floattitf
1913; PC64LE9-NEXT:    nop
1914; PC64LE9-NEXT:    addis 3, 2, .LCPI38_0@toc@ha
1915; PC64LE9-NEXT:    xxlxor 4, 4, 4
1916; PC64LE9-NEXT:    fmr 30, 1
1917; PC64LE9-NEXT:    lfd 3, .LCPI38_0@toc@l(3)
1918; PC64LE9-NEXT:    fmr 31, 2
1919; PC64LE9-NEXT:    bl __gcc_qadd
1920; PC64LE9-NEXT:    nop
1921; PC64LE9-NEXT:    cmpdi 30, 0
1922; PC64LE9-NEXT:    blt 0, .LBB38_2
1923; PC64LE9-NEXT:  # %bb.1: # %entry
1924; PC64LE9-NEXT:    fmr 1, 30
1925; PC64LE9-NEXT:  .LBB38_2: # %entry
1926; PC64LE9-NEXT:    blt 0, .LBB38_4
1927; PC64LE9-NEXT:  # %bb.3: # %entry
1928; PC64LE9-NEXT:    fmr 2, 31
1929; PC64LE9-NEXT:  .LBB38_4: # %entry
1930; PC64LE9-NEXT:    addi 1, 1, 64
1931; PC64LE9-NEXT:    ld 0, 16(1)
1932; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1933; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
1934; PC64LE9-NEXT:    ld 30, -32(1) # 8-byte Folded Reload
1935; PC64LE9-NEXT:    mtlr 0
1936; PC64LE9-NEXT:    blr
1937;
1938; PC64-LABEL: u128_to_ppcq:
1939; PC64:       # %bb.0: # %entry
1940; PC64-NEXT:    mflr 0
1941; PC64-NEXT:    std 0, 16(1)
1942; PC64-NEXT:    stdu 1, -144(1)
1943; PC64-NEXT:    std 30, 112(1) # 8-byte Folded Spill
1944; PC64-NEXT:    stfd 30, 128(1) # 8-byte Folded Spill
1945; PC64-NEXT:    mr 30, 3
1946; PC64-NEXT:    stfd 31, 136(1) # 8-byte Folded Spill
1947; PC64-NEXT:    bl __floattitf
1948; PC64-NEXT:    nop
1949; PC64-NEXT:    addis 3, 2, .LCPI38_0@toc@ha
1950; PC64-NEXT:    fmr 31, 2
1951; PC64-NEXT:    lfd 3, .LCPI38_0@toc@l(3)
1952; PC64-NEXT:    addis 3, 2, .LCPI38_1@toc@ha
1953; PC64-NEXT:    fmr 30, 1
1954; PC64-NEXT:    lfs 4, .LCPI38_1@toc@l(3)
1955; PC64-NEXT:    bl __gcc_qadd
1956; PC64-NEXT:    nop
1957; PC64-NEXT:    cmpdi 30, 0
1958; PC64-NEXT:    blt 0, .LBB38_2
1959; PC64-NEXT:  # %bb.1: # %entry
1960; PC64-NEXT:    fmr 1, 30
1961; PC64-NEXT:  .LBB38_2: # %entry
1962; PC64-NEXT:    blt 0, .LBB38_4
1963; PC64-NEXT:  # %bb.3: # %entry
1964; PC64-NEXT:    fmr 2, 31
1965; PC64-NEXT:  .LBB38_4: # %entry
1966; PC64-NEXT:    lfd 31, 136(1) # 8-byte Folded Reload
1967; PC64-NEXT:    ld 30, 112(1) # 8-byte Folded Reload
1968; PC64-NEXT:    lfd 30, 128(1) # 8-byte Folded Reload
1969; PC64-NEXT:    addi 1, 1, 144
1970; PC64-NEXT:    ld 0, 16(1)
1971; PC64-NEXT:    mtlr 0
1972; PC64-NEXT:    blr
1973entry:
1974  %conv = tail call ppc_fp128 @llvm.experimental.constrained.uitofp.ppcf128.i128(i128 %m, metadata !"round.dynamic", metadata !"fpexcept.strict") #1
1975  ret ppc_fp128 %conv
1976}
1977
1978define i1 @ppcq_to_s1(ppc_fp128 %a) {
1979; PC64LE-LABEL: ppcq_to_s1:
1980; PC64LE:       # %bb.0: # %entry
1981; PC64LE-NEXT:    mflr 0
1982; PC64LE-NEXT:    std 0, 16(1)
1983; PC64LE-NEXT:    stdu 1, -32(1)
1984; PC64LE-NEXT:    .cfi_def_cfa_offset 32
1985; PC64LE-NEXT:    .cfi_offset lr, 16
1986; PC64LE-NEXT:    bl __gcc_qtou
1987; PC64LE-NEXT:    nop
1988; PC64LE-NEXT:    addi 1, 1, 32
1989; PC64LE-NEXT:    ld 0, 16(1)
1990; PC64LE-NEXT:    mtlr 0
1991; PC64LE-NEXT:    blr
1992;
1993; PC64LE9-LABEL: ppcq_to_s1:
1994; PC64LE9:       # %bb.0: # %entry
1995; PC64LE9-NEXT:    mflr 0
1996; PC64LE9-NEXT:    std 0, 16(1)
1997; PC64LE9-NEXT:    stdu 1, -32(1)
1998; PC64LE9-NEXT:    .cfi_def_cfa_offset 32
1999; PC64LE9-NEXT:    .cfi_offset lr, 16
2000; PC64LE9-NEXT:    bl __gcc_qtou
2001; PC64LE9-NEXT:    nop
2002; PC64LE9-NEXT:    addi 1, 1, 32
2003; PC64LE9-NEXT:    ld 0, 16(1)
2004; PC64LE9-NEXT:    mtlr 0
2005; PC64LE9-NEXT:    blr
2006;
2007; PC64-LABEL: ppcq_to_s1:
2008; PC64:       # %bb.0: # %entry
2009; PC64-NEXT:    mflr 0
2010; PC64-NEXT:    std 0, 16(1)
2011; PC64-NEXT:    stdu 1, -112(1)
2012; PC64-NEXT:    .cfi_def_cfa_offset 112
2013; PC64-NEXT:    .cfi_offset lr, 16
2014; PC64-NEXT:    bl __gcc_qtou
2015; PC64-NEXT:    nop
2016; PC64-NEXT:    addi 1, 1, 112
2017; PC64-NEXT:    ld 0, 16(1)
2018; PC64-NEXT:    mtlr 0
2019; PC64-NEXT:    blr
2020entry:
2021  %conv = tail call i1 @llvm.experimental.constrained.fptosi.ppcf128.i1(ppc_fp128 %a, metadata !"fpexcept.strict") #1
2022  ret i1 %conv
2023}
2024
2025define i1 @ppcq_to_u1(ppc_fp128 %a) {
2026; PC64LE-LABEL: ppcq_to_u1:
2027; PC64LE:       # %bb.0: # %entry
2028; PC64LE-NEXT:    mflr 0
2029; PC64LE-NEXT:    std 0, 16(1)
2030; PC64LE-NEXT:    stdu 1, -32(1)
2031; PC64LE-NEXT:    .cfi_def_cfa_offset 32
2032; PC64LE-NEXT:    .cfi_offset lr, 16
2033; PC64LE-NEXT:    bl __fixunstfsi
2034; PC64LE-NEXT:    nop
2035; PC64LE-NEXT:    addi 1, 1, 32
2036; PC64LE-NEXT:    ld 0, 16(1)
2037; PC64LE-NEXT:    mtlr 0
2038; PC64LE-NEXT:    blr
2039;
2040; PC64LE9-LABEL: ppcq_to_u1:
2041; PC64LE9:       # %bb.0: # %entry
2042; PC64LE9-NEXT:    mflr 0
2043; PC64LE9-NEXT:    std 0, 16(1)
2044; PC64LE9-NEXT:    stdu 1, -32(1)
2045; PC64LE9-NEXT:    .cfi_def_cfa_offset 32
2046; PC64LE9-NEXT:    .cfi_offset lr, 16
2047; PC64LE9-NEXT:    bl __fixunstfsi
2048; PC64LE9-NEXT:    nop
2049; PC64LE9-NEXT:    addi 1, 1, 32
2050; PC64LE9-NEXT:    ld 0, 16(1)
2051; PC64LE9-NEXT:    mtlr 0
2052; PC64LE9-NEXT:    blr
2053;
2054; PC64-LABEL: ppcq_to_u1:
2055; PC64:       # %bb.0: # %entry
2056; PC64-NEXT:    mflr 0
2057; PC64-NEXT:    std 0, 16(1)
2058; PC64-NEXT:    stdu 1, -112(1)
2059; PC64-NEXT:    .cfi_def_cfa_offset 112
2060; PC64-NEXT:    .cfi_offset lr, 16
2061; PC64-NEXT:    bl __fixunstfsi
2062; PC64-NEXT:    nop
2063; PC64-NEXT:    addi 1, 1, 112
2064; PC64-NEXT:    ld 0, 16(1)
2065; PC64-NEXT:    mtlr 0
2066; PC64-NEXT:    blr
2067entry:
2068  %conv = tail call i1 @llvm.experimental.constrained.fptoui.ppcf128.i1(ppc_fp128 %a, metadata !"fpexcept.strict") #1
2069  ret i1 %conv
2070}
2071
2072attributes #0 = { nounwind strictfp }
2073attributes #1 = { strictfp }
2074
2075declare ppc_fp128 @llvm.experimental.constrained.fadd.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
2076declare ppc_fp128 @llvm.experimental.constrained.ceil.ppcf128(ppc_fp128, metadata)
2077declare ppc_fp128 @llvm.experimental.constrained.cos.ppcf128(ppc_fp128, metadata, metadata)
2078declare ppc_fp128 @llvm.experimental.constrained.fdiv.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
2079declare ppc_fp128 @llvm.experimental.constrained.exp.ppcf128(ppc_fp128, metadata, metadata)
2080declare ppc_fp128 @llvm.experimental.constrained.exp2.ppcf128(ppc_fp128, metadata, metadata)
2081declare ppc_fp128 @llvm.experimental.constrained.floor.ppcf128(ppc_fp128, metadata)
2082declare ppc_fp128 @llvm.experimental.constrained.fma.ppcf128(ppc_fp128, ppc_fp128, ppc_fp128, metadata, metadata)
2083declare ppc_fp128 @llvm.experimental.constrained.fpext.f32.ppcf128(float, metadata)
2084declare ppc_fp128 @llvm.experimental.constrained.fpext.f64.ppcf128(double, metadata)
2085declare float @llvm.experimental.constrained.fptrunc.ppcf128.f32(ppc_fp128, metadata, metadata)
2086declare double @llvm.experimental.constrained.fptrunc.ppcf128.f64(ppc_fp128, metadata, metadata)
2087declare ppc_fp128 @llvm.experimental.constrained.log.ppcf128(ppc_fp128, metadata, metadata)
2088declare ppc_fp128 @llvm.experimental.constrained.log10.ppcf128(ppc_fp128, metadata, metadata)
2089declare ppc_fp128 @llvm.experimental.constrained.log2.ppcf128(ppc_fp128, metadata, metadata)
2090declare ppc_fp128 @llvm.experimental.constrained.maxnum.ppcf128(ppc_fp128, ppc_fp128, metadata)
2091declare ppc_fp128 @llvm.experimental.constrained.minnum.ppcf128(ppc_fp128, ppc_fp128, metadata)
2092declare ppc_fp128 @llvm.experimental.constrained.fmul.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
2093declare ppc_fp128 @llvm.experimental.constrained.nearbyint.ppcf128(ppc_fp128, metadata, metadata)
2094declare ppc_fp128 @llvm.experimental.constrained.pow.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
2095declare ppc_fp128 @llvm.experimental.constrained.powi.ppcf128(ppc_fp128, i32, metadata, metadata)
2096declare ppc_fp128 @llvm.experimental.constrained.frem.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
2097declare ppc_fp128 @llvm.experimental.constrained.rint.ppcf128(ppc_fp128, metadata, metadata)
2098declare ppc_fp128 @llvm.experimental.constrained.round.ppcf128(ppc_fp128, metadata)
2099declare ppc_fp128 @llvm.experimental.constrained.sin.ppcf128(ppc_fp128, metadata, metadata)
2100declare ppc_fp128 @llvm.experimental.constrained.sqrt.ppcf128(ppc_fp128, metadata, metadata)
2101declare ppc_fp128 @llvm.experimental.constrained.fsub.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
2102declare ppc_fp128 @llvm.experimental.constrained.trunc.ppcf128(ppc_fp128, metadata)
2103declare i64 @llvm.experimental.constrained.fptosi.i64.ppcf128(ppc_fp128, metadata)
2104declare i32 @llvm.experimental.constrained.fptosi.i32.ppcf128(ppc_fp128, metadata)
2105declare i1 @llvm.experimental.constrained.fptosi.ppcf128.i1(ppc_fp128, metadata)
2106declare i64 @llvm.experimental.constrained.fptoui.i64.ppcf128(ppc_fp128, metadata)
2107declare i32 @llvm.experimental.constrained.fptoui.i32.ppcf128(ppc_fp128, metadata)
2108declare i1 @llvm.experimental.constrained.fptoui.ppcf128.i1(ppc_fp128, metadata)
2109declare ppc_fp128 @llvm.experimental.constrained.sitofp.ppcf128.i32(i32, metadata, metadata)
2110declare ppc_fp128 @llvm.experimental.constrained.uitofp.ppcf128.i32(i32, metadata, metadata)
2111declare ppc_fp128 @llvm.experimental.constrained.sitofp.ppcf128.i64(i64, metadata, metadata)
2112declare ppc_fp128 @llvm.experimental.constrained.uitofp.ppcf128.i64(i64, metadata, metadata)
2113declare ppc_fp128 @llvm.experimental.constrained.sitofp.ppcf128.i128(i128, metadata, metadata)
2114declare ppc_fp128 @llvm.experimental.constrained.uitofp.ppcf128.i128(i128, metadata, metadata)
2115