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
5define <1 x float> @constrained_vector_fdiv_v1f32() #0 {
6; PC64LE-LABEL: constrained_vector_fdiv_v1f32:
7; PC64LE:       # %bb.0: # %entry
8; PC64LE-NEXT:    addis 3, 2, .LCPI0_0@toc@ha
9; PC64LE-NEXT:    addis 4, 2, .LCPI0_1@toc@ha
10; PC64LE-NEXT:    lfs 0, .LCPI0_0@toc@l(3)
11; PC64LE-NEXT:    lfs 1, .LCPI0_1@toc@l(4)
12; PC64LE-NEXT:    xsdivsp 1, 1, 0
13; PC64LE-NEXT:    blr
14;
15; PC64LE9-LABEL: constrained_vector_fdiv_v1f32:
16; PC64LE9:       # %bb.0: # %entry
17; PC64LE9-NEXT:    addis 3, 2, .LCPI0_0@toc@ha
18; PC64LE9-NEXT:    lfs 0, .LCPI0_0@toc@l(3)
19; PC64LE9-NEXT:    addis 3, 2, .LCPI0_1@toc@ha
20; PC64LE9-NEXT:    lfs 1, .LCPI0_1@toc@l(3)
21; PC64LE9-NEXT:    xsdivsp 1, 1, 0
22; PC64LE9-NEXT:    blr
23entry:
24  %div = call <1 x float> @llvm.experimental.constrained.fdiv.v1f32(
25           <1 x float> <float 1.000000e+00>,
26           <1 x float> <float 1.000000e+01>,
27           metadata !"round.dynamic",
28           metadata !"fpexcept.strict") #1
29  ret <1 x float> %div
30}
31
32define <2 x double> @constrained_vector_fdiv_v2f64() #0 {
33; PC64LE-LABEL: constrained_vector_fdiv_v2f64:
34; PC64LE:       # %bb.0: # %entry
35; PC64LE-NEXT:    addis 3, 2, .LCPI1_0@toc@ha
36; PC64LE-NEXT:    addis 4, 2, .LCPI1_1@toc@ha
37; PC64LE-NEXT:    addi 3, 3, .LCPI1_0@toc@l
38; PC64LE-NEXT:    addi 4, 4, .LCPI1_1@toc@l
39; PC64LE-NEXT:    lxvd2x 0, 0, 3
40; PC64LE-NEXT:    lxvd2x 1, 0, 4
41; PC64LE-NEXT:    xxswapd 0, 0
42; PC64LE-NEXT:    xxswapd 1, 1
43; PC64LE-NEXT:    xvdivdp 34, 1, 0
44; PC64LE-NEXT:    blr
45;
46; PC64LE9-LABEL: constrained_vector_fdiv_v2f64:
47; PC64LE9:       # %bb.0: # %entry
48; PC64LE9-NEXT:    addis 3, 2, .LCPI1_0@toc@ha
49; PC64LE9-NEXT:    addi 3, 3, .LCPI1_0@toc@l
50; PC64LE9-NEXT:    lxvx 0, 0, 3
51; PC64LE9-NEXT:    addis 3, 2, .LCPI1_1@toc@ha
52; PC64LE9-NEXT:    addi 3, 3, .LCPI1_1@toc@l
53; PC64LE9-NEXT:    lxvx 1, 0, 3
54; PC64LE9-NEXT:    xvdivdp 34, 1, 0
55; PC64LE9-NEXT:    blr
56entry:
57  %div = call <2 x double> @llvm.experimental.constrained.fdiv.v2f64(
58           <2 x double> <double 1.000000e+00, double 2.000000e+00>,
59           <2 x double> <double 1.000000e+01, double 1.000000e+01>,
60           metadata !"round.dynamic",
61           metadata !"fpexcept.strict") #1
62  ret <2 x double> %div
63}
64
65define <3 x float> @constrained_vector_fdiv_v3f32() #0 {
66; PC64LE-LABEL: constrained_vector_fdiv_v3f32:
67; PC64LE:       # %bb.0: # %entry
68; PC64LE-NEXT:    addis 3, 2, .LCPI2_0@toc@ha
69; PC64LE-NEXT:    addis 4, 2, .LCPI2_3@toc@ha
70; PC64LE-NEXT:    addis 5, 2, .LCPI2_2@toc@ha
71; PC64LE-NEXT:    lfs 0, .LCPI2_0@toc@l(3)
72; PC64LE-NEXT:    lfs 1, .LCPI2_3@toc@l(4)
73; PC64LE-NEXT:    lfs 2, .LCPI2_2@toc@l(5)
74; PC64LE-NEXT:    addis 3, 2, .LCPI2_1@toc@ha
75; PC64LE-NEXT:    xsdivsp 1, 1, 0
76; PC64LE-NEXT:    lfs 3, .LCPI2_1@toc@l(3)
77; PC64LE-NEXT:    addis 3, 2, .LCPI2_4@toc@ha
78; PC64LE-NEXT:    xsdivsp 2, 2, 0
79; PC64LE-NEXT:    addi 3, 3, .LCPI2_4@toc@l
80; PC64LE-NEXT:    lvx 4, 0, 3
81; PC64LE-NEXT:    xsdivsp 0, 3, 0
82; PC64LE-NEXT:    xscvdpspn 1, 1
83; PC64LE-NEXT:    xscvdpspn 2, 2
84; PC64LE-NEXT:    xscvdpspn 0, 0
85; PC64LE-NEXT:    xxsldwi 34, 1, 1, 3
86; PC64LE-NEXT:    xxsldwi 35, 2, 2, 3
87; PC64LE-NEXT:    vmrghw 2, 3, 2
88; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
89; PC64LE-NEXT:    vperm 2, 3, 2, 4
90; PC64LE-NEXT:    blr
91;
92; PC64LE9-LABEL: constrained_vector_fdiv_v3f32:
93; PC64LE9:       # %bb.0: # %entry
94; PC64LE9-NEXT:    addis 3, 2, .LCPI2_0@toc@ha
95; PC64LE9-NEXT:    lfs 0, .LCPI2_0@toc@l(3)
96; PC64LE9-NEXT:    addis 3, 2, .LCPI2_1@toc@ha
97; PC64LE9-NEXT:    lfs 1, .LCPI2_1@toc@l(3)
98; PC64LE9-NEXT:    addis 3, 2, .LCPI2_2@toc@ha
99; PC64LE9-NEXT:    xsdivsp 1, 1, 0
100; PC64LE9-NEXT:    lfs 2, .LCPI2_2@toc@l(3)
101; PC64LE9-NEXT:    addis 3, 2, .LCPI2_3@toc@ha
102; PC64LE9-NEXT:    lfs 3, .LCPI2_3@toc@l(3)
103; PC64LE9-NEXT:    addis 3, 2, .LCPI2_4@toc@ha
104; PC64LE9-NEXT:    addi 3, 3, .LCPI2_4@toc@l
105; PC64LE9-NEXT:    lxvx 36, 0, 3
106; PC64LE9-NEXT:    xsdivsp 2, 2, 0
107; PC64LE9-NEXT:    xsdivsp 0, 3, 0
108; PC64LE9-NEXT:    xscvdpspn 0, 0
109; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
110; PC64LE9-NEXT:    xscvdpspn 0, 2
111; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
112; PC64LE9-NEXT:    xscvdpspn 0, 1
113; PC64LE9-NEXT:    vmrghw 2, 3, 2
114; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
115; PC64LE9-NEXT:    vperm 2, 3, 2, 4
116; PC64LE9-NEXT:    blr
117entry:
118  %div = call <3 x float> @llvm.experimental.constrained.fdiv.v3f32(
119           <3 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>,
120           <3 x float> <float 1.000000e+01, float 1.000000e+01, float 1.000000e+01>,
121           metadata !"round.dynamic",
122           metadata !"fpexcept.strict") #1
123  ret <3 x float> %div
124}
125
126define <3 x double> @constrained_vector_fdiv_v3f64() #0 {
127; PC64LE-LABEL: constrained_vector_fdiv_v3f64:
128; PC64LE:       # %bb.0: # %entry
129; PC64LE-NEXT:    addis 3, 2, .LCPI3_2@toc@ha
130; PC64LE-NEXT:    addis 4, 2, .LCPI3_3@toc@ha
131; PC64LE-NEXT:    addi 3, 3, .LCPI3_2@toc@l
132; PC64LE-NEXT:    addi 4, 4, .LCPI3_3@toc@l
133; PC64LE-NEXT:    lxvd2x 0, 0, 3
134; PC64LE-NEXT:    lxvd2x 1, 0, 4
135; PC64LE-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
136; PC64LE-NEXT:    addis 4, 2, .LCPI3_1@toc@ha
137; PC64LE-NEXT:    lfs 3, .LCPI3_0@toc@l(3)
138; PC64LE-NEXT:    xxswapd 0, 0
139; PC64LE-NEXT:    xxswapd 1, 1
140; PC64LE-NEXT:    xvdivdp 2, 1, 0
141; PC64LE-NEXT:    lfs 0, .LCPI3_1@toc@l(4)
142; PC64LE-NEXT:    xsdivdp 3, 0, 3
143; PC64LE-NEXT:    xxswapd 1, 2
144; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
145; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
146; PC64LE-NEXT:    blr
147;
148; PC64LE9-LABEL: constrained_vector_fdiv_v3f64:
149; PC64LE9:       # %bb.0: # %entry
150; PC64LE9-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
151; PC64LE9-NEXT:    lfs 0, .LCPI3_0@toc@l(3)
152; PC64LE9-NEXT:    addis 3, 2, .LCPI3_1@toc@ha
153; PC64LE9-NEXT:    lfs 1, .LCPI3_1@toc@l(3)
154; PC64LE9-NEXT:    addis 3, 2, .LCPI3_2@toc@ha
155; PC64LE9-NEXT:    addi 3, 3, .LCPI3_2@toc@l
156; PC64LE9-NEXT:    xsdivdp 3, 1, 0
157; PC64LE9-NEXT:    lxvx 0, 0, 3
158; PC64LE9-NEXT:    addis 3, 2, .LCPI3_3@toc@ha
159; PC64LE9-NEXT:    addi 3, 3, .LCPI3_3@toc@l
160; PC64LE9-NEXT:    lxvx 1, 0, 3
161; PC64LE9-NEXT:    xvdivdp 2, 1, 0
162; PC64LE9-NEXT:    xxswapd 1, 2
163; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
164; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
165; PC64LE9-NEXT:    blr
166entry:
167  %div = call <3 x double> @llvm.experimental.constrained.fdiv.v3f64(
168           <3 x double> <double 1.000000e+00, double 2.000000e+00, double 3.000000e+00>,
169           <3 x double> <double 1.000000e+01, double 1.000000e+01, double 1.000000e+01>,
170           metadata !"round.dynamic",
171           metadata !"fpexcept.strict") #1
172  ret <3 x double> %div
173}
174
175define <4 x double> @constrained_vector_fdiv_v4f64() #0 {
176; PC64LE-LABEL: constrained_vector_fdiv_v4f64:
177; PC64LE:       # %bb.0: # %entry
178; PC64LE-NEXT:    addis 3, 2, .LCPI4_0@toc@ha
179; PC64LE-NEXT:    addis 4, 2, .LCPI4_1@toc@ha
180; PC64LE-NEXT:    addis 5, 2, .LCPI4_2@toc@ha
181; PC64LE-NEXT:    addi 3, 3, .LCPI4_0@toc@l
182; PC64LE-NEXT:    lxvd2x 0, 0, 3
183; PC64LE-NEXT:    addi 3, 4, .LCPI4_1@toc@l
184; PC64LE-NEXT:    addi 4, 5, .LCPI4_2@toc@l
185; PC64LE-NEXT:    lxvd2x 1, 0, 3
186; PC64LE-NEXT:    lxvd2x 2, 0, 4
187; PC64LE-NEXT:    xxswapd 0, 0
188; PC64LE-NEXT:    xxswapd 1, 1
189; PC64LE-NEXT:    xxswapd 2, 2
190; PC64LE-NEXT:    xvdivdp 35, 1, 0
191; PC64LE-NEXT:    xvdivdp 34, 2, 0
192; PC64LE-NEXT:    blr
193;
194; PC64LE9-LABEL: constrained_vector_fdiv_v4f64:
195; PC64LE9:       # %bb.0: # %entry
196; PC64LE9-NEXT:    addis 3, 2, .LCPI4_0@toc@ha
197; PC64LE9-NEXT:    addi 3, 3, .LCPI4_0@toc@l
198; PC64LE9-NEXT:    lxvx 0, 0, 3
199; PC64LE9-NEXT:    addis 3, 2, .LCPI4_1@toc@ha
200; PC64LE9-NEXT:    addi 3, 3, .LCPI4_1@toc@l
201; PC64LE9-NEXT:    lxvx 1, 0, 3
202; PC64LE9-NEXT:    addis 3, 2, .LCPI4_2@toc@ha
203; PC64LE9-NEXT:    addi 3, 3, .LCPI4_2@toc@l
204; PC64LE9-NEXT:    xvdivdp 35, 1, 0
205; PC64LE9-NEXT:    lxvx 1, 0, 3
206; PC64LE9-NEXT:    xvdivdp 34, 1, 0
207; PC64LE9-NEXT:    blr
208entry:
209  %div = call <4 x double> @llvm.experimental.constrained.fdiv.v4f64(
210           <4 x double> <double 1.000000e+00, double 2.000000e+00,
211                         double 3.000000e+00, double 4.000000e+00>,
212           <4 x double> <double 1.000000e+01, double 1.000000e+01,
213                         double 1.000000e+01, double 1.000000e+01>,
214           metadata !"round.dynamic",
215           metadata !"fpexcept.strict") #1
216  ret <4 x double> %div
217}
218
219define <1 x float> @constrained_vector_frem_v1f32() #0 {
220; PC64LE-LABEL: constrained_vector_frem_v1f32:
221; PC64LE:       # %bb.0: # %entry
222; PC64LE-NEXT:    mflr 0
223; PC64LE-NEXT:    std 0, 16(1)
224; PC64LE-NEXT:    stdu 1, -32(1)
225; PC64LE-NEXT:    addis 3, 2, .LCPI5_0@toc@ha
226; PC64LE-NEXT:    addis 4, 2, .LCPI5_1@toc@ha
227; PC64LE-NEXT:    lfs 1, .LCPI5_0@toc@l(3)
228; PC64LE-NEXT:    lfs 2, .LCPI5_1@toc@l(4)
229; PC64LE-NEXT:    bl fmodf
230; PC64LE-NEXT:    nop
231; PC64LE-NEXT:    addi 1, 1, 32
232; PC64LE-NEXT:    ld 0, 16(1)
233; PC64LE-NEXT:    mtlr 0
234; PC64LE-NEXT:    blr
235;
236; PC64LE9-LABEL: constrained_vector_frem_v1f32:
237; PC64LE9:       # %bb.0: # %entry
238; PC64LE9-NEXT:    mflr 0
239; PC64LE9-NEXT:    std 0, 16(1)
240; PC64LE9-NEXT:    stdu 1, -32(1)
241; PC64LE9-NEXT:    addis 3, 2, .LCPI5_0@toc@ha
242; PC64LE9-NEXT:    lfs 1, .LCPI5_0@toc@l(3)
243; PC64LE9-NEXT:    addis 3, 2, .LCPI5_1@toc@ha
244; PC64LE9-NEXT:    lfs 2, .LCPI5_1@toc@l(3)
245; PC64LE9-NEXT:    bl fmodf
246; PC64LE9-NEXT:    nop
247; PC64LE9-NEXT:    addi 1, 1, 32
248; PC64LE9-NEXT:    ld 0, 16(1)
249; PC64LE9-NEXT:    mtlr 0
250; PC64LE9-NEXT:    blr
251entry:
252  %rem = call <1 x float> @llvm.experimental.constrained.frem.v1f32(
253           <1 x float> <float 1.000000e+00>,
254           <1 x float> <float 1.000000e+01>,
255           metadata !"round.dynamic",
256           metadata !"fpexcept.strict") #1
257  ret <1 x float> %rem
258}
259
260define <2 x double> @constrained_vector_frem_v2f64() #0 {
261; PC64LE-LABEL: constrained_vector_frem_v2f64:
262; PC64LE:       # %bb.0: # %entry
263; PC64LE-NEXT:    mflr 0
264; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
265; PC64LE-NEXT:    std 0, 16(1)
266; PC64LE-NEXT:    stdu 1, -80(1)
267; PC64LE-NEXT:    addis 4, 2, .LCPI6_1@toc@ha
268; PC64LE-NEXT:    addis 3, 2, .LCPI6_0@toc@ha
269; PC64LE-NEXT:    lfs 31, .LCPI6_1@toc@l(4)
270; PC64LE-NEXT:    lfs 1, .LCPI6_0@toc@l(3)
271; PC64LE-NEXT:    fmr 2, 31
272; PC64LE-NEXT:    bl fmod
273; PC64LE-NEXT:    nop
274; PC64LE-NEXT:    li 3, 48
275; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
276; PC64LE-NEXT:    fmr 2, 31
277; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
278; PC64LE-NEXT:    addis 3, 2, .LCPI6_2@toc@ha
279; PC64LE-NEXT:    lfs 1, .LCPI6_2@toc@l(3)
280; PC64LE-NEXT:    bl fmod
281; PC64LE-NEXT:    nop
282; PC64LE-NEXT:    li 3, 48
283; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
284; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
285; PC64LE-NEXT:    xxmrghd 34, 1, 0
286; PC64LE-NEXT:    addi 1, 1, 80
287; PC64LE-NEXT:    ld 0, 16(1)
288; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
289; PC64LE-NEXT:    mtlr 0
290; PC64LE-NEXT:    blr
291;
292; PC64LE9-LABEL: constrained_vector_frem_v2f64:
293; PC64LE9:       # %bb.0: # %entry
294; PC64LE9-NEXT:    mflr 0
295; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
296; PC64LE9-NEXT:    std 0, 16(1)
297; PC64LE9-NEXT:    stdu 1, -64(1)
298; PC64LE9-NEXT:    addis 3, 2, .LCPI6_0@toc@ha
299; PC64LE9-NEXT:    lfs 1, .LCPI6_0@toc@l(3)
300; PC64LE9-NEXT:    addis 3, 2, .LCPI6_1@toc@ha
301; PC64LE9-NEXT:    lfs 31, .LCPI6_1@toc@l(3)
302; PC64LE9-NEXT:    fmr 2, 31
303; PC64LE9-NEXT:    bl fmod
304; PC64LE9-NEXT:    nop
305; PC64LE9-NEXT:    addis 3, 2, .LCPI6_2@toc@ha
306; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
307; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
308; PC64LE9-NEXT:    lfs 1, .LCPI6_2@toc@l(3)
309; PC64LE9-NEXT:    fmr 2, 31
310; PC64LE9-NEXT:    bl fmod
311; PC64LE9-NEXT:    nop
312; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
313; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
314; PC64LE9-NEXT:    xxmrghd 34, 1, 0
315; PC64LE9-NEXT:    addi 1, 1, 64
316; PC64LE9-NEXT:    ld 0, 16(1)
317; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
318; PC64LE9-NEXT:    mtlr 0
319; PC64LE9-NEXT:    blr
320entry:
321  %rem = call <2 x double> @llvm.experimental.constrained.frem.v2f64(
322           <2 x double> <double 1.000000e+00, double 2.000000e+00>,
323           <2 x double> <double 1.000000e+01, double 1.000000e+01>,
324           metadata !"round.dynamic",
325           metadata !"fpexcept.strict") #1
326  ret <2 x double> %rem
327}
328
329define <3 x float> @constrained_vector_frem_v3f32() #0 {
330; PC64LE-LABEL: constrained_vector_frem_v3f32:
331; PC64LE:       # %bb.0: # %entry
332; PC64LE-NEXT:    mflr 0
333; PC64LE-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
334; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
335; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
336; PC64LE-NEXT:    std 0, 16(1)
337; PC64LE-NEXT:    stdu 1, -64(1)
338; PC64LE-NEXT:    addis 4, 2, .LCPI7_1@toc@ha
339; PC64LE-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
340; PC64LE-NEXT:    lfs 31, .LCPI7_1@toc@l(4)
341; PC64LE-NEXT:    lfs 1, .LCPI7_0@toc@l(3)
342; PC64LE-NEXT:    fmr 2, 31
343; PC64LE-NEXT:    bl fmodf
344; PC64LE-NEXT:    nop
345; PC64LE-NEXT:    addis 3, 2, .LCPI7_2@toc@ha
346; PC64LE-NEXT:    fmr 2, 31
347; PC64LE-NEXT:    fmr 30, 1
348; PC64LE-NEXT:    lfs 1, .LCPI7_2@toc@l(3)
349; PC64LE-NEXT:    bl fmodf
350; PC64LE-NEXT:    nop
351; PC64LE-NEXT:    addis 3, 2, .LCPI7_3@toc@ha
352; PC64LE-NEXT:    fmr 2, 31
353; PC64LE-NEXT:    fmr 29, 1
354; PC64LE-NEXT:    lfs 1, .LCPI7_3@toc@l(3)
355; PC64LE-NEXT:    bl fmodf
356; PC64LE-NEXT:    nop
357; PC64LE-NEXT:    xscvdpspn 0, 29
358; PC64LE-NEXT:    addis 3, 2, .LCPI7_4@toc@ha
359; PC64LE-NEXT:    xscvdpspn 1, 1
360; PC64LE-NEXT:    addi 3, 3, .LCPI7_4@toc@l
361; PC64LE-NEXT:    lvx 4, 0, 3
362; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
363; PC64LE-NEXT:    xscvdpspn 0, 30
364; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
365; PC64LE-NEXT:    vmrghw 2, 2, 3
366; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
367; PC64LE-NEXT:    vperm 2, 3, 2, 4
368; PC64LE-NEXT:    addi 1, 1, 64
369; PC64LE-NEXT:    ld 0, 16(1)
370; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
371; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
372; PC64LE-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
373; PC64LE-NEXT:    mtlr 0
374; PC64LE-NEXT:    blr
375;
376; PC64LE9-LABEL: constrained_vector_frem_v3f32:
377; PC64LE9:       # %bb.0: # %entry
378; PC64LE9-NEXT:    mflr 0
379; PC64LE9-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
380; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
381; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
382; PC64LE9-NEXT:    std 0, 16(1)
383; PC64LE9-NEXT:    stdu 1, -64(1)
384; PC64LE9-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
385; PC64LE9-NEXT:    lfs 1, .LCPI7_0@toc@l(3)
386; PC64LE9-NEXT:    addis 3, 2, .LCPI7_1@toc@ha
387; PC64LE9-NEXT:    lfs 31, .LCPI7_1@toc@l(3)
388; PC64LE9-NEXT:    fmr 2, 31
389; PC64LE9-NEXT:    bl fmodf
390; PC64LE9-NEXT:    nop
391; PC64LE9-NEXT:    addis 3, 2, .LCPI7_2@toc@ha
392; PC64LE9-NEXT:    fmr 30, 1
393; PC64LE9-NEXT:    lfs 1, .LCPI7_2@toc@l(3)
394; PC64LE9-NEXT:    fmr 2, 31
395; PC64LE9-NEXT:    bl fmodf
396; PC64LE9-NEXT:    nop
397; PC64LE9-NEXT:    addis 3, 2, .LCPI7_3@toc@ha
398; PC64LE9-NEXT:    fmr 29, 1
399; PC64LE9-NEXT:    lfs 1, .LCPI7_3@toc@l(3)
400; PC64LE9-NEXT:    fmr 2, 31
401; PC64LE9-NEXT:    bl fmodf
402; PC64LE9-NEXT:    nop
403; PC64LE9-NEXT:    xscvdpspn 0, 1
404; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
405; PC64LE9-NEXT:    xscvdpspn 0, 29
406; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
407; PC64LE9-NEXT:    xscvdpspn 0, 30
408; PC64LE9-NEXT:    addis 3, 2, .LCPI7_4@toc@ha
409; PC64LE9-NEXT:    addi 3, 3, .LCPI7_4@toc@l
410; PC64LE9-NEXT:    lxvx 36, 0, 3
411; PC64LE9-NEXT:    vmrghw 2, 3, 2
412; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
413; PC64LE9-NEXT:    vperm 2, 3, 2, 4
414; PC64LE9-NEXT:    addi 1, 1, 64
415; PC64LE9-NEXT:    ld 0, 16(1)
416; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
417; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
418; PC64LE9-NEXT:    mtlr 0
419; PC64LE9-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
420; PC64LE9-NEXT:    blr
421entry:
422  %rem = call <3 x float> @llvm.experimental.constrained.frem.v3f32(
423           <3 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>,
424           <3 x float> <float 1.000000e+01, float 1.000000e+01, float 1.000000e+01>,
425           metadata !"round.dynamic",
426           metadata !"fpexcept.strict") #1
427  ret <3 x float> %rem
428}
429
430define <3 x double> @constrained_vector_frem_v3f64() #0 {
431; PC64LE-LABEL: constrained_vector_frem_v3f64:
432; PC64LE:       # %bb.0: # %entry
433; PC64LE-NEXT:    mflr 0
434; PC64LE-NEXT:    std 0, 16(1)
435; PC64LE-NEXT:    stdu 1, -96(1)
436; PC64LE-NEXT:    addis 4, 2, .LCPI8_1@toc@ha
437; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
438; PC64LE-NEXT:    li 3, 64
439; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
440; PC64LE-NEXT:    addis 3, 2, .LCPI8_0@toc@ha
441; PC64LE-NEXT:    lfs 31, .LCPI8_1@toc@l(4)
442; PC64LE-NEXT:    lfs 1, .LCPI8_0@toc@l(3)
443; PC64LE-NEXT:    fmr 2, 31
444; PC64LE-NEXT:    bl fmod
445; PC64LE-NEXT:    nop
446; PC64LE-NEXT:    li 3, 48
447; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
448; PC64LE-NEXT:    fmr 2, 31
449; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
450; PC64LE-NEXT:    addis 3, 2, .LCPI8_2@toc@ha
451; PC64LE-NEXT:    lfs 1, .LCPI8_2@toc@l(3)
452; PC64LE-NEXT:    bl fmod
453; PC64LE-NEXT:    nop
454; PC64LE-NEXT:    li 3, 48
455; PC64LE-NEXT:    fmr 2, 31
456; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
457; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
458; PC64LE-NEXT:    addis 3, 2, .LCPI8_3@toc@ha
459; PC64LE-NEXT:    xxmrghd 63, 1, 0
460; PC64LE-NEXT:    lfs 1, .LCPI8_3@toc@l(3)
461; PC64LE-NEXT:    bl fmod
462; PC64LE-NEXT:    nop
463; PC64LE-NEXT:    xxswapd 0, 63
464; PC64LE-NEXT:    li 3, 64
465; PC64LE-NEXT:    xxlor 2, 63, 63
466; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
467; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
468; PC64LE-NEXT:    fmr 3, 1
469; PC64LE-NEXT:    fmr 1, 0
470; PC64LE-NEXT:    addi 1, 1, 96
471; PC64LE-NEXT:    ld 0, 16(1)
472; PC64LE-NEXT:    mtlr 0
473; PC64LE-NEXT:    blr
474;
475; PC64LE9-LABEL: constrained_vector_frem_v3f64:
476; PC64LE9:       # %bb.0: # %entry
477; PC64LE9-NEXT:    mflr 0
478; PC64LE9-NEXT:    std 0, 16(1)
479; PC64LE9-NEXT:    stdu 1, -80(1)
480; PC64LE9-NEXT:    addis 3, 2, .LCPI8_0@toc@ha
481; PC64LE9-NEXT:    lfs 1, .LCPI8_0@toc@l(3)
482; PC64LE9-NEXT:    addis 3, 2, .LCPI8_1@toc@ha
483; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
484; PC64LE9-NEXT:    lfs 31, .LCPI8_1@toc@l(3)
485; PC64LE9-NEXT:    fmr 2, 31
486; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
487; PC64LE9-NEXT:    bl fmod
488; PC64LE9-NEXT:    nop
489; PC64LE9-NEXT:    addis 3, 2, .LCPI8_2@toc@ha
490; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
491; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
492; PC64LE9-NEXT:    lfs 1, .LCPI8_2@toc@l(3)
493; PC64LE9-NEXT:    fmr 2, 31
494; PC64LE9-NEXT:    bl fmod
495; PC64LE9-NEXT:    nop
496; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
497; PC64LE9-NEXT:    addis 3, 2, .LCPI8_3@toc@ha
498; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
499; PC64LE9-NEXT:    xxmrghd 63, 1, 0
500; PC64LE9-NEXT:    lfs 1, .LCPI8_3@toc@l(3)
501; PC64LE9-NEXT:    fmr 2, 31
502; PC64LE9-NEXT:    bl fmod
503; PC64LE9-NEXT:    nop
504; PC64LE9-NEXT:    fmr 3, 1
505; PC64LE9-NEXT:    xxswapd 1, 63
506; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
507; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
508; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
509; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
510; PC64LE9-NEXT:    addi 1, 1, 80
511; PC64LE9-NEXT:    ld 0, 16(1)
512; PC64LE9-NEXT:    mtlr 0
513; PC64LE9-NEXT:    blr
514entry:
515  %rem = call <3 x double> @llvm.experimental.constrained.frem.v3f64(
516           <3 x double> <double 1.000000e+00, double 2.000000e+00, double 3.000000e+00>,
517           <3 x double> <double 1.000000e+01, double 1.000000e+01, double 1.000000e+01>,
518           metadata !"round.dynamic",
519           metadata !"fpexcept.strict") #1
520  ret <3 x double> %rem
521}
522
523define <4 x double> @constrained_vector_frem_v4f64() #0 {
524; PC64LE-LABEL: constrained_vector_frem_v4f64:
525; PC64LE:       # %bb.0:
526; PC64LE-NEXT:    mflr 0
527; PC64LE-NEXT:    std 0, 16(1)
528; PC64LE-NEXT:    stdu 1, -96(1)
529; PC64LE-NEXT:    addis 4, 2, .LCPI9_1@toc@ha
530; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
531; PC64LE-NEXT:    li 3, 64
532; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
533; PC64LE-NEXT:    addis 3, 2, .LCPI9_0@toc@ha
534; PC64LE-NEXT:    lfs 31, .LCPI9_1@toc@l(4)
535; PC64LE-NEXT:    lfs 1, .LCPI9_0@toc@l(3)
536; PC64LE-NEXT:    fmr 2, 31
537; PC64LE-NEXT:    bl fmod
538; PC64LE-NEXT:    nop
539; PC64LE-NEXT:    li 3, 48
540; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
541; PC64LE-NEXT:    fmr 2, 31
542; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
543; PC64LE-NEXT:    addis 3, 2, .LCPI9_2@toc@ha
544; PC64LE-NEXT:    lfs 1, .LCPI9_2@toc@l(3)
545; PC64LE-NEXT:    bl fmod
546; PC64LE-NEXT:    nop
547; PC64LE-NEXT:    li 3, 48
548; PC64LE-NEXT:    fmr 2, 31
549; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
550; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
551; PC64LE-NEXT:    addis 3, 2, .LCPI9_3@toc@ha
552; PC64LE-NEXT:    xxmrghd 63, 1, 0
553; PC64LE-NEXT:    lfs 1, .LCPI9_3@toc@l(3)
554; PC64LE-NEXT:    bl fmod
555; PC64LE-NEXT:    nop
556; PC64LE-NEXT:    li 3, 48
557; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
558; PC64LE-NEXT:    fmr 2, 31
559; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
560; PC64LE-NEXT:    addis 3, 2, .LCPI9_4@toc@ha
561; PC64LE-NEXT:    lfs 1, .LCPI9_4@toc@l(3)
562; PC64LE-NEXT:    bl fmod
563; PC64LE-NEXT:    nop
564; PC64LE-NEXT:    li 3, 48
565; PC64LE-NEXT:    vmr 2, 31
566; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
567; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
568; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
569; PC64LE-NEXT:    li 3, 64
570; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
571; PC64LE-NEXT:    xxmrghd 35, 1, 0
572; PC64LE-NEXT:    addi 1, 1, 96
573; PC64LE-NEXT:    ld 0, 16(1)
574; PC64LE-NEXT:    mtlr 0
575; PC64LE-NEXT:    blr
576;
577; PC64LE9-LABEL: constrained_vector_frem_v4f64:
578; PC64LE9:       # %bb.0:
579; PC64LE9-NEXT:    mflr 0
580; PC64LE9-NEXT:    std 0, 16(1)
581; PC64LE9-NEXT:    stdu 1, -80(1)
582; PC64LE9-NEXT:    addis 3, 2, .LCPI9_0@toc@ha
583; PC64LE9-NEXT:    lfs 1, .LCPI9_0@toc@l(3)
584; PC64LE9-NEXT:    addis 3, 2, .LCPI9_1@toc@ha
585; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
586; PC64LE9-NEXT:    lfs 31, .LCPI9_1@toc@l(3)
587; PC64LE9-NEXT:    fmr 2, 31
588; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
589; PC64LE9-NEXT:    bl fmod
590; PC64LE9-NEXT:    nop
591; PC64LE9-NEXT:    addis 3, 2, .LCPI9_2@toc@ha
592; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
593; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
594; PC64LE9-NEXT:    lfs 1, .LCPI9_2@toc@l(3)
595; PC64LE9-NEXT:    fmr 2, 31
596; PC64LE9-NEXT:    bl fmod
597; PC64LE9-NEXT:    nop
598; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
599; PC64LE9-NEXT:    addis 3, 2, .LCPI9_3@toc@ha
600; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
601; PC64LE9-NEXT:    xxmrghd 63, 1, 0
602; PC64LE9-NEXT:    lfs 1, .LCPI9_3@toc@l(3)
603; PC64LE9-NEXT:    fmr 2, 31
604; PC64LE9-NEXT:    bl fmod
605; PC64LE9-NEXT:    nop
606; PC64LE9-NEXT:    addis 3, 2, .LCPI9_4@toc@ha
607; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
608; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
609; PC64LE9-NEXT:    lfs 1, .LCPI9_4@toc@l(3)
610; PC64LE9-NEXT:    fmr 2, 31
611; PC64LE9-NEXT:    bl fmod
612; PC64LE9-NEXT:    nop
613; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
614; PC64LE9-NEXT:    vmr 2, 31
615; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
616; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
617; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
618; PC64LE9-NEXT:    xxmrghd 35, 1, 0
619; PC64LE9-NEXT:    addi 1, 1, 80
620; PC64LE9-NEXT:    ld 0, 16(1)
621; PC64LE9-NEXT:    mtlr 0
622; PC64LE9-NEXT:    blr
623  %rem = call <4 x double> @llvm.experimental.constrained.frem.v4f64(
624           <4 x double> <double 1.000000e+00, double 2.000000e+00,
625                         double 3.000000e+00, double 4.000000e+00>,
626           <4 x double> <double 1.000000e+01, double 1.000000e+01,
627                         double 1.000000e+01, double 1.000000e+01>,
628           metadata !"round.dynamic",
629           metadata !"fpexcept.strict") #1
630  ret <4 x double> %rem
631}
632
633define <1 x float> @constrained_vector_fmul_v1f32() #0 {
634; PC64LE-LABEL: constrained_vector_fmul_v1f32:
635; PC64LE:       # %bb.0: # %entry
636; PC64LE-NEXT:    addis 3, 2, .LCPI10_0@toc@ha
637; PC64LE-NEXT:    addis 4, 2, .LCPI10_1@toc@ha
638; PC64LE-NEXT:    lfs 0, .LCPI10_0@toc@l(3)
639; PC64LE-NEXT:    lfs 1, .LCPI10_1@toc@l(4)
640; PC64LE-NEXT:    xsmulsp 1, 1, 0
641; PC64LE-NEXT:    blr
642;
643; PC64LE9-LABEL: constrained_vector_fmul_v1f32:
644; PC64LE9:       # %bb.0: # %entry
645; PC64LE9-NEXT:    addis 3, 2, .LCPI10_0@toc@ha
646; PC64LE9-NEXT:    lfs 0, .LCPI10_0@toc@l(3)
647; PC64LE9-NEXT:    addis 3, 2, .LCPI10_1@toc@ha
648; PC64LE9-NEXT:    lfs 1, .LCPI10_1@toc@l(3)
649; PC64LE9-NEXT:    xsmulsp 1, 1, 0
650; PC64LE9-NEXT:    blr
651entry:
652  %mul = call <1 x float> @llvm.experimental.constrained.fmul.v1f32(
653           <1 x float> <float 0x7FF0000000000000>,
654           <1 x float> <float 2.000000e+00>,
655           metadata !"round.dynamic",
656           metadata !"fpexcept.strict") #1
657  ret <1 x float> %mul
658}
659
660define <2 x double> @constrained_vector_fmul_v2f64() #0 {
661; PC64LE-LABEL: constrained_vector_fmul_v2f64:
662; PC64LE:       # %bb.0: # %entry
663; PC64LE-NEXT:    addis 3, 2, .LCPI11_0@toc@ha
664; PC64LE-NEXT:    addis 4, 2, .LCPI11_1@toc@ha
665; PC64LE-NEXT:    addi 3, 3, .LCPI11_0@toc@l
666; PC64LE-NEXT:    addi 4, 4, .LCPI11_1@toc@l
667; PC64LE-NEXT:    lxvd2x 0, 0, 3
668; PC64LE-NEXT:    lxvd2x 1, 0, 4
669; PC64LE-NEXT:    xxswapd 0, 0
670; PC64LE-NEXT:    xxswapd 1, 1
671; PC64LE-NEXT:    xvmuldp 34, 1, 0
672; PC64LE-NEXT:    blr
673;
674; PC64LE9-LABEL: constrained_vector_fmul_v2f64:
675; PC64LE9:       # %bb.0: # %entry
676; PC64LE9-NEXT:    addis 3, 2, .LCPI11_0@toc@ha
677; PC64LE9-NEXT:    addi 3, 3, .LCPI11_0@toc@l
678; PC64LE9-NEXT:    lxvx 0, 0, 3
679; PC64LE9-NEXT:    addis 3, 2, .LCPI11_1@toc@ha
680; PC64LE9-NEXT:    addi 3, 3, .LCPI11_1@toc@l
681; PC64LE9-NEXT:    lxvx 1, 0, 3
682; PC64LE9-NEXT:    xvmuldp 34, 1, 0
683; PC64LE9-NEXT:    blr
684entry:
685  %mul = call <2 x double> @llvm.experimental.constrained.fmul.v2f64(
686           <2 x double> <double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF>,
687           <2 x double> <double 2.000000e+00, double 3.000000e+00>,
688           metadata !"round.dynamic",
689           metadata !"fpexcept.strict") #1
690  ret <2 x double> %mul
691}
692
693define <3 x float> @constrained_vector_fmul_v3f32() #0 {
694; PC64LE-LABEL: constrained_vector_fmul_v3f32:
695; PC64LE:       # %bb.0: # %entry
696; PC64LE-NEXT:    addis 3, 2, .LCPI12_1@toc@ha
697; PC64LE-NEXT:    addis 4, 2, .LCPI12_3@toc@ha
698; PC64LE-NEXT:    addis 5, 2, .LCPI12_2@toc@ha
699; PC64LE-NEXT:    lfs 0, .LCPI12_1@toc@l(3)
700; PC64LE-NEXT:    lfs 1, .LCPI12_3@toc@l(4)
701; PC64LE-NEXT:    lfs 2, .LCPI12_2@toc@l(5)
702; PC64LE-NEXT:    addis 3, 2, .LCPI12_0@toc@ha
703; PC64LE-NEXT:    xsmulsp 1, 0, 1
704; PC64LE-NEXT:    lfs 3, .LCPI12_0@toc@l(3)
705; PC64LE-NEXT:    addis 3, 2, .LCPI12_4@toc@ha
706; PC64LE-NEXT:    xsmulsp 2, 0, 2
707; PC64LE-NEXT:    addi 3, 3, .LCPI12_4@toc@l
708; PC64LE-NEXT:    lvx 4, 0, 3
709; PC64LE-NEXT:    xsmulsp 0, 0, 3
710; PC64LE-NEXT:    xscvdpspn 1, 1
711; PC64LE-NEXT:    xscvdpspn 2, 2
712; PC64LE-NEXT:    xscvdpspn 0, 0
713; PC64LE-NEXT:    xxsldwi 34, 1, 1, 3
714; PC64LE-NEXT:    xxsldwi 35, 2, 2, 3
715; PC64LE-NEXT:    vmrghw 2, 3, 2
716; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
717; PC64LE-NEXT:    vperm 2, 3, 2, 4
718; PC64LE-NEXT:    blr
719;
720; PC64LE9-LABEL: constrained_vector_fmul_v3f32:
721; PC64LE9:       # %bb.0: # %entry
722; PC64LE9-NEXT:    addis 3, 2, .LCPI12_0@toc@ha
723; PC64LE9-NEXT:    lfs 0, .LCPI12_0@toc@l(3)
724; PC64LE9-NEXT:    addis 3, 2, .LCPI12_1@toc@ha
725; PC64LE9-NEXT:    lfs 1, .LCPI12_1@toc@l(3)
726; PC64LE9-NEXT:    addis 3, 2, .LCPI12_2@toc@ha
727; PC64LE9-NEXT:    xsmulsp 0, 1, 0
728; PC64LE9-NEXT:    lfs 2, .LCPI12_2@toc@l(3)
729; PC64LE9-NEXT:    addis 3, 2, .LCPI12_3@toc@ha
730; PC64LE9-NEXT:    lfs 3, .LCPI12_3@toc@l(3)
731; PC64LE9-NEXT:    addis 3, 2, .LCPI12_4@toc@ha
732; PC64LE9-NEXT:    addi 3, 3, .LCPI12_4@toc@l
733; PC64LE9-NEXT:    lxvx 36, 0, 3
734; PC64LE9-NEXT:    xsmulsp 2, 1, 2
735; PC64LE9-NEXT:    xsmulsp 1, 1, 3
736; PC64LE9-NEXT:    xscvdpspn 0, 0
737; PC64LE9-NEXT:    xscvdpspn 1, 1
738; PC64LE9-NEXT:    xxsldwi 34, 1, 1, 3
739; PC64LE9-NEXT:    xscvdpspn 1, 2
740; PC64LE9-NEXT:    xxsldwi 35, 1, 1, 3
741; PC64LE9-NEXT:    vmrghw 2, 3, 2
742; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
743; PC64LE9-NEXT:    vperm 2, 3, 2, 4
744; PC64LE9-NEXT:    blr
745entry:
746  %mul = call <3 x float> @llvm.experimental.constrained.fmul.v3f32(
747           <3 x float> <float 0x7FF0000000000000, float 0x7FF0000000000000,
748                        float 0x7FF0000000000000>,
749           <3 x float> <float 1.000000e+00, float 1.000000e+01, float 1.000000e+02>,
750           metadata !"round.dynamic",
751           metadata !"fpexcept.strict") #1
752  ret <3 x float> %mul
753}
754
755define <3 x double> @constrained_vector_fmul_v3f64() #0 {
756; PC64LE-LABEL: constrained_vector_fmul_v3f64:
757; PC64LE:       # %bb.0: # %entry
758; PC64LE-NEXT:    addis 3, 2, .LCPI13_2@toc@ha
759; PC64LE-NEXT:    addis 4, 2, .LCPI13_3@toc@ha
760; PC64LE-NEXT:    addi 3, 3, .LCPI13_2@toc@l
761; PC64LE-NEXT:    addi 4, 4, .LCPI13_3@toc@l
762; PC64LE-NEXT:    lxvd2x 0, 0, 3
763; PC64LE-NEXT:    lxvd2x 1, 0, 4
764; PC64LE-NEXT:    addis 3, 2, .LCPI13_0@toc@ha
765; PC64LE-NEXT:    addis 4, 2, .LCPI13_1@toc@ha
766; PC64LE-NEXT:    lfd 3, .LCPI13_0@toc@l(3)
767; PC64LE-NEXT:    xxswapd 0, 0
768; PC64LE-NEXT:    xxswapd 1, 1
769; PC64LE-NEXT:    xvmuldp 2, 1, 0
770; PC64LE-NEXT:    lfs 0, .LCPI13_1@toc@l(4)
771; PC64LE-NEXT:    xsmuldp 3, 3, 0
772; PC64LE-NEXT:    xxswapd 1, 2
773; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
774; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
775; PC64LE-NEXT:    blr
776;
777; PC64LE9-LABEL: constrained_vector_fmul_v3f64:
778; PC64LE9:       # %bb.0: # %entry
779; PC64LE9-NEXT:    addis 3, 2, .LCPI13_0@toc@ha
780; PC64LE9-NEXT:    lfd 0, .LCPI13_0@toc@l(3)
781; PC64LE9-NEXT:    addis 3, 2, .LCPI13_1@toc@ha
782; PC64LE9-NEXT:    lfs 1, .LCPI13_1@toc@l(3)
783; PC64LE9-NEXT:    addis 3, 2, .LCPI13_2@toc@ha
784; PC64LE9-NEXT:    addi 3, 3, .LCPI13_2@toc@l
785; PC64LE9-NEXT:    xsmuldp 3, 0, 1
786; PC64LE9-NEXT:    lxvx 0, 0, 3
787; PC64LE9-NEXT:    addis 3, 2, .LCPI13_3@toc@ha
788; PC64LE9-NEXT:    addi 3, 3, .LCPI13_3@toc@l
789; PC64LE9-NEXT:    lxvx 1, 0, 3
790; PC64LE9-NEXT:    xvmuldp 2, 1, 0
791; PC64LE9-NEXT:    xxswapd 1, 2
792; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
793; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
794; PC64LE9-NEXT:    blr
795entry:
796  %mul = call <3 x double> @llvm.experimental.constrained.fmul.v3f64(
797           <3 x double> <double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF,
798                         double 0x7FEFFFFFFFFFFFFF>,
799           <3 x double> <double 1.000000e+00, double 1.000000e+01, double 1.000000e+02>,
800           metadata !"round.dynamic",
801           metadata !"fpexcept.strict") #1
802  ret <3 x double> %mul
803}
804
805define <4 x double> @constrained_vector_fmul_v4f64() #0 {
806; PC64LE-LABEL: constrained_vector_fmul_v4f64:
807; PC64LE:       # %bb.0: # %entry
808; PC64LE-NEXT:    addis 3, 2, .LCPI14_0@toc@ha
809; PC64LE-NEXT:    addis 4, 2, .LCPI14_1@toc@ha
810; PC64LE-NEXT:    addis 5, 2, .LCPI14_2@toc@ha
811; PC64LE-NEXT:    addi 3, 3, .LCPI14_0@toc@l
812; PC64LE-NEXT:    addi 4, 4, .LCPI14_1@toc@l
813; PC64LE-NEXT:    lxvd2x 0, 0, 3
814; PC64LE-NEXT:    addi 3, 5, .LCPI14_2@toc@l
815; PC64LE-NEXT:    lxvd2x 1, 0, 4
816; PC64LE-NEXT:    lxvd2x 2, 0, 3
817; PC64LE-NEXT:    xxswapd 0, 0
818; PC64LE-NEXT:    xxswapd 1, 1
819; PC64LE-NEXT:    xxswapd 2, 2
820; PC64LE-NEXT:    xvmuldp 35, 1, 0
821; PC64LE-NEXT:    xvmuldp 34, 1, 2
822; PC64LE-NEXT:    blr
823;
824; PC64LE9-LABEL: constrained_vector_fmul_v4f64:
825; PC64LE9:       # %bb.0: # %entry
826; PC64LE9-NEXT:    addis 3, 2, .LCPI14_0@toc@ha
827; PC64LE9-NEXT:    addi 3, 3, .LCPI14_0@toc@l
828; PC64LE9-NEXT:    lxvx 0, 0, 3
829; PC64LE9-NEXT:    addis 3, 2, .LCPI14_1@toc@ha
830; PC64LE9-NEXT:    addi 3, 3, .LCPI14_1@toc@l
831; PC64LE9-NEXT:    lxvx 1, 0, 3
832; PC64LE9-NEXT:    addis 3, 2, .LCPI14_2@toc@ha
833; PC64LE9-NEXT:    addi 3, 3, .LCPI14_2@toc@l
834; PC64LE9-NEXT:    xvmuldp 35, 1, 0
835; PC64LE9-NEXT:    lxvx 0, 0, 3
836; PC64LE9-NEXT:    xvmuldp 34, 1, 0
837; PC64LE9-NEXT:    blr
838entry:
839  %mul = call <4 x double> @llvm.experimental.constrained.fmul.v4f64(
840           <4 x double> <double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF,
841                         double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF>,
842           <4 x double> <double 2.000000e+00, double 3.000000e+00,
843                         double 4.000000e+00, double 5.000000e+00>,
844           metadata !"round.dynamic",
845           metadata !"fpexcept.strict") #1
846  ret <4 x double> %mul
847}
848
849define <1 x float> @constrained_vector_fadd_v1f32() #0 {
850; PC64LE-LABEL: constrained_vector_fadd_v1f32:
851; PC64LE:       # %bb.0: # %entry
852; PC64LE-NEXT:    addis 3, 2, .LCPI15_0@toc@ha
853; PC64LE-NEXT:    addis 4, 2, .LCPI15_1@toc@ha
854; PC64LE-NEXT:    lfs 0, .LCPI15_0@toc@l(3)
855; PC64LE-NEXT:    lfs 1, .LCPI15_1@toc@l(4)
856; PC64LE-NEXT:    xsaddsp 1, 1, 0
857; PC64LE-NEXT:    blr
858;
859; PC64LE9-LABEL: constrained_vector_fadd_v1f32:
860; PC64LE9:       # %bb.0: # %entry
861; PC64LE9-NEXT:    addis 3, 2, .LCPI15_0@toc@ha
862; PC64LE9-NEXT:    lfs 0, .LCPI15_0@toc@l(3)
863; PC64LE9-NEXT:    addis 3, 2, .LCPI15_1@toc@ha
864; PC64LE9-NEXT:    lfs 1, .LCPI15_1@toc@l(3)
865; PC64LE9-NEXT:    xsaddsp 1, 1, 0
866; PC64LE9-NEXT:    blr
867entry:
868  %add = call <1 x float> @llvm.experimental.constrained.fadd.v1f32(
869           <1 x float> <float 0x7FF0000000000000>,
870           <1 x float> <float 1.0>,
871           metadata !"round.dynamic",
872           metadata !"fpexcept.strict") #1
873  ret <1 x float> %add
874}
875
876define <2 x double> @constrained_vector_fadd_v2f64() #0 {
877; PC64LE-LABEL: constrained_vector_fadd_v2f64:
878; PC64LE:       # %bb.0: # %entry
879; PC64LE-NEXT:    addis 3, 2, .LCPI16_0@toc@ha
880; PC64LE-NEXT:    addis 4, 2, .LCPI16_1@toc@ha
881; PC64LE-NEXT:    addi 3, 3, .LCPI16_0@toc@l
882; PC64LE-NEXT:    addi 4, 4, .LCPI16_1@toc@l
883; PC64LE-NEXT:    lxvd2x 0, 0, 3
884; PC64LE-NEXT:    lxvd2x 1, 0, 4
885; PC64LE-NEXT:    xxswapd 0, 0
886; PC64LE-NEXT:    xxswapd 1, 1
887; PC64LE-NEXT:    xvadddp 34, 1, 0
888; PC64LE-NEXT:    blr
889;
890; PC64LE9-LABEL: constrained_vector_fadd_v2f64:
891; PC64LE9:       # %bb.0: # %entry
892; PC64LE9-NEXT:    addis 3, 2, .LCPI16_0@toc@ha
893; PC64LE9-NEXT:    addi 3, 3, .LCPI16_0@toc@l
894; PC64LE9-NEXT:    lxvx 0, 0, 3
895; PC64LE9-NEXT:    addis 3, 2, .LCPI16_1@toc@ha
896; PC64LE9-NEXT:    addi 3, 3, .LCPI16_1@toc@l
897; PC64LE9-NEXT:    lxvx 1, 0, 3
898; PC64LE9-NEXT:    xvadddp 34, 1, 0
899; PC64LE9-NEXT:    blr
900entry:
901  %add = call <2 x double> @llvm.experimental.constrained.fadd.v2f64(
902           <2 x double> <double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF>,
903           <2 x double> <double 1.000000e+00, double 1.000000e-01>,
904           metadata !"round.dynamic",
905           metadata !"fpexcept.strict") #1
906  ret <2 x double> %add
907}
908
909define <3 x float> @constrained_vector_fadd_v3f32() #0 {
910; PC64LE-LABEL: constrained_vector_fadd_v3f32:
911; PC64LE:       # %bb.0: # %entry
912; PC64LE-NEXT:    addis 3, 2, .LCPI17_0@toc@ha
913; PC64LE-NEXT:    addis 4, 2, .LCPI17_2@toc@ha
914; PC64LE-NEXT:    addis 5, 2, .LCPI17_1@toc@ha
915; PC64LE-NEXT:    xxlxor 3, 3, 3
916; PC64LE-NEXT:    lfs 0, .LCPI17_0@toc@l(3)
917; PC64LE-NEXT:    lfs 1, .LCPI17_2@toc@l(4)
918; PC64LE-NEXT:    lfs 2, .LCPI17_1@toc@l(5)
919; PC64LE-NEXT:    addis 3, 2, .LCPI17_3@toc@ha
920; PC64LE-NEXT:    addi 3, 3, .LCPI17_3@toc@l
921; PC64LE-NEXT:    xsaddsp 1, 0, 1
922; PC64LE-NEXT:    lvx 4, 0, 3
923; PC64LE-NEXT:    xsaddsp 2, 0, 2
924; PC64LE-NEXT:    xsaddsp 0, 0, 3
925; PC64LE-NEXT:    xscvdpspn 1, 1
926; PC64LE-NEXT:    xscvdpspn 2, 2
927; PC64LE-NEXT:    xscvdpspn 0, 0
928; PC64LE-NEXT:    xxsldwi 34, 1, 1, 3
929; PC64LE-NEXT:    xxsldwi 35, 2, 2, 3
930; PC64LE-NEXT:    vmrghw 2, 3, 2
931; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
932; PC64LE-NEXT:    vperm 2, 3, 2, 4
933; PC64LE-NEXT:    blr
934;
935; PC64LE9-LABEL: constrained_vector_fadd_v3f32:
936; PC64LE9:       # %bb.0: # %entry
937; PC64LE9-NEXT:    addis 3, 2, .LCPI17_0@toc@ha
938; PC64LE9-NEXT:    lfs 0, .LCPI17_0@toc@l(3)
939; PC64LE9-NEXT:    addis 3, 2, .LCPI17_1@toc@ha
940; PC64LE9-NEXT:    lfs 2, .LCPI17_1@toc@l(3)
941; PC64LE9-NEXT:    addis 3, 2, .LCPI17_2@toc@ha
942; PC64LE9-NEXT:    xsaddsp 2, 0, 2
943; PC64LE9-NEXT:    lfs 3, .LCPI17_2@toc@l(3)
944; PC64LE9-NEXT:    xxlxor 1, 1, 1
945; PC64LE9-NEXT:    xsaddsp 1, 0, 1
946; PC64LE9-NEXT:    xsaddsp 0, 0, 3
947; PC64LE9-NEXT:    xscvdpspn 0, 0
948; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
949; PC64LE9-NEXT:    xscvdpspn 0, 2
950; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
951; PC64LE9-NEXT:    xscvdpspn 0, 1
952; PC64LE9-NEXT:    addis 3, 2, .LCPI17_3@toc@ha
953; PC64LE9-NEXT:    addi 3, 3, .LCPI17_3@toc@l
954; PC64LE9-NEXT:    lxvx 36, 0, 3
955; PC64LE9-NEXT:    vmrghw 2, 3, 2
956; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
957; PC64LE9-NEXT:    vperm 2, 3, 2, 4
958; PC64LE9-NEXT:    blr
959entry:
960  %add = call <3 x float> @llvm.experimental.constrained.fadd.v3f32(
961           <3 x float> <float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000,
962                        float 0xFFFFFFFFE0000000>,
963           <3 x float> <float 2.0, float 1.0, float 0.0>,
964           metadata !"round.dynamic",
965           metadata !"fpexcept.strict") #1
966  ret <3 x float> %add
967}
968
969define <3 x double> @constrained_vector_fadd_v3f64() #0 {
970; PC64LE-LABEL: constrained_vector_fadd_v3f64:
971; PC64LE:       # %bb.0: # %entry
972; PC64LE-NEXT:    addis 3, 2, .LCPI18_1@toc@ha
973; PC64LE-NEXT:    addis 4, 2, .LCPI18_2@toc@ha
974; PC64LE-NEXT:    addi 3, 3, .LCPI18_1@toc@l
975; PC64LE-NEXT:    addi 4, 4, .LCPI18_2@toc@l
976; PC64LE-NEXT:    lxvd2x 0, 0, 3
977; PC64LE-NEXT:    lxvd2x 1, 0, 4
978; PC64LE-NEXT:    addis 3, 2, .LCPI18_0@toc@ha
979; PC64LE-NEXT:    lfd 3, .LCPI18_0@toc@l(3)
980; PC64LE-NEXT:    xxswapd 0, 0
981; PC64LE-NEXT:    xxswapd 1, 1
982; PC64LE-NEXT:    xvadddp 2, 1, 0
983; PC64LE-NEXT:    xxlxor 0, 0, 0
984; PC64LE-NEXT:    xsadddp 3, 3, 0
985; PC64LE-NEXT:    xxswapd 1, 2
986; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
987; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
988; PC64LE-NEXT:    blr
989;
990; PC64LE9-LABEL: constrained_vector_fadd_v3f64:
991; PC64LE9:       # %bb.0: # %entry
992; PC64LE9-NEXT:    addis 3, 2, .LCPI18_0@toc@ha
993; PC64LE9-NEXT:    lfd 0, .LCPI18_0@toc@l(3)
994; PC64LE9-NEXT:    addis 3, 2, .LCPI18_1@toc@ha
995; PC64LE9-NEXT:    xxlxor 1, 1, 1
996; PC64LE9-NEXT:    addi 3, 3, .LCPI18_1@toc@l
997; PC64LE9-NEXT:    xsadddp 3, 0, 1
998; PC64LE9-NEXT:    lxvx 0, 0, 3
999; PC64LE9-NEXT:    addis 3, 2, .LCPI18_2@toc@ha
1000; PC64LE9-NEXT:    addi 3, 3, .LCPI18_2@toc@l
1001; PC64LE9-NEXT:    lxvx 1, 0, 3
1002; PC64LE9-NEXT:    xvadddp 2, 1, 0
1003; PC64LE9-NEXT:    xxswapd 1, 2
1004; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1005; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1006; PC64LE9-NEXT:    blr
1007entry:
1008  %add = call <3 x double> @llvm.experimental.constrained.fadd.v3f64(
1009           <3 x double> <double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF,
1010                         double 0x7FEFFFFFFFFFFFFF>,
1011           <3 x double> <double 2.0, double 1.0, double 0.0>,
1012           metadata !"round.dynamic",
1013           metadata !"fpexcept.strict") #1
1014  ret <3 x double> %add
1015}
1016
1017define <4 x double> @constrained_vector_fadd_v4f64() #0 {
1018; PC64LE-LABEL: constrained_vector_fadd_v4f64:
1019; PC64LE:       # %bb.0: # %entry
1020; PC64LE-NEXT:    addis 3, 2, .LCPI19_0@toc@ha
1021; PC64LE-NEXT:    addis 4, 2, .LCPI19_1@toc@ha
1022; PC64LE-NEXT:    addis 5, 2, .LCPI19_2@toc@ha
1023; PC64LE-NEXT:    addi 3, 3, .LCPI19_0@toc@l
1024; PC64LE-NEXT:    addi 4, 4, .LCPI19_1@toc@l
1025; PC64LE-NEXT:    lxvd2x 0, 0, 3
1026; PC64LE-NEXT:    addi 3, 5, .LCPI19_2@toc@l
1027; PC64LE-NEXT:    lxvd2x 1, 0, 4
1028; PC64LE-NEXT:    lxvd2x 2, 0, 3
1029; PC64LE-NEXT:    xxswapd 0, 0
1030; PC64LE-NEXT:    xxswapd 1, 1
1031; PC64LE-NEXT:    xxswapd 2, 2
1032; PC64LE-NEXT:    xvadddp 35, 1, 0
1033; PC64LE-NEXT:    xvadddp 34, 1, 2
1034; PC64LE-NEXT:    blr
1035;
1036; PC64LE9-LABEL: constrained_vector_fadd_v4f64:
1037; PC64LE9:       # %bb.0: # %entry
1038; PC64LE9-NEXT:    addis 3, 2, .LCPI19_0@toc@ha
1039; PC64LE9-NEXT:    addi 3, 3, .LCPI19_0@toc@l
1040; PC64LE9-NEXT:    lxvx 0, 0, 3
1041; PC64LE9-NEXT:    addis 3, 2, .LCPI19_1@toc@ha
1042; PC64LE9-NEXT:    addi 3, 3, .LCPI19_1@toc@l
1043; PC64LE9-NEXT:    lxvx 1, 0, 3
1044; PC64LE9-NEXT:    addis 3, 2, .LCPI19_2@toc@ha
1045; PC64LE9-NEXT:    addi 3, 3, .LCPI19_2@toc@l
1046; PC64LE9-NEXT:    xvadddp 35, 1, 0
1047; PC64LE9-NEXT:    lxvx 0, 0, 3
1048; PC64LE9-NEXT:    xvadddp 34, 1, 0
1049; PC64LE9-NEXT:    blr
1050entry:
1051  %add = call <4 x double> @llvm.experimental.constrained.fadd.v4f64(
1052           <4 x double> <double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF,
1053                         double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF>,
1054           <4 x double> <double 1.000000e+00, double 1.000000e-01,
1055                         double 2.000000e+00, double 2.000000e-01>,
1056           metadata !"round.dynamic",
1057           metadata !"fpexcept.strict") #1
1058  ret <4 x double> %add
1059}
1060
1061define <1 x float> @constrained_vector_fsub_v1f32() #0 {
1062; PC64LE-LABEL: constrained_vector_fsub_v1f32:
1063; PC64LE:       # %bb.0: # %entry
1064; PC64LE-NEXT:    addis 3, 2, .LCPI20_0@toc@ha
1065; PC64LE-NEXT:    addis 4, 2, .LCPI20_1@toc@ha
1066; PC64LE-NEXT:    lfs 0, .LCPI20_0@toc@l(3)
1067; PC64LE-NEXT:    lfs 1, .LCPI20_1@toc@l(4)
1068; PC64LE-NEXT:    xssubsp 1, 1, 0
1069; PC64LE-NEXT:    blr
1070;
1071; PC64LE9-LABEL: constrained_vector_fsub_v1f32:
1072; PC64LE9:       # %bb.0: # %entry
1073; PC64LE9-NEXT:    addis 3, 2, .LCPI20_0@toc@ha
1074; PC64LE9-NEXT:    lfs 0, .LCPI20_0@toc@l(3)
1075; PC64LE9-NEXT:    addis 3, 2, .LCPI20_1@toc@ha
1076; PC64LE9-NEXT:    lfs 1, .LCPI20_1@toc@l(3)
1077; PC64LE9-NEXT:    xssubsp 1, 1, 0
1078; PC64LE9-NEXT:    blr
1079entry:
1080  %sub = call <1 x float> @llvm.experimental.constrained.fsub.v1f32(
1081           <1 x float> <float 0x7FF0000000000000>,
1082           <1 x float> <float 1.000000e+00>,
1083           metadata !"round.dynamic",
1084           metadata !"fpexcept.strict") #1
1085  ret <1 x float> %sub
1086}
1087
1088define <2 x double> @constrained_vector_fsub_v2f64() #0 {
1089; PC64LE-LABEL: constrained_vector_fsub_v2f64:
1090; PC64LE:       # %bb.0: # %entry
1091; PC64LE-NEXT:    addis 3, 2, .LCPI21_0@toc@ha
1092; PC64LE-NEXT:    addis 4, 2, .LCPI21_1@toc@ha
1093; PC64LE-NEXT:    addi 3, 3, .LCPI21_0@toc@l
1094; PC64LE-NEXT:    addi 4, 4, .LCPI21_1@toc@l
1095; PC64LE-NEXT:    lxvd2x 0, 0, 3
1096; PC64LE-NEXT:    lxvd2x 1, 0, 4
1097; PC64LE-NEXT:    xxswapd 0, 0
1098; PC64LE-NEXT:    xxswapd 1, 1
1099; PC64LE-NEXT:    xvsubdp 34, 1, 0
1100; PC64LE-NEXT:    blr
1101;
1102; PC64LE9-LABEL: constrained_vector_fsub_v2f64:
1103; PC64LE9:       # %bb.0: # %entry
1104; PC64LE9-NEXT:    addis 3, 2, .LCPI21_0@toc@ha
1105; PC64LE9-NEXT:    addi 3, 3, .LCPI21_0@toc@l
1106; PC64LE9-NEXT:    lxvx 0, 0, 3
1107; PC64LE9-NEXT:    addis 3, 2, .LCPI21_1@toc@ha
1108; PC64LE9-NEXT:    addi 3, 3, .LCPI21_1@toc@l
1109; PC64LE9-NEXT:    lxvx 1, 0, 3
1110; PC64LE9-NEXT:    xvsubdp 34, 1, 0
1111; PC64LE9-NEXT:    blr
1112entry:
1113  %sub = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(
1114           <2 x double> <double 0xFFEFFFFFFFFFFFFF, double 0xFFEFFFFFFFFFFFFF>,
1115           <2 x double> <double 1.000000e+00, double 1.000000e-01>,
1116           metadata !"round.dynamic",
1117           metadata !"fpexcept.strict") #1
1118  ret <2 x double> %sub
1119}
1120
1121define <3 x float> @constrained_vector_fsub_v3f32() #0 {
1122; PC64LE-LABEL: constrained_vector_fsub_v3f32:
1123; PC64LE:       # %bb.0: # %entry
1124; PC64LE-NEXT:    addis 3, 2, .LCPI22_0@toc@ha
1125; PC64LE-NEXT:    addis 4, 2, .LCPI22_2@toc@ha
1126; PC64LE-NEXT:    addis 5, 2, .LCPI22_1@toc@ha
1127; PC64LE-NEXT:    xxlxor 3, 3, 3
1128; PC64LE-NEXT:    lfs 0, .LCPI22_0@toc@l(3)
1129; PC64LE-NEXT:    lfs 1, .LCPI22_2@toc@l(4)
1130; PC64LE-NEXT:    lfs 2, .LCPI22_1@toc@l(5)
1131; PC64LE-NEXT:    addis 3, 2, .LCPI22_3@toc@ha
1132; PC64LE-NEXT:    addi 3, 3, .LCPI22_3@toc@l
1133; PC64LE-NEXT:    xssubsp 1, 0, 1
1134; PC64LE-NEXT:    lvx 4, 0, 3
1135; PC64LE-NEXT:    xssubsp 2, 0, 2
1136; PC64LE-NEXT:    xssubsp 0, 0, 3
1137; PC64LE-NEXT:    xscvdpspn 1, 1
1138; PC64LE-NEXT:    xscvdpspn 2, 2
1139; PC64LE-NEXT:    xscvdpspn 0, 0
1140; PC64LE-NEXT:    xxsldwi 34, 1, 1, 3
1141; PC64LE-NEXT:    xxsldwi 35, 2, 2, 3
1142; PC64LE-NEXT:    vmrghw 2, 3, 2
1143; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
1144; PC64LE-NEXT:    vperm 2, 3, 2, 4
1145; PC64LE-NEXT:    blr
1146;
1147; PC64LE9-LABEL: constrained_vector_fsub_v3f32:
1148; PC64LE9:       # %bb.0: # %entry
1149; PC64LE9-NEXT:    addis 3, 2, .LCPI22_0@toc@ha
1150; PC64LE9-NEXT:    lfs 0, .LCPI22_0@toc@l(3)
1151; PC64LE9-NEXT:    addis 3, 2, .LCPI22_1@toc@ha
1152; PC64LE9-NEXT:    lfs 2, .LCPI22_1@toc@l(3)
1153; PC64LE9-NEXT:    addis 3, 2, .LCPI22_2@toc@ha
1154; PC64LE9-NEXT:    xssubsp 2, 0, 2
1155; PC64LE9-NEXT:    lfs 3, .LCPI22_2@toc@l(3)
1156; PC64LE9-NEXT:    xxlxor 1, 1, 1
1157; PC64LE9-NEXT:    xssubsp 1, 0, 1
1158; PC64LE9-NEXT:    xssubsp 0, 0, 3
1159; PC64LE9-NEXT:    xscvdpspn 0, 0
1160; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
1161; PC64LE9-NEXT:    xscvdpspn 0, 2
1162; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
1163; PC64LE9-NEXT:    xscvdpspn 0, 1
1164; PC64LE9-NEXT:    addis 3, 2, .LCPI22_3@toc@ha
1165; PC64LE9-NEXT:    addi 3, 3, .LCPI22_3@toc@l
1166; PC64LE9-NEXT:    lxvx 36, 0, 3
1167; PC64LE9-NEXT:    vmrghw 2, 3, 2
1168; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
1169; PC64LE9-NEXT:    vperm 2, 3, 2, 4
1170; PC64LE9-NEXT:    blr
1171entry:
1172  %sub = call <3 x float> @llvm.experimental.constrained.fsub.v3f32(
1173           <3 x float> <float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000,
1174                        float 0xFFFFFFFFE0000000>,
1175           <3 x float> <float 2.0, float 1.0, float 0.0>,
1176           metadata !"round.dynamic",
1177           metadata !"fpexcept.strict") #1
1178  ret <3 x float> %sub
1179}
1180
1181define <3 x double> @constrained_vector_fsub_v3f64() #0 {
1182; PC64LE-LABEL: constrained_vector_fsub_v3f64:
1183; PC64LE:       # %bb.0: # %entry
1184; PC64LE-NEXT:    addis 3, 2, .LCPI23_1@toc@ha
1185; PC64LE-NEXT:    addis 4, 2, .LCPI23_2@toc@ha
1186; PC64LE-NEXT:    addi 3, 3, .LCPI23_1@toc@l
1187; PC64LE-NEXT:    addi 4, 4, .LCPI23_2@toc@l
1188; PC64LE-NEXT:    lxvd2x 0, 0, 3
1189; PC64LE-NEXT:    lxvd2x 1, 0, 4
1190; PC64LE-NEXT:    addis 3, 2, .LCPI23_0@toc@ha
1191; PC64LE-NEXT:    lfd 3, .LCPI23_0@toc@l(3)
1192; PC64LE-NEXT:    xxswapd 0, 0
1193; PC64LE-NEXT:    xxswapd 1, 1
1194; PC64LE-NEXT:    xvsubdp 2, 1, 0
1195; PC64LE-NEXT:    xxlxor 0, 0, 0
1196; PC64LE-NEXT:    xssubdp 3, 3, 0
1197; PC64LE-NEXT:    xxswapd 1, 2
1198; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1199; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1200; PC64LE-NEXT:    blr
1201;
1202; PC64LE9-LABEL: constrained_vector_fsub_v3f64:
1203; PC64LE9:       # %bb.0: # %entry
1204; PC64LE9-NEXT:    addis 3, 2, .LCPI23_0@toc@ha
1205; PC64LE9-NEXT:    lfd 0, .LCPI23_0@toc@l(3)
1206; PC64LE9-NEXT:    addis 3, 2, .LCPI23_1@toc@ha
1207; PC64LE9-NEXT:    xxlxor 1, 1, 1
1208; PC64LE9-NEXT:    addi 3, 3, .LCPI23_1@toc@l
1209; PC64LE9-NEXT:    xssubdp 3, 0, 1
1210; PC64LE9-NEXT:    lxvx 0, 0, 3
1211; PC64LE9-NEXT:    addis 3, 2, .LCPI23_2@toc@ha
1212; PC64LE9-NEXT:    addi 3, 3, .LCPI23_2@toc@l
1213; PC64LE9-NEXT:    lxvx 1, 0, 3
1214; PC64LE9-NEXT:    xvsubdp 2, 1, 0
1215; PC64LE9-NEXT:    xxswapd 1, 2
1216; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1217; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1218; PC64LE9-NEXT:    blr
1219entry:
1220  %sub = call <3 x double> @llvm.experimental.constrained.fsub.v3f64(
1221           <3 x double> <double 0xFFEFFFFFFFFFFFFF, double 0xFFEFFFFFFFFFFFFF,
1222                         double 0xFFEFFFFFFFFFFFFF>,
1223           <3 x double> <double 2.0, double 1.0, double 0.0>,
1224           metadata !"round.dynamic",
1225           metadata !"fpexcept.strict") #1
1226  ret <3 x double> %sub
1227}
1228
1229define <4 x double> @constrained_vector_fsub_v4f64() #0 {
1230; PC64LE-LABEL: constrained_vector_fsub_v4f64:
1231; PC64LE:       # %bb.0: # %entry
1232; PC64LE-NEXT:    addis 3, 2, .LCPI24_0@toc@ha
1233; PC64LE-NEXT:    addis 4, 2, .LCPI24_1@toc@ha
1234; PC64LE-NEXT:    addis 5, 2, .LCPI24_2@toc@ha
1235; PC64LE-NEXT:    addi 3, 3, .LCPI24_0@toc@l
1236; PC64LE-NEXT:    addi 4, 4, .LCPI24_1@toc@l
1237; PC64LE-NEXT:    lxvd2x 0, 0, 3
1238; PC64LE-NEXT:    addi 3, 5, .LCPI24_2@toc@l
1239; PC64LE-NEXT:    lxvd2x 1, 0, 4
1240; PC64LE-NEXT:    lxvd2x 2, 0, 3
1241; PC64LE-NEXT:    xxswapd 0, 0
1242; PC64LE-NEXT:    xxswapd 1, 1
1243; PC64LE-NEXT:    xxswapd 2, 2
1244; PC64LE-NEXT:    xvsubdp 35, 1, 0
1245; PC64LE-NEXT:    xvsubdp 34, 1, 2
1246; PC64LE-NEXT:    blr
1247;
1248; PC64LE9-LABEL: constrained_vector_fsub_v4f64:
1249; PC64LE9:       # %bb.0: # %entry
1250; PC64LE9-NEXT:    addis 3, 2, .LCPI24_0@toc@ha
1251; PC64LE9-NEXT:    addi 3, 3, .LCPI24_0@toc@l
1252; PC64LE9-NEXT:    lxvx 0, 0, 3
1253; PC64LE9-NEXT:    addis 3, 2, .LCPI24_1@toc@ha
1254; PC64LE9-NEXT:    addi 3, 3, .LCPI24_1@toc@l
1255; PC64LE9-NEXT:    lxvx 1, 0, 3
1256; PC64LE9-NEXT:    addis 3, 2, .LCPI24_2@toc@ha
1257; PC64LE9-NEXT:    addi 3, 3, .LCPI24_2@toc@l
1258; PC64LE9-NEXT:    xvsubdp 35, 1, 0
1259; PC64LE9-NEXT:    lxvx 0, 0, 3
1260; PC64LE9-NEXT:    xvsubdp 34, 1, 0
1261; PC64LE9-NEXT:    blr
1262entry:
1263  %sub = call <4 x double> @llvm.experimental.constrained.fsub.v4f64(
1264           <4 x double> <double 0xFFEFFFFFFFFFFFFF, double 0xFFEFFFFFFFFFFFFF,
1265                         double 0xFFEFFFFFFFFFFFFF, double 0xFFEFFFFFFFFFFFFF>,
1266           <4 x double> <double 1.000000e+00, double 1.000000e-01,
1267                         double 2.000000e+00, double 2.000000e-01>,
1268           metadata !"round.dynamic",
1269           metadata !"fpexcept.strict") #1
1270  ret <4 x double> %sub
1271}
1272
1273define <1 x float> @constrained_vector_sqrt_v1f32() #0 {
1274; PC64LE-LABEL: constrained_vector_sqrt_v1f32:
1275; PC64LE:       # %bb.0: # %entry
1276; PC64LE-NEXT:    addis 3, 2, .LCPI25_0@toc@ha
1277; PC64LE-NEXT:    lfs 0, .LCPI25_0@toc@l(3)
1278; PC64LE-NEXT:    xssqrtsp 1, 0
1279; PC64LE-NEXT:    blr
1280;
1281; PC64LE9-LABEL: constrained_vector_sqrt_v1f32:
1282; PC64LE9:       # %bb.0: # %entry
1283; PC64LE9-NEXT:    addis 3, 2, .LCPI25_0@toc@ha
1284; PC64LE9-NEXT:    lfs 0, .LCPI25_0@toc@l(3)
1285; PC64LE9-NEXT:    xssqrtsp 1, 0
1286; PC64LE9-NEXT:    blr
1287entry:
1288  %sqrt = call <1 x float> @llvm.experimental.constrained.sqrt.v1f32(
1289                              <1 x float> <float 42.0>,
1290                              metadata !"round.dynamic",
1291                              metadata !"fpexcept.strict") #1
1292  ret <1 x float> %sqrt
1293}
1294
1295define <2 x double> @constrained_vector_sqrt_v2f64() #0 {
1296; PC64LE-LABEL: constrained_vector_sqrt_v2f64:
1297; PC64LE:       # %bb.0: # %entry
1298; PC64LE-NEXT:    addis 3, 2, .LCPI26_0@toc@ha
1299; PC64LE-NEXT:    addi 3, 3, .LCPI26_0@toc@l
1300; PC64LE-NEXT:    lxvd2x 0, 0, 3
1301; PC64LE-NEXT:    xxswapd 0, 0
1302; PC64LE-NEXT:    xvsqrtdp 34, 0
1303; PC64LE-NEXT:    blr
1304;
1305; PC64LE9-LABEL: constrained_vector_sqrt_v2f64:
1306; PC64LE9:       # %bb.0: # %entry
1307; PC64LE9-NEXT:    addis 3, 2, .LCPI26_0@toc@ha
1308; PC64LE9-NEXT:    addi 3, 3, .LCPI26_0@toc@l
1309; PC64LE9-NEXT:    lxvx 0, 0, 3
1310; PC64LE9-NEXT:    xvsqrtdp 34, 0
1311; PC64LE9-NEXT:    blr
1312entry:
1313  %sqrt = call <2 x double> @llvm.experimental.constrained.sqrt.v2f64(
1314                              <2 x double> <double 42.0, double 42.1>,
1315                              metadata !"round.dynamic",
1316                              metadata !"fpexcept.strict") #1
1317  ret <2 x double> %sqrt
1318}
1319
1320define <3 x float> @constrained_vector_sqrt_v3f32() #0 {
1321; PC64LE-LABEL: constrained_vector_sqrt_v3f32:
1322; PC64LE:       # %bb.0: # %entry
1323; PC64LE-NEXT:    addis 3, 2, .LCPI27_2@toc@ha
1324; PC64LE-NEXT:    addis 4, 2, .LCPI27_1@toc@ha
1325; PC64LE-NEXT:    lfs 0, .LCPI27_2@toc@l(3)
1326; PC64LE-NEXT:    lfs 1, .LCPI27_1@toc@l(4)
1327; PC64LE-NEXT:    addis 3, 2, .LCPI27_0@toc@ha
1328; PC64LE-NEXT:    xssqrtsp 0, 0
1329; PC64LE-NEXT:    lfs 2, .LCPI27_0@toc@l(3)
1330; PC64LE-NEXT:    addis 3, 2, .LCPI27_3@toc@ha
1331; PC64LE-NEXT:    xssqrtsp 1, 1
1332; PC64LE-NEXT:    addi 3, 3, .LCPI27_3@toc@l
1333; PC64LE-NEXT:    xssqrtsp 2, 2
1334; PC64LE-NEXT:    xscvdpspn 0, 0
1335; PC64LE-NEXT:    xscvdpspn 1, 1
1336; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
1337; PC64LE-NEXT:    xscvdpspn 0, 2
1338; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
1339; PC64LE-NEXT:    vmrghw 2, 3, 2
1340; PC64LE-NEXT:    lvx 3, 0, 3
1341; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
1342; PC64LE-NEXT:    vperm 2, 4, 2, 3
1343; PC64LE-NEXT:    blr
1344;
1345; PC64LE9-LABEL: constrained_vector_sqrt_v3f32:
1346; PC64LE9:       # %bb.0: # %entry
1347; PC64LE9-NEXT:    addis 3, 2, .LCPI27_0@toc@ha
1348; PC64LE9-NEXT:    lfs 0, .LCPI27_0@toc@l(3)
1349; PC64LE9-NEXT:    addis 3, 2, .LCPI27_1@toc@ha
1350; PC64LE9-NEXT:    lfs 1, .LCPI27_1@toc@l(3)
1351; PC64LE9-NEXT:    addis 3, 2, .LCPI27_2@toc@ha
1352; PC64LE9-NEXT:    xssqrtsp 0, 0
1353; PC64LE9-NEXT:    lfs 2, .LCPI27_2@toc@l(3)
1354; PC64LE9-NEXT:    addis 3, 2, .LCPI27_3@toc@ha
1355; PC64LE9-NEXT:    addi 3, 3, .LCPI27_3@toc@l
1356; PC64LE9-NEXT:    xssqrtsp 1, 1
1357; PC64LE9-NEXT:    xssqrtsp 2, 2
1358; PC64LE9-NEXT:    xscvdpspn 0, 0
1359; PC64LE9-NEXT:    xscvdpspn 1, 1
1360; PC64LE9-NEXT:    xscvdpspn 2, 2
1361; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
1362; PC64LE9-NEXT:    xxsldwi 35, 1, 1, 3
1363; PC64LE9-NEXT:    xxsldwi 34, 2, 2, 3
1364; PC64LE9-NEXT:    vmrghw 2, 3, 2
1365; PC64LE9-NEXT:    lxvx 35, 0, 3
1366; PC64LE9-NEXT:    vperm 2, 4, 2, 3
1367; PC64LE9-NEXT:    blr
1368entry:
1369  %sqrt = call <3 x float> @llvm.experimental.constrained.sqrt.v3f32(
1370                              <3 x float> <float 42.0, float 43.0, float 44.0>,
1371                              metadata !"round.dynamic",
1372                              metadata !"fpexcept.strict") #1
1373  ret <3 x float> %sqrt
1374}
1375
1376define <3 x double> @constrained_vector_sqrt_v3f64() #0 {
1377; PC64LE-LABEL: constrained_vector_sqrt_v3f64:
1378; PC64LE:       # %bb.0: # %entry
1379; PC64LE-NEXT:    addis 3, 2, .LCPI28_1@toc@ha
1380; PC64LE-NEXT:    addi 3, 3, .LCPI28_1@toc@l
1381; PC64LE-NEXT:    lxvd2x 0, 0, 3
1382; PC64LE-NEXT:    addis 3, 2, .LCPI28_0@toc@ha
1383; PC64LE-NEXT:    lfd 1, .LCPI28_0@toc@l(3)
1384; PC64LE-NEXT:    xxswapd 0, 0
1385; PC64LE-NEXT:    xssqrtdp 3, 1
1386; PC64LE-NEXT:    xvsqrtdp 2, 0
1387; PC64LE-NEXT:    xxswapd 1, 2
1388; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1389; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1390; PC64LE-NEXT:    blr
1391;
1392; PC64LE9-LABEL: constrained_vector_sqrt_v3f64:
1393; PC64LE9:       # %bb.0: # %entry
1394; PC64LE9-NEXT:    addis 3, 2, .LCPI28_0@toc@ha
1395; PC64LE9-NEXT:    lfd 0, .LCPI28_0@toc@l(3)
1396; PC64LE9-NEXT:    addis 3, 2, .LCPI28_1@toc@ha
1397; PC64LE9-NEXT:    addi 3, 3, .LCPI28_1@toc@l
1398; PC64LE9-NEXT:    xssqrtdp 3, 0
1399; PC64LE9-NEXT:    lxvx 0, 0, 3
1400; PC64LE9-NEXT:    xvsqrtdp 2, 0
1401; PC64LE9-NEXT:    xxswapd 1, 2
1402; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1403; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1404; PC64LE9-NEXT:    blr
1405entry:
1406  %sqrt = call <3 x double> @llvm.experimental.constrained.sqrt.v3f64(
1407                          <3 x double> <double 42.0, double 42.1, double 42.2>,
1408                          metadata !"round.dynamic",
1409                          metadata !"fpexcept.strict") #1
1410  ret <3 x double> %sqrt
1411}
1412
1413define <4 x double> @constrained_vector_sqrt_v4f64() #0 {
1414; PC64LE-LABEL: constrained_vector_sqrt_v4f64:
1415; PC64LE:       # %bb.0: # %entry
1416; PC64LE-NEXT:    addis 3, 2, .LCPI29_0@toc@ha
1417; PC64LE-NEXT:    addis 4, 2, .LCPI29_1@toc@ha
1418; PC64LE-NEXT:    addi 3, 3, .LCPI29_0@toc@l
1419; PC64LE-NEXT:    addi 4, 4, .LCPI29_1@toc@l
1420; PC64LE-NEXT:    lxvd2x 0, 0, 3
1421; PC64LE-NEXT:    lxvd2x 1, 0, 4
1422; PC64LE-NEXT:    xxswapd 0, 0
1423; PC64LE-NEXT:    xxswapd 1, 1
1424; PC64LE-NEXT:    xvsqrtdp 35, 0
1425; PC64LE-NEXT:    xvsqrtdp 34, 1
1426; PC64LE-NEXT:    blr
1427;
1428; PC64LE9-LABEL: constrained_vector_sqrt_v4f64:
1429; PC64LE9:       # %bb.0: # %entry
1430; PC64LE9-NEXT:    addis 3, 2, .LCPI29_0@toc@ha
1431; PC64LE9-NEXT:    addi 3, 3, .LCPI29_0@toc@l
1432; PC64LE9-NEXT:    lxvx 0, 0, 3
1433; PC64LE9-NEXT:    addis 3, 2, .LCPI29_1@toc@ha
1434; PC64LE9-NEXT:    addi 3, 3, .LCPI29_1@toc@l
1435; PC64LE9-NEXT:    xvsqrtdp 35, 0
1436; PC64LE9-NEXT:    lxvx 0, 0, 3
1437; PC64LE9-NEXT:    xvsqrtdp 34, 0
1438; PC64LE9-NEXT:    blr
1439 entry:
1440  %sqrt = call <4 x double> @llvm.experimental.constrained.sqrt.v4f64(
1441                              <4 x double> <double 42.0, double 42.1,
1442                                            double 42.2, double 42.3>,
1443                              metadata !"round.dynamic",
1444                              metadata !"fpexcept.strict") #1
1445  ret <4 x double> %sqrt
1446}
1447
1448define <1 x float> @constrained_vector_pow_v1f32() #0 {
1449; PC64LE-LABEL: constrained_vector_pow_v1f32:
1450; PC64LE:       # %bb.0: # %entry
1451; PC64LE-NEXT:    mflr 0
1452; PC64LE-NEXT:    std 0, 16(1)
1453; PC64LE-NEXT:    stdu 1, -32(1)
1454; PC64LE-NEXT:    addis 3, 2, .LCPI30_0@toc@ha
1455; PC64LE-NEXT:    addis 4, 2, .LCPI30_1@toc@ha
1456; PC64LE-NEXT:    lfs 1, .LCPI30_0@toc@l(3)
1457; PC64LE-NEXT:    lfs 2, .LCPI30_1@toc@l(4)
1458; PC64LE-NEXT:    bl powf
1459; PC64LE-NEXT:    nop
1460; PC64LE-NEXT:    addi 1, 1, 32
1461; PC64LE-NEXT:    ld 0, 16(1)
1462; PC64LE-NEXT:    mtlr 0
1463; PC64LE-NEXT:    blr
1464;
1465; PC64LE9-LABEL: constrained_vector_pow_v1f32:
1466; PC64LE9:       # %bb.0: # %entry
1467; PC64LE9-NEXT:    mflr 0
1468; PC64LE9-NEXT:    std 0, 16(1)
1469; PC64LE9-NEXT:    stdu 1, -32(1)
1470; PC64LE9-NEXT:    addis 3, 2, .LCPI30_0@toc@ha
1471; PC64LE9-NEXT:    lfs 1, .LCPI30_0@toc@l(3)
1472; PC64LE9-NEXT:    addis 3, 2, .LCPI30_1@toc@ha
1473; PC64LE9-NEXT:    lfs 2, .LCPI30_1@toc@l(3)
1474; PC64LE9-NEXT:    bl powf
1475; PC64LE9-NEXT:    nop
1476; PC64LE9-NEXT:    addi 1, 1, 32
1477; PC64LE9-NEXT:    ld 0, 16(1)
1478; PC64LE9-NEXT:    mtlr 0
1479; PC64LE9-NEXT:    blr
1480entry:
1481  %pow = call <1 x float> @llvm.experimental.constrained.pow.v1f32(
1482                             <1 x float> <float 42.0>,
1483                             <1 x float> <float 3.0>,
1484                             metadata !"round.dynamic",
1485                             metadata !"fpexcept.strict") #1
1486  ret <1 x float> %pow
1487}
1488
1489define <2 x double> @constrained_vector_pow_v2f64() #0 {
1490; PC64LE-LABEL: constrained_vector_pow_v2f64:
1491; PC64LE:       # %bb.0: # %entry
1492; PC64LE-NEXT:    mflr 0
1493; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1494; PC64LE-NEXT:    std 0, 16(1)
1495; PC64LE-NEXT:    stdu 1, -80(1)
1496; PC64LE-NEXT:    addis 4, 2, .LCPI31_1@toc@ha
1497; PC64LE-NEXT:    addis 3, 2, .LCPI31_0@toc@ha
1498; PC64LE-NEXT:    lfs 31, .LCPI31_1@toc@l(4)
1499; PC64LE-NEXT:    lfd 1, .LCPI31_0@toc@l(3)
1500; PC64LE-NEXT:    fmr 2, 31
1501; PC64LE-NEXT:    bl pow
1502; PC64LE-NEXT:    nop
1503; PC64LE-NEXT:    li 3, 48
1504; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1505; PC64LE-NEXT:    fmr 2, 31
1506; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
1507; PC64LE-NEXT:    addis 3, 2, .LCPI31_2@toc@ha
1508; PC64LE-NEXT:    lfd 1, .LCPI31_2@toc@l(3)
1509; PC64LE-NEXT:    bl pow
1510; PC64LE-NEXT:    nop
1511; PC64LE-NEXT:    li 3, 48
1512; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1513; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
1514; PC64LE-NEXT:    xxmrghd 34, 1, 0
1515; PC64LE-NEXT:    addi 1, 1, 80
1516; PC64LE-NEXT:    ld 0, 16(1)
1517; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1518; PC64LE-NEXT:    mtlr 0
1519; PC64LE-NEXT:    blr
1520;
1521; PC64LE9-LABEL: constrained_vector_pow_v2f64:
1522; PC64LE9:       # %bb.0: # %entry
1523; PC64LE9-NEXT:    mflr 0
1524; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1525; PC64LE9-NEXT:    std 0, 16(1)
1526; PC64LE9-NEXT:    stdu 1, -64(1)
1527; PC64LE9-NEXT:    addis 3, 2, .LCPI31_0@toc@ha
1528; PC64LE9-NEXT:    lfd 1, .LCPI31_0@toc@l(3)
1529; PC64LE9-NEXT:    addis 3, 2, .LCPI31_1@toc@ha
1530; PC64LE9-NEXT:    lfs 31, .LCPI31_1@toc@l(3)
1531; PC64LE9-NEXT:    fmr 2, 31
1532; PC64LE9-NEXT:    bl pow
1533; PC64LE9-NEXT:    nop
1534; PC64LE9-NEXT:    addis 3, 2, .LCPI31_2@toc@ha
1535; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1536; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
1537; PC64LE9-NEXT:    lfd 1, .LCPI31_2@toc@l(3)
1538; PC64LE9-NEXT:    fmr 2, 31
1539; PC64LE9-NEXT:    bl pow
1540; PC64LE9-NEXT:    nop
1541; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
1542; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1543; PC64LE9-NEXT:    xxmrghd 34, 1, 0
1544; PC64LE9-NEXT:    addi 1, 1, 64
1545; PC64LE9-NEXT:    ld 0, 16(1)
1546; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1547; PC64LE9-NEXT:    mtlr 0
1548; PC64LE9-NEXT:    blr
1549entry:
1550  %pow = call <2 x double> @llvm.experimental.constrained.pow.v2f64(
1551                             <2 x double> <double 42.1, double 42.2>,
1552                             <2 x double> <double 3.0, double 3.0>,
1553                             metadata !"round.dynamic",
1554                             metadata !"fpexcept.strict") #1
1555  ret <2 x double> %pow
1556}
1557
1558define <3 x float> @constrained_vector_pow_v3f32() #0 {
1559; PC64LE-LABEL: constrained_vector_pow_v3f32:
1560; PC64LE:       # %bb.0: # %entry
1561; PC64LE-NEXT:    mflr 0
1562; PC64LE-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
1563; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1564; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1565; PC64LE-NEXT:    std 0, 16(1)
1566; PC64LE-NEXT:    stdu 1, -64(1)
1567; PC64LE-NEXT:    addis 4, 2, .LCPI32_1@toc@ha
1568; PC64LE-NEXT:    addis 3, 2, .LCPI32_0@toc@ha
1569; PC64LE-NEXT:    lfs 31, .LCPI32_1@toc@l(4)
1570; PC64LE-NEXT:    lfs 1, .LCPI32_0@toc@l(3)
1571; PC64LE-NEXT:    fmr 2, 31
1572; PC64LE-NEXT:    bl powf
1573; PC64LE-NEXT:    nop
1574; PC64LE-NEXT:    addis 3, 2, .LCPI32_2@toc@ha
1575; PC64LE-NEXT:    fmr 2, 31
1576; PC64LE-NEXT:    fmr 30, 1
1577; PC64LE-NEXT:    lfs 1, .LCPI32_2@toc@l(3)
1578; PC64LE-NEXT:    bl powf
1579; PC64LE-NEXT:    nop
1580; PC64LE-NEXT:    addis 3, 2, .LCPI32_3@toc@ha
1581; PC64LE-NEXT:    fmr 2, 31
1582; PC64LE-NEXT:    fmr 29, 1
1583; PC64LE-NEXT:    lfs 1, .LCPI32_3@toc@l(3)
1584; PC64LE-NEXT:    bl powf
1585; PC64LE-NEXT:    nop
1586; PC64LE-NEXT:    xscvdpspn 0, 29
1587; PC64LE-NEXT:    addis 3, 2, .LCPI32_4@toc@ha
1588; PC64LE-NEXT:    xscvdpspn 1, 1
1589; PC64LE-NEXT:    addi 3, 3, .LCPI32_4@toc@l
1590; PC64LE-NEXT:    lvx 4, 0, 3
1591; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
1592; PC64LE-NEXT:    xscvdpspn 0, 30
1593; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
1594; PC64LE-NEXT:    vmrghw 2, 2, 3
1595; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
1596; PC64LE-NEXT:    vperm 2, 3, 2, 4
1597; PC64LE-NEXT:    addi 1, 1, 64
1598; PC64LE-NEXT:    ld 0, 16(1)
1599; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1600; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
1601; PC64LE-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
1602; PC64LE-NEXT:    mtlr 0
1603; PC64LE-NEXT:    blr
1604;
1605; PC64LE9-LABEL: constrained_vector_pow_v3f32:
1606; PC64LE9:       # %bb.0: # %entry
1607; PC64LE9-NEXT:    mflr 0
1608; PC64LE9-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
1609; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1610; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1611; PC64LE9-NEXT:    std 0, 16(1)
1612; PC64LE9-NEXT:    stdu 1, -64(1)
1613; PC64LE9-NEXT:    addis 3, 2, .LCPI32_0@toc@ha
1614; PC64LE9-NEXT:    lfs 1, .LCPI32_0@toc@l(3)
1615; PC64LE9-NEXT:    addis 3, 2, .LCPI32_1@toc@ha
1616; PC64LE9-NEXT:    lfs 31, .LCPI32_1@toc@l(3)
1617; PC64LE9-NEXT:    fmr 2, 31
1618; PC64LE9-NEXT:    bl powf
1619; PC64LE9-NEXT:    nop
1620; PC64LE9-NEXT:    addis 3, 2, .LCPI32_2@toc@ha
1621; PC64LE9-NEXT:    fmr 30, 1
1622; PC64LE9-NEXT:    lfs 1, .LCPI32_2@toc@l(3)
1623; PC64LE9-NEXT:    fmr 2, 31
1624; PC64LE9-NEXT:    bl powf
1625; PC64LE9-NEXT:    nop
1626; PC64LE9-NEXT:    addis 3, 2, .LCPI32_3@toc@ha
1627; PC64LE9-NEXT:    fmr 29, 1
1628; PC64LE9-NEXT:    lfs 1, .LCPI32_3@toc@l(3)
1629; PC64LE9-NEXT:    fmr 2, 31
1630; PC64LE9-NEXT:    bl powf
1631; PC64LE9-NEXT:    nop
1632; PC64LE9-NEXT:    xscvdpspn 0, 1
1633; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
1634; PC64LE9-NEXT:    xscvdpspn 0, 29
1635; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
1636; PC64LE9-NEXT:    xscvdpspn 0, 30
1637; PC64LE9-NEXT:    addis 3, 2, .LCPI32_4@toc@ha
1638; PC64LE9-NEXT:    addi 3, 3, .LCPI32_4@toc@l
1639; PC64LE9-NEXT:    lxvx 36, 0, 3
1640; PC64LE9-NEXT:    vmrghw 2, 3, 2
1641; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
1642; PC64LE9-NEXT:    vperm 2, 3, 2, 4
1643; PC64LE9-NEXT:    addi 1, 1, 64
1644; PC64LE9-NEXT:    ld 0, 16(1)
1645; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
1646; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
1647; PC64LE9-NEXT:    mtlr 0
1648; PC64LE9-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
1649; PC64LE9-NEXT:    blr
1650entry:
1651  %pow = call <3 x float> @llvm.experimental.constrained.pow.v3f32(
1652                             <3 x float> <float 42.0, float 43.0, float 44.0>,
1653                             <3 x float> <float 3.0, float 3.0, float 3.0>,
1654                             metadata !"round.dynamic",
1655                             metadata !"fpexcept.strict") #1
1656  ret <3 x float> %pow
1657}
1658
1659define <3 x double> @constrained_vector_pow_v3f64() #0 {
1660; PC64LE-LABEL: constrained_vector_pow_v3f64:
1661; PC64LE:       # %bb.0: # %entry
1662; PC64LE-NEXT:    mflr 0
1663; PC64LE-NEXT:    std 0, 16(1)
1664; PC64LE-NEXT:    stdu 1, -96(1)
1665; PC64LE-NEXT:    addis 4, 2, .LCPI33_1@toc@ha
1666; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
1667; PC64LE-NEXT:    li 3, 64
1668; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1669; PC64LE-NEXT:    addis 3, 2, .LCPI33_0@toc@ha
1670; PC64LE-NEXT:    lfs 31, .LCPI33_1@toc@l(4)
1671; PC64LE-NEXT:    lfs 1, .LCPI33_0@toc@l(3)
1672; PC64LE-NEXT:    fmr 2, 31
1673; PC64LE-NEXT:    bl pow
1674; PC64LE-NEXT:    nop
1675; PC64LE-NEXT:    li 3, 48
1676; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1677; PC64LE-NEXT:    fmr 2, 31
1678; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
1679; PC64LE-NEXT:    addis 3, 2, .LCPI33_2@toc@ha
1680; PC64LE-NEXT:    lfd 1, .LCPI33_2@toc@l(3)
1681; PC64LE-NEXT:    bl pow
1682; PC64LE-NEXT:    nop
1683; PC64LE-NEXT:    li 3, 48
1684; PC64LE-NEXT:    fmr 2, 31
1685; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1686; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
1687; PC64LE-NEXT:    addis 3, 2, .LCPI33_3@toc@ha
1688; PC64LE-NEXT:    xxmrghd 63, 1, 0
1689; PC64LE-NEXT:    lfd 1, .LCPI33_3@toc@l(3)
1690; PC64LE-NEXT:    bl pow
1691; PC64LE-NEXT:    nop
1692; PC64LE-NEXT:    xxswapd 0, 63
1693; PC64LE-NEXT:    li 3, 64
1694; PC64LE-NEXT:    xxlor 2, 63, 63
1695; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
1696; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1697; PC64LE-NEXT:    fmr 3, 1
1698; PC64LE-NEXT:    fmr 1, 0
1699; PC64LE-NEXT:    addi 1, 1, 96
1700; PC64LE-NEXT:    ld 0, 16(1)
1701; PC64LE-NEXT:    mtlr 0
1702; PC64LE-NEXT:    blr
1703;
1704; PC64LE9-LABEL: constrained_vector_pow_v3f64:
1705; PC64LE9:       # %bb.0: # %entry
1706; PC64LE9-NEXT:    mflr 0
1707; PC64LE9-NEXT:    std 0, 16(1)
1708; PC64LE9-NEXT:    stdu 1, -80(1)
1709; PC64LE9-NEXT:    addis 3, 2, .LCPI33_0@toc@ha
1710; PC64LE9-NEXT:    lfs 1, .LCPI33_0@toc@l(3)
1711; PC64LE9-NEXT:    addis 3, 2, .LCPI33_1@toc@ha
1712; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
1713; PC64LE9-NEXT:    lfs 31, .LCPI33_1@toc@l(3)
1714; PC64LE9-NEXT:    fmr 2, 31
1715; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
1716; PC64LE9-NEXT:    bl pow
1717; PC64LE9-NEXT:    nop
1718; PC64LE9-NEXT:    addis 3, 2, .LCPI33_2@toc@ha
1719; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1720; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
1721; PC64LE9-NEXT:    lfd 1, .LCPI33_2@toc@l(3)
1722; PC64LE9-NEXT:    fmr 2, 31
1723; PC64LE9-NEXT:    bl pow
1724; PC64LE9-NEXT:    nop
1725; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
1726; PC64LE9-NEXT:    addis 3, 2, .LCPI33_3@toc@ha
1727; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1728; PC64LE9-NEXT:    xxmrghd 63, 1, 0
1729; PC64LE9-NEXT:    lfd 1, .LCPI33_3@toc@l(3)
1730; PC64LE9-NEXT:    fmr 2, 31
1731; PC64LE9-NEXT:    bl pow
1732; PC64LE9-NEXT:    nop
1733; PC64LE9-NEXT:    fmr 3, 1
1734; PC64LE9-NEXT:    xxswapd 1, 63
1735; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
1736; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
1737; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
1738; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1739; PC64LE9-NEXT:    addi 1, 1, 80
1740; PC64LE9-NEXT:    ld 0, 16(1)
1741; PC64LE9-NEXT:    mtlr 0
1742; PC64LE9-NEXT:    blr
1743entry:
1744  %pow = call <3 x double> @llvm.experimental.constrained.pow.v3f64(
1745                          <3 x double> <double 42.0, double 42.1, double 42.2>,
1746                          <3 x double> <double 3.0, double 3.0, double 3.0>,
1747                          metadata !"round.dynamic",
1748                          metadata !"fpexcept.strict") #1
1749  ret <3 x double> %pow
1750}
1751
1752define <4 x double> @constrained_vector_pow_v4f64() #0 {
1753; PC64LE-LABEL: constrained_vector_pow_v4f64:
1754; PC64LE:       # %bb.0: # %entry
1755; PC64LE-NEXT:    mflr 0
1756; PC64LE-NEXT:    std 0, 16(1)
1757; PC64LE-NEXT:    stdu 1, -96(1)
1758; PC64LE-NEXT:    addis 4, 2, .LCPI34_1@toc@ha
1759; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
1760; PC64LE-NEXT:    li 3, 64
1761; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1762; PC64LE-NEXT:    addis 3, 2, .LCPI34_0@toc@ha
1763; PC64LE-NEXT:    lfs 31, .LCPI34_1@toc@l(4)
1764; PC64LE-NEXT:    lfd 1, .LCPI34_0@toc@l(3)
1765; PC64LE-NEXT:    fmr 2, 31
1766; PC64LE-NEXT:    bl pow
1767; PC64LE-NEXT:    nop
1768; PC64LE-NEXT:    li 3, 48
1769; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1770; PC64LE-NEXT:    fmr 2, 31
1771; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
1772; PC64LE-NEXT:    addis 3, 2, .LCPI34_2@toc@ha
1773; PC64LE-NEXT:    lfd 1, .LCPI34_2@toc@l(3)
1774; PC64LE-NEXT:    bl pow
1775; PC64LE-NEXT:    nop
1776; PC64LE-NEXT:    li 3, 48
1777; PC64LE-NEXT:    fmr 2, 31
1778; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1779; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
1780; PC64LE-NEXT:    addis 3, 2, .LCPI34_3@toc@ha
1781; PC64LE-NEXT:    xxmrghd 63, 1, 0
1782; PC64LE-NEXT:    lfd 1, .LCPI34_3@toc@l(3)
1783; PC64LE-NEXT:    bl pow
1784; PC64LE-NEXT:    nop
1785; PC64LE-NEXT:    li 3, 48
1786; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1787; PC64LE-NEXT:    fmr 2, 31
1788; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
1789; PC64LE-NEXT:    addis 3, 2, .LCPI34_4@toc@ha
1790; PC64LE-NEXT:    lfd 1, .LCPI34_4@toc@l(3)
1791; PC64LE-NEXT:    bl pow
1792; PC64LE-NEXT:    nop
1793; PC64LE-NEXT:    li 3, 48
1794; PC64LE-NEXT:    vmr 2, 31
1795; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
1796; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1797; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
1798; PC64LE-NEXT:    li 3, 64
1799; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1800; PC64LE-NEXT:    xxmrghd 35, 1, 0
1801; PC64LE-NEXT:    addi 1, 1, 96
1802; PC64LE-NEXT:    ld 0, 16(1)
1803; PC64LE-NEXT:    mtlr 0
1804; PC64LE-NEXT:    blr
1805;
1806; PC64LE9-LABEL: constrained_vector_pow_v4f64:
1807; PC64LE9:       # %bb.0: # %entry
1808; PC64LE9-NEXT:    mflr 0
1809; PC64LE9-NEXT:    std 0, 16(1)
1810; PC64LE9-NEXT:    stdu 1, -80(1)
1811; PC64LE9-NEXT:    addis 3, 2, .LCPI34_0@toc@ha
1812; PC64LE9-NEXT:    lfd 1, .LCPI34_0@toc@l(3)
1813; PC64LE9-NEXT:    addis 3, 2, .LCPI34_1@toc@ha
1814; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
1815; PC64LE9-NEXT:    lfs 31, .LCPI34_1@toc@l(3)
1816; PC64LE9-NEXT:    fmr 2, 31
1817; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
1818; PC64LE9-NEXT:    bl pow
1819; PC64LE9-NEXT:    nop
1820; PC64LE9-NEXT:    addis 3, 2, .LCPI34_2@toc@ha
1821; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1822; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
1823; PC64LE9-NEXT:    lfd 1, .LCPI34_2@toc@l(3)
1824; PC64LE9-NEXT:    fmr 2, 31
1825; PC64LE9-NEXT:    bl pow
1826; PC64LE9-NEXT:    nop
1827; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
1828; PC64LE9-NEXT:    addis 3, 2, .LCPI34_3@toc@ha
1829; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1830; PC64LE9-NEXT:    xxmrghd 63, 1, 0
1831; PC64LE9-NEXT:    lfd 1, .LCPI34_3@toc@l(3)
1832; PC64LE9-NEXT:    fmr 2, 31
1833; PC64LE9-NEXT:    bl pow
1834; PC64LE9-NEXT:    nop
1835; PC64LE9-NEXT:    addis 3, 2, .LCPI34_4@toc@ha
1836; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1837; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
1838; PC64LE9-NEXT:    lfd 1, .LCPI34_4@toc@l(3)
1839; PC64LE9-NEXT:    fmr 2, 31
1840; PC64LE9-NEXT:    bl pow
1841; PC64LE9-NEXT:    nop
1842; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
1843; PC64LE9-NEXT:    vmr 2, 31
1844; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
1845; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
1846; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1847; PC64LE9-NEXT:    xxmrghd 35, 1, 0
1848; PC64LE9-NEXT:    addi 1, 1, 80
1849; PC64LE9-NEXT:    ld 0, 16(1)
1850; PC64LE9-NEXT:    mtlr 0
1851; PC64LE9-NEXT:    blr
1852entry:
1853  %pow = call <4 x double> @llvm.experimental.constrained.pow.v4f64(
1854                             <4 x double> <double 42.1, double 42.2,
1855                                           double 42.3, double 42.4>,
1856                             <4 x double> <double 3.0, double 3.0,
1857                                           double 3.0, double 3.0>,
1858                             metadata !"round.dynamic",
1859                             metadata !"fpexcept.strict") #1
1860  ret <4 x double> %pow
1861}
1862
1863define <1 x float> @constrained_vector_powi_v1f32() #0 {
1864; PC64LE-LABEL: constrained_vector_powi_v1f32:
1865; PC64LE:       # %bb.0: # %entry
1866; PC64LE-NEXT:    mflr 0
1867; PC64LE-NEXT:    std 0, 16(1)
1868; PC64LE-NEXT:    stdu 1, -32(1)
1869; PC64LE-NEXT:    addis 3, 2, .LCPI35_0@toc@ha
1870; PC64LE-NEXT:    li 4, 3
1871; PC64LE-NEXT:    lfs 1, .LCPI35_0@toc@l(3)
1872; PC64LE-NEXT:    bl __powisf2
1873; PC64LE-NEXT:    nop
1874; PC64LE-NEXT:    addi 1, 1, 32
1875; PC64LE-NEXT:    ld 0, 16(1)
1876; PC64LE-NEXT:    mtlr 0
1877; PC64LE-NEXT:    blr
1878;
1879; PC64LE9-LABEL: constrained_vector_powi_v1f32:
1880; PC64LE9:       # %bb.0: # %entry
1881; PC64LE9-NEXT:    mflr 0
1882; PC64LE9-NEXT:    std 0, 16(1)
1883; PC64LE9-NEXT:    stdu 1, -32(1)
1884; PC64LE9-NEXT:    addis 3, 2, .LCPI35_0@toc@ha
1885; PC64LE9-NEXT:    lfs 1, .LCPI35_0@toc@l(3)
1886; PC64LE9-NEXT:    li 4, 3
1887; PC64LE9-NEXT:    bl __powisf2
1888; PC64LE9-NEXT:    nop
1889; PC64LE9-NEXT:    addi 1, 1, 32
1890; PC64LE9-NEXT:    ld 0, 16(1)
1891; PC64LE9-NEXT:    mtlr 0
1892; PC64LE9-NEXT:    blr
1893entry:
1894  %powi = call <1 x float> @llvm.experimental.constrained.powi.v1f32(
1895                              <1 x float> <float 42.0>,
1896                              i32 3,
1897                              metadata !"round.dynamic",
1898                              metadata !"fpexcept.strict") #1
1899  ret <1 x float> %powi
1900}
1901
1902define <2 x double> @constrained_vector_powi_v2f64() #0 {
1903; PC64LE-LABEL: constrained_vector_powi_v2f64:
1904; PC64LE:       # %bb.0: # %entry
1905; PC64LE-NEXT:    mflr 0
1906; PC64LE-NEXT:    std 0, 16(1)
1907; PC64LE-NEXT:    stdu 1, -64(1)
1908; PC64LE-NEXT:    addis 3, 2, .LCPI36_0@toc@ha
1909; PC64LE-NEXT:    li 4, 3
1910; PC64LE-NEXT:    lfd 1, .LCPI36_0@toc@l(3)
1911; PC64LE-NEXT:    bl __powidf2
1912; PC64LE-NEXT:    nop
1913; PC64LE-NEXT:    li 3, 48
1914; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1915; PC64LE-NEXT:    li 4, 3
1916; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
1917; PC64LE-NEXT:    addis 3, 2, .LCPI36_1@toc@ha
1918; PC64LE-NEXT:    lfd 1, .LCPI36_1@toc@l(3)
1919; PC64LE-NEXT:    bl __powidf2
1920; PC64LE-NEXT:    nop
1921; PC64LE-NEXT:    li 3, 48
1922; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1923; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
1924; PC64LE-NEXT:    xxmrghd 34, 1, 0
1925; PC64LE-NEXT:    addi 1, 1, 64
1926; PC64LE-NEXT:    ld 0, 16(1)
1927; PC64LE-NEXT:    mtlr 0
1928; PC64LE-NEXT:    blr
1929;
1930; PC64LE9-LABEL: constrained_vector_powi_v2f64:
1931; PC64LE9:       # %bb.0: # %entry
1932; PC64LE9-NEXT:    mflr 0
1933; PC64LE9-NEXT:    std 0, 16(1)
1934; PC64LE9-NEXT:    stdu 1, -48(1)
1935; PC64LE9-NEXT:    addis 3, 2, .LCPI36_0@toc@ha
1936; PC64LE9-NEXT:    lfd 1, .LCPI36_0@toc@l(3)
1937; PC64LE9-NEXT:    li 4, 3
1938; PC64LE9-NEXT:    bl __powidf2
1939; PC64LE9-NEXT:    nop
1940; PC64LE9-NEXT:    addis 3, 2, .LCPI36_1@toc@ha
1941; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1942; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
1943; PC64LE9-NEXT:    lfd 1, .LCPI36_1@toc@l(3)
1944; PC64LE9-NEXT:    li 4, 3
1945; PC64LE9-NEXT:    bl __powidf2
1946; PC64LE9-NEXT:    nop
1947; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
1948; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1949; PC64LE9-NEXT:    xxmrghd 34, 1, 0
1950; PC64LE9-NEXT:    addi 1, 1, 48
1951; PC64LE9-NEXT:    ld 0, 16(1)
1952; PC64LE9-NEXT:    mtlr 0
1953; PC64LE9-NEXT:    blr
1954entry:
1955  %powi = call <2 x double> @llvm.experimental.constrained.powi.v2f64(
1956                              <2 x double> <double 42.1, double 42.2>,
1957                              i32 3,
1958                              metadata !"round.dynamic",
1959                              metadata !"fpexcept.strict") #1
1960  ret <2 x double> %powi
1961}
1962
1963define <3 x float> @constrained_vector_powi_v3f32() #0 {
1964;
1965;
1966; PC64LE-LABEL: constrained_vector_powi_v3f32:
1967; PC64LE:       # %bb.0: # %entry
1968; PC64LE-NEXT:    mflr 0
1969; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
1970; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
1971; PC64LE-NEXT:    std 0, 16(1)
1972; PC64LE-NEXT:    stdu 1, -48(1)
1973; PC64LE-NEXT:    addis 3, 2, .LCPI37_0@toc@ha
1974; PC64LE-NEXT:    li 4, 3
1975; PC64LE-NEXT:    lfs 1, .LCPI37_0@toc@l(3)
1976; PC64LE-NEXT:    bl __powisf2
1977; PC64LE-NEXT:    nop
1978; PC64LE-NEXT:    addis 3, 2, .LCPI37_1@toc@ha
1979; PC64LE-NEXT:    fmr 31, 1
1980; PC64LE-NEXT:    li 4, 3
1981; PC64LE-NEXT:    lfs 1, .LCPI37_1@toc@l(3)
1982; PC64LE-NEXT:    bl __powisf2
1983; PC64LE-NEXT:    nop
1984; PC64LE-NEXT:    addis 3, 2, .LCPI37_2@toc@ha
1985; PC64LE-NEXT:    fmr 30, 1
1986; PC64LE-NEXT:    li 4, 3
1987; PC64LE-NEXT:    lfs 1, .LCPI37_2@toc@l(3)
1988; PC64LE-NEXT:    bl __powisf2
1989; PC64LE-NEXT:    nop
1990; PC64LE-NEXT:    xscvdpspn 0, 30
1991; PC64LE-NEXT:    addis 3, 2, .LCPI37_3@toc@ha
1992; PC64LE-NEXT:    xscvdpspn 1, 1
1993; PC64LE-NEXT:    addi 3, 3, .LCPI37_3@toc@l
1994; PC64LE-NEXT:    lvx 4, 0, 3
1995; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
1996; PC64LE-NEXT:    xscvdpspn 0, 31
1997; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
1998; PC64LE-NEXT:    vmrghw 2, 2, 3
1999; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
2000; PC64LE-NEXT:    vperm 2, 3, 2, 4
2001; PC64LE-NEXT:    addi 1, 1, 48
2002; PC64LE-NEXT:    ld 0, 16(1)
2003; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
2004; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
2005; PC64LE-NEXT:    mtlr 0
2006; PC64LE-NEXT:    blr
2007;
2008; PC64LE9-LABEL: constrained_vector_powi_v3f32:
2009; PC64LE9:       # %bb.0: # %entry
2010; PC64LE9-NEXT:    mflr 0
2011; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
2012; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
2013; PC64LE9-NEXT:    std 0, 16(1)
2014; PC64LE9-NEXT:    stdu 1, -48(1)
2015; PC64LE9-NEXT:    addis 3, 2, .LCPI37_0@toc@ha
2016; PC64LE9-NEXT:    lfs 1, .LCPI37_0@toc@l(3)
2017; PC64LE9-NEXT:    li 4, 3
2018; PC64LE9-NEXT:    bl __powisf2
2019; PC64LE9-NEXT:    nop
2020; PC64LE9-NEXT:    addis 3, 2, .LCPI37_1@toc@ha
2021; PC64LE9-NEXT:    fmr 31, 1
2022; PC64LE9-NEXT:    lfs 1, .LCPI37_1@toc@l(3)
2023; PC64LE9-NEXT:    li 4, 3
2024; PC64LE9-NEXT:    bl __powisf2
2025; PC64LE9-NEXT:    nop
2026; PC64LE9-NEXT:    addis 3, 2, .LCPI37_2@toc@ha
2027; PC64LE9-NEXT:    fmr 30, 1
2028; PC64LE9-NEXT:    lfs 1, .LCPI37_2@toc@l(3)
2029; PC64LE9-NEXT:    li 4, 3
2030; PC64LE9-NEXT:    bl __powisf2
2031; PC64LE9-NEXT:    nop
2032; PC64LE9-NEXT:    xscvdpspn 0, 1
2033; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
2034; PC64LE9-NEXT:    xscvdpspn 0, 30
2035; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
2036; PC64LE9-NEXT:    xscvdpspn 0, 31
2037; PC64LE9-NEXT:    addis 3, 2, .LCPI37_3@toc@ha
2038; PC64LE9-NEXT:    addi 3, 3, .LCPI37_3@toc@l
2039; PC64LE9-NEXT:    lxvx 36, 0, 3
2040; PC64LE9-NEXT:    vmrghw 2, 3, 2
2041; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
2042; PC64LE9-NEXT:    vperm 2, 3, 2, 4
2043; PC64LE9-NEXT:    addi 1, 1, 48
2044; PC64LE9-NEXT:    ld 0, 16(1)
2045; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
2046; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
2047; PC64LE9-NEXT:    mtlr 0
2048; PC64LE9-NEXT:    blr
2049entry:
2050  %powi = call <3 x float> @llvm.experimental.constrained.powi.v3f32(
2051                              <3 x float> <float 42.0, float 43.0, float 44.0>,
2052                              i32 3,
2053                              metadata !"round.dynamic",
2054                              metadata !"fpexcept.strict") #1
2055  ret <3 x float> %powi
2056}
2057
2058define <3 x double> @constrained_vector_powi_v3f64() #0 {
2059; PC64LE-LABEL: constrained_vector_powi_v3f64:
2060; PC64LE:       # %bb.0: # %entry
2061; PC64LE-NEXT:    mflr 0
2062; PC64LE-NEXT:    std 0, 16(1)
2063; PC64LE-NEXT:    stdu 1, -80(1)
2064; PC64LE-NEXT:    li 3, 64
2065; PC64LE-NEXT:    li 4, 3
2066; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2067; PC64LE-NEXT:    addis 3, 2, .LCPI38_0@toc@ha
2068; PC64LE-NEXT:    lfd 1, .LCPI38_0@toc@l(3)
2069; PC64LE-NEXT:    bl __powidf2
2070; PC64LE-NEXT:    nop
2071; PC64LE-NEXT:    li 3, 48
2072; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2073; PC64LE-NEXT:    li 4, 3
2074; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2075; PC64LE-NEXT:    addis 3, 2, .LCPI38_1@toc@ha
2076; PC64LE-NEXT:    lfs 1, .LCPI38_1@toc@l(3)
2077; PC64LE-NEXT:    bl __powidf2
2078; PC64LE-NEXT:    nop
2079; PC64LE-NEXT:    li 3, 48
2080; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2081; PC64LE-NEXT:    li 4, 3
2082; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2083; PC64LE-NEXT:    addis 3, 2, .LCPI38_2@toc@ha
2084; PC64LE-NEXT:    xxmrghd 63, 0, 1
2085; PC64LE-NEXT:    lfd 1, .LCPI38_2@toc@l(3)
2086; PC64LE-NEXT:    bl __powidf2
2087; PC64LE-NEXT:    nop
2088; PC64LE-NEXT:    xxswapd 0, 63
2089; PC64LE-NEXT:    li 3, 64
2090; PC64LE-NEXT:    xxlor 2, 63, 63
2091; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2092; PC64LE-NEXT:    fmr 3, 1
2093; PC64LE-NEXT:    fmr 1, 0
2094; PC64LE-NEXT:    addi 1, 1, 80
2095; PC64LE-NEXT:    ld 0, 16(1)
2096; PC64LE-NEXT:    mtlr 0
2097; PC64LE-NEXT:    blr
2098;
2099; PC64LE9-LABEL: constrained_vector_powi_v3f64:
2100; PC64LE9:       # %bb.0: # %entry
2101; PC64LE9-NEXT:    mflr 0
2102; PC64LE9-NEXT:    std 0, 16(1)
2103; PC64LE9-NEXT:    stdu 1, -64(1)
2104; PC64LE9-NEXT:    addis 3, 2, .LCPI38_0@toc@ha
2105; PC64LE9-NEXT:    lfd 1, .LCPI38_0@toc@l(3)
2106; PC64LE9-NEXT:    li 4, 3
2107; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2108; PC64LE9-NEXT:    bl __powidf2
2109; PC64LE9-NEXT:    nop
2110; PC64LE9-NEXT:    addis 3, 2, .LCPI38_1@toc@ha
2111; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2112; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2113; PC64LE9-NEXT:    lfs 1, .LCPI38_1@toc@l(3)
2114; PC64LE9-NEXT:    li 4, 3
2115; PC64LE9-NEXT:    bl __powidf2
2116; PC64LE9-NEXT:    nop
2117; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2118; PC64LE9-NEXT:    addis 3, 2, .LCPI38_2@toc@ha
2119; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2120; PC64LE9-NEXT:    xxmrghd 63, 0, 1
2121; PC64LE9-NEXT:    lfd 1, .LCPI38_2@toc@l(3)
2122; PC64LE9-NEXT:    li 4, 3
2123; PC64LE9-NEXT:    bl __powidf2
2124; PC64LE9-NEXT:    nop
2125; PC64LE9-NEXT:    fmr 3, 1
2126; PC64LE9-NEXT:    xxswapd 1, 63
2127; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
2128; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2129; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2130; PC64LE9-NEXT:    addi 1, 1, 64
2131; PC64LE9-NEXT:    ld 0, 16(1)
2132; PC64LE9-NEXT:    mtlr 0
2133; PC64LE9-NEXT:    blr
2134entry:
2135  %powi = call <3 x double> @llvm.experimental.constrained.powi.v3f64(
2136                          <3 x double> <double 42.0, double 42.1, double 42.2>,
2137                          i32 3,
2138                          metadata !"round.dynamic",
2139                          metadata !"fpexcept.strict") #1
2140  ret <3 x double> %powi
2141}
2142
2143define <4 x double> @constrained_vector_powi_v4f64() #0 {
2144; PC64LE-LABEL: constrained_vector_powi_v4f64:
2145; PC64LE:       # %bb.0: # %entry
2146; PC64LE-NEXT:    mflr 0
2147; PC64LE-NEXT:    std 0, 16(1)
2148; PC64LE-NEXT:    stdu 1, -80(1)
2149; PC64LE-NEXT:    li 3, 64
2150; PC64LE-NEXT:    li 4, 3
2151; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2152; PC64LE-NEXT:    addis 3, 2, .LCPI39_0@toc@ha
2153; PC64LE-NEXT:    lfd 1, .LCPI39_0@toc@l(3)
2154; PC64LE-NEXT:    bl __powidf2
2155; PC64LE-NEXT:    nop
2156; PC64LE-NEXT:    li 3, 48
2157; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2158; PC64LE-NEXT:    li 4, 3
2159; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2160; PC64LE-NEXT:    addis 3, 2, .LCPI39_1@toc@ha
2161; PC64LE-NEXT:    lfd 1, .LCPI39_1@toc@l(3)
2162; PC64LE-NEXT:    bl __powidf2
2163; PC64LE-NEXT:    nop
2164; PC64LE-NEXT:    li 3, 48
2165; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2166; PC64LE-NEXT:    li 4, 3
2167; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2168; PC64LE-NEXT:    addis 3, 2, .LCPI39_2@toc@ha
2169; PC64LE-NEXT:    xxmrghd 63, 1, 0
2170; PC64LE-NEXT:    lfd 1, .LCPI39_2@toc@l(3)
2171; PC64LE-NEXT:    bl __powidf2
2172; PC64LE-NEXT:    nop
2173; PC64LE-NEXT:    li 3, 48
2174; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2175; PC64LE-NEXT:    li 4, 3
2176; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2177; PC64LE-NEXT:    addis 3, 2, .LCPI39_3@toc@ha
2178; PC64LE-NEXT:    lfd 1, .LCPI39_3@toc@l(3)
2179; PC64LE-NEXT:    bl __powidf2
2180; PC64LE-NEXT:    nop
2181; PC64LE-NEXT:    li 3, 48
2182; PC64LE-NEXT:    vmr 2, 31
2183; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2184; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2185; PC64LE-NEXT:    li 3, 64
2186; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2187; PC64LE-NEXT:    xxmrghd 35, 1, 0
2188; PC64LE-NEXT:    addi 1, 1, 80
2189; PC64LE-NEXT:    ld 0, 16(1)
2190; PC64LE-NEXT:    mtlr 0
2191; PC64LE-NEXT:    blr
2192;
2193; PC64LE9-LABEL: constrained_vector_powi_v4f64:
2194; PC64LE9:       # %bb.0: # %entry
2195; PC64LE9-NEXT:    mflr 0
2196; PC64LE9-NEXT:    std 0, 16(1)
2197; PC64LE9-NEXT:    stdu 1, -64(1)
2198; PC64LE9-NEXT:    addis 3, 2, .LCPI39_0@toc@ha
2199; PC64LE9-NEXT:    lfd 1, .LCPI39_0@toc@l(3)
2200; PC64LE9-NEXT:    li 4, 3
2201; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2202; PC64LE9-NEXT:    bl __powidf2
2203; PC64LE9-NEXT:    nop
2204; PC64LE9-NEXT:    addis 3, 2, .LCPI39_1@toc@ha
2205; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2206; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2207; PC64LE9-NEXT:    lfd 1, .LCPI39_1@toc@l(3)
2208; PC64LE9-NEXT:    li 4, 3
2209; PC64LE9-NEXT:    bl __powidf2
2210; PC64LE9-NEXT:    nop
2211; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2212; PC64LE9-NEXT:    addis 3, 2, .LCPI39_2@toc@ha
2213; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2214; PC64LE9-NEXT:    xxmrghd 63, 1, 0
2215; PC64LE9-NEXT:    lfd 1, .LCPI39_2@toc@l(3)
2216; PC64LE9-NEXT:    li 4, 3
2217; PC64LE9-NEXT:    bl __powidf2
2218; PC64LE9-NEXT:    nop
2219; PC64LE9-NEXT:    addis 3, 2, .LCPI39_3@toc@ha
2220; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2221; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2222; PC64LE9-NEXT:    lfd 1, .LCPI39_3@toc@l(3)
2223; PC64LE9-NEXT:    li 4, 3
2224; PC64LE9-NEXT:    bl __powidf2
2225; PC64LE9-NEXT:    nop
2226; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2227; PC64LE9-NEXT:    vmr 2, 31
2228; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2229; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2230; PC64LE9-NEXT:    xxmrghd 35, 1, 0
2231; PC64LE9-NEXT:    addi 1, 1, 64
2232; PC64LE9-NEXT:    ld 0, 16(1)
2233; PC64LE9-NEXT:    mtlr 0
2234; PC64LE9-NEXT:    blr
2235entry:
2236  %powi = call <4 x double> @llvm.experimental.constrained.powi.v4f64(
2237                              <4 x double> <double 42.1, double 42.2,
2238                                            double 42.3, double 42.4>,
2239                              i32 3,
2240                              metadata !"round.dynamic",
2241                              metadata !"fpexcept.strict") #1
2242  ret <4 x double> %powi
2243}
2244
2245define <1 x float> @constrained_vector_sin_v1f32() #0 {
2246; PC64LE-LABEL: constrained_vector_sin_v1f32:
2247; PC64LE:       # %bb.0: # %entry
2248; PC64LE-NEXT:    mflr 0
2249; PC64LE-NEXT:    std 0, 16(1)
2250; PC64LE-NEXT:    stdu 1, -32(1)
2251; PC64LE-NEXT:    addis 3, 2, .LCPI40_0@toc@ha
2252; PC64LE-NEXT:    lfs 1, .LCPI40_0@toc@l(3)
2253; PC64LE-NEXT:    bl sinf
2254; PC64LE-NEXT:    nop
2255; PC64LE-NEXT:    addi 1, 1, 32
2256; PC64LE-NEXT:    ld 0, 16(1)
2257; PC64LE-NEXT:    mtlr 0
2258; PC64LE-NEXT:    blr
2259;
2260; PC64LE9-LABEL: constrained_vector_sin_v1f32:
2261; PC64LE9:       # %bb.0: # %entry
2262; PC64LE9-NEXT:    mflr 0
2263; PC64LE9-NEXT:    std 0, 16(1)
2264; PC64LE9-NEXT:    stdu 1, -32(1)
2265; PC64LE9-NEXT:    addis 3, 2, .LCPI40_0@toc@ha
2266; PC64LE9-NEXT:    lfs 1, .LCPI40_0@toc@l(3)
2267; PC64LE9-NEXT:    bl sinf
2268; PC64LE9-NEXT:    nop
2269; PC64LE9-NEXT:    addi 1, 1, 32
2270; PC64LE9-NEXT:    ld 0, 16(1)
2271; PC64LE9-NEXT:    mtlr 0
2272; PC64LE9-NEXT:    blr
2273entry:
2274  %sin = call <1 x float> @llvm.experimental.constrained.sin.v1f32(
2275                             <1 x float> <float 42.0>,
2276                             metadata !"round.dynamic",
2277                             metadata !"fpexcept.strict") #1
2278  ret <1 x float> %sin
2279}
2280
2281define <2 x double> @constrained_vector_sin_v2f64() #0 {
2282; PC64LE-LABEL: constrained_vector_sin_v2f64:
2283; PC64LE:       # %bb.0: # %entry
2284; PC64LE-NEXT:    mflr 0
2285; PC64LE-NEXT:    std 0, 16(1)
2286; PC64LE-NEXT:    stdu 1, -64(1)
2287; PC64LE-NEXT:    addis 3, 2, .LCPI41_0@toc@ha
2288; PC64LE-NEXT:    lfd 1, .LCPI41_0@toc@l(3)
2289; PC64LE-NEXT:    bl sin
2290; PC64LE-NEXT:    nop
2291; PC64LE-NEXT:    li 3, 48
2292; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2293; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2294; PC64LE-NEXT:    addis 3, 2, .LCPI41_1@toc@ha
2295; PC64LE-NEXT:    lfs 1, .LCPI41_1@toc@l(3)
2296; PC64LE-NEXT:    bl sin
2297; PC64LE-NEXT:    nop
2298; PC64LE-NEXT:    li 3, 48
2299; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2300; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2301; PC64LE-NEXT:    xxmrghd 34, 0, 1
2302; PC64LE-NEXT:    addi 1, 1, 64
2303; PC64LE-NEXT:    ld 0, 16(1)
2304; PC64LE-NEXT:    mtlr 0
2305; PC64LE-NEXT:    blr
2306;
2307; PC64LE9-LABEL: constrained_vector_sin_v2f64:
2308; PC64LE9:       # %bb.0: # %entry
2309; PC64LE9-NEXT:    mflr 0
2310; PC64LE9-NEXT:    std 0, 16(1)
2311; PC64LE9-NEXT:    stdu 1, -48(1)
2312; PC64LE9-NEXT:    addis 3, 2, .LCPI41_0@toc@ha
2313; PC64LE9-NEXT:    lfd 1, .LCPI41_0@toc@l(3)
2314; PC64LE9-NEXT:    bl sin
2315; PC64LE9-NEXT:    nop
2316; PC64LE9-NEXT:    addis 3, 2, .LCPI41_1@toc@ha
2317; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2318; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2319; PC64LE9-NEXT:    lfs 1, .LCPI41_1@toc@l(3)
2320; PC64LE9-NEXT:    bl sin
2321; PC64LE9-NEXT:    nop
2322; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2323; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2324; PC64LE9-NEXT:    xxmrghd 34, 0, 1
2325; PC64LE9-NEXT:    addi 1, 1, 48
2326; PC64LE9-NEXT:    ld 0, 16(1)
2327; PC64LE9-NEXT:    mtlr 0
2328; PC64LE9-NEXT:    blr
2329entry:
2330  %sin = call <2 x double> @llvm.experimental.constrained.sin.v2f64(
2331                             <2 x double> <double 42.0, double 42.1>,
2332                             metadata !"round.dynamic",
2333                             metadata !"fpexcept.strict") #1
2334  ret <2 x double> %sin
2335}
2336
2337define <3 x float> @constrained_vector_sin_v3f32() #0 {
2338; PC64LE-LABEL: constrained_vector_sin_v3f32:
2339; PC64LE:       # %bb.0: # %entry
2340; PC64LE-NEXT:    mflr 0
2341; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
2342; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
2343; PC64LE-NEXT:    std 0, 16(1)
2344; PC64LE-NEXT:    stdu 1, -48(1)
2345; PC64LE-NEXT:    addis 3, 2, .LCPI42_0@toc@ha
2346; PC64LE-NEXT:    lfs 1, .LCPI42_0@toc@l(3)
2347; PC64LE-NEXT:    bl sinf
2348; PC64LE-NEXT:    nop
2349; PC64LE-NEXT:    addis 3, 2, .LCPI42_1@toc@ha
2350; PC64LE-NEXT:    fmr 31, 1
2351; PC64LE-NEXT:    lfs 1, .LCPI42_1@toc@l(3)
2352; PC64LE-NEXT:    bl sinf
2353; PC64LE-NEXT:    nop
2354; PC64LE-NEXT:    addis 3, 2, .LCPI42_2@toc@ha
2355; PC64LE-NEXT:    fmr 30, 1
2356; PC64LE-NEXT:    lfs 1, .LCPI42_2@toc@l(3)
2357; PC64LE-NEXT:    bl sinf
2358; PC64LE-NEXT:    nop
2359; PC64LE-NEXT:    xscvdpspn 0, 30
2360; PC64LE-NEXT:    addis 3, 2, .LCPI42_3@toc@ha
2361; PC64LE-NEXT:    xscvdpspn 1, 1
2362; PC64LE-NEXT:    addi 3, 3, .LCPI42_3@toc@l
2363; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
2364; PC64LE-NEXT:    xscvdpspn 0, 31
2365; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
2366; PC64LE-NEXT:    vmrghw 2, 2, 3
2367; PC64LE-NEXT:    lvx 3, 0, 3
2368; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
2369; PC64LE-NEXT:    vperm 2, 4, 2, 3
2370; PC64LE-NEXT:    addi 1, 1, 48
2371; PC64LE-NEXT:    ld 0, 16(1)
2372; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
2373; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
2374; PC64LE-NEXT:    mtlr 0
2375; PC64LE-NEXT:    blr
2376;
2377; PC64LE9-LABEL: constrained_vector_sin_v3f32:
2378; PC64LE9:       # %bb.0: # %entry
2379; PC64LE9-NEXT:    mflr 0
2380; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
2381; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
2382; PC64LE9-NEXT:    std 0, 16(1)
2383; PC64LE9-NEXT:    stdu 1, -48(1)
2384; PC64LE9-NEXT:    addis 3, 2, .LCPI42_0@toc@ha
2385; PC64LE9-NEXT:    lfs 1, .LCPI42_0@toc@l(3)
2386; PC64LE9-NEXT:    bl sinf
2387; PC64LE9-NEXT:    nop
2388; PC64LE9-NEXT:    addis 3, 2, .LCPI42_1@toc@ha
2389; PC64LE9-NEXT:    fmr 31, 1
2390; PC64LE9-NEXT:    lfs 1, .LCPI42_1@toc@l(3)
2391; PC64LE9-NEXT:    bl sinf
2392; PC64LE9-NEXT:    nop
2393; PC64LE9-NEXT:    addis 3, 2, .LCPI42_2@toc@ha
2394; PC64LE9-NEXT:    fmr 30, 1
2395; PC64LE9-NEXT:    lfs 1, .LCPI42_2@toc@l(3)
2396; PC64LE9-NEXT:    bl sinf
2397; PC64LE9-NEXT:    nop
2398; PC64LE9-NEXT:    xscvdpspn 0, 1
2399; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
2400; PC64LE9-NEXT:    xscvdpspn 0, 30
2401; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
2402; PC64LE9-NEXT:    xscvdpspn 0, 31
2403; PC64LE9-NEXT:    addis 3, 2, .LCPI42_3@toc@ha
2404; PC64LE9-NEXT:    addi 3, 3, .LCPI42_3@toc@l
2405; PC64LE9-NEXT:    vmrghw 2, 3, 2
2406; PC64LE9-NEXT:    lxvx 35, 0, 3
2407; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
2408; PC64LE9-NEXT:    vperm 2, 4, 2, 3
2409; PC64LE9-NEXT:    addi 1, 1, 48
2410; PC64LE9-NEXT:    ld 0, 16(1)
2411; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
2412; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
2413; PC64LE9-NEXT:    mtlr 0
2414; PC64LE9-NEXT:    blr
2415entry:
2416  %sin = call <3 x float> @llvm.experimental.constrained.sin.v3f32(
2417                              <3 x float> <float 42.0, float 43.0, float 44.0>,
2418                              metadata !"round.dynamic",
2419                              metadata !"fpexcept.strict") #1
2420  ret <3 x float> %sin
2421}
2422
2423define <3 x double> @constrained_vector_sin_v3f64() #0 {
2424; PC64LE-LABEL: constrained_vector_sin_v3f64:
2425; PC64LE:       # %bb.0: # %entry
2426; PC64LE-NEXT:    mflr 0
2427; PC64LE-NEXT:    std 0, 16(1)
2428; PC64LE-NEXT:    stdu 1, -80(1)
2429; PC64LE-NEXT:    li 3, 64
2430; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2431; PC64LE-NEXT:    addis 3, 2, .LCPI43_0@toc@ha
2432; PC64LE-NEXT:    lfd 1, .LCPI43_0@toc@l(3)
2433; PC64LE-NEXT:    bl sin
2434; PC64LE-NEXT:    nop
2435; PC64LE-NEXT:    li 3, 48
2436; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2437; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2438; PC64LE-NEXT:    addis 3, 2, .LCPI43_1@toc@ha
2439; PC64LE-NEXT:    lfs 1, .LCPI43_1@toc@l(3)
2440; PC64LE-NEXT:    bl sin
2441; PC64LE-NEXT:    nop
2442; PC64LE-NEXT:    li 3, 48
2443; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2444; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2445; PC64LE-NEXT:    addis 3, 2, .LCPI43_2@toc@ha
2446; PC64LE-NEXT:    xxmrghd 63, 0, 1
2447; PC64LE-NEXT:    lfd 1, .LCPI43_2@toc@l(3)
2448; PC64LE-NEXT:    bl sin
2449; PC64LE-NEXT:    nop
2450; PC64LE-NEXT:    xxswapd 0, 63
2451; PC64LE-NEXT:    li 3, 64
2452; PC64LE-NEXT:    xxlor 2, 63, 63
2453; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2454; PC64LE-NEXT:    fmr 3, 1
2455; PC64LE-NEXT:    fmr 1, 0
2456; PC64LE-NEXT:    addi 1, 1, 80
2457; PC64LE-NEXT:    ld 0, 16(1)
2458; PC64LE-NEXT:    mtlr 0
2459; PC64LE-NEXT:    blr
2460;
2461; PC64LE9-LABEL: constrained_vector_sin_v3f64:
2462; PC64LE9:       # %bb.0: # %entry
2463; PC64LE9-NEXT:    mflr 0
2464; PC64LE9-NEXT:    std 0, 16(1)
2465; PC64LE9-NEXT:    stdu 1, -64(1)
2466; PC64LE9-NEXT:    addis 3, 2, .LCPI43_0@toc@ha
2467; PC64LE9-NEXT:    lfd 1, .LCPI43_0@toc@l(3)
2468; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2469; PC64LE9-NEXT:    bl sin
2470; PC64LE9-NEXT:    nop
2471; PC64LE9-NEXT:    addis 3, 2, .LCPI43_1@toc@ha
2472; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2473; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2474; PC64LE9-NEXT:    lfs 1, .LCPI43_1@toc@l(3)
2475; PC64LE9-NEXT:    bl sin
2476; PC64LE9-NEXT:    nop
2477; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2478; PC64LE9-NEXT:    addis 3, 2, .LCPI43_2@toc@ha
2479; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2480; PC64LE9-NEXT:    xxmrghd 63, 0, 1
2481; PC64LE9-NEXT:    lfd 1, .LCPI43_2@toc@l(3)
2482; PC64LE9-NEXT:    bl sin
2483; PC64LE9-NEXT:    nop
2484; PC64LE9-NEXT:    fmr 3, 1
2485; PC64LE9-NEXT:    xxswapd 1, 63
2486; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
2487; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2488; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2489; PC64LE9-NEXT:    addi 1, 1, 64
2490; PC64LE9-NEXT:    ld 0, 16(1)
2491; PC64LE9-NEXT:    mtlr 0
2492; PC64LE9-NEXT:    blr
2493entry:
2494  %sin = call <3 x double> @llvm.experimental.constrained.sin.v3f64(
2495                          <3 x double> <double 42.0, double 42.1, double 42.2>,
2496                          metadata !"round.dynamic",
2497                          metadata !"fpexcept.strict") #1
2498  ret <3 x double> %sin
2499}
2500
2501define <4 x double> @constrained_vector_sin_v4f64() #0 {
2502; PC64LE-LABEL: constrained_vector_sin_v4f64:
2503; PC64LE:       # %bb.0: # %entry
2504; PC64LE-NEXT:    mflr 0
2505; PC64LE-NEXT:    std 0, 16(1)
2506; PC64LE-NEXT:    stdu 1, -80(1)
2507; PC64LE-NEXT:    li 3, 64
2508; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2509; PC64LE-NEXT:    addis 3, 2, .LCPI44_0@toc@ha
2510; PC64LE-NEXT:    lfd 1, .LCPI44_0@toc@l(3)
2511; PC64LE-NEXT:    bl sin
2512; PC64LE-NEXT:    nop
2513; PC64LE-NEXT:    li 3, 48
2514; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2515; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2516; PC64LE-NEXT:    addis 3, 2, .LCPI44_1@toc@ha
2517; PC64LE-NEXT:    lfd 1, .LCPI44_1@toc@l(3)
2518; PC64LE-NEXT:    bl sin
2519; PC64LE-NEXT:    nop
2520; PC64LE-NEXT:    li 3, 48
2521; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2522; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2523; PC64LE-NEXT:    addis 3, 2, .LCPI44_2@toc@ha
2524; PC64LE-NEXT:    xxmrghd 63, 1, 0
2525; PC64LE-NEXT:    lfd 1, .LCPI44_2@toc@l(3)
2526; PC64LE-NEXT:    bl sin
2527; PC64LE-NEXT:    nop
2528; PC64LE-NEXT:    li 3, 48
2529; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2530; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2531; PC64LE-NEXT:    addis 3, 2, .LCPI44_3@toc@ha
2532; PC64LE-NEXT:    lfs 1, .LCPI44_3@toc@l(3)
2533; PC64LE-NEXT:    bl sin
2534; PC64LE-NEXT:    nop
2535; PC64LE-NEXT:    li 3, 48
2536; PC64LE-NEXT:    vmr 3, 31
2537; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2538; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2539; PC64LE-NEXT:    li 3, 64
2540; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2541; PC64LE-NEXT:    xxmrghd 34, 0, 1
2542; PC64LE-NEXT:    addi 1, 1, 80
2543; PC64LE-NEXT:    ld 0, 16(1)
2544; PC64LE-NEXT:    mtlr 0
2545; PC64LE-NEXT:    blr
2546;
2547; PC64LE9-LABEL: constrained_vector_sin_v4f64:
2548; PC64LE9:       # %bb.0: # %entry
2549; PC64LE9-NEXT:    mflr 0
2550; PC64LE9-NEXT:    std 0, 16(1)
2551; PC64LE9-NEXT:    stdu 1, -64(1)
2552; PC64LE9-NEXT:    addis 3, 2, .LCPI44_0@toc@ha
2553; PC64LE9-NEXT:    lfd 1, .LCPI44_0@toc@l(3)
2554; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2555; PC64LE9-NEXT:    bl sin
2556; PC64LE9-NEXT:    nop
2557; PC64LE9-NEXT:    addis 3, 2, .LCPI44_1@toc@ha
2558; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2559; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2560; PC64LE9-NEXT:    lfd 1, .LCPI44_1@toc@l(3)
2561; PC64LE9-NEXT:    bl sin
2562; PC64LE9-NEXT:    nop
2563; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2564; PC64LE9-NEXT:    addis 3, 2, .LCPI44_2@toc@ha
2565; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2566; PC64LE9-NEXT:    xxmrghd 63, 1, 0
2567; PC64LE9-NEXT:    lfd 1, .LCPI44_2@toc@l(3)
2568; PC64LE9-NEXT:    bl sin
2569; PC64LE9-NEXT:    nop
2570; PC64LE9-NEXT:    addis 3, 2, .LCPI44_3@toc@ha
2571; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2572; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2573; PC64LE9-NEXT:    lfs 1, .LCPI44_3@toc@l(3)
2574; PC64LE9-NEXT:    bl sin
2575; PC64LE9-NEXT:    nop
2576; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2577; PC64LE9-NEXT:    vmr 3, 31
2578; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2579; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2580; PC64LE9-NEXT:    xxmrghd 34, 0, 1
2581; PC64LE9-NEXT:    addi 1, 1, 64
2582; PC64LE9-NEXT:    ld 0, 16(1)
2583; PC64LE9-NEXT:    mtlr 0
2584; PC64LE9-NEXT:    blr
2585entry:
2586  %sin = call <4 x double> @llvm.experimental.constrained.sin.v4f64(
2587                             <4 x double> <double 42.0, double 42.1,
2588                                           double 42.2, double 42.3>,
2589                             metadata !"round.dynamic",
2590                             metadata !"fpexcept.strict") #1
2591  ret <4 x double> %sin
2592}
2593
2594define <1 x float> @constrained_vector_cos_v1f32() #0 {
2595; PC64LE-LABEL: constrained_vector_cos_v1f32:
2596; PC64LE:       # %bb.0: # %entry
2597; PC64LE-NEXT:    mflr 0
2598; PC64LE-NEXT:    std 0, 16(1)
2599; PC64LE-NEXT:    stdu 1, -32(1)
2600; PC64LE-NEXT:    addis 3, 2, .LCPI45_0@toc@ha
2601; PC64LE-NEXT:    lfs 1, .LCPI45_0@toc@l(3)
2602; PC64LE-NEXT:    bl cosf
2603; PC64LE-NEXT:    nop
2604; PC64LE-NEXT:    addi 1, 1, 32
2605; PC64LE-NEXT:    ld 0, 16(1)
2606; PC64LE-NEXT:    mtlr 0
2607; PC64LE-NEXT:    blr
2608;
2609; PC64LE9-LABEL: constrained_vector_cos_v1f32:
2610; PC64LE9:       # %bb.0: # %entry
2611; PC64LE9-NEXT:    mflr 0
2612; PC64LE9-NEXT:    std 0, 16(1)
2613; PC64LE9-NEXT:    stdu 1, -32(1)
2614; PC64LE9-NEXT:    addis 3, 2, .LCPI45_0@toc@ha
2615; PC64LE9-NEXT:    lfs 1, .LCPI45_0@toc@l(3)
2616; PC64LE9-NEXT:    bl cosf
2617; PC64LE9-NEXT:    nop
2618; PC64LE9-NEXT:    addi 1, 1, 32
2619; PC64LE9-NEXT:    ld 0, 16(1)
2620; PC64LE9-NEXT:    mtlr 0
2621; PC64LE9-NEXT:    blr
2622entry:
2623  %cos = call <1 x float> @llvm.experimental.constrained.cos.v1f32(
2624                             <1 x float> <float 42.0>,
2625                             metadata !"round.dynamic",
2626                             metadata !"fpexcept.strict") #1
2627  ret <1 x float> %cos
2628}
2629
2630define <2 x double> @constrained_vector_cos_v2f64() #0 {
2631; PC64LE-LABEL: constrained_vector_cos_v2f64:
2632; PC64LE:       # %bb.0: # %entry
2633; PC64LE-NEXT:    mflr 0
2634; PC64LE-NEXT:    std 0, 16(1)
2635; PC64LE-NEXT:    stdu 1, -64(1)
2636; PC64LE-NEXT:    addis 3, 2, .LCPI46_0@toc@ha
2637; PC64LE-NEXT:    lfd 1, .LCPI46_0@toc@l(3)
2638; PC64LE-NEXT:    bl cos
2639; PC64LE-NEXT:    nop
2640; PC64LE-NEXT:    li 3, 48
2641; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2642; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2643; PC64LE-NEXT:    addis 3, 2, .LCPI46_1@toc@ha
2644; PC64LE-NEXT:    lfs 1, .LCPI46_1@toc@l(3)
2645; PC64LE-NEXT:    bl cos
2646; PC64LE-NEXT:    nop
2647; PC64LE-NEXT:    li 3, 48
2648; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2649; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2650; PC64LE-NEXT:    xxmrghd 34, 0, 1
2651; PC64LE-NEXT:    addi 1, 1, 64
2652; PC64LE-NEXT:    ld 0, 16(1)
2653; PC64LE-NEXT:    mtlr 0
2654; PC64LE-NEXT:    blr
2655;
2656; PC64LE9-LABEL: constrained_vector_cos_v2f64:
2657; PC64LE9:       # %bb.0: # %entry
2658; PC64LE9-NEXT:    mflr 0
2659; PC64LE9-NEXT:    std 0, 16(1)
2660; PC64LE9-NEXT:    stdu 1, -48(1)
2661; PC64LE9-NEXT:    addis 3, 2, .LCPI46_0@toc@ha
2662; PC64LE9-NEXT:    lfd 1, .LCPI46_0@toc@l(3)
2663; PC64LE9-NEXT:    bl cos
2664; PC64LE9-NEXT:    nop
2665; PC64LE9-NEXT:    addis 3, 2, .LCPI46_1@toc@ha
2666; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2667; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2668; PC64LE9-NEXT:    lfs 1, .LCPI46_1@toc@l(3)
2669; PC64LE9-NEXT:    bl cos
2670; PC64LE9-NEXT:    nop
2671; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2672; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2673; PC64LE9-NEXT:    xxmrghd 34, 0, 1
2674; PC64LE9-NEXT:    addi 1, 1, 48
2675; PC64LE9-NEXT:    ld 0, 16(1)
2676; PC64LE9-NEXT:    mtlr 0
2677; PC64LE9-NEXT:    blr
2678entry:
2679  %cos = call <2 x double> @llvm.experimental.constrained.cos.v2f64(
2680                             <2 x double> <double 42.0, double 42.1>,
2681                             metadata !"round.dynamic",
2682                             metadata !"fpexcept.strict") #1
2683  ret <2 x double> %cos
2684}
2685
2686define <3 x float> @constrained_vector_cos_v3f32() #0 {
2687; PC64LE-LABEL: constrained_vector_cos_v3f32:
2688; PC64LE:       # %bb.0: # %entry
2689; PC64LE-NEXT:    mflr 0
2690; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
2691; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
2692; PC64LE-NEXT:    std 0, 16(1)
2693; PC64LE-NEXT:    stdu 1, -48(1)
2694; PC64LE-NEXT:    addis 3, 2, .LCPI47_0@toc@ha
2695; PC64LE-NEXT:    lfs 1, .LCPI47_0@toc@l(3)
2696; PC64LE-NEXT:    bl cosf
2697; PC64LE-NEXT:    nop
2698; PC64LE-NEXT:    addis 3, 2, .LCPI47_1@toc@ha
2699; PC64LE-NEXT:    fmr 31, 1
2700; PC64LE-NEXT:    lfs 1, .LCPI47_1@toc@l(3)
2701; PC64LE-NEXT:    bl cosf
2702; PC64LE-NEXT:    nop
2703; PC64LE-NEXT:    addis 3, 2, .LCPI47_2@toc@ha
2704; PC64LE-NEXT:    fmr 30, 1
2705; PC64LE-NEXT:    lfs 1, .LCPI47_2@toc@l(3)
2706; PC64LE-NEXT:    bl cosf
2707; PC64LE-NEXT:    nop
2708; PC64LE-NEXT:    xscvdpspn 0, 30
2709; PC64LE-NEXT:    addis 3, 2, .LCPI47_3@toc@ha
2710; PC64LE-NEXT:    xscvdpspn 1, 1
2711; PC64LE-NEXT:    addi 3, 3, .LCPI47_3@toc@l
2712; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
2713; PC64LE-NEXT:    xscvdpspn 0, 31
2714; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
2715; PC64LE-NEXT:    vmrghw 2, 2, 3
2716; PC64LE-NEXT:    lvx 3, 0, 3
2717; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
2718; PC64LE-NEXT:    vperm 2, 4, 2, 3
2719; PC64LE-NEXT:    addi 1, 1, 48
2720; PC64LE-NEXT:    ld 0, 16(1)
2721; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
2722; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
2723; PC64LE-NEXT:    mtlr 0
2724; PC64LE-NEXT:    blr
2725;
2726; PC64LE9-LABEL: constrained_vector_cos_v3f32:
2727; PC64LE9:       # %bb.0: # %entry
2728; PC64LE9-NEXT:    mflr 0
2729; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
2730; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
2731; PC64LE9-NEXT:    std 0, 16(1)
2732; PC64LE9-NEXT:    stdu 1, -48(1)
2733; PC64LE9-NEXT:    addis 3, 2, .LCPI47_0@toc@ha
2734; PC64LE9-NEXT:    lfs 1, .LCPI47_0@toc@l(3)
2735; PC64LE9-NEXT:    bl cosf
2736; PC64LE9-NEXT:    nop
2737; PC64LE9-NEXT:    addis 3, 2, .LCPI47_1@toc@ha
2738; PC64LE9-NEXT:    fmr 31, 1
2739; PC64LE9-NEXT:    lfs 1, .LCPI47_1@toc@l(3)
2740; PC64LE9-NEXT:    bl cosf
2741; PC64LE9-NEXT:    nop
2742; PC64LE9-NEXT:    addis 3, 2, .LCPI47_2@toc@ha
2743; PC64LE9-NEXT:    fmr 30, 1
2744; PC64LE9-NEXT:    lfs 1, .LCPI47_2@toc@l(3)
2745; PC64LE9-NEXT:    bl cosf
2746; PC64LE9-NEXT:    nop
2747; PC64LE9-NEXT:    xscvdpspn 0, 1
2748; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
2749; PC64LE9-NEXT:    xscvdpspn 0, 30
2750; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
2751; PC64LE9-NEXT:    xscvdpspn 0, 31
2752; PC64LE9-NEXT:    addis 3, 2, .LCPI47_3@toc@ha
2753; PC64LE9-NEXT:    addi 3, 3, .LCPI47_3@toc@l
2754; PC64LE9-NEXT:    vmrghw 2, 3, 2
2755; PC64LE9-NEXT:    lxvx 35, 0, 3
2756; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
2757; PC64LE9-NEXT:    vperm 2, 4, 2, 3
2758; PC64LE9-NEXT:    addi 1, 1, 48
2759; PC64LE9-NEXT:    ld 0, 16(1)
2760; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
2761; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
2762; PC64LE9-NEXT:    mtlr 0
2763; PC64LE9-NEXT:    blr
2764entry:
2765  %cos = call <3 x float> @llvm.experimental.constrained.cos.v3f32(
2766                              <3 x float> <float 42.0, float 43.0, float 44.0>,
2767                              metadata !"round.dynamic",
2768                              metadata !"fpexcept.strict") #1
2769  ret <3 x float> %cos
2770}
2771
2772define <3 x double> @constrained_vector_cos_v3f64() #0 {
2773; PC64LE-LABEL: constrained_vector_cos_v3f64:
2774; PC64LE:       # %bb.0: # %entry
2775; PC64LE-NEXT:    mflr 0
2776; PC64LE-NEXT:    std 0, 16(1)
2777; PC64LE-NEXT:    stdu 1, -80(1)
2778; PC64LE-NEXT:    li 3, 64
2779; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2780; PC64LE-NEXT:    addis 3, 2, .LCPI48_0@toc@ha
2781; PC64LE-NEXT:    lfd 1, .LCPI48_0@toc@l(3)
2782; PC64LE-NEXT:    bl cos
2783; PC64LE-NEXT:    nop
2784; PC64LE-NEXT:    li 3, 48
2785; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2786; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2787; PC64LE-NEXT:    addis 3, 2, .LCPI48_1@toc@ha
2788; PC64LE-NEXT:    lfs 1, .LCPI48_1@toc@l(3)
2789; PC64LE-NEXT:    bl cos
2790; PC64LE-NEXT:    nop
2791; PC64LE-NEXT:    li 3, 48
2792; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2793; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2794; PC64LE-NEXT:    addis 3, 2, .LCPI48_2@toc@ha
2795; PC64LE-NEXT:    xxmrghd 63, 0, 1
2796; PC64LE-NEXT:    lfd 1, .LCPI48_2@toc@l(3)
2797; PC64LE-NEXT:    bl cos
2798; PC64LE-NEXT:    nop
2799; PC64LE-NEXT:    xxswapd 0, 63
2800; PC64LE-NEXT:    li 3, 64
2801; PC64LE-NEXT:    xxlor 2, 63, 63
2802; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2803; PC64LE-NEXT:    fmr 3, 1
2804; PC64LE-NEXT:    fmr 1, 0
2805; PC64LE-NEXT:    addi 1, 1, 80
2806; PC64LE-NEXT:    ld 0, 16(1)
2807; PC64LE-NEXT:    mtlr 0
2808; PC64LE-NEXT:    blr
2809;
2810; PC64LE9-LABEL: constrained_vector_cos_v3f64:
2811; PC64LE9:       # %bb.0: # %entry
2812; PC64LE9-NEXT:    mflr 0
2813; PC64LE9-NEXT:    std 0, 16(1)
2814; PC64LE9-NEXT:    stdu 1, -64(1)
2815; PC64LE9-NEXT:    addis 3, 2, .LCPI48_0@toc@ha
2816; PC64LE9-NEXT:    lfd 1, .LCPI48_0@toc@l(3)
2817; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2818; PC64LE9-NEXT:    bl cos
2819; PC64LE9-NEXT:    nop
2820; PC64LE9-NEXT:    addis 3, 2, .LCPI48_1@toc@ha
2821; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2822; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2823; PC64LE9-NEXT:    lfs 1, .LCPI48_1@toc@l(3)
2824; PC64LE9-NEXT:    bl cos
2825; PC64LE9-NEXT:    nop
2826; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2827; PC64LE9-NEXT:    addis 3, 2, .LCPI48_2@toc@ha
2828; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2829; PC64LE9-NEXT:    xxmrghd 63, 0, 1
2830; PC64LE9-NEXT:    lfd 1, .LCPI48_2@toc@l(3)
2831; PC64LE9-NEXT:    bl cos
2832; PC64LE9-NEXT:    nop
2833; PC64LE9-NEXT:    fmr 3, 1
2834; PC64LE9-NEXT:    xxswapd 1, 63
2835; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
2836; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2837; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2838; PC64LE9-NEXT:    addi 1, 1, 64
2839; PC64LE9-NEXT:    ld 0, 16(1)
2840; PC64LE9-NEXT:    mtlr 0
2841; PC64LE9-NEXT:    blr
2842entry:
2843  %cos = call <3 x double> @llvm.experimental.constrained.cos.v3f64(
2844                          <3 x double> <double 42.0, double 42.1, double 42.2>,
2845                          metadata !"round.dynamic",
2846                          metadata !"fpexcept.strict") #1
2847  ret <3 x double> %cos
2848}
2849
2850define <4 x double> @constrained_vector_cos_v4f64() #0 {
2851; PC64LE-LABEL: constrained_vector_cos_v4f64:
2852; PC64LE:       # %bb.0: # %entry
2853; PC64LE-NEXT:    mflr 0
2854; PC64LE-NEXT:    std 0, 16(1)
2855; PC64LE-NEXT:    stdu 1, -80(1)
2856; PC64LE-NEXT:    li 3, 64
2857; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2858; PC64LE-NEXT:    addis 3, 2, .LCPI49_0@toc@ha
2859; PC64LE-NEXT:    lfd 1, .LCPI49_0@toc@l(3)
2860; PC64LE-NEXT:    bl cos
2861; PC64LE-NEXT:    nop
2862; PC64LE-NEXT:    li 3, 48
2863; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2864; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2865; PC64LE-NEXT:    addis 3, 2, .LCPI49_1@toc@ha
2866; PC64LE-NEXT:    lfd 1, .LCPI49_1@toc@l(3)
2867; PC64LE-NEXT:    bl cos
2868; PC64LE-NEXT:    nop
2869; PC64LE-NEXT:    li 3, 48
2870; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2871; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2872; PC64LE-NEXT:    addis 3, 2, .LCPI49_2@toc@ha
2873; PC64LE-NEXT:    xxmrghd 63, 1, 0
2874; PC64LE-NEXT:    lfd 1, .LCPI49_2@toc@l(3)
2875; PC64LE-NEXT:    bl cos
2876; PC64LE-NEXT:    nop
2877; PC64LE-NEXT:    li 3, 48
2878; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2879; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2880; PC64LE-NEXT:    addis 3, 2, .LCPI49_3@toc@ha
2881; PC64LE-NEXT:    lfs 1, .LCPI49_3@toc@l(3)
2882; PC64LE-NEXT:    bl cos
2883; PC64LE-NEXT:    nop
2884; PC64LE-NEXT:    li 3, 48
2885; PC64LE-NEXT:    vmr 3, 31
2886; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2887; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2888; PC64LE-NEXT:    li 3, 64
2889; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2890; PC64LE-NEXT:    xxmrghd 34, 0, 1
2891; PC64LE-NEXT:    addi 1, 1, 80
2892; PC64LE-NEXT:    ld 0, 16(1)
2893; PC64LE-NEXT:    mtlr 0
2894; PC64LE-NEXT:    blr
2895;
2896; PC64LE9-LABEL: constrained_vector_cos_v4f64:
2897; PC64LE9:       # %bb.0: # %entry
2898; PC64LE9-NEXT:    mflr 0
2899; PC64LE9-NEXT:    std 0, 16(1)
2900; PC64LE9-NEXT:    stdu 1, -64(1)
2901; PC64LE9-NEXT:    addis 3, 2, .LCPI49_0@toc@ha
2902; PC64LE9-NEXT:    lfd 1, .LCPI49_0@toc@l(3)
2903; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2904; PC64LE9-NEXT:    bl cos
2905; PC64LE9-NEXT:    nop
2906; PC64LE9-NEXT:    addis 3, 2, .LCPI49_1@toc@ha
2907; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2908; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2909; PC64LE9-NEXT:    lfd 1, .LCPI49_1@toc@l(3)
2910; PC64LE9-NEXT:    bl cos
2911; PC64LE9-NEXT:    nop
2912; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2913; PC64LE9-NEXT:    addis 3, 2, .LCPI49_2@toc@ha
2914; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2915; PC64LE9-NEXT:    xxmrghd 63, 1, 0
2916; PC64LE9-NEXT:    lfd 1, .LCPI49_2@toc@l(3)
2917; PC64LE9-NEXT:    bl cos
2918; PC64LE9-NEXT:    nop
2919; PC64LE9-NEXT:    addis 3, 2, .LCPI49_3@toc@ha
2920; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2921; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
2922; PC64LE9-NEXT:    lfs 1, .LCPI49_3@toc@l(3)
2923; PC64LE9-NEXT:    bl cos
2924; PC64LE9-NEXT:    nop
2925; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
2926; PC64LE9-NEXT:    vmr 3, 31
2927; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2928; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2929; PC64LE9-NEXT:    xxmrghd 34, 0, 1
2930; PC64LE9-NEXT:    addi 1, 1, 64
2931; PC64LE9-NEXT:    ld 0, 16(1)
2932; PC64LE9-NEXT:    mtlr 0
2933; PC64LE9-NEXT:    blr
2934entry:
2935  %cos = call <4 x double> @llvm.experimental.constrained.cos.v4f64(
2936                             <4 x double> <double 42.0, double 42.1,
2937                                           double 42.2, double 42.3>,
2938                             metadata !"round.dynamic",
2939                             metadata !"fpexcept.strict") #1
2940  ret <4 x double> %cos
2941}
2942
2943define <1 x float> @constrained_vector_exp_v1f32() #0 {
2944; PC64LE-LABEL: constrained_vector_exp_v1f32:
2945; PC64LE:       # %bb.0: # %entry
2946; PC64LE-NEXT:    mflr 0
2947; PC64LE-NEXT:    std 0, 16(1)
2948; PC64LE-NEXT:    stdu 1, -32(1)
2949; PC64LE-NEXT:    addis 3, 2, .LCPI50_0@toc@ha
2950; PC64LE-NEXT:    lfs 1, .LCPI50_0@toc@l(3)
2951; PC64LE-NEXT:    bl expf
2952; PC64LE-NEXT:    nop
2953; PC64LE-NEXT:    addi 1, 1, 32
2954; PC64LE-NEXT:    ld 0, 16(1)
2955; PC64LE-NEXT:    mtlr 0
2956; PC64LE-NEXT:    blr
2957;
2958; PC64LE9-LABEL: constrained_vector_exp_v1f32:
2959; PC64LE9:       # %bb.0: # %entry
2960; PC64LE9-NEXT:    mflr 0
2961; PC64LE9-NEXT:    std 0, 16(1)
2962; PC64LE9-NEXT:    stdu 1, -32(1)
2963; PC64LE9-NEXT:    addis 3, 2, .LCPI50_0@toc@ha
2964; PC64LE9-NEXT:    lfs 1, .LCPI50_0@toc@l(3)
2965; PC64LE9-NEXT:    bl expf
2966; PC64LE9-NEXT:    nop
2967; PC64LE9-NEXT:    addi 1, 1, 32
2968; PC64LE9-NEXT:    ld 0, 16(1)
2969; PC64LE9-NEXT:    mtlr 0
2970; PC64LE9-NEXT:    blr
2971entry:
2972  %exp = call <1 x float> @llvm.experimental.constrained.exp.v1f32(
2973                             <1 x float> <float 42.0>,
2974                             metadata !"round.dynamic",
2975                             metadata !"fpexcept.strict") #1
2976  ret <1 x float> %exp
2977}
2978
2979define <2 x double> @constrained_vector_exp_v2f64() #0 {
2980; PC64LE-LABEL: constrained_vector_exp_v2f64:
2981; PC64LE:       # %bb.0: # %entry
2982; PC64LE-NEXT:    mflr 0
2983; PC64LE-NEXT:    std 0, 16(1)
2984; PC64LE-NEXT:    stdu 1, -64(1)
2985; PC64LE-NEXT:    addis 3, 2, .LCPI51_0@toc@ha
2986; PC64LE-NEXT:    lfd 1, .LCPI51_0@toc@l(3)
2987; PC64LE-NEXT:    bl exp
2988; PC64LE-NEXT:    nop
2989; PC64LE-NEXT:    li 3, 48
2990; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2991; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
2992; PC64LE-NEXT:    addis 3, 2, .LCPI51_1@toc@ha
2993; PC64LE-NEXT:    lfs 1, .LCPI51_1@toc@l(3)
2994; PC64LE-NEXT:    bl exp
2995; PC64LE-NEXT:    nop
2996; PC64LE-NEXT:    li 3, 48
2997; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2998; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
2999; PC64LE-NEXT:    xxmrghd 34, 0, 1
3000; PC64LE-NEXT:    addi 1, 1, 64
3001; PC64LE-NEXT:    ld 0, 16(1)
3002; PC64LE-NEXT:    mtlr 0
3003; PC64LE-NEXT:    blr
3004;
3005; PC64LE9-LABEL: constrained_vector_exp_v2f64:
3006; PC64LE9:       # %bb.0: # %entry
3007; PC64LE9-NEXT:    mflr 0
3008; PC64LE9-NEXT:    std 0, 16(1)
3009; PC64LE9-NEXT:    stdu 1, -48(1)
3010; PC64LE9-NEXT:    addis 3, 2, .LCPI51_0@toc@ha
3011; PC64LE9-NEXT:    lfd 1, .LCPI51_0@toc@l(3)
3012; PC64LE9-NEXT:    bl exp
3013; PC64LE9-NEXT:    nop
3014; PC64LE9-NEXT:    addis 3, 2, .LCPI51_1@toc@ha
3015; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3016; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3017; PC64LE9-NEXT:    lfs 1, .LCPI51_1@toc@l(3)
3018; PC64LE9-NEXT:    bl exp
3019; PC64LE9-NEXT:    nop
3020; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3021; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3022; PC64LE9-NEXT:    xxmrghd 34, 0, 1
3023; PC64LE9-NEXT:    addi 1, 1, 48
3024; PC64LE9-NEXT:    ld 0, 16(1)
3025; PC64LE9-NEXT:    mtlr 0
3026; PC64LE9-NEXT:    blr
3027entry:
3028  %exp = call <2 x double> @llvm.experimental.constrained.exp.v2f64(
3029                             <2 x double> <double 42.0, double 42.1>,
3030                             metadata !"round.dynamic",
3031                             metadata !"fpexcept.strict") #1
3032  ret <2 x double> %exp
3033}
3034
3035define <3 x float> @constrained_vector_exp_v3f32() #0 {
3036; PC64LE-LABEL: constrained_vector_exp_v3f32:
3037; PC64LE:       # %bb.0: # %entry
3038; PC64LE-NEXT:    mflr 0
3039; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
3040; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
3041; PC64LE-NEXT:    std 0, 16(1)
3042; PC64LE-NEXT:    stdu 1, -48(1)
3043; PC64LE-NEXT:    addis 3, 2, .LCPI52_0@toc@ha
3044; PC64LE-NEXT:    lfs 1, .LCPI52_0@toc@l(3)
3045; PC64LE-NEXT:    bl expf
3046; PC64LE-NEXT:    nop
3047; PC64LE-NEXT:    addis 3, 2, .LCPI52_1@toc@ha
3048; PC64LE-NEXT:    fmr 31, 1
3049; PC64LE-NEXT:    lfs 1, .LCPI52_1@toc@l(3)
3050; PC64LE-NEXT:    bl expf
3051; PC64LE-NEXT:    nop
3052; PC64LE-NEXT:    addis 3, 2, .LCPI52_2@toc@ha
3053; PC64LE-NEXT:    fmr 30, 1
3054; PC64LE-NEXT:    lfs 1, .LCPI52_2@toc@l(3)
3055; PC64LE-NEXT:    bl expf
3056; PC64LE-NEXT:    nop
3057; PC64LE-NEXT:    xscvdpspn 0, 30
3058; PC64LE-NEXT:    addis 3, 2, .LCPI52_3@toc@ha
3059; PC64LE-NEXT:    xscvdpspn 1, 1
3060; PC64LE-NEXT:    addi 3, 3, .LCPI52_3@toc@l
3061; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
3062; PC64LE-NEXT:    xscvdpspn 0, 31
3063; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
3064; PC64LE-NEXT:    vmrghw 2, 2, 3
3065; PC64LE-NEXT:    lvx 3, 0, 3
3066; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
3067; PC64LE-NEXT:    vperm 2, 4, 2, 3
3068; PC64LE-NEXT:    addi 1, 1, 48
3069; PC64LE-NEXT:    ld 0, 16(1)
3070; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
3071; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
3072; PC64LE-NEXT:    mtlr 0
3073; PC64LE-NEXT:    blr
3074;
3075; PC64LE9-LABEL: constrained_vector_exp_v3f32:
3076; PC64LE9:       # %bb.0: # %entry
3077; PC64LE9-NEXT:    mflr 0
3078; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
3079; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
3080; PC64LE9-NEXT:    std 0, 16(1)
3081; PC64LE9-NEXT:    stdu 1, -48(1)
3082; PC64LE9-NEXT:    addis 3, 2, .LCPI52_0@toc@ha
3083; PC64LE9-NEXT:    lfs 1, .LCPI52_0@toc@l(3)
3084; PC64LE9-NEXT:    bl expf
3085; PC64LE9-NEXT:    nop
3086; PC64LE9-NEXT:    addis 3, 2, .LCPI52_1@toc@ha
3087; PC64LE9-NEXT:    fmr 31, 1
3088; PC64LE9-NEXT:    lfs 1, .LCPI52_1@toc@l(3)
3089; PC64LE9-NEXT:    bl expf
3090; PC64LE9-NEXT:    nop
3091; PC64LE9-NEXT:    addis 3, 2, .LCPI52_2@toc@ha
3092; PC64LE9-NEXT:    fmr 30, 1
3093; PC64LE9-NEXT:    lfs 1, .LCPI52_2@toc@l(3)
3094; PC64LE9-NEXT:    bl expf
3095; PC64LE9-NEXT:    nop
3096; PC64LE9-NEXT:    xscvdpspn 0, 1
3097; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
3098; PC64LE9-NEXT:    xscvdpspn 0, 30
3099; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
3100; PC64LE9-NEXT:    xscvdpspn 0, 31
3101; PC64LE9-NEXT:    addis 3, 2, .LCPI52_3@toc@ha
3102; PC64LE9-NEXT:    addi 3, 3, .LCPI52_3@toc@l
3103; PC64LE9-NEXT:    vmrghw 2, 3, 2
3104; PC64LE9-NEXT:    lxvx 35, 0, 3
3105; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
3106; PC64LE9-NEXT:    vperm 2, 4, 2, 3
3107; PC64LE9-NEXT:    addi 1, 1, 48
3108; PC64LE9-NEXT:    ld 0, 16(1)
3109; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
3110; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
3111; PC64LE9-NEXT:    mtlr 0
3112; PC64LE9-NEXT:    blr
3113entry:
3114  %exp = call <3 x float> @llvm.experimental.constrained.exp.v3f32(
3115                              <3 x float> <float 42.0, float 43.0, float 44.0>,
3116                              metadata !"round.dynamic",
3117                              metadata !"fpexcept.strict") #1
3118  ret <3 x float> %exp
3119}
3120
3121define <3 x double> @constrained_vector_exp_v3f64() #0 {
3122; PC64LE-LABEL: constrained_vector_exp_v3f64:
3123; PC64LE:       # %bb.0: # %entry
3124; PC64LE-NEXT:    mflr 0
3125; PC64LE-NEXT:    std 0, 16(1)
3126; PC64LE-NEXT:    stdu 1, -80(1)
3127; PC64LE-NEXT:    li 3, 64
3128; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3129; PC64LE-NEXT:    addis 3, 2, .LCPI53_0@toc@ha
3130; PC64LE-NEXT:    lfd 1, .LCPI53_0@toc@l(3)
3131; PC64LE-NEXT:    bl exp
3132; PC64LE-NEXT:    nop
3133; PC64LE-NEXT:    li 3, 48
3134; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3135; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3136; PC64LE-NEXT:    addis 3, 2, .LCPI53_1@toc@ha
3137; PC64LE-NEXT:    lfs 1, .LCPI53_1@toc@l(3)
3138; PC64LE-NEXT:    bl exp
3139; PC64LE-NEXT:    nop
3140; PC64LE-NEXT:    li 3, 48
3141; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3142; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3143; PC64LE-NEXT:    addis 3, 2, .LCPI53_2@toc@ha
3144; PC64LE-NEXT:    xxmrghd 63, 0, 1
3145; PC64LE-NEXT:    lfd 1, .LCPI53_2@toc@l(3)
3146; PC64LE-NEXT:    bl exp
3147; PC64LE-NEXT:    nop
3148; PC64LE-NEXT:    xxswapd 0, 63
3149; PC64LE-NEXT:    li 3, 64
3150; PC64LE-NEXT:    xxlor 2, 63, 63
3151; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3152; PC64LE-NEXT:    fmr 3, 1
3153; PC64LE-NEXT:    fmr 1, 0
3154; PC64LE-NEXT:    addi 1, 1, 80
3155; PC64LE-NEXT:    ld 0, 16(1)
3156; PC64LE-NEXT:    mtlr 0
3157; PC64LE-NEXT:    blr
3158;
3159; PC64LE9-LABEL: constrained_vector_exp_v3f64:
3160; PC64LE9:       # %bb.0: # %entry
3161; PC64LE9-NEXT:    mflr 0
3162; PC64LE9-NEXT:    std 0, 16(1)
3163; PC64LE9-NEXT:    stdu 1, -64(1)
3164; PC64LE9-NEXT:    addis 3, 2, .LCPI53_0@toc@ha
3165; PC64LE9-NEXT:    lfd 1, .LCPI53_0@toc@l(3)
3166; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3167; PC64LE9-NEXT:    bl exp
3168; PC64LE9-NEXT:    nop
3169; PC64LE9-NEXT:    addis 3, 2, .LCPI53_1@toc@ha
3170; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3171; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3172; PC64LE9-NEXT:    lfs 1, .LCPI53_1@toc@l(3)
3173; PC64LE9-NEXT:    bl exp
3174; PC64LE9-NEXT:    nop
3175; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3176; PC64LE9-NEXT:    addis 3, 2, .LCPI53_2@toc@ha
3177; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3178; PC64LE9-NEXT:    xxmrghd 63, 0, 1
3179; PC64LE9-NEXT:    lfd 1, .LCPI53_2@toc@l(3)
3180; PC64LE9-NEXT:    bl exp
3181; PC64LE9-NEXT:    nop
3182; PC64LE9-NEXT:    fmr 3, 1
3183; PC64LE9-NEXT:    xxswapd 1, 63
3184; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
3185; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3186; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3187; PC64LE9-NEXT:    addi 1, 1, 64
3188; PC64LE9-NEXT:    ld 0, 16(1)
3189; PC64LE9-NEXT:    mtlr 0
3190; PC64LE9-NEXT:    blr
3191entry:
3192  %exp = call <3 x double> @llvm.experimental.constrained.exp.v3f64(
3193                          <3 x double> <double 42.0, double 42.1, double 42.2>,
3194                          metadata !"round.dynamic",
3195                          metadata !"fpexcept.strict") #1
3196  ret <3 x double> %exp
3197}
3198
3199define <4 x double> @constrained_vector_exp_v4f64() #0 {
3200; PC64LE-LABEL: constrained_vector_exp_v4f64:
3201; PC64LE:       # %bb.0: # %entry
3202; PC64LE-NEXT:    mflr 0
3203; PC64LE-NEXT:    std 0, 16(1)
3204; PC64LE-NEXT:    stdu 1, -80(1)
3205; PC64LE-NEXT:    li 3, 64
3206; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3207; PC64LE-NEXT:    addis 3, 2, .LCPI54_0@toc@ha
3208; PC64LE-NEXT:    lfd 1, .LCPI54_0@toc@l(3)
3209; PC64LE-NEXT:    bl exp
3210; PC64LE-NEXT:    nop
3211; PC64LE-NEXT:    li 3, 48
3212; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3213; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3214; PC64LE-NEXT:    addis 3, 2, .LCPI54_1@toc@ha
3215; PC64LE-NEXT:    lfd 1, .LCPI54_1@toc@l(3)
3216; PC64LE-NEXT:    bl exp
3217; PC64LE-NEXT:    nop
3218; PC64LE-NEXT:    li 3, 48
3219; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3220; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3221; PC64LE-NEXT:    addis 3, 2, .LCPI54_2@toc@ha
3222; PC64LE-NEXT:    xxmrghd 63, 1, 0
3223; PC64LE-NEXT:    lfd 1, .LCPI54_2@toc@l(3)
3224; PC64LE-NEXT:    bl exp
3225; PC64LE-NEXT:    nop
3226; PC64LE-NEXT:    li 3, 48
3227; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3228; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3229; PC64LE-NEXT:    addis 3, 2, .LCPI54_3@toc@ha
3230; PC64LE-NEXT:    lfs 1, .LCPI54_3@toc@l(3)
3231; PC64LE-NEXT:    bl exp
3232; PC64LE-NEXT:    nop
3233; PC64LE-NEXT:    li 3, 48
3234; PC64LE-NEXT:    vmr 3, 31
3235; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3236; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3237; PC64LE-NEXT:    li 3, 64
3238; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3239; PC64LE-NEXT:    xxmrghd 34, 0, 1
3240; PC64LE-NEXT:    addi 1, 1, 80
3241; PC64LE-NEXT:    ld 0, 16(1)
3242; PC64LE-NEXT:    mtlr 0
3243; PC64LE-NEXT:    blr
3244;
3245; PC64LE9-LABEL: constrained_vector_exp_v4f64:
3246; PC64LE9:       # %bb.0: # %entry
3247; PC64LE9-NEXT:    mflr 0
3248; PC64LE9-NEXT:    std 0, 16(1)
3249; PC64LE9-NEXT:    stdu 1, -64(1)
3250; PC64LE9-NEXT:    addis 3, 2, .LCPI54_0@toc@ha
3251; PC64LE9-NEXT:    lfd 1, .LCPI54_0@toc@l(3)
3252; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3253; PC64LE9-NEXT:    bl exp
3254; PC64LE9-NEXT:    nop
3255; PC64LE9-NEXT:    addis 3, 2, .LCPI54_1@toc@ha
3256; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3257; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3258; PC64LE9-NEXT:    lfd 1, .LCPI54_1@toc@l(3)
3259; PC64LE9-NEXT:    bl exp
3260; PC64LE9-NEXT:    nop
3261; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3262; PC64LE9-NEXT:    addis 3, 2, .LCPI54_2@toc@ha
3263; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3264; PC64LE9-NEXT:    xxmrghd 63, 1, 0
3265; PC64LE9-NEXT:    lfd 1, .LCPI54_2@toc@l(3)
3266; PC64LE9-NEXT:    bl exp
3267; PC64LE9-NEXT:    nop
3268; PC64LE9-NEXT:    addis 3, 2, .LCPI54_3@toc@ha
3269; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3270; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3271; PC64LE9-NEXT:    lfs 1, .LCPI54_3@toc@l(3)
3272; PC64LE9-NEXT:    bl exp
3273; PC64LE9-NEXT:    nop
3274; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3275; PC64LE9-NEXT:    vmr 3, 31
3276; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3277; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3278; PC64LE9-NEXT:    xxmrghd 34, 0, 1
3279; PC64LE9-NEXT:    addi 1, 1, 64
3280; PC64LE9-NEXT:    ld 0, 16(1)
3281; PC64LE9-NEXT:    mtlr 0
3282; PC64LE9-NEXT:    blr
3283entry:
3284  %exp = call <4 x double> @llvm.experimental.constrained.exp.v4f64(
3285                             <4 x double> <double 42.0, double 42.1,
3286                                           double 42.2, double 42.3>,
3287                             metadata !"round.dynamic",
3288                             metadata !"fpexcept.strict") #1
3289  ret <4 x double> %exp
3290}
3291
3292define <1 x float> @constrained_vector_exp2_v1f32() #0 {
3293; PC64LE-LABEL: constrained_vector_exp2_v1f32:
3294; PC64LE:       # %bb.0: # %entry
3295; PC64LE-NEXT:    mflr 0
3296; PC64LE-NEXT:    std 0, 16(1)
3297; PC64LE-NEXT:    stdu 1, -32(1)
3298; PC64LE-NEXT:    addis 3, 2, .LCPI55_0@toc@ha
3299; PC64LE-NEXT:    lfs 1, .LCPI55_0@toc@l(3)
3300; PC64LE-NEXT:    bl exp2f
3301; PC64LE-NEXT:    nop
3302; PC64LE-NEXT:    addi 1, 1, 32
3303; PC64LE-NEXT:    ld 0, 16(1)
3304; PC64LE-NEXT:    mtlr 0
3305; PC64LE-NEXT:    blr
3306;
3307; PC64LE9-LABEL: constrained_vector_exp2_v1f32:
3308; PC64LE9:       # %bb.0: # %entry
3309; PC64LE9-NEXT:    mflr 0
3310; PC64LE9-NEXT:    std 0, 16(1)
3311; PC64LE9-NEXT:    stdu 1, -32(1)
3312; PC64LE9-NEXT:    addis 3, 2, .LCPI55_0@toc@ha
3313; PC64LE9-NEXT:    lfs 1, .LCPI55_0@toc@l(3)
3314; PC64LE9-NEXT:    bl exp2f
3315; PC64LE9-NEXT:    nop
3316; PC64LE9-NEXT:    addi 1, 1, 32
3317; PC64LE9-NEXT:    ld 0, 16(1)
3318; PC64LE9-NEXT:    mtlr 0
3319; PC64LE9-NEXT:    blr
3320entry:
3321  %exp2 = call <1 x float> @llvm.experimental.constrained.exp2.v1f32(
3322                             <1 x float> <float 42.0>,
3323                             metadata !"round.dynamic",
3324                             metadata !"fpexcept.strict") #1
3325  ret <1 x float> %exp2
3326}
3327
3328define <2 x double> @constrained_vector_exp2_v2f64() #0 {
3329; PC64LE-LABEL: constrained_vector_exp2_v2f64:
3330; PC64LE:       # %bb.0: # %entry
3331; PC64LE-NEXT:    mflr 0
3332; PC64LE-NEXT:    std 0, 16(1)
3333; PC64LE-NEXT:    stdu 1, -64(1)
3334; PC64LE-NEXT:    addis 3, 2, .LCPI56_0@toc@ha
3335; PC64LE-NEXT:    lfd 1, .LCPI56_0@toc@l(3)
3336; PC64LE-NEXT:    bl exp2
3337; PC64LE-NEXT:    nop
3338; PC64LE-NEXT:    li 3, 48
3339; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3340; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3341; PC64LE-NEXT:    addis 3, 2, .LCPI56_1@toc@ha
3342; PC64LE-NEXT:    lfs 1, .LCPI56_1@toc@l(3)
3343; PC64LE-NEXT:    bl exp2
3344; PC64LE-NEXT:    nop
3345; PC64LE-NEXT:    li 3, 48
3346; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3347; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3348; PC64LE-NEXT:    xxmrghd 34, 1, 0
3349; PC64LE-NEXT:    addi 1, 1, 64
3350; PC64LE-NEXT:    ld 0, 16(1)
3351; PC64LE-NEXT:    mtlr 0
3352; PC64LE-NEXT:    blr
3353;
3354; PC64LE9-LABEL: constrained_vector_exp2_v2f64:
3355; PC64LE9:       # %bb.0: # %entry
3356; PC64LE9-NEXT:    mflr 0
3357; PC64LE9-NEXT:    std 0, 16(1)
3358; PC64LE9-NEXT:    stdu 1, -48(1)
3359; PC64LE9-NEXT:    addis 3, 2, .LCPI56_0@toc@ha
3360; PC64LE9-NEXT:    lfd 1, .LCPI56_0@toc@l(3)
3361; PC64LE9-NEXT:    bl exp2
3362; PC64LE9-NEXT:    nop
3363; PC64LE9-NEXT:    addis 3, 2, .LCPI56_1@toc@ha
3364; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3365; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3366; PC64LE9-NEXT:    lfs 1, .LCPI56_1@toc@l(3)
3367; PC64LE9-NEXT:    bl exp2
3368; PC64LE9-NEXT:    nop
3369; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3370; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3371; PC64LE9-NEXT:    xxmrghd 34, 1, 0
3372; PC64LE9-NEXT:    addi 1, 1, 48
3373; PC64LE9-NEXT:    ld 0, 16(1)
3374; PC64LE9-NEXT:    mtlr 0
3375; PC64LE9-NEXT:    blr
3376entry:
3377  %exp2 = call <2 x double> @llvm.experimental.constrained.exp2.v2f64(
3378                              <2 x double> <double 42.1, double 42.0>,
3379                              metadata !"round.dynamic",
3380                              metadata !"fpexcept.strict") #1
3381  ret <2 x double> %exp2
3382}
3383
3384define <3 x float> @constrained_vector_exp2_v3f32() #0 {
3385; PC64LE-LABEL: constrained_vector_exp2_v3f32:
3386; PC64LE:       # %bb.0: # %entry
3387; PC64LE-NEXT:    mflr 0
3388; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
3389; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
3390; PC64LE-NEXT:    std 0, 16(1)
3391; PC64LE-NEXT:    stdu 1, -48(1)
3392; PC64LE-NEXT:    addis 3, 2, .LCPI57_0@toc@ha
3393; PC64LE-NEXT:    lfs 1, .LCPI57_0@toc@l(3)
3394; PC64LE-NEXT:    bl exp2f
3395; PC64LE-NEXT:    nop
3396; PC64LE-NEXT:    addis 3, 2, .LCPI57_1@toc@ha
3397; PC64LE-NEXT:    fmr 31, 1
3398; PC64LE-NEXT:    lfs 1, .LCPI57_1@toc@l(3)
3399; PC64LE-NEXT:    bl exp2f
3400; PC64LE-NEXT:    nop
3401; PC64LE-NEXT:    addis 3, 2, .LCPI57_2@toc@ha
3402; PC64LE-NEXT:    fmr 30, 1
3403; PC64LE-NEXT:    lfs 1, .LCPI57_2@toc@l(3)
3404; PC64LE-NEXT:    bl exp2f
3405; PC64LE-NEXT:    nop
3406; PC64LE-NEXT:    xscvdpspn 0, 30
3407; PC64LE-NEXT:    addis 3, 2, .LCPI57_3@toc@ha
3408; PC64LE-NEXT:    xscvdpspn 1, 1
3409; PC64LE-NEXT:    addi 3, 3, .LCPI57_3@toc@l
3410; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
3411; PC64LE-NEXT:    xscvdpspn 0, 31
3412; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
3413; PC64LE-NEXT:    vmrghw 2, 2, 3
3414; PC64LE-NEXT:    lvx 3, 0, 3
3415; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
3416; PC64LE-NEXT:    vperm 2, 4, 2, 3
3417; PC64LE-NEXT:    addi 1, 1, 48
3418; PC64LE-NEXT:    ld 0, 16(1)
3419; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
3420; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
3421; PC64LE-NEXT:    mtlr 0
3422; PC64LE-NEXT:    blr
3423;
3424; PC64LE9-LABEL: constrained_vector_exp2_v3f32:
3425; PC64LE9:       # %bb.0: # %entry
3426; PC64LE9-NEXT:    mflr 0
3427; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
3428; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
3429; PC64LE9-NEXT:    std 0, 16(1)
3430; PC64LE9-NEXT:    stdu 1, -48(1)
3431; PC64LE9-NEXT:    addis 3, 2, .LCPI57_0@toc@ha
3432; PC64LE9-NEXT:    lfs 1, .LCPI57_0@toc@l(3)
3433; PC64LE9-NEXT:    bl exp2f
3434; PC64LE9-NEXT:    nop
3435; PC64LE9-NEXT:    addis 3, 2, .LCPI57_1@toc@ha
3436; PC64LE9-NEXT:    fmr 31, 1
3437; PC64LE9-NEXT:    lfs 1, .LCPI57_1@toc@l(3)
3438; PC64LE9-NEXT:    bl exp2f
3439; PC64LE9-NEXT:    nop
3440; PC64LE9-NEXT:    addis 3, 2, .LCPI57_2@toc@ha
3441; PC64LE9-NEXT:    fmr 30, 1
3442; PC64LE9-NEXT:    lfs 1, .LCPI57_2@toc@l(3)
3443; PC64LE9-NEXT:    bl exp2f
3444; PC64LE9-NEXT:    nop
3445; PC64LE9-NEXT:    xscvdpspn 0, 1
3446; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
3447; PC64LE9-NEXT:    xscvdpspn 0, 30
3448; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
3449; PC64LE9-NEXT:    xscvdpspn 0, 31
3450; PC64LE9-NEXT:    addis 3, 2, .LCPI57_3@toc@ha
3451; PC64LE9-NEXT:    addi 3, 3, .LCPI57_3@toc@l
3452; PC64LE9-NEXT:    vmrghw 2, 3, 2
3453; PC64LE9-NEXT:    lxvx 35, 0, 3
3454; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
3455; PC64LE9-NEXT:    vperm 2, 4, 2, 3
3456; PC64LE9-NEXT:    addi 1, 1, 48
3457; PC64LE9-NEXT:    ld 0, 16(1)
3458; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
3459; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
3460; PC64LE9-NEXT:    mtlr 0
3461; PC64LE9-NEXT:    blr
3462entry:
3463  %exp2 = call <3 x float> @llvm.experimental.constrained.exp2.v3f32(
3464                              <3 x float> <float 42.0, float 43.0, float 44.0>,
3465                              metadata !"round.dynamic",
3466                              metadata !"fpexcept.strict") #1
3467  ret <3 x float> %exp2
3468}
3469
3470define <3 x double> @constrained_vector_exp2_v3f64() #0 {
3471; PC64LE-LABEL: constrained_vector_exp2_v3f64:
3472; PC64LE:       # %bb.0: # %entry
3473; PC64LE-NEXT:    mflr 0
3474; PC64LE-NEXT:    std 0, 16(1)
3475; PC64LE-NEXT:    stdu 1, -80(1)
3476; PC64LE-NEXT:    li 3, 64
3477; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3478; PC64LE-NEXT:    addis 3, 2, .LCPI58_0@toc@ha
3479; PC64LE-NEXT:    lfd 1, .LCPI58_0@toc@l(3)
3480; PC64LE-NEXT:    bl exp2
3481; PC64LE-NEXT:    nop
3482; PC64LE-NEXT:    li 3, 48
3483; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3484; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3485; PC64LE-NEXT:    addis 3, 2, .LCPI58_1@toc@ha
3486; PC64LE-NEXT:    lfs 1, .LCPI58_1@toc@l(3)
3487; PC64LE-NEXT:    bl exp2
3488; PC64LE-NEXT:    nop
3489; PC64LE-NEXT:    li 3, 48
3490; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3491; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3492; PC64LE-NEXT:    addis 3, 2, .LCPI58_2@toc@ha
3493; PC64LE-NEXT:    xxmrghd 63, 0, 1
3494; PC64LE-NEXT:    lfd 1, .LCPI58_2@toc@l(3)
3495; PC64LE-NEXT:    bl exp2
3496; PC64LE-NEXT:    nop
3497; PC64LE-NEXT:    xxswapd 0, 63
3498; PC64LE-NEXT:    li 3, 64
3499; PC64LE-NEXT:    xxlor 2, 63, 63
3500; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3501; PC64LE-NEXT:    fmr 3, 1
3502; PC64LE-NEXT:    fmr 1, 0
3503; PC64LE-NEXT:    addi 1, 1, 80
3504; PC64LE-NEXT:    ld 0, 16(1)
3505; PC64LE-NEXT:    mtlr 0
3506; PC64LE-NEXT:    blr
3507;
3508; PC64LE9-LABEL: constrained_vector_exp2_v3f64:
3509; PC64LE9:       # %bb.0: # %entry
3510; PC64LE9-NEXT:    mflr 0
3511; PC64LE9-NEXT:    std 0, 16(1)
3512; PC64LE9-NEXT:    stdu 1, -64(1)
3513; PC64LE9-NEXT:    addis 3, 2, .LCPI58_0@toc@ha
3514; PC64LE9-NEXT:    lfd 1, .LCPI58_0@toc@l(3)
3515; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3516; PC64LE9-NEXT:    bl exp2
3517; PC64LE9-NEXT:    nop
3518; PC64LE9-NEXT:    addis 3, 2, .LCPI58_1@toc@ha
3519; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3520; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3521; PC64LE9-NEXT:    lfs 1, .LCPI58_1@toc@l(3)
3522; PC64LE9-NEXT:    bl exp2
3523; PC64LE9-NEXT:    nop
3524; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3525; PC64LE9-NEXT:    addis 3, 2, .LCPI58_2@toc@ha
3526; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3527; PC64LE9-NEXT:    xxmrghd 63, 0, 1
3528; PC64LE9-NEXT:    lfd 1, .LCPI58_2@toc@l(3)
3529; PC64LE9-NEXT:    bl exp2
3530; PC64LE9-NEXT:    nop
3531; PC64LE9-NEXT:    fmr 3, 1
3532; PC64LE9-NEXT:    xxswapd 1, 63
3533; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
3534; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3535; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3536; PC64LE9-NEXT:    addi 1, 1, 64
3537; PC64LE9-NEXT:    ld 0, 16(1)
3538; PC64LE9-NEXT:    mtlr 0
3539; PC64LE9-NEXT:    blr
3540entry:
3541  %exp2 = call <3 x double> @llvm.experimental.constrained.exp2.v3f64(
3542                          <3 x double> <double 42.0, double 42.1, double 42.2>,
3543                          metadata !"round.dynamic",
3544                          metadata !"fpexcept.strict") #1
3545  ret <3 x double> %exp2
3546}
3547
3548define <4 x double> @constrained_vector_exp2_v4f64() #0 {
3549; PC64LE-LABEL: constrained_vector_exp2_v4f64:
3550; PC64LE:       # %bb.0: # %entry
3551; PC64LE-NEXT:    mflr 0
3552; PC64LE-NEXT:    std 0, 16(1)
3553; PC64LE-NEXT:    stdu 1, -80(1)
3554; PC64LE-NEXT:    li 3, 64
3555; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3556; PC64LE-NEXT:    addis 3, 2, .LCPI59_0@toc@ha
3557; PC64LE-NEXT:    lfd 1, .LCPI59_0@toc@l(3)
3558; PC64LE-NEXT:    bl exp2
3559; PC64LE-NEXT:    nop
3560; PC64LE-NEXT:    li 3, 48
3561; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3562; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3563; PC64LE-NEXT:    addis 3, 2, .LCPI59_1@toc@ha
3564; PC64LE-NEXT:    lfd 1, .LCPI59_1@toc@l(3)
3565; PC64LE-NEXT:    bl exp2
3566; PC64LE-NEXT:    nop
3567; PC64LE-NEXT:    li 3, 48
3568; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3569; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3570; PC64LE-NEXT:    addis 3, 2, .LCPI59_2@toc@ha
3571; PC64LE-NEXT:    xxmrghd 63, 1, 0
3572; PC64LE-NEXT:    lfd 1, .LCPI59_2@toc@l(3)
3573; PC64LE-NEXT:    bl exp2
3574; PC64LE-NEXT:    nop
3575; PC64LE-NEXT:    li 3, 48
3576; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3577; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3578; PC64LE-NEXT:    addis 3, 2, .LCPI59_3@toc@ha
3579; PC64LE-NEXT:    lfd 1, .LCPI59_3@toc@l(3)
3580; PC64LE-NEXT:    bl exp2
3581; PC64LE-NEXT:    nop
3582; PC64LE-NEXT:    li 3, 48
3583; PC64LE-NEXT:    vmr 2, 31
3584; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3585; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3586; PC64LE-NEXT:    li 3, 64
3587; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3588; PC64LE-NEXT:    xxmrghd 35, 1, 0
3589; PC64LE-NEXT:    addi 1, 1, 80
3590; PC64LE-NEXT:    ld 0, 16(1)
3591; PC64LE-NEXT:    mtlr 0
3592; PC64LE-NEXT:    blr
3593;
3594; PC64LE9-LABEL: constrained_vector_exp2_v4f64:
3595; PC64LE9:       # %bb.0: # %entry
3596; PC64LE9-NEXT:    mflr 0
3597; PC64LE9-NEXT:    std 0, 16(1)
3598; PC64LE9-NEXT:    stdu 1, -64(1)
3599; PC64LE9-NEXT:    addis 3, 2, .LCPI59_0@toc@ha
3600; PC64LE9-NEXT:    lfd 1, .LCPI59_0@toc@l(3)
3601; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3602; PC64LE9-NEXT:    bl exp2
3603; PC64LE9-NEXT:    nop
3604; PC64LE9-NEXT:    addis 3, 2, .LCPI59_1@toc@ha
3605; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3606; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3607; PC64LE9-NEXT:    lfd 1, .LCPI59_1@toc@l(3)
3608; PC64LE9-NEXT:    bl exp2
3609; PC64LE9-NEXT:    nop
3610; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3611; PC64LE9-NEXT:    addis 3, 2, .LCPI59_2@toc@ha
3612; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3613; PC64LE9-NEXT:    xxmrghd 63, 1, 0
3614; PC64LE9-NEXT:    lfd 1, .LCPI59_2@toc@l(3)
3615; PC64LE9-NEXT:    bl exp2
3616; PC64LE9-NEXT:    nop
3617; PC64LE9-NEXT:    addis 3, 2, .LCPI59_3@toc@ha
3618; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3619; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3620; PC64LE9-NEXT:    lfd 1, .LCPI59_3@toc@l(3)
3621; PC64LE9-NEXT:    bl exp2
3622; PC64LE9-NEXT:    nop
3623; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3624; PC64LE9-NEXT:    vmr 2, 31
3625; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3626; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3627; PC64LE9-NEXT:    xxmrghd 35, 1, 0
3628; PC64LE9-NEXT:    addi 1, 1, 64
3629; PC64LE9-NEXT:    ld 0, 16(1)
3630; PC64LE9-NEXT:    mtlr 0
3631; PC64LE9-NEXT:    blr
3632entry:
3633  %exp2 = call <4 x double> @llvm.experimental.constrained.exp2.v4f64(
3634                              <4 x double> <double 42.1, double 42.2,
3635                                            double 42.3, double 42.4>,
3636                              metadata !"round.dynamic",
3637                              metadata !"fpexcept.strict") #1
3638  ret <4 x double> %exp2
3639}
3640
3641define <1 x float> @constrained_vector_log_v1f32() #0 {
3642; PC64LE-LABEL: constrained_vector_log_v1f32:
3643; PC64LE:       # %bb.0: # %entry
3644; PC64LE-NEXT:    mflr 0
3645; PC64LE-NEXT:    std 0, 16(1)
3646; PC64LE-NEXT:    stdu 1, -32(1)
3647; PC64LE-NEXT:    addis 3, 2, .LCPI60_0@toc@ha
3648; PC64LE-NEXT:    lfs 1, .LCPI60_0@toc@l(3)
3649; PC64LE-NEXT:    bl logf
3650; PC64LE-NEXT:    nop
3651; PC64LE-NEXT:    addi 1, 1, 32
3652; PC64LE-NEXT:    ld 0, 16(1)
3653; PC64LE-NEXT:    mtlr 0
3654; PC64LE-NEXT:    blr
3655;
3656; PC64LE9-LABEL: constrained_vector_log_v1f32:
3657; PC64LE9:       # %bb.0: # %entry
3658; PC64LE9-NEXT:    mflr 0
3659; PC64LE9-NEXT:    std 0, 16(1)
3660; PC64LE9-NEXT:    stdu 1, -32(1)
3661; PC64LE9-NEXT:    addis 3, 2, .LCPI60_0@toc@ha
3662; PC64LE9-NEXT:    lfs 1, .LCPI60_0@toc@l(3)
3663; PC64LE9-NEXT:    bl logf
3664; PC64LE9-NEXT:    nop
3665; PC64LE9-NEXT:    addi 1, 1, 32
3666; PC64LE9-NEXT:    ld 0, 16(1)
3667; PC64LE9-NEXT:    mtlr 0
3668; PC64LE9-NEXT:    blr
3669entry:
3670  %log = call <1 x float> @llvm.experimental.constrained.log.v1f32(
3671                             <1 x float> <float 42.0>,
3672                             metadata !"round.dynamic",
3673                             metadata !"fpexcept.strict") #1
3674  ret <1 x float> %log
3675}
3676
3677define <2 x double> @constrained_vector_log_v2f64() #0 {
3678; PC64LE-LABEL: constrained_vector_log_v2f64:
3679; PC64LE:       # %bb.0: # %entry
3680; PC64LE-NEXT:    mflr 0
3681; PC64LE-NEXT:    std 0, 16(1)
3682; PC64LE-NEXT:    stdu 1, -64(1)
3683; PC64LE-NEXT:    addis 3, 2, .LCPI61_0@toc@ha
3684; PC64LE-NEXT:    lfd 1, .LCPI61_0@toc@l(3)
3685; PC64LE-NEXT:    bl log
3686; PC64LE-NEXT:    nop
3687; PC64LE-NEXT:    li 3, 48
3688; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3689; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3690; PC64LE-NEXT:    addis 3, 2, .LCPI61_1@toc@ha
3691; PC64LE-NEXT:    lfs 1, .LCPI61_1@toc@l(3)
3692; PC64LE-NEXT:    bl log
3693; PC64LE-NEXT:    nop
3694; PC64LE-NEXT:    li 3, 48
3695; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3696; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3697; PC64LE-NEXT:    xxmrghd 34, 0, 1
3698; PC64LE-NEXT:    addi 1, 1, 64
3699; PC64LE-NEXT:    ld 0, 16(1)
3700; PC64LE-NEXT:    mtlr 0
3701; PC64LE-NEXT:    blr
3702;
3703; PC64LE9-LABEL: constrained_vector_log_v2f64:
3704; PC64LE9:       # %bb.0: # %entry
3705; PC64LE9-NEXT:    mflr 0
3706; PC64LE9-NEXT:    std 0, 16(1)
3707; PC64LE9-NEXT:    stdu 1, -48(1)
3708; PC64LE9-NEXT:    addis 3, 2, .LCPI61_0@toc@ha
3709; PC64LE9-NEXT:    lfd 1, .LCPI61_0@toc@l(3)
3710; PC64LE9-NEXT:    bl log
3711; PC64LE9-NEXT:    nop
3712; PC64LE9-NEXT:    addis 3, 2, .LCPI61_1@toc@ha
3713; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3714; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3715; PC64LE9-NEXT:    lfs 1, .LCPI61_1@toc@l(3)
3716; PC64LE9-NEXT:    bl log
3717; PC64LE9-NEXT:    nop
3718; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3719; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3720; PC64LE9-NEXT:    xxmrghd 34, 0, 1
3721; PC64LE9-NEXT:    addi 1, 1, 48
3722; PC64LE9-NEXT:    ld 0, 16(1)
3723; PC64LE9-NEXT:    mtlr 0
3724; PC64LE9-NEXT:    blr
3725entry:
3726  %log = call <2 x double> @llvm.experimental.constrained.log.v2f64(
3727                             <2 x double> <double 42.0, double 42.1>,
3728                             metadata !"round.dynamic",
3729                             metadata !"fpexcept.strict") #1
3730  ret <2 x double> %log
3731}
3732
3733define <3 x float> @constrained_vector_log_v3f32() #0 {
3734; PC64LE-LABEL: constrained_vector_log_v3f32:
3735; PC64LE:       # %bb.0: # %entry
3736; PC64LE-NEXT:    mflr 0
3737; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
3738; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
3739; PC64LE-NEXT:    std 0, 16(1)
3740; PC64LE-NEXT:    stdu 1, -48(1)
3741; PC64LE-NEXT:    addis 3, 2, .LCPI62_0@toc@ha
3742; PC64LE-NEXT:    lfs 1, .LCPI62_0@toc@l(3)
3743; PC64LE-NEXT:    bl logf
3744; PC64LE-NEXT:    nop
3745; PC64LE-NEXT:    addis 3, 2, .LCPI62_1@toc@ha
3746; PC64LE-NEXT:    fmr 31, 1
3747; PC64LE-NEXT:    lfs 1, .LCPI62_1@toc@l(3)
3748; PC64LE-NEXT:    bl logf
3749; PC64LE-NEXT:    nop
3750; PC64LE-NEXT:    addis 3, 2, .LCPI62_2@toc@ha
3751; PC64LE-NEXT:    fmr 30, 1
3752; PC64LE-NEXT:    lfs 1, .LCPI62_2@toc@l(3)
3753; PC64LE-NEXT:    bl logf
3754; PC64LE-NEXT:    nop
3755; PC64LE-NEXT:    xscvdpspn 0, 30
3756; PC64LE-NEXT:    addis 3, 2, .LCPI62_3@toc@ha
3757; PC64LE-NEXT:    xscvdpspn 1, 1
3758; PC64LE-NEXT:    addi 3, 3, .LCPI62_3@toc@l
3759; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
3760; PC64LE-NEXT:    xscvdpspn 0, 31
3761; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
3762; PC64LE-NEXT:    vmrghw 2, 2, 3
3763; PC64LE-NEXT:    lvx 3, 0, 3
3764; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
3765; PC64LE-NEXT:    vperm 2, 4, 2, 3
3766; PC64LE-NEXT:    addi 1, 1, 48
3767; PC64LE-NEXT:    ld 0, 16(1)
3768; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
3769; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
3770; PC64LE-NEXT:    mtlr 0
3771; PC64LE-NEXT:    blr
3772;
3773; PC64LE9-LABEL: constrained_vector_log_v3f32:
3774; PC64LE9:       # %bb.0: # %entry
3775; PC64LE9-NEXT:    mflr 0
3776; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
3777; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
3778; PC64LE9-NEXT:    std 0, 16(1)
3779; PC64LE9-NEXT:    stdu 1, -48(1)
3780; PC64LE9-NEXT:    addis 3, 2, .LCPI62_0@toc@ha
3781; PC64LE9-NEXT:    lfs 1, .LCPI62_0@toc@l(3)
3782; PC64LE9-NEXT:    bl logf
3783; PC64LE9-NEXT:    nop
3784; PC64LE9-NEXT:    addis 3, 2, .LCPI62_1@toc@ha
3785; PC64LE9-NEXT:    fmr 31, 1
3786; PC64LE9-NEXT:    lfs 1, .LCPI62_1@toc@l(3)
3787; PC64LE9-NEXT:    bl logf
3788; PC64LE9-NEXT:    nop
3789; PC64LE9-NEXT:    addis 3, 2, .LCPI62_2@toc@ha
3790; PC64LE9-NEXT:    fmr 30, 1
3791; PC64LE9-NEXT:    lfs 1, .LCPI62_2@toc@l(3)
3792; PC64LE9-NEXT:    bl logf
3793; PC64LE9-NEXT:    nop
3794; PC64LE9-NEXT:    xscvdpspn 0, 1
3795; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
3796; PC64LE9-NEXT:    xscvdpspn 0, 30
3797; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
3798; PC64LE9-NEXT:    xscvdpspn 0, 31
3799; PC64LE9-NEXT:    addis 3, 2, .LCPI62_3@toc@ha
3800; PC64LE9-NEXT:    addi 3, 3, .LCPI62_3@toc@l
3801; PC64LE9-NEXT:    vmrghw 2, 3, 2
3802; PC64LE9-NEXT:    lxvx 35, 0, 3
3803; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
3804; PC64LE9-NEXT:    vperm 2, 4, 2, 3
3805; PC64LE9-NEXT:    addi 1, 1, 48
3806; PC64LE9-NEXT:    ld 0, 16(1)
3807; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
3808; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
3809; PC64LE9-NEXT:    mtlr 0
3810; PC64LE9-NEXT:    blr
3811entry:
3812  %log = call <3 x float> @llvm.experimental.constrained.log.v3f32(
3813                              <3 x float> <float 42.0, float 43.0, float 44.0>,
3814                              metadata !"round.dynamic",
3815                              metadata !"fpexcept.strict") #1
3816  ret <3 x float> %log
3817}
3818
3819define <3 x double> @constrained_vector_log_v3f64() #0 {
3820; PC64LE-LABEL: constrained_vector_log_v3f64:
3821; PC64LE:       # %bb.0: # %entry
3822; PC64LE-NEXT:    mflr 0
3823; PC64LE-NEXT:    std 0, 16(1)
3824; PC64LE-NEXT:    stdu 1, -80(1)
3825; PC64LE-NEXT:    li 3, 64
3826; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3827; PC64LE-NEXT:    addis 3, 2, .LCPI63_0@toc@ha
3828; PC64LE-NEXT:    lfd 1, .LCPI63_0@toc@l(3)
3829; PC64LE-NEXT:    bl log
3830; PC64LE-NEXT:    nop
3831; PC64LE-NEXT:    li 3, 48
3832; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3833; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3834; PC64LE-NEXT:    addis 3, 2, .LCPI63_1@toc@ha
3835; PC64LE-NEXT:    lfs 1, .LCPI63_1@toc@l(3)
3836; PC64LE-NEXT:    bl log
3837; PC64LE-NEXT:    nop
3838; PC64LE-NEXT:    li 3, 48
3839; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3840; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3841; PC64LE-NEXT:    addis 3, 2, .LCPI63_2@toc@ha
3842; PC64LE-NEXT:    xxmrghd 63, 0, 1
3843; PC64LE-NEXT:    lfd 1, .LCPI63_2@toc@l(3)
3844; PC64LE-NEXT:    bl log
3845; PC64LE-NEXT:    nop
3846; PC64LE-NEXT:    xxswapd 0, 63
3847; PC64LE-NEXT:    li 3, 64
3848; PC64LE-NEXT:    xxlor 2, 63, 63
3849; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3850; PC64LE-NEXT:    fmr 3, 1
3851; PC64LE-NEXT:    fmr 1, 0
3852; PC64LE-NEXT:    addi 1, 1, 80
3853; PC64LE-NEXT:    ld 0, 16(1)
3854; PC64LE-NEXT:    mtlr 0
3855; PC64LE-NEXT:    blr
3856;
3857; PC64LE9-LABEL: constrained_vector_log_v3f64:
3858; PC64LE9:       # %bb.0: # %entry
3859; PC64LE9-NEXT:    mflr 0
3860; PC64LE9-NEXT:    std 0, 16(1)
3861; PC64LE9-NEXT:    stdu 1, -64(1)
3862; PC64LE9-NEXT:    addis 3, 2, .LCPI63_0@toc@ha
3863; PC64LE9-NEXT:    lfd 1, .LCPI63_0@toc@l(3)
3864; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3865; PC64LE9-NEXT:    bl log
3866; PC64LE9-NEXT:    nop
3867; PC64LE9-NEXT:    addis 3, 2, .LCPI63_1@toc@ha
3868; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3869; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3870; PC64LE9-NEXT:    lfs 1, .LCPI63_1@toc@l(3)
3871; PC64LE9-NEXT:    bl log
3872; PC64LE9-NEXT:    nop
3873; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3874; PC64LE9-NEXT:    addis 3, 2, .LCPI63_2@toc@ha
3875; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3876; PC64LE9-NEXT:    xxmrghd 63, 0, 1
3877; PC64LE9-NEXT:    lfd 1, .LCPI63_2@toc@l(3)
3878; PC64LE9-NEXT:    bl log
3879; PC64LE9-NEXT:    nop
3880; PC64LE9-NEXT:    fmr 3, 1
3881; PC64LE9-NEXT:    xxswapd 1, 63
3882; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
3883; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3884; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3885; PC64LE9-NEXT:    addi 1, 1, 64
3886; PC64LE9-NEXT:    ld 0, 16(1)
3887; PC64LE9-NEXT:    mtlr 0
3888; PC64LE9-NEXT:    blr
3889entry:
3890  %log = call <3 x double> @llvm.experimental.constrained.log.v3f64(
3891                          <3 x double> <double 42.0, double 42.1, double 42.2>,
3892                          metadata !"round.dynamic",
3893                          metadata !"fpexcept.strict") #1
3894  ret <3 x double> %log
3895}
3896
3897define <4 x double> @constrained_vector_log_v4f64() #0 {
3898; PC64LE-LABEL: constrained_vector_log_v4f64:
3899; PC64LE:       # %bb.0: # %entry
3900; PC64LE-NEXT:    mflr 0
3901; PC64LE-NEXT:    std 0, 16(1)
3902; PC64LE-NEXT:    stdu 1, -80(1)
3903; PC64LE-NEXT:    li 3, 64
3904; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3905; PC64LE-NEXT:    addis 3, 2, .LCPI64_0@toc@ha
3906; PC64LE-NEXT:    lfd 1, .LCPI64_0@toc@l(3)
3907; PC64LE-NEXT:    bl log
3908; PC64LE-NEXT:    nop
3909; PC64LE-NEXT:    li 3, 48
3910; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3911; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3912; PC64LE-NEXT:    addis 3, 2, .LCPI64_1@toc@ha
3913; PC64LE-NEXT:    lfd 1, .LCPI64_1@toc@l(3)
3914; PC64LE-NEXT:    bl log
3915; PC64LE-NEXT:    nop
3916; PC64LE-NEXT:    li 3, 48
3917; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3918; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3919; PC64LE-NEXT:    addis 3, 2, .LCPI64_2@toc@ha
3920; PC64LE-NEXT:    xxmrghd 63, 1, 0
3921; PC64LE-NEXT:    lfd 1, .LCPI64_2@toc@l(3)
3922; PC64LE-NEXT:    bl log
3923; PC64LE-NEXT:    nop
3924; PC64LE-NEXT:    li 3, 48
3925; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3926; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
3927; PC64LE-NEXT:    addis 3, 2, .LCPI64_3@toc@ha
3928; PC64LE-NEXT:    lfs 1, .LCPI64_3@toc@l(3)
3929; PC64LE-NEXT:    bl log
3930; PC64LE-NEXT:    nop
3931; PC64LE-NEXT:    li 3, 48
3932; PC64LE-NEXT:    vmr 3, 31
3933; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3934; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
3935; PC64LE-NEXT:    li 3, 64
3936; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3937; PC64LE-NEXT:    xxmrghd 34, 0, 1
3938; PC64LE-NEXT:    addi 1, 1, 80
3939; PC64LE-NEXT:    ld 0, 16(1)
3940; PC64LE-NEXT:    mtlr 0
3941; PC64LE-NEXT:    blr
3942;
3943; PC64LE9-LABEL: constrained_vector_log_v4f64:
3944; PC64LE9:       # %bb.0: # %entry
3945; PC64LE9-NEXT:    mflr 0
3946; PC64LE9-NEXT:    std 0, 16(1)
3947; PC64LE9-NEXT:    stdu 1, -64(1)
3948; PC64LE9-NEXT:    addis 3, 2, .LCPI64_0@toc@ha
3949; PC64LE9-NEXT:    lfd 1, .LCPI64_0@toc@l(3)
3950; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3951; PC64LE9-NEXT:    bl log
3952; PC64LE9-NEXT:    nop
3953; PC64LE9-NEXT:    addis 3, 2, .LCPI64_1@toc@ha
3954; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3955; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3956; PC64LE9-NEXT:    lfd 1, .LCPI64_1@toc@l(3)
3957; PC64LE9-NEXT:    bl log
3958; PC64LE9-NEXT:    nop
3959; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3960; PC64LE9-NEXT:    addis 3, 2, .LCPI64_2@toc@ha
3961; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3962; PC64LE9-NEXT:    xxmrghd 63, 1, 0
3963; PC64LE9-NEXT:    lfd 1, .LCPI64_2@toc@l(3)
3964; PC64LE9-NEXT:    bl log
3965; PC64LE9-NEXT:    nop
3966; PC64LE9-NEXT:    addis 3, 2, .LCPI64_3@toc@ha
3967; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3968; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
3969; PC64LE9-NEXT:    lfs 1, .LCPI64_3@toc@l(3)
3970; PC64LE9-NEXT:    bl log
3971; PC64LE9-NEXT:    nop
3972; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
3973; PC64LE9-NEXT:    vmr 3, 31
3974; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3975; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3976; PC64LE9-NEXT:    xxmrghd 34, 0, 1
3977; PC64LE9-NEXT:    addi 1, 1, 64
3978; PC64LE9-NEXT:    ld 0, 16(1)
3979; PC64LE9-NEXT:    mtlr 0
3980; PC64LE9-NEXT:    blr
3981entry:
3982  %log = call <4 x double> @llvm.experimental.constrained.log.v4f64(
3983                             <4 x double> <double 42.0, double 42.1,
3984                                           double 42.2, double 42.3>,
3985                             metadata !"round.dynamic",
3986                             metadata !"fpexcept.strict") #1
3987  ret <4 x double> %log
3988}
3989
3990define <1 x float> @constrained_vector_log10_v1f32() #0 {
3991; PC64LE-LABEL: constrained_vector_log10_v1f32:
3992; PC64LE:       # %bb.0: # %entry
3993; PC64LE-NEXT:    mflr 0
3994; PC64LE-NEXT:    std 0, 16(1)
3995; PC64LE-NEXT:    stdu 1, -32(1)
3996; PC64LE-NEXT:    addis 3, 2, .LCPI65_0@toc@ha
3997; PC64LE-NEXT:    lfs 1, .LCPI65_0@toc@l(3)
3998; PC64LE-NEXT:    bl log10f
3999; PC64LE-NEXT:    nop
4000; PC64LE-NEXT:    addi 1, 1, 32
4001; PC64LE-NEXT:    ld 0, 16(1)
4002; PC64LE-NEXT:    mtlr 0
4003; PC64LE-NEXT:    blr
4004;
4005; PC64LE9-LABEL: constrained_vector_log10_v1f32:
4006; PC64LE9:       # %bb.0: # %entry
4007; PC64LE9-NEXT:    mflr 0
4008; PC64LE9-NEXT:    std 0, 16(1)
4009; PC64LE9-NEXT:    stdu 1, -32(1)
4010; PC64LE9-NEXT:    addis 3, 2, .LCPI65_0@toc@ha
4011; PC64LE9-NEXT:    lfs 1, .LCPI65_0@toc@l(3)
4012; PC64LE9-NEXT:    bl log10f
4013; PC64LE9-NEXT:    nop
4014; PC64LE9-NEXT:    addi 1, 1, 32
4015; PC64LE9-NEXT:    ld 0, 16(1)
4016; PC64LE9-NEXT:    mtlr 0
4017; PC64LE9-NEXT:    blr
4018entry:
4019  %log10 = call <1 x float> @llvm.experimental.constrained.log10.v1f32(
4020                             <1 x float> <float 42.0>,
4021                             metadata !"round.dynamic",
4022                             metadata !"fpexcept.strict") #1
4023  ret <1 x float> %log10
4024}
4025
4026define <2 x double> @constrained_vector_log10_v2f64() #0 {
4027; PC64LE-LABEL: constrained_vector_log10_v2f64:
4028; PC64LE:       # %bb.0: # %entry
4029; PC64LE-NEXT:    mflr 0
4030; PC64LE-NEXT:    std 0, 16(1)
4031; PC64LE-NEXT:    stdu 1, -64(1)
4032; PC64LE-NEXT:    addis 3, 2, .LCPI66_0@toc@ha
4033; PC64LE-NEXT:    lfd 1, .LCPI66_0@toc@l(3)
4034; PC64LE-NEXT:    bl log10
4035; PC64LE-NEXT:    nop
4036; PC64LE-NEXT:    li 3, 48
4037; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4038; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
4039; PC64LE-NEXT:    addis 3, 2, .LCPI66_1@toc@ha
4040; PC64LE-NEXT:    lfs 1, .LCPI66_1@toc@l(3)
4041; PC64LE-NEXT:    bl log10
4042; PC64LE-NEXT:    nop
4043; PC64LE-NEXT:    li 3, 48
4044; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4045; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
4046; PC64LE-NEXT:    xxmrghd 34, 0, 1
4047; PC64LE-NEXT:    addi 1, 1, 64
4048; PC64LE-NEXT:    ld 0, 16(1)
4049; PC64LE-NEXT:    mtlr 0
4050; PC64LE-NEXT:    blr
4051;
4052; PC64LE9-LABEL: constrained_vector_log10_v2f64:
4053; PC64LE9:       # %bb.0: # %entry
4054; PC64LE9-NEXT:    mflr 0
4055; PC64LE9-NEXT:    std 0, 16(1)
4056; PC64LE9-NEXT:    stdu 1, -48(1)
4057; PC64LE9-NEXT:    addis 3, 2, .LCPI66_0@toc@ha
4058; PC64LE9-NEXT:    lfd 1, .LCPI66_0@toc@l(3)
4059; PC64LE9-NEXT:    bl log10
4060; PC64LE9-NEXT:    nop
4061; PC64LE9-NEXT:    addis 3, 2, .LCPI66_1@toc@ha
4062; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4063; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
4064; PC64LE9-NEXT:    lfs 1, .LCPI66_1@toc@l(3)
4065; PC64LE9-NEXT:    bl log10
4066; PC64LE9-NEXT:    nop
4067; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
4068; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4069; PC64LE9-NEXT:    xxmrghd 34, 0, 1
4070; PC64LE9-NEXT:    addi 1, 1, 48
4071; PC64LE9-NEXT:    ld 0, 16(1)
4072; PC64LE9-NEXT:    mtlr 0
4073; PC64LE9-NEXT:    blr
4074entry:
4075  %log10 = call <2 x double> @llvm.experimental.constrained.log10.v2f64(
4076                               <2 x double> <double 42.0, double 42.1>,
4077                               metadata !"round.dynamic",
4078                               metadata !"fpexcept.strict") #1
4079  ret <2 x double> %log10
4080}
4081
4082define <3 x float> @constrained_vector_log10_v3f32() #0 {
4083; PC64LE-LABEL: constrained_vector_log10_v3f32:
4084; PC64LE:       # %bb.0: # %entry
4085; PC64LE-NEXT:    mflr 0
4086; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
4087; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
4088; PC64LE-NEXT:    std 0, 16(1)
4089; PC64LE-NEXT:    stdu 1, -48(1)
4090; PC64LE-NEXT:    addis 3, 2, .LCPI67_0@toc@ha
4091; PC64LE-NEXT:    lfs 1, .LCPI67_0@toc@l(3)
4092; PC64LE-NEXT:    bl log10f
4093; PC64LE-NEXT:    nop
4094; PC64LE-NEXT:    addis 3, 2, .LCPI67_1@toc@ha
4095; PC64LE-NEXT:    fmr 31, 1
4096; PC64LE-NEXT:    lfs 1, .LCPI67_1@toc@l(3)
4097; PC64LE-NEXT:    bl log10f
4098; PC64LE-NEXT:    nop
4099; PC64LE-NEXT:    addis 3, 2, .LCPI67_2@toc@ha
4100; PC64LE-NEXT:    fmr 30, 1
4101; PC64LE-NEXT:    lfs 1, .LCPI67_2@toc@l(3)
4102; PC64LE-NEXT:    bl log10f
4103; PC64LE-NEXT:    nop
4104; PC64LE-NEXT:    xscvdpspn 0, 30
4105; PC64LE-NEXT:    addis 3, 2, .LCPI67_3@toc@ha
4106; PC64LE-NEXT:    xscvdpspn 1, 1
4107; PC64LE-NEXT:    addi 3, 3, .LCPI67_3@toc@l
4108; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
4109; PC64LE-NEXT:    xscvdpspn 0, 31
4110; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
4111; PC64LE-NEXT:    vmrghw 2, 2, 3
4112; PC64LE-NEXT:    lvx 3, 0, 3
4113; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
4114; PC64LE-NEXT:    vperm 2, 4, 2, 3
4115; PC64LE-NEXT:    addi 1, 1, 48
4116; PC64LE-NEXT:    ld 0, 16(1)
4117; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
4118; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
4119; PC64LE-NEXT:    mtlr 0
4120; PC64LE-NEXT:    blr
4121;
4122; PC64LE9-LABEL: constrained_vector_log10_v3f32:
4123; PC64LE9:       # %bb.0: # %entry
4124; PC64LE9-NEXT:    mflr 0
4125; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
4126; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
4127; PC64LE9-NEXT:    std 0, 16(1)
4128; PC64LE9-NEXT:    stdu 1, -48(1)
4129; PC64LE9-NEXT:    addis 3, 2, .LCPI67_0@toc@ha
4130; PC64LE9-NEXT:    lfs 1, .LCPI67_0@toc@l(3)
4131; PC64LE9-NEXT:    bl log10f
4132; PC64LE9-NEXT:    nop
4133; PC64LE9-NEXT:    addis 3, 2, .LCPI67_1@toc@ha
4134; PC64LE9-NEXT:    fmr 31, 1
4135; PC64LE9-NEXT:    lfs 1, .LCPI67_1@toc@l(3)
4136; PC64LE9-NEXT:    bl log10f
4137; PC64LE9-NEXT:    nop
4138; PC64LE9-NEXT:    addis 3, 2, .LCPI67_2@toc@ha
4139; PC64LE9-NEXT:    fmr 30, 1
4140; PC64LE9-NEXT:    lfs 1, .LCPI67_2@toc@l(3)
4141; PC64LE9-NEXT:    bl log10f
4142; PC64LE9-NEXT:    nop
4143; PC64LE9-NEXT:    xscvdpspn 0, 1
4144; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
4145; PC64LE9-NEXT:    xscvdpspn 0, 30
4146; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
4147; PC64LE9-NEXT:    xscvdpspn 0, 31
4148; PC64LE9-NEXT:    addis 3, 2, .LCPI67_3@toc@ha
4149; PC64LE9-NEXT:    addi 3, 3, .LCPI67_3@toc@l
4150; PC64LE9-NEXT:    vmrghw 2, 3, 2
4151; PC64LE9-NEXT:    lxvx 35, 0, 3
4152; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
4153; PC64LE9-NEXT:    vperm 2, 4, 2, 3
4154; PC64LE9-NEXT:    addi 1, 1, 48
4155; PC64LE9-NEXT:    ld 0, 16(1)
4156; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
4157; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
4158; PC64LE9-NEXT:    mtlr 0
4159; PC64LE9-NEXT:    blr
4160entry:
4161  %log10 = call <3 x float> @llvm.experimental.constrained.log10.v3f32(
4162                              <3 x float> <float 42.0, float 43.0, float 44.0>,
4163                              metadata !"round.dynamic",
4164                              metadata !"fpexcept.strict") #1
4165  ret <3 x float> %log10
4166}
4167
4168define <3 x double> @constrained_vector_log10_v3f64() #0 {
4169; PC64LE-LABEL: constrained_vector_log10_v3f64:
4170; PC64LE:       # %bb.0: # %entry
4171; PC64LE-NEXT:    mflr 0
4172; PC64LE-NEXT:    std 0, 16(1)
4173; PC64LE-NEXT:    stdu 1, -80(1)
4174; PC64LE-NEXT:    li 3, 64
4175; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4176; PC64LE-NEXT:    addis 3, 2, .LCPI68_0@toc@ha
4177; PC64LE-NEXT:    lfd 1, .LCPI68_0@toc@l(3)
4178; PC64LE-NEXT:    bl log10
4179; PC64LE-NEXT:    nop
4180; PC64LE-NEXT:    li 3, 48
4181; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4182; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
4183; PC64LE-NEXT:    addis 3, 2, .LCPI68_1@toc@ha
4184; PC64LE-NEXT:    lfs 1, .LCPI68_1@toc@l(3)
4185; PC64LE-NEXT:    bl log10
4186; PC64LE-NEXT:    nop
4187; PC64LE-NEXT:    li 3, 48
4188; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4189; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
4190; PC64LE-NEXT:    addis 3, 2, .LCPI68_2@toc@ha
4191; PC64LE-NEXT:    xxmrghd 63, 0, 1
4192; PC64LE-NEXT:    lfd 1, .LCPI68_2@toc@l(3)
4193; PC64LE-NEXT:    bl log10
4194; PC64LE-NEXT:    nop
4195; PC64LE-NEXT:    xxswapd 0, 63
4196; PC64LE-NEXT:    li 3, 64
4197; PC64LE-NEXT:    xxlor 2, 63, 63
4198; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4199; PC64LE-NEXT:    fmr 3, 1
4200; PC64LE-NEXT:    fmr 1, 0
4201; PC64LE-NEXT:    addi 1, 1, 80
4202; PC64LE-NEXT:    ld 0, 16(1)
4203; PC64LE-NEXT:    mtlr 0
4204; PC64LE-NEXT:    blr
4205;
4206; PC64LE9-LABEL: constrained_vector_log10_v3f64:
4207; PC64LE9:       # %bb.0: # %entry
4208; PC64LE9-NEXT:    mflr 0
4209; PC64LE9-NEXT:    std 0, 16(1)
4210; PC64LE9-NEXT:    stdu 1, -64(1)
4211; PC64LE9-NEXT:    addis 3, 2, .LCPI68_0@toc@ha
4212; PC64LE9-NEXT:    lfd 1, .LCPI68_0@toc@l(3)
4213; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
4214; PC64LE9-NEXT:    bl log10
4215; PC64LE9-NEXT:    nop
4216; PC64LE9-NEXT:    addis 3, 2, .LCPI68_1@toc@ha
4217; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4218; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
4219; PC64LE9-NEXT:    lfs 1, .LCPI68_1@toc@l(3)
4220; PC64LE9-NEXT:    bl log10
4221; PC64LE9-NEXT:    nop
4222; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
4223; PC64LE9-NEXT:    addis 3, 2, .LCPI68_2@toc@ha
4224; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4225; PC64LE9-NEXT:    xxmrghd 63, 0, 1
4226; PC64LE9-NEXT:    lfd 1, .LCPI68_2@toc@l(3)
4227; PC64LE9-NEXT:    bl log10
4228; PC64LE9-NEXT:    nop
4229; PC64LE9-NEXT:    fmr 3, 1
4230; PC64LE9-NEXT:    xxswapd 1, 63
4231; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
4232; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
4233; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4234; PC64LE9-NEXT:    addi 1, 1, 64
4235; PC64LE9-NEXT:    ld 0, 16(1)
4236; PC64LE9-NEXT:    mtlr 0
4237; PC64LE9-NEXT:    blr
4238entry:
4239  %log10 = call <3 x double> @llvm.experimental.constrained.log10.v3f64(
4240                          <3 x double> <double 42.0, double 42.1, double 42.2>,
4241                          metadata !"round.dynamic",
4242                          metadata !"fpexcept.strict") #1
4243  ret <3 x double> %log10
4244}
4245
4246define <4 x double> @constrained_vector_log10_v4f64() #0 {
4247; PC64LE-LABEL: constrained_vector_log10_v4f64:
4248; PC64LE:       # %bb.0: # %entry
4249; PC64LE-NEXT:    mflr 0
4250; PC64LE-NEXT:    std 0, 16(1)
4251; PC64LE-NEXT:    stdu 1, -80(1)
4252; PC64LE-NEXT:    li 3, 64
4253; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4254; PC64LE-NEXT:    addis 3, 2, .LCPI69_0@toc@ha
4255; PC64LE-NEXT:    lfd 1, .LCPI69_0@toc@l(3)
4256; PC64LE-NEXT:    bl log10
4257; PC64LE-NEXT:    nop
4258; PC64LE-NEXT:    li 3, 48
4259; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4260; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
4261; PC64LE-NEXT:    addis 3, 2, .LCPI69_1@toc@ha
4262; PC64LE-NEXT:    lfd 1, .LCPI69_1@toc@l(3)
4263; PC64LE-NEXT:    bl log10
4264; PC64LE-NEXT:    nop
4265; PC64LE-NEXT:    li 3, 48
4266; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4267; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
4268; PC64LE-NEXT:    addis 3, 2, .LCPI69_2@toc@ha
4269; PC64LE-NEXT:    xxmrghd 63, 1, 0
4270; PC64LE-NEXT:    lfd 1, .LCPI69_2@toc@l(3)
4271; PC64LE-NEXT:    bl log10
4272; PC64LE-NEXT:    nop
4273; PC64LE-NEXT:    li 3, 48
4274; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4275; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
4276; PC64LE-NEXT:    addis 3, 2, .LCPI69_3@toc@ha
4277; PC64LE-NEXT:    lfs 1, .LCPI69_3@toc@l(3)
4278; PC64LE-NEXT:    bl log10
4279; PC64LE-NEXT:    nop
4280; PC64LE-NEXT:    li 3, 48
4281; PC64LE-NEXT:    vmr 3, 31
4282; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4283; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
4284; PC64LE-NEXT:    li 3, 64
4285; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4286; PC64LE-NEXT:    xxmrghd 34, 0, 1
4287; PC64LE-NEXT:    addi 1, 1, 80
4288; PC64LE-NEXT:    ld 0, 16(1)
4289; PC64LE-NEXT:    mtlr 0
4290; PC64LE-NEXT:    blr
4291;
4292; PC64LE9-LABEL: constrained_vector_log10_v4f64:
4293; PC64LE9:       # %bb.0: # %entry
4294; PC64LE9-NEXT:    mflr 0
4295; PC64LE9-NEXT:    std 0, 16(1)
4296; PC64LE9-NEXT:    stdu 1, -64(1)
4297; PC64LE9-NEXT:    addis 3, 2, .LCPI69_0@toc@ha
4298; PC64LE9-NEXT:    lfd 1, .LCPI69_0@toc@l(3)
4299; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
4300; PC64LE9-NEXT:    bl log10
4301; PC64LE9-NEXT:    nop
4302; PC64LE9-NEXT:    addis 3, 2, .LCPI69_1@toc@ha
4303; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4304; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
4305; PC64LE9-NEXT:    lfd 1, .LCPI69_1@toc@l(3)
4306; PC64LE9-NEXT:    bl log10
4307; PC64LE9-NEXT:    nop
4308; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
4309; PC64LE9-NEXT:    addis 3, 2, .LCPI69_2@toc@ha
4310; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4311; PC64LE9-NEXT:    xxmrghd 63, 1, 0
4312; PC64LE9-NEXT:    lfd 1, .LCPI69_2@toc@l(3)
4313; PC64LE9-NEXT:    bl log10
4314; PC64LE9-NEXT:    nop
4315; PC64LE9-NEXT:    addis 3, 2, .LCPI69_3@toc@ha
4316; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4317; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
4318; PC64LE9-NEXT:    lfs 1, .LCPI69_3@toc@l(3)
4319; PC64LE9-NEXT:    bl log10
4320; PC64LE9-NEXT:    nop
4321; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
4322; PC64LE9-NEXT:    vmr 3, 31
4323; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
4324; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4325; PC64LE9-NEXT:    xxmrghd 34, 0, 1
4326; PC64LE9-NEXT:    addi 1, 1, 64
4327; PC64LE9-NEXT:    ld 0, 16(1)
4328; PC64LE9-NEXT:    mtlr 0
4329; PC64LE9-NEXT:    blr
4330entry:
4331  %log10 = call <4 x double> @llvm.experimental.constrained.log10.v4f64(
4332                               <4 x double> <double 42.0, double 42.1,
4333                                             double 42.2, double 42.3>,
4334                               metadata !"round.dynamic",
4335                               metadata !"fpexcept.strict") #1
4336  ret <4 x double> %log10
4337}
4338
4339define <1 x float> @constrained_vector_log2_v1f32() #0 {
4340; PC64LE-LABEL: constrained_vector_log2_v1f32:
4341; PC64LE:       # %bb.0: # %entry
4342; PC64LE-NEXT:    mflr 0
4343; PC64LE-NEXT:    std 0, 16(1)
4344; PC64LE-NEXT:    stdu 1, -32(1)
4345; PC64LE-NEXT:    addis 3, 2, .LCPI70_0@toc@ha
4346; PC64LE-NEXT:    lfs 1, .LCPI70_0@toc@l(3)
4347; PC64LE-NEXT:    bl log2f
4348; PC64LE-NEXT:    nop
4349; PC64LE-NEXT:    addi 1, 1, 32
4350; PC64LE-NEXT:    ld 0, 16(1)
4351; PC64LE-NEXT:    mtlr 0
4352; PC64LE-NEXT:    blr
4353;
4354; PC64LE9-LABEL: constrained_vector_log2_v1f32:
4355; PC64LE9:       # %bb.0: # %entry
4356; PC64LE9-NEXT:    mflr 0
4357; PC64LE9-NEXT:    std 0, 16(1)
4358; PC64LE9-NEXT:    stdu 1, -32(1)
4359; PC64LE9-NEXT:    addis 3, 2, .LCPI70_0@toc@ha
4360; PC64LE9-NEXT:    lfs 1, .LCPI70_0@toc@l(3)
4361; PC64LE9-NEXT:    bl log2f
4362; PC64LE9-NEXT:    nop
4363; PC64LE9-NEXT:    addi 1, 1, 32
4364; PC64LE9-NEXT:    ld 0, 16(1)
4365; PC64LE9-NEXT:    mtlr 0
4366; PC64LE9-NEXT:    blr
4367entry:
4368  %log2 = call <1 x float> @llvm.experimental.constrained.log2.v1f32(
4369                             <1 x float> <float 42.0>,
4370                             metadata !"round.dynamic",
4371                             metadata !"fpexcept.strict") #1
4372  ret <1 x float> %log2
4373}
4374
4375define <2 x double> @constrained_vector_log2_v2f64() #0 {
4376; PC64LE-LABEL: constrained_vector_log2_v2f64:
4377; PC64LE:       # %bb.0: # %entry
4378; PC64LE-NEXT:    mflr 0
4379; PC64LE-NEXT:    std 0, 16(1)
4380; PC64LE-NEXT:    stdu 1, -64(1)
4381; PC64LE-NEXT:    addis 3, 2, .LCPI71_0@toc@ha
4382; PC64LE-NEXT:    lfd 1, .LCPI71_0@toc@l(3)
4383; PC64LE-NEXT:    bl log2
4384; PC64LE-NEXT:    nop
4385; PC64LE-NEXT:    li 3, 48
4386; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4387; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
4388; PC64LE-NEXT:    addis 3, 2, .LCPI71_1@toc@ha
4389; PC64LE-NEXT:    lfs 1, .LCPI71_1@toc@l(3)
4390; PC64LE-NEXT:    bl log2
4391; PC64LE-NEXT:    nop
4392; PC64LE-NEXT:    li 3, 48
4393; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4394; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
4395; PC64LE-NEXT:    xxmrghd 34, 0, 1
4396; PC64LE-NEXT:    addi 1, 1, 64
4397; PC64LE-NEXT:    ld 0, 16(1)
4398; PC64LE-NEXT:    mtlr 0
4399; PC64LE-NEXT:    blr
4400;
4401; PC64LE9-LABEL: constrained_vector_log2_v2f64:
4402; PC64LE9:       # %bb.0: # %entry
4403; PC64LE9-NEXT:    mflr 0
4404; PC64LE9-NEXT:    std 0, 16(1)
4405; PC64LE9-NEXT:    stdu 1, -48(1)
4406; PC64LE9-NEXT:    addis 3, 2, .LCPI71_0@toc@ha
4407; PC64LE9-NEXT:    lfd 1, .LCPI71_0@toc@l(3)
4408; PC64LE9-NEXT:    bl log2
4409; PC64LE9-NEXT:    nop
4410; PC64LE9-NEXT:    addis 3, 2, .LCPI71_1@toc@ha
4411; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4412; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
4413; PC64LE9-NEXT:    lfs 1, .LCPI71_1@toc@l(3)
4414; PC64LE9-NEXT:    bl log2
4415; PC64LE9-NEXT:    nop
4416; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
4417; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4418; PC64LE9-NEXT:    xxmrghd 34, 0, 1
4419; PC64LE9-NEXT:    addi 1, 1, 48
4420; PC64LE9-NEXT:    ld 0, 16(1)
4421; PC64LE9-NEXT:    mtlr 0
4422; PC64LE9-NEXT:    blr
4423entry:
4424  %log2 = call <2 x double> @llvm.experimental.constrained.log2.v2f64(
4425                              <2 x double> <double 42.0, double 42.1>,
4426                              metadata !"round.dynamic",
4427                              metadata !"fpexcept.strict") #1
4428  ret <2 x double> %log2
4429}
4430
4431define <3 x float> @constrained_vector_log2_v3f32() #0 {
4432; PC64LE-LABEL: constrained_vector_log2_v3f32:
4433; PC64LE:       # %bb.0: # %entry
4434; PC64LE-NEXT:    mflr 0
4435; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
4436; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
4437; PC64LE-NEXT:    std 0, 16(1)
4438; PC64LE-NEXT:    stdu 1, -48(1)
4439; PC64LE-NEXT:    addis 3, 2, .LCPI72_0@toc@ha
4440; PC64LE-NEXT:    lfs 1, .LCPI72_0@toc@l(3)
4441; PC64LE-NEXT:    bl log2f
4442; PC64LE-NEXT:    nop
4443; PC64LE-NEXT:    addis 3, 2, .LCPI72_1@toc@ha
4444; PC64LE-NEXT:    fmr 31, 1
4445; PC64LE-NEXT:    lfs 1, .LCPI72_1@toc@l(3)
4446; PC64LE-NEXT:    bl log2f
4447; PC64LE-NEXT:    nop
4448; PC64LE-NEXT:    addis 3, 2, .LCPI72_2@toc@ha
4449; PC64LE-NEXT:    fmr 30, 1
4450; PC64LE-NEXT:    lfs 1, .LCPI72_2@toc@l(3)
4451; PC64LE-NEXT:    bl log2f
4452; PC64LE-NEXT:    nop
4453; PC64LE-NEXT:    xscvdpspn 0, 30
4454; PC64LE-NEXT:    addis 3, 2, .LCPI72_3@toc@ha
4455; PC64LE-NEXT:    xscvdpspn 1, 1
4456; PC64LE-NEXT:    addi 3, 3, .LCPI72_3@toc@l
4457; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
4458; PC64LE-NEXT:    xscvdpspn 0, 31
4459; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
4460; PC64LE-NEXT:    vmrghw 2, 2, 3
4461; PC64LE-NEXT:    lvx 3, 0, 3
4462; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
4463; PC64LE-NEXT:    vperm 2, 4, 2, 3
4464; PC64LE-NEXT:    addi 1, 1, 48
4465; PC64LE-NEXT:    ld 0, 16(1)
4466; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
4467; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
4468; PC64LE-NEXT:    mtlr 0
4469; PC64LE-NEXT:    blr
4470;
4471; PC64LE9-LABEL: constrained_vector_log2_v3f32:
4472; PC64LE9:       # %bb.0: # %entry
4473; PC64LE9-NEXT:    mflr 0
4474; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
4475; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
4476; PC64LE9-NEXT:    std 0, 16(1)
4477; PC64LE9-NEXT:    stdu 1, -48(1)
4478; PC64LE9-NEXT:    addis 3, 2, .LCPI72_0@toc@ha
4479; PC64LE9-NEXT:    lfs 1, .LCPI72_0@toc@l(3)
4480; PC64LE9-NEXT:    bl log2f
4481; PC64LE9-NEXT:    nop
4482; PC64LE9-NEXT:    addis 3, 2, .LCPI72_1@toc@ha
4483; PC64LE9-NEXT:    fmr 31, 1
4484; PC64LE9-NEXT:    lfs 1, .LCPI72_1@toc@l(3)
4485; PC64LE9-NEXT:    bl log2f
4486; PC64LE9-NEXT:    nop
4487; PC64LE9-NEXT:    addis 3, 2, .LCPI72_2@toc@ha
4488; PC64LE9-NEXT:    fmr 30, 1
4489; PC64LE9-NEXT:    lfs 1, .LCPI72_2@toc@l(3)
4490; PC64LE9-NEXT:    bl log2f
4491; PC64LE9-NEXT:    nop
4492; PC64LE9-NEXT:    xscvdpspn 0, 1
4493; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
4494; PC64LE9-NEXT:    xscvdpspn 0, 30
4495; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
4496; PC64LE9-NEXT:    xscvdpspn 0, 31
4497; PC64LE9-NEXT:    addis 3, 2, .LCPI72_3@toc@ha
4498; PC64LE9-NEXT:    addi 3, 3, .LCPI72_3@toc@l
4499; PC64LE9-NEXT:    vmrghw 2, 3, 2
4500; PC64LE9-NEXT:    lxvx 35, 0, 3
4501; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
4502; PC64LE9-NEXT:    vperm 2, 4, 2, 3
4503; PC64LE9-NEXT:    addi 1, 1, 48
4504; PC64LE9-NEXT:    ld 0, 16(1)
4505; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
4506; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
4507; PC64LE9-NEXT:    mtlr 0
4508; PC64LE9-NEXT:    blr
4509entry:
4510  %log2 = call <3 x float> @llvm.experimental.constrained.log2.v3f32(
4511                              <3 x float> <float 42.0, float 43.0, float 44.0>,
4512                              metadata !"round.dynamic",
4513                              metadata !"fpexcept.strict") #1
4514  ret <3 x float> %log2
4515}
4516
4517define <3 x double> @constrained_vector_log2_v3f64() #0 {
4518; PC64LE-LABEL: constrained_vector_log2_v3f64:
4519; PC64LE:       # %bb.0: # %entry
4520; PC64LE-NEXT:    mflr 0
4521; PC64LE-NEXT:    std 0, 16(1)
4522; PC64LE-NEXT:    stdu 1, -80(1)
4523; PC64LE-NEXT:    li 3, 64
4524; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4525; PC64LE-NEXT:    addis 3, 2, .LCPI73_0@toc@ha
4526; PC64LE-NEXT:    lfd 1, .LCPI73_0@toc@l(3)
4527; PC64LE-NEXT:    bl log2
4528; PC64LE-NEXT:    nop
4529; PC64LE-NEXT:    li 3, 48
4530; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4531; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
4532; PC64LE-NEXT:    addis 3, 2, .LCPI73_1@toc@ha
4533; PC64LE-NEXT:    lfs 1, .LCPI73_1@toc@l(3)
4534; PC64LE-NEXT:    bl log2
4535; PC64LE-NEXT:    nop
4536; PC64LE-NEXT:    li 3, 48
4537; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4538; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
4539; PC64LE-NEXT:    addis 3, 2, .LCPI73_2@toc@ha
4540; PC64LE-NEXT:    xxmrghd 63, 0, 1
4541; PC64LE-NEXT:    lfd 1, .LCPI73_2@toc@l(3)
4542; PC64LE-NEXT:    bl log2
4543; PC64LE-NEXT:    nop
4544; PC64LE-NEXT:    xxswapd 0, 63
4545; PC64LE-NEXT:    li 3, 64
4546; PC64LE-NEXT:    xxlor 2, 63, 63
4547; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4548; PC64LE-NEXT:    fmr 3, 1
4549; PC64LE-NEXT:    fmr 1, 0
4550; PC64LE-NEXT:    addi 1, 1, 80
4551; PC64LE-NEXT:    ld 0, 16(1)
4552; PC64LE-NEXT:    mtlr 0
4553; PC64LE-NEXT:    blr
4554;
4555; PC64LE9-LABEL: constrained_vector_log2_v3f64:
4556; PC64LE9:       # %bb.0: # %entry
4557; PC64LE9-NEXT:    mflr 0
4558; PC64LE9-NEXT:    std 0, 16(1)
4559; PC64LE9-NEXT:    stdu 1, -64(1)
4560; PC64LE9-NEXT:    addis 3, 2, .LCPI73_0@toc@ha
4561; PC64LE9-NEXT:    lfd 1, .LCPI73_0@toc@l(3)
4562; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
4563; PC64LE9-NEXT:    bl log2
4564; PC64LE9-NEXT:    nop
4565; PC64LE9-NEXT:    addis 3, 2, .LCPI73_1@toc@ha
4566; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4567; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
4568; PC64LE9-NEXT:    lfs 1, .LCPI73_1@toc@l(3)
4569; PC64LE9-NEXT:    bl log2
4570; PC64LE9-NEXT:    nop
4571; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
4572; PC64LE9-NEXT:    addis 3, 2, .LCPI73_2@toc@ha
4573; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4574; PC64LE9-NEXT:    xxmrghd 63, 0, 1
4575; PC64LE9-NEXT:    lfd 1, .LCPI73_2@toc@l(3)
4576; PC64LE9-NEXT:    bl log2
4577; PC64LE9-NEXT:    nop
4578; PC64LE9-NEXT:    fmr 3, 1
4579; PC64LE9-NEXT:    xxswapd 1, 63
4580; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
4581; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
4582; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4583; PC64LE9-NEXT:    addi 1, 1, 64
4584; PC64LE9-NEXT:    ld 0, 16(1)
4585; PC64LE9-NEXT:    mtlr 0
4586; PC64LE9-NEXT:    blr
4587entry:
4588  %log2 = call <3 x double> @llvm.experimental.constrained.log2.v3f64(
4589                          <3 x double> <double 42.0, double 42.1, double 42.2>,
4590                          metadata !"round.dynamic",
4591                          metadata !"fpexcept.strict") #1
4592  ret <3 x double> %log2
4593}
4594
4595define <4 x double> @constrained_vector_log2_v4f64() #0 {
4596; PC64LE-LABEL: constrained_vector_log2_v4f64:
4597; PC64LE:       # %bb.0: # %entry
4598; PC64LE-NEXT:    mflr 0
4599; PC64LE-NEXT:    std 0, 16(1)
4600; PC64LE-NEXT:    stdu 1, -80(1)
4601; PC64LE-NEXT:    li 3, 64
4602; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4603; PC64LE-NEXT:    addis 3, 2, .LCPI74_0@toc@ha
4604; PC64LE-NEXT:    lfd 1, .LCPI74_0@toc@l(3)
4605; PC64LE-NEXT:    bl log2
4606; PC64LE-NEXT:    nop
4607; PC64LE-NEXT:    li 3, 48
4608; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4609; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
4610; PC64LE-NEXT:    addis 3, 2, .LCPI74_1@toc@ha
4611; PC64LE-NEXT:    lfd 1, .LCPI74_1@toc@l(3)
4612; PC64LE-NEXT:    bl log2
4613; PC64LE-NEXT:    nop
4614; PC64LE-NEXT:    li 3, 48
4615; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4616; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
4617; PC64LE-NEXT:    addis 3, 2, .LCPI74_2@toc@ha
4618; PC64LE-NEXT:    xxmrghd 63, 1, 0
4619; PC64LE-NEXT:    lfd 1, .LCPI74_2@toc@l(3)
4620; PC64LE-NEXT:    bl log2
4621; PC64LE-NEXT:    nop
4622; PC64LE-NEXT:    li 3, 48
4623; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4624; PC64LE-NEXT:    stxvd2x 1, 1, 3 # 16-byte Folded Spill
4625; PC64LE-NEXT:    addis 3, 2, .LCPI74_3@toc@ha
4626; PC64LE-NEXT:    lfs 1, .LCPI74_3@toc@l(3)
4627; PC64LE-NEXT:    bl log2
4628; PC64LE-NEXT:    nop
4629; PC64LE-NEXT:    li 3, 48
4630; PC64LE-NEXT:    vmr 3, 31
4631; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4632; PC64LE-NEXT:    lxvd2x 0, 1, 3 # 16-byte Folded Reload
4633; PC64LE-NEXT:    li 3, 64
4634; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4635; PC64LE-NEXT:    xxmrghd 34, 0, 1
4636; PC64LE-NEXT:    addi 1, 1, 80
4637; PC64LE-NEXT:    ld 0, 16(1)
4638; PC64LE-NEXT:    mtlr 0
4639; PC64LE-NEXT:    blr
4640;
4641; PC64LE9-LABEL: constrained_vector_log2_v4f64:
4642; PC64LE9:       # %bb.0: # %entry
4643; PC64LE9-NEXT:    mflr 0
4644; PC64LE9-NEXT:    std 0, 16(1)
4645; PC64LE9-NEXT:    stdu 1, -64(1)
4646; PC64LE9-NEXT:    addis 3, 2, .LCPI74_0@toc@ha
4647; PC64LE9-NEXT:    lfd 1, .LCPI74_0@toc@l(3)
4648; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
4649; PC64LE9-NEXT:    bl log2
4650; PC64LE9-NEXT:    nop
4651; PC64LE9-NEXT:    addis 3, 2, .LCPI74_1@toc@ha
4652; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4653; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
4654; PC64LE9-NEXT:    lfd 1, .LCPI74_1@toc@l(3)
4655; PC64LE9-NEXT:    bl log2
4656; PC64LE9-NEXT:    nop
4657; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
4658; PC64LE9-NEXT:    addis 3, 2, .LCPI74_2@toc@ha
4659; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4660; PC64LE9-NEXT:    xxmrghd 63, 1, 0
4661; PC64LE9-NEXT:    lfd 1, .LCPI74_2@toc@l(3)
4662; PC64LE9-NEXT:    bl log2
4663; PC64LE9-NEXT:    nop
4664; PC64LE9-NEXT:    addis 3, 2, .LCPI74_3@toc@ha
4665; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4666; PC64LE9-NEXT:    stxv 1, 32(1) # 16-byte Folded Spill
4667; PC64LE9-NEXT:    lfs 1, .LCPI74_3@toc@l(3)
4668; PC64LE9-NEXT:    bl log2
4669; PC64LE9-NEXT:    nop
4670; PC64LE9-NEXT:    lxv 0, 32(1) # 16-byte Folded Reload
4671; PC64LE9-NEXT:    vmr 3, 31
4672; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
4673; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4674; PC64LE9-NEXT:    xxmrghd 34, 0, 1
4675; PC64LE9-NEXT:    addi 1, 1, 64
4676; PC64LE9-NEXT:    ld 0, 16(1)
4677; PC64LE9-NEXT:    mtlr 0
4678; PC64LE9-NEXT:    blr
4679entry:
4680  %log2 = call <4 x double> @llvm.experimental.constrained.log2.v4f64(
4681                              <4 x double> <double 42.0, double 42.1,
4682                                            double 42.2, double 42.3>,
4683                              metadata !"round.dynamic",
4684                              metadata !"fpexcept.strict") #1
4685  ret <4 x double> %log2
4686}
4687
4688define <1 x float> @constrained_vector_rint_v1f32() #0 {
4689; PC64LE-LABEL: constrained_vector_rint_v1f32:
4690; PC64LE:       # %bb.0: # %entry
4691; PC64LE-NEXT:    addis 3, 2, .LCPI75_0@toc@ha
4692; PC64LE-NEXT:    lfs 0, .LCPI75_0@toc@l(3)
4693; PC64LE-NEXT:    xsrdpic 1, 0
4694; PC64LE-NEXT:    blr
4695;
4696; PC64LE9-LABEL: constrained_vector_rint_v1f32:
4697; PC64LE9:       # %bb.0: # %entry
4698; PC64LE9-NEXT:    addis 3, 2, .LCPI75_0@toc@ha
4699; PC64LE9-NEXT:    lfs 0, .LCPI75_0@toc@l(3)
4700; PC64LE9-NEXT:    xsrdpic 1, 0
4701; PC64LE9-NEXT:    blr
4702entry:
4703  %rint = call <1 x float> @llvm.experimental.constrained.rint.v1f32(
4704                             <1 x float> <float 42.0>,
4705                             metadata !"round.dynamic",
4706                             metadata !"fpexcept.strict") #1
4707  ret <1 x float> %rint
4708}
4709
4710define <2 x double> @constrained_vector_rint_v2f64() #0 {
4711; PC64LE-LABEL: constrained_vector_rint_v2f64:
4712; PC64LE:       # %bb.0: # %entry
4713; PC64LE-NEXT:    addis 3, 2, .LCPI76_0@toc@ha
4714; PC64LE-NEXT:    addi 3, 3, .LCPI76_0@toc@l
4715; PC64LE-NEXT:    lxvd2x 0, 0, 3
4716; PC64LE-NEXT:    xxswapd 0, 0
4717; PC64LE-NEXT:    xvrdpic 34, 0
4718; PC64LE-NEXT:    blr
4719;
4720; PC64LE9-LABEL: constrained_vector_rint_v2f64:
4721; PC64LE9:       # %bb.0: # %entry
4722; PC64LE9-NEXT:    addis 3, 2, .LCPI76_0@toc@ha
4723; PC64LE9-NEXT:    addi 3, 3, .LCPI76_0@toc@l
4724; PC64LE9-NEXT:    lxvx 0, 0, 3
4725; PC64LE9-NEXT:    xvrdpic 34, 0
4726; PC64LE9-NEXT:    blr
4727entry:
4728  %rint = call <2 x double> @llvm.experimental.constrained.rint.v2f64(
4729                        <2 x double> <double 42.1, double 42.0>,
4730                        metadata !"round.dynamic",
4731                        metadata !"fpexcept.strict") #1
4732  ret <2 x double> %rint
4733}
4734
4735define <3 x float> @constrained_vector_rint_v3f32() #0 {
4736; PC64LE-LABEL: constrained_vector_rint_v3f32:
4737; PC64LE:       # %bb.0: # %entry
4738; PC64LE-NEXT:    addis 3, 2, .LCPI77_2@toc@ha
4739; PC64LE-NEXT:    addis 4, 2, .LCPI77_1@toc@ha
4740; PC64LE-NEXT:    lfs 0, .LCPI77_2@toc@l(3)
4741; PC64LE-NEXT:    lfs 1, .LCPI77_1@toc@l(4)
4742; PC64LE-NEXT:    addis 3, 2, .LCPI77_0@toc@ha
4743; PC64LE-NEXT:    xsrdpic 0, 0
4744; PC64LE-NEXT:    lfs 2, .LCPI77_0@toc@l(3)
4745; PC64LE-NEXT:    addis 3, 2, .LCPI77_3@toc@ha
4746; PC64LE-NEXT:    xsrdpic 1, 1
4747; PC64LE-NEXT:    addi 3, 3, .LCPI77_3@toc@l
4748; PC64LE-NEXT:    xsrdpic 2, 2
4749; PC64LE-NEXT:    xscvdpspn 0, 0
4750; PC64LE-NEXT:    xscvdpspn 1, 1
4751; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
4752; PC64LE-NEXT:    xscvdpspn 0, 2
4753; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
4754; PC64LE-NEXT:    vmrghw 2, 3, 2
4755; PC64LE-NEXT:    lvx 3, 0, 3
4756; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
4757; PC64LE-NEXT:    vperm 2, 4, 2, 3
4758; PC64LE-NEXT:    blr
4759;
4760; PC64LE9-LABEL: constrained_vector_rint_v3f32:
4761; PC64LE9:       # %bb.0: # %entry
4762; PC64LE9-NEXT:    addis 3, 2, .LCPI77_0@toc@ha
4763; PC64LE9-NEXT:    lfs 0, .LCPI77_0@toc@l(3)
4764; PC64LE9-NEXT:    addis 3, 2, .LCPI77_1@toc@ha
4765; PC64LE9-NEXT:    lfs 1, .LCPI77_1@toc@l(3)
4766; PC64LE9-NEXT:    addis 3, 2, .LCPI77_2@toc@ha
4767; PC64LE9-NEXT:    xsrdpic 0, 0
4768; PC64LE9-NEXT:    lfs 2, .LCPI77_2@toc@l(3)
4769; PC64LE9-NEXT:    addis 3, 2, .LCPI77_3@toc@ha
4770; PC64LE9-NEXT:    addi 3, 3, .LCPI77_3@toc@l
4771; PC64LE9-NEXT:    xsrdpic 1, 1
4772; PC64LE9-NEXT:    xsrdpic 2, 2
4773; PC64LE9-NEXT:    xscvdpspn 0, 0
4774; PC64LE9-NEXT:    xscvdpspn 1, 1
4775; PC64LE9-NEXT:    xscvdpspn 2, 2
4776; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
4777; PC64LE9-NEXT:    xxsldwi 35, 1, 1, 3
4778; PC64LE9-NEXT:    xxsldwi 34, 2, 2, 3
4779; PC64LE9-NEXT:    vmrghw 2, 3, 2
4780; PC64LE9-NEXT:    lxvx 35, 0, 3
4781; PC64LE9-NEXT:    vperm 2, 4, 2, 3
4782; PC64LE9-NEXT:    blr
4783 entry:
4784  %rint = call <3 x float> @llvm.experimental.constrained.rint.v3f32(
4785                              <3 x float> <float 42.0, float 43.0, float 44.0>,
4786                              metadata !"round.dynamic",
4787                              metadata !"fpexcept.strict") #1
4788  ret <3 x float> %rint
4789}
4790
4791define <3 x double> @constrained_vector_rint_v3f64() #0 {
4792; PC64LE-LABEL: constrained_vector_rint_v3f64:
4793; PC64LE:       # %bb.0: # %entry
4794; PC64LE-NEXT:    addis 3, 2, .LCPI78_1@toc@ha
4795; PC64LE-NEXT:    addi 3, 3, .LCPI78_1@toc@l
4796; PC64LE-NEXT:    lxvd2x 0, 0, 3
4797; PC64LE-NEXT:    addis 3, 2, .LCPI78_0@toc@ha
4798; PC64LE-NEXT:    lfd 1, .LCPI78_0@toc@l(3)
4799; PC64LE-NEXT:    xxswapd 0, 0
4800; PC64LE-NEXT:    xsrdpic 3, 1
4801; PC64LE-NEXT:    xvrdpic 2, 0
4802; PC64LE-NEXT:    xxswapd 1, 2
4803; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
4804; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4805; PC64LE-NEXT:    blr
4806;
4807; PC64LE9-LABEL: constrained_vector_rint_v3f64:
4808; PC64LE9:       # %bb.0: # %entry
4809; PC64LE9-NEXT:    addis 3, 2, .LCPI78_0@toc@ha
4810; PC64LE9-NEXT:    lfd 0, .LCPI78_0@toc@l(3)
4811; PC64LE9-NEXT:    addis 3, 2, .LCPI78_1@toc@ha
4812; PC64LE9-NEXT:    addi 3, 3, .LCPI78_1@toc@l
4813; PC64LE9-NEXT:    xsrdpic 3, 0
4814; PC64LE9-NEXT:    lxvx 0, 0, 3
4815; PC64LE9-NEXT:    xvrdpic 2, 0
4816; PC64LE9-NEXT:    xxswapd 1, 2
4817; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4818; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
4819; PC64LE9-NEXT:    blr
4820entry:
4821  %rint = call <3 x double> @llvm.experimental.constrained.rint.v3f64(
4822                          <3 x double> <double 42.0, double 42.1, double 42.2>,
4823                          metadata !"round.dynamic",
4824                          metadata !"fpexcept.strict") #1
4825  ret <3 x double> %rint
4826}
4827
4828define <4 x double> @constrained_vector_rint_v4f64() #0 {
4829; PC64LE-LABEL: constrained_vector_rint_v4f64:
4830; PC64LE:       # %bb.0: # %entry
4831; PC64LE-NEXT:    addis 3, 2, .LCPI79_0@toc@ha
4832; PC64LE-NEXT:    addis 4, 2, .LCPI79_1@toc@ha
4833; PC64LE-NEXT:    addi 3, 3, .LCPI79_0@toc@l
4834; PC64LE-NEXT:    lxvd2x 0, 0, 3
4835; PC64LE-NEXT:    addi 3, 4, .LCPI79_1@toc@l
4836; PC64LE-NEXT:    lxvd2x 1, 0, 3
4837; PC64LE-NEXT:    xxswapd 0, 0
4838; PC64LE-NEXT:    xxswapd 1, 1
4839; PC64LE-NEXT:    xvrdpic 34, 0
4840; PC64LE-NEXT:    xvrdpic 35, 1
4841; PC64LE-NEXT:    blr
4842;
4843; PC64LE9-LABEL: constrained_vector_rint_v4f64:
4844; PC64LE9:       # %bb.0: # %entry
4845; PC64LE9-NEXT:    addis 3, 2, .LCPI79_0@toc@ha
4846; PC64LE9-NEXT:    addi 3, 3, .LCPI79_0@toc@l
4847; PC64LE9-NEXT:    lxvx 0, 0, 3
4848; PC64LE9-NEXT:    addis 3, 2, .LCPI79_1@toc@ha
4849; PC64LE9-NEXT:    addi 3, 3, .LCPI79_1@toc@l
4850; PC64LE9-NEXT:    xvrdpic 34, 0
4851; PC64LE9-NEXT:    lxvx 0, 0, 3
4852; PC64LE9-NEXT:    xvrdpic 35, 0
4853; PC64LE9-NEXT:    blr
4854entry:
4855  %rint = call <4 x double> @llvm.experimental.constrained.rint.v4f64(
4856                        <4 x double> <double 42.1, double 42.2,
4857                                      double 42.3, double 42.4>,
4858                        metadata !"round.dynamic",
4859                        metadata !"fpexcept.strict") #1
4860  ret <4 x double> %rint
4861}
4862
4863define <1 x float> @constrained_vector_nearbyint_v1f32() #0 {
4864; PC64LE-LABEL: constrained_vector_nearbyint_v1f32:
4865; PC64LE:       # %bb.0: # %entry
4866; PC64LE-NEXT:    mflr 0
4867; PC64LE-NEXT:    std 0, 16(1)
4868; PC64LE-NEXT:    stdu 1, -32(1)
4869; PC64LE-NEXT:    addis 3, 2, .LCPI80_0@toc@ha
4870; PC64LE-NEXT:    lfs 1, .LCPI80_0@toc@l(3)
4871; PC64LE-NEXT:    bl nearbyintf
4872; PC64LE-NEXT:    nop
4873; PC64LE-NEXT:    addi 1, 1, 32
4874; PC64LE-NEXT:    ld 0, 16(1)
4875; PC64LE-NEXT:    mtlr 0
4876; PC64LE-NEXT:    blr
4877;
4878; PC64LE9-LABEL: constrained_vector_nearbyint_v1f32:
4879; PC64LE9:       # %bb.0: # %entry
4880; PC64LE9-NEXT:    mflr 0
4881; PC64LE9-NEXT:    std 0, 16(1)
4882; PC64LE9-NEXT:    stdu 1, -32(1)
4883; PC64LE9-NEXT:    addis 3, 2, .LCPI80_0@toc@ha
4884; PC64LE9-NEXT:    lfs 1, .LCPI80_0@toc@l(3)
4885; PC64LE9-NEXT:    bl nearbyintf
4886; PC64LE9-NEXT:    nop
4887; PC64LE9-NEXT:    addi 1, 1, 32
4888; PC64LE9-NEXT:    ld 0, 16(1)
4889; PC64LE9-NEXT:    mtlr 0
4890; PC64LE9-NEXT:    blr
4891entry:
4892  %nearby = call <1 x float> @llvm.experimental.constrained.nearbyint.v1f32(
4893                               <1 x float> <float 42.0>,
4894                               metadata !"round.dynamic",
4895                               metadata !"fpexcept.strict") #1
4896  ret <1 x float> %nearby
4897}
4898
4899define <2 x double> @constrained_vector_nearbyint_v2f64() #0 {
4900; PC64LE-LABEL: constrained_vector_nearbyint_v2f64:
4901; PC64LE:       # %bb.0: # %entry
4902; PC64LE-NEXT:    addis 3, 2, .LCPI81_0@toc@ha
4903; PC64LE-NEXT:    addi 3, 3, .LCPI81_0@toc@l
4904; PC64LE-NEXT:    lxvd2x 0, 0, 3
4905; PC64LE-NEXT:    xxswapd 0, 0
4906; PC64LE-NEXT:    xvrdpic 34, 0
4907; PC64LE-NEXT:    blr
4908;
4909; PC64LE9-LABEL: constrained_vector_nearbyint_v2f64:
4910; PC64LE9:       # %bb.0: # %entry
4911; PC64LE9-NEXT:    addis 3, 2, .LCPI81_0@toc@ha
4912; PC64LE9-NEXT:    addi 3, 3, .LCPI81_0@toc@l
4913; PC64LE9-NEXT:    lxvx 0, 0, 3
4914; PC64LE9-NEXT:    xvrdpic 34, 0
4915; PC64LE9-NEXT:    blr
4916entry:
4917  %nearby = call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(
4918                                <2 x double> <double 42.1, double 42.0>,
4919                                metadata !"round.dynamic",
4920                                metadata !"fpexcept.strict") #1
4921  ret <2 x double> %nearby
4922}
4923
4924define <3 x float> @constrained_vector_nearbyint_v3f32() #0 {
4925; PC64LE-LABEL: constrained_vector_nearbyint_v3f32:
4926; PC64LE:       # %bb.0: # %entry
4927; PC64LE-NEXT:    mflr 0
4928; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
4929; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
4930; PC64LE-NEXT:    std 0, 16(1)
4931; PC64LE-NEXT:    stdu 1, -48(1)
4932; PC64LE-NEXT:    addis 3, 2, .LCPI82_0@toc@ha
4933; PC64LE-NEXT:    lfs 1, .LCPI82_0@toc@l(3)
4934; PC64LE-NEXT:    bl nearbyintf
4935; PC64LE-NEXT:    nop
4936; PC64LE-NEXT:    addis 3, 2, .LCPI82_1@toc@ha
4937; PC64LE-NEXT:    fmr 31, 1
4938; PC64LE-NEXT:    lfs 1, .LCPI82_1@toc@l(3)
4939; PC64LE-NEXT:    bl nearbyintf
4940; PC64LE-NEXT:    nop
4941; PC64LE-NEXT:    addis 3, 2, .LCPI82_2@toc@ha
4942; PC64LE-NEXT:    fmr 30, 1
4943; PC64LE-NEXT:    lfs 1, .LCPI82_2@toc@l(3)
4944; PC64LE-NEXT:    bl nearbyintf
4945; PC64LE-NEXT:    nop
4946; PC64LE-NEXT:    xscvdpspn 0, 30
4947; PC64LE-NEXT:    addis 3, 2, .LCPI82_3@toc@ha
4948; PC64LE-NEXT:    xscvdpspn 1, 1
4949; PC64LE-NEXT:    addi 3, 3, .LCPI82_3@toc@l
4950; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
4951; PC64LE-NEXT:    xscvdpspn 0, 31
4952; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
4953; PC64LE-NEXT:    vmrghw 2, 2, 3
4954; PC64LE-NEXT:    lvx 3, 0, 3
4955; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
4956; PC64LE-NEXT:    vperm 2, 4, 2, 3
4957; PC64LE-NEXT:    addi 1, 1, 48
4958; PC64LE-NEXT:    ld 0, 16(1)
4959; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
4960; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
4961; PC64LE-NEXT:    mtlr 0
4962; PC64LE-NEXT:    blr
4963;
4964; PC64LE9-LABEL: constrained_vector_nearbyint_v3f32:
4965; PC64LE9:       # %bb.0: # %entry
4966; PC64LE9-NEXT:    mflr 0
4967; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
4968; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
4969; PC64LE9-NEXT:    std 0, 16(1)
4970; PC64LE9-NEXT:    stdu 1, -48(1)
4971; PC64LE9-NEXT:    addis 3, 2, .LCPI82_0@toc@ha
4972; PC64LE9-NEXT:    lfs 1, .LCPI82_0@toc@l(3)
4973; PC64LE9-NEXT:    bl nearbyintf
4974; PC64LE9-NEXT:    nop
4975; PC64LE9-NEXT:    addis 3, 2, .LCPI82_1@toc@ha
4976; PC64LE9-NEXT:    fmr 31, 1
4977; PC64LE9-NEXT:    lfs 1, .LCPI82_1@toc@l(3)
4978; PC64LE9-NEXT:    bl nearbyintf
4979; PC64LE9-NEXT:    nop
4980; PC64LE9-NEXT:    addis 3, 2, .LCPI82_2@toc@ha
4981; PC64LE9-NEXT:    fmr 30, 1
4982; PC64LE9-NEXT:    lfs 1, .LCPI82_2@toc@l(3)
4983; PC64LE9-NEXT:    bl nearbyintf
4984; PC64LE9-NEXT:    nop
4985; PC64LE9-NEXT:    xscvdpspn 0, 1
4986; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
4987; PC64LE9-NEXT:    xscvdpspn 0, 30
4988; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
4989; PC64LE9-NEXT:    xscvdpspn 0, 31
4990; PC64LE9-NEXT:    addis 3, 2, .LCPI82_3@toc@ha
4991; PC64LE9-NEXT:    addi 3, 3, .LCPI82_3@toc@l
4992; PC64LE9-NEXT:    vmrghw 2, 3, 2
4993; PC64LE9-NEXT:    lxvx 35, 0, 3
4994; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
4995; PC64LE9-NEXT:    vperm 2, 4, 2, 3
4996; PC64LE9-NEXT:    addi 1, 1, 48
4997; PC64LE9-NEXT:    ld 0, 16(1)
4998; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
4999; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
5000; PC64LE9-NEXT:    mtlr 0
5001; PC64LE9-NEXT:    blr
5002entry:
5003  %nearby = call <3 x float> @llvm.experimental.constrained.nearbyint.v3f32(
5004                              <3 x float> <float 42.0, float 43.0, float 44.0>,
5005                              metadata !"round.dynamic",
5006                              metadata !"fpexcept.strict") #1
5007  ret <3 x float> %nearby
5008}
5009
5010define <3 x double> @constrained_vector_nearby_v3f64() #0 {
5011; PC64LE-LABEL: constrained_vector_nearby_v3f64:
5012; PC64LE:       # %bb.0: # %entry
5013; PC64LE-NEXT:    addis 3, 2, .LCPI83_1@toc@ha
5014; PC64LE-NEXT:    addi 3, 3, .LCPI83_1@toc@l
5015; PC64LE-NEXT:    lxvd2x 0, 0, 3
5016; PC64LE-NEXT:    addis 3, 2, .LCPI83_0@toc@ha
5017; PC64LE-NEXT:    lfd 1, .LCPI83_0@toc@l(3)
5018; PC64LE-NEXT:    xxswapd 0, 0
5019; PC64LE-NEXT:    xsrdpic 3, 1
5020; PC64LE-NEXT:    xvrdpic 2, 0
5021; PC64LE-NEXT:    xxswapd 1, 2
5022; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
5023; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
5024; PC64LE-NEXT:    blr
5025;
5026; PC64LE9-LABEL: constrained_vector_nearby_v3f64:
5027; PC64LE9:       # %bb.0: # %entry
5028; PC64LE9-NEXT:    addis 3, 2, .LCPI83_0@toc@ha
5029; PC64LE9-NEXT:    lfd 0, .LCPI83_0@toc@l(3)
5030; PC64LE9-NEXT:    addis 3, 2, .LCPI83_1@toc@ha
5031; PC64LE9-NEXT:    addi 3, 3, .LCPI83_1@toc@l
5032; PC64LE9-NEXT:    xsrdpic 3, 0
5033; PC64LE9-NEXT:    lxvx 0, 0, 3
5034; PC64LE9-NEXT:    xvrdpic 2, 0
5035; PC64LE9-NEXT:    xxswapd 1, 2
5036; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
5037; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
5038; PC64LE9-NEXT:    blr
5039entry:
5040  %nearby = call <3 x double> @llvm.experimental.constrained.nearbyint.v3f64(
5041                          <3 x double> <double 42.0, double 42.1, double 42.2>,
5042                          metadata !"round.dynamic",
5043                          metadata !"fpexcept.strict") #1
5044  ret <3 x double> %nearby
5045}
5046
5047define <4 x double> @constrained_vector_nearbyint_v4f64() #0 {
5048; PC64LE-LABEL: constrained_vector_nearbyint_v4f64:
5049; PC64LE:       # %bb.0: # %entry
5050; PC64LE-NEXT:    addis 3, 2, .LCPI84_0@toc@ha
5051; PC64LE-NEXT:    addis 4, 2, .LCPI84_1@toc@ha
5052; PC64LE-NEXT:    addi 3, 3, .LCPI84_0@toc@l
5053; PC64LE-NEXT:    lxvd2x 0, 0, 3
5054; PC64LE-NEXT:    addi 3, 4, .LCPI84_1@toc@l
5055; PC64LE-NEXT:    lxvd2x 1, 0, 3
5056; PC64LE-NEXT:    xxswapd 0, 0
5057; PC64LE-NEXT:    xxswapd 1, 1
5058; PC64LE-NEXT:    xvrdpic 35, 0
5059; PC64LE-NEXT:    xvrdpic 34, 1
5060; PC64LE-NEXT:    blr
5061;
5062; PC64LE9-LABEL: constrained_vector_nearbyint_v4f64:
5063; PC64LE9:       # %bb.0: # %entry
5064; PC64LE9-NEXT:    addis 3, 2, .LCPI84_0@toc@ha
5065; PC64LE9-NEXT:    addi 3, 3, .LCPI84_0@toc@l
5066; PC64LE9-NEXT:    lxvx 0, 0, 3
5067; PC64LE9-NEXT:    addis 3, 2, .LCPI84_1@toc@ha
5068; PC64LE9-NEXT:    addi 3, 3, .LCPI84_1@toc@l
5069; PC64LE9-NEXT:    xvrdpic 35, 0
5070; PC64LE9-NEXT:    lxvx 0, 0, 3
5071; PC64LE9-NEXT:    xvrdpic 34, 0
5072; PC64LE9-NEXT:    blr
5073entry:
5074  %nearby = call <4 x double> @llvm.experimental.constrained.nearbyint.v4f64(
5075                                <4 x double> <double 42.1, double 42.2,
5076                                              double 42.3, double 42.4>,
5077                                metadata !"round.dynamic",
5078                                metadata !"fpexcept.strict") #1
5079  ret <4 x double> %nearby
5080}
5081
5082define <1 x float> @constrained_vector_maxnum_v1f32() #0 {
5083; PC64LE-LABEL: constrained_vector_maxnum_v1f32:
5084; PC64LE:       # %bb.0: # %entry
5085; PC64LE-NEXT:    mflr 0
5086; PC64LE-NEXT:    std 0, 16(1)
5087; PC64LE-NEXT:    stdu 1, -32(1)
5088; PC64LE-NEXT:    addis 3, 2, .LCPI85_0@toc@ha
5089; PC64LE-NEXT:    addis 4, 2, .LCPI85_1@toc@ha
5090; PC64LE-NEXT:    lfs 1, .LCPI85_0@toc@l(3)
5091; PC64LE-NEXT:    lfs 2, .LCPI85_1@toc@l(4)
5092; PC64LE-NEXT:    bl fmaxf
5093; PC64LE-NEXT:    nop
5094; PC64LE-NEXT:    addi 1, 1, 32
5095; PC64LE-NEXT:    ld 0, 16(1)
5096; PC64LE-NEXT:    mtlr 0
5097; PC64LE-NEXT:    blr
5098;
5099; PC64LE9-LABEL: constrained_vector_maxnum_v1f32:
5100; PC64LE9:       # %bb.0: # %entry
5101; PC64LE9-NEXT:    mflr 0
5102; PC64LE9-NEXT:    std 0, 16(1)
5103; PC64LE9-NEXT:    stdu 1, -32(1)
5104; PC64LE9-NEXT:    addis 3, 2, .LCPI85_0@toc@ha
5105; PC64LE9-NEXT:    lfs 1, .LCPI85_0@toc@l(3)
5106; PC64LE9-NEXT:    addis 3, 2, .LCPI85_1@toc@ha
5107; PC64LE9-NEXT:    lfs 2, .LCPI85_1@toc@l(3)
5108; PC64LE9-NEXT:    bl fmaxf
5109; PC64LE9-NEXT:    nop
5110; PC64LE9-NEXT:    addi 1, 1, 32
5111; PC64LE9-NEXT:    ld 0, 16(1)
5112; PC64LE9-NEXT:    mtlr 0
5113; PC64LE9-NEXT:    blr
5114entry:
5115  %max = call <1 x float> @llvm.experimental.constrained.maxnum.v1f32(
5116                               <1 x float> <float 42.0>, <1 x float> <float 41.0>,
5117                               metadata !"fpexcept.strict") #1
5118  ret <1 x float> %max
5119}
5120
5121define <2 x double> @constrained_vector_maxnum_v2f64() #0 {
5122; PC64LE-LABEL: constrained_vector_maxnum_v2f64:
5123; PC64LE:       # %bb.0: # %entry
5124; PC64LE-NEXT:    addis 3, 2, .LCPI86_0@toc@ha
5125; PC64LE-NEXT:    addis 4, 2, .LCPI86_1@toc@ha
5126; PC64LE-NEXT:    addi 3, 3, .LCPI86_0@toc@l
5127; PC64LE-NEXT:    addi 4, 4, .LCPI86_1@toc@l
5128; PC64LE-NEXT:    lxvd2x 0, 0, 3
5129; PC64LE-NEXT:    lxvd2x 1, 0, 4
5130; PC64LE-NEXT:    xxswapd 0, 0
5131; PC64LE-NEXT:    xxswapd 1, 1
5132; PC64LE-NEXT:    xvmaxdp 34, 1, 0
5133; PC64LE-NEXT:    blr
5134;
5135; PC64LE9-LABEL: constrained_vector_maxnum_v2f64:
5136; PC64LE9:       # %bb.0: # %entry
5137; PC64LE9-NEXT:    addis 3, 2, .LCPI86_0@toc@ha
5138; PC64LE9-NEXT:    addi 3, 3, .LCPI86_0@toc@l
5139; PC64LE9-NEXT:    lxvx 0, 0, 3
5140; PC64LE9-NEXT:    addis 3, 2, .LCPI86_1@toc@ha
5141; PC64LE9-NEXT:    addi 3, 3, .LCPI86_1@toc@l
5142; PC64LE9-NEXT:    lxvx 1, 0, 3
5143; PC64LE9-NEXT:    xvmaxdp 34, 1, 0
5144; PC64LE9-NEXT:    blr
5145entry:
5146  %max = call <2 x double> @llvm.experimental.constrained.maxnum.v2f64(
5147                                <2 x double> <double 43.0, double 42.0>,
5148                                <2 x double> <double 41.0, double 40.0>,
5149                                metadata !"fpexcept.strict") #1
5150  ret <2 x double> %max
5151}
5152
5153define <3 x float> @constrained_vector_maxnum_v3f32() #0 {
5154; PC64LE-LABEL: constrained_vector_maxnum_v3f32:
5155; PC64LE:       # %bb.0: # %entry
5156; PC64LE-NEXT:    mflr 0
5157; PC64LE-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
5158; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
5159; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
5160; PC64LE-NEXT:    std 0, 16(1)
5161; PC64LE-NEXT:    stdu 1, -64(1)
5162; PC64LE-NEXT:    addis 4, 2, .LCPI87_1@toc@ha
5163; PC64LE-NEXT:    addis 3, 2, .LCPI87_0@toc@ha
5164; PC64LE-NEXT:    lfs 31, .LCPI87_1@toc@l(4)
5165; PC64LE-NEXT:    lfs 1, .LCPI87_0@toc@l(3)
5166; PC64LE-NEXT:    fmr 2, 31
5167; PC64LE-NEXT:    bl fmaxf
5168; PC64LE-NEXT:    nop
5169; PC64LE-NEXT:    addis 3, 2, .LCPI87_2@toc@ha
5170; PC64LE-NEXT:    addis 4, 2, .LCPI87_3@toc@ha
5171; PC64LE-NEXT:    fmr 30, 1
5172; PC64LE-NEXT:    lfs 1, .LCPI87_2@toc@l(3)
5173; PC64LE-NEXT:    lfs 2, .LCPI87_3@toc@l(4)
5174; PC64LE-NEXT:    bl fmaxf
5175; PC64LE-NEXT:    nop
5176; PC64LE-NEXT:    fmr 29, 1
5177; PC64LE-NEXT:    addis 3, 2, .LCPI87_4@toc@ha
5178; PC64LE-NEXT:    fmr 1, 31
5179; PC64LE-NEXT:    lfs 2, .LCPI87_4@toc@l(3)
5180; PC64LE-NEXT:    bl fmaxf
5181; PC64LE-NEXT:    nop
5182; PC64LE-NEXT:    xscvdpspn 0, 29
5183; PC64LE-NEXT:    addis 3, 2, .LCPI87_5@toc@ha
5184; PC64LE-NEXT:    xscvdpspn 1, 1
5185; PC64LE-NEXT:    addi 3, 3, .LCPI87_5@toc@l
5186; PC64LE-NEXT:    lvx 4, 0, 3
5187; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
5188; PC64LE-NEXT:    xscvdpspn 0, 30
5189; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
5190; PC64LE-NEXT:    vmrghw 2, 2, 3
5191; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
5192; PC64LE-NEXT:    vperm 2, 3, 2, 4
5193; PC64LE-NEXT:    addi 1, 1, 64
5194; PC64LE-NEXT:    ld 0, 16(1)
5195; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
5196; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
5197; PC64LE-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
5198; PC64LE-NEXT:    mtlr 0
5199; PC64LE-NEXT:    blr
5200;
5201; PC64LE9-LABEL: constrained_vector_maxnum_v3f32:
5202; PC64LE9:       # %bb.0: # %entry
5203; PC64LE9-NEXT:    mflr 0
5204; PC64LE9-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
5205; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
5206; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
5207; PC64LE9-NEXT:    std 0, 16(1)
5208; PC64LE9-NEXT:    stdu 1, -64(1)
5209; PC64LE9-NEXT:    addis 3, 2, .LCPI87_0@toc@ha
5210; PC64LE9-NEXT:    lfs 1, .LCPI87_0@toc@l(3)
5211; PC64LE9-NEXT:    addis 3, 2, .LCPI87_1@toc@ha
5212; PC64LE9-NEXT:    lfs 31, .LCPI87_1@toc@l(3)
5213; PC64LE9-NEXT:    fmr 2, 31
5214; PC64LE9-NEXT:    bl fmaxf
5215; PC64LE9-NEXT:    nop
5216; PC64LE9-NEXT:    addis 3, 2, .LCPI87_2@toc@ha
5217; PC64LE9-NEXT:    fmr 30, 1
5218; PC64LE9-NEXT:    lfs 1, .LCPI87_2@toc@l(3)
5219; PC64LE9-NEXT:    addis 3, 2, .LCPI87_3@toc@ha
5220; PC64LE9-NEXT:    lfs 2, .LCPI87_3@toc@l(3)
5221; PC64LE9-NEXT:    bl fmaxf
5222; PC64LE9-NEXT:    nop
5223; PC64LE9-NEXT:    addis 3, 2, .LCPI87_4@toc@ha
5224; PC64LE9-NEXT:    lfs 2, .LCPI87_4@toc@l(3)
5225; PC64LE9-NEXT:    fmr 29, 1
5226; PC64LE9-NEXT:    fmr 1, 31
5227; PC64LE9-NEXT:    bl fmaxf
5228; PC64LE9-NEXT:    nop
5229; PC64LE9-NEXT:    xscvdpspn 0, 1
5230; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
5231; PC64LE9-NEXT:    xscvdpspn 0, 29
5232; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
5233; PC64LE9-NEXT:    xscvdpspn 0, 30
5234; PC64LE9-NEXT:    addis 3, 2, .LCPI87_5@toc@ha
5235; PC64LE9-NEXT:    addi 3, 3, .LCPI87_5@toc@l
5236; PC64LE9-NEXT:    lxvx 36, 0, 3
5237; PC64LE9-NEXT:    vmrghw 2, 3, 2
5238; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
5239; PC64LE9-NEXT:    vperm 2, 3, 2, 4
5240; PC64LE9-NEXT:    addi 1, 1, 64
5241; PC64LE9-NEXT:    ld 0, 16(1)
5242; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
5243; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
5244; PC64LE9-NEXT:    mtlr 0
5245; PC64LE9-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
5246; PC64LE9-NEXT:    blr
5247entry:
5248  %max = call <3 x float> @llvm.experimental.constrained.maxnum.v3f32(
5249                              <3 x float> <float 43.0, float 44.0, float 45.0>,
5250                              <3 x float> <float 41.0, float 42.0, float 43.0>,
5251                              metadata !"fpexcept.strict") #1
5252  ret <3 x float> %max
5253}
5254
5255define <3 x double> @constrained_vector_max_v3f64() #0 {
5256; PC64LE-LABEL: constrained_vector_max_v3f64:
5257; PC64LE:       # %bb.0: # %entry
5258; PC64LE-NEXT:    mflr 0
5259; PC64LE-NEXT:    std 0, 16(1)
5260; PC64LE-NEXT:    stdu 1, -32(1)
5261; PC64LE-NEXT:    addis 3, 2, .LCPI88_0@toc@ha
5262; PC64LE-NEXT:    addis 4, 2, .LCPI88_1@toc@ha
5263; PC64LE-NEXT:    lfs 1, .LCPI88_0@toc@l(3)
5264; PC64LE-NEXT:    lfs 2, .LCPI88_1@toc@l(4)
5265; PC64LE-NEXT:    bl fmax
5266; PC64LE-NEXT:    nop
5267; PC64LE-NEXT:    addis 3, 2, .LCPI88_2@toc@ha
5268; PC64LE-NEXT:    addis 4, 2, .LCPI88_3@toc@ha
5269; PC64LE-NEXT:    fmr 3, 1
5270; PC64LE-NEXT:    addi 3, 3, .LCPI88_2@toc@l
5271; PC64LE-NEXT:    addi 4, 4, .LCPI88_3@toc@l
5272; PC64LE-NEXT:    lxvd2x 0, 0, 3
5273; PC64LE-NEXT:    lxvd2x 2, 0, 4
5274; PC64LE-NEXT:    xxswapd 0, 0
5275; PC64LE-NEXT:    xxswapd 2, 2
5276; PC64LE-NEXT:    xvmaxdp 2, 2, 0
5277; PC64LE-NEXT:    xxswapd 0, 2
5278; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
5279; PC64LE-NEXT:    fmr 1, 0
5280; PC64LE-NEXT:    addi 1, 1, 32
5281; PC64LE-NEXT:    ld 0, 16(1)
5282; PC64LE-NEXT:    mtlr 0
5283; PC64LE-NEXT:    blr
5284;
5285; PC64LE9-LABEL: constrained_vector_max_v3f64:
5286; PC64LE9:       # %bb.0: # %entry
5287; PC64LE9-NEXT:    mflr 0
5288; PC64LE9-NEXT:    std 0, 16(1)
5289; PC64LE9-NEXT:    stdu 1, -32(1)
5290; PC64LE9-NEXT:    addis 3, 2, .LCPI88_0@toc@ha
5291; PC64LE9-NEXT:    lfs 1, .LCPI88_0@toc@l(3)
5292; PC64LE9-NEXT:    addis 3, 2, .LCPI88_1@toc@ha
5293; PC64LE9-NEXT:    lfs 2, .LCPI88_1@toc@l(3)
5294; PC64LE9-NEXT:    bl fmax
5295; PC64LE9-NEXT:    nop
5296; PC64LE9-NEXT:    addis 3, 2, .LCPI88_2@toc@ha
5297; PC64LE9-NEXT:    addi 3, 3, .LCPI88_2@toc@l
5298; PC64LE9-NEXT:    lxvx 0, 0, 3
5299; PC64LE9-NEXT:    addis 3, 2, .LCPI88_3@toc@ha
5300; PC64LE9-NEXT:    addi 3, 3, .LCPI88_3@toc@l
5301; PC64LE9-NEXT:    fmr 3, 1
5302; PC64LE9-NEXT:    lxvx 1, 0, 3
5303; PC64LE9-NEXT:    xvmaxdp 2, 1, 0
5304; PC64LE9-NEXT:    xxswapd 1, 2
5305; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
5306; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
5307; PC64LE9-NEXT:    addi 1, 1, 32
5308; PC64LE9-NEXT:    ld 0, 16(1)
5309; PC64LE9-NEXT:    mtlr 0
5310; PC64LE9-NEXT:    blr
5311entry:
5312  %max = call <3 x double> @llvm.experimental.constrained.maxnum.v3f64(
5313                          <3 x double> <double 43.0, double 44.0, double 45.0>,
5314                          <3 x double> <double 40.0, double 41.0, double 42.0>,
5315                          metadata !"fpexcept.strict") #1
5316  ret <3 x double> %max
5317}
5318
5319define <4 x double> @constrained_vector_maxnum_v4f64() #0 {
5320; PC64LE-LABEL: constrained_vector_maxnum_v4f64:
5321; PC64LE:       # %bb.0: # %entry
5322; PC64LE-NEXT:    addis 3, 2, .LCPI89_0@toc@ha
5323; PC64LE-NEXT:    addis 4, 2, .LCPI89_1@toc@ha
5324; PC64LE-NEXT:    addis 5, 2, .LCPI89_2@toc@ha
5325; PC64LE-NEXT:    addis 6, 2, .LCPI89_3@toc@ha
5326; PC64LE-NEXT:    addi 3, 3, .LCPI89_0@toc@l
5327; PC64LE-NEXT:    addi 4, 4, .LCPI89_1@toc@l
5328; PC64LE-NEXT:    lxvd2x 0, 0, 3
5329; PC64LE-NEXT:    lxvd2x 1, 0, 4
5330; PC64LE-NEXT:    addi 3, 5, .LCPI89_2@toc@l
5331; PC64LE-NEXT:    addi 4, 6, .LCPI89_3@toc@l
5332; PC64LE-NEXT:    lxvd2x 2, 0, 3
5333; PC64LE-NEXT:    lxvd2x 3, 0, 4
5334; PC64LE-NEXT:    xxswapd 0, 0
5335; PC64LE-NEXT:    xxswapd 1, 1
5336; PC64LE-NEXT:    xxswapd 2, 2
5337; PC64LE-NEXT:    xxswapd 3, 3
5338; PC64LE-NEXT:    xvmaxdp 34, 1, 0
5339; PC64LE-NEXT:    xvmaxdp 35, 3, 2
5340; PC64LE-NEXT:    blr
5341;
5342; PC64LE9-LABEL: constrained_vector_maxnum_v4f64:
5343; PC64LE9:       # %bb.0: # %entry
5344; PC64LE9-NEXT:    addis 3, 2, .LCPI89_0@toc@ha
5345; PC64LE9-NEXT:    addi 3, 3, .LCPI89_0@toc@l
5346; PC64LE9-NEXT:    lxvx 0, 0, 3
5347; PC64LE9-NEXT:    addis 3, 2, .LCPI89_1@toc@ha
5348; PC64LE9-NEXT:    addi 3, 3, .LCPI89_1@toc@l
5349; PC64LE9-NEXT:    lxvx 1, 0, 3
5350; PC64LE9-NEXT:    addis 3, 2, .LCPI89_2@toc@ha
5351; PC64LE9-NEXT:    addi 3, 3, .LCPI89_2@toc@l
5352; PC64LE9-NEXT:    xvmaxdp 34, 1, 0
5353; PC64LE9-NEXT:    lxvx 0, 0, 3
5354; PC64LE9-NEXT:    addis 3, 2, .LCPI89_3@toc@ha
5355; PC64LE9-NEXT:    addi 3, 3, .LCPI89_3@toc@l
5356; PC64LE9-NEXT:    lxvx 1, 0, 3
5357; PC64LE9-NEXT:    xvmaxdp 35, 1, 0
5358; PC64LE9-NEXT:    blr
5359entry:
5360  %max = call <4 x double> @llvm.experimental.constrained.maxnum.v4f64(
5361                                <4 x double> <double 44.0, double 45.0,
5362                                              double 46.0, double 47.0>,
5363                                <4 x double> <double 40.0, double 41.0,
5364                                              double 42.0, double 43.0>,
5365                                metadata !"fpexcept.strict") #1
5366  ret <4 x double> %max
5367}
5368
5369define <1 x float> @constrained_vector_minnum_v1f32() #0 {
5370; PC64LE-LABEL: constrained_vector_minnum_v1f32:
5371; PC64LE:       # %bb.0: # %entry
5372; PC64LE-NEXT:    mflr 0
5373; PC64LE-NEXT:    std 0, 16(1)
5374; PC64LE-NEXT:    stdu 1, -32(1)
5375; PC64LE-NEXT:    addis 3, 2, .LCPI90_0@toc@ha
5376; PC64LE-NEXT:    addis 4, 2, .LCPI90_1@toc@ha
5377; PC64LE-NEXT:    lfs 1, .LCPI90_0@toc@l(3)
5378; PC64LE-NEXT:    lfs 2, .LCPI90_1@toc@l(4)
5379; PC64LE-NEXT:    bl fminf
5380; PC64LE-NEXT:    nop
5381; PC64LE-NEXT:    addi 1, 1, 32
5382; PC64LE-NEXT:    ld 0, 16(1)
5383; PC64LE-NEXT:    mtlr 0
5384; PC64LE-NEXT:    blr
5385;
5386; PC64LE9-LABEL: constrained_vector_minnum_v1f32:
5387; PC64LE9:       # %bb.0: # %entry
5388; PC64LE9-NEXT:    mflr 0
5389; PC64LE9-NEXT:    std 0, 16(1)
5390; PC64LE9-NEXT:    stdu 1, -32(1)
5391; PC64LE9-NEXT:    addis 3, 2, .LCPI90_0@toc@ha
5392; PC64LE9-NEXT:    lfs 1, .LCPI90_0@toc@l(3)
5393; PC64LE9-NEXT:    addis 3, 2, .LCPI90_1@toc@ha
5394; PC64LE9-NEXT:    lfs 2, .LCPI90_1@toc@l(3)
5395; PC64LE9-NEXT:    bl fminf
5396; PC64LE9-NEXT:    nop
5397; PC64LE9-NEXT:    addi 1, 1, 32
5398; PC64LE9-NEXT:    ld 0, 16(1)
5399; PC64LE9-NEXT:    mtlr 0
5400; PC64LE9-NEXT:    blr
5401 entry:
5402  %min = call <1 x float> @llvm.experimental.constrained.minnum.v1f32(
5403                               <1 x float> <float 42.0>, <1 x float> <float 41.0>,
5404                               metadata !"fpexcept.strict") #1
5405  ret <1 x float> %min
5406}
5407
5408define <2 x double> @constrained_vector_minnum_v2f64() #0 {
5409; PC64LE-LABEL: constrained_vector_minnum_v2f64:
5410; PC64LE:       # %bb.0: # %entry
5411; PC64LE-NEXT:    addis 3, 2, .LCPI91_0@toc@ha
5412; PC64LE-NEXT:    addis 4, 2, .LCPI91_1@toc@ha
5413; PC64LE-NEXT:    addi 3, 3, .LCPI91_0@toc@l
5414; PC64LE-NEXT:    addi 4, 4, .LCPI91_1@toc@l
5415; PC64LE-NEXT:    lxvd2x 0, 0, 3
5416; PC64LE-NEXT:    lxvd2x 1, 0, 4
5417; PC64LE-NEXT:    xxswapd 0, 0
5418; PC64LE-NEXT:    xxswapd 1, 1
5419; PC64LE-NEXT:    xvmindp 34, 1, 0
5420; PC64LE-NEXT:    blr
5421;
5422; PC64LE9-LABEL: constrained_vector_minnum_v2f64:
5423; PC64LE9:       # %bb.0: # %entry
5424; PC64LE9-NEXT:    addis 3, 2, .LCPI91_0@toc@ha
5425; PC64LE9-NEXT:    addi 3, 3, .LCPI91_0@toc@l
5426; PC64LE9-NEXT:    lxvx 0, 0, 3
5427; PC64LE9-NEXT:    addis 3, 2, .LCPI91_1@toc@ha
5428; PC64LE9-NEXT:    addi 3, 3, .LCPI91_1@toc@l
5429; PC64LE9-NEXT:    lxvx 1, 0, 3
5430; PC64LE9-NEXT:    xvmindp 34, 1, 0
5431; PC64LE9-NEXT:    blr
5432entry:
5433  %min = call <2 x double> @llvm.experimental.constrained.minnum.v2f64(
5434                                <2 x double> <double 43.0, double 42.0>,
5435                                <2 x double> <double 41.0, double 40.0>,
5436                                metadata !"fpexcept.strict") #1
5437  ret <2 x double> %min
5438}
5439
5440define <3 x float> @constrained_vector_minnum_v3f32() #0 {
5441; PC64LE-LABEL: constrained_vector_minnum_v3f32:
5442; PC64LE:       # %bb.0: # %entry
5443; PC64LE-NEXT:    mflr 0
5444; PC64LE-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
5445; PC64LE-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
5446; PC64LE-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
5447; PC64LE-NEXT:    std 0, 16(1)
5448; PC64LE-NEXT:    stdu 1, -64(1)
5449; PC64LE-NEXT:    addis 4, 2, .LCPI92_1@toc@ha
5450; PC64LE-NEXT:    addis 3, 2, .LCPI92_0@toc@ha
5451; PC64LE-NEXT:    lfs 31, .LCPI92_1@toc@l(4)
5452; PC64LE-NEXT:    lfs 1, .LCPI92_0@toc@l(3)
5453; PC64LE-NEXT:    fmr 2, 31
5454; PC64LE-NEXT:    bl fminf
5455; PC64LE-NEXT:    nop
5456; PC64LE-NEXT:    addis 3, 2, .LCPI92_2@toc@ha
5457; PC64LE-NEXT:    addis 4, 2, .LCPI92_3@toc@ha
5458; PC64LE-NEXT:    fmr 30, 1
5459; PC64LE-NEXT:    lfs 1, .LCPI92_2@toc@l(3)
5460; PC64LE-NEXT:    lfs 2, .LCPI92_3@toc@l(4)
5461; PC64LE-NEXT:    bl fminf
5462; PC64LE-NEXT:    nop
5463; PC64LE-NEXT:    fmr 29, 1
5464; PC64LE-NEXT:    addis 3, 2, .LCPI92_4@toc@ha
5465; PC64LE-NEXT:    fmr 1, 31
5466; PC64LE-NEXT:    lfs 2, .LCPI92_4@toc@l(3)
5467; PC64LE-NEXT:    bl fminf
5468; PC64LE-NEXT:    nop
5469; PC64LE-NEXT:    xscvdpspn 0, 29
5470; PC64LE-NEXT:    addis 3, 2, .LCPI92_5@toc@ha
5471; PC64LE-NEXT:    xscvdpspn 1, 1
5472; PC64LE-NEXT:    addi 3, 3, .LCPI92_5@toc@l
5473; PC64LE-NEXT:    lvx 4, 0, 3
5474; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
5475; PC64LE-NEXT:    xscvdpspn 0, 30
5476; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
5477; PC64LE-NEXT:    vmrghw 2, 2, 3
5478; PC64LE-NEXT:    xxsldwi 35, 0, 0, 3
5479; PC64LE-NEXT:    vperm 2, 3, 2, 4
5480; PC64LE-NEXT:    addi 1, 1, 64
5481; PC64LE-NEXT:    ld 0, 16(1)
5482; PC64LE-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
5483; PC64LE-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
5484; PC64LE-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
5485; PC64LE-NEXT:    mtlr 0
5486; PC64LE-NEXT:    blr
5487;
5488; PC64LE9-LABEL: constrained_vector_minnum_v3f32:
5489; PC64LE9:       # %bb.0: # %entry
5490; PC64LE9-NEXT:    mflr 0
5491; PC64LE9-NEXT:    stfd 29, -24(1) # 8-byte Folded Spill
5492; PC64LE9-NEXT:    stfd 30, -16(1) # 8-byte Folded Spill
5493; PC64LE9-NEXT:    stfd 31, -8(1) # 8-byte Folded Spill
5494; PC64LE9-NEXT:    std 0, 16(1)
5495; PC64LE9-NEXT:    stdu 1, -64(1)
5496; PC64LE9-NEXT:    addis 3, 2, .LCPI92_0@toc@ha
5497; PC64LE9-NEXT:    lfs 1, .LCPI92_0@toc@l(3)
5498; PC64LE9-NEXT:    addis 3, 2, .LCPI92_1@toc@ha
5499; PC64LE9-NEXT:    lfs 31, .LCPI92_1@toc@l(3)
5500; PC64LE9-NEXT:    fmr 2, 31
5501; PC64LE9-NEXT:    bl fminf
5502; PC64LE9-NEXT:    nop
5503; PC64LE9-NEXT:    addis 3, 2, .LCPI92_2@toc@ha
5504; PC64LE9-NEXT:    fmr 30, 1
5505; PC64LE9-NEXT:    lfs 1, .LCPI92_2@toc@l(3)
5506; PC64LE9-NEXT:    addis 3, 2, .LCPI92_3@toc@ha
5507; PC64LE9-NEXT:    lfs 2, .LCPI92_3@toc@l(3)
5508; PC64LE9-NEXT:    bl fminf
5509; PC64LE9-NEXT:    nop
5510; PC64LE9-NEXT:    addis 3, 2, .LCPI92_4@toc@ha
5511; PC64LE9-NEXT:    lfs 2, .LCPI92_4@toc@l(3)
5512; PC64LE9-NEXT:    fmr 29, 1
5513; PC64LE9-NEXT:    fmr 1, 31
5514; PC64LE9-NEXT:    bl fminf
5515; PC64LE9-NEXT:    nop
5516; PC64LE9-NEXT:    xscvdpspn 0, 1
5517; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
5518; PC64LE9-NEXT:    xscvdpspn 0, 29
5519; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
5520; PC64LE9-NEXT:    xscvdpspn 0, 30
5521; PC64LE9-NEXT:    addis 3, 2, .LCPI92_5@toc@ha
5522; PC64LE9-NEXT:    addi 3, 3, .LCPI92_5@toc@l
5523; PC64LE9-NEXT:    lxvx 36, 0, 3
5524; PC64LE9-NEXT:    vmrghw 2, 3, 2
5525; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
5526; PC64LE9-NEXT:    vperm 2, 3, 2, 4
5527; PC64LE9-NEXT:    addi 1, 1, 64
5528; PC64LE9-NEXT:    ld 0, 16(1)
5529; PC64LE9-NEXT:    lfd 31, -8(1) # 8-byte Folded Reload
5530; PC64LE9-NEXT:    lfd 30, -16(1) # 8-byte Folded Reload
5531; PC64LE9-NEXT:    mtlr 0
5532; PC64LE9-NEXT:    lfd 29, -24(1) # 8-byte Folded Reload
5533; PC64LE9-NEXT:    blr
5534entry:
5535  %min = call <3 x float> @llvm.experimental.constrained.minnum.v3f32(
5536                              <3 x float> <float 43.0, float 44.0, float 45.0>,
5537                              <3 x float> <float 41.0, float 42.0, float 43.0>,
5538                              metadata !"fpexcept.strict") #1
5539  ret <3 x float> %min
5540}
5541
5542define <3 x double> @constrained_vector_min_v3f64() #0 {
5543; PC64LE-LABEL: constrained_vector_min_v3f64:
5544; PC64LE:       # %bb.0: # %entry
5545; PC64LE-NEXT:    mflr 0
5546; PC64LE-NEXT:    std 0, 16(1)
5547; PC64LE-NEXT:    stdu 1, -32(1)
5548; PC64LE-NEXT:    addis 3, 2, .LCPI93_0@toc@ha
5549; PC64LE-NEXT:    addis 4, 2, .LCPI93_1@toc@ha
5550; PC64LE-NEXT:    lfs 1, .LCPI93_0@toc@l(3)
5551; PC64LE-NEXT:    lfs 2, .LCPI93_1@toc@l(4)
5552; PC64LE-NEXT:    bl fmin
5553; PC64LE-NEXT:    nop
5554; PC64LE-NEXT:    addis 3, 2, .LCPI93_2@toc@ha
5555; PC64LE-NEXT:    addis 4, 2, .LCPI93_3@toc@ha
5556; PC64LE-NEXT:    fmr 3, 1
5557; PC64LE-NEXT:    addi 3, 3, .LCPI93_2@toc@l
5558; PC64LE-NEXT:    addi 4, 4, .LCPI93_3@toc@l
5559; PC64LE-NEXT:    lxvd2x 0, 0, 3
5560; PC64LE-NEXT:    lxvd2x 2, 0, 4
5561; PC64LE-NEXT:    xxswapd 0, 0
5562; PC64LE-NEXT:    xxswapd 2, 2
5563; PC64LE-NEXT:    xvmindp 2, 2, 0
5564; PC64LE-NEXT:    xxswapd 0, 2
5565; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
5566; PC64LE-NEXT:    fmr 1, 0
5567; PC64LE-NEXT:    addi 1, 1, 32
5568; PC64LE-NEXT:    ld 0, 16(1)
5569; PC64LE-NEXT:    mtlr 0
5570; PC64LE-NEXT:    blr
5571;
5572; PC64LE9-LABEL: constrained_vector_min_v3f64:
5573; PC64LE9:       # %bb.0: # %entry
5574; PC64LE9-NEXT:    mflr 0
5575; PC64LE9-NEXT:    std 0, 16(1)
5576; PC64LE9-NEXT:    stdu 1, -32(1)
5577; PC64LE9-NEXT:    addis 3, 2, .LCPI93_0@toc@ha
5578; PC64LE9-NEXT:    lfs 1, .LCPI93_0@toc@l(3)
5579; PC64LE9-NEXT:    addis 3, 2, .LCPI93_1@toc@ha
5580; PC64LE9-NEXT:    lfs 2, .LCPI93_1@toc@l(3)
5581; PC64LE9-NEXT:    bl fmin
5582; PC64LE9-NEXT:    nop
5583; PC64LE9-NEXT:    addis 3, 2, .LCPI93_2@toc@ha
5584; PC64LE9-NEXT:    addi 3, 3, .LCPI93_2@toc@l
5585; PC64LE9-NEXT:    lxvx 0, 0, 3
5586; PC64LE9-NEXT:    addis 3, 2, .LCPI93_3@toc@ha
5587; PC64LE9-NEXT:    addi 3, 3, .LCPI93_3@toc@l
5588; PC64LE9-NEXT:    fmr 3, 1
5589; PC64LE9-NEXT:    lxvx 1, 0, 3
5590; PC64LE9-NEXT:    xvmindp 2, 1, 0
5591; PC64LE9-NEXT:    xxswapd 1, 2
5592; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
5593; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
5594; PC64LE9-NEXT:    addi 1, 1, 32
5595; PC64LE9-NEXT:    ld 0, 16(1)
5596; PC64LE9-NEXT:    mtlr 0
5597; PC64LE9-NEXT:    blr
5598entry:
5599 %min = call <3 x double> @llvm.experimental.constrained.minnum.v3f64(
5600                          <3 x double> <double 43.0, double 44.0, double 45.0>,
5601                          <3 x double> <double 40.0, double 41.0, double 42.0>,
5602                          metadata !"fpexcept.strict") #1
5603  ret <3 x double> %min
5604}
5605
5606define <4 x double> @constrained_vector_minnum_v4f64() #0 {
5607; PC64LE-LABEL: constrained_vector_minnum_v4f64:
5608; PC64LE:       # %bb.0: # %entry
5609; PC64LE-NEXT:    addis 3, 2, .LCPI94_0@toc@ha
5610; PC64LE-NEXT:    addis 4, 2, .LCPI94_1@toc@ha
5611; PC64LE-NEXT:    addis 5, 2, .LCPI94_2@toc@ha
5612; PC64LE-NEXT:    addis 6, 2, .LCPI94_3@toc@ha
5613; PC64LE-NEXT:    addi 3, 3, .LCPI94_0@toc@l
5614; PC64LE-NEXT:    addi 4, 4, .LCPI94_1@toc@l
5615; PC64LE-NEXT:    lxvd2x 0, 0, 3
5616; PC64LE-NEXT:    lxvd2x 1, 0, 4
5617; PC64LE-NEXT:    addi 3, 5, .LCPI94_2@toc@l
5618; PC64LE-NEXT:    addi 4, 6, .LCPI94_3@toc@l
5619; PC64LE-NEXT:    lxvd2x 2, 0, 3
5620; PC64LE-NEXT:    lxvd2x 3, 0, 4
5621; PC64LE-NEXT:    xxswapd 0, 0
5622; PC64LE-NEXT:    xxswapd 1, 1
5623; PC64LE-NEXT:    xxswapd 2, 2
5624; PC64LE-NEXT:    xxswapd 3, 3
5625; PC64LE-NEXT:    xvmindp 34, 1, 0
5626; PC64LE-NEXT:    xvmindp 35, 3, 2
5627; PC64LE-NEXT:    blr
5628;
5629; PC64LE9-LABEL: constrained_vector_minnum_v4f64:
5630; PC64LE9:       # %bb.0: # %entry
5631; PC64LE9-NEXT:    addis 3, 2, .LCPI94_0@toc@ha
5632; PC64LE9-NEXT:    addi 3, 3, .LCPI94_0@toc@l
5633; PC64LE9-NEXT:    lxvx 0, 0, 3
5634; PC64LE9-NEXT:    addis 3, 2, .LCPI94_1@toc@ha
5635; PC64LE9-NEXT:    addi 3, 3, .LCPI94_1@toc@l
5636; PC64LE9-NEXT:    lxvx 1, 0, 3
5637; PC64LE9-NEXT:    addis 3, 2, .LCPI94_2@toc@ha
5638; PC64LE9-NEXT:    addi 3, 3, .LCPI94_2@toc@l
5639; PC64LE9-NEXT:    xvmindp 34, 1, 0
5640; PC64LE9-NEXT:    lxvx 0, 0, 3
5641; PC64LE9-NEXT:    addis 3, 2, .LCPI94_3@toc@ha
5642; PC64LE9-NEXT:    addi 3, 3, .LCPI94_3@toc@l
5643; PC64LE9-NEXT:    lxvx 1, 0, 3
5644; PC64LE9-NEXT:    xvmindp 35, 1, 0
5645; PC64LE9-NEXT:    blr
5646entry:
5647  %min = call <4 x double> @llvm.experimental.constrained.minnum.v4f64(
5648                                <4 x double> <double 44.0, double 45.0,
5649                                              double 46.0, double 47.0>,
5650                                <4 x double> <double 40.0, double 41.0,
5651                                              double 42.0, double 43.0>,
5652                                metadata !"fpexcept.strict") #1
5653  ret <4 x double> %min
5654}
5655
5656define <1 x float> @constrained_vector_fptrunc_v1f64() #0 {
5657; PC64LE-LABEL: constrained_vector_fptrunc_v1f64:
5658; PC64LE:       # %bb.0: # %entry
5659; PC64LE-NEXT:    addis 3, 2, .LCPI95_0@toc@ha
5660; PC64LE-NEXT:    lfd 0, .LCPI95_0@toc@l(3)
5661; PC64LE-NEXT:    xsrsp 1, 0
5662; PC64LE-NEXT:    blr
5663;
5664; PC64LE9-LABEL: constrained_vector_fptrunc_v1f64:
5665; PC64LE9:       # %bb.0: # %entry
5666; PC64LE9-NEXT:    addis 3, 2, .LCPI95_0@toc@ha
5667; PC64LE9-NEXT:    lfd 0, .LCPI95_0@toc@l(3)
5668; PC64LE9-NEXT:    xsrsp 1, 0
5669; PC64LE9-NEXT:    blr
5670entry:
5671  %result = call <1 x float> @llvm.experimental.constrained.fptrunc.v1f32.v1f64(
5672                                <1 x double><double 42.1>,
5673                                metadata !"round.dynamic",
5674                                metadata !"fpexcept.strict") #1
5675  ret <1 x float> %result
5676}
5677
5678define <2 x float> @constrained_vector_fptrunc_v2f64() #0 {
5679; PC64LE-LABEL: constrained_vector_fptrunc_v2f64:
5680; PC64LE:       # %bb.0: # %entry
5681; PC64LE-NEXT:    addis 3, 2, .LCPI96_0@toc@ha
5682; PC64LE-NEXT:    addis 4, 2, .LCPI96_1@toc@ha
5683; PC64LE-NEXT:    lfd 0, .LCPI96_0@toc@l(3)
5684; PC64LE-NEXT:    lfd 1, .LCPI96_1@toc@l(4)
5685; PC64LE-NEXT:    xsrsp 0, 0
5686; PC64LE-NEXT:    xsrsp 1, 1
5687; PC64LE-NEXT:    xscvdpspn 0, 0
5688; PC64LE-NEXT:    xscvdpspn 1, 1
5689; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
5690; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
5691; PC64LE-NEXT:    vmrghw 2, 3, 2
5692; PC64LE-NEXT:    blr
5693;
5694; PC64LE9-LABEL: constrained_vector_fptrunc_v2f64:
5695; PC64LE9:       # %bb.0: # %entry
5696; PC64LE9-NEXT:    addis 3, 2, .LCPI96_0@toc@ha
5697; PC64LE9-NEXT:    lfd 0, .LCPI96_0@toc@l(3)
5698; PC64LE9-NEXT:    addis 3, 2, .LCPI96_1@toc@ha
5699; PC64LE9-NEXT:    xsrsp 0, 0
5700; PC64LE9-NEXT:    xscvdpspn 0, 0
5701; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
5702; PC64LE9-NEXT:    lfd 0, .LCPI96_1@toc@l(3)
5703; PC64LE9-NEXT:    xsrsp 0, 0
5704; PC64LE9-NEXT:    xscvdpspn 0, 0
5705; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
5706; PC64LE9-NEXT:    vmrghw 2, 3, 2
5707; PC64LE9-NEXT:    blr
5708entry:
5709  %result = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(
5710                                <2 x double><double 42.1, double 42.2>,
5711                                metadata !"round.dynamic",
5712                                metadata !"fpexcept.strict") #1
5713  ret <2 x float> %result
5714}
5715
5716define <3 x float> @constrained_vector_fptrunc_v3f64() #0 {
5717; PC64LE-LABEL: constrained_vector_fptrunc_v3f64:
5718; PC64LE:       # %bb.0: # %entry
5719; PC64LE-NEXT:    addis 3, 2, .LCPI97_0@toc@ha
5720; PC64LE-NEXT:    addis 4, 2, .LCPI97_1@toc@ha
5721; PC64LE-NEXT:    lfd 0, .LCPI97_0@toc@l(3)
5722; PC64LE-NEXT:    lfd 1, .LCPI97_1@toc@l(4)
5723; PC64LE-NEXT:    addis 3, 2, .LCPI97_3@toc@ha
5724; PC64LE-NEXT:    xsrsp 0, 0
5725; PC64LE-NEXT:    lfd 2, .LCPI97_3@toc@l(3)
5726; PC64LE-NEXT:    addis 3, 2, .LCPI97_2@toc@ha
5727; PC64LE-NEXT:    xsrsp 1, 1
5728; PC64LE-NEXT:    addi 3, 3, .LCPI97_2@toc@l
5729; PC64LE-NEXT:    xsrsp 2, 2
5730; PC64LE-NEXT:    xscvdpspn 0, 0
5731; PC64LE-NEXT:    xscvdpspn 1, 1
5732; PC64LE-NEXT:    xxsldwi 34, 0, 0, 3
5733; PC64LE-NEXT:    xscvdpspn 0, 2
5734; PC64LE-NEXT:    xxsldwi 35, 1, 1, 3
5735; PC64LE-NEXT:    vmrghw 2, 3, 2
5736; PC64LE-NEXT:    lvx 3, 0, 3
5737; PC64LE-NEXT:    xxsldwi 36, 0, 0, 3
5738; PC64LE-NEXT:    vperm 2, 4, 2, 3
5739; PC64LE-NEXT:    blr
5740;
5741; PC64LE9-LABEL: constrained_vector_fptrunc_v3f64:
5742; PC64LE9:       # %bb.0: # %entry
5743; PC64LE9-NEXT:    addis 3, 2, .LCPI97_0@toc@ha
5744; PC64LE9-NEXT:    lfd 0, .LCPI97_0@toc@l(3)
5745; PC64LE9-NEXT:    addis 3, 2, .LCPI97_1@toc@ha
5746; PC64LE9-NEXT:    xsrsp 0, 0
5747; PC64LE9-NEXT:    xscvdpspn 0, 0
5748; PC64LE9-NEXT:    xxsldwi 34, 0, 0, 3
5749; PC64LE9-NEXT:    lfd 0, .LCPI97_1@toc@l(3)
5750; PC64LE9-NEXT:    addis 3, 2, .LCPI97_2@toc@ha
5751; PC64LE9-NEXT:    addi 3, 3, .LCPI97_2@toc@l
5752; PC64LE9-NEXT:    xsrsp 0, 0
5753; PC64LE9-NEXT:    xscvdpspn 0, 0
5754; PC64LE9-NEXT:    xxsldwi 35, 0, 0, 3
5755; PC64LE9-NEXT:    vmrghw 2, 3, 2
5756; PC64LE9-NEXT:    lxvx 35, 0, 3
5757; PC64LE9-NEXT:    addis 3, 2, .LCPI97_3@toc@ha
5758; PC64LE9-NEXT:    lfd 0, .LCPI97_3@toc@l(3)
5759; PC64LE9-NEXT:    xsrsp 0, 0
5760; PC64LE9-NEXT:    xscvdpspn 0, 0
5761; PC64LE9-NEXT:    xxsldwi 36, 0, 0, 3
5762; PC64LE9-NEXT:    vperm 2, 4, 2, 3
5763; PC64LE9-NEXT:    blr
5764entry:
5765  %result = call <3 x float> @llvm.experimental.constrained.fptrunc.v3f32.v3f64(
5766                                <3 x double><double 42.1, double 42.2,
5767                                             double 42.3>,
5768                                metadata !"round.dynamic",
5769                                metadata !"fpexcept.strict") #1
5770  ret <3 x float> %result
5771}
5772
5773define <4 x float> @constrained_vector_fptrunc_v4f64() #0 {
5774; PC64LE-LABEL: constrained_vector_fptrunc_v4f64:
5775; PC64LE:       # %bb.0: # %entry
5776; PC64LE-NEXT:    addis 3, 2, .LCPI98_0@toc@ha
5777; PC64LE-NEXT:    addis 4, 2, .LCPI98_1@toc@ha
5778; PC64LE-NEXT:    addis 5, 2, .LCPI98_2@toc@ha
5779; PC64LE-NEXT:    addis 6, 2, .LCPI98_3@toc@ha
5780; PC64LE-NEXT:    lfd 0, .LCPI98_0@toc@l(3)
5781; PC64LE-NEXT:    lfd 1, .LCPI98_1@toc@l(4)
5782; PC64LE-NEXT:    lfd 2, .LCPI98_2@toc@l(5)
5783; PC64LE-NEXT:    lfd 3, .LCPI98_3@toc@l(6)
5784; PC64LE-NEXT:    xxmrghd 0, 1, 0
5785; PC64LE-NEXT:    xxmrghd 1, 3, 2
5786; PC64LE-NEXT:    xvcvdpsp 34, 0
5787; PC64LE-NEXT:    xvcvdpsp 35, 1
5788; PC64LE-NEXT:    vmrgew 2, 3, 2
5789; PC64LE-NEXT:    blr
5790;
5791; PC64LE9-LABEL: constrained_vector_fptrunc_v4f64:
5792; PC64LE9:       # %bb.0: # %entry
5793; PC64LE9-NEXT:    addis 3, 2, .LCPI98_0@toc@ha
5794; PC64LE9-NEXT:    lfd 0, .LCPI98_0@toc@l(3)
5795; PC64LE9-NEXT:    addis 3, 2, .LCPI98_1@toc@ha
5796; PC64LE9-NEXT:    lfd 1, .LCPI98_1@toc@l(3)
5797; PC64LE9-NEXT:    addis 3, 2, .LCPI98_2@toc@ha
5798; PC64LE9-NEXT:    xxmrghd 0, 1, 0
5799; PC64LE9-NEXT:    xvcvdpsp 34, 0
5800; PC64LE9-NEXT:    lfd 0, .LCPI98_2@toc@l(3)
5801; PC64LE9-NEXT:    addis 3, 2, .LCPI98_3@toc@ha
5802; PC64LE9-NEXT:    lfd 1, .LCPI98_3@toc@l(3)
5803; PC64LE9-NEXT:    xxmrghd 0, 1, 0
5804; PC64LE9-NEXT:    xvcvdpsp 35, 0
5805; PC64LE9-NEXT:    vmrgew 2, 3, 2
5806; PC64LE9-NEXT:    blr
5807entry:
5808  %result = call <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(
5809                                <4 x double><double 42.1, double 42.2,
5810                                             double 42.3, double 42.4>,
5811                                metadata !"round.dynamic",
5812                                metadata !"fpexcept.strict") #1
5813  ret <4 x float> %result
5814}
5815
5816define <1 x double> @constrained_vector_fpext_v1f32() #0 {
5817; PC64LE-LABEL: constrained_vector_fpext_v1f32:
5818; PC64LE:       # %bb.0: # %entry
5819; PC64LE-NEXT:    addis 3, 2, .LCPI99_0@toc@ha
5820; PC64LE-NEXT:    lfs 1, .LCPI99_0@toc@l(3)
5821; PC64LE-NEXT:    blr
5822;
5823; PC64LE9-LABEL: constrained_vector_fpext_v1f32:
5824; PC64LE9:       # %bb.0: # %entry
5825; PC64LE9-NEXT:    addis 3, 2, .LCPI99_0@toc@ha
5826; PC64LE9-NEXT:    lfs 1, .LCPI99_0@toc@l(3)
5827; PC64LE9-NEXT:    blr
5828entry:
5829  %result = call <1 x double> @llvm.experimental.constrained.fpext.v1f64.v1f32(
5830                                <1 x float><float 42.0>,
5831                                metadata !"fpexcept.strict") #1
5832  ret <1 x double> %result
5833}
5834
5835define <2 x double> @constrained_vector_fpext_v2f32() #0 {
5836; PC64LE-LABEL: constrained_vector_fpext_v2f32:
5837; PC64LE:       # %bb.0: # %entry
5838; PC64LE-NEXT:    addis 3, 2, .LCPI100_0@toc@ha
5839; PC64LE-NEXT:    addis 4, 2, .LCPI100_1@toc@ha
5840; PC64LE-NEXT:    lfs 0, .LCPI100_0@toc@l(3)
5841; PC64LE-NEXT:    lfs 1, .LCPI100_1@toc@l(4)
5842; PC64LE-NEXT:    xxmrghd 34, 1, 0
5843; PC64LE-NEXT:    blr
5844;
5845; PC64LE9-LABEL: constrained_vector_fpext_v2f32:
5846; PC64LE9:       # %bb.0: # %entry
5847; PC64LE9-NEXT:    addis 3, 2, .LCPI100_0@toc@ha
5848; PC64LE9-NEXT:    lfs 0, .LCPI100_0@toc@l(3)
5849; PC64LE9-NEXT:    addis 3, 2, .LCPI100_1@toc@ha
5850; PC64LE9-NEXT:    lfs 1, .LCPI100_1@toc@l(3)
5851; PC64LE9-NEXT:    xxmrghd 34, 1, 0
5852; PC64LE9-NEXT:    blr
5853entry:
5854  %result = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(
5855                                <2 x float><float 42.0, float 43.0>,
5856                                metadata !"fpexcept.strict") #1
5857  ret <2 x double> %result
5858}
5859
5860define <3 x double> @constrained_vector_fpext_v3f32() #0 {
5861; PC64LE-LABEL: constrained_vector_fpext_v3f32:
5862; PC64LE:       # %bb.0: # %entry
5863; PC64LE-NEXT:    addis 3, 2, .LCPI101_0@toc@ha
5864; PC64LE-NEXT:    addis 4, 2, .LCPI101_1@toc@ha
5865; PC64LE-NEXT:    addis 5, 2, .LCPI101_2@toc@ha
5866; PC64LE-NEXT:    lfs 1, .LCPI101_0@toc@l(3)
5867; PC64LE-NEXT:    lfs 2, .LCPI101_1@toc@l(4)
5868; PC64LE-NEXT:    lfs 3, .LCPI101_2@toc@l(5)
5869; PC64LE-NEXT:    blr
5870;
5871; PC64LE9-LABEL: constrained_vector_fpext_v3f32:
5872; PC64LE9:       # %bb.0: # %entry
5873; PC64LE9-NEXT:    addis 3, 2, .LCPI101_0@toc@ha
5874; PC64LE9-NEXT:    lfs 1, .LCPI101_0@toc@l(3)
5875; PC64LE9-NEXT:    addis 3, 2, .LCPI101_1@toc@ha
5876; PC64LE9-NEXT:    lfs 2, .LCPI101_1@toc@l(3)
5877; PC64LE9-NEXT:    addis 3, 2, .LCPI101_2@toc@ha
5878; PC64LE9-NEXT:    lfs 3, .LCPI101_2@toc@l(3)
5879; PC64LE9-NEXT:    blr
5880entry:
5881  %result = call <3 x double> @llvm.experimental.constrained.fpext.v3f64.v3f32(
5882                                <3 x float><float 42.0, float 43.0,
5883                                            float 44.0>,
5884                                metadata !"fpexcept.strict") #1
5885  ret <3 x double> %result
5886}
5887
5888define <4 x double> @constrained_vector_fpext_v4f32() #0 {
5889; PC64LE-LABEL: constrained_vector_fpext_v4f32:
5890; PC64LE:       # %bb.0: # %entry
5891; PC64LE-NEXT:    addis 3, 2, .LCPI102_0@toc@ha
5892; PC64LE-NEXT:    addis 4, 2, .LCPI102_1@toc@ha
5893; PC64LE-NEXT:    addis 5, 2, .LCPI102_2@toc@ha
5894; PC64LE-NEXT:    addis 6, 2, .LCPI102_3@toc@ha
5895; PC64LE-NEXT:    lfs 0, .LCPI102_0@toc@l(3)
5896; PC64LE-NEXT:    lfs 1, .LCPI102_1@toc@l(4)
5897; PC64LE-NEXT:    lfs 2, .LCPI102_2@toc@l(5)
5898; PC64LE-NEXT:    lfs 3, .LCPI102_3@toc@l(6)
5899; PC64LE-NEXT:    xxmrghd 34, 1, 0
5900; PC64LE-NEXT:    xxmrghd 35, 3, 2
5901; PC64LE-NEXT:    blr
5902;
5903; PC64LE9-LABEL: constrained_vector_fpext_v4f32:
5904; PC64LE9:       # %bb.0: # %entry
5905; PC64LE9-NEXT:    addis 3, 2, .LCPI102_0@toc@ha
5906; PC64LE9-NEXT:    lfs 0, .LCPI102_0@toc@l(3)
5907; PC64LE9-NEXT:    addis 3, 2, .LCPI102_1@toc@ha
5908; PC64LE9-NEXT:    lfs 1, .LCPI102_1@toc@l(3)
5909; PC64LE9-NEXT:    addis 3, 2, .LCPI102_2@toc@ha
5910; PC64LE9-NEXT:    xxmrghd 34, 1, 0
5911; PC64LE9-NEXT:    lfs 0, .LCPI102_2@toc@l(3)
5912; PC64LE9-NEXT:    addis 3, 2, .LCPI102_3@toc@ha
5913; PC64LE9-NEXT:    lfs 1, .LCPI102_3@toc@l(3)
5914; PC64LE9-NEXT:    xxmrghd 35, 1, 0
5915; PC64LE9-NEXT:    blr
5916entry:
5917  %result = call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(
5918                                <4 x float><float 42.0, float 43.0,
5919                                            float 44.0, float 45.0>,
5920                                metadata !"fpexcept.strict") #1
5921  ret <4 x double> %result
5922}
5923
5924define <1 x float> @constrained_vector_ceil_v1f32() #0 {
5925; PC64LE-LABEL: constrained_vector_ceil_v1f32:
5926; PC64LE:       # %bb.0: # %entry
5927; PC64LE-NEXT:    addis 3, 2, .LCPI103_0@toc@ha
5928; PC64LE-NEXT:    lfs 0, .LCPI103_0@toc@l(3)
5929; PC64LE-NEXT:    addis 3, 2, .LCPI103_1@toc@ha
5930; PC64LE-NEXT:    lfs 1, .LCPI103_1@toc@l(3)
5931; PC64LE-NEXT:    xsrdpip 0, 0
5932; PC64LE-NEXT:    blr
5933;
5934; PC64LE9-LABEL: constrained_vector_ceil_v1f32:
5935; PC64LE9:       # %bb.0: # %entry
5936; PC64LE9-NEXT:    addis 3, 2, .LCPI103_0@toc@ha
5937; PC64LE9-NEXT:    lfs 0, .LCPI103_0@toc@l(3)
5938; PC64LE9-NEXT:    addis 3, 2, .LCPI103_1@toc@ha
5939; PC64LE9-NEXT:    lfs 1, .LCPI103_1@toc@l(3)
5940; PC64LE9-NEXT:    xsrdpip 0, 0
5941; PC64LE9-NEXT:    blr
5942entry:
5943  %ceil = call <1 x float> @llvm.experimental.constrained.ceil.v1f32(
5944                               <1 x float> <float 1.5>,
5945                               metadata !"fpexcept.strict") #1
5946  ret <1 x float> %ceil
5947}
5948
5949define <2 x double> @constrained_vector_ceil_v2f64() #0 {
5950; PC64LE-LABEL: constrained_vector_ceil_v2f64:
5951; PC64LE:       # %bb.0: # %entry
5952; PC64LE-NEXT:    addis 3, 2, .LCPI104_0@toc@ha
5953; PC64LE-NEXT:    addis 4, 2, .LCPI104_1@toc@ha
5954; PC64LE-NEXT:    addi 3, 3, .LCPI104_0@toc@l
5955; PC64LE-NEXT:    lxvd2x 0, 0, 3
5956; PC64LE-NEXT:    addi 3, 4, .LCPI104_1@toc@l
5957; PC64LE-NEXT:    lxvd2x 1, 0, 3
5958; PC64LE-NEXT:    xvrdpip 0, 0
5959; PC64LE-NEXT:    xxswapd 34, 1
5960; PC64LE-NEXT:    blr
5961;
5962; PC64LE9-LABEL: constrained_vector_ceil_v2f64:
5963; PC64LE9:       # %bb.0: # %entry
5964; PC64LE9-NEXT:    addis 3, 2, .LCPI104_0@toc@ha
5965; PC64LE9-NEXT:    addi 3, 3, .LCPI104_0@toc@l
5966; PC64LE9-NEXT:    lxvx 0, 0, 3
5967; PC64LE9-NEXT:    addis 3, 2, .LCPI104_1@toc@ha
5968; PC64LE9-NEXT:    addi 3, 3, .LCPI104_1@toc@l
5969; PC64LE9-NEXT:    lxvx 34, 0, 3
5970; PC64LE9-NEXT:    xvrdpip 0, 0
5971; PC64LE9-NEXT:    blr
5972entry:
5973  %ceil = call <2 x double> @llvm.experimental.constrained.ceil.v2f64(
5974                                <2 x double> <double 1.1, double 1.9>,
5975                                metadata !"fpexcept.strict") #1
5976  ret <2 x double> %ceil
5977}
5978
5979define <3 x float> @constrained_vector_ceil_v3f32() #0 {
5980; PC64LE-LABEL: constrained_vector_ceil_v3f32:
5981; PC64LE:       # %bb.0: # %entry
5982; PC64LE-NEXT:    addis 3, 2, .LCPI105_0@toc@ha
5983; PC64LE-NEXT:    addis 4, 2, .LCPI105_1@toc@ha
5984; PC64LE-NEXT:    lfs 0, .LCPI105_0@toc@l(3)
5985; PC64LE-NEXT:    addis 3, 2, .LCPI105_2@toc@ha
5986; PC64LE-NEXT:    lfs 1, .LCPI105_1@toc@l(4)
5987; PC64LE-NEXT:    lfs 2, .LCPI105_2@toc@l(3)
5988; PC64LE-NEXT:    addis 3, 2, .LCPI105_3@toc@ha
5989; PC64LE-NEXT:    addi 3, 3, .LCPI105_3@toc@l
5990; PC64LE-NEXT:    xsrdpip 0, 0
5991; PC64LE-NEXT:    lvx 2, 0, 3
5992; PC64LE-NEXT:    xsrdpip 0, 1
5993; PC64LE-NEXT:    xsrdpip 0, 2
5994; PC64LE-NEXT:    blr
5995;
5996; PC64LE9-LABEL: constrained_vector_ceil_v3f32:
5997; PC64LE9:       # %bb.0: # %entry
5998; PC64LE9-NEXT:    addis 3, 2, .LCPI105_0@toc@ha
5999; PC64LE9-NEXT:    lfs 0, .LCPI105_0@toc@l(3)
6000; PC64LE9-NEXT:    addis 3, 2, .LCPI105_1@toc@ha
6001; PC64LE9-NEXT:    xsrdpip 0, 0
6002; PC64LE9-NEXT:    lfs 0, .LCPI105_1@toc@l(3)
6003; PC64LE9-NEXT:    addis 3, 2, .LCPI105_2@toc@ha
6004; PC64LE9-NEXT:    xsrdpip 0, 0
6005; PC64LE9-NEXT:    lfs 0, .LCPI105_2@toc@l(3)
6006; PC64LE9-NEXT:    addis 3, 2, .LCPI105_3@toc@ha
6007; PC64LE9-NEXT:    addi 3, 3, .LCPI105_3@toc@l
6008; PC64LE9-NEXT:    lxvx 34, 0, 3
6009; PC64LE9-NEXT:    xsrdpip 0, 0
6010; PC64LE9-NEXT:    blr
6011entry:
6012  %ceil = call <3 x float> @llvm.experimental.constrained.ceil.v3f32(
6013                              <3 x float> <float 1.5, float 2.5, float 3.5>,
6014                              metadata !"fpexcept.strict") #1
6015  ret <3 x float> %ceil
6016}
6017
6018define <3 x double> @constrained_vector_ceil_v3f64() #0 {
6019; PC64LE-LABEL: constrained_vector_ceil_v3f64:
6020; PC64LE:       # %bb.0: # %entry
6021; PC64LE-NEXT:    addis 3, 2, .LCPI106_0@toc@ha
6022; PC64LE-NEXT:    addis 4, 2, .LCPI106_1@toc@ha
6023; PC64LE-NEXT:    lfs 0, .LCPI106_0@toc@l(3)
6024; PC64LE-NEXT:    addi 3, 4, .LCPI106_1@toc@l
6025; PC64LE-NEXT:    lxvd2x 1, 0, 3
6026; PC64LE-NEXT:    addis 3, 2, .LCPI106_2@toc@ha
6027; PC64LE-NEXT:    xsrdpip 0, 0
6028; PC64LE-NEXT:    xvrdpip 0, 1
6029; PC64LE-NEXT:    lfs 1, .LCPI106_2@toc@l(3)
6030; PC64LE-NEXT:    fmr 2, 1
6031; PC64LE-NEXT:    fmr 3, 1
6032; PC64LE-NEXT:    blr
6033;
6034; PC64LE9-LABEL: constrained_vector_ceil_v3f64:
6035; PC64LE9:       # %bb.0: # %entry
6036; PC64LE9-NEXT:    addis 3, 2, .LCPI106_0@toc@ha
6037; PC64LE9-NEXT:    lfs 0, .LCPI106_0@toc@l(3)
6038; PC64LE9-NEXT:    addis 3, 2, .LCPI106_1@toc@ha
6039; PC64LE9-NEXT:    addi 3, 3, .LCPI106_1@toc@l
6040; PC64LE9-NEXT:    xsrdpip 0, 0
6041; PC64LE9-NEXT:    lxvx 0, 0, 3
6042; PC64LE9-NEXT:    addis 3, 2, .LCPI106_2@toc@ha
6043; PC64LE9-NEXT:    lfs 1, .LCPI106_2@toc@l(3)
6044; PC64LE9-NEXT:    xvrdpip 0, 0
6045; PC64LE9-NEXT:    fmr 2, 1
6046; PC64LE9-NEXT:    fmr 3, 1
6047; PC64LE9-NEXT:    blr
6048entry:
6049  %ceil = call <3 x double> @llvm.experimental.constrained.ceil.v3f64(
6050                          <3 x double> <double 1.1, double 1.9, double 1.5>,
6051                          metadata !"fpexcept.strict") #1
6052  ret <3 x double> %ceil
6053}
6054
6055define <1 x float> @constrained_vector_floor_v1f32() #0 {
6056; PC64LE-LABEL: constrained_vector_floor_v1f32:
6057; PC64LE:       # %bb.0: # %entry
6058; PC64LE-NEXT:    addis 3, 2, .LCPI107_0@toc@ha
6059; PC64LE-NEXT:    lfs 0, .LCPI107_0@toc@l(3)
6060; PC64LE-NEXT:    addis 3, 2, .LCPI107_1@toc@ha
6061; PC64LE-NEXT:    lfs 1, .LCPI107_1@toc@l(3)
6062; PC64LE-NEXT:    xsrdpim 0, 0
6063; PC64LE-NEXT:    blr
6064;
6065; PC64LE9-LABEL: constrained_vector_floor_v1f32:
6066; PC64LE9:       # %bb.0: # %entry
6067; PC64LE9-NEXT:    addis 3, 2, .LCPI107_0@toc@ha
6068; PC64LE9-NEXT:    lfs 0, .LCPI107_0@toc@l(3)
6069; PC64LE9-NEXT:    addis 3, 2, .LCPI107_1@toc@ha
6070; PC64LE9-NEXT:    lfs 1, .LCPI107_1@toc@l(3)
6071; PC64LE9-NEXT:    xsrdpim 0, 0
6072; PC64LE9-NEXT:    blr
6073entry:
6074  %floor = call <1 x float> @llvm.experimental.constrained.floor.v1f32(
6075                               <1 x float> <float 1.5>,
6076                               metadata !"fpexcept.strict") #1
6077  ret <1 x float> %floor
6078}
6079
6080
6081define <2 x double> @constrained_vector_floor_v2f64() #0 {
6082; PC64LE-LABEL: constrained_vector_floor_v2f64:
6083; PC64LE:       # %bb.0: # %entry
6084; PC64LE-NEXT:    addis 3, 2, .LCPI108_0@toc@ha
6085; PC64LE-NEXT:    addis 4, 2, .LCPI108_1@toc@ha
6086; PC64LE-NEXT:    addi 3, 3, .LCPI108_0@toc@l
6087; PC64LE-NEXT:    lxvd2x 0, 0, 3
6088; PC64LE-NEXT:    addi 3, 4, .LCPI108_1@toc@l
6089; PC64LE-NEXT:    lxvd2x 1, 0, 3
6090; PC64LE-NEXT:    xvrdpim 0, 0
6091; PC64LE-NEXT:    xxswapd 34, 1
6092; PC64LE-NEXT:    blr
6093;
6094; PC64LE9-LABEL: constrained_vector_floor_v2f64:
6095; PC64LE9:       # %bb.0: # %entry
6096; PC64LE9-NEXT:    addis 3, 2, .LCPI108_0@toc@ha
6097; PC64LE9-NEXT:    addi 3, 3, .LCPI108_0@toc@l
6098; PC64LE9-NEXT:    lxvx 0, 0, 3
6099; PC64LE9-NEXT:    addis 3, 2, .LCPI108_1@toc@ha
6100; PC64LE9-NEXT:    addi 3, 3, .LCPI108_1@toc@l
6101; PC64LE9-NEXT:    lxvx 34, 0, 3
6102; PC64LE9-NEXT:    xvrdpim 0, 0
6103; PC64LE9-NEXT:    blr
6104entry:
6105  %floor = call <2 x double> @llvm.experimental.constrained.floor.v2f64(
6106                                <2 x double> <double 1.1, double 1.9>,
6107                                metadata !"fpexcept.strict") #1
6108  ret <2 x double> %floor
6109}
6110
6111define <3 x float> @constrained_vector_floor_v3f32() #0 {
6112; PC64LE-LABEL: constrained_vector_floor_v3f32:
6113; PC64LE:       # %bb.0: # %entry
6114; PC64LE-NEXT:    addis 3, 2, .LCPI109_0@toc@ha
6115; PC64LE-NEXT:    addis 4, 2, .LCPI109_1@toc@ha
6116; PC64LE-NEXT:    lfs 0, .LCPI109_0@toc@l(3)
6117; PC64LE-NEXT:    addis 3, 2, .LCPI109_2@toc@ha
6118; PC64LE-NEXT:    lfs 1, .LCPI109_1@toc@l(4)
6119; PC64LE-NEXT:    lfs 2, .LCPI109_2@toc@l(3)
6120; PC64LE-NEXT:    addis 3, 2, .LCPI109_3@toc@ha
6121; PC64LE-NEXT:    addi 3, 3, .LCPI109_3@toc@l
6122; PC64LE-NEXT:    xsrdpim 0, 0
6123; PC64LE-NEXT:    lvx 2, 0, 3
6124; PC64LE-NEXT:    xsrdpim 0, 1
6125; PC64LE-NEXT:    xsrdpim 0, 2
6126; PC64LE-NEXT:    blr
6127;
6128; PC64LE9-LABEL: constrained_vector_floor_v3f32:
6129; PC64LE9:       # %bb.0: # %entry
6130; PC64LE9-NEXT:    addis 3, 2, .LCPI109_0@toc@ha
6131; PC64LE9-NEXT:    lfs 0, .LCPI109_0@toc@l(3)
6132; PC64LE9-NEXT:    addis 3, 2, .LCPI109_1@toc@ha
6133; PC64LE9-NEXT:    xsrdpim 0, 0
6134; PC64LE9-NEXT:    lfs 0, .LCPI109_1@toc@l(3)
6135; PC64LE9-NEXT:    addis 3, 2, .LCPI109_2@toc@ha
6136; PC64LE9-NEXT:    xsrdpim 0, 0
6137; PC64LE9-NEXT:    lfs 0, .LCPI109_2@toc@l(3)
6138; PC64LE9-NEXT:    addis 3, 2, .LCPI109_3@toc@ha
6139; PC64LE9-NEXT:    addi 3, 3, .LCPI109_3@toc@l
6140; PC64LE9-NEXT:    lxvx 34, 0, 3
6141; PC64LE9-NEXT:    xsrdpim 0, 0
6142; PC64LE9-NEXT:    blr
6143entry:
6144  %floor = call <3 x float> @llvm.experimental.constrained.floor.v3f32(
6145                              <3 x float> <float 1.5, float 2.5, float 3.5>,
6146                              metadata !"fpexcept.strict") #1
6147  ret <3 x float> %floor
6148}
6149
6150define <3 x double> @constrained_vector_floor_v3f64() #0 {
6151; PC64LE-LABEL: constrained_vector_floor_v3f64:
6152; PC64LE:       # %bb.0: # %entry
6153; PC64LE-NEXT:    addis 3, 2, .LCPI110_0@toc@ha
6154; PC64LE-NEXT:    addis 4, 2, .LCPI110_1@toc@ha
6155; PC64LE-NEXT:    lfs 0, .LCPI110_0@toc@l(3)
6156; PC64LE-NEXT:    addi 3, 4, .LCPI110_1@toc@l
6157; PC64LE-NEXT:    lxvd2x 1, 0, 3
6158; PC64LE-NEXT:    addis 3, 2, .LCPI110_2@toc@ha
6159; PC64LE-NEXT:    xsrdpim 0, 0
6160; PC64LE-NEXT:    xvrdpim 0, 1
6161; PC64LE-NEXT:    lfs 1, .LCPI110_2@toc@l(3)
6162; PC64LE-NEXT:    fmr 2, 1
6163; PC64LE-NEXT:    fmr 3, 1
6164; PC64LE-NEXT:    blr
6165;
6166; PC64LE9-LABEL: constrained_vector_floor_v3f64:
6167; PC64LE9:       # %bb.0: # %entry
6168; PC64LE9-NEXT:    addis 3, 2, .LCPI110_0@toc@ha
6169; PC64LE9-NEXT:    lfs 0, .LCPI110_0@toc@l(3)
6170; PC64LE9-NEXT:    addis 3, 2, .LCPI110_1@toc@ha
6171; PC64LE9-NEXT:    addi 3, 3, .LCPI110_1@toc@l
6172; PC64LE9-NEXT:    xsrdpim 0, 0
6173; PC64LE9-NEXT:    lxvx 0, 0, 3
6174; PC64LE9-NEXT:    addis 3, 2, .LCPI110_2@toc@ha
6175; PC64LE9-NEXT:    lfs 1, .LCPI110_2@toc@l(3)
6176; PC64LE9-NEXT:    xvrdpim 0, 0
6177; PC64LE9-NEXT:    fmr 2, 1
6178; PC64LE9-NEXT:    fmr 3, 1
6179; PC64LE9-NEXT:    blr
6180entry:
6181  %floor = call <3 x double> @llvm.experimental.constrained.floor.v3f64(
6182                          <3 x double> <double 1.1, double 1.9, double 1.5>,
6183                          metadata !"fpexcept.strict") #1
6184  ret <3 x double> %floor
6185}
6186
6187define <1 x float> @constrained_vector_round_v1f32() #0 {
6188; PC64LE-LABEL: constrained_vector_round_v1f32:
6189; PC64LE:       # %bb.0: # %entry
6190; PC64LE-NEXT:    addis 3, 2, .LCPI111_0@toc@ha
6191; PC64LE-NEXT:    lfs 0, .LCPI111_0@toc@l(3)
6192; PC64LE-NEXT:    addis 3, 2, .LCPI111_1@toc@ha
6193; PC64LE-NEXT:    lfs 1, .LCPI111_1@toc@l(3)
6194; PC64LE-NEXT:    xsrdpi 0, 0
6195; PC64LE-NEXT:    blr
6196;
6197; PC64LE9-LABEL: constrained_vector_round_v1f32:
6198; PC64LE9:       # %bb.0: # %entry
6199; PC64LE9-NEXT:    addis 3, 2, .LCPI111_0@toc@ha
6200; PC64LE9-NEXT:    lfs 0, .LCPI111_0@toc@l(3)
6201; PC64LE9-NEXT:    addis 3, 2, .LCPI111_1@toc@ha
6202; PC64LE9-NEXT:    lfs 1, .LCPI111_1@toc@l(3)
6203; PC64LE9-NEXT:    xsrdpi 0, 0
6204; PC64LE9-NEXT:    blr
6205entry:
6206  %round = call <1 x float> @llvm.experimental.constrained.round.v1f32(
6207                               <1 x float> <float 1.5>,
6208                               metadata !"fpexcept.strict") #1
6209  ret <1 x float> %round
6210}
6211
6212define <2 x double> @constrained_vector_round_v2f64() #0 {
6213; PC64LE-LABEL: constrained_vector_round_v2f64:
6214; PC64LE:       # %bb.0: # %entry
6215; PC64LE-NEXT:    addis 3, 2, .LCPI112_0@toc@ha
6216; PC64LE-NEXT:    addis 4, 2, .LCPI112_1@toc@ha
6217; PC64LE-NEXT:    addi 3, 3, .LCPI112_0@toc@l
6218; PC64LE-NEXT:    lxvd2x 0, 0, 3
6219; PC64LE-NEXT:    addi 3, 4, .LCPI112_1@toc@l
6220; PC64LE-NEXT:    lxvd2x 1, 0, 3
6221; PC64LE-NEXT:    xvrdpi 0, 0
6222; PC64LE-NEXT:    xxswapd 34, 1
6223; PC64LE-NEXT:    blr
6224;
6225; PC64LE9-LABEL: constrained_vector_round_v2f64:
6226; PC64LE9:       # %bb.0: # %entry
6227; PC64LE9-NEXT:    addis 3, 2, .LCPI112_0@toc@ha
6228; PC64LE9-NEXT:    addi 3, 3, .LCPI112_0@toc@l
6229; PC64LE9-NEXT:    lxvx 0, 0, 3
6230; PC64LE9-NEXT:    addis 3, 2, .LCPI112_1@toc@ha
6231; PC64LE9-NEXT:    addi 3, 3, .LCPI112_1@toc@l
6232; PC64LE9-NEXT:    lxvx 34, 0, 3
6233; PC64LE9-NEXT:    xvrdpi 0, 0
6234; PC64LE9-NEXT:    blr
6235entry:
6236  %round = call <2 x double> @llvm.experimental.constrained.round.v2f64(
6237                                <2 x double> <double 1.1, double 1.9>,
6238                                metadata !"fpexcept.strict") #1
6239  ret <2 x double> %round
6240}
6241
6242define <3 x float> @constrained_vector_round_v3f32() #0 {
6243; PC64LE-LABEL: constrained_vector_round_v3f32:
6244; PC64LE:       # %bb.0: # %entry
6245; PC64LE-NEXT:    addis 3, 2, .LCPI113_0@toc@ha
6246; PC64LE-NEXT:    addis 4, 2, .LCPI113_1@toc@ha
6247; PC64LE-NEXT:    lfs 0, .LCPI113_0@toc@l(3)
6248; PC64LE-NEXT:    addis 3, 2, .LCPI113_2@toc@ha
6249; PC64LE-NEXT:    lfs 1, .LCPI113_1@toc@l(4)
6250; PC64LE-NEXT:    lfs 2, .LCPI113_2@toc@l(3)
6251; PC64LE-NEXT:    addis 3, 2, .LCPI113_3@toc@ha
6252; PC64LE-NEXT:    addi 3, 3, .LCPI113_3@toc@l
6253; PC64LE-NEXT:    xsrdpi 0, 0
6254; PC64LE-NEXT:    lvx 2, 0, 3
6255; PC64LE-NEXT:    xsrdpi 0, 1
6256; PC64LE-NEXT:    xsrdpi 0, 2
6257; PC64LE-NEXT:    blr
6258;
6259; PC64LE9-LABEL: constrained_vector_round_v3f32:
6260; PC64LE9:       # %bb.0: # %entry
6261; PC64LE9-NEXT:    addis 3, 2, .LCPI113_0@toc@ha
6262; PC64LE9-NEXT:    lfs 0, .LCPI113_0@toc@l(3)
6263; PC64LE9-NEXT:    addis 3, 2, .LCPI113_1@toc@ha
6264; PC64LE9-NEXT:    xsrdpi 0, 0
6265; PC64LE9-NEXT:    lfs 0, .LCPI113_1@toc@l(3)
6266; PC64LE9-NEXT:    addis 3, 2, .LCPI113_2@toc@ha
6267; PC64LE9-NEXT:    xsrdpi 0, 0
6268; PC64LE9-NEXT:    lfs 0, .LCPI113_2@toc@l(3)
6269; PC64LE9-NEXT:    addis 3, 2, .LCPI113_3@toc@ha
6270; PC64LE9-NEXT:    addi 3, 3, .LCPI113_3@toc@l
6271; PC64LE9-NEXT:    lxvx 34, 0, 3
6272; PC64LE9-NEXT:    xsrdpi 0, 0
6273; PC64LE9-NEXT:    blr
6274entry:
6275  %round = call <3 x float> @llvm.experimental.constrained.round.v3f32(
6276                              <3 x float> <float 1.5, float 2.5, float 3.5>,
6277                              metadata !"fpexcept.strict") #1
6278  ret <3 x float> %round
6279}
6280
6281
6282define <3 x double> @constrained_vector_round_v3f64() #0 {
6283; PC64LE-LABEL: constrained_vector_round_v3f64:
6284; PC64LE:       # %bb.0: # %entry
6285; PC64LE-NEXT:    addis 4, 2, .LCPI114_1@toc@ha
6286; PC64LE-NEXT:    addis 3, 2, .LCPI114_0@toc@ha
6287; PC64LE-NEXT:    addi 4, 4, .LCPI114_1@toc@l
6288; PC64LE-NEXT:    lxvd2x 1, 0, 4
6289; PC64LE-NEXT:    addis 4, 2, .LCPI114_3@toc@ha
6290; PC64LE-NEXT:    lfs 0, .LCPI114_0@toc@l(3)
6291; PC64LE-NEXT:    addis 3, 2, .LCPI114_2@toc@ha
6292; PC64LE-NEXT:    lfs 2, .LCPI114_3@toc@l(4)
6293; PC64LE-NEXT:    xsrdpi 0, 0
6294; PC64LE-NEXT:    xvrdpi 0, 1
6295; PC64LE-NEXT:    lfs 1, .LCPI114_2@toc@l(3)
6296; PC64LE-NEXT:    fmr 3, 2
6297; PC64LE-NEXT:    blr
6298;
6299; PC64LE9-LABEL: constrained_vector_round_v3f64:
6300; PC64LE9:       # %bb.0: # %entry
6301; PC64LE9-NEXT:    addis 3, 2, .LCPI114_0@toc@ha
6302; PC64LE9-NEXT:    lfs 0, .LCPI114_0@toc@l(3)
6303; PC64LE9-NEXT:    addis 3, 2, .LCPI114_1@toc@ha
6304; PC64LE9-NEXT:    addi 3, 3, .LCPI114_1@toc@l
6305; PC64LE9-NEXT:    xsrdpi 0, 0
6306; PC64LE9-NEXT:    lxvx 0, 0, 3
6307; PC64LE9-NEXT:    addis 3, 2, .LCPI114_2@toc@ha
6308; PC64LE9-NEXT:    lfs 1, .LCPI114_2@toc@l(3)
6309; PC64LE9-NEXT:    addis 3, 2, .LCPI114_3@toc@ha
6310; PC64LE9-NEXT:    lfs 2, .LCPI114_3@toc@l(3)
6311; PC64LE9-NEXT:    xvrdpi 0, 0
6312; PC64LE9-NEXT:    fmr 3, 2
6313; PC64LE9-NEXT:    blr
6314entry:
6315  %round = call <3 x double> @llvm.experimental.constrained.round.v3f64(
6316                          <3 x double> <double 1.1, double 1.9, double 1.5>,
6317                          metadata !"fpexcept.strict") #1
6318  ret <3 x double> %round
6319}
6320
6321define <1 x float> @constrained_vector_trunc_v1f32() #0 {
6322; PC64LE-LABEL: constrained_vector_trunc_v1f32:
6323; PC64LE:       # %bb.0: # %entry
6324; PC64LE-NEXT:    addis 3, 2, .LCPI115_0@toc@ha
6325; PC64LE-NEXT:    lfs 0, .LCPI115_0@toc@l(3)
6326; PC64LE-NEXT:    addis 3, 2, .LCPI115_1@toc@ha
6327; PC64LE-NEXT:    lfs 1, .LCPI115_1@toc@l(3)
6328; PC64LE-NEXT:    xsrdpiz 0, 0
6329; PC64LE-NEXT:    blr
6330;
6331; PC64LE9-LABEL: constrained_vector_trunc_v1f32:
6332; PC64LE9:       # %bb.0: # %entry
6333; PC64LE9-NEXT:    addis 3, 2, .LCPI115_0@toc@ha
6334; PC64LE9-NEXT:    lfs 0, .LCPI115_0@toc@l(3)
6335; PC64LE9-NEXT:    addis 3, 2, .LCPI115_1@toc@ha
6336; PC64LE9-NEXT:    lfs 1, .LCPI115_1@toc@l(3)
6337; PC64LE9-NEXT:    xsrdpiz 0, 0
6338; PC64LE9-NEXT:    blr
6339entry:
6340  %trunc = call <1 x float> @llvm.experimental.constrained.trunc.v1f32(
6341                               <1 x float> <float 1.5>,
6342                               metadata !"fpexcept.strict") #1
6343  ret <1 x float> %trunc
6344}
6345
6346define <2 x double> @constrained_vector_trunc_v2f64() #0 {
6347; PC64LE-LABEL: constrained_vector_trunc_v2f64:
6348; PC64LE:       # %bb.0: # %entry
6349; PC64LE-NEXT:    addis 3, 2, .LCPI116_0@toc@ha
6350; PC64LE-NEXT:    addis 4, 2, .LCPI116_1@toc@ha
6351; PC64LE-NEXT:    addi 3, 3, .LCPI116_0@toc@l
6352; PC64LE-NEXT:    lxvd2x 0, 0, 3
6353; PC64LE-NEXT:    addi 3, 4, .LCPI116_1@toc@l
6354; PC64LE-NEXT:    lxvd2x 1, 0, 3
6355; PC64LE-NEXT:    xvrdpiz 0, 0
6356; PC64LE-NEXT:    xxswapd 34, 1
6357; PC64LE-NEXT:    blr
6358;
6359; PC64LE9-LABEL: constrained_vector_trunc_v2f64:
6360; PC64LE9:       # %bb.0: # %entry
6361; PC64LE9-NEXT:    addis 3, 2, .LCPI116_0@toc@ha
6362; PC64LE9-NEXT:    addi 3, 3, .LCPI116_0@toc@l
6363; PC64LE9-NEXT:    lxvx 0, 0, 3
6364; PC64LE9-NEXT:    addis 3, 2, .LCPI116_1@toc@ha
6365; PC64LE9-NEXT:    addi 3, 3, .LCPI116_1@toc@l
6366; PC64LE9-NEXT:    lxvx 34, 0, 3
6367; PC64LE9-NEXT:    xvrdpiz 0, 0
6368; PC64LE9-NEXT:    blr
6369entry:
6370  %trunc = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(
6371                                <2 x double> <double 1.1, double 1.9>,
6372                                metadata !"fpexcept.strict") #1
6373  ret <2 x double> %trunc
6374}
6375
6376define <3 x float> @constrained_vector_trunc_v3f32() #0 {
6377; PC64LE-LABEL: constrained_vector_trunc_v3f32:
6378; PC64LE:       # %bb.0: # %entry
6379; PC64LE-NEXT:    addis 3, 2, .LCPI117_0@toc@ha
6380; PC64LE-NEXT:    addis 4, 2, .LCPI117_1@toc@ha
6381; PC64LE-NEXT:    lfs 0, .LCPI117_0@toc@l(3)
6382; PC64LE-NEXT:    addis 3, 2, .LCPI117_2@toc@ha
6383; PC64LE-NEXT:    lfs 1, .LCPI117_1@toc@l(4)
6384; PC64LE-NEXT:    lfs 2, .LCPI117_2@toc@l(3)
6385; PC64LE-NEXT:    addis 3, 2, .LCPI117_3@toc@ha
6386; PC64LE-NEXT:    addi 3, 3, .LCPI117_3@toc@l
6387; PC64LE-NEXT:    xsrdpiz 0, 0
6388; PC64LE-NEXT:    lvx 2, 0, 3
6389; PC64LE-NEXT:    xsrdpiz 0, 1
6390; PC64LE-NEXT:    xsrdpiz 0, 2
6391; PC64LE-NEXT:    blr
6392;
6393; PC64LE9-LABEL: constrained_vector_trunc_v3f32:
6394; PC64LE9:       # %bb.0: # %entry
6395; PC64LE9-NEXT:    addis 3, 2, .LCPI117_0@toc@ha
6396; PC64LE9-NEXT:    lfs 0, .LCPI117_0@toc@l(3)
6397; PC64LE9-NEXT:    addis 3, 2, .LCPI117_1@toc@ha
6398; PC64LE9-NEXT:    xsrdpiz 0, 0
6399; PC64LE9-NEXT:    lfs 0, .LCPI117_1@toc@l(3)
6400; PC64LE9-NEXT:    addis 3, 2, .LCPI117_2@toc@ha
6401; PC64LE9-NEXT:    xsrdpiz 0, 0
6402; PC64LE9-NEXT:    lfs 0, .LCPI117_2@toc@l(3)
6403; PC64LE9-NEXT:    addis 3, 2, .LCPI117_3@toc@ha
6404; PC64LE9-NEXT:    addi 3, 3, .LCPI117_3@toc@l
6405; PC64LE9-NEXT:    lxvx 34, 0, 3
6406; PC64LE9-NEXT:    xsrdpiz 0, 0
6407; PC64LE9-NEXT:    blr
6408entry:
6409  %trunc = call <3 x float> @llvm.experimental.constrained.trunc.v3f32(
6410                              <3 x float> <float 1.5, float 2.5, float 3.5>,
6411                              metadata !"fpexcept.strict") #1
6412  ret <3 x float> %trunc
6413}
6414
6415define <3 x double> @constrained_vector_trunc_v3f64() #0 {
6416; PC64LE-LABEL: constrained_vector_trunc_v3f64:
6417; PC64LE:       # %bb.0: # %entry
6418; PC64LE-NEXT:    addis 3, 2, .LCPI118_0@toc@ha
6419; PC64LE-NEXT:    addis 4, 2, .LCPI118_1@toc@ha
6420; PC64LE-NEXT:    lfs 0, .LCPI118_0@toc@l(3)
6421; PC64LE-NEXT:    addi 3, 4, .LCPI118_1@toc@l
6422; PC64LE-NEXT:    lxvd2x 1, 0, 3
6423; PC64LE-NEXT:    addis 3, 2, .LCPI118_2@toc@ha
6424; PC64LE-NEXT:    xsrdpiz 0, 0
6425; PC64LE-NEXT:    xvrdpiz 0, 1
6426; PC64LE-NEXT:    lfs 1, .LCPI118_2@toc@l(3)
6427; PC64LE-NEXT:    fmr 2, 1
6428; PC64LE-NEXT:    fmr 3, 1
6429; PC64LE-NEXT:    blr
6430;
6431; PC64LE9-LABEL: constrained_vector_trunc_v3f64:
6432; PC64LE9:       # %bb.0: # %entry
6433; PC64LE9-NEXT:    addis 3, 2, .LCPI118_0@toc@ha
6434; PC64LE9-NEXT:    lfs 0, .LCPI118_0@toc@l(3)
6435; PC64LE9-NEXT:    addis 3, 2, .LCPI118_1@toc@ha
6436; PC64LE9-NEXT:    addi 3, 3, .LCPI118_1@toc@l
6437; PC64LE9-NEXT:    xsrdpiz 0, 0
6438; PC64LE9-NEXT:    lxvx 0, 0, 3
6439; PC64LE9-NEXT:    addis 3, 2, .LCPI118_2@toc@ha
6440; PC64LE9-NEXT:    lfs 1, .LCPI118_2@toc@l(3)
6441; PC64LE9-NEXT:    xvrdpiz 0, 0
6442; PC64LE9-NEXT:    fmr 2, 1
6443; PC64LE9-NEXT:    fmr 3, 1
6444; PC64LE9-NEXT:    blr
6445entry:
6446  %trunc = call <3 x double> @llvm.experimental.constrained.trunc.v3f64(
6447                          <3 x double> <double 1.1, double 1.9, double 1.5>,
6448                          metadata !"fpexcept.strict") #1
6449  ret <3 x double> %trunc
6450}
6451
6452attributes #0 = { nounwind strictfp noimplicitfloat }
6453attributes #1 = { strictfp }
6454
6455; Single width declarations
6456declare <2 x double> @llvm.experimental.constrained.fadd.v2f64(<2 x double>, <2 x double>, metadata, metadata)
6457declare <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double>, <2 x double>, metadata, metadata)
6458declare <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double>, <2 x double>, metadata, metadata)
6459declare <2 x double> @llvm.experimental.constrained.fdiv.v2f64(<2 x double>, <2 x double>, metadata, metadata)
6460declare <2 x double> @llvm.experimental.constrained.frem.v2f64(<2 x double>, <2 x double>, metadata, metadata)
6461declare <2 x double> @llvm.experimental.constrained.sqrt.v2f64(<2 x double>, metadata, metadata)
6462declare <2 x double> @llvm.experimental.constrained.pow.v2f64(<2 x double>, <2 x double>, metadata, metadata)
6463declare <2 x double> @llvm.experimental.constrained.powi.v2f64(<2 x double>, i32, metadata, metadata)
6464declare <2 x double> @llvm.experimental.constrained.sin.v2f64(<2 x double>, metadata, metadata)
6465declare <2 x double> @llvm.experimental.constrained.cos.v2f64(<2 x double>, metadata, metadata)
6466declare <2 x double> @llvm.experimental.constrained.exp.v2f64(<2 x double>, metadata, metadata)
6467declare <2 x double> @llvm.experimental.constrained.exp2.v2f64(<2 x double>, metadata, metadata)
6468declare <2 x double> @llvm.experimental.constrained.log.v2f64(<2 x double>, metadata, metadata)
6469declare <2 x double> @llvm.experimental.constrained.log10.v2f64(<2 x double>, metadata, metadata)
6470declare <2 x double> @llvm.experimental.constrained.log2.v2f64(<2 x double>, metadata, metadata)
6471declare <2 x double> @llvm.experimental.constrained.rint.v2f64(<2 x double>, metadata, metadata)
6472declare <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(<2 x double>, metadata, metadata)
6473declare <2 x double> @llvm.experimental.constrained.maxnum.v2f64(<2 x double>, <2 x double>, metadata)
6474declare <2 x double> @llvm.experimental.constrained.minnum.v2f64(<2 x double>, <2 x double>, metadata)
6475declare <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double>, metadata, metadata)
6476declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float>, metadata)
6477declare <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double>, metadata)
6478declare <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double>, metadata)
6479declare <2 x double> @llvm.experimental.constrained.round.v2f64(<2 x double>, metadata)
6480declare <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double>, metadata)
6481
6482; Scalar width declarations
6483declare <1 x float> @llvm.experimental.constrained.fadd.v1f32(<1 x float>, <1 x float>, metadata, metadata)
6484declare <1 x float> @llvm.experimental.constrained.fsub.v1f32(<1 x float>, <1 x float>, metadata, metadata)
6485declare <1 x float> @llvm.experimental.constrained.fmul.v1f32(<1 x float>, <1 x float>, metadata, metadata)
6486declare <1 x float> @llvm.experimental.constrained.fdiv.v1f32(<1 x float>, <1 x float>, metadata, metadata)
6487declare <1 x float> @llvm.experimental.constrained.frem.v1f32(<1 x float>, <1 x float>, metadata, metadata)
6488declare <1 x float> @llvm.experimental.constrained.sqrt.v1f32(<1 x float>, metadata, metadata)
6489declare <1 x float> @llvm.experimental.constrained.pow.v1f32(<1 x float>, <1 x float>, metadata, metadata)
6490declare <1 x float> @llvm.experimental.constrained.powi.v1f32(<1 x float>, i32, metadata, metadata)
6491declare <1 x float> @llvm.experimental.constrained.sin.v1f32(<1 x float>, metadata, metadata)
6492declare <1 x float> @llvm.experimental.constrained.cos.v1f32(<1 x float>, metadata, metadata)
6493declare <1 x float> @llvm.experimental.constrained.exp.v1f32(<1 x float>, metadata, metadata)
6494declare <1 x float> @llvm.experimental.constrained.exp2.v1f32(<1 x float>, metadata, metadata)
6495declare <1 x float> @llvm.experimental.constrained.log.v1f32(<1 x float>, metadata, metadata)
6496declare <1 x float> @llvm.experimental.constrained.log10.v1f32(<1 x float>, metadata, metadata)
6497declare <1 x float> @llvm.experimental.constrained.log2.v1f32(<1 x float>, metadata, metadata)
6498declare <1 x float> @llvm.experimental.constrained.rint.v1f32(<1 x float>, metadata, metadata)
6499declare <1 x float> @llvm.experimental.constrained.nearbyint.v1f32(<1 x float>, metadata, metadata)
6500declare <1 x float> @llvm.experimental.constrained.maxnum.v1f32(<1 x float>, <1 x float>, metadata)
6501declare <1 x float> @llvm.experimental.constrained.minnum.v1f32(<1 x float>, <1 x float>, metadata)
6502declare <1 x float> @llvm.experimental.constrained.fptrunc.v1f32.v1f64(<1 x double>, metadata, metadata)
6503declare <1 x double> @llvm.experimental.constrained.fpext.v1f64.v1f32(<1 x float>, metadata)
6504declare <1 x float> @llvm.experimental.constrained.ceil.v1f32(<1 x float>, metadata)
6505declare <1 x float> @llvm.experimental.constrained.floor.v1f32(<1 x float>, metadata)
6506declare <1 x float> @llvm.experimental.constrained.round.v1f32(<1 x float>, metadata)
6507declare <1 x float> @llvm.experimental.constrained.trunc.v1f32(<1 x float>, metadata)
6508
6509; Illegal width declarations
6510declare <3 x float> @llvm.experimental.constrained.fadd.v3f32(<3 x float>, <3 x float>, metadata, metadata)
6511declare <3 x double> @llvm.experimental.constrained.fadd.v3f64(<3 x double>, <3 x double>, metadata, metadata)
6512declare <3 x float> @llvm.experimental.constrained.fsub.v3f32(<3 x float>, <3 x float>, metadata, metadata)
6513declare <3 x double> @llvm.experimental.constrained.fsub.v3f64(<3 x double>, <3 x double>, metadata, metadata)
6514declare <3 x float> @llvm.experimental.constrained.fmul.v3f32(<3 x float>, <3 x float>, metadata, metadata)
6515declare <3 x double> @llvm.experimental.constrained.fmul.v3f64(<3 x double>, <3 x double>, metadata, metadata)
6516declare <3 x float> @llvm.experimental.constrained.fdiv.v3f32(<3 x float>, <3 x float>, metadata, metadata)
6517declare <3 x double> @llvm.experimental.constrained.fdiv.v3f64(<3 x double>, <3 x double>, metadata, metadata)
6518declare <3 x float> @llvm.experimental.constrained.frem.v3f32(<3 x float>, <3 x float>, metadata, metadata)
6519declare <3 x double> @llvm.experimental.constrained.frem.v3f64(<3 x double>, <3 x double>, metadata, metadata)
6520declare <3 x float> @llvm.experimental.constrained.sqrt.v3f32(<3 x float>, metadata, metadata)
6521declare <3 x double> @llvm.experimental.constrained.sqrt.v3f64(<3 x double>, metadata, metadata)
6522declare <3 x float> @llvm.experimental.constrained.pow.v3f32(<3 x float>, <3 x float>, metadata, metadata)
6523declare <3 x double> @llvm.experimental.constrained.pow.v3f64(<3 x double>, <3 x double>, metadata, metadata)
6524declare <3 x float> @llvm.experimental.constrained.powi.v3f32(<3 x float>, i32, metadata, metadata)
6525declare <3 x double> @llvm.experimental.constrained.powi.v3f64(<3 x double>, i32, metadata, metadata)
6526declare <3 x float> @llvm.experimental.constrained.sin.v3f32(<3 x float>, metadata, metadata)
6527declare <3 x double> @llvm.experimental.constrained.sin.v3f64(<3 x double>, metadata, metadata)
6528declare <3 x float> @llvm.experimental.constrained.cos.v3f32(<3 x float>, metadata, metadata)
6529declare <3 x double> @llvm.experimental.constrained.cos.v3f64(<3 x double>, metadata, metadata)
6530declare <3 x float> @llvm.experimental.constrained.exp.v3f32(<3 x float>, metadata, metadata)
6531declare <3 x double> @llvm.experimental.constrained.exp.v3f64(<3 x double>, metadata, metadata)
6532declare <3 x float> @llvm.experimental.constrained.exp2.v3f32(<3 x float>, metadata, metadata)
6533declare <3 x double> @llvm.experimental.constrained.exp2.v3f64(<3 x double>, metadata, metadata)
6534declare <3 x float> @llvm.experimental.constrained.log.v3f32(<3 x float>, metadata, metadata)
6535declare <3 x double> @llvm.experimental.constrained.log.v3f64(<3 x double>, metadata, metadata)
6536declare <3 x float> @llvm.experimental.constrained.log10.v3f32(<3 x float>, metadata, metadata)
6537declare <3 x double> @llvm.experimental.constrained.log10.v3f64(<3 x double>, metadata, metadata)
6538declare <3 x float> @llvm.experimental.constrained.log2.v3f32(<3 x float>, metadata, metadata)
6539declare <3 x double> @llvm.experimental.constrained.log2.v3f64(<3 x double>, metadata, metadata)
6540declare <3 x float> @llvm.experimental.constrained.rint.v3f32(<3 x float>, metadata, metadata)
6541declare <3 x double> @llvm.experimental.constrained.rint.v3f64(<3 x double>, metadata, metadata)
6542declare <3 x float> @llvm.experimental.constrained.nearbyint.v3f32(<3 x float>, metadata, metadata)
6543declare <3 x double> @llvm.experimental.constrained.nearbyint.v3f64(<3 x double>, metadata, metadata)
6544declare <3 x float> @llvm.experimental.constrained.maxnum.v3f32(<3 x float>, <3 x float>, metadata)
6545declare <3 x double> @llvm.experimental.constrained.maxnum.v3f64(<3 x double>, <3 x double>, metadata)
6546declare <3 x float> @llvm.experimental.constrained.minnum.v3f32(<3 x float>, <3 x float>, metadata)
6547declare <3 x double> @llvm.experimental.constrained.minnum.v3f64(<3 x double>, <3 x double>, metadata)
6548declare <3 x float> @llvm.experimental.constrained.fptrunc.v3f32.v3f64(<3 x double>, metadata, metadata)
6549declare <3 x double> @llvm.experimental.constrained.fpext.v3f64.v3f32(<3 x float>, metadata)
6550declare <3 x float> @llvm.experimental.constrained.ceil.v3f32(<3 x float>, metadata)
6551declare <3 x double> @llvm.experimental.constrained.ceil.v3f64(<3 x double>, metadata)
6552declare <3 x float> @llvm.experimental.constrained.floor.v3f32(<3 x float>, metadata)
6553declare <3 x double> @llvm.experimental.constrained.floor.v3f64(<3 x double>, metadata)
6554declare <3 x float> @llvm.experimental.constrained.round.v3f32(<3 x float>, metadata)
6555declare <3 x double> @llvm.experimental.constrained.round.v3f64(<3 x double>, metadata)
6556declare <3 x float> @llvm.experimental.constrained.trunc.v3f32(<3 x float>, metadata)
6557declare <3 x double> @llvm.experimental.constrained.trunc.v3f64(<3 x double>, metadata)
6558
6559; Double width declarations
6560declare <4 x double> @llvm.experimental.constrained.fadd.v4f64(<4 x double>, <4 x double>, metadata, metadata)
6561declare <4 x double> @llvm.experimental.constrained.fsub.v4f64(<4 x double>, <4 x double>, metadata, metadata)
6562declare <4 x double> @llvm.experimental.constrained.fmul.v4f64(<4 x double>, <4 x double>, metadata, metadata)
6563declare <4 x double> @llvm.experimental.constrained.fdiv.v4f64(<4 x double>, <4 x double>, metadata, metadata)
6564declare <4 x double> @llvm.experimental.constrained.frem.v4f64(<4 x double>, <4 x double>, metadata, metadata)
6565declare <4 x double> @llvm.experimental.constrained.sqrt.v4f64(<4 x double>, metadata, metadata)
6566declare <4 x double> @llvm.experimental.constrained.pow.v4f64(<4 x double>, <4 x double>, metadata, metadata)
6567declare <4 x double> @llvm.experimental.constrained.powi.v4f64(<4 x double>, i32, metadata, metadata)
6568declare <4 x double> @llvm.experimental.constrained.sin.v4f64(<4 x double>, metadata, metadata)
6569declare <4 x double> @llvm.experimental.constrained.cos.v4f64(<4 x double>, metadata, metadata)
6570declare <4 x double> @llvm.experimental.constrained.exp.v4f64(<4 x double>, metadata, metadata)
6571declare <4 x double> @llvm.experimental.constrained.exp2.v4f64(<4 x double>, metadata, metadata)
6572declare <4 x double> @llvm.experimental.constrained.log.v4f64(<4 x double>, metadata, metadata)
6573declare <4 x double> @llvm.experimental.constrained.log10.v4f64(<4 x double>, metadata, metadata)
6574declare <4 x double> @llvm.experimental.constrained.log2.v4f64(<4 x double>, metadata, metadata)
6575declare <4 x double> @llvm.experimental.constrained.rint.v4f64(<4 x double>, metadata, metadata)
6576declare <4 x double> @llvm.experimental.constrained.nearbyint.v4f64(<4 x double>, metadata, metadata)
6577declare <4 x double> @llvm.experimental.constrained.maxnum.v4f64(<4 x double>, <4 x double>, metadata)
6578declare <4 x double> @llvm.experimental.constrained.minnum.v4f64(<4 x double>, <4 x double>, metadata)
6579declare <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(<4 x double>, metadata, metadata)
6580declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)
6581declare <4 x double> @llvm.experimental.constrained.ceil.v4f64(<4 x double>, metadata)
6582declare <4 x double> @llvm.experimental.constrained.floor.v4f64(<4 x double>, metadata)
6583declare <4 x double> @llvm.experimental.constrained.round.v4f64(<4 x double>, metadata)
6584declare <4 x double> @llvm.experimental.constrained.trunc.v4f64(<4 x double>, metadata)
6585