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(<1 x float> %x, <1 x float> %y) #0 {
6; PC64LE-LABEL: constrained_vector_fdiv_v1f32:
7; PC64LE:       # %bb.0: # %entry
8; PC64LE-NEXT:    xsdivsp 1, 1, 2
9; PC64LE-NEXT:    blr
10;
11; PC64LE9-LABEL: constrained_vector_fdiv_v1f32:
12; PC64LE9:       # %bb.0: # %entry
13; PC64LE9-NEXT:    xsdivsp 1, 1, 2
14; PC64LE9-NEXT:    blr
15entry:
16  %div = call <1 x float> @llvm.experimental.constrained.fdiv.v1f32(
17           <1 x float> %x,
18           <1 x float> %y,
19           metadata !"round.dynamic",
20           metadata !"fpexcept.strict") #1
21  ret <1 x float> %div
22}
23
24define <2 x double> @constrained_vector_fdiv_v2f64(<2 x double> %x, <2 x double> %y) #0 {
25; PC64LE-LABEL: constrained_vector_fdiv_v2f64:
26; PC64LE:       # %bb.0: # %entry
27; PC64LE-NEXT:    xvdivdp 34, 34, 35
28; PC64LE-NEXT:    blr
29;
30; PC64LE9-LABEL: constrained_vector_fdiv_v2f64:
31; PC64LE9:       # %bb.0: # %entry
32; PC64LE9-NEXT:    xvdivdp 34, 34, 35
33; PC64LE9-NEXT:    blr
34entry:
35  %div = call <2 x double> @llvm.experimental.constrained.fdiv.v2f64(
36           <2 x double> %x,
37           <2 x double> %y,
38           metadata !"round.dynamic",
39           metadata !"fpexcept.strict") #1
40  ret <2 x double> %div
41}
42
43define <3 x float> @constrained_vector_fdiv_v3f32(<3 x float> %x, <3 x float> %y) #0 {
44; PC64LE-LABEL: constrained_vector_fdiv_v3f32:
45; PC64LE:       # %bb.0: # %entry
46; PC64LE-NEXT:    xxswapd 0, 35
47; PC64LE-NEXT:    xxsldwi 1, 35, 35, 3
48; PC64LE-NEXT:    addis 3, 2, .LCPI2_0@toc@ha
49; PC64LE-NEXT:    xxsldwi 2, 34, 34, 3
50; PC64LE-NEXT:    xxswapd 3, 34
51; PC64LE-NEXT:    addi 3, 3, .LCPI2_0@toc@l
52; PC64LE-NEXT:    xxsldwi 4, 35, 35, 1
53; PC64LE-NEXT:    xxsldwi 5, 34, 34, 1
54; PC64LE-NEXT:    lvx 4, 0, 3
55; PC64LE-NEXT:    xscvspdpn 0, 0
56; PC64LE-NEXT:    xscvspdpn 1, 1
57; PC64LE-NEXT:    xscvspdpn 2, 2
58; PC64LE-NEXT:    xscvspdpn 3, 3
59; PC64LE-NEXT:    xscvspdpn 4, 4
60; PC64LE-NEXT:    xscvspdpn 5, 5
61; PC64LE-NEXT:    xsdivsp 1, 2, 1
62; PC64LE-NEXT:    xsdivsp 0, 3, 0
63; PC64LE-NEXT:    xsdivsp 2, 5, 4
64; PC64LE-NEXT:    xscvdpspn 1, 1
65; PC64LE-NEXT:    xscvdpspn 0, 0
66; PC64LE-NEXT:    xscvdpspn 34, 2
67; PC64LE-NEXT:    xxmrghw 35, 0, 1
68; PC64LE-NEXT:    vperm 2, 2, 3, 4
69; PC64LE-NEXT:    blr
70;
71; PC64LE9-LABEL: constrained_vector_fdiv_v3f32:
72; PC64LE9:       # %bb.0: # %entry
73; PC64LE9-NEXT:    xxsldwi 0, 35, 35, 1
74; PC64LE9-NEXT:    xxsldwi 1, 34, 34, 1
75; PC64LE9-NEXT:    addis 3, 2, .LCPI2_0@toc@ha
76; PC64LE9-NEXT:    addi 3, 3, .LCPI2_0@toc@l
77; PC64LE9-NEXT:    xxswapd 2, 34
78; PC64LE9-NEXT:    xxsldwi 3, 34, 34, 3
79; PC64LE9-NEXT:    xscvspdpn 0, 0
80; PC64LE9-NEXT:    xscvspdpn 1, 1
81; PC64LE9-NEXT:    xscvspdpn 2, 2
82; PC64LE9-NEXT:    xscvspdpn 3, 3
83; PC64LE9-NEXT:    lxv 36, 0(3)
84; PC64LE9-NEXT:    xsdivsp 0, 1, 0
85; PC64LE9-NEXT:    xxswapd 1, 35
86; PC64LE9-NEXT:    xscvspdpn 1, 1
87; PC64LE9-NEXT:    xsdivsp 1, 2, 1
88; PC64LE9-NEXT:    xxsldwi 2, 35, 35, 3
89; PC64LE9-NEXT:    xscvspdpn 2, 2
90; PC64LE9-NEXT:    xsdivsp 2, 3, 2
91; PC64LE9-NEXT:    xscvdpspn 35, 0
92; PC64LE9-NEXT:    xscvdpspn 1, 1
93; PC64LE9-NEXT:    xscvdpspn 2, 2
94; PC64LE9-NEXT:    xxmrghw 34, 1, 2
95; PC64LE9-NEXT:    vperm 2, 3, 2, 4
96; PC64LE9-NEXT:    blr
97entry:
98  %div = call <3 x float> @llvm.experimental.constrained.fdiv.v3f32(
99           <3 x float> %x,
100           <3 x float> %y,
101           metadata !"round.dynamic",
102           metadata !"fpexcept.strict") #1
103  ret <3 x float> %div
104}
105
106define <3 x double> @constrained_vector_fdiv_v3f64(<3 x double> %x, <3 x double> %y) #0 {
107; PC64LE-LABEL: constrained_vector_fdiv_v3f64:
108; PC64LE:       # %bb.0: # %entry
109; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
110; PC64LE-NEXT:    # kill: def $f5 killed $f5 def $vsl5
111; PC64LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
112; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
113; PC64LE-NEXT:    xxmrghd 0, 5, 4
114; PC64LE-NEXT:    xsdivdp 3, 3, 6
115; PC64LE-NEXT:    xxmrghd 1, 2, 1
116; PC64LE-NEXT:    xvdivdp 2, 1, 0
117; PC64LE-NEXT:    xxswapd 1, 2
118; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
119; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
120; PC64LE-NEXT:    blr
121;
122; PC64LE9-LABEL: constrained_vector_fdiv_v3f64:
123; PC64LE9:       # %bb.0: # %entry
124; PC64LE9-NEXT:    # kill: def $f5 killed $f5 def $vsl5
125; PC64LE9-NEXT:    # kill: def $f4 killed $f4 def $vsl4
126; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
127; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
128; PC64LE9-NEXT:    xxmrghd 0, 5, 4
129; PC64LE9-NEXT:    xxmrghd 1, 2, 1
130; PC64LE9-NEXT:    xsdivdp 3, 3, 6
131; PC64LE9-NEXT:    xvdivdp 2, 1, 0
132; PC64LE9-NEXT:    xxswapd 1, 2
133; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
134; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
135; PC64LE9-NEXT:    blr
136entry:
137  %div = call <3 x double> @llvm.experimental.constrained.fdiv.v3f64(
138           <3 x double> %x,
139           <3 x double> %y,
140           metadata !"round.dynamic",
141           metadata !"fpexcept.strict") #1
142  ret <3 x double> %div
143}
144
145define <4 x double> @constrained_vector_fdiv_v4f64(<4 x double> %x, <4 x double> %y) #0 {
146; PC64LE-LABEL: constrained_vector_fdiv_v4f64:
147; PC64LE:       # %bb.0: # %entry
148; PC64LE-NEXT:    xvdivdp 35, 35, 37
149; PC64LE-NEXT:    xvdivdp 34, 34, 36
150; PC64LE-NEXT:    blr
151;
152; PC64LE9-LABEL: constrained_vector_fdiv_v4f64:
153; PC64LE9:       # %bb.0: # %entry
154; PC64LE9-NEXT:    xvdivdp 35, 35, 37
155; PC64LE9-NEXT:    xvdivdp 34, 34, 36
156; PC64LE9-NEXT:    blr
157entry:
158  %div = call <4 x double> @llvm.experimental.constrained.fdiv.v4f64(
159           <4 x double> %x,
160           <4 x double> %y,
161           metadata !"round.dynamic",
162           metadata !"fpexcept.strict") #1
163  ret <4 x double> %div
164}
165
166define <1 x float> @constrained_vector_frem_v1f32(<1 x float> %x, <1 x float> %y) #0 {
167; PC64LE-LABEL: constrained_vector_frem_v1f32:
168; PC64LE:       # %bb.0: # %entry
169; PC64LE-NEXT:    mflr 0
170; PC64LE-NEXT:    std 0, 16(1)
171; PC64LE-NEXT:    stdu 1, -32(1)
172; PC64LE-NEXT:    bl fmodf
173; PC64LE-NEXT:    nop
174; PC64LE-NEXT:    addi 1, 1, 32
175; PC64LE-NEXT:    ld 0, 16(1)
176; PC64LE-NEXT:    mtlr 0
177; PC64LE-NEXT:    blr
178;
179; PC64LE9-LABEL: constrained_vector_frem_v1f32:
180; PC64LE9:       # %bb.0: # %entry
181; PC64LE9-NEXT:    mflr 0
182; PC64LE9-NEXT:    std 0, 16(1)
183; PC64LE9-NEXT:    stdu 1, -32(1)
184; PC64LE9-NEXT:    bl fmodf
185; PC64LE9-NEXT:    nop
186; PC64LE9-NEXT:    addi 1, 1, 32
187; PC64LE9-NEXT:    ld 0, 16(1)
188; PC64LE9-NEXT:    mtlr 0
189; PC64LE9-NEXT:    blr
190entry:
191  %rem = call <1 x float> @llvm.experimental.constrained.frem.v1f32(
192           <1 x float> %x,
193           <1 x float> %y,
194           metadata !"round.dynamic",
195           metadata !"fpexcept.strict") #1
196  ret <1 x float> %rem
197}
198
199define <2 x double> @constrained_vector_frem_v2f64(<2 x double> %x, <2 x double> %y) #0 {
200; PC64LE-LABEL: constrained_vector_frem_v2f64:
201; PC64LE:       # %bb.0: # %entry
202; PC64LE-NEXT:    mflr 0
203; PC64LE-NEXT:    std 0, 16(1)
204; PC64LE-NEXT:    stdu 1, -96(1)
205; PC64LE-NEXT:    li 3, 48
206; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
207; PC64LE-NEXT:    li 3, 64
208; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
209; PC64LE-NEXT:    li 3, 80
210; PC64LE-NEXT:    vmr 30, 2
211; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
212; PC64LE-NEXT:    vmr 31, 3
213; PC64LE-NEXT:    xxlor 1, 62, 62
214; PC64LE-NEXT:    xxlor 2, 63, 63
215; PC64LE-NEXT:    bl fmod
216; PC64LE-NEXT:    nop
217; PC64LE-NEXT:    xxlor 61, 1, 1
218; PC64LE-NEXT:    xxswapd 1, 62
219; PC64LE-NEXT:    xxswapd 2, 63
220; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
221; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
222; PC64LE-NEXT:    bl fmod
223; PC64LE-NEXT:    nop
224; PC64LE-NEXT:    li 3, 80
225; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
226; PC64LE-NEXT:    xxmrghd 34, 61, 1
227; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
228; PC64LE-NEXT:    li 3, 64
229; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
230; PC64LE-NEXT:    li 3, 48
231; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
232; PC64LE-NEXT:    addi 1, 1, 96
233; PC64LE-NEXT:    ld 0, 16(1)
234; PC64LE-NEXT:    mtlr 0
235; PC64LE-NEXT:    blr
236;
237; PC64LE9-LABEL: constrained_vector_frem_v2f64:
238; PC64LE9:       # %bb.0: # %entry
239; PC64LE9-NEXT:    mflr 0
240; PC64LE9-NEXT:    std 0, 16(1)
241; PC64LE9-NEXT:    stdu 1, -80(1)
242; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
243; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
244; PC64LE9-NEXT:    vmr 31, 3
245; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
246; PC64LE9-NEXT:    vmr 30, 2
247; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
248; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
249; PC64LE9-NEXT:    bl fmod
250; PC64LE9-NEXT:    nop
251; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
252; PC64LE9-NEXT:    xxswapd 1, 62
253; PC64LE9-NEXT:    xxswapd 2, 63
254; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
255; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
256; PC64LE9-NEXT:    bl fmod
257; PC64LE9-NEXT:    nop
258; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
259; PC64LE9-NEXT:    xxmrghd 34, 61, 1
260; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
261; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
262; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
263; PC64LE9-NEXT:    addi 1, 1, 80
264; PC64LE9-NEXT:    ld 0, 16(1)
265; PC64LE9-NEXT:    mtlr 0
266; PC64LE9-NEXT:    blr
267entry:
268  %rem = call <2 x double> @llvm.experimental.constrained.frem.v2f64(
269           <2 x double> %x,
270           <2 x double> %y,
271           metadata !"round.dynamic",
272           metadata !"fpexcept.strict") #1
273  ret <2 x double> %rem
274}
275
276define <3 x float> @constrained_vector_frem_v3f32(<3 x float> %x, <3 x float> %y) #0 {
277; PC64LE-LABEL: constrained_vector_frem_v3f32:
278; PC64LE:       # %bb.0: # %entry
279; PC64LE-NEXT:    mflr 0
280; PC64LE-NEXT:    std 0, 16(1)
281; PC64LE-NEXT:    stdu 1, -96(1)
282; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
283; PC64LE-NEXT:    xxsldwi 2, 35, 35, 1
284; PC64LE-NEXT:    li 3, 48
285; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
286; PC64LE-NEXT:    li 3, 64
287; PC64LE-NEXT:    stfd 30, 80(1) # 8-byte Folded Spill
288; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
289; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
290; PC64LE-NEXT:    xscvspdpn 1, 0
291; PC64LE-NEXT:    xscvspdpn 2, 2
292; PC64LE-NEXT:    vmr 31, 3
293; PC64LE-NEXT:    vmr 30, 2
294; PC64LE-NEXT:    bl fmodf
295; PC64LE-NEXT:    nop
296; PC64LE-NEXT:    xxswapd 0, 62
297; PC64LE-NEXT:    xxswapd 2, 63
298; PC64LE-NEXT:    fmr 31, 1
299; PC64LE-NEXT:    xscvspdpn 1, 0
300; PC64LE-NEXT:    xscvspdpn 2, 2
301; PC64LE-NEXT:    bl fmodf
302; PC64LE-NEXT:    nop
303; PC64LE-NEXT:    xxsldwi 0, 62, 62, 3
304; PC64LE-NEXT:    xxsldwi 2, 63, 63, 3
305; PC64LE-NEXT:    fmr 30, 1
306; PC64LE-NEXT:    xscvspdpn 1, 0
307; PC64LE-NEXT:    xscvspdpn 2, 2
308; PC64LE-NEXT:    bl fmodf
309; PC64LE-NEXT:    nop
310; PC64LE-NEXT:    xscvdpspn 0, 30
311; PC64LE-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
312; PC64LE-NEXT:    lfd 30, 80(1) # 8-byte Folded Reload
313; PC64LE-NEXT:    xscvdpspn 1, 1
314; PC64LE-NEXT:    addi 3, 3, .LCPI7_0@toc@l
315; PC64LE-NEXT:    xscvdpspn 34, 31
316; PC64LE-NEXT:    lvx 4, 0, 3
317; PC64LE-NEXT:    li 3, 64
318; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
319; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
320; PC64LE-NEXT:    li 3, 48
321; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
322; PC64LE-NEXT:    xxmrghw 35, 0, 1
323; PC64LE-NEXT:    vperm 2, 2, 3, 4
324; PC64LE-NEXT:    addi 1, 1, 96
325; PC64LE-NEXT:    ld 0, 16(1)
326; PC64LE-NEXT:    mtlr 0
327; PC64LE-NEXT:    blr
328;
329; PC64LE9-LABEL: constrained_vector_frem_v3f32:
330; PC64LE9:       # %bb.0: # %entry
331; PC64LE9-NEXT:    mflr 0
332; PC64LE9-NEXT:    std 0, 16(1)
333; PC64LE9-NEXT:    stdu 1, -80(1)
334; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
335; PC64LE9-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
336; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
337; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
338; PC64LE9-NEXT:    xscvspdpn 1, 0
339; PC64LE9-NEXT:    xxsldwi 0, 35, 35, 1
340; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
341; PC64LE9-NEXT:    xscvspdpn 2, 0
342; PC64LE9-NEXT:    vmr 31, 3
343; PC64LE9-NEXT:    vmr 30, 2
344; PC64LE9-NEXT:    bl fmodf
345; PC64LE9-NEXT:    nop
346; PC64LE9-NEXT:    xxswapd 0, 62
347; PC64LE9-NEXT:    fmr 31, 1
348; PC64LE9-NEXT:    xscvspdpn 1, 0
349; PC64LE9-NEXT:    xxswapd 0, 63
350; PC64LE9-NEXT:    xscvspdpn 2, 0
351; PC64LE9-NEXT:    bl fmodf
352; PC64LE9-NEXT:    nop
353; PC64LE9-NEXT:    xxsldwi 0, 62, 62, 3
354; PC64LE9-NEXT:    fmr 30, 1
355; PC64LE9-NEXT:    xscvspdpn 1, 0
356; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
357; PC64LE9-NEXT:    xscvspdpn 2, 0
358; PC64LE9-NEXT:    bl fmodf
359; PC64LE9-NEXT:    nop
360; PC64LE9-NEXT:    xscvdpspn 0, 1
361; PC64LE9-NEXT:    xscvdpspn 1, 30
362; PC64LE9-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
363; PC64LE9-NEXT:    xscvdpspn 35, 31
364; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
365; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
366; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
367; PC64LE9-NEXT:    addi 3, 3, .LCPI7_0@toc@l
368; PC64LE9-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
369; PC64LE9-NEXT:    lxv 36, 0(3)
370; PC64LE9-NEXT:    xxmrghw 34, 1, 0
371; PC64LE9-NEXT:    vperm 2, 3, 2, 4
372; PC64LE9-NEXT:    addi 1, 1, 80
373; PC64LE9-NEXT:    ld 0, 16(1)
374; PC64LE9-NEXT:    mtlr 0
375; PC64LE9-NEXT:    blr
376entry:
377  %rem = call <3 x float> @llvm.experimental.constrained.frem.v3f32(
378           <3 x float> %x,
379           <3 x float> %y,
380           metadata !"round.dynamic",
381           metadata !"fpexcept.strict") #1
382  ret <3 x float> %rem
383}
384
385define <3 x double> @constrained_vector_frem_v3f64(<3 x double> %x, <3 x double> %y) #0 {
386; PC64LE-LABEL: constrained_vector_frem_v3f64:
387; PC64LE:       # %bb.0: # %entry
388; PC64LE-NEXT:    mflr 0
389; PC64LE-NEXT:    std 0, 16(1)
390; PC64LE-NEXT:    stdu 1, -96(1)
391; PC64LE-NEXT:    stfd 28, 64(1) # 8-byte Folded Spill
392; PC64LE-NEXT:    fmr 28, 2
393; PC64LE-NEXT:    li 3, 48
394; PC64LE-NEXT:    fmr 2, 4
395; PC64LE-NEXT:    stfd 29, 72(1) # 8-byte Folded Spill
396; PC64LE-NEXT:    stfd 30, 80(1) # 8-byte Folded Spill
397; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
398; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
399; PC64LE-NEXT:    fmr 31, 6
400; PC64LE-NEXT:    fmr 30, 5
401; PC64LE-NEXT:    fmr 29, 3
402; PC64LE-NEXT:    bl fmod
403; PC64LE-NEXT:    nop
404; PC64LE-NEXT:    xxlor 63, 1, 1
405; PC64LE-NEXT:    fmr 1, 28
406; PC64LE-NEXT:    fmr 2, 30
407; PC64LE-NEXT:    bl fmod
408; PC64LE-NEXT:    nop
409; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
410; PC64LE-NEXT:    xxmrghd 63, 1, 63
411; PC64LE-NEXT:    fmr 2, 31
412; PC64LE-NEXT:    fmr 1, 29
413; PC64LE-NEXT:    bl fmod
414; PC64LE-NEXT:    nop
415; PC64LE-NEXT:    xxswapd 0, 63
416; PC64LE-NEXT:    li 3, 48
417; PC64LE-NEXT:    xxlor 2, 63, 63
418; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
419; PC64LE-NEXT:    lfd 30, 80(1) # 8-byte Folded Reload
420; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
421; PC64LE-NEXT:    lfd 29, 72(1) # 8-byte Folded Reload
422; PC64LE-NEXT:    fmr 3, 1
423; PC64LE-NEXT:    lfd 28, 64(1) # 8-byte Folded Reload
424; PC64LE-NEXT:    fmr 1, 0
425; PC64LE-NEXT:    addi 1, 1, 96
426; PC64LE-NEXT:    ld 0, 16(1)
427; PC64LE-NEXT:    mtlr 0
428; PC64LE-NEXT:    blr
429;
430; PC64LE9-LABEL: constrained_vector_frem_v3f64:
431; PC64LE9:       # %bb.0: # %entry
432; PC64LE9-NEXT:    mflr 0
433; PC64LE9-NEXT:    std 0, 16(1)
434; PC64LE9-NEXT:    stdu 1, -80(1)
435; PC64LE9-NEXT:    stfd 28, 48(1) # 8-byte Folded Spill
436; PC64LE9-NEXT:    fmr 28, 2
437; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
438; PC64LE9-NEXT:    fmr 2, 4
439; PC64LE9-NEXT:    stfd 29, 56(1) # 8-byte Folded Spill
440; PC64LE9-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
441; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
442; PC64LE9-NEXT:    fmr 31, 6
443; PC64LE9-NEXT:    fmr 30, 5
444; PC64LE9-NEXT:    fmr 29, 3
445; PC64LE9-NEXT:    bl fmod
446; PC64LE9-NEXT:    nop
447; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
448; PC64LE9-NEXT:    fmr 1, 28
449; PC64LE9-NEXT:    fmr 2, 30
450; PC64LE9-NEXT:    bl fmod
451; PC64LE9-NEXT:    nop
452; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
453; PC64LE9-NEXT:    xxmrghd 63, 1, 63
454; PC64LE9-NEXT:    fmr 1, 29
455; PC64LE9-NEXT:    fmr 2, 31
456; PC64LE9-NEXT:    bl fmod
457; PC64LE9-NEXT:    nop
458; PC64LE9-NEXT:    fmr 3, 1
459; PC64LE9-NEXT:    xxswapd 1, 63
460; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
461; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
462; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
463; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
464; PC64LE9-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
465; PC64LE9-NEXT:    lfd 29, 56(1) # 8-byte Folded Reload
466; PC64LE9-NEXT:    lfd 28, 48(1) # 8-byte Folded Reload
467; PC64LE9-NEXT:    addi 1, 1, 80
468; PC64LE9-NEXT:    ld 0, 16(1)
469; PC64LE9-NEXT:    mtlr 0
470; PC64LE9-NEXT:    blr
471entry:
472  %rem = call <3 x double> @llvm.experimental.constrained.frem.v3f64(
473           <3 x double> %x,
474           <3 x double> %y,
475           metadata !"round.dynamic",
476           metadata !"fpexcept.strict") #1
477  ret <3 x double> %rem
478}
479
480define <4 x double> @constrained_vector_frem_v4f64(<4 x double> %x, <4 x double> %y) #0 {
481; PC64LE-LABEL: constrained_vector_frem_v4f64:
482; PC64LE:       # %bb.0:
483; PC64LE-NEXT:    mflr 0
484; PC64LE-NEXT:    std 0, 16(1)
485; PC64LE-NEXT:    stdu 1, -128(1)
486; PC64LE-NEXT:    li 3, 48
487; PC64LE-NEXT:    stxvd2x 59, 1, 3 # 16-byte Folded Spill
488; PC64LE-NEXT:    li 3, 64
489; PC64LE-NEXT:    stxvd2x 60, 1, 3 # 16-byte Folded Spill
490; PC64LE-NEXT:    li 3, 80
491; PC64LE-NEXT:    vmr 28, 2
492; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
493; PC64LE-NEXT:    li 3, 96
494; PC64LE-NEXT:    vmr 29, 3
495; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
496; PC64LE-NEXT:    vmr 30, 4
497; PC64LE-NEXT:    li 3, 112
498; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
499; PC64LE-NEXT:    vmr 31, 5
500; PC64LE-NEXT:    xxlor 1, 60, 60
501; PC64LE-NEXT:    xxlor 2, 62, 62
502; PC64LE-NEXT:    bl fmod
503; PC64LE-NEXT:    nop
504; PC64LE-NEXT:    xxlor 59, 1, 1
505; PC64LE-NEXT:    xxswapd 1, 60
506; PC64LE-NEXT:    xxswapd 2, 62
507; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
508; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
509; PC64LE-NEXT:    bl fmod
510; PC64LE-NEXT:    nop
511; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
512; PC64LE-NEXT:    xxmrghd 62, 59, 1
513; PC64LE-NEXT:    xxlor 2, 63, 63
514; PC64LE-NEXT:    xxlor 1, 61, 61
515; PC64LE-NEXT:    bl fmod
516; PC64LE-NEXT:    nop
517; PC64LE-NEXT:    xxlor 60, 1, 1
518; PC64LE-NEXT:    xxswapd 1, 61
519; PC64LE-NEXT:    xxswapd 2, 63
520; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
521; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
522; PC64LE-NEXT:    bl fmod
523; PC64LE-NEXT:    nop
524; PC64LE-NEXT:    li 3, 112
525; PC64LE-NEXT:    vmr 2, 30
526; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
527; PC64LE-NEXT:    xxmrghd 35, 60, 1
528; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
529; PC64LE-NEXT:    li 3, 96
530; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
531; PC64LE-NEXT:    li 3, 80
532; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
533; PC64LE-NEXT:    li 3, 64
534; PC64LE-NEXT:    lxvd2x 60, 1, 3 # 16-byte Folded Reload
535; PC64LE-NEXT:    li 3, 48
536; PC64LE-NEXT:    lxvd2x 59, 1, 3 # 16-byte Folded Reload
537; PC64LE-NEXT:    addi 1, 1, 128
538; PC64LE-NEXT:    ld 0, 16(1)
539; PC64LE-NEXT:    mtlr 0
540; PC64LE-NEXT:    blr
541;
542; PC64LE9-LABEL: constrained_vector_frem_v4f64:
543; PC64LE9:       # %bb.0:
544; PC64LE9-NEXT:    mflr 0
545; PC64LE9-NEXT:    std 0, 16(1)
546; PC64LE9-NEXT:    stdu 1, -112(1)
547; PC64LE9-NEXT:    stxv 60, 48(1) # 16-byte Folded Spill
548; PC64LE9-NEXT:    stxv 62, 80(1) # 16-byte Folded Spill
549; PC64LE9-NEXT:    vmr 30, 4
550; PC64LE9-NEXT:    xscpsgndp 2, 62, 62
551; PC64LE9-NEXT:    vmr 28, 2
552; PC64LE9-NEXT:    xscpsgndp 1, 60, 60
553; PC64LE9-NEXT:    stxv 59, 32(1) # 16-byte Folded Spill
554; PC64LE9-NEXT:    stxv 61, 64(1) # 16-byte Folded Spill
555; PC64LE9-NEXT:    stxv 63, 96(1) # 16-byte Folded Spill
556; PC64LE9-NEXT:    vmr 31, 5
557; PC64LE9-NEXT:    vmr 29, 3
558; PC64LE9-NEXT:    bl fmod
559; PC64LE9-NEXT:    nop
560; PC64LE9-NEXT:    xscpsgndp 59, 1, 1
561; PC64LE9-NEXT:    xxswapd 1, 60
562; PC64LE9-NEXT:    xxswapd 2, 62
563; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
564; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
565; PC64LE9-NEXT:    bl fmod
566; PC64LE9-NEXT:    nop
567; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
568; PC64LE9-NEXT:    xxmrghd 62, 59, 1
569; PC64LE9-NEXT:    xscpsgndp 1, 61, 61
570; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
571; PC64LE9-NEXT:    bl fmod
572; PC64LE9-NEXT:    nop
573; PC64LE9-NEXT:    xscpsgndp 60, 1, 1
574; PC64LE9-NEXT:    xxswapd 1, 61
575; PC64LE9-NEXT:    xxswapd 2, 63
576; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
577; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
578; PC64LE9-NEXT:    bl fmod
579; PC64LE9-NEXT:    nop
580; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
581; PC64LE9-NEXT:    xxmrghd 35, 60, 1
582; PC64LE9-NEXT:    vmr 2, 30
583; PC64LE9-NEXT:    lxv 63, 96(1) # 16-byte Folded Reload
584; PC64LE9-NEXT:    lxv 62, 80(1) # 16-byte Folded Reload
585; PC64LE9-NEXT:    lxv 61, 64(1) # 16-byte Folded Reload
586; PC64LE9-NEXT:    lxv 60, 48(1) # 16-byte Folded Reload
587; PC64LE9-NEXT:    lxv 59, 32(1) # 16-byte Folded Reload
588; PC64LE9-NEXT:    addi 1, 1, 112
589; PC64LE9-NEXT:    ld 0, 16(1)
590; PC64LE9-NEXT:    mtlr 0
591; PC64LE9-NEXT:    blr
592  %rem = call <4 x double> @llvm.experimental.constrained.frem.v4f64(
593           <4 x double> %x,
594           <4 x double> %y,
595           metadata !"round.dynamic",
596           metadata !"fpexcept.strict") #1
597  ret <4 x double> %rem
598}
599
600define <1 x float> @constrained_vector_fmul_v1f32(<1 x float> %x, <1 x float> %y) #0 {
601; PC64LE-LABEL: constrained_vector_fmul_v1f32:
602; PC64LE:       # %bb.0: # %entry
603; PC64LE-NEXT:    xsmulsp 1, 1, 2
604; PC64LE-NEXT:    blr
605;
606; PC64LE9-LABEL: constrained_vector_fmul_v1f32:
607; PC64LE9:       # %bb.0: # %entry
608; PC64LE9-NEXT:    xsmulsp 1, 1, 2
609; PC64LE9-NEXT:    blr
610entry:
611  %mul = call <1 x float> @llvm.experimental.constrained.fmul.v1f32(
612           <1 x float> %x,
613           <1 x float> %y,
614           metadata !"round.dynamic",
615           metadata !"fpexcept.strict") #1
616  ret <1 x float> %mul
617}
618
619define <2 x double> @constrained_vector_fmul_v2f64(<2 x double> %x, <2 x double> %y) #0 {
620; PC64LE-LABEL: constrained_vector_fmul_v2f64:
621; PC64LE:       # %bb.0: # %entry
622; PC64LE-NEXT:    xvmuldp 34, 34, 35
623; PC64LE-NEXT:    blr
624;
625; PC64LE9-LABEL: constrained_vector_fmul_v2f64:
626; PC64LE9:       # %bb.0: # %entry
627; PC64LE9-NEXT:    xvmuldp 34, 34, 35
628; PC64LE9-NEXT:    blr
629entry:
630  %mul = call <2 x double> @llvm.experimental.constrained.fmul.v2f64(
631           <2 x double> %x,
632           <2 x double> %y,
633           metadata !"round.dynamic",
634           metadata !"fpexcept.strict") #1
635  ret <2 x double> %mul
636}
637
638define <3 x float> @constrained_vector_fmul_v3f32(<3 x float> %x, <3 x float> %y) #0 {
639; PC64LE-LABEL: constrained_vector_fmul_v3f32:
640; PC64LE:       # %bb.0: # %entry
641; PC64LE-NEXT:    xxswapd 0, 35
642; PC64LE-NEXT:    xxsldwi 1, 35, 35, 3
643; PC64LE-NEXT:    addis 3, 2, .LCPI12_0@toc@ha
644; PC64LE-NEXT:    xxsldwi 2, 34, 34, 3
645; PC64LE-NEXT:    xxswapd 3, 34
646; PC64LE-NEXT:    addi 3, 3, .LCPI12_0@toc@l
647; PC64LE-NEXT:    xxsldwi 4, 35, 35, 1
648; PC64LE-NEXT:    xxsldwi 5, 34, 34, 1
649; PC64LE-NEXT:    lvx 4, 0, 3
650; PC64LE-NEXT:    xscvspdpn 0, 0
651; PC64LE-NEXT:    xscvspdpn 1, 1
652; PC64LE-NEXT:    xscvspdpn 2, 2
653; PC64LE-NEXT:    xscvspdpn 3, 3
654; PC64LE-NEXT:    xscvspdpn 4, 4
655; PC64LE-NEXT:    xscvspdpn 5, 5
656; PC64LE-NEXT:    xsmulsp 1, 2, 1
657; PC64LE-NEXT:    xsmulsp 0, 3, 0
658; PC64LE-NEXT:    xsmulsp 2, 5, 4
659; PC64LE-NEXT:    xscvdpspn 1, 1
660; PC64LE-NEXT:    xscvdpspn 0, 0
661; PC64LE-NEXT:    xscvdpspn 34, 2
662; PC64LE-NEXT:    xxmrghw 35, 0, 1
663; PC64LE-NEXT:    vperm 2, 2, 3, 4
664; PC64LE-NEXT:    blr
665;
666; PC64LE9-LABEL: constrained_vector_fmul_v3f32:
667; PC64LE9:       # %bb.0: # %entry
668; PC64LE9-NEXT:    xxsldwi 0, 35, 35, 1
669; PC64LE9-NEXT:    xxsldwi 1, 34, 34, 1
670; PC64LE9-NEXT:    addis 3, 2, .LCPI12_0@toc@ha
671; PC64LE9-NEXT:    addi 3, 3, .LCPI12_0@toc@l
672; PC64LE9-NEXT:    xxswapd 2, 34
673; PC64LE9-NEXT:    xxsldwi 3, 34, 34, 3
674; PC64LE9-NEXT:    xscvspdpn 0, 0
675; PC64LE9-NEXT:    xscvspdpn 1, 1
676; PC64LE9-NEXT:    xscvspdpn 2, 2
677; PC64LE9-NEXT:    xscvspdpn 3, 3
678; PC64LE9-NEXT:    lxv 36, 0(3)
679; PC64LE9-NEXT:    xsmulsp 0, 1, 0
680; PC64LE9-NEXT:    xxswapd 1, 35
681; PC64LE9-NEXT:    xscvspdpn 1, 1
682; PC64LE9-NEXT:    xsmulsp 1, 2, 1
683; PC64LE9-NEXT:    xxsldwi 2, 35, 35, 3
684; PC64LE9-NEXT:    xscvdpspn 35, 0
685; PC64LE9-NEXT:    xscvspdpn 2, 2
686; PC64LE9-NEXT:    xsmulsp 2, 3, 2
687; PC64LE9-NEXT:    xscvdpspn 1, 1
688; PC64LE9-NEXT:    xscvdpspn 2, 2
689; PC64LE9-NEXT:    xxmrghw 34, 1, 2
690; PC64LE9-NEXT:    vperm 2, 3, 2, 4
691; PC64LE9-NEXT:    blr
692entry:
693  %mul = call <3 x float> @llvm.experimental.constrained.fmul.v3f32(
694           <3 x float> %x,
695           <3 x float> %y,
696           metadata !"round.dynamic",
697           metadata !"fpexcept.strict") #1
698  ret <3 x float> %mul
699}
700
701define <3 x double> @constrained_vector_fmul_v3f64(<3 x double> %x, <3 x double> %y) #0 {
702; PC64LE-LABEL: constrained_vector_fmul_v3f64:
703; PC64LE:       # %bb.0: # %entry
704; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
705; PC64LE-NEXT:    # kill: def $f5 killed $f5 def $vsl5
706; PC64LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
707; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
708; PC64LE-NEXT:    xxmrghd 0, 5, 4
709; PC64LE-NEXT:    xsmuldp 3, 3, 6
710; PC64LE-NEXT:    xxmrghd 1, 2, 1
711; PC64LE-NEXT:    xvmuldp 2, 1, 0
712; PC64LE-NEXT:    xxswapd 1, 2
713; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
714; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
715; PC64LE-NEXT:    blr
716;
717; PC64LE9-LABEL: constrained_vector_fmul_v3f64:
718; PC64LE9:       # %bb.0: # %entry
719; PC64LE9-NEXT:    # kill: def $f5 killed $f5 def $vsl5
720; PC64LE9-NEXT:    # kill: def $f4 killed $f4 def $vsl4
721; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
722; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
723; PC64LE9-NEXT:    xxmrghd 0, 5, 4
724; PC64LE9-NEXT:    xxmrghd 1, 2, 1
725; PC64LE9-NEXT:    xsmuldp 3, 3, 6
726; PC64LE9-NEXT:    xvmuldp 2, 1, 0
727; PC64LE9-NEXT:    xxswapd 1, 2
728; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
729; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
730; PC64LE9-NEXT:    blr
731entry:
732  %mul = call <3 x double> @llvm.experimental.constrained.fmul.v3f64(
733           <3 x double> %x,
734           <3 x double> %y,
735           metadata !"round.dynamic",
736           metadata !"fpexcept.strict") #1
737  ret <3 x double> %mul
738}
739
740define <4 x double> @constrained_vector_fmul_v4f64(<4 x double> %x, <4 x double> %y) #0 {
741; PC64LE-LABEL: constrained_vector_fmul_v4f64:
742; PC64LE:       # %bb.0: # %entry
743; PC64LE-NEXT:    xvmuldp 35, 35, 37
744; PC64LE-NEXT:    xvmuldp 34, 34, 36
745; PC64LE-NEXT:    blr
746;
747; PC64LE9-LABEL: constrained_vector_fmul_v4f64:
748; PC64LE9:       # %bb.0: # %entry
749; PC64LE9-NEXT:    xvmuldp 35, 35, 37
750; PC64LE9-NEXT:    xvmuldp 34, 34, 36
751; PC64LE9-NEXT:    blr
752entry:
753  %mul = call <4 x double> @llvm.experimental.constrained.fmul.v4f64(
754           <4 x double> %x,
755           <4 x double> %y,
756           metadata !"round.dynamic",
757           metadata !"fpexcept.strict") #1
758  ret <4 x double> %mul
759}
760
761define <1 x float> @constrained_vector_fadd_v1f32(<1 x float> %x, <1 x float> %y) #0 {
762; PC64LE-LABEL: constrained_vector_fadd_v1f32:
763; PC64LE:       # %bb.0: # %entry
764; PC64LE-NEXT:    xsaddsp 1, 1, 2
765; PC64LE-NEXT:    blr
766;
767; PC64LE9-LABEL: constrained_vector_fadd_v1f32:
768; PC64LE9:       # %bb.0: # %entry
769; PC64LE9-NEXT:    xsaddsp 1, 1, 2
770; PC64LE9-NEXT:    blr
771entry:
772  %add = call <1 x float> @llvm.experimental.constrained.fadd.v1f32(
773           <1 x float> %x,
774           <1 x float> %y,
775           metadata !"round.dynamic",
776           metadata !"fpexcept.strict") #1
777  ret <1 x float> %add
778}
779
780define <2 x double> @constrained_vector_fadd_v2f64(<2 x double> %x, <2 x double> %y) #0 {
781; PC64LE-LABEL: constrained_vector_fadd_v2f64:
782; PC64LE:       # %bb.0: # %entry
783; PC64LE-NEXT:    xvadddp 34, 34, 35
784; PC64LE-NEXT:    blr
785;
786; PC64LE9-LABEL: constrained_vector_fadd_v2f64:
787; PC64LE9:       # %bb.0: # %entry
788; PC64LE9-NEXT:    xvadddp 34, 34, 35
789; PC64LE9-NEXT:    blr
790entry:
791  %add = call <2 x double> @llvm.experimental.constrained.fadd.v2f64(
792           <2 x double> %x,
793           <2 x double> %y,
794           metadata !"round.dynamic",
795           metadata !"fpexcept.strict") #1
796  ret <2 x double> %add
797}
798
799define <3 x float> @constrained_vector_fadd_v3f32(<3 x float> %x, <3 x float> %y) #0 {
800; PC64LE-LABEL: constrained_vector_fadd_v3f32:
801; PC64LE:       # %bb.0: # %entry
802; PC64LE-NEXT:    xxswapd 0, 35
803; PC64LE-NEXT:    xxsldwi 1, 35, 35, 3
804; PC64LE-NEXT:    addis 3, 2, .LCPI17_0@toc@ha
805; PC64LE-NEXT:    xxsldwi 2, 34, 34, 3
806; PC64LE-NEXT:    xxswapd 3, 34
807; PC64LE-NEXT:    addi 3, 3, .LCPI17_0@toc@l
808; PC64LE-NEXT:    xxsldwi 4, 35, 35, 1
809; PC64LE-NEXT:    xxsldwi 5, 34, 34, 1
810; PC64LE-NEXT:    lvx 4, 0, 3
811; PC64LE-NEXT:    xscvspdpn 0, 0
812; PC64LE-NEXT:    xscvspdpn 1, 1
813; PC64LE-NEXT:    xscvspdpn 2, 2
814; PC64LE-NEXT:    xscvspdpn 3, 3
815; PC64LE-NEXT:    xscvspdpn 4, 4
816; PC64LE-NEXT:    xscvspdpn 5, 5
817; PC64LE-NEXT:    xsaddsp 1, 2, 1
818; PC64LE-NEXT:    xsaddsp 0, 3, 0
819; PC64LE-NEXT:    xsaddsp 2, 5, 4
820; PC64LE-NEXT:    xscvdpspn 1, 1
821; PC64LE-NEXT:    xscvdpspn 0, 0
822; PC64LE-NEXT:    xscvdpspn 34, 2
823; PC64LE-NEXT:    xxmrghw 35, 0, 1
824; PC64LE-NEXT:    vperm 2, 2, 3, 4
825; PC64LE-NEXT:    blr
826;
827; PC64LE9-LABEL: constrained_vector_fadd_v3f32:
828; PC64LE9:       # %bb.0: # %entry
829; PC64LE9-NEXT:    xxsldwi 0, 35, 35, 1
830; PC64LE9-NEXT:    xxsldwi 1, 34, 34, 1
831; PC64LE9-NEXT:    addis 3, 2, .LCPI17_0@toc@ha
832; PC64LE9-NEXT:    addi 3, 3, .LCPI17_0@toc@l
833; PC64LE9-NEXT:    xxswapd 2, 34
834; PC64LE9-NEXT:    xxsldwi 3, 34, 34, 3
835; PC64LE9-NEXT:    xscvspdpn 0, 0
836; PC64LE9-NEXT:    xscvspdpn 1, 1
837; PC64LE9-NEXT:    xscvspdpn 2, 2
838; PC64LE9-NEXT:    xscvspdpn 3, 3
839; PC64LE9-NEXT:    lxv 36, 0(3)
840; PC64LE9-NEXT:    xsaddsp 0, 1, 0
841; PC64LE9-NEXT:    xxswapd 1, 35
842; PC64LE9-NEXT:    xscvspdpn 1, 1
843; PC64LE9-NEXT:    xsaddsp 1, 2, 1
844; PC64LE9-NEXT:    xxsldwi 2, 35, 35, 3
845; PC64LE9-NEXT:    xscvdpspn 35, 0
846; PC64LE9-NEXT:    xscvspdpn 2, 2
847; PC64LE9-NEXT:    xsaddsp 2, 3, 2
848; PC64LE9-NEXT:    xscvdpspn 1, 1
849; PC64LE9-NEXT:    xscvdpspn 2, 2
850; PC64LE9-NEXT:    xxmrghw 34, 1, 2
851; PC64LE9-NEXT:    vperm 2, 3, 2, 4
852; PC64LE9-NEXT:    blr
853entry:
854  %add = call <3 x float> @llvm.experimental.constrained.fadd.v3f32(
855           <3 x float> %x,
856           <3 x float> %y,
857           metadata !"round.dynamic",
858           metadata !"fpexcept.strict") #1
859  ret <3 x float> %add
860}
861
862define <3 x double> @constrained_vector_fadd_v3f64(<3 x double> %x, <3 x double> %y) #0 {
863; PC64LE-LABEL: constrained_vector_fadd_v3f64:
864; PC64LE:       # %bb.0: # %entry
865; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
866; PC64LE-NEXT:    # kill: def $f5 killed $f5 def $vsl5
867; PC64LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
868; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
869; PC64LE-NEXT:    xxmrghd 0, 5, 4
870; PC64LE-NEXT:    xsadddp 3, 3, 6
871; PC64LE-NEXT:    xxmrghd 1, 2, 1
872; PC64LE-NEXT:    xvadddp 2, 1, 0
873; PC64LE-NEXT:    xxswapd 1, 2
874; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
875; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
876; PC64LE-NEXT:    blr
877;
878; PC64LE9-LABEL: constrained_vector_fadd_v3f64:
879; PC64LE9:       # %bb.0: # %entry
880; PC64LE9-NEXT:    # kill: def $f5 killed $f5 def $vsl5
881; PC64LE9-NEXT:    # kill: def $f4 killed $f4 def $vsl4
882; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
883; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
884; PC64LE9-NEXT:    xxmrghd 0, 5, 4
885; PC64LE9-NEXT:    xxmrghd 1, 2, 1
886; PC64LE9-NEXT:    xsadddp 3, 3, 6
887; PC64LE9-NEXT:    xvadddp 2, 1, 0
888; PC64LE9-NEXT:    xxswapd 1, 2
889; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
890; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
891; PC64LE9-NEXT:    blr
892entry:
893  %add = call <3 x double> @llvm.experimental.constrained.fadd.v3f64(
894           <3 x double> %x,
895           <3 x double> %y,
896           metadata !"round.dynamic",
897           metadata !"fpexcept.strict") #1
898  ret <3 x double> %add
899}
900
901define <4 x double> @constrained_vector_fadd_v4f64(<4 x double> %x, <4 x double> %y) #0 {
902; PC64LE-LABEL: constrained_vector_fadd_v4f64:
903; PC64LE:       # %bb.0: # %entry
904; PC64LE-NEXT:    xvadddp 35, 35, 37
905; PC64LE-NEXT:    xvadddp 34, 34, 36
906; PC64LE-NEXT:    blr
907;
908; PC64LE9-LABEL: constrained_vector_fadd_v4f64:
909; PC64LE9:       # %bb.0: # %entry
910; PC64LE9-NEXT:    xvadddp 35, 35, 37
911; PC64LE9-NEXT:    xvadddp 34, 34, 36
912; PC64LE9-NEXT:    blr
913entry:
914  %add = call <4 x double> @llvm.experimental.constrained.fadd.v4f64(
915           <4 x double> %x,
916           <4 x double> %y,
917           metadata !"round.dynamic",
918           metadata !"fpexcept.strict") #1
919  ret <4 x double> %add
920}
921
922define <1 x float> @constrained_vector_fsub_v1f32(<1 x float> %x, <1 x float> %y) #0 {
923; PC64LE-LABEL: constrained_vector_fsub_v1f32:
924; PC64LE:       # %bb.0: # %entry
925; PC64LE-NEXT:    xssubsp 1, 1, 2
926; PC64LE-NEXT:    blr
927;
928; PC64LE9-LABEL: constrained_vector_fsub_v1f32:
929; PC64LE9:       # %bb.0: # %entry
930; PC64LE9-NEXT:    xssubsp 1, 1, 2
931; PC64LE9-NEXT:    blr
932entry:
933  %sub = call <1 x float> @llvm.experimental.constrained.fsub.v1f32(
934           <1 x float> %x,
935           <1 x float> %y,
936           metadata !"round.dynamic",
937           metadata !"fpexcept.strict") #1
938  ret <1 x float> %sub
939}
940
941define <2 x double> @constrained_vector_fsub_v2f64(<2 x double> %x, <2 x double> %y) #0 {
942; PC64LE-LABEL: constrained_vector_fsub_v2f64:
943; PC64LE:       # %bb.0: # %entry
944; PC64LE-NEXT:    xvsubdp 34, 34, 35
945; PC64LE-NEXT:    blr
946;
947; PC64LE9-LABEL: constrained_vector_fsub_v2f64:
948; PC64LE9:       # %bb.0: # %entry
949; PC64LE9-NEXT:    xvsubdp 34, 34, 35
950; PC64LE9-NEXT:    blr
951entry:
952  %sub = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(
953           <2 x double> %x,
954           <2 x double> %y,
955           metadata !"round.dynamic",
956           metadata !"fpexcept.strict") #1
957  ret <2 x double> %sub
958}
959
960define <3 x float> @constrained_vector_fsub_v3f32(<3 x float> %x, <3 x float> %y) #0 {
961; PC64LE-LABEL: constrained_vector_fsub_v3f32:
962; PC64LE:       # %bb.0: # %entry
963; PC64LE-NEXT:    xxswapd 0, 35
964; PC64LE-NEXT:    xxsldwi 1, 35, 35, 3
965; PC64LE-NEXT:    addis 3, 2, .LCPI22_0@toc@ha
966; PC64LE-NEXT:    xxsldwi 2, 34, 34, 3
967; PC64LE-NEXT:    xxswapd 3, 34
968; PC64LE-NEXT:    addi 3, 3, .LCPI22_0@toc@l
969; PC64LE-NEXT:    xxsldwi 4, 35, 35, 1
970; PC64LE-NEXT:    xxsldwi 5, 34, 34, 1
971; PC64LE-NEXT:    lvx 4, 0, 3
972; PC64LE-NEXT:    xscvspdpn 0, 0
973; PC64LE-NEXT:    xscvspdpn 1, 1
974; PC64LE-NEXT:    xscvspdpn 2, 2
975; PC64LE-NEXT:    xscvspdpn 3, 3
976; PC64LE-NEXT:    xscvspdpn 4, 4
977; PC64LE-NEXT:    xscvspdpn 5, 5
978; PC64LE-NEXT:    xssubsp 1, 2, 1
979; PC64LE-NEXT:    xssubsp 0, 3, 0
980; PC64LE-NEXT:    xssubsp 2, 5, 4
981; PC64LE-NEXT:    xscvdpspn 1, 1
982; PC64LE-NEXT:    xscvdpspn 0, 0
983; PC64LE-NEXT:    xscvdpspn 34, 2
984; PC64LE-NEXT:    xxmrghw 35, 0, 1
985; PC64LE-NEXT:    vperm 2, 2, 3, 4
986; PC64LE-NEXT:    blr
987;
988; PC64LE9-LABEL: constrained_vector_fsub_v3f32:
989; PC64LE9:       # %bb.0: # %entry
990; PC64LE9-NEXT:    xxsldwi 0, 35, 35, 1
991; PC64LE9-NEXT:    xxsldwi 1, 34, 34, 1
992; PC64LE9-NEXT:    addis 3, 2, .LCPI22_0@toc@ha
993; PC64LE9-NEXT:    addi 3, 3, .LCPI22_0@toc@l
994; PC64LE9-NEXT:    xxswapd 2, 34
995; PC64LE9-NEXT:    xxsldwi 3, 34, 34, 3
996; PC64LE9-NEXT:    xscvspdpn 0, 0
997; PC64LE9-NEXT:    xscvspdpn 1, 1
998; PC64LE9-NEXT:    xscvspdpn 2, 2
999; PC64LE9-NEXT:    xscvspdpn 3, 3
1000; PC64LE9-NEXT:    lxv 36, 0(3)
1001; PC64LE9-NEXT:    xssubsp 0, 1, 0
1002; PC64LE9-NEXT:    xxswapd 1, 35
1003; PC64LE9-NEXT:    xscvspdpn 1, 1
1004; PC64LE9-NEXT:    xssubsp 1, 2, 1
1005; PC64LE9-NEXT:    xxsldwi 2, 35, 35, 3
1006; PC64LE9-NEXT:    xscvdpspn 35, 0
1007; PC64LE9-NEXT:    xscvspdpn 2, 2
1008; PC64LE9-NEXT:    xssubsp 2, 3, 2
1009; PC64LE9-NEXT:    xscvdpspn 1, 1
1010; PC64LE9-NEXT:    xscvdpspn 2, 2
1011; PC64LE9-NEXT:    xxmrghw 34, 1, 2
1012; PC64LE9-NEXT:    vperm 2, 3, 2, 4
1013; PC64LE9-NEXT:    blr
1014entry:
1015  %sub = call <3 x float> @llvm.experimental.constrained.fsub.v3f32(
1016           <3 x float> %x,
1017           <3 x float> %y,
1018           metadata !"round.dynamic",
1019           metadata !"fpexcept.strict") #1
1020  ret <3 x float> %sub
1021}
1022
1023define <3 x double> @constrained_vector_fsub_v3f64(<3 x double> %x, <3 x double> %y) #0 {
1024; PC64LE-LABEL: constrained_vector_fsub_v3f64:
1025; PC64LE:       # %bb.0: # %entry
1026; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1027; PC64LE-NEXT:    # kill: def $f5 killed $f5 def $vsl5
1028; PC64LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1029; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1030; PC64LE-NEXT:    xxmrghd 0, 5, 4
1031; PC64LE-NEXT:    xssubdp 3, 3, 6
1032; PC64LE-NEXT:    xxmrghd 1, 2, 1
1033; PC64LE-NEXT:    xvsubdp 2, 1, 0
1034; PC64LE-NEXT:    xxswapd 1, 2
1035; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1036; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1037; PC64LE-NEXT:    blr
1038;
1039; PC64LE9-LABEL: constrained_vector_fsub_v3f64:
1040; PC64LE9:       # %bb.0: # %entry
1041; PC64LE9-NEXT:    # kill: def $f5 killed $f5 def $vsl5
1042; PC64LE9-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1043; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1044; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1045; PC64LE9-NEXT:    xxmrghd 0, 5, 4
1046; PC64LE9-NEXT:    xxmrghd 1, 2, 1
1047; PC64LE9-NEXT:    xssubdp 3, 3, 6
1048; PC64LE9-NEXT:    xvsubdp 2, 1, 0
1049; PC64LE9-NEXT:    xxswapd 1, 2
1050; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1051; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1052; PC64LE9-NEXT:    blr
1053entry:
1054  %sub = call <3 x double> @llvm.experimental.constrained.fsub.v3f64(
1055           <3 x double> %x,
1056           <3 x double> %y,
1057           metadata !"round.dynamic",
1058           metadata !"fpexcept.strict") #1
1059  ret <3 x double> %sub
1060}
1061
1062define <4 x double> @constrained_vector_fsub_v4f64(<4 x double> %x, <4 x double> %y) #0 {
1063; PC64LE-LABEL: constrained_vector_fsub_v4f64:
1064; PC64LE:       # %bb.0: # %entry
1065; PC64LE-NEXT:    xvsubdp 35, 35, 37
1066; PC64LE-NEXT:    xvsubdp 34, 34, 36
1067; PC64LE-NEXT:    blr
1068;
1069; PC64LE9-LABEL: constrained_vector_fsub_v4f64:
1070; PC64LE9:       # %bb.0: # %entry
1071; PC64LE9-NEXT:    xvsubdp 35, 35, 37
1072; PC64LE9-NEXT:    xvsubdp 34, 34, 36
1073; PC64LE9-NEXT:    blr
1074entry:
1075  %sub = call <4 x double> @llvm.experimental.constrained.fsub.v4f64(
1076           <4 x double> %x,
1077           <4 x double> %y,
1078           metadata !"round.dynamic",
1079           metadata !"fpexcept.strict") #1
1080  ret <4 x double> %sub
1081}
1082
1083define <1 x float> @constrained_vector_sqrt_v1f32(<1 x float> %x) #0 {
1084; PC64LE-LABEL: constrained_vector_sqrt_v1f32:
1085; PC64LE:       # %bb.0: # %entry
1086; PC64LE-NEXT:    xssqrtsp 1, 1
1087; PC64LE-NEXT:    blr
1088;
1089; PC64LE9-LABEL: constrained_vector_sqrt_v1f32:
1090; PC64LE9:       # %bb.0: # %entry
1091; PC64LE9-NEXT:    xssqrtsp 1, 1
1092; PC64LE9-NEXT:    blr
1093entry:
1094  %sqrt = call <1 x float> @llvm.experimental.constrained.sqrt.v1f32(
1095                              <1 x float> %x,
1096                              metadata !"round.dynamic",
1097                              metadata !"fpexcept.strict") #1
1098  ret <1 x float> %sqrt
1099}
1100
1101define <2 x double> @constrained_vector_sqrt_v2f64(<2 x double> %x) #0 {
1102; PC64LE-LABEL: constrained_vector_sqrt_v2f64:
1103; PC64LE:       # %bb.0: # %entry
1104; PC64LE-NEXT:    xvsqrtdp 34, 34
1105; PC64LE-NEXT:    blr
1106;
1107; PC64LE9-LABEL: constrained_vector_sqrt_v2f64:
1108; PC64LE9:       # %bb.0: # %entry
1109; PC64LE9-NEXT:    xvsqrtdp 34, 34
1110; PC64LE9-NEXT:    blr
1111entry:
1112  %sqrt = call <2 x double> @llvm.experimental.constrained.sqrt.v2f64(
1113                              <2 x double> %x,
1114                              metadata !"round.dynamic",
1115                              metadata !"fpexcept.strict") #1
1116  ret <2 x double> %sqrt
1117}
1118
1119define <3 x float> @constrained_vector_sqrt_v3f32(<3 x float> %x) #0 {
1120; PC64LE-LABEL: constrained_vector_sqrt_v3f32:
1121; PC64LE:       # %bb.0: # %entry
1122; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
1123; PC64LE-NEXT:    xxswapd 1, 34
1124; PC64LE-NEXT:    addis 3, 2, .LCPI27_0@toc@ha
1125; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
1126; PC64LE-NEXT:    addi 3, 3, .LCPI27_0@toc@l
1127; PC64LE-NEXT:    lvx 4, 0, 3
1128; PC64LE-NEXT:    xscvspdpn 0, 0
1129; PC64LE-NEXT:    xscvspdpn 1, 1
1130; PC64LE-NEXT:    xscvspdpn 2, 2
1131; PC64LE-NEXT:    xssqrtsp 0, 0
1132; PC64LE-NEXT:    xssqrtsp 1, 1
1133; PC64LE-NEXT:    xssqrtsp 2, 2
1134; PC64LE-NEXT:    xscvdpspn 0, 0
1135; PC64LE-NEXT:    xscvdpspn 1, 1
1136; PC64LE-NEXT:    xscvdpspn 34, 2
1137; PC64LE-NEXT:    xxmrghw 35, 1, 0
1138; PC64LE-NEXT:    vperm 2, 2, 3, 4
1139; PC64LE-NEXT:    blr
1140;
1141; PC64LE9-LABEL: constrained_vector_sqrt_v3f32:
1142; PC64LE9:       # %bb.0: # %entry
1143; PC64LE9-NEXT:    xxswapd 1, 34
1144; PC64LE9-NEXT:    xxsldwi 2, 34, 34, 3
1145; PC64LE9-NEXT:    addis 3, 2, .LCPI27_0@toc@ha
1146; PC64LE9-NEXT:    addi 3, 3, .LCPI27_0@toc@l
1147; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
1148; PC64LE9-NEXT:    xscvspdpn 1, 1
1149; PC64LE9-NEXT:    xscvspdpn 2, 2
1150; PC64LE9-NEXT:    xscvspdpn 0, 0
1151; PC64LE9-NEXT:    lxv 35, 0(3)
1152; PC64LE9-NEXT:    xssqrtsp 1, 1
1153; PC64LE9-NEXT:    xssqrtsp 2, 2
1154; PC64LE9-NEXT:    xssqrtsp 0, 0
1155; PC64LE9-NEXT:    xscvdpspn 2, 2
1156; PC64LE9-NEXT:    xscvdpspn 1, 1
1157; PC64LE9-NEXT:    xscvdpspn 36, 0
1158; PC64LE9-NEXT:    xxmrghw 34, 1, 2
1159; PC64LE9-NEXT:    vperm 2, 4, 2, 3
1160; PC64LE9-NEXT:    blr
1161entry:
1162  %sqrt = call <3 x float> @llvm.experimental.constrained.sqrt.v3f32(
1163                              <3 x float> %x,
1164                              metadata !"round.dynamic",
1165                              metadata !"fpexcept.strict") #1
1166  ret <3 x float> %sqrt
1167}
1168
1169define <3 x double> @constrained_vector_sqrt_v3f64(<3 x double> %x) #0 {
1170; PC64LE-LABEL: constrained_vector_sqrt_v3f64:
1171; PC64LE:       # %bb.0: # %entry
1172; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1173; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1174; PC64LE-NEXT:    xxmrghd 0, 2, 1
1175; PC64LE-NEXT:    xssqrtdp 3, 3
1176; PC64LE-NEXT:    xvsqrtdp 2, 0
1177; PC64LE-NEXT:    xxswapd 1, 2
1178; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1179; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1180; PC64LE-NEXT:    blr
1181;
1182; PC64LE9-LABEL: constrained_vector_sqrt_v3f64:
1183; PC64LE9:       # %bb.0: # %entry
1184; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1185; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1186; PC64LE9-NEXT:    xxmrghd 0, 2, 1
1187; PC64LE9-NEXT:    xssqrtdp 3, 3
1188; PC64LE9-NEXT:    xvsqrtdp 2, 0
1189; PC64LE9-NEXT:    xxswapd 1, 2
1190; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1191; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1192; PC64LE9-NEXT:    blr
1193entry:
1194  %sqrt = call <3 x double> @llvm.experimental.constrained.sqrt.v3f64(
1195                          <3 x double> %x,
1196                          metadata !"round.dynamic",
1197                          metadata !"fpexcept.strict") #1
1198  ret <3 x double> %sqrt
1199}
1200
1201define <4 x double> @constrained_vector_sqrt_v4f64(<4 x double> %x) #0 {
1202; PC64LE-LABEL: constrained_vector_sqrt_v4f64:
1203; PC64LE:       # %bb.0: # %entry
1204; PC64LE-NEXT:    xvsqrtdp 35, 35
1205; PC64LE-NEXT:    xvsqrtdp 34, 34
1206; PC64LE-NEXT:    blr
1207;
1208; PC64LE9-LABEL: constrained_vector_sqrt_v4f64:
1209; PC64LE9:       # %bb.0: # %entry
1210; PC64LE9-NEXT:    xvsqrtdp 35, 35
1211; PC64LE9-NEXT:    xvsqrtdp 34, 34
1212; PC64LE9-NEXT:    blr
1213 entry:
1214  %sqrt = call <4 x double> @llvm.experimental.constrained.sqrt.v4f64(
1215                              <4 x double> %x,
1216                              metadata !"round.dynamic",
1217                              metadata !"fpexcept.strict") #1
1218  ret <4 x double> %sqrt
1219}
1220
1221define <1 x float> @constrained_vector_pow_v1f32(<1 x float> %x, <1 x float> %y) #0 {
1222; PC64LE-LABEL: constrained_vector_pow_v1f32:
1223; PC64LE:       # %bb.0: # %entry
1224; PC64LE-NEXT:    mflr 0
1225; PC64LE-NEXT:    std 0, 16(1)
1226; PC64LE-NEXT:    stdu 1, -32(1)
1227; PC64LE-NEXT:    bl powf
1228; PC64LE-NEXT:    nop
1229; PC64LE-NEXT:    addi 1, 1, 32
1230; PC64LE-NEXT:    ld 0, 16(1)
1231; PC64LE-NEXT:    mtlr 0
1232; PC64LE-NEXT:    blr
1233;
1234; PC64LE9-LABEL: constrained_vector_pow_v1f32:
1235; PC64LE9:       # %bb.0: # %entry
1236; PC64LE9-NEXT:    mflr 0
1237; PC64LE9-NEXT:    std 0, 16(1)
1238; PC64LE9-NEXT:    stdu 1, -32(1)
1239; PC64LE9-NEXT:    bl powf
1240; PC64LE9-NEXT:    nop
1241; PC64LE9-NEXT:    addi 1, 1, 32
1242; PC64LE9-NEXT:    ld 0, 16(1)
1243; PC64LE9-NEXT:    mtlr 0
1244; PC64LE9-NEXT:    blr
1245entry:
1246  %pow = call <1 x float> @llvm.experimental.constrained.pow.v1f32(
1247                             <1 x float> %x,
1248                             <1 x float> %y,
1249                             metadata !"round.dynamic",
1250                             metadata !"fpexcept.strict") #1
1251  ret <1 x float> %pow
1252}
1253
1254define <2 x double> @constrained_vector_pow_v2f64(<2 x double> %x, <2 x double> %y) #0 {
1255; PC64LE-LABEL: constrained_vector_pow_v2f64:
1256; PC64LE:       # %bb.0: # %entry
1257; PC64LE-NEXT:    mflr 0
1258; PC64LE-NEXT:    std 0, 16(1)
1259; PC64LE-NEXT:    stdu 1, -96(1)
1260; PC64LE-NEXT:    li 3, 48
1261; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
1262; PC64LE-NEXT:    li 3, 64
1263; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
1264; PC64LE-NEXT:    li 3, 80
1265; PC64LE-NEXT:    vmr 30, 2
1266; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1267; PC64LE-NEXT:    vmr 31, 3
1268; PC64LE-NEXT:    xxlor 1, 62, 62
1269; PC64LE-NEXT:    xxlor 2, 63, 63
1270; PC64LE-NEXT:    bl pow
1271; PC64LE-NEXT:    nop
1272; PC64LE-NEXT:    xxlor 61, 1, 1
1273; PC64LE-NEXT:    xxswapd 1, 62
1274; PC64LE-NEXT:    xxswapd 2, 63
1275; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1276; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1277; PC64LE-NEXT:    bl pow
1278; PC64LE-NEXT:    nop
1279; PC64LE-NEXT:    li 3, 80
1280; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1281; PC64LE-NEXT:    xxmrghd 34, 61, 1
1282; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1283; PC64LE-NEXT:    li 3, 64
1284; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
1285; PC64LE-NEXT:    li 3, 48
1286; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
1287; PC64LE-NEXT:    addi 1, 1, 96
1288; PC64LE-NEXT:    ld 0, 16(1)
1289; PC64LE-NEXT:    mtlr 0
1290; PC64LE-NEXT:    blr
1291;
1292; PC64LE9-LABEL: constrained_vector_pow_v2f64:
1293; PC64LE9:       # %bb.0: # %entry
1294; PC64LE9-NEXT:    mflr 0
1295; PC64LE9-NEXT:    std 0, 16(1)
1296; PC64LE9-NEXT:    stdu 1, -80(1)
1297; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
1298; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
1299; PC64LE9-NEXT:    vmr 31, 3
1300; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
1301; PC64LE9-NEXT:    vmr 30, 2
1302; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
1303; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
1304; PC64LE9-NEXT:    bl pow
1305; PC64LE9-NEXT:    nop
1306; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
1307; PC64LE9-NEXT:    xxswapd 1, 62
1308; PC64LE9-NEXT:    xxswapd 2, 63
1309; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1310; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1311; PC64LE9-NEXT:    bl pow
1312; PC64LE9-NEXT:    nop
1313; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1314; PC64LE9-NEXT:    xxmrghd 34, 61, 1
1315; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
1316; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
1317; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
1318; PC64LE9-NEXT:    addi 1, 1, 80
1319; PC64LE9-NEXT:    ld 0, 16(1)
1320; PC64LE9-NEXT:    mtlr 0
1321; PC64LE9-NEXT:    blr
1322entry:
1323  %pow = call <2 x double> @llvm.experimental.constrained.pow.v2f64(
1324                             <2 x double> %x,
1325                             <2 x double> %y,
1326                             metadata !"round.dynamic",
1327                             metadata !"fpexcept.strict") #1
1328  ret <2 x double> %pow
1329}
1330
1331define <3 x float> @constrained_vector_pow_v3f32(<3 x float> %x, <3 x float> %y) #0 {
1332; PC64LE-LABEL: constrained_vector_pow_v3f32:
1333; PC64LE:       # %bb.0: # %entry
1334; PC64LE-NEXT:    mflr 0
1335; PC64LE-NEXT:    std 0, 16(1)
1336; PC64LE-NEXT:    stdu 1, -96(1)
1337; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
1338; PC64LE-NEXT:    xxsldwi 2, 35, 35, 1
1339; PC64LE-NEXT:    li 3, 48
1340; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
1341; PC64LE-NEXT:    li 3, 64
1342; PC64LE-NEXT:    stfd 30, 80(1) # 8-byte Folded Spill
1343; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
1344; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1345; PC64LE-NEXT:    xscvspdpn 1, 0
1346; PC64LE-NEXT:    xscvspdpn 2, 2
1347; PC64LE-NEXT:    vmr 31, 3
1348; PC64LE-NEXT:    vmr 30, 2
1349; PC64LE-NEXT:    bl powf
1350; PC64LE-NEXT:    nop
1351; PC64LE-NEXT:    xxswapd 0, 62
1352; PC64LE-NEXT:    xxswapd 2, 63
1353; PC64LE-NEXT:    fmr 31, 1
1354; PC64LE-NEXT:    xscvspdpn 1, 0
1355; PC64LE-NEXT:    xscvspdpn 2, 2
1356; PC64LE-NEXT:    bl powf
1357; PC64LE-NEXT:    nop
1358; PC64LE-NEXT:    xxsldwi 0, 62, 62, 3
1359; PC64LE-NEXT:    xxsldwi 2, 63, 63, 3
1360; PC64LE-NEXT:    fmr 30, 1
1361; PC64LE-NEXT:    xscvspdpn 1, 0
1362; PC64LE-NEXT:    xscvspdpn 2, 2
1363; PC64LE-NEXT:    bl powf
1364; PC64LE-NEXT:    nop
1365; PC64LE-NEXT:    xscvdpspn 0, 30
1366; PC64LE-NEXT:    addis 3, 2, .LCPI32_0@toc@ha
1367; PC64LE-NEXT:    lfd 30, 80(1) # 8-byte Folded Reload
1368; PC64LE-NEXT:    xscvdpspn 1, 1
1369; PC64LE-NEXT:    addi 3, 3, .LCPI32_0@toc@l
1370; PC64LE-NEXT:    xscvdpspn 34, 31
1371; PC64LE-NEXT:    lvx 4, 0, 3
1372; PC64LE-NEXT:    li 3, 64
1373; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
1374; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1375; PC64LE-NEXT:    li 3, 48
1376; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
1377; PC64LE-NEXT:    xxmrghw 35, 0, 1
1378; PC64LE-NEXT:    vperm 2, 2, 3, 4
1379; PC64LE-NEXT:    addi 1, 1, 96
1380; PC64LE-NEXT:    ld 0, 16(1)
1381; PC64LE-NEXT:    mtlr 0
1382; PC64LE-NEXT:    blr
1383;
1384; PC64LE9-LABEL: constrained_vector_pow_v3f32:
1385; PC64LE9:       # %bb.0: # %entry
1386; PC64LE9-NEXT:    mflr 0
1387; PC64LE9-NEXT:    std 0, 16(1)
1388; PC64LE9-NEXT:    stdu 1, -80(1)
1389; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
1390; PC64LE9-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
1391; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
1392; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
1393; PC64LE9-NEXT:    xscvspdpn 1, 0
1394; PC64LE9-NEXT:    xxsldwi 0, 35, 35, 1
1395; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
1396; PC64LE9-NEXT:    xscvspdpn 2, 0
1397; PC64LE9-NEXT:    vmr 31, 3
1398; PC64LE9-NEXT:    vmr 30, 2
1399; PC64LE9-NEXT:    bl powf
1400; PC64LE9-NEXT:    nop
1401; PC64LE9-NEXT:    xxswapd 0, 62
1402; PC64LE9-NEXT:    fmr 31, 1
1403; PC64LE9-NEXT:    xscvspdpn 1, 0
1404; PC64LE9-NEXT:    xxswapd 0, 63
1405; PC64LE9-NEXT:    xscvspdpn 2, 0
1406; PC64LE9-NEXT:    bl powf
1407; PC64LE9-NEXT:    nop
1408; PC64LE9-NEXT:    xxsldwi 0, 62, 62, 3
1409; PC64LE9-NEXT:    fmr 30, 1
1410; PC64LE9-NEXT:    xscvspdpn 1, 0
1411; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
1412; PC64LE9-NEXT:    xscvspdpn 2, 0
1413; PC64LE9-NEXT:    bl powf
1414; PC64LE9-NEXT:    nop
1415; PC64LE9-NEXT:    xscvdpspn 0, 1
1416; PC64LE9-NEXT:    xscvdpspn 1, 30
1417; PC64LE9-NEXT:    addis 3, 2, .LCPI32_0@toc@ha
1418; PC64LE9-NEXT:    xscvdpspn 35, 31
1419; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
1420; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
1421; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
1422; PC64LE9-NEXT:    addi 3, 3, .LCPI32_0@toc@l
1423; PC64LE9-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
1424; PC64LE9-NEXT:    lxv 36, 0(3)
1425; PC64LE9-NEXT:    xxmrghw 34, 1, 0
1426; PC64LE9-NEXT:    vperm 2, 3, 2, 4
1427; PC64LE9-NEXT:    addi 1, 1, 80
1428; PC64LE9-NEXT:    ld 0, 16(1)
1429; PC64LE9-NEXT:    mtlr 0
1430; PC64LE9-NEXT:    blr
1431entry:
1432  %pow = call <3 x float> @llvm.experimental.constrained.pow.v3f32(
1433                             <3 x float> %x,
1434                             <3 x float> %y,
1435                             metadata !"round.dynamic",
1436                             metadata !"fpexcept.strict") #1
1437  ret <3 x float> %pow
1438}
1439
1440define <3 x double> @constrained_vector_pow_v3f64(<3 x double> %x, <3 x double> %y) #0 {
1441; PC64LE-LABEL: constrained_vector_pow_v3f64:
1442; PC64LE:       # %bb.0: # %entry
1443; PC64LE-NEXT:    mflr 0
1444; PC64LE-NEXT:    std 0, 16(1)
1445; PC64LE-NEXT:    stdu 1, -96(1)
1446; PC64LE-NEXT:    stfd 28, 64(1) # 8-byte Folded Spill
1447; PC64LE-NEXT:    fmr 28, 2
1448; PC64LE-NEXT:    li 3, 48
1449; PC64LE-NEXT:    fmr 2, 4
1450; PC64LE-NEXT:    stfd 29, 72(1) # 8-byte Folded Spill
1451; PC64LE-NEXT:    stfd 30, 80(1) # 8-byte Folded Spill
1452; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
1453; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1454; PC64LE-NEXT:    fmr 31, 6
1455; PC64LE-NEXT:    fmr 30, 5
1456; PC64LE-NEXT:    fmr 29, 3
1457; PC64LE-NEXT:    bl pow
1458; PC64LE-NEXT:    nop
1459; PC64LE-NEXT:    xxlor 63, 1, 1
1460; PC64LE-NEXT:    fmr 1, 28
1461; PC64LE-NEXT:    fmr 2, 30
1462; PC64LE-NEXT:    bl pow
1463; PC64LE-NEXT:    nop
1464; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1465; PC64LE-NEXT:    xxmrghd 63, 1, 63
1466; PC64LE-NEXT:    fmr 2, 31
1467; PC64LE-NEXT:    fmr 1, 29
1468; PC64LE-NEXT:    bl pow
1469; PC64LE-NEXT:    nop
1470; PC64LE-NEXT:    xxswapd 0, 63
1471; PC64LE-NEXT:    li 3, 48
1472; PC64LE-NEXT:    xxlor 2, 63, 63
1473; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
1474; PC64LE-NEXT:    lfd 30, 80(1) # 8-byte Folded Reload
1475; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1476; PC64LE-NEXT:    lfd 29, 72(1) # 8-byte Folded Reload
1477; PC64LE-NEXT:    fmr 3, 1
1478; PC64LE-NEXT:    lfd 28, 64(1) # 8-byte Folded Reload
1479; PC64LE-NEXT:    fmr 1, 0
1480; PC64LE-NEXT:    addi 1, 1, 96
1481; PC64LE-NEXT:    ld 0, 16(1)
1482; PC64LE-NEXT:    mtlr 0
1483; PC64LE-NEXT:    blr
1484;
1485; PC64LE9-LABEL: constrained_vector_pow_v3f64:
1486; PC64LE9:       # %bb.0: # %entry
1487; PC64LE9-NEXT:    mflr 0
1488; PC64LE9-NEXT:    std 0, 16(1)
1489; PC64LE9-NEXT:    stdu 1, -80(1)
1490; PC64LE9-NEXT:    stfd 28, 48(1) # 8-byte Folded Spill
1491; PC64LE9-NEXT:    fmr 28, 2
1492; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
1493; PC64LE9-NEXT:    fmr 2, 4
1494; PC64LE9-NEXT:    stfd 29, 56(1) # 8-byte Folded Spill
1495; PC64LE9-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
1496; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
1497; PC64LE9-NEXT:    fmr 31, 6
1498; PC64LE9-NEXT:    fmr 30, 5
1499; PC64LE9-NEXT:    fmr 29, 3
1500; PC64LE9-NEXT:    bl pow
1501; PC64LE9-NEXT:    nop
1502; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
1503; PC64LE9-NEXT:    fmr 1, 28
1504; PC64LE9-NEXT:    fmr 2, 30
1505; PC64LE9-NEXT:    bl pow
1506; PC64LE9-NEXT:    nop
1507; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1508; PC64LE9-NEXT:    xxmrghd 63, 1, 63
1509; PC64LE9-NEXT:    fmr 1, 29
1510; PC64LE9-NEXT:    fmr 2, 31
1511; PC64LE9-NEXT:    bl pow
1512; PC64LE9-NEXT:    nop
1513; PC64LE9-NEXT:    fmr 3, 1
1514; PC64LE9-NEXT:    xxswapd 1, 63
1515; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
1516; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
1517; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
1518; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1519; PC64LE9-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
1520; PC64LE9-NEXT:    lfd 29, 56(1) # 8-byte Folded Reload
1521; PC64LE9-NEXT:    lfd 28, 48(1) # 8-byte Folded Reload
1522; PC64LE9-NEXT:    addi 1, 1, 80
1523; PC64LE9-NEXT:    ld 0, 16(1)
1524; PC64LE9-NEXT:    mtlr 0
1525; PC64LE9-NEXT:    blr
1526entry:
1527  %pow = call <3 x double> @llvm.experimental.constrained.pow.v3f64(
1528                          <3 x double> %x,
1529                          <3 x double> %y,
1530                          metadata !"round.dynamic",
1531                          metadata !"fpexcept.strict") #1
1532  ret <3 x double> %pow
1533}
1534
1535define <4 x double> @constrained_vector_pow_v4f64(<4 x double> %x, <4 x double> %y) #0 {
1536; PC64LE-LABEL: constrained_vector_pow_v4f64:
1537; PC64LE:       # %bb.0: # %entry
1538; PC64LE-NEXT:    mflr 0
1539; PC64LE-NEXT:    std 0, 16(1)
1540; PC64LE-NEXT:    stdu 1, -128(1)
1541; PC64LE-NEXT:    li 3, 48
1542; PC64LE-NEXT:    stxvd2x 59, 1, 3 # 16-byte Folded Spill
1543; PC64LE-NEXT:    li 3, 64
1544; PC64LE-NEXT:    stxvd2x 60, 1, 3 # 16-byte Folded Spill
1545; PC64LE-NEXT:    li 3, 80
1546; PC64LE-NEXT:    vmr 28, 2
1547; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
1548; PC64LE-NEXT:    li 3, 96
1549; PC64LE-NEXT:    vmr 29, 3
1550; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
1551; PC64LE-NEXT:    vmr 30, 4
1552; PC64LE-NEXT:    li 3, 112
1553; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1554; PC64LE-NEXT:    vmr 31, 5
1555; PC64LE-NEXT:    xxlor 1, 60, 60
1556; PC64LE-NEXT:    xxlor 2, 62, 62
1557; PC64LE-NEXT:    bl pow
1558; PC64LE-NEXT:    nop
1559; PC64LE-NEXT:    xxlor 59, 1, 1
1560; PC64LE-NEXT:    xxswapd 1, 60
1561; PC64LE-NEXT:    xxswapd 2, 62
1562; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1563; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1564; PC64LE-NEXT:    bl pow
1565; PC64LE-NEXT:    nop
1566; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1567; PC64LE-NEXT:    xxmrghd 62, 59, 1
1568; PC64LE-NEXT:    xxlor 2, 63, 63
1569; PC64LE-NEXT:    xxlor 1, 61, 61
1570; PC64LE-NEXT:    bl pow
1571; PC64LE-NEXT:    nop
1572; PC64LE-NEXT:    xxlor 60, 1, 1
1573; PC64LE-NEXT:    xxswapd 1, 61
1574; PC64LE-NEXT:    xxswapd 2, 63
1575; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1576; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1577; PC64LE-NEXT:    bl pow
1578; PC64LE-NEXT:    nop
1579; PC64LE-NEXT:    li 3, 112
1580; PC64LE-NEXT:    vmr 2, 30
1581; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1582; PC64LE-NEXT:    xxmrghd 35, 60, 1
1583; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1584; PC64LE-NEXT:    li 3, 96
1585; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
1586; PC64LE-NEXT:    li 3, 80
1587; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
1588; PC64LE-NEXT:    li 3, 64
1589; PC64LE-NEXT:    lxvd2x 60, 1, 3 # 16-byte Folded Reload
1590; PC64LE-NEXT:    li 3, 48
1591; PC64LE-NEXT:    lxvd2x 59, 1, 3 # 16-byte Folded Reload
1592; PC64LE-NEXT:    addi 1, 1, 128
1593; PC64LE-NEXT:    ld 0, 16(1)
1594; PC64LE-NEXT:    mtlr 0
1595; PC64LE-NEXT:    blr
1596;
1597; PC64LE9-LABEL: constrained_vector_pow_v4f64:
1598; PC64LE9:       # %bb.0: # %entry
1599; PC64LE9-NEXT:    mflr 0
1600; PC64LE9-NEXT:    std 0, 16(1)
1601; PC64LE9-NEXT:    stdu 1, -112(1)
1602; PC64LE9-NEXT:    stxv 60, 48(1) # 16-byte Folded Spill
1603; PC64LE9-NEXT:    stxv 62, 80(1) # 16-byte Folded Spill
1604; PC64LE9-NEXT:    vmr 30, 4
1605; PC64LE9-NEXT:    xscpsgndp 2, 62, 62
1606; PC64LE9-NEXT:    vmr 28, 2
1607; PC64LE9-NEXT:    xscpsgndp 1, 60, 60
1608; PC64LE9-NEXT:    stxv 59, 32(1) # 16-byte Folded Spill
1609; PC64LE9-NEXT:    stxv 61, 64(1) # 16-byte Folded Spill
1610; PC64LE9-NEXT:    stxv 63, 96(1) # 16-byte Folded Spill
1611; PC64LE9-NEXT:    vmr 31, 5
1612; PC64LE9-NEXT:    vmr 29, 3
1613; PC64LE9-NEXT:    bl pow
1614; PC64LE9-NEXT:    nop
1615; PC64LE9-NEXT:    xscpsgndp 59, 1, 1
1616; PC64LE9-NEXT:    xxswapd 1, 60
1617; PC64LE9-NEXT:    xxswapd 2, 62
1618; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1619; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1620; PC64LE9-NEXT:    bl pow
1621; PC64LE9-NEXT:    nop
1622; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1623; PC64LE9-NEXT:    xxmrghd 62, 59, 1
1624; PC64LE9-NEXT:    xscpsgndp 1, 61, 61
1625; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
1626; PC64LE9-NEXT:    bl pow
1627; PC64LE9-NEXT:    nop
1628; PC64LE9-NEXT:    xscpsgndp 60, 1, 1
1629; PC64LE9-NEXT:    xxswapd 1, 61
1630; PC64LE9-NEXT:    xxswapd 2, 63
1631; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1632; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
1633; PC64LE9-NEXT:    bl pow
1634; PC64LE9-NEXT:    nop
1635; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1636; PC64LE9-NEXT:    xxmrghd 35, 60, 1
1637; PC64LE9-NEXT:    vmr 2, 30
1638; PC64LE9-NEXT:    lxv 63, 96(1) # 16-byte Folded Reload
1639; PC64LE9-NEXT:    lxv 62, 80(1) # 16-byte Folded Reload
1640; PC64LE9-NEXT:    lxv 61, 64(1) # 16-byte Folded Reload
1641; PC64LE9-NEXT:    lxv 60, 48(1) # 16-byte Folded Reload
1642; PC64LE9-NEXT:    lxv 59, 32(1) # 16-byte Folded Reload
1643; PC64LE9-NEXT:    addi 1, 1, 112
1644; PC64LE9-NEXT:    ld 0, 16(1)
1645; PC64LE9-NEXT:    mtlr 0
1646; PC64LE9-NEXT:    blr
1647entry:
1648  %pow = call <4 x double> @llvm.experimental.constrained.pow.v4f64(
1649                             <4 x double> %x,
1650                             <4 x double> %y,
1651                             metadata !"round.dynamic",
1652                             metadata !"fpexcept.strict") #1
1653  ret <4 x double> %pow
1654}
1655
1656define <1 x float> @constrained_vector_powi_v1f32(<1 x float> %x, i32 %y) #0 {
1657; PC64LE-LABEL: constrained_vector_powi_v1f32:
1658; PC64LE:       # %bb.0: # %entry
1659; PC64LE-NEXT:    mflr 0
1660; PC64LE-NEXT:    std 0, 16(1)
1661; PC64LE-NEXT:    stdu 1, -32(1)
1662; PC64LE-NEXT:    clrldi 4, 4, 32
1663; PC64LE-NEXT:    bl __powisf2
1664; PC64LE-NEXT:    nop
1665; PC64LE-NEXT:    addi 1, 1, 32
1666; PC64LE-NEXT:    ld 0, 16(1)
1667; PC64LE-NEXT:    mtlr 0
1668; PC64LE-NEXT:    blr
1669;
1670; PC64LE9-LABEL: constrained_vector_powi_v1f32:
1671; PC64LE9:       # %bb.0: # %entry
1672; PC64LE9-NEXT:    mflr 0
1673; PC64LE9-NEXT:    std 0, 16(1)
1674; PC64LE9-NEXT:    stdu 1, -32(1)
1675; PC64LE9-NEXT:    clrldi 4, 4, 32
1676; PC64LE9-NEXT:    bl __powisf2
1677; PC64LE9-NEXT:    nop
1678; PC64LE9-NEXT:    addi 1, 1, 32
1679; PC64LE9-NEXT:    ld 0, 16(1)
1680; PC64LE9-NEXT:    mtlr 0
1681; PC64LE9-NEXT:    blr
1682entry:
1683  %powi = call <1 x float> @llvm.experimental.constrained.powi.v1f32(
1684                              <1 x float> %x,
1685                              i32 %y,
1686                              metadata !"round.dynamic",
1687                              metadata !"fpexcept.strict") #1
1688  ret <1 x float> %powi
1689}
1690
1691define <2 x double> @constrained_vector_powi_v2f64(<2 x double> %x, i32 %y) #0 {
1692; PC64LE-LABEL: constrained_vector_powi_v2f64:
1693; PC64LE:       # %bb.0: # %entry
1694; PC64LE-NEXT:    mflr 0
1695; PC64LE-NEXT:    std 0, 16(1)
1696; PC64LE-NEXT:    stdu 1, -96(1)
1697; PC64LE-NEXT:    li 3, 48
1698; PC64LE-NEXT:    std 30, 80(1) # 8-byte Folded Spill
1699; PC64LE-NEXT:    clrldi 30, 5, 32
1700; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
1701; PC64LE-NEXT:    li 3, 64
1702; PC64LE-NEXT:    mr 4, 30
1703; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1704; PC64LE-NEXT:    vmr 31, 2
1705; PC64LE-NEXT:    xxlor 1, 63, 63
1706; PC64LE-NEXT:    bl __powidf2
1707; PC64LE-NEXT:    nop
1708; PC64LE-NEXT:    xxlor 62, 1, 1
1709; PC64LE-NEXT:    xxswapd 1, 63
1710; PC64LE-NEXT:    mr 4, 30
1711; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1712; PC64LE-NEXT:    bl __powidf2
1713; PC64LE-NEXT:    nop
1714; PC64LE-NEXT:    li 3, 64
1715; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1716; PC64LE-NEXT:    xxmrghd 34, 62, 1
1717; PC64LE-NEXT:    ld 30, 80(1) # 8-byte Folded Reload
1718; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1719; PC64LE-NEXT:    li 3, 48
1720; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
1721; PC64LE-NEXT:    addi 1, 1, 96
1722; PC64LE-NEXT:    ld 0, 16(1)
1723; PC64LE-NEXT:    mtlr 0
1724; PC64LE-NEXT:    blr
1725;
1726; PC64LE9-LABEL: constrained_vector_powi_v2f64:
1727; PC64LE9:       # %bb.0: # %entry
1728; PC64LE9-NEXT:    mflr 0
1729; PC64LE9-NEXT:    std 0, 16(1)
1730; PC64LE9-NEXT:    stdu 1, -80(1)
1731; PC64LE9-NEXT:    std 30, 64(1) # 8-byte Folded Spill
1732; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
1733; PC64LE9-NEXT:    vmr 31, 2
1734; PC64LE9-NEXT:    clrldi 30, 5, 32
1735; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
1736; PC64LE9-NEXT:    mr 4, 30
1737; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
1738; PC64LE9-NEXT:    bl __powidf2
1739; PC64LE9-NEXT:    nop
1740; PC64LE9-NEXT:    mr 4, 30
1741; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
1742; PC64LE9-NEXT:    xxswapd 1, 63
1743; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1744; PC64LE9-NEXT:    bl __powidf2
1745; PC64LE9-NEXT:    nop
1746; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1747; PC64LE9-NEXT:    xxmrghd 34, 62, 1
1748; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
1749; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
1750; PC64LE9-NEXT:    ld 30, 64(1) # 8-byte Folded Reload
1751; PC64LE9-NEXT:    addi 1, 1, 80
1752; PC64LE9-NEXT:    ld 0, 16(1)
1753; PC64LE9-NEXT:    mtlr 0
1754; PC64LE9-NEXT:    blr
1755entry:
1756  %powi = call <2 x double> @llvm.experimental.constrained.powi.v2f64(
1757                              <2 x double> %x,
1758                              i32 %y,
1759                              metadata !"round.dynamic",
1760                              metadata !"fpexcept.strict") #1
1761  ret <2 x double> %powi
1762}
1763
1764define <3 x float> @constrained_vector_powi_v3f32(<3 x float> %x, i32 %y) #0 {
1765;
1766;
1767; PC64LE-LABEL: constrained_vector_powi_v3f32:
1768; PC64LE:       # %bb.0: # %entry
1769; PC64LE-NEXT:    mflr 0
1770; PC64LE-NEXT:    std 0, 16(1)
1771; PC64LE-NEXT:    stdu 1, -96(1)
1772; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
1773; PC64LE-NEXT:    std 30, 64(1) # 8-byte Folded Spill
1774; PC64LE-NEXT:    clrldi 30, 5, 32
1775; PC64LE-NEXT:    li 3, 48
1776; PC64LE-NEXT:    stfd 30, 80(1) # 8-byte Folded Spill
1777; PC64LE-NEXT:    mr 4, 30
1778; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
1779; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1780; PC64LE-NEXT:    vmr 31, 2
1781; PC64LE-NEXT:    xscvspdpn 1, 0
1782; PC64LE-NEXT:    bl __powisf2
1783; PC64LE-NEXT:    nop
1784; PC64LE-NEXT:    xxswapd 0, 63
1785; PC64LE-NEXT:    fmr 31, 1
1786; PC64LE-NEXT:    mr 4, 30
1787; PC64LE-NEXT:    xscvspdpn 1, 0
1788; PC64LE-NEXT:    bl __powisf2
1789; PC64LE-NEXT:    nop
1790; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
1791; PC64LE-NEXT:    fmr 30, 1
1792; PC64LE-NEXT:    mr 4, 30
1793; PC64LE-NEXT:    xscvspdpn 1, 0
1794; PC64LE-NEXT:    bl __powisf2
1795; PC64LE-NEXT:    nop
1796; PC64LE-NEXT:    xscvdpspn 0, 30
1797; PC64LE-NEXT:    addis 3, 2, .LCPI37_0@toc@ha
1798; PC64LE-NEXT:    lfd 30, 80(1) # 8-byte Folded Reload
1799; PC64LE-NEXT:    ld 30, 64(1) # 8-byte Folded Reload
1800; PC64LE-NEXT:    xscvdpspn 1, 1
1801; PC64LE-NEXT:    addi 3, 3, .LCPI37_0@toc@l
1802; PC64LE-NEXT:    xscvdpspn 34, 31
1803; PC64LE-NEXT:    lvx 4, 0, 3
1804; PC64LE-NEXT:    li 3, 48
1805; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
1806; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1807; PC64LE-NEXT:    xxmrghw 35, 0, 1
1808; PC64LE-NEXT:    vperm 2, 2, 3, 4
1809; PC64LE-NEXT:    addi 1, 1, 96
1810; PC64LE-NEXT:    ld 0, 16(1)
1811; PC64LE-NEXT:    mtlr 0
1812; PC64LE-NEXT:    blr
1813;
1814; PC64LE9-LABEL: constrained_vector_powi_v3f32:
1815; PC64LE9:       # %bb.0: # %entry
1816; PC64LE9-NEXT:    mflr 0
1817; PC64LE9-NEXT:    std 0, 16(1)
1818; PC64LE9-NEXT:    stdu 1, -80(1)
1819; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
1820; PC64LE9-NEXT:    std 30, 48(1) # 8-byte Folded Spill
1821; PC64LE9-NEXT:    clrldi 30, 5, 32
1822; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
1823; PC64LE9-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
1824; PC64LE9-NEXT:    vmr 31, 2
1825; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
1826; PC64LE9-NEXT:    mr 4, 30
1827; PC64LE9-NEXT:    xscvspdpn 1, 0
1828; PC64LE9-NEXT:    bl __powisf2
1829; PC64LE9-NEXT:    nop
1830; PC64LE9-NEXT:    xxswapd 0, 63
1831; PC64LE9-NEXT:    fmr 31, 1
1832; PC64LE9-NEXT:    mr 4, 30
1833; PC64LE9-NEXT:    xscvspdpn 1, 0
1834; PC64LE9-NEXT:    bl __powisf2
1835; PC64LE9-NEXT:    nop
1836; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
1837; PC64LE9-NEXT:    fmr 30, 1
1838; PC64LE9-NEXT:    mr 4, 30
1839; PC64LE9-NEXT:    xscvspdpn 1, 0
1840; PC64LE9-NEXT:    bl __powisf2
1841; PC64LE9-NEXT:    nop
1842; PC64LE9-NEXT:    xscvdpspn 0, 1
1843; PC64LE9-NEXT:    xscvdpspn 1, 30
1844; PC64LE9-NEXT:    addis 3, 2, .LCPI37_0@toc@ha
1845; PC64LE9-NEXT:    xscvdpspn 35, 31
1846; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
1847; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
1848; PC64LE9-NEXT:    ld 30, 48(1) # 8-byte Folded Reload
1849; PC64LE9-NEXT:    addi 3, 3, .LCPI37_0@toc@l
1850; PC64LE9-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
1851; PC64LE9-NEXT:    lxv 36, 0(3)
1852; PC64LE9-NEXT:    xxmrghw 34, 1, 0
1853; PC64LE9-NEXT:    vperm 2, 3, 2, 4
1854; PC64LE9-NEXT:    addi 1, 1, 80
1855; PC64LE9-NEXT:    ld 0, 16(1)
1856; PC64LE9-NEXT:    mtlr 0
1857; PC64LE9-NEXT:    blr
1858entry:
1859  %powi = call <3 x float> @llvm.experimental.constrained.powi.v3f32(
1860                              <3 x float> %x,
1861                              i32 %y,
1862                              metadata !"round.dynamic",
1863                              metadata !"fpexcept.strict") #1
1864  ret <3 x float> %powi
1865}
1866
1867define <3 x double> @constrained_vector_powi_v3f64(<3 x double> %x, i32 %y) #0 {
1868; PC64LE-LABEL: constrained_vector_powi_v3f64:
1869; PC64LE:       # %bb.0: # %entry
1870; PC64LE-NEXT:    mflr 0
1871; PC64LE-NEXT:    std 0, 16(1)
1872; PC64LE-NEXT:    stdu 1, -96(1)
1873; PC64LE-NEXT:    std 30, 64(1) # 8-byte Folded Spill
1874; PC64LE-NEXT:    clrldi 30, 6, 32
1875; PC64LE-NEXT:    li 3, 48
1876; PC64LE-NEXT:    stfd 30, 80(1) # 8-byte Folded Spill
1877; PC64LE-NEXT:    fmr 30, 2
1878; PC64LE-NEXT:    mr 4, 30
1879; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
1880; PC64LE-NEXT:    fmr 31, 3
1881; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1882; PC64LE-NEXT:    bl __powidf2
1883; PC64LE-NEXT:    nop
1884; PC64LE-NEXT:    xxlor 63, 1, 1
1885; PC64LE-NEXT:    fmr 1, 30
1886; PC64LE-NEXT:    mr 4, 30
1887; PC64LE-NEXT:    bl __powidf2
1888; PC64LE-NEXT:    nop
1889; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1890; PC64LE-NEXT:    xxmrghd 63, 1, 63
1891; PC64LE-NEXT:    mr 4, 30
1892; PC64LE-NEXT:    fmr 1, 31
1893; PC64LE-NEXT:    bl __powidf2
1894; PC64LE-NEXT:    nop
1895; PC64LE-NEXT:    xxswapd 0, 63
1896; PC64LE-NEXT:    li 3, 48
1897; PC64LE-NEXT:    xxlor 2, 63, 63
1898; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
1899; PC64LE-NEXT:    lfd 30, 80(1) # 8-byte Folded Reload
1900; PC64LE-NEXT:    ld 30, 64(1) # 8-byte Folded Reload
1901; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
1902; PC64LE-NEXT:    fmr 3, 1
1903; PC64LE-NEXT:    fmr 1, 0
1904; PC64LE-NEXT:    addi 1, 1, 96
1905; PC64LE-NEXT:    ld 0, 16(1)
1906; PC64LE-NEXT:    mtlr 0
1907; PC64LE-NEXT:    blr
1908;
1909; PC64LE9-LABEL: constrained_vector_powi_v3f64:
1910; PC64LE9:       # %bb.0: # %entry
1911; PC64LE9-NEXT:    mflr 0
1912; PC64LE9-NEXT:    std 0, 16(1)
1913; PC64LE9-NEXT:    stdu 1, -80(1)
1914; PC64LE9-NEXT:    std 30, 48(1) # 8-byte Folded Spill
1915; PC64LE9-NEXT:    clrldi 30, 6, 32
1916; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
1917; PC64LE9-NEXT:    mr 4, 30
1918; PC64LE9-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
1919; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
1920; PC64LE9-NEXT:    fmr 31, 3
1921; PC64LE9-NEXT:    fmr 30, 2
1922; PC64LE9-NEXT:    bl __powidf2
1923; PC64LE9-NEXT:    nop
1924; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
1925; PC64LE9-NEXT:    fmr 1, 30
1926; PC64LE9-NEXT:    mr 4, 30
1927; PC64LE9-NEXT:    bl __powidf2
1928; PC64LE9-NEXT:    nop
1929; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1930; PC64LE9-NEXT:    xxmrghd 63, 1, 63
1931; PC64LE9-NEXT:    fmr 1, 31
1932; PC64LE9-NEXT:    mr 4, 30
1933; PC64LE9-NEXT:    bl __powidf2
1934; PC64LE9-NEXT:    nop
1935; PC64LE9-NEXT:    fmr 3, 1
1936; PC64LE9-NEXT:    xxswapd 1, 63
1937; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
1938; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
1939; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
1940; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1941; PC64LE9-NEXT:    ld 30, 48(1) # 8-byte Folded Reload
1942; PC64LE9-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
1943; PC64LE9-NEXT:    addi 1, 1, 80
1944; PC64LE9-NEXT:    ld 0, 16(1)
1945; PC64LE9-NEXT:    mtlr 0
1946; PC64LE9-NEXT:    blr
1947entry:
1948  %powi = call <3 x double> @llvm.experimental.constrained.powi.v3f64(
1949                          <3 x double> %x,
1950                          i32 %y,
1951                          metadata !"round.dynamic",
1952                          metadata !"fpexcept.strict") #1
1953  ret <3 x double> %powi
1954}
1955
1956define <4 x double> @constrained_vector_powi_v4f64(<4 x double> %x, i32 %y) #0 {
1957; PC64LE-LABEL: constrained_vector_powi_v4f64:
1958; PC64LE:       # %bb.0: # %entry
1959; PC64LE-NEXT:    mflr 0
1960; PC64LE-NEXT:    std 0, 16(1)
1961; PC64LE-NEXT:    stdu 1, -112(1)
1962; PC64LE-NEXT:    li 3, 48
1963; PC64LE-NEXT:    std 30, 96(1) # 8-byte Folded Spill
1964; PC64LE-NEXT:    clrldi 30, 7, 32
1965; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
1966; PC64LE-NEXT:    li 3, 64
1967; PC64LE-NEXT:    mr 4, 30
1968; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
1969; PC64LE-NEXT:    vmr 30, 2
1970; PC64LE-NEXT:    li 3, 80
1971; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
1972; PC64LE-NEXT:    vmr 31, 3
1973; PC64LE-NEXT:    xxlor 1, 62, 62
1974; PC64LE-NEXT:    bl __powidf2
1975; PC64LE-NEXT:    nop
1976; PC64LE-NEXT:    xxlor 61, 1, 1
1977; PC64LE-NEXT:    xxswapd 1, 62
1978; PC64LE-NEXT:    mr 4, 30
1979; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1980; PC64LE-NEXT:    bl __powidf2
1981; PC64LE-NEXT:    nop
1982; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1983; PC64LE-NEXT:    xxmrghd 62, 61, 1
1984; PC64LE-NEXT:    mr 4, 30
1985; PC64LE-NEXT:    xxlor 1, 63, 63
1986; PC64LE-NEXT:    bl __powidf2
1987; PC64LE-NEXT:    nop
1988; PC64LE-NEXT:    xxlor 61, 1, 1
1989; PC64LE-NEXT:    xxswapd 1, 63
1990; PC64LE-NEXT:    mr 4, 30
1991; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1992; PC64LE-NEXT:    bl __powidf2
1993; PC64LE-NEXT:    nop
1994; PC64LE-NEXT:    li 3, 80
1995; PC64LE-NEXT:    vmr 2, 30
1996; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1997; PC64LE-NEXT:    xxmrghd 35, 61, 1
1998; PC64LE-NEXT:    ld 30, 96(1) # 8-byte Folded Reload
1999; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2000; PC64LE-NEXT:    li 3, 64
2001; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
2002; PC64LE-NEXT:    li 3, 48
2003; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
2004; PC64LE-NEXT:    addi 1, 1, 112
2005; PC64LE-NEXT:    ld 0, 16(1)
2006; PC64LE-NEXT:    mtlr 0
2007; PC64LE-NEXT:    blr
2008;
2009; PC64LE9-LABEL: constrained_vector_powi_v4f64:
2010; PC64LE9:       # %bb.0: # %entry
2011; PC64LE9-NEXT:    mflr 0
2012; PC64LE9-NEXT:    std 0, 16(1)
2013; PC64LE9-NEXT:    stdu 1, -96(1)
2014; PC64LE9-NEXT:    std 30, 80(1) # 8-byte Folded Spill
2015; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
2016; PC64LE9-NEXT:    vmr 30, 2
2017; PC64LE9-NEXT:    clrldi 30, 7, 32
2018; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
2019; PC64LE9-NEXT:    mr 4, 30
2020; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
2021; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
2022; PC64LE9-NEXT:    vmr 31, 3
2023; PC64LE9-NEXT:    bl __powidf2
2024; PC64LE9-NEXT:    nop
2025; PC64LE9-NEXT:    mr 4, 30
2026; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
2027; PC64LE9-NEXT:    xxswapd 1, 62
2028; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2029; PC64LE9-NEXT:    bl __powidf2
2030; PC64LE9-NEXT:    nop
2031; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2032; PC64LE9-NEXT:    xxmrghd 62, 61, 1
2033; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
2034; PC64LE9-NEXT:    mr 4, 30
2035; PC64LE9-NEXT:    bl __powidf2
2036; PC64LE9-NEXT:    nop
2037; PC64LE9-NEXT:    mr 4, 30
2038; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
2039; PC64LE9-NEXT:    xxswapd 1, 63
2040; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2041; PC64LE9-NEXT:    bl __powidf2
2042; PC64LE9-NEXT:    nop
2043; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2044; PC64LE9-NEXT:    xxmrghd 35, 61, 1
2045; PC64LE9-NEXT:    vmr 2, 30
2046; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
2047; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
2048; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
2049; PC64LE9-NEXT:    ld 30, 80(1) # 8-byte Folded Reload
2050; PC64LE9-NEXT:    addi 1, 1, 96
2051; PC64LE9-NEXT:    ld 0, 16(1)
2052; PC64LE9-NEXT:    mtlr 0
2053; PC64LE9-NEXT:    blr
2054entry:
2055  %powi = call <4 x double> @llvm.experimental.constrained.powi.v4f64(
2056                              <4 x double> %x,
2057                              i32 %y,
2058                              metadata !"round.dynamic",
2059                              metadata !"fpexcept.strict") #1
2060  ret <4 x double> %powi
2061}
2062
2063define <1 x float> @constrained_vector_sin_v1f32(<1 x float> %x) #0 {
2064; PC64LE-LABEL: constrained_vector_sin_v1f32:
2065; PC64LE:       # %bb.0: # %entry
2066; PC64LE-NEXT:    mflr 0
2067; PC64LE-NEXT:    std 0, 16(1)
2068; PC64LE-NEXT:    stdu 1, -32(1)
2069; PC64LE-NEXT:    bl sinf
2070; PC64LE-NEXT:    nop
2071; PC64LE-NEXT:    addi 1, 1, 32
2072; PC64LE-NEXT:    ld 0, 16(1)
2073; PC64LE-NEXT:    mtlr 0
2074; PC64LE-NEXT:    blr
2075;
2076; PC64LE9-LABEL: constrained_vector_sin_v1f32:
2077; PC64LE9:       # %bb.0: # %entry
2078; PC64LE9-NEXT:    mflr 0
2079; PC64LE9-NEXT:    std 0, 16(1)
2080; PC64LE9-NEXT:    stdu 1, -32(1)
2081; PC64LE9-NEXT:    bl sinf
2082; PC64LE9-NEXT:    nop
2083; PC64LE9-NEXT:    addi 1, 1, 32
2084; PC64LE9-NEXT:    ld 0, 16(1)
2085; PC64LE9-NEXT:    mtlr 0
2086; PC64LE9-NEXT:    blr
2087entry:
2088  %sin = call <1 x float> @llvm.experimental.constrained.sin.v1f32(
2089                             <1 x float> %x,
2090                             metadata !"round.dynamic",
2091                             metadata !"fpexcept.strict") #1
2092  ret <1 x float> %sin
2093}
2094
2095define <2 x double> @constrained_vector_sin_v2f64(<2 x double> %x) #0 {
2096; PC64LE-LABEL: constrained_vector_sin_v2f64:
2097; PC64LE:       # %bb.0: # %entry
2098; PC64LE-NEXT:    mflr 0
2099; PC64LE-NEXT:    std 0, 16(1)
2100; PC64LE-NEXT:    stdu 1, -80(1)
2101; PC64LE-NEXT:    li 3, 48
2102; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
2103; PC64LE-NEXT:    li 3, 64
2104; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2105; PC64LE-NEXT:    vmr 31, 2
2106; PC64LE-NEXT:    xxlor 1, 63, 63
2107; PC64LE-NEXT:    bl sin
2108; PC64LE-NEXT:    nop
2109; PC64LE-NEXT:    xxlor 62, 1, 1
2110; PC64LE-NEXT:    xxswapd 1, 63
2111; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2112; PC64LE-NEXT:    bl sin
2113; PC64LE-NEXT:    nop
2114; PC64LE-NEXT:    li 3, 64
2115; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2116; PC64LE-NEXT:    xxmrghd 34, 62, 1
2117; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2118; PC64LE-NEXT:    li 3, 48
2119; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
2120; PC64LE-NEXT:    addi 1, 1, 80
2121; PC64LE-NEXT:    ld 0, 16(1)
2122; PC64LE-NEXT:    mtlr 0
2123; PC64LE-NEXT:    blr
2124;
2125; PC64LE9-LABEL: constrained_vector_sin_v2f64:
2126; PC64LE9:       # %bb.0: # %entry
2127; PC64LE9-NEXT:    mflr 0
2128; PC64LE9-NEXT:    std 0, 16(1)
2129; PC64LE9-NEXT:    stdu 1, -64(1)
2130; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2131; PC64LE9-NEXT:    vmr 31, 2
2132; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
2133; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
2134; PC64LE9-NEXT:    bl sin
2135; PC64LE9-NEXT:    nop
2136; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
2137; PC64LE9-NEXT:    xxswapd 1, 63
2138; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2139; PC64LE9-NEXT:    bl sin
2140; PC64LE9-NEXT:    nop
2141; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2142; PC64LE9-NEXT:    xxmrghd 34, 62, 1
2143; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2144; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
2145; PC64LE9-NEXT:    addi 1, 1, 64
2146; PC64LE9-NEXT:    ld 0, 16(1)
2147; PC64LE9-NEXT:    mtlr 0
2148; PC64LE9-NEXT:    blr
2149entry:
2150  %sin = call <2 x double> @llvm.experimental.constrained.sin.v2f64(
2151                             <2 x double> %x,
2152                             metadata !"round.dynamic",
2153                             metadata !"fpexcept.strict") #1
2154  ret <2 x double> %sin
2155}
2156
2157define <3 x float> @constrained_vector_sin_v3f32(<3 x float> %x) #0 {
2158; PC64LE-LABEL: constrained_vector_sin_v3f32:
2159; PC64LE:       # %bb.0: # %entry
2160; PC64LE-NEXT:    mflr 0
2161; PC64LE-NEXT:    std 0, 16(1)
2162; PC64LE-NEXT:    stdu 1, -80(1)
2163; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
2164; PC64LE-NEXT:    li 3, 48
2165; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
2166; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
2167; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2168; PC64LE-NEXT:    vmr 31, 2
2169; PC64LE-NEXT:    xscvspdpn 1, 0
2170; PC64LE-NEXT:    bl sinf
2171; PC64LE-NEXT:    nop
2172; PC64LE-NEXT:    xxswapd 0, 63
2173; PC64LE-NEXT:    fmr 31, 1
2174; PC64LE-NEXT:    xscvspdpn 1, 0
2175; PC64LE-NEXT:    bl sinf
2176; PC64LE-NEXT:    nop
2177; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
2178; PC64LE-NEXT:    fmr 30, 1
2179; PC64LE-NEXT:    xscvspdpn 1, 0
2180; PC64LE-NEXT:    bl sinf
2181; PC64LE-NEXT:    nop
2182; PC64LE-NEXT:    xscvdpspn 0, 30
2183; PC64LE-NEXT:    addis 3, 2, .LCPI42_0@toc@ha
2184; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
2185; PC64LE-NEXT:    xscvdpspn 1, 1
2186; PC64LE-NEXT:    addi 3, 3, .LCPI42_0@toc@l
2187; PC64LE-NEXT:    xscvdpspn 34, 31
2188; PC64LE-NEXT:    lvx 4, 0, 3
2189; PC64LE-NEXT:    li 3, 48
2190; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
2191; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2192; PC64LE-NEXT:    xxmrghw 35, 0, 1
2193; PC64LE-NEXT:    vperm 2, 2, 3, 4
2194; PC64LE-NEXT:    addi 1, 1, 80
2195; PC64LE-NEXT:    ld 0, 16(1)
2196; PC64LE-NEXT:    mtlr 0
2197; PC64LE-NEXT:    blr
2198;
2199; PC64LE9-LABEL: constrained_vector_sin_v3f32:
2200; PC64LE9:       # %bb.0: # %entry
2201; PC64LE9-NEXT:    mflr 0
2202; PC64LE9-NEXT:    std 0, 16(1)
2203; PC64LE9-NEXT:    stdu 1, -64(1)
2204; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
2205; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
2206; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
2207; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
2208; PC64LE9-NEXT:    xscvspdpn 1, 0
2209; PC64LE9-NEXT:    vmr 31, 2
2210; PC64LE9-NEXT:    bl sinf
2211; PC64LE9-NEXT:    nop
2212; PC64LE9-NEXT:    xxswapd 0, 63
2213; PC64LE9-NEXT:    fmr 31, 1
2214; PC64LE9-NEXT:    xscvspdpn 1, 0
2215; PC64LE9-NEXT:    bl sinf
2216; PC64LE9-NEXT:    nop
2217; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
2218; PC64LE9-NEXT:    fmr 30, 1
2219; PC64LE9-NEXT:    xscvspdpn 1, 0
2220; PC64LE9-NEXT:    bl sinf
2221; PC64LE9-NEXT:    nop
2222; PC64LE9-NEXT:    xscvdpspn 0, 1
2223; PC64LE9-NEXT:    xscvdpspn 1, 30
2224; PC64LE9-NEXT:    addis 3, 2, .LCPI42_0@toc@ha
2225; PC64LE9-NEXT:    xscvdpspn 36, 31
2226; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
2227; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
2228; PC64LE9-NEXT:    addi 3, 3, .LCPI42_0@toc@l
2229; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
2230; PC64LE9-NEXT:    lxv 35, 0(3)
2231; PC64LE9-NEXT:    xxmrghw 34, 1, 0
2232; PC64LE9-NEXT:    vperm 2, 4, 2, 3
2233; PC64LE9-NEXT:    addi 1, 1, 64
2234; PC64LE9-NEXT:    ld 0, 16(1)
2235; PC64LE9-NEXT:    mtlr 0
2236; PC64LE9-NEXT:    blr
2237entry:
2238  %sin = call <3 x float> @llvm.experimental.constrained.sin.v3f32(
2239                              <3 x float> %x,
2240                              metadata !"round.dynamic",
2241                              metadata !"fpexcept.strict") #1
2242  ret <3 x float> %sin
2243}
2244
2245define <3 x double> @constrained_vector_sin_v3f64(<3 x double> %x) #0 {
2246; PC64LE-LABEL: constrained_vector_sin_v3f64:
2247; PC64LE:       # %bb.0: # %entry
2248; PC64LE-NEXT:    mflr 0
2249; PC64LE-NEXT:    std 0, 16(1)
2250; PC64LE-NEXT:    stdu 1, -80(1)
2251; PC64LE-NEXT:    li 3, 48
2252; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
2253; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
2254; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2255; PC64LE-NEXT:    fmr 31, 3
2256; PC64LE-NEXT:    fmr 30, 2
2257; PC64LE-NEXT:    bl sin
2258; PC64LE-NEXT:    nop
2259; PC64LE-NEXT:    xxlor 63, 1, 1
2260; PC64LE-NEXT:    fmr 1, 30
2261; PC64LE-NEXT:    bl sin
2262; PC64LE-NEXT:    nop
2263; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2264; PC64LE-NEXT:    xxmrghd 63, 1, 63
2265; PC64LE-NEXT:    fmr 1, 31
2266; PC64LE-NEXT:    bl sin
2267; PC64LE-NEXT:    nop
2268; PC64LE-NEXT:    xxswapd 0, 63
2269; PC64LE-NEXT:    li 3, 48
2270; PC64LE-NEXT:    xxlor 2, 63, 63
2271; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
2272; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
2273; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2274; PC64LE-NEXT:    fmr 3, 1
2275; PC64LE-NEXT:    fmr 1, 0
2276; PC64LE-NEXT:    addi 1, 1, 80
2277; PC64LE-NEXT:    ld 0, 16(1)
2278; PC64LE-NEXT:    mtlr 0
2279; PC64LE-NEXT:    blr
2280;
2281; PC64LE9-LABEL: constrained_vector_sin_v3f64:
2282; PC64LE9:       # %bb.0: # %entry
2283; PC64LE9-NEXT:    mflr 0
2284; PC64LE9-NEXT:    std 0, 16(1)
2285; PC64LE9-NEXT:    stdu 1, -64(1)
2286; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
2287; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
2288; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
2289; PC64LE9-NEXT:    fmr 31, 3
2290; PC64LE9-NEXT:    fmr 30, 2
2291; PC64LE9-NEXT:    bl sin
2292; PC64LE9-NEXT:    nop
2293; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
2294; PC64LE9-NEXT:    fmr 1, 30
2295; PC64LE9-NEXT:    bl sin
2296; PC64LE9-NEXT:    nop
2297; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2298; PC64LE9-NEXT:    xxmrghd 63, 1, 63
2299; PC64LE9-NEXT:    fmr 1, 31
2300; PC64LE9-NEXT:    bl sin
2301; PC64LE9-NEXT:    nop
2302; PC64LE9-NEXT:    fmr 3, 1
2303; PC64LE9-NEXT:    xxswapd 1, 63
2304; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
2305; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
2306; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
2307; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2308; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
2309; PC64LE9-NEXT:    addi 1, 1, 64
2310; PC64LE9-NEXT:    ld 0, 16(1)
2311; PC64LE9-NEXT:    mtlr 0
2312; PC64LE9-NEXT:    blr
2313entry:
2314  %sin = call <3 x double> @llvm.experimental.constrained.sin.v3f64(
2315                          <3 x double> %x,
2316                          metadata !"round.dynamic",
2317                          metadata !"fpexcept.strict") #1
2318  ret <3 x double> %sin
2319}
2320
2321define <4 x double> @constrained_vector_sin_v4f64(<4 x double> %x) #0 {
2322; PC64LE-LABEL: constrained_vector_sin_v4f64:
2323; PC64LE:       # %bb.0: # %entry
2324; PC64LE-NEXT:    mflr 0
2325; PC64LE-NEXT:    std 0, 16(1)
2326; PC64LE-NEXT:    stdu 1, -96(1)
2327; PC64LE-NEXT:    li 3, 48
2328; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
2329; PC64LE-NEXT:    li 3, 64
2330; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
2331; PC64LE-NEXT:    vmr 30, 2
2332; PC64LE-NEXT:    li 3, 80
2333; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2334; PC64LE-NEXT:    vmr 31, 3
2335; PC64LE-NEXT:    xxlor 1, 62, 62
2336; PC64LE-NEXT:    bl sin
2337; PC64LE-NEXT:    nop
2338; PC64LE-NEXT:    xxlor 61, 1, 1
2339; PC64LE-NEXT:    xxswapd 1, 62
2340; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2341; PC64LE-NEXT:    bl sin
2342; PC64LE-NEXT:    nop
2343; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2344; PC64LE-NEXT:    xxmrghd 62, 61, 1
2345; PC64LE-NEXT:    xxlor 1, 63, 63
2346; PC64LE-NEXT:    bl sin
2347; PC64LE-NEXT:    nop
2348; PC64LE-NEXT:    xxlor 61, 1, 1
2349; PC64LE-NEXT:    xxswapd 1, 63
2350; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2351; PC64LE-NEXT:    bl sin
2352; PC64LE-NEXT:    nop
2353; PC64LE-NEXT:    li 3, 80
2354; PC64LE-NEXT:    vmr 2, 30
2355; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2356; PC64LE-NEXT:    xxmrghd 35, 61, 1
2357; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2358; PC64LE-NEXT:    li 3, 64
2359; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
2360; PC64LE-NEXT:    li 3, 48
2361; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
2362; PC64LE-NEXT:    addi 1, 1, 96
2363; PC64LE-NEXT:    ld 0, 16(1)
2364; PC64LE-NEXT:    mtlr 0
2365; PC64LE-NEXT:    blr
2366;
2367; PC64LE9-LABEL: constrained_vector_sin_v4f64:
2368; PC64LE9:       # %bb.0: # %entry
2369; PC64LE9-NEXT:    mflr 0
2370; PC64LE9-NEXT:    std 0, 16(1)
2371; PC64LE9-NEXT:    stdu 1, -80(1)
2372; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
2373; PC64LE9-NEXT:    vmr 30, 2
2374; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
2375; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
2376; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
2377; PC64LE9-NEXT:    vmr 31, 3
2378; PC64LE9-NEXT:    bl sin
2379; PC64LE9-NEXT:    nop
2380; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
2381; PC64LE9-NEXT:    xxswapd 1, 62
2382; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2383; PC64LE9-NEXT:    bl sin
2384; PC64LE9-NEXT:    nop
2385; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2386; PC64LE9-NEXT:    xxmrghd 62, 61, 1
2387; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
2388; PC64LE9-NEXT:    bl sin
2389; PC64LE9-NEXT:    nop
2390; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
2391; PC64LE9-NEXT:    xxswapd 1, 63
2392; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2393; PC64LE9-NEXT:    bl sin
2394; PC64LE9-NEXT:    nop
2395; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2396; PC64LE9-NEXT:    xxmrghd 35, 61, 1
2397; PC64LE9-NEXT:    vmr 2, 30
2398; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
2399; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
2400; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
2401; PC64LE9-NEXT:    addi 1, 1, 80
2402; PC64LE9-NEXT:    ld 0, 16(1)
2403; PC64LE9-NEXT:    mtlr 0
2404; PC64LE9-NEXT:    blr
2405entry:
2406  %sin = call <4 x double> @llvm.experimental.constrained.sin.v4f64(
2407                             <4 x double> %x,
2408                             metadata !"round.dynamic",
2409                             metadata !"fpexcept.strict") #1
2410  ret <4 x double> %sin
2411}
2412
2413define <1 x float> @constrained_vector_cos_v1f32(<1 x float> %x) #0 {
2414; PC64LE-LABEL: constrained_vector_cos_v1f32:
2415; PC64LE:       # %bb.0: # %entry
2416; PC64LE-NEXT:    mflr 0
2417; PC64LE-NEXT:    std 0, 16(1)
2418; PC64LE-NEXT:    stdu 1, -32(1)
2419; PC64LE-NEXT:    bl cosf
2420; PC64LE-NEXT:    nop
2421; PC64LE-NEXT:    addi 1, 1, 32
2422; PC64LE-NEXT:    ld 0, 16(1)
2423; PC64LE-NEXT:    mtlr 0
2424; PC64LE-NEXT:    blr
2425;
2426; PC64LE9-LABEL: constrained_vector_cos_v1f32:
2427; PC64LE9:       # %bb.0: # %entry
2428; PC64LE9-NEXT:    mflr 0
2429; PC64LE9-NEXT:    std 0, 16(1)
2430; PC64LE9-NEXT:    stdu 1, -32(1)
2431; PC64LE9-NEXT:    bl cosf
2432; PC64LE9-NEXT:    nop
2433; PC64LE9-NEXT:    addi 1, 1, 32
2434; PC64LE9-NEXT:    ld 0, 16(1)
2435; PC64LE9-NEXT:    mtlr 0
2436; PC64LE9-NEXT:    blr
2437entry:
2438  %cos = call <1 x float> @llvm.experimental.constrained.cos.v1f32(
2439                             <1 x float> %x,
2440                             metadata !"round.dynamic",
2441                             metadata !"fpexcept.strict") #1
2442  ret <1 x float> %cos
2443}
2444
2445define <2 x double> @constrained_vector_cos_v2f64(<2 x double> %x) #0 {
2446; PC64LE-LABEL: constrained_vector_cos_v2f64:
2447; PC64LE:       # %bb.0: # %entry
2448; PC64LE-NEXT:    mflr 0
2449; PC64LE-NEXT:    std 0, 16(1)
2450; PC64LE-NEXT:    stdu 1, -80(1)
2451; PC64LE-NEXT:    li 3, 48
2452; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
2453; PC64LE-NEXT:    li 3, 64
2454; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2455; PC64LE-NEXT:    vmr 31, 2
2456; PC64LE-NEXT:    xxlor 1, 63, 63
2457; PC64LE-NEXT:    bl cos
2458; PC64LE-NEXT:    nop
2459; PC64LE-NEXT:    xxlor 62, 1, 1
2460; PC64LE-NEXT:    xxswapd 1, 63
2461; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2462; PC64LE-NEXT:    bl cos
2463; PC64LE-NEXT:    nop
2464; PC64LE-NEXT:    li 3, 64
2465; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2466; PC64LE-NEXT:    xxmrghd 34, 62, 1
2467; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2468; PC64LE-NEXT:    li 3, 48
2469; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
2470; PC64LE-NEXT:    addi 1, 1, 80
2471; PC64LE-NEXT:    ld 0, 16(1)
2472; PC64LE-NEXT:    mtlr 0
2473; PC64LE-NEXT:    blr
2474;
2475; PC64LE9-LABEL: constrained_vector_cos_v2f64:
2476; PC64LE9:       # %bb.0: # %entry
2477; PC64LE9-NEXT:    mflr 0
2478; PC64LE9-NEXT:    std 0, 16(1)
2479; PC64LE9-NEXT:    stdu 1, -64(1)
2480; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2481; PC64LE9-NEXT:    vmr 31, 2
2482; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
2483; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
2484; PC64LE9-NEXT:    bl cos
2485; PC64LE9-NEXT:    nop
2486; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
2487; PC64LE9-NEXT:    xxswapd 1, 63
2488; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2489; PC64LE9-NEXT:    bl cos
2490; PC64LE9-NEXT:    nop
2491; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2492; PC64LE9-NEXT:    xxmrghd 34, 62, 1
2493; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2494; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
2495; PC64LE9-NEXT:    addi 1, 1, 64
2496; PC64LE9-NEXT:    ld 0, 16(1)
2497; PC64LE9-NEXT:    mtlr 0
2498; PC64LE9-NEXT:    blr
2499entry:
2500  %cos = call <2 x double> @llvm.experimental.constrained.cos.v2f64(
2501                             <2 x double> %x,
2502                             metadata !"round.dynamic",
2503                             metadata !"fpexcept.strict") #1
2504  ret <2 x double> %cos
2505}
2506
2507define <3 x float> @constrained_vector_cos_v3f32(<3 x float> %x) #0 {
2508; PC64LE-LABEL: constrained_vector_cos_v3f32:
2509; PC64LE:       # %bb.0: # %entry
2510; PC64LE-NEXT:    mflr 0
2511; PC64LE-NEXT:    std 0, 16(1)
2512; PC64LE-NEXT:    stdu 1, -80(1)
2513; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
2514; PC64LE-NEXT:    li 3, 48
2515; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
2516; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
2517; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2518; PC64LE-NEXT:    vmr 31, 2
2519; PC64LE-NEXT:    xscvspdpn 1, 0
2520; PC64LE-NEXT:    bl cosf
2521; PC64LE-NEXT:    nop
2522; PC64LE-NEXT:    xxswapd 0, 63
2523; PC64LE-NEXT:    fmr 31, 1
2524; PC64LE-NEXT:    xscvspdpn 1, 0
2525; PC64LE-NEXT:    bl cosf
2526; PC64LE-NEXT:    nop
2527; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
2528; PC64LE-NEXT:    fmr 30, 1
2529; PC64LE-NEXT:    xscvspdpn 1, 0
2530; PC64LE-NEXT:    bl cosf
2531; PC64LE-NEXT:    nop
2532; PC64LE-NEXT:    xscvdpspn 0, 30
2533; PC64LE-NEXT:    addis 3, 2, .LCPI47_0@toc@ha
2534; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
2535; PC64LE-NEXT:    xscvdpspn 1, 1
2536; PC64LE-NEXT:    addi 3, 3, .LCPI47_0@toc@l
2537; PC64LE-NEXT:    xscvdpspn 34, 31
2538; PC64LE-NEXT:    lvx 4, 0, 3
2539; PC64LE-NEXT:    li 3, 48
2540; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
2541; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2542; PC64LE-NEXT:    xxmrghw 35, 0, 1
2543; PC64LE-NEXT:    vperm 2, 2, 3, 4
2544; PC64LE-NEXT:    addi 1, 1, 80
2545; PC64LE-NEXT:    ld 0, 16(1)
2546; PC64LE-NEXT:    mtlr 0
2547; PC64LE-NEXT:    blr
2548;
2549; PC64LE9-LABEL: constrained_vector_cos_v3f32:
2550; PC64LE9:       # %bb.0: # %entry
2551; PC64LE9-NEXT:    mflr 0
2552; PC64LE9-NEXT:    std 0, 16(1)
2553; PC64LE9-NEXT:    stdu 1, -64(1)
2554; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
2555; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
2556; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
2557; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
2558; PC64LE9-NEXT:    xscvspdpn 1, 0
2559; PC64LE9-NEXT:    vmr 31, 2
2560; PC64LE9-NEXT:    bl cosf
2561; PC64LE9-NEXT:    nop
2562; PC64LE9-NEXT:    xxswapd 0, 63
2563; PC64LE9-NEXT:    fmr 31, 1
2564; PC64LE9-NEXT:    xscvspdpn 1, 0
2565; PC64LE9-NEXT:    bl cosf
2566; PC64LE9-NEXT:    nop
2567; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
2568; PC64LE9-NEXT:    fmr 30, 1
2569; PC64LE9-NEXT:    xscvspdpn 1, 0
2570; PC64LE9-NEXT:    bl cosf
2571; PC64LE9-NEXT:    nop
2572; PC64LE9-NEXT:    xscvdpspn 0, 1
2573; PC64LE9-NEXT:    xscvdpspn 1, 30
2574; PC64LE9-NEXT:    addis 3, 2, .LCPI47_0@toc@ha
2575; PC64LE9-NEXT:    xscvdpspn 36, 31
2576; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
2577; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
2578; PC64LE9-NEXT:    addi 3, 3, .LCPI47_0@toc@l
2579; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
2580; PC64LE9-NEXT:    lxv 35, 0(3)
2581; PC64LE9-NEXT:    xxmrghw 34, 1, 0
2582; PC64LE9-NEXT:    vperm 2, 4, 2, 3
2583; PC64LE9-NEXT:    addi 1, 1, 64
2584; PC64LE9-NEXT:    ld 0, 16(1)
2585; PC64LE9-NEXT:    mtlr 0
2586; PC64LE9-NEXT:    blr
2587entry:
2588  %cos = call <3 x float> @llvm.experimental.constrained.cos.v3f32(
2589                              <3 x float> %x,
2590                              metadata !"round.dynamic",
2591                              metadata !"fpexcept.strict") #1
2592  ret <3 x float> %cos
2593}
2594
2595define <3 x double> @constrained_vector_cos_v3f64(<3 x double> %x) #0 {
2596; PC64LE-LABEL: constrained_vector_cos_v3f64:
2597; PC64LE:       # %bb.0: # %entry
2598; PC64LE-NEXT:    mflr 0
2599; PC64LE-NEXT:    std 0, 16(1)
2600; PC64LE-NEXT:    stdu 1, -80(1)
2601; PC64LE-NEXT:    li 3, 48
2602; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
2603; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
2604; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2605; PC64LE-NEXT:    fmr 31, 3
2606; PC64LE-NEXT:    fmr 30, 2
2607; PC64LE-NEXT:    bl cos
2608; PC64LE-NEXT:    nop
2609; PC64LE-NEXT:    xxlor 63, 1, 1
2610; PC64LE-NEXT:    fmr 1, 30
2611; PC64LE-NEXT:    bl cos
2612; PC64LE-NEXT:    nop
2613; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2614; PC64LE-NEXT:    xxmrghd 63, 1, 63
2615; PC64LE-NEXT:    fmr 1, 31
2616; PC64LE-NEXT:    bl cos
2617; PC64LE-NEXT:    nop
2618; PC64LE-NEXT:    xxswapd 0, 63
2619; PC64LE-NEXT:    li 3, 48
2620; PC64LE-NEXT:    xxlor 2, 63, 63
2621; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
2622; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
2623; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2624; PC64LE-NEXT:    fmr 3, 1
2625; PC64LE-NEXT:    fmr 1, 0
2626; PC64LE-NEXT:    addi 1, 1, 80
2627; PC64LE-NEXT:    ld 0, 16(1)
2628; PC64LE-NEXT:    mtlr 0
2629; PC64LE-NEXT:    blr
2630;
2631; PC64LE9-LABEL: constrained_vector_cos_v3f64:
2632; PC64LE9:       # %bb.0: # %entry
2633; PC64LE9-NEXT:    mflr 0
2634; PC64LE9-NEXT:    std 0, 16(1)
2635; PC64LE9-NEXT:    stdu 1, -64(1)
2636; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
2637; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
2638; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
2639; PC64LE9-NEXT:    fmr 31, 3
2640; PC64LE9-NEXT:    fmr 30, 2
2641; PC64LE9-NEXT:    bl cos
2642; PC64LE9-NEXT:    nop
2643; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
2644; PC64LE9-NEXT:    fmr 1, 30
2645; PC64LE9-NEXT:    bl cos
2646; PC64LE9-NEXT:    nop
2647; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2648; PC64LE9-NEXT:    xxmrghd 63, 1, 63
2649; PC64LE9-NEXT:    fmr 1, 31
2650; PC64LE9-NEXT:    bl cos
2651; PC64LE9-NEXT:    nop
2652; PC64LE9-NEXT:    fmr 3, 1
2653; PC64LE9-NEXT:    xxswapd 1, 63
2654; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
2655; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
2656; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
2657; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2658; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
2659; PC64LE9-NEXT:    addi 1, 1, 64
2660; PC64LE9-NEXT:    ld 0, 16(1)
2661; PC64LE9-NEXT:    mtlr 0
2662; PC64LE9-NEXT:    blr
2663entry:
2664  %cos = call <3 x double> @llvm.experimental.constrained.cos.v3f64(
2665                          <3 x double> %x,
2666                          metadata !"round.dynamic",
2667                          metadata !"fpexcept.strict") #1
2668  ret <3 x double> %cos
2669}
2670
2671define <4 x double> @constrained_vector_cos_v4f64(<4 x double> %x) #0 {
2672; PC64LE-LABEL: constrained_vector_cos_v4f64:
2673; PC64LE:       # %bb.0: # %entry
2674; PC64LE-NEXT:    mflr 0
2675; PC64LE-NEXT:    std 0, 16(1)
2676; PC64LE-NEXT:    stdu 1, -96(1)
2677; PC64LE-NEXT:    li 3, 48
2678; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
2679; PC64LE-NEXT:    li 3, 64
2680; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
2681; PC64LE-NEXT:    vmr 30, 2
2682; PC64LE-NEXT:    li 3, 80
2683; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2684; PC64LE-NEXT:    vmr 31, 3
2685; PC64LE-NEXT:    xxlor 1, 62, 62
2686; PC64LE-NEXT:    bl cos
2687; PC64LE-NEXT:    nop
2688; PC64LE-NEXT:    xxlor 61, 1, 1
2689; PC64LE-NEXT:    xxswapd 1, 62
2690; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2691; PC64LE-NEXT:    bl cos
2692; PC64LE-NEXT:    nop
2693; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2694; PC64LE-NEXT:    xxmrghd 62, 61, 1
2695; PC64LE-NEXT:    xxlor 1, 63, 63
2696; PC64LE-NEXT:    bl cos
2697; PC64LE-NEXT:    nop
2698; PC64LE-NEXT:    xxlor 61, 1, 1
2699; PC64LE-NEXT:    xxswapd 1, 63
2700; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2701; PC64LE-NEXT:    bl cos
2702; PC64LE-NEXT:    nop
2703; PC64LE-NEXT:    li 3, 80
2704; PC64LE-NEXT:    vmr 2, 30
2705; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2706; PC64LE-NEXT:    xxmrghd 35, 61, 1
2707; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2708; PC64LE-NEXT:    li 3, 64
2709; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
2710; PC64LE-NEXT:    li 3, 48
2711; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
2712; PC64LE-NEXT:    addi 1, 1, 96
2713; PC64LE-NEXT:    ld 0, 16(1)
2714; PC64LE-NEXT:    mtlr 0
2715; PC64LE-NEXT:    blr
2716;
2717; PC64LE9-LABEL: constrained_vector_cos_v4f64:
2718; PC64LE9:       # %bb.0: # %entry
2719; PC64LE9-NEXT:    mflr 0
2720; PC64LE9-NEXT:    std 0, 16(1)
2721; PC64LE9-NEXT:    stdu 1, -80(1)
2722; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
2723; PC64LE9-NEXT:    vmr 30, 2
2724; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
2725; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
2726; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
2727; PC64LE9-NEXT:    vmr 31, 3
2728; PC64LE9-NEXT:    bl cos
2729; PC64LE9-NEXT:    nop
2730; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
2731; PC64LE9-NEXT:    xxswapd 1, 62
2732; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2733; PC64LE9-NEXT:    bl cos
2734; PC64LE9-NEXT:    nop
2735; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2736; PC64LE9-NEXT:    xxmrghd 62, 61, 1
2737; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
2738; PC64LE9-NEXT:    bl cos
2739; PC64LE9-NEXT:    nop
2740; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
2741; PC64LE9-NEXT:    xxswapd 1, 63
2742; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2743; PC64LE9-NEXT:    bl cos
2744; PC64LE9-NEXT:    nop
2745; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2746; PC64LE9-NEXT:    xxmrghd 35, 61, 1
2747; PC64LE9-NEXT:    vmr 2, 30
2748; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
2749; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
2750; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
2751; PC64LE9-NEXT:    addi 1, 1, 80
2752; PC64LE9-NEXT:    ld 0, 16(1)
2753; PC64LE9-NEXT:    mtlr 0
2754; PC64LE9-NEXT:    blr
2755entry:
2756  %cos = call <4 x double> @llvm.experimental.constrained.cos.v4f64(
2757                             <4 x double> %x,
2758                             metadata !"round.dynamic",
2759                             metadata !"fpexcept.strict") #1
2760  ret <4 x double> %cos
2761}
2762
2763define <1 x float> @constrained_vector_exp_v1f32(<1 x float> %x) #0 {
2764; PC64LE-LABEL: constrained_vector_exp_v1f32:
2765; PC64LE:       # %bb.0: # %entry
2766; PC64LE-NEXT:    mflr 0
2767; PC64LE-NEXT:    std 0, 16(1)
2768; PC64LE-NEXT:    stdu 1, -32(1)
2769; PC64LE-NEXT:    bl expf
2770; PC64LE-NEXT:    nop
2771; PC64LE-NEXT:    addi 1, 1, 32
2772; PC64LE-NEXT:    ld 0, 16(1)
2773; PC64LE-NEXT:    mtlr 0
2774; PC64LE-NEXT:    blr
2775;
2776; PC64LE9-LABEL: constrained_vector_exp_v1f32:
2777; PC64LE9:       # %bb.0: # %entry
2778; PC64LE9-NEXT:    mflr 0
2779; PC64LE9-NEXT:    std 0, 16(1)
2780; PC64LE9-NEXT:    stdu 1, -32(1)
2781; PC64LE9-NEXT:    bl expf
2782; PC64LE9-NEXT:    nop
2783; PC64LE9-NEXT:    addi 1, 1, 32
2784; PC64LE9-NEXT:    ld 0, 16(1)
2785; PC64LE9-NEXT:    mtlr 0
2786; PC64LE9-NEXT:    blr
2787entry:
2788  %exp = call <1 x float> @llvm.experimental.constrained.exp.v1f32(
2789                             <1 x float> %x,
2790                             metadata !"round.dynamic",
2791                             metadata !"fpexcept.strict") #1
2792  ret <1 x float> %exp
2793}
2794
2795define <2 x double> @constrained_vector_exp_v2f64(<2 x double> %x) #0 {
2796; PC64LE-LABEL: constrained_vector_exp_v2f64:
2797; PC64LE:       # %bb.0: # %entry
2798; PC64LE-NEXT:    mflr 0
2799; PC64LE-NEXT:    std 0, 16(1)
2800; PC64LE-NEXT:    stdu 1, -80(1)
2801; PC64LE-NEXT:    li 3, 48
2802; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
2803; PC64LE-NEXT:    li 3, 64
2804; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2805; PC64LE-NEXT:    vmr 31, 2
2806; PC64LE-NEXT:    xxlor 1, 63, 63
2807; PC64LE-NEXT:    bl exp
2808; PC64LE-NEXT:    nop
2809; PC64LE-NEXT:    xxlor 62, 1, 1
2810; PC64LE-NEXT:    xxswapd 1, 63
2811; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2812; PC64LE-NEXT:    bl exp
2813; PC64LE-NEXT:    nop
2814; PC64LE-NEXT:    li 3, 64
2815; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2816; PC64LE-NEXT:    xxmrghd 34, 62, 1
2817; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2818; PC64LE-NEXT:    li 3, 48
2819; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
2820; PC64LE-NEXT:    addi 1, 1, 80
2821; PC64LE-NEXT:    ld 0, 16(1)
2822; PC64LE-NEXT:    mtlr 0
2823; PC64LE-NEXT:    blr
2824;
2825; PC64LE9-LABEL: constrained_vector_exp_v2f64:
2826; PC64LE9:       # %bb.0: # %entry
2827; PC64LE9-NEXT:    mflr 0
2828; PC64LE9-NEXT:    std 0, 16(1)
2829; PC64LE9-NEXT:    stdu 1, -64(1)
2830; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
2831; PC64LE9-NEXT:    vmr 31, 2
2832; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
2833; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
2834; PC64LE9-NEXT:    bl exp
2835; PC64LE9-NEXT:    nop
2836; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
2837; PC64LE9-NEXT:    xxswapd 1, 63
2838; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2839; PC64LE9-NEXT:    bl exp
2840; PC64LE9-NEXT:    nop
2841; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2842; PC64LE9-NEXT:    xxmrghd 34, 62, 1
2843; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
2844; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
2845; PC64LE9-NEXT:    addi 1, 1, 64
2846; PC64LE9-NEXT:    ld 0, 16(1)
2847; PC64LE9-NEXT:    mtlr 0
2848; PC64LE9-NEXT:    blr
2849entry:
2850  %exp = call <2 x double> @llvm.experimental.constrained.exp.v2f64(
2851                             <2 x double> %x,
2852                             metadata !"round.dynamic",
2853                             metadata !"fpexcept.strict") #1
2854  ret <2 x double> %exp
2855}
2856
2857define <3 x float> @constrained_vector_exp_v3f32(<3 x float> %x) #0 {
2858; PC64LE-LABEL: constrained_vector_exp_v3f32:
2859; PC64LE:       # %bb.0: # %entry
2860; PC64LE-NEXT:    mflr 0
2861; PC64LE-NEXT:    std 0, 16(1)
2862; PC64LE-NEXT:    stdu 1, -80(1)
2863; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
2864; PC64LE-NEXT:    li 3, 48
2865; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
2866; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
2867; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2868; PC64LE-NEXT:    vmr 31, 2
2869; PC64LE-NEXT:    xscvspdpn 1, 0
2870; PC64LE-NEXT:    bl expf
2871; PC64LE-NEXT:    nop
2872; PC64LE-NEXT:    xxswapd 0, 63
2873; PC64LE-NEXT:    fmr 31, 1
2874; PC64LE-NEXT:    xscvspdpn 1, 0
2875; PC64LE-NEXT:    bl expf
2876; PC64LE-NEXT:    nop
2877; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
2878; PC64LE-NEXT:    fmr 30, 1
2879; PC64LE-NEXT:    xscvspdpn 1, 0
2880; PC64LE-NEXT:    bl expf
2881; PC64LE-NEXT:    nop
2882; PC64LE-NEXT:    xscvdpspn 0, 30
2883; PC64LE-NEXT:    addis 3, 2, .LCPI52_0@toc@ha
2884; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
2885; PC64LE-NEXT:    xscvdpspn 1, 1
2886; PC64LE-NEXT:    addi 3, 3, .LCPI52_0@toc@l
2887; PC64LE-NEXT:    xscvdpspn 34, 31
2888; PC64LE-NEXT:    lvx 4, 0, 3
2889; PC64LE-NEXT:    li 3, 48
2890; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
2891; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2892; PC64LE-NEXT:    xxmrghw 35, 0, 1
2893; PC64LE-NEXT:    vperm 2, 2, 3, 4
2894; PC64LE-NEXT:    addi 1, 1, 80
2895; PC64LE-NEXT:    ld 0, 16(1)
2896; PC64LE-NEXT:    mtlr 0
2897; PC64LE-NEXT:    blr
2898;
2899; PC64LE9-LABEL: constrained_vector_exp_v3f32:
2900; PC64LE9:       # %bb.0: # %entry
2901; PC64LE9-NEXT:    mflr 0
2902; PC64LE9-NEXT:    std 0, 16(1)
2903; PC64LE9-NEXT:    stdu 1, -64(1)
2904; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
2905; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
2906; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
2907; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
2908; PC64LE9-NEXT:    xscvspdpn 1, 0
2909; PC64LE9-NEXT:    vmr 31, 2
2910; PC64LE9-NEXT:    bl expf
2911; PC64LE9-NEXT:    nop
2912; PC64LE9-NEXT:    xxswapd 0, 63
2913; PC64LE9-NEXT:    fmr 31, 1
2914; PC64LE9-NEXT:    xscvspdpn 1, 0
2915; PC64LE9-NEXT:    bl expf
2916; PC64LE9-NEXT:    nop
2917; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
2918; PC64LE9-NEXT:    fmr 30, 1
2919; PC64LE9-NEXT:    xscvspdpn 1, 0
2920; PC64LE9-NEXT:    bl expf
2921; PC64LE9-NEXT:    nop
2922; PC64LE9-NEXT:    xscvdpspn 0, 1
2923; PC64LE9-NEXT:    xscvdpspn 1, 30
2924; PC64LE9-NEXT:    addis 3, 2, .LCPI52_0@toc@ha
2925; PC64LE9-NEXT:    xscvdpspn 36, 31
2926; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
2927; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
2928; PC64LE9-NEXT:    addi 3, 3, .LCPI52_0@toc@l
2929; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
2930; PC64LE9-NEXT:    lxv 35, 0(3)
2931; PC64LE9-NEXT:    xxmrghw 34, 1, 0
2932; PC64LE9-NEXT:    vperm 2, 4, 2, 3
2933; PC64LE9-NEXT:    addi 1, 1, 64
2934; PC64LE9-NEXT:    ld 0, 16(1)
2935; PC64LE9-NEXT:    mtlr 0
2936; PC64LE9-NEXT:    blr
2937entry:
2938  %exp = call <3 x float> @llvm.experimental.constrained.exp.v3f32(
2939                              <3 x float> %x,
2940                              metadata !"round.dynamic",
2941                              metadata !"fpexcept.strict") #1
2942  ret <3 x float> %exp
2943}
2944
2945define <3 x double> @constrained_vector_exp_v3f64(<3 x double> %x) #0 {
2946; PC64LE-LABEL: constrained_vector_exp_v3f64:
2947; PC64LE:       # %bb.0: # %entry
2948; PC64LE-NEXT:    mflr 0
2949; PC64LE-NEXT:    std 0, 16(1)
2950; PC64LE-NEXT:    stdu 1, -80(1)
2951; PC64LE-NEXT:    li 3, 48
2952; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
2953; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
2954; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
2955; PC64LE-NEXT:    fmr 31, 3
2956; PC64LE-NEXT:    fmr 30, 2
2957; PC64LE-NEXT:    bl exp
2958; PC64LE-NEXT:    nop
2959; PC64LE-NEXT:    xxlor 63, 1, 1
2960; PC64LE-NEXT:    fmr 1, 30
2961; PC64LE-NEXT:    bl exp
2962; PC64LE-NEXT:    nop
2963; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2964; PC64LE-NEXT:    xxmrghd 63, 1, 63
2965; PC64LE-NEXT:    fmr 1, 31
2966; PC64LE-NEXT:    bl exp
2967; PC64LE-NEXT:    nop
2968; PC64LE-NEXT:    xxswapd 0, 63
2969; PC64LE-NEXT:    li 3, 48
2970; PC64LE-NEXT:    xxlor 2, 63, 63
2971; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
2972; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
2973; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
2974; PC64LE-NEXT:    fmr 3, 1
2975; PC64LE-NEXT:    fmr 1, 0
2976; PC64LE-NEXT:    addi 1, 1, 80
2977; PC64LE-NEXT:    ld 0, 16(1)
2978; PC64LE-NEXT:    mtlr 0
2979; PC64LE-NEXT:    blr
2980;
2981; PC64LE9-LABEL: constrained_vector_exp_v3f64:
2982; PC64LE9:       # %bb.0: # %entry
2983; PC64LE9-NEXT:    mflr 0
2984; PC64LE9-NEXT:    std 0, 16(1)
2985; PC64LE9-NEXT:    stdu 1, -64(1)
2986; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
2987; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
2988; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
2989; PC64LE9-NEXT:    fmr 31, 3
2990; PC64LE9-NEXT:    fmr 30, 2
2991; PC64LE9-NEXT:    bl exp
2992; PC64LE9-NEXT:    nop
2993; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
2994; PC64LE9-NEXT:    fmr 1, 30
2995; PC64LE9-NEXT:    bl exp
2996; PC64LE9-NEXT:    nop
2997; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2998; PC64LE9-NEXT:    xxmrghd 63, 1, 63
2999; PC64LE9-NEXT:    fmr 1, 31
3000; PC64LE9-NEXT:    bl exp
3001; PC64LE9-NEXT:    nop
3002; PC64LE9-NEXT:    fmr 3, 1
3003; PC64LE9-NEXT:    xxswapd 1, 63
3004; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
3005; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
3006; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
3007; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3008; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
3009; PC64LE9-NEXT:    addi 1, 1, 64
3010; PC64LE9-NEXT:    ld 0, 16(1)
3011; PC64LE9-NEXT:    mtlr 0
3012; PC64LE9-NEXT:    blr
3013entry:
3014  %exp = call <3 x double> @llvm.experimental.constrained.exp.v3f64(
3015                          <3 x double> %x,
3016                          metadata !"round.dynamic",
3017                          metadata !"fpexcept.strict") #1
3018  ret <3 x double> %exp
3019}
3020
3021define <4 x double> @constrained_vector_exp_v4f64(<4 x double> %x) #0 {
3022; PC64LE-LABEL: constrained_vector_exp_v4f64:
3023; PC64LE:       # %bb.0: # %entry
3024; PC64LE-NEXT:    mflr 0
3025; PC64LE-NEXT:    std 0, 16(1)
3026; PC64LE-NEXT:    stdu 1, -96(1)
3027; PC64LE-NEXT:    li 3, 48
3028; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
3029; PC64LE-NEXT:    li 3, 64
3030; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
3031; PC64LE-NEXT:    vmr 30, 2
3032; PC64LE-NEXT:    li 3, 80
3033; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3034; PC64LE-NEXT:    vmr 31, 3
3035; PC64LE-NEXT:    xxlor 1, 62, 62
3036; PC64LE-NEXT:    bl exp
3037; PC64LE-NEXT:    nop
3038; PC64LE-NEXT:    xxlor 61, 1, 1
3039; PC64LE-NEXT:    xxswapd 1, 62
3040; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3041; PC64LE-NEXT:    bl exp
3042; PC64LE-NEXT:    nop
3043; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3044; PC64LE-NEXT:    xxmrghd 62, 61, 1
3045; PC64LE-NEXT:    xxlor 1, 63, 63
3046; PC64LE-NEXT:    bl exp
3047; PC64LE-NEXT:    nop
3048; PC64LE-NEXT:    xxlor 61, 1, 1
3049; PC64LE-NEXT:    xxswapd 1, 63
3050; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3051; PC64LE-NEXT:    bl exp
3052; PC64LE-NEXT:    nop
3053; PC64LE-NEXT:    li 3, 80
3054; PC64LE-NEXT:    vmr 2, 30
3055; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3056; PC64LE-NEXT:    xxmrghd 35, 61, 1
3057; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3058; PC64LE-NEXT:    li 3, 64
3059; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
3060; PC64LE-NEXT:    li 3, 48
3061; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
3062; PC64LE-NEXT:    addi 1, 1, 96
3063; PC64LE-NEXT:    ld 0, 16(1)
3064; PC64LE-NEXT:    mtlr 0
3065; PC64LE-NEXT:    blr
3066;
3067; PC64LE9-LABEL: constrained_vector_exp_v4f64:
3068; PC64LE9:       # %bb.0: # %entry
3069; PC64LE9-NEXT:    mflr 0
3070; PC64LE9-NEXT:    std 0, 16(1)
3071; PC64LE9-NEXT:    stdu 1, -80(1)
3072; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
3073; PC64LE9-NEXT:    vmr 30, 2
3074; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
3075; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
3076; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
3077; PC64LE9-NEXT:    vmr 31, 3
3078; PC64LE9-NEXT:    bl exp
3079; PC64LE9-NEXT:    nop
3080; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
3081; PC64LE9-NEXT:    xxswapd 1, 62
3082; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3083; PC64LE9-NEXT:    bl exp
3084; PC64LE9-NEXT:    nop
3085; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3086; PC64LE9-NEXT:    xxmrghd 62, 61, 1
3087; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
3088; PC64LE9-NEXT:    bl exp
3089; PC64LE9-NEXT:    nop
3090; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
3091; PC64LE9-NEXT:    xxswapd 1, 63
3092; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3093; PC64LE9-NEXT:    bl exp
3094; PC64LE9-NEXT:    nop
3095; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3096; PC64LE9-NEXT:    xxmrghd 35, 61, 1
3097; PC64LE9-NEXT:    vmr 2, 30
3098; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
3099; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
3100; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
3101; PC64LE9-NEXT:    addi 1, 1, 80
3102; PC64LE9-NEXT:    ld 0, 16(1)
3103; PC64LE9-NEXT:    mtlr 0
3104; PC64LE9-NEXT:    blr
3105entry:
3106  %exp = call <4 x double> @llvm.experimental.constrained.exp.v4f64(
3107                             <4 x double> %x,
3108                             metadata !"round.dynamic",
3109                             metadata !"fpexcept.strict") #1
3110  ret <4 x double> %exp
3111}
3112
3113define <1 x float> @constrained_vector_exp2_v1f32(<1 x float> %x) #0 {
3114; PC64LE-LABEL: constrained_vector_exp2_v1f32:
3115; PC64LE:       # %bb.0: # %entry
3116; PC64LE-NEXT:    mflr 0
3117; PC64LE-NEXT:    std 0, 16(1)
3118; PC64LE-NEXT:    stdu 1, -32(1)
3119; PC64LE-NEXT:    bl exp2f
3120; PC64LE-NEXT:    nop
3121; PC64LE-NEXT:    addi 1, 1, 32
3122; PC64LE-NEXT:    ld 0, 16(1)
3123; PC64LE-NEXT:    mtlr 0
3124; PC64LE-NEXT:    blr
3125;
3126; PC64LE9-LABEL: constrained_vector_exp2_v1f32:
3127; PC64LE9:       # %bb.0: # %entry
3128; PC64LE9-NEXT:    mflr 0
3129; PC64LE9-NEXT:    std 0, 16(1)
3130; PC64LE9-NEXT:    stdu 1, -32(1)
3131; PC64LE9-NEXT:    bl exp2f
3132; PC64LE9-NEXT:    nop
3133; PC64LE9-NEXT:    addi 1, 1, 32
3134; PC64LE9-NEXT:    ld 0, 16(1)
3135; PC64LE9-NEXT:    mtlr 0
3136; PC64LE9-NEXT:    blr
3137entry:
3138  %exp2 = call <1 x float> @llvm.experimental.constrained.exp2.v1f32(
3139                             <1 x float> %x,
3140                             metadata !"round.dynamic",
3141                             metadata !"fpexcept.strict") #1
3142  ret <1 x float> %exp2
3143}
3144
3145define <2 x double> @constrained_vector_exp2_v2f64(<2 x double> %x) #0 {
3146; PC64LE-LABEL: constrained_vector_exp2_v2f64:
3147; PC64LE:       # %bb.0: # %entry
3148; PC64LE-NEXT:    mflr 0
3149; PC64LE-NEXT:    std 0, 16(1)
3150; PC64LE-NEXT:    stdu 1, -80(1)
3151; PC64LE-NEXT:    li 3, 48
3152; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
3153; PC64LE-NEXT:    li 3, 64
3154; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3155; PC64LE-NEXT:    vmr 31, 2
3156; PC64LE-NEXT:    xxlor 1, 63, 63
3157; PC64LE-NEXT:    bl exp2
3158; PC64LE-NEXT:    nop
3159; PC64LE-NEXT:    xxlor 62, 1, 1
3160; PC64LE-NEXT:    xxswapd 1, 63
3161; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3162; PC64LE-NEXT:    bl exp2
3163; PC64LE-NEXT:    nop
3164; PC64LE-NEXT:    li 3, 64
3165; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3166; PC64LE-NEXT:    xxmrghd 34, 62, 1
3167; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3168; PC64LE-NEXT:    li 3, 48
3169; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
3170; PC64LE-NEXT:    addi 1, 1, 80
3171; PC64LE-NEXT:    ld 0, 16(1)
3172; PC64LE-NEXT:    mtlr 0
3173; PC64LE-NEXT:    blr
3174;
3175; PC64LE9-LABEL: constrained_vector_exp2_v2f64:
3176; PC64LE9:       # %bb.0: # %entry
3177; PC64LE9-NEXT:    mflr 0
3178; PC64LE9-NEXT:    std 0, 16(1)
3179; PC64LE9-NEXT:    stdu 1, -64(1)
3180; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3181; PC64LE9-NEXT:    vmr 31, 2
3182; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
3183; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
3184; PC64LE9-NEXT:    bl exp2
3185; PC64LE9-NEXT:    nop
3186; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
3187; PC64LE9-NEXT:    xxswapd 1, 63
3188; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3189; PC64LE9-NEXT:    bl exp2
3190; PC64LE9-NEXT:    nop
3191; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3192; PC64LE9-NEXT:    xxmrghd 34, 62, 1
3193; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3194; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
3195; PC64LE9-NEXT:    addi 1, 1, 64
3196; PC64LE9-NEXT:    ld 0, 16(1)
3197; PC64LE9-NEXT:    mtlr 0
3198; PC64LE9-NEXT:    blr
3199entry:
3200  %exp2 = call <2 x double> @llvm.experimental.constrained.exp2.v2f64(
3201                              <2 x double> %x,
3202                              metadata !"round.dynamic",
3203                              metadata !"fpexcept.strict") #1
3204  ret <2 x double> %exp2
3205}
3206
3207define <3 x float> @constrained_vector_exp2_v3f32(<3 x float> %x) #0 {
3208; PC64LE-LABEL: constrained_vector_exp2_v3f32:
3209; PC64LE:       # %bb.0: # %entry
3210; PC64LE-NEXT:    mflr 0
3211; PC64LE-NEXT:    std 0, 16(1)
3212; PC64LE-NEXT:    stdu 1, -80(1)
3213; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
3214; PC64LE-NEXT:    li 3, 48
3215; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
3216; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
3217; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3218; PC64LE-NEXT:    vmr 31, 2
3219; PC64LE-NEXT:    xscvspdpn 1, 0
3220; PC64LE-NEXT:    bl exp2f
3221; PC64LE-NEXT:    nop
3222; PC64LE-NEXT:    xxswapd 0, 63
3223; PC64LE-NEXT:    fmr 31, 1
3224; PC64LE-NEXT:    xscvspdpn 1, 0
3225; PC64LE-NEXT:    bl exp2f
3226; PC64LE-NEXT:    nop
3227; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
3228; PC64LE-NEXT:    fmr 30, 1
3229; PC64LE-NEXT:    xscvspdpn 1, 0
3230; PC64LE-NEXT:    bl exp2f
3231; PC64LE-NEXT:    nop
3232; PC64LE-NEXT:    xscvdpspn 0, 30
3233; PC64LE-NEXT:    addis 3, 2, .LCPI57_0@toc@ha
3234; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
3235; PC64LE-NEXT:    xscvdpspn 1, 1
3236; PC64LE-NEXT:    addi 3, 3, .LCPI57_0@toc@l
3237; PC64LE-NEXT:    xscvdpspn 34, 31
3238; PC64LE-NEXT:    lvx 4, 0, 3
3239; PC64LE-NEXT:    li 3, 48
3240; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
3241; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3242; PC64LE-NEXT:    xxmrghw 35, 0, 1
3243; PC64LE-NEXT:    vperm 2, 2, 3, 4
3244; PC64LE-NEXT:    addi 1, 1, 80
3245; PC64LE-NEXT:    ld 0, 16(1)
3246; PC64LE-NEXT:    mtlr 0
3247; PC64LE-NEXT:    blr
3248;
3249; PC64LE9-LABEL: constrained_vector_exp2_v3f32:
3250; PC64LE9:       # %bb.0: # %entry
3251; PC64LE9-NEXT:    mflr 0
3252; PC64LE9-NEXT:    std 0, 16(1)
3253; PC64LE9-NEXT:    stdu 1, -64(1)
3254; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
3255; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
3256; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
3257; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
3258; PC64LE9-NEXT:    xscvspdpn 1, 0
3259; PC64LE9-NEXT:    vmr 31, 2
3260; PC64LE9-NEXT:    bl exp2f
3261; PC64LE9-NEXT:    nop
3262; PC64LE9-NEXT:    xxswapd 0, 63
3263; PC64LE9-NEXT:    fmr 31, 1
3264; PC64LE9-NEXT:    xscvspdpn 1, 0
3265; PC64LE9-NEXT:    bl exp2f
3266; PC64LE9-NEXT:    nop
3267; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
3268; PC64LE9-NEXT:    fmr 30, 1
3269; PC64LE9-NEXT:    xscvspdpn 1, 0
3270; PC64LE9-NEXT:    bl exp2f
3271; PC64LE9-NEXT:    nop
3272; PC64LE9-NEXT:    xscvdpspn 0, 1
3273; PC64LE9-NEXT:    xscvdpspn 1, 30
3274; PC64LE9-NEXT:    addis 3, 2, .LCPI57_0@toc@ha
3275; PC64LE9-NEXT:    xscvdpspn 36, 31
3276; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
3277; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
3278; PC64LE9-NEXT:    addi 3, 3, .LCPI57_0@toc@l
3279; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
3280; PC64LE9-NEXT:    lxv 35, 0(3)
3281; PC64LE9-NEXT:    xxmrghw 34, 1, 0
3282; PC64LE9-NEXT:    vperm 2, 4, 2, 3
3283; PC64LE9-NEXT:    addi 1, 1, 64
3284; PC64LE9-NEXT:    ld 0, 16(1)
3285; PC64LE9-NEXT:    mtlr 0
3286; PC64LE9-NEXT:    blr
3287entry:
3288  %exp2 = call <3 x float> @llvm.experimental.constrained.exp2.v3f32(
3289                              <3 x float> %x,
3290                              metadata !"round.dynamic",
3291                              metadata !"fpexcept.strict") #1
3292  ret <3 x float> %exp2
3293}
3294
3295define <3 x double> @constrained_vector_exp2_v3f64(<3 x double> %x) #0 {
3296; PC64LE-LABEL: constrained_vector_exp2_v3f64:
3297; PC64LE:       # %bb.0: # %entry
3298; PC64LE-NEXT:    mflr 0
3299; PC64LE-NEXT:    std 0, 16(1)
3300; PC64LE-NEXT:    stdu 1, -80(1)
3301; PC64LE-NEXT:    li 3, 48
3302; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
3303; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
3304; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3305; PC64LE-NEXT:    fmr 31, 3
3306; PC64LE-NEXT:    fmr 30, 2
3307; PC64LE-NEXT:    bl exp2
3308; PC64LE-NEXT:    nop
3309; PC64LE-NEXT:    xxlor 63, 1, 1
3310; PC64LE-NEXT:    fmr 1, 30
3311; PC64LE-NEXT:    bl exp2
3312; PC64LE-NEXT:    nop
3313; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3314; PC64LE-NEXT:    xxmrghd 63, 1, 63
3315; PC64LE-NEXT:    fmr 1, 31
3316; PC64LE-NEXT:    bl exp2
3317; PC64LE-NEXT:    nop
3318; PC64LE-NEXT:    xxswapd 0, 63
3319; PC64LE-NEXT:    li 3, 48
3320; PC64LE-NEXT:    xxlor 2, 63, 63
3321; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
3322; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
3323; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3324; PC64LE-NEXT:    fmr 3, 1
3325; PC64LE-NEXT:    fmr 1, 0
3326; PC64LE-NEXT:    addi 1, 1, 80
3327; PC64LE-NEXT:    ld 0, 16(1)
3328; PC64LE-NEXT:    mtlr 0
3329; PC64LE-NEXT:    blr
3330;
3331; PC64LE9-LABEL: constrained_vector_exp2_v3f64:
3332; PC64LE9:       # %bb.0: # %entry
3333; PC64LE9-NEXT:    mflr 0
3334; PC64LE9-NEXT:    std 0, 16(1)
3335; PC64LE9-NEXT:    stdu 1, -64(1)
3336; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
3337; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
3338; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
3339; PC64LE9-NEXT:    fmr 31, 3
3340; PC64LE9-NEXT:    fmr 30, 2
3341; PC64LE9-NEXT:    bl exp2
3342; PC64LE9-NEXT:    nop
3343; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
3344; PC64LE9-NEXT:    fmr 1, 30
3345; PC64LE9-NEXT:    bl exp2
3346; PC64LE9-NEXT:    nop
3347; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3348; PC64LE9-NEXT:    xxmrghd 63, 1, 63
3349; PC64LE9-NEXT:    fmr 1, 31
3350; PC64LE9-NEXT:    bl exp2
3351; PC64LE9-NEXT:    nop
3352; PC64LE9-NEXT:    fmr 3, 1
3353; PC64LE9-NEXT:    xxswapd 1, 63
3354; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
3355; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
3356; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
3357; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3358; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
3359; PC64LE9-NEXT:    addi 1, 1, 64
3360; PC64LE9-NEXT:    ld 0, 16(1)
3361; PC64LE9-NEXT:    mtlr 0
3362; PC64LE9-NEXT:    blr
3363entry:
3364  %exp2 = call <3 x double> @llvm.experimental.constrained.exp2.v3f64(
3365                          <3 x double> %x,
3366                          metadata !"round.dynamic",
3367                          metadata !"fpexcept.strict") #1
3368  ret <3 x double> %exp2
3369}
3370
3371define <4 x double> @constrained_vector_exp2_v4f64(<4 x double> %x) #0 {
3372; PC64LE-LABEL: constrained_vector_exp2_v4f64:
3373; PC64LE:       # %bb.0: # %entry
3374; PC64LE-NEXT:    mflr 0
3375; PC64LE-NEXT:    std 0, 16(1)
3376; PC64LE-NEXT:    stdu 1, -96(1)
3377; PC64LE-NEXT:    li 3, 48
3378; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
3379; PC64LE-NEXT:    li 3, 64
3380; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
3381; PC64LE-NEXT:    vmr 30, 2
3382; PC64LE-NEXT:    li 3, 80
3383; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3384; PC64LE-NEXT:    vmr 31, 3
3385; PC64LE-NEXT:    xxlor 1, 62, 62
3386; PC64LE-NEXT:    bl exp2
3387; PC64LE-NEXT:    nop
3388; PC64LE-NEXT:    xxlor 61, 1, 1
3389; PC64LE-NEXT:    xxswapd 1, 62
3390; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3391; PC64LE-NEXT:    bl exp2
3392; PC64LE-NEXT:    nop
3393; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3394; PC64LE-NEXT:    xxmrghd 62, 61, 1
3395; PC64LE-NEXT:    xxlor 1, 63, 63
3396; PC64LE-NEXT:    bl exp2
3397; PC64LE-NEXT:    nop
3398; PC64LE-NEXT:    xxlor 61, 1, 1
3399; PC64LE-NEXT:    xxswapd 1, 63
3400; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3401; PC64LE-NEXT:    bl exp2
3402; PC64LE-NEXT:    nop
3403; PC64LE-NEXT:    li 3, 80
3404; PC64LE-NEXT:    vmr 2, 30
3405; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3406; PC64LE-NEXT:    xxmrghd 35, 61, 1
3407; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3408; PC64LE-NEXT:    li 3, 64
3409; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
3410; PC64LE-NEXT:    li 3, 48
3411; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
3412; PC64LE-NEXT:    addi 1, 1, 96
3413; PC64LE-NEXT:    ld 0, 16(1)
3414; PC64LE-NEXT:    mtlr 0
3415; PC64LE-NEXT:    blr
3416;
3417; PC64LE9-LABEL: constrained_vector_exp2_v4f64:
3418; PC64LE9:       # %bb.0: # %entry
3419; PC64LE9-NEXT:    mflr 0
3420; PC64LE9-NEXT:    std 0, 16(1)
3421; PC64LE9-NEXT:    stdu 1, -80(1)
3422; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
3423; PC64LE9-NEXT:    vmr 30, 2
3424; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
3425; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
3426; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
3427; PC64LE9-NEXT:    vmr 31, 3
3428; PC64LE9-NEXT:    bl exp2
3429; PC64LE9-NEXT:    nop
3430; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
3431; PC64LE9-NEXT:    xxswapd 1, 62
3432; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3433; PC64LE9-NEXT:    bl exp2
3434; PC64LE9-NEXT:    nop
3435; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3436; PC64LE9-NEXT:    xxmrghd 62, 61, 1
3437; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
3438; PC64LE9-NEXT:    bl exp2
3439; PC64LE9-NEXT:    nop
3440; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
3441; PC64LE9-NEXT:    xxswapd 1, 63
3442; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3443; PC64LE9-NEXT:    bl exp2
3444; PC64LE9-NEXT:    nop
3445; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3446; PC64LE9-NEXT:    xxmrghd 35, 61, 1
3447; PC64LE9-NEXT:    vmr 2, 30
3448; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
3449; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
3450; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
3451; PC64LE9-NEXT:    addi 1, 1, 80
3452; PC64LE9-NEXT:    ld 0, 16(1)
3453; PC64LE9-NEXT:    mtlr 0
3454; PC64LE9-NEXT:    blr
3455entry:
3456  %exp2 = call <4 x double> @llvm.experimental.constrained.exp2.v4f64(
3457                              <4 x double> %x,
3458                              metadata !"round.dynamic",
3459                              metadata !"fpexcept.strict") #1
3460  ret <4 x double> %exp2
3461}
3462
3463define <1 x float> @constrained_vector_log_v1f32(<1 x float> %x) #0 {
3464; PC64LE-LABEL: constrained_vector_log_v1f32:
3465; PC64LE:       # %bb.0: # %entry
3466; PC64LE-NEXT:    mflr 0
3467; PC64LE-NEXT:    std 0, 16(1)
3468; PC64LE-NEXT:    stdu 1, -32(1)
3469; PC64LE-NEXT:    bl logf
3470; PC64LE-NEXT:    nop
3471; PC64LE-NEXT:    addi 1, 1, 32
3472; PC64LE-NEXT:    ld 0, 16(1)
3473; PC64LE-NEXT:    mtlr 0
3474; PC64LE-NEXT:    blr
3475;
3476; PC64LE9-LABEL: constrained_vector_log_v1f32:
3477; PC64LE9:       # %bb.0: # %entry
3478; PC64LE9-NEXT:    mflr 0
3479; PC64LE9-NEXT:    std 0, 16(1)
3480; PC64LE9-NEXT:    stdu 1, -32(1)
3481; PC64LE9-NEXT:    bl logf
3482; PC64LE9-NEXT:    nop
3483; PC64LE9-NEXT:    addi 1, 1, 32
3484; PC64LE9-NEXT:    ld 0, 16(1)
3485; PC64LE9-NEXT:    mtlr 0
3486; PC64LE9-NEXT:    blr
3487entry:
3488  %log = call <1 x float> @llvm.experimental.constrained.log.v1f32(
3489                             <1 x float> %x,
3490                             metadata !"round.dynamic",
3491                             metadata !"fpexcept.strict") #1
3492  ret <1 x float> %log
3493}
3494
3495define <2 x double> @constrained_vector_log_v2f64(<2 x double> %x) #0 {
3496; PC64LE-LABEL: constrained_vector_log_v2f64:
3497; PC64LE:       # %bb.0: # %entry
3498; PC64LE-NEXT:    mflr 0
3499; PC64LE-NEXT:    std 0, 16(1)
3500; PC64LE-NEXT:    stdu 1, -80(1)
3501; PC64LE-NEXT:    li 3, 48
3502; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
3503; PC64LE-NEXT:    li 3, 64
3504; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3505; PC64LE-NEXT:    vmr 31, 2
3506; PC64LE-NEXT:    xxlor 1, 63, 63
3507; PC64LE-NEXT:    bl log
3508; PC64LE-NEXT:    nop
3509; PC64LE-NEXT:    xxlor 62, 1, 1
3510; PC64LE-NEXT:    xxswapd 1, 63
3511; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3512; PC64LE-NEXT:    bl log
3513; PC64LE-NEXT:    nop
3514; PC64LE-NEXT:    li 3, 64
3515; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3516; PC64LE-NEXT:    xxmrghd 34, 62, 1
3517; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3518; PC64LE-NEXT:    li 3, 48
3519; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
3520; PC64LE-NEXT:    addi 1, 1, 80
3521; PC64LE-NEXT:    ld 0, 16(1)
3522; PC64LE-NEXT:    mtlr 0
3523; PC64LE-NEXT:    blr
3524;
3525; PC64LE9-LABEL: constrained_vector_log_v2f64:
3526; PC64LE9:       # %bb.0: # %entry
3527; PC64LE9-NEXT:    mflr 0
3528; PC64LE9-NEXT:    std 0, 16(1)
3529; PC64LE9-NEXT:    stdu 1, -64(1)
3530; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3531; PC64LE9-NEXT:    vmr 31, 2
3532; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
3533; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
3534; PC64LE9-NEXT:    bl log
3535; PC64LE9-NEXT:    nop
3536; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
3537; PC64LE9-NEXT:    xxswapd 1, 63
3538; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3539; PC64LE9-NEXT:    bl log
3540; PC64LE9-NEXT:    nop
3541; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3542; PC64LE9-NEXT:    xxmrghd 34, 62, 1
3543; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3544; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
3545; PC64LE9-NEXT:    addi 1, 1, 64
3546; PC64LE9-NEXT:    ld 0, 16(1)
3547; PC64LE9-NEXT:    mtlr 0
3548; PC64LE9-NEXT:    blr
3549entry:
3550  %log = call <2 x double> @llvm.experimental.constrained.log.v2f64(
3551                             <2 x double> %x,
3552                             metadata !"round.dynamic",
3553                             metadata !"fpexcept.strict") #1
3554  ret <2 x double> %log
3555}
3556
3557define <3 x float> @constrained_vector_log_v3f32(<3 x float> %x) #0 {
3558; PC64LE-LABEL: constrained_vector_log_v3f32:
3559; PC64LE:       # %bb.0: # %entry
3560; PC64LE-NEXT:    mflr 0
3561; PC64LE-NEXT:    std 0, 16(1)
3562; PC64LE-NEXT:    stdu 1, -80(1)
3563; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
3564; PC64LE-NEXT:    li 3, 48
3565; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
3566; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
3567; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3568; PC64LE-NEXT:    vmr 31, 2
3569; PC64LE-NEXT:    xscvspdpn 1, 0
3570; PC64LE-NEXT:    bl logf
3571; PC64LE-NEXT:    nop
3572; PC64LE-NEXT:    xxswapd 0, 63
3573; PC64LE-NEXT:    fmr 31, 1
3574; PC64LE-NEXT:    xscvspdpn 1, 0
3575; PC64LE-NEXT:    bl logf
3576; PC64LE-NEXT:    nop
3577; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
3578; PC64LE-NEXT:    fmr 30, 1
3579; PC64LE-NEXT:    xscvspdpn 1, 0
3580; PC64LE-NEXT:    bl logf
3581; PC64LE-NEXT:    nop
3582; PC64LE-NEXT:    xscvdpspn 0, 30
3583; PC64LE-NEXT:    addis 3, 2, .LCPI62_0@toc@ha
3584; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
3585; PC64LE-NEXT:    xscvdpspn 1, 1
3586; PC64LE-NEXT:    addi 3, 3, .LCPI62_0@toc@l
3587; PC64LE-NEXT:    xscvdpspn 34, 31
3588; PC64LE-NEXT:    lvx 4, 0, 3
3589; PC64LE-NEXT:    li 3, 48
3590; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
3591; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3592; PC64LE-NEXT:    xxmrghw 35, 0, 1
3593; PC64LE-NEXT:    vperm 2, 2, 3, 4
3594; PC64LE-NEXT:    addi 1, 1, 80
3595; PC64LE-NEXT:    ld 0, 16(1)
3596; PC64LE-NEXT:    mtlr 0
3597; PC64LE-NEXT:    blr
3598;
3599; PC64LE9-LABEL: constrained_vector_log_v3f32:
3600; PC64LE9:       # %bb.0: # %entry
3601; PC64LE9-NEXT:    mflr 0
3602; PC64LE9-NEXT:    std 0, 16(1)
3603; PC64LE9-NEXT:    stdu 1, -64(1)
3604; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
3605; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
3606; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
3607; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
3608; PC64LE9-NEXT:    xscvspdpn 1, 0
3609; PC64LE9-NEXT:    vmr 31, 2
3610; PC64LE9-NEXT:    bl logf
3611; PC64LE9-NEXT:    nop
3612; PC64LE9-NEXT:    xxswapd 0, 63
3613; PC64LE9-NEXT:    fmr 31, 1
3614; PC64LE9-NEXT:    xscvspdpn 1, 0
3615; PC64LE9-NEXT:    bl logf
3616; PC64LE9-NEXT:    nop
3617; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
3618; PC64LE9-NEXT:    fmr 30, 1
3619; PC64LE9-NEXT:    xscvspdpn 1, 0
3620; PC64LE9-NEXT:    bl logf
3621; PC64LE9-NEXT:    nop
3622; PC64LE9-NEXT:    xscvdpspn 0, 1
3623; PC64LE9-NEXT:    xscvdpspn 1, 30
3624; PC64LE9-NEXT:    addis 3, 2, .LCPI62_0@toc@ha
3625; PC64LE9-NEXT:    xscvdpspn 36, 31
3626; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
3627; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
3628; PC64LE9-NEXT:    addi 3, 3, .LCPI62_0@toc@l
3629; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
3630; PC64LE9-NEXT:    lxv 35, 0(3)
3631; PC64LE9-NEXT:    xxmrghw 34, 1, 0
3632; PC64LE9-NEXT:    vperm 2, 4, 2, 3
3633; PC64LE9-NEXT:    addi 1, 1, 64
3634; PC64LE9-NEXT:    ld 0, 16(1)
3635; PC64LE9-NEXT:    mtlr 0
3636; PC64LE9-NEXT:    blr
3637entry:
3638  %log = call <3 x float> @llvm.experimental.constrained.log.v3f32(
3639                              <3 x float> %x,
3640                              metadata !"round.dynamic",
3641                              metadata !"fpexcept.strict") #1
3642  ret <3 x float> %log
3643}
3644
3645define <3 x double> @constrained_vector_log_v3f64(<3 x double> %x) #0 {
3646; PC64LE-LABEL: constrained_vector_log_v3f64:
3647; PC64LE:       # %bb.0: # %entry
3648; PC64LE-NEXT:    mflr 0
3649; PC64LE-NEXT:    std 0, 16(1)
3650; PC64LE-NEXT:    stdu 1, -80(1)
3651; PC64LE-NEXT:    li 3, 48
3652; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
3653; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
3654; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3655; PC64LE-NEXT:    fmr 31, 3
3656; PC64LE-NEXT:    fmr 30, 2
3657; PC64LE-NEXT:    bl log
3658; PC64LE-NEXT:    nop
3659; PC64LE-NEXT:    xxlor 63, 1, 1
3660; PC64LE-NEXT:    fmr 1, 30
3661; PC64LE-NEXT:    bl log
3662; PC64LE-NEXT:    nop
3663; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3664; PC64LE-NEXT:    xxmrghd 63, 1, 63
3665; PC64LE-NEXT:    fmr 1, 31
3666; PC64LE-NEXT:    bl log
3667; PC64LE-NEXT:    nop
3668; PC64LE-NEXT:    xxswapd 0, 63
3669; PC64LE-NEXT:    li 3, 48
3670; PC64LE-NEXT:    xxlor 2, 63, 63
3671; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
3672; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
3673; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3674; PC64LE-NEXT:    fmr 3, 1
3675; PC64LE-NEXT:    fmr 1, 0
3676; PC64LE-NEXT:    addi 1, 1, 80
3677; PC64LE-NEXT:    ld 0, 16(1)
3678; PC64LE-NEXT:    mtlr 0
3679; PC64LE-NEXT:    blr
3680;
3681; PC64LE9-LABEL: constrained_vector_log_v3f64:
3682; PC64LE9:       # %bb.0: # %entry
3683; PC64LE9-NEXT:    mflr 0
3684; PC64LE9-NEXT:    std 0, 16(1)
3685; PC64LE9-NEXT:    stdu 1, -64(1)
3686; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
3687; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
3688; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
3689; PC64LE9-NEXT:    fmr 31, 3
3690; PC64LE9-NEXT:    fmr 30, 2
3691; PC64LE9-NEXT:    bl log
3692; PC64LE9-NEXT:    nop
3693; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
3694; PC64LE9-NEXT:    fmr 1, 30
3695; PC64LE9-NEXT:    bl log
3696; PC64LE9-NEXT:    nop
3697; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3698; PC64LE9-NEXT:    xxmrghd 63, 1, 63
3699; PC64LE9-NEXT:    fmr 1, 31
3700; PC64LE9-NEXT:    bl log
3701; PC64LE9-NEXT:    nop
3702; PC64LE9-NEXT:    fmr 3, 1
3703; PC64LE9-NEXT:    xxswapd 1, 63
3704; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
3705; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
3706; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
3707; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3708; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
3709; PC64LE9-NEXT:    addi 1, 1, 64
3710; PC64LE9-NEXT:    ld 0, 16(1)
3711; PC64LE9-NEXT:    mtlr 0
3712; PC64LE9-NEXT:    blr
3713entry:
3714  %log = call <3 x double> @llvm.experimental.constrained.log.v3f64(
3715                          <3 x double> %x,
3716                          metadata !"round.dynamic",
3717                          metadata !"fpexcept.strict") #1
3718  ret <3 x double> %log
3719}
3720
3721define <4 x double> @constrained_vector_log_v4f64(<4 x double> %x) #0 {
3722; PC64LE-LABEL: constrained_vector_log_v4f64:
3723; PC64LE:       # %bb.0: # %entry
3724; PC64LE-NEXT:    mflr 0
3725; PC64LE-NEXT:    std 0, 16(1)
3726; PC64LE-NEXT:    stdu 1, -96(1)
3727; PC64LE-NEXT:    li 3, 48
3728; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
3729; PC64LE-NEXT:    li 3, 64
3730; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
3731; PC64LE-NEXT:    vmr 30, 2
3732; PC64LE-NEXT:    li 3, 80
3733; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3734; PC64LE-NEXT:    vmr 31, 3
3735; PC64LE-NEXT:    xxlor 1, 62, 62
3736; PC64LE-NEXT:    bl log
3737; PC64LE-NEXT:    nop
3738; PC64LE-NEXT:    xxlor 61, 1, 1
3739; PC64LE-NEXT:    xxswapd 1, 62
3740; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3741; PC64LE-NEXT:    bl log
3742; PC64LE-NEXT:    nop
3743; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3744; PC64LE-NEXT:    xxmrghd 62, 61, 1
3745; PC64LE-NEXT:    xxlor 1, 63, 63
3746; PC64LE-NEXT:    bl log
3747; PC64LE-NEXT:    nop
3748; PC64LE-NEXT:    xxlor 61, 1, 1
3749; PC64LE-NEXT:    xxswapd 1, 63
3750; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3751; PC64LE-NEXT:    bl log
3752; PC64LE-NEXT:    nop
3753; PC64LE-NEXT:    li 3, 80
3754; PC64LE-NEXT:    vmr 2, 30
3755; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3756; PC64LE-NEXT:    xxmrghd 35, 61, 1
3757; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3758; PC64LE-NEXT:    li 3, 64
3759; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
3760; PC64LE-NEXT:    li 3, 48
3761; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
3762; PC64LE-NEXT:    addi 1, 1, 96
3763; PC64LE-NEXT:    ld 0, 16(1)
3764; PC64LE-NEXT:    mtlr 0
3765; PC64LE-NEXT:    blr
3766;
3767; PC64LE9-LABEL: constrained_vector_log_v4f64:
3768; PC64LE9:       # %bb.0: # %entry
3769; PC64LE9-NEXT:    mflr 0
3770; PC64LE9-NEXT:    std 0, 16(1)
3771; PC64LE9-NEXT:    stdu 1, -80(1)
3772; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
3773; PC64LE9-NEXT:    vmr 30, 2
3774; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
3775; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
3776; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
3777; PC64LE9-NEXT:    vmr 31, 3
3778; PC64LE9-NEXT:    bl log
3779; PC64LE9-NEXT:    nop
3780; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
3781; PC64LE9-NEXT:    xxswapd 1, 62
3782; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3783; PC64LE9-NEXT:    bl log
3784; PC64LE9-NEXT:    nop
3785; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3786; PC64LE9-NEXT:    xxmrghd 62, 61, 1
3787; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
3788; PC64LE9-NEXT:    bl log
3789; PC64LE9-NEXT:    nop
3790; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
3791; PC64LE9-NEXT:    xxswapd 1, 63
3792; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3793; PC64LE9-NEXT:    bl log
3794; PC64LE9-NEXT:    nop
3795; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3796; PC64LE9-NEXT:    xxmrghd 35, 61, 1
3797; PC64LE9-NEXT:    vmr 2, 30
3798; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
3799; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
3800; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
3801; PC64LE9-NEXT:    addi 1, 1, 80
3802; PC64LE9-NEXT:    ld 0, 16(1)
3803; PC64LE9-NEXT:    mtlr 0
3804; PC64LE9-NEXT:    blr
3805entry:
3806  %log = call <4 x double> @llvm.experimental.constrained.log.v4f64(
3807                             <4 x double> %x,
3808                             metadata !"round.dynamic",
3809                             metadata !"fpexcept.strict") #1
3810  ret <4 x double> %log
3811}
3812
3813define <1 x float> @constrained_vector_log10_v1f32(<1 x float> %x) #0 {
3814; PC64LE-LABEL: constrained_vector_log10_v1f32:
3815; PC64LE:       # %bb.0: # %entry
3816; PC64LE-NEXT:    mflr 0
3817; PC64LE-NEXT:    std 0, 16(1)
3818; PC64LE-NEXT:    stdu 1, -32(1)
3819; PC64LE-NEXT:    bl log10f
3820; PC64LE-NEXT:    nop
3821; PC64LE-NEXT:    addi 1, 1, 32
3822; PC64LE-NEXT:    ld 0, 16(1)
3823; PC64LE-NEXT:    mtlr 0
3824; PC64LE-NEXT:    blr
3825;
3826; PC64LE9-LABEL: constrained_vector_log10_v1f32:
3827; PC64LE9:       # %bb.0: # %entry
3828; PC64LE9-NEXT:    mflr 0
3829; PC64LE9-NEXT:    std 0, 16(1)
3830; PC64LE9-NEXT:    stdu 1, -32(1)
3831; PC64LE9-NEXT:    bl log10f
3832; PC64LE9-NEXT:    nop
3833; PC64LE9-NEXT:    addi 1, 1, 32
3834; PC64LE9-NEXT:    ld 0, 16(1)
3835; PC64LE9-NEXT:    mtlr 0
3836; PC64LE9-NEXT:    blr
3837entry:
3838  %log10 = call <1 x float> @llvm.experimental.constrained.log10.v1f32(
3839                             <1 x float> %x,
3840                             metadata !"round.dynamic",
3841                             metadata !"fpexcept.strict") #1
3842  ret <1 x float> %log10
3843}
3844
3845define <2 x double> @constrained_vector_log10_v2f64(<2 x double> %x) #0 {
3846; PC64LE-LABEL: constrained_vector_log10_v2f64:
3847; PC64LE:       # %bb.0: # %entry
3848; PC64LE-NEXT:    mflr 0
3849; PC64LE-NEXT:    std 0, 16(1)
3850; PC64LE-NEXT:    stdu 1, -80(1)
3851; PC64LE-NEXT:    li 3, 48
3852; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
3853; PC64LE-NEXT:    li 3, 64
3854; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3855; PC64LE-NEXT:    vmr 31, 2
3856; PC64LE-NEXT:    xxlor 1, 63, 63
3857; PC64LE-NEXT:    bl log10
3858; PC64LE-NEXT:    nop
3859; PC64LE-NEXT:    xxlor 62, 1, 1
3860; PC64LE-NEXT:    xxswapd 1, 63
3861; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3862; PC64LE-NEXT:    bl log10
3863; PC64LE-NEXT:    nop
3864; PC64LE-NEXT:    li 3, 64
3865; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3866; PC64LE-NEXT:    xxmrghd 34, 62, 1
3867; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3868; PC64LE-NEXT:    li 3, 48
3869; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
3870; PC64LE-NEXT:    addi 1, 1, 80
3871; PC64LE-NEXT:    ld 0, 16(1)
3872; PC64LE-NEXT:    mtlr 0
3873; PC64LE-NEXT:    blr
3874;
3875; PC64LE9-LABEL: constrained_vector_log10_v2f64:
3876; PC64LE9:       # %bb.0: # %entry
3877; PC64LE9-NEXT:    mflr 0
3878; PC64LE9-NEXT:    std 0, 16(1)
3879; PC64LE9-NEXT:    stdu 1, -64(1)
3880; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
3881; PC64LE9-NEXT:    vmr 31, 2
3882; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
3883; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
3884; PC64LE9-NEXT:    bl log10
3885; PC64LE9-NEXT:    nop
3886; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
3887; PC64LE9-NEXT:    xxswapd 1, 63
3888; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
3889; PC64LE9-NEXT:    bl log10
3890; PC64LE9-NEXT:    nop
3891; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3892; PC64LE9-NEXT:    xxmrghd 34, 62, 1
3893; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
3894; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
3895; PC64LE9-NEXT:    addi 1, 1, 64
3896; PC64LE9-NEXT:    ld 0, 16(1)
3897; PC64LE9-NEXT:    mtlr 0
3898; PC64LE9-NEXT:    blr
3899entry:
3900  %log10 = call <2 x double> @llvm.experimental.constrained.log10.v2f64(
3901                               <2 x double> %x,
3902                               metadata !"round.dynamic",
3903                               metadata !"fpexcept.strict") #1
3904  ret <2 x double> %log10
3905}
3906
3907define <3 x float> @constrained_vector_log10_v3f32(<3 x float> %x) #0 {
3908; PC64LE-LABEL: constrained_vector_log10_v3f32:
3909; PC64LE:       # %bb.0: # %entry
3910; PC64LE-NEXT:    mflr 0
3911; PC64LE-NEXT:    std 0, 16(1)
3912; PC64LE-NEXT:    stdu 1, -80(1)
3913; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
3914; PC64LE-NEXT:    li 3, 48
3915; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
3916; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
3917; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
3918; PC64LE-NEXT:    vmr 31, 2
3919; PC64LE-NEXT:    xscvspdpn 1, 0
3920; PC64LE-NEXT:    bl log10f
3921; PC64LE-NEXT:    nop
3922; PC64LE-NEXT:    xxswapd 0, 63
3923; PC64LE-NEXT:    fmr 31, 1
3924; PC64LE-NEXT:    xscvspdpn 1, 0
3925; PC64LE-NEXT:    bl log10f
3926; PC64LE-NEXT:    nop
3927; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
3928; PC64LE-NEXT:    fmr 30, 1
3929; PC64LE-NEXT:    xscvspdpn 1, 0
3930; PC64LE-NEXT:    bl log10f
3931; PC64LE-NEXT:    nop
3932; PC64LE-NEXT:    xscvdpspn 0, 30
3933; PC64LE-NEXT:    addis 3, 2, .LCPI67_0@toc@ha
3934; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
3935; PC64LE-NEXT:    xscvdpspn 1, 1
3936; PC64LE-NEXT:    addi 3, 3, .LCPI67_0@toc@l
3937; PC64LE-NEXT:    xscvdpspn 34, 31
3938; PC64LE-NEXT:    lvx 4, 0, 3
3939; PC64LE-NEXT:    li 3, 48
3940; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
3941; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
3942; PC64LE-NEXT:    xxmrghw 35, 0, 1
3943; PC64LE-NEXT:    vperm 2, 2, 3, 4
3944; PC64LE-NEXT:    addi 1, 1, 80
3945; PC64LE-NEXT:    ld 0, 16(1)
3946; PC64LE-NEXT:    mtlr 0
3947; PC64LE-NEXT:    blr
3948;
3949; PC64LE9-LABEL: constrained_vector_log10_v3f32:
3950; PC64LE9:       # %bb.0: # %entry
3951; PC64LE9-NEXT:    mflr 0
3952; PC64LE9-NEXT:    std 0, 16(1)
3953; PC64LE9-NEXT:    stdu 1, -64(1)
3954; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
3955; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
3956; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
3957; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
3958; PC64LE9-NEXT:    xscvspdpn 1, 0
3959; PC64LE9-NEXT:    vmr 31, 2
3960; PC64LE9-NEXT:    bl log10f
3961; PC64LE9-NEXT:    nop
3962; PC64LE9-NEXT:    xxswapd 0, 63
3963; PC64LE9-NEXT:    fmr 31, 1
3964; PC64LE9-NEXT:    xscvspdpn 1, 0
3965; PC64LE9-NEXT:    bl log10f
3966; PC64LE9-NEXT:    nop
3967; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
3968; PC64LE9-NEXT:    fmr 30, 1
3969; PC64LE9-NEXT:    xscvspdpn 1, 0
3970; PC64LE9-NEXT:    bl log10f
3971; PC64LE9-NEXT:    nop
3972; PC64LE9-NEXT:    xscvdpspn 0, 1
3973; PC64LE9-NEXT:    xscvdpspn 1, 30
3974; PC64LE9-NEXT:    addis 3, 2, .LCPI67_0@toc@ha
3975; PC64LE9-NEXT:    xscvdpspn 36, 31
3976; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
3977; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
3978; PC64LE9-NEXT:    addi 3, 3, .LCPI67_0@toc@l
3979; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
3980; PC64LE9-NEXT:    lxv 35, 0(3)
3981; PC64LE9-NEXT:    xxmrghw 34, 1, 0
3982; PC64LE9-NEXT:    vperm 2, 4, 2, 3
3983; PC64LE9-NEXT:    addi 1, 1, 64
3984; PC64LE9-NEXT:    ld 0, 16(1)
3985; PC64LE9-NEXT:    mtlr 0
3986; PC64LE9-NEXT:    blr
3987entry:
3988  %log10 = call <3 x float> @llvm.experimental.constrained.log10.v3f32(
3989                              <3 x float> %x,
3990                              metadata !"round.dynamic",
3991                              metadata !"fpexcept.strict") #1
3992  ret <3 x float> %log10
3993}
3994
3995define <3 x double> @constrained_vector_log10_v3f64(<3 x double> %x) #0 {
3996; PC64LE-LABEL: constrained_vector_log10_v3f64:
3997; PC64LE:       # %bb.0: # %entry
3998; PC64LE-NEXT:    mflr 0
3999; PC64LE-NEXT:    std 0, 16(1)
4000; PC64LE-NEXT:    stdu 1, -80(1)
4001; PC64LE-NEXT:    li 3, 48
4002; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
4003; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
4004; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4005; PC64LE-NEXT:    fmr 31, 3
4006; PC64LE-NEXT:    fmr 30, 2
4007; PC64LE-NEXT:    bl log10
4008; PC64LE-NEXT:    nop
4009; PC64LE-NEXT:    xxlor 63, 1, 1
4010; PC64LE-NEXT:    fmr 1, 30
4011; PC64LE-NEXT:    bl log10
4012; PC64LE-NEXT:    nop
4013; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4014; PC64LE-NEXT:    xxmrghd 63, 1, 63
4015; PC64LE-NEXT:    fmr 1, 31
4016; PC64LE-NEXT:    bl log10
4017; PC64LE-NEXT:    nop
4018; PC64LE-NEXT:    xxswapd 0, 63
4019; PC64LE-NEXT:    li 3, 48
4020; PC64LE-NEXT:    xxlor 2, 63, 63
4021; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
4022; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
4023; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4024; PC64LE-NEXT:    fmr 3, 1
4025; PC64LE-NEXT:    fmr 1, 0
4026; PC64LE-NEXT:    addi 1, 1, 80
4027; PC64LE-NEXT:    ld 0, 16(1)
4028; PC64LE-NEXT:    mtlr 0
4029; PC64LE-NEXT:    blr
4030;
4031; PC64LE9-LABEL: constrained_vector_log10_v3f64:
4032; PC64LE9:       # %bb.0: # %entry
4033; PC64LE9-NEXT:    mflr 0
4034; PC64LE9-NEXT:    std 0, 16(1)
4035; PC64LE9-NEXT:    stdu 1, -64(1)
4036; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
4037; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
4038; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
4039; PC64LE9-NEXT:    fmr 31, 3
4040; PC64LE9-NEXT:    fmr 30, 2
4041; PC64LE9-NEXT:    bl log10
4042; PC64LE9-NEXT:    nop
4043; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
4044; PC64LE9-NEXT:    fmr 1, 30
4045; PC64LE9-NEXT:    bl log10
4046; PC64LE9-NEXT:    nop
4047; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4048; PC64LE9-NEXT:    xxmrghd 63, 1, 63
4049; PC64LE9-NEXT:    fmr 1, 31
4050; PC64LE9-NEXT:    bl log10
4051; PC64LE9-NEXT:    nop
4052; PC64LE9-NEXT:    fmr 3, 1
4053; PC64LE9-NEXT:    xxswapd 1, 63
4054; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
4055; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
4056; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
4057; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4058; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
4059; PC64LE9-NEXT:    addi 1, 1, 64
4060; PC64LE9-NEXT:    ld 0, 16(1)
4061; PC64LE9-NEXT:    mtlr 0
4062; PC64LE9-NEXT:    blr
4063entry:
4064  %log10 = call <3 x double> @llvm.experimental.constrained.log10.v3f64(
4065                          <3 x double> %x,
4066                          metadata !"round.dynamic",
4067                          metadata !"fpexcept.strict") #1
4068  ret <3 x double> %log10
4069}
4070
4071define <4 x double> @constrained_vector_log10_v4f64(<4 x double> %x) #0 {
4072; PC64LE-LABEL: constrained_vector_log10_v4f64:
4073; PC64LE:       # %bb.0: # %entry
4074; PC64LE-NEXT:    mflr 0
4075; PC64LE-NEXT:    std 0, 16(1)
4076; PC64LE-NEXT:    stdu 1, -96(1)
4077; PC64LE-NEXT:    li 3, 48
4078; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
4079; PC64LE-NEXT:    li 3, 64
4080; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
4081; PC64LE-NEXT:    vmr 30, 2
4082; PC64LE-NEXT:    li 3, 80
4083; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4084; PC64LE-NEXT:    vmr 31, 3
4085; PC64LE-NEXT:    xxlor 1, 62, 62
4086; PC64LE-NEXT:    bl log10
4087; PC64LE-NEXT:    nop
4088; PC64LE-NEXT:    xxlor 61, 1, 1
4089; PC64LE-NEXT:    xxswapd 1, 62
4090; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4091; PC64LE-NEXT:    bl log10
4092; PC64LE-NEXT:    nop
4093; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4094; PC64LE-NEXT:    xxmrghd 62, 61, 1
4095; PC64LE-NEXT:    xxlor 1, 63, 63
4096; PC64LE-NEXT:    bl log10
4097; PC64LE-NEXT:    nop
4098; PC64LE-NEXT:    xxlor 61, 1, 1
4099; PC64LE-NEXT:    xxswapd 1, 63
4100; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4101; PC64LE-NEXT:    bl log10
4102; PC64LE-NEXT:    nop
4103; PC64LE-NEXT:    li 3, 80
4104; PC64LE-NEXT:    vmr 2, 30
4105; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4106; PC64LE-NEXT:    xxmrghd 35, 61, 1
4107; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4108; PC64LE-NEXT:    li 3, 64
4109; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
4110; PC64LE-NEXT:    li 3, 48
4111; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
4112; PC64LE-NEXT:    addi 1, 1, 96
4113; PC64LE-NEXT:    ld 0, 16(1)
4114; PC64LE-NEXT:    mtlr 0
4115; PC64LE-NEXT:    blr
4116;
4117; PC64LE9-LABEL: constrained_vector_log10_v4f64:
4118; PC64LE9:       # %bb.0: # %entry
4119; PC64LE9-NEXT:    mflr 0
4120; PC64LE9-NEXT:    std 0, 16(1)
4121; PC64LE9-NEXT:    stdu 1, -80(1)
4122; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
4123; PC64LE9-NEXT:    vmr 30, 2
4124; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
4125; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
4126; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
4127; PC64LE9-NEXT:    vmr 31, 3
4128; PC64LE9-NEXT:    bl log10
4129; PC64LE9-NEXT:    nop
4130; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
4131; PC64LE9-NEXT:    xxswapd 1, 62
4132; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4133; PC64LE9-NEXT:    bl log10
4134; PC64LE9-NEXT:    nop
4135; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4136; PC64LE9-NEXT:    xxmrghd 62, 61, 1
4137; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
4138; PC64LE9-NEXT:    bl log10
4139; PC64LE9-NEXT:    nop
4140; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
4141; PC64LE9-NEXT:    xxswapd 1, 63
4142; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4143; PC64LE9-NEXT:    bl log10
4144; PC64LE9-NEXT:    nop
4145; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4146; PC64LE9-NEXT:    xxmrghd 35, 61, 1
4147; PC64LE9-NEXT:    vmr 2, 30
4148; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
4149; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
4150; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
4151; PC64LE9-NEXT:    addi 1, 1, 80
4152; PC64LE9-NEXT:    ld 0, 16(1)
4153; PC64LE9-NEXT:    mtlr 0
4154; PC64LE9-NEXT:    blr
4155entry:
4156  %log10 = call <4 x double> @llvm.experimental.constrained.log10.v4f64(
4157                               <4 x double> %x,
4158                               metadata !"round.dynamic",
4159                               metadata !"fpexcept.strict") #1
4160  ret <4 x double> %log10
4161}
4162
4163define <1 x float> @constrained_vector_log2_v1f32(<1 x float> %x) #0 {
4164; PC64LE-LABEL: constrained_vector_log2_v1f32:
4165; PC64LE:       # %bb.0: # %entry
4166; PC64LE-NEXT:    mflr 0
4167; PC64LE-NEXT:    std 0, 16(1)
4168; PC64LE-NEXT:    stdu 1, -32(1)
4169; PC64LE-NEXT:    bl log2f
4170; PC64LE-NEXT:    nop
4171; PC64LE-NEXT:    addi 1, 1, 32
4172; PC64LE-NEXT:    ld 0, 16(1)
4173; PC64LE-NEXT:    mtlr 0
4174; PC64LE-NEXT:    blr
4175;
4176; PC64LE9-LABEL: constrained_vector_log2_v1f32:
4177; PC64LE9:       # %bb.0: # %entry
4178; PC64LE9-NEXT:    mflr 0
4179; PC64LE9-NEXT:    std 0, 16(1)
4180; PC64LE9-NEXT:    stdu 1, -32(1)
4181; PC64LE9-NEXT:    bl log2f
4182; PC64LE9-NEXT:    nop
4183; PC64LE9-NEXT:    addi 1, 1, 32
4184; PC64LE9-NEXT:    ld 0, 16(1)
4185; PC64LE9-NEXT:    mtlr 0
4186; PC64LE9-NEXT:    blr
4187entry:
4188  %log2 = call <1 x float> @llvm.experimental.constrained.log2.v1f32(
4189                             <1 x float> %x,
4190                             metadata !"round.dynamic",
4191                             metadata !"fpexcept.strict") #1
4192  ret <1 x float> %log2
4193}
4194
4195define <2 x double> @constrained_vector_log2_v2f64(<2 x double> %x) #0 {
4196; PC64LE-LABEL: constrained_vector_log2_v2f64:
4197; PC64LE:       # %bb.0: # %entry
4198; PC64LE-NEXT:    mflr 0
4199; PC64LE-NEXT:    std 0, 16(1)
4200; PC64LE-NEXT:    stdu 1, -80(1)
4201; PC64LE-NEXT:    li 3, 48
4202; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
4203; PC64LE-NEXT:    li 3, 64
4204; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4205; PC64LE-NEXT:    vmr 31, 2
4206; PC64LE-NEXT:    xxlor 1, 63, 63
4207; PC64LE-NEXT:    bl log2
4208; PC64LE-NEXT:    nop
4209; PC64LE-NEXT:    xxlor 62, 1, 1
4210; PC64LE-NEXT:    xxswapd 1, 63
4211; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4212; PC64LE-NEXT:    bl log2
4213; PC64LE-NEXT:    nop
4214; PC64LE-NEXT:    li 3, 64
4215; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4216; PC64LE-NEXT:    xxmrghd 34, 62, 1
4217; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4218; PC64LE-NEXT:    li 3, 48
4219; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
4220; PC64LE-NEXT:    addi 1, 1, 80
4221; PC64LE-NEXT:    ld 0, 16(1)
4222; PC64LE-NEXT:    mtlr 0
4223; PC64LE-NEXT:    blr
4224;
4225; PC64LE9-LABEL: constrained_vector_log2_v2f64:
4226; PC64LE9:       # %bb.0: # %entry
4227; PC64LE9-NEXT:    mflr 0
4228; PC64LE9-NEXT:    std 0, 16(1)
4229; PC64LE9-NEXT:    stdu 1, -64(1)
4230; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
4231; PC64LE9-NEXT:    vmr 31, 2
4232; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
4233; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
4234; PC64LE9-NEXT:    bl log2
4235; PC64LE9-NEXT:    nop
4236; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
4237; PC64LE9-NEXT:    xxswapd 1, 63
4238; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4239; PC64LE9-NEXT:    bl log2
4240; PC64LE9-NEXT:    nop
4241; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4242; PC64LE9-NEXT:    xxmrghd 34, 62, 1
4243; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
4244; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
4245; PC64LE9-NEXT:    addi 1, 1, 64
4246; PC64LE9-NEXT:    ld 0, 16(1)
4247; PC64LE9-NEXT:    mtlr 0
4248; PC64LE9-NEXT:    blr
4249entry:
4250  %log2 = call <2 x double> @llvm.experimental.constrained.log2.v2f64(
4251                              <2 x double> %x,
4252                              metadata !"round.dynamic",
4253                              metadata !"fpexcept.strict") #1
4254  ret <2 x double> %log2
4255}
4256
4257define <3 x float> @constrained_vector_log2_v3f32(<3 x float> %x) #0 {
4258; PC64LE-LABEL: constrained_vector_log2_v3f32:
4259; PC64LE:       # %bb.0: # %entry
4260; PC64LE-NEXT:    mflr 0
4261; PC64LE-NEXT:    std 0, 16(1)
4262; PC64LE-NEXT:    stdu 1, -80(1)
4263; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
4264; PC64LE-NEXT:    li 3, 48
4265; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
4266; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
4267; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4268; PC64LE-NEXT:    vmr 31, 2
4269; PC64LE-NEXT:    xscvspdpn 1, 0
4270; PC64LE-NEXT:    bl log2f
4271; PC64LE-NEXT:    nop
4272; PC64LE-NEXT:    xxswapd 0, 63
4273; PC64LE-NEXT:    fmr 31, 1
4274; PC64LE-NEXT:    xscvspdpn 1, 0
4275; PC64LE-NEXT:    bl log2f
4276; PC64LE-NEXT:    nop
4277; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
4278; PC64LE-NEXT:    fmr 30, 1
4279; PC64LE-NEXT:    xscvspdpn 1, 0
4280; PC64LE-NEXT:    bl log2f
4281; PC64LE-NEXT:    nop
4282; PC64LE-NEXT:    xscvdpspn 0, 30
4283; PC64LE-NEXT:    addis 3, 2, .LCPI72_0@toc@ha
4284; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
4285; PC64LE-NEXT:    xscvdpspn 1, 1
4286; PC64LE-NEXT:    addi 3, 3, .LCPI72_0@toc@l
4287; PC64LE-NEXT:    xscvdpspn 34, 31
4288; PC64LE-NEXT:    lvx 4, 0, 3
4289; PC64LE-NEXT:    li 3, 48
4290; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
4291; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4292; PC64LE-NEXT:    xxmrghw 35, 0, 1
4293; PC64LE-NEXT:    vperm 2, 2, 3, 4
4294; PC64LE-NEXT:    addi 1, 1, 80
4295; PC64LE-NEXT:    ld 0, 16(1)
4296; PC64LE-NEXT:    mtlr 0
4297; PC64LE-NEXT:    blr
4298;
4299; PC64LE9-LABEL: constrained_vector_log2_v3f32:
4300; PC64LE9:       # %bb.0: # %entry
4301; PC64LE9-NEXT:    mflr 0
4302; PC64LE9-NEXT:    std 0, 16(1)
4303; PC64LE9-NEXT:    stdu 1, -64(1)
4304; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
4305; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
4306; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
4307; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
4308; PC64LE9-NEXT:    xscvspdpn 1, 0
4309; PC64LE9-NEXT:    vmr 31, 2
4310; PC64LE9-NEXT:    bl log2f
4311; PC64LE9-NEXT:    nop
4312; PC64LE9-NEXT:    xxswapd 0, 63
4313; PC64LE9-NEXT:    fmr 31, 1
4314; PC64LE9-NEXT:    xscvspdpn 1, 0
4315; PC64LE9-NEXT:    bl log2f
4316; PC64LE9-NEXT:    nop
4317; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
4318; PC64LE9-NEXT:    fmr 30, 1
4319; PC64LE9-NEXT:    xscvspdpn 1, 0
4320; PC64LE9-NEXT:    bl log2f
4321; PC64LE9-NEXT:    nop
4322; PC64LE9-NEXT:    xscvdpspn 0, 1
4323; PC64LE9-NEXT:    xscvdpspn 1, 30
4324; PC64LE9-NEXT:    addis 3, 2, .LCPI72_0@toc@ha
4325; PC64LE9-NEXT:    xscvdpspn 36, 31
4326; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
4327; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
4328; PC64LE9-NEXT:    addi 3, 3, .LCPI72_0@toc@l
4329; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
4330; PC64LE9-NEXT:    lxv 35, 0(3)
4331; PC64LE9-NEXT:    xxmrghw 34, 1, 0
4332; PC64LE9-NEXT:    vperm 2, 4, 2, 3
4333; PC64LE9-NEXT:    addi 1, 1, 64
4334; PC64LE9-NEXT:    ld 0, 16(1)
4335; PC64LE9-NEXT:    mtlr 0
4336; PC64LE9-NEXT:    blr
4337entry:
4338  %log2 = call <3 x float> @llvm.experimental.constrained.log2.v3f32(
4339                              <3 x float> %x,
4340                              metadata !"round.dynamic",
4341                              metadata !"fpexcept.strict") #1
4342  ret <3 x float> %log2
4343}
4344
4345define <3 x double> @constrained_vector_log2_v3f64(<3 x double> %x) #0 {
4346; PC64LE-LABEL: constrained_vector_log2_v3f64:
4347; PC64LE:       # %bb.0: # %entry
4348; PC64LE-NEXT:    mflr 0
4349; PC64LE-NEXT:    std 0, 16(1)
4350; PC64LE-NEXT:    stdu 1, -80(1)
4351; PC64LE-NEXT:    li 3, 48
4352; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
4353; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
4354; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4355; PC64LE-NEXT:    fmr 31, 3
4356; PC64LE-NEXT:    fmr 30, 2
4357; PC64LE-NEXT:    bl log2
4358; PC64LE-NEXT:    nop
4359; PC64LE-NEXT:    xxlor 63, 1, 1
4360; PC64LE-NEXT:    fmr 1, 30
4361; PC64LE-NEXT:    bl log2
4362; PC64LE-NEXT:    nop
4363; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4364; PC64LE-NEXT:    xxmrghd 63, 1, 63
4365; PC64LE-NEXT:    fmr 1, 31
4366; PC64LE-NEXT:    bl log2
4367; PC64LE-NEXT:    nop
4368; PC64LE-NEXT:    xxswapd 0, 63
4369; PC64LE-NEXT:    li 3, 48
4370; PC64LE-NEXT:    xxlor 2, 63, 63
4371; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
4372; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
4373; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4374; PC64LE-NEXT:    fmr 3, 1
4375; PC64LE-NEXT:    fmr 1, 0
4376; PC64LE-NEXT:    addi 1, 1, 80
4377; PC64LE-NEXT:    ld 0, 16(1)
4378; PC64LE-NEXT:    mtlr 0
4379; PC64LE-NEXT:    blr
4380;
4381; PC64LE9-LABEL: constrained_vector_log2_v3f64:
4382; PC64LE9:       # %bb.0: # %entry
4383; PC64LE9-NEXT:    mflr 0
4384; PC64LE9-NEXT:    std 0, 16(1)
4385; PC64LE9-NEXT:    stdu 1, -64(1)
4386; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
4387; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
4388; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
4389; PC64LE9-NEXT:    fmr 31, 3
4390; PC64LE9-NEXT:    fmr 30, 2
4391; PC64LE9-NEXT:    bl log2
4392; PC64LE9-NEXT:    nop
4393; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
4394; PC64LE9-NEXT:    fmr 1, 30
4395; PC64LE9-NEXT:    bl log2
4396; PC64LE9-NEXT:    nop
4397; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4398; PC64LE9-NEXT:    xxmrghd 63, 1, 63
4399; PC64LE9-NEXT:    fmr 1, 31
4400; PC64LE9-NEXT:    bl log2
4401; PC64LE9-NEXT:    nop
4402; PC64LE9-NEXT:    fmr 3, 1
4403; PC64LE9-NEXT:    xxswapd 1, 63
4404; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
4405; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
4406; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
4407; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4408; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
4409; PC64LE9-NEXT:    addi 1, 1, 64
4410; PC64LE9-NEXT:    ld 0, 16(1)
4411; PC64LE9-NEXT:    mtlr 0
4412; PC64LE9-NEXT:    blr
4413entry:
4414  %log2 = call <3 x double> @llvm.experimental.constrained.log2.v3f64(
4415                          <3 x double> %x,
4416                          metadata !"round.dynamic",
4417                          metadata !"fpexcept.strict") #1
4418  ret <3 x double> %log2
4419}
4420
4421define <4 x double> @constrained_vector_log2_v4f64(<4 x double> %x) #0 {
4422; PC64LE-LABEL: constrained_vector_log2_v4f64:
4423; PC64LE:       # %bb.0: # %entry
4424; PC64LE-NEXT:    mflr 0
4425; PC64LE-NEXT:    std 0, 16(1)
4426; PC64LE-NEXT:    stdu 1, -96(1)
4427; PC64LE-NEXT:    li 3, 48
4428; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
4429; PC64LE-NEXT:    li 3, 64
4430; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
4431; PC64LE-NEXT:    vmr 30, 2
4432; PC64LE-NEXT:    li 3, 80
4433; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4434; PC64LE-NEXT:    vmr 31, 3
4435; PC64LE-NEXT:    xxlor 1, 62, 62
4436; PC64LE-NEXT:    bl log2
4437; PC64LE-NEXT:    nop
4438; PC64LE-NEXT:    xxlor 61, 1, 1
4439; PC64LE-NEXT:    xxswapd 1, 62
4440; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4441; PC64LE-NEXT:    bl log2
4442; PC64LE-NEXT:    nop
4443; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4444; PC64LE-NEXT:    xxmrghd 62, 61, 1
4445; PC64LE-NEXT:    xxlor 1, 63, 63
4446; PC64LE-NEXT:    bl log2
4447; PC64LE-NEXT:    nop
4448; PC64LE-NEXT:    xxlor 61, 1, 1
4449; PC64LE-NEXT:    xxswapd 1, 63
4450; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4451; PC64LE-NEXT:    bl log2
4452; PC64LE-NEXT:    nop
4453; PC64LE-NEXT:    li 3, 80
4454; PC64LE-NEXT:    vmr 2, 30
4455; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4456; PC64LE-NEXT:    xxmrghd 35, 61, 1
4457; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4458; PC64LE-NEXT:    li 3, 64
4459; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
4460; PC64LE-NEXT:    li 3, 48
4461; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
4462; PC64LE-NEXT:    addi 1, 1, 96
4463; PC64LE-NEXT:    ld 0, 16(1)
4464; PC64LE-NEXT:    mtlr 0
4465; PC64LE-NEXT:    blr
4466;
4467; PC64LE9-LABEL: constrained_vector_log2_v4f64:
4468; PC64LE9:       # %bb.0: # %entry
4469; PC64LE9-NEXT:    mflr 0
4470; PC64LE9-NEXT:    std 0, 16(1)
4471; PC64LE9-NEXT:    stdu 1, -80(1)
4472; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
4473; PC64LE9-NEXT:    vmr 30, 2
4474; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
4475; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
4476; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
4477; PC64LE9-NEXT:    vmr 31, 3
4478; PC64LE9-NEXT:    bl log2
4479; PC64LE9-NEXT:    nop
4480; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
4481; PC64LE9-NEXT:    xxswapd 1, 62
4482; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4483; PC64LE9-NEXT:    bl log2
4484; PC64LE9-NEXT:    nop
4485; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4486; PC64LE9-NEXT:    xxmrghd 62, 61, 1
4487; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
4488; PC64LE9-NEXT:    bl log2
4489; PC64LE9-NEXT:    nop
4490; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
4491; PC64LE9-NEXT:    xxswapd 1, 63
4492; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4493; PC64LE9-NEXT:    bl log2
4494; PC64LE9-NEXT:    nop
4495; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4496; PC64LE9-NEXT:    xxmrghd 35, 61, 1
4497; PC64LE9-NEXT:    vmr 2, 30
4498; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
4499; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
4500; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
4501; PC64LE9-NEXT:    addi 1, 1, 80
4502; PC64LE9-NEXT:    ld 0, 16(1)
4503; PC64LE9-NEXT:    mtlr 0
4504; PC64LE9-NEXT:    blr
4505entry:
4506  %log2 = call <4 x double> @llvm.experimental.constrained.log2.v4f64(
4507                              <4 x double> %x,
4508                              metadata !"round.dynamic",
4509                              metadata !"fpexcept.strict") #1
4510  ret <4 x double> %log2
4511}
4512
4513define <1 x float> @constrained_vector_rint_v1f32(<1 x float> %x) #0 {
4514; PC64LE-LABEL: constrained_vector_rint_v1f32:
4515; PC64LE:       # %bb.0: # %entry
4516; PC64LE-NEXT:    xsrdpic 1, 1
4517; PC64LE-NEXT:    blr
4518;
4519; PC64LE9-LABEL: constrained_vector_rint_v1f32:
4520; PC64LE9:       # %bb.0: # %entry
4521; PC64LE9-NEXT:    xsrdpic 1, 1
4522; PC64LE9-NEXT:    blr
4523entry:
4524  %rint = call <1 x float> @llvm.experimental.constrained.rint.v1f32(
4525                             <1 x float> %x,
4526                             metadata !"round.dynamic",
4527                             metadata !"fpexcept.strict") #1
4528  ret <1 x float> %rint
4529}
4530
4531define <2 x double> @constrained_vector_rint_v2f64(<2 x double> %x) #0 {
4532; PC64LE-LABEL: constrained_vector_rint_v2f64:
4533; PC64LE:       # %bb.0: # %entry
4534; PC64LE-NEXT:    xvrdpic 34, 34
4535; PC64LE-NEXT:    blr
4536;
4537; PC64LE9-LABEL: constrained_vector_rint_v2f64:
4538; PC64LE9:       # %bb.0: # %entry
4539; PC64LE9-NEXT:    xvrdpic 34, 34
4540; PC64LE9-NEXT:    blr
4541entry:
4542  %rint = call <2 x double> @llvm.experimental.constrained.rint.v2f64(
4543                        <2 x double> %x,
4544                        metadata !"round.dynamic",
4545                        metadata !"fpexcept.strict") #1
4546  ret <2 x double> %rint
4547}
4548
4549define <3 x float> @constrained_vector_rint_v3f32(<3 x float> %x) #0 {
4550; PC64LE-LABEL: constrained_vector_rint_v3f32:
4551; PC64LE:       # %bb.0: # %entry
4552; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
4553; PC64LE-NEXT:    xxswapd 1, 34
4554; PC64LE-NEXT:    addis 3, 2, .LCPI77_0@toc@ha
4555; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
4556; PC64LE-NEXT:    addi 3, 3, .LCPI77_0@toc@l
4557; PC64LE-NEXT:    lvx 4, 0, 3
4558; PC64LE-NEXT:    xscvspdpn 0, 0
4559; PC64LE-NEXT:    xscvspdpn 1, 1
4560; PC64LE-NEXT:    xscvspdpn 2, 2
4561; PC64LE-NEXT:    xsrdpic 0, 0
4562; PC64LE-NEXT:    xsrdpic 1, 1
4563; PC64LE-NEXT:    xsrdpic 2, 2
4564; PC64LE-NEXT:    xscvdpspn 0, 0
4565; PC64LE-NEXT:    xscvdpspn 1, 1
4566; PC64LE-NEXT:    xscvdpspn 34, 2
4567; PC64LE-NEXT:    xxmrghw 35, 1, 0
4568; PC64LE-NEXT:    vperm 2, 2, 3, 4
4569; PC64LE-NEXT:    blr
4570;
4571; PC64LE9-LABEL: constrained_vector_rint_v3f32:
4572; PC64LE9:       # %bb.0: # %entry
4573; PC64LE9-NEXT:    xxswapd 1, 34
4574; PC64LE9-NEXT:    xxsldwi 2, 34, 34, 3
4575; PC64LE9-NEXT:    addis 3, 2, .LCPI77_0@toc@ha
4576; PC64LE9-NEXT:    addi 3, 3, .LCPI77_0@toc@l
4577; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
4578; PC64LE9-NEXT:    xscvspdpn 1, 1
4579; PC64LE9-NEXT:    xscvspdpn 2, 2
4580; PC64LE9-NEXT:    xscvspdpn 0, 0
4581; PC64LE9-NEXT:    lxv 35, 0(3)
4582; PC64LE9-NEXT:    xsrdpic 1, 1
4583; PC64LE9-NEXT:    xsrdpic 2, 2
4584; PC64LE9-NEXT:    xsrdpic 0, 0
4585; PC64LE9-NEXT:    xscvdpspn 2, 2
4586; PC64LE9-NEXT:    xscvdpspn 1, 1
4587; PC64LE9-NEXT:    xscvdpspn 36, 0
4588; PC64LE9-NEXT:    xxmrghw 34, 1, 2
4589; PC64LE9-NEXT:    vperm 2, 4, 2, 3
4590; PC64LE9-NEXT:    blr
4591 entry:
4592  %rint = call <3 x float> @llvm.experimental.constrained.rint.v3f32(
4593                              <3 x float> %x,
4594                              metadata !"round.dynamic",
4595                              metadata !"fpexcept.strict") #1
4596  ret <3 x float> %rint
4597}
4598
4599define <3 x double> @constrained_vector_rint_v3f64(<3 x double> %x) #0 {
4600; PC64LE-LABEL: constrained_vector_rint_v3f64:
4601; PC64LE:       # %bb.0: # %entry
4602; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4603; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4604; PC64LE-NEXT:    xxmrghd 0, 2, 1
4605; PC64LE-NEXT:    xsrdpic 3, 3
4606; PC64LE-NEXT:    xvrdpic 2, 0
4607; PC64LE-NEXT:    xxswapd 1, 2
4608; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
4609; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4610; PC64LE-NEXT:    blr
4611;
4612; PC64LE9-LABEL: constrained_vector_rint_v3f64:
4613; PC64LE9:       # %bb.0: # %entry
4614; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4615; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4616; PC64LE9-NEXT:    xxmrghd 0, 2, 1
4617; PC64LE9-NEXT:    xsrdpic 3, 3
4618; PC64LE9-NEXT:    xvrdpic 2, 0
4619; PC64LE9-NEXT:    xxswapd 1, 2
4620; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4621; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
4622; PC64LE9-NEXT:    blr
4623entry:
4624  %rint = call <3 x double> @llvm.experimental.constrained.rint.v3f64(
4625                          <3 x double> %x,
4626                          metadata !"round.dynamic",
4627                          metadata !"fpexcept.strict") #1
4628  ret <3 x double> %rint
4629}
4630
4631define <4 x double> @constrained_vector_rint_v4f64(<4 x double> %x) #0 {
4632; PC64LE-LABEL: constrained_vector_rint_v4f64:
4633; PC64LE:       # %bb.0: # %entry
4634; PC64LE-NEXT:    xvrdpic 35, 35
4635; PC64LE-NEXT:    xvrdpic 34, 34
4636; PC64LE-NEXT:    blr
4637;
4638; PC64LE9-LABEL: constrained_vector_rint_v4f64:
4639; PC64LE9:       # %bb.0: # %entry
4640; PC64LE9-NEXT:    xvrdpic 35, 35
4641; PC64LE9-NEXT:    xvrdpic 34, 34
4642; PC64LE9-NEXT:    blr
4643entry:
4644  %rint = call <4 x double> @llvm.experimental.constrained.rint.v4f64(
4645                        <4 x double> %x,
4646                        metadata !"round.dynamic",
4647                        metadata !"fpexcept.strict") #1
4648  ret <4 x double> %rint
4649}
4650
4651define <1 x float> @constrained_vector_nearbyint_v1f32(<1 x float> %x) #0 {
4652; PC64LE-LABEL: constrained_vector_nearbyint_v1f32:
4653; PC64LE:       # %bb.0: # %entry
4654; PC64LE-NEXT:    mflr 0
4655; PC64LE-NEXT:    std 0, 16(1)
4656; PC64LE-NEXT:    stdu 1, -32(1)
4657; PC64LE-NEXT:    bl nearbyintf
4658; PC64LE-NEXT:    nop
4659; PC64LE-NEXT:    addi 1, 1, 32
4660; PC64LE-NEXT:    ld 0, 16(1)
4661; PC64LE-NEXT:    mtlr 0
4662; PC64LE-NEXT:    blr
4663;
4664; PC64LE9-LABEL: constrained_vector_nearbyint_v1f32:
4665; PC64LE9:       # %bb.0: # %entry
4666; PC64LE9-NEXT:    mflr 0
4667; PC64LE9-NEXT:    std 0, 16(1)
4668; PC64LE9-NEXT:    stdu 1, -32(1)
4669; PC64LE9-NEXT:    bl nearbyintf
4670; PC64LE9-NEXT:    nop
4671; PC64LE9-NEXT:    addi 1, 1, 32
4672; PC64LE9-NEXT:    ld 0, 16(1)
4673; PC64LE9-NEXT:    mtlr 0
4674; PC64LE9-NEXT:    blr
4675entry:
4676  %nearby = call <1 x float> @llvm.experimental.constrained.nearbyint.v1f32(
4677                               <1 x float> %x,
4678                               metadata !"round.dynamic",
4679                               metadata !"fpexcept.strict") #1
4680  ret <1 x float> %nearby
4681}
4682
4683define <2 x double> @constrained_vector_nearbyint_v2f64(<2 x double> %x) #0 {
4684; PC64LE-LABEL: constrained_vector_nearbyint_v2f64:
4685; PC64LE:       # %bb.0: # %entry
4686; PC64LE-NEXT:    mflr 0
4687; PC64LE-NEXT:    std 0, 16(1)
4688; PC64LE-NEXT:    stdu 1, -80(1)
4689; PC64LE-NEXT:    li 3, 48
4690; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
4691; PC64LE-NEXT:    li 3, 64
4692; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4693; PC64LE-NEXT:    vmr 31, 2
4694; PC64LE-NEXT:    xxlor 1, 63, 63
4695; PC64LE-NEXT:    bl nearbyint
4696; PC64LE-NEXT:    nop
4697; PC64LE-NEXT:    xxlor 62, 1, 1
4698; PC64LE-NEXT:    xxswapd 1, 63
4699; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4700; PC64LE-NEXT:    bl nearbyint
4701; PC64LE-NEXT:    nop
4702; PC64LE-NEXT:    li 3, 64
4703; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4704; PC64LE-NEXT:    xxmrghd 34, 62, 1
4705; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4706; PC64LE-NEXT:    li 3, 48
4707; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
4708; PC64LE-NEXT:    addi 1, 1, 80
4709; PC64LE-NEXT:    ld 0, 16(1)
4710; PC64LE-NEXT:    mtlr 0
4711; PC64LE-NEXT:    blr
4712;
4713; PC64LE9-LABEL: constrained_vector_nearbyint_v2f64:
4714; PC64LE9:       # %bb.0: # %entry
4715; PC64LE9-NEXT:    mflr 0
4716; PC64LE9-NEXT:    std 0, 16(1)
4717; PC64LE9-NEXT:    stdu 1, -64(1)
4718; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
4719; PC64LE9-NEXT:    vmr 31, 2
4720; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
4721; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
4722; PC64LE9-NEXT:    bl nearbyint
4723; PC64LE9-NEXT:    nop
4724; PC64LE9-NEXT:    xscpsgndp 62, 1, 1
4725; PC64LE9-NEXT:    xxswapd 1, 63
4726; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4727; PC64LE9-NEXT:    bl nearbyint
4728; PC64LE9-NEXT:    nop
4729; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4730; PC64LE9-NEXT:    xxmrghd 34, 62, 1
4731; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
4732; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
4733; PC64LE9-NEXT:    addi 1, 1, 64
4734; PC64LE9-NEXT:    ld 0, 16(1)
4735; PC64LE9-NEXT:    mtlr 0
4736; PC64LE9-NEXT:    blr
4737entry:
4738  %nearby = call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(
4739                                <2 x double> %x,
4740                                metadata !"round.dynamic",
4741                                metadata !"fpexcept.strict") #1
4742  ret <2 x double> %nearby
4743}
4744
4745define <3 x float> @constrained_vector_nearbyint_v3f32(<3 x float> %x) #0 {
4746; PC64LE-LABEL: constrained_vector_nearbyint_v3f32:
4747; PC64LE:       # %bb.0: # %entry
4748; PC64LE-NEXT:    mflr 0
4749; PC64LE-NEXT:    std 0, 16(1)
4750; PC64LE-NEXT:    stdu 1, -80(1)
4751; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
4752; PC64LE-NEXT:    li 3, 48
4753; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
4754; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
4755; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4756; PC64LE-NEXT:    vmr 31, 2
4757; PC64LE-NEXT:    xscvspdpn 1, 0
4758; PC64LE-NEXT:    bl nearbyintf
4759; PC64LE-NEXT:    nop
4760; PC64LE-NEXT:    xxswapd 0, 63
4761; PC64LE-NEXT:    fmr 31, 1
4762; PC64LE-NEXT:    xscvspdpn 1, 0
4763; PC64LE-NEXT:    bl nearbyintf
4764; PC64LE-NEXT:    nop
4765; PC64LE-NEXT:    xxsldwi 0, 63, 63, 3
4766; PC64LE-NEXT:    fmr 30, 1
4767; PC64LE-NEXT:    xscvspdpn 1, 0
4768; PC64LE-NEXT:    bl nearbyintf
4769; PC64LE-NEXT:    nop
4770; PC64LE-NEXT:    xscvdpspn 0, 30
4771; PC64LE-NEXT:    addis 3, 2, .LCPI82_0@toc@ha
4772; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
4773; PC64LE-NEXT:    xscvdpspn 1, 1
4774; PC64LE-NEXT:    addi 3, 3, .LCPI82_0@toc@l
4775; PC64LE-NEXT:    xscvdpspn 34, 31
4776; PC64LE-NEXT:    lvx 4, 0, 3
4777; PC64LE-NEXT:    li 3, 48
4778; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
4779; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4780; PC64LE-NEXT:    xxmrghw 35, 0, 1
4781; PC64LE-NEXT:    vperm 2, 2, 3, 4
4782; PC64LE-NEXT:    addi 1, 1, 80
4783; PC64LE-NEXT:    ld 0, 16(1)
4784; PC64LE-NEXT:    mtlr 0
4785; PC64LE-NEXT:    blr
4786;
4787; PC64LE9-LABEL: constrained_vector_nearbyint_v3f32:
4788; PC64LE9:       # %bb.0: # %entry
4789; PC64LE9-NEXT:    mflr 0
4790; PC64LE9-NEXT:    std 0, 16(1)
4791; PC64LE9-NEXT:    stdu 1, -64(1)
4792; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
4793; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
4794; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
4795; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
4796; PC64LE9-NEXT:    xscvspdpn 1, 0
4797; PC64LE9-NEXT:    vmr 31, 2
4798; PC64LE9-NEXT:    bl nearbyintf
4799; PC64LE9-NEXT:    nop
4800; PC64LE9-NEXT:    xxswapd 0, 63
4801; PC64LE9-NEXT:    fmr 31, 1
4802; PC64LE9-NEXT:    xscvspdpn 1, 0
4803; PC64LE9-NEXT:    bl nearbyintf
4804; PC64LE9-NEXT:    nop
4805; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
4806; PC64LE9-NEXT:    fmr 30, 1
4807; PC64LE9-NEXT:    xscvspdpn 1, 0
4808; PC64LE9-NEXT:    bl nearbyintf
4809; PC64LE9-NEXT:    nop
4810; PC64LE9-NEXT:    xscvdpspn 0, 1
4811; PC64LE9-NEXT:    xscvdpspn 1, 30
4812; PC64LE9-NEXT:    addis 3, 2, .LCPI82_0@toc@ha
4813; PC64LE9-NEXT:    xscvdpspn 36, 31
4814; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
4815; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
4816; PC64LE9-NEXT:    addi 3, 3, .LCPI82_0@toc@l
4817; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
4818; PC64LE9-NEXT:    lxv 35, 0(3)
4819; PC64LE9-NEXT:    xxmrghw 34, 1, 0
4820; PC64LE9-NEXT:    vperm 2, 4, 2, 3
4821; PC64LE9-NEXT:    addi 1, 1, 64
4822; PC64LE9-NEXT:    ld 0, 16(1)
4823; PC64LE9-NEXT:    mtlr 0
4824; PC64LE9-NEXT:    blr
4825entry:
4826  %nearby = call <3 x float> @llvm.experimental.constrained.nearbyint.v3f32(
4827                              <3 x float> %x,
4828                              metadata !"round.dynamic",
4829                              metadata !"fpexcept.strict") #1
4830  ret <3 x float> %nearby
4831}
4832
4833define <3 x double> @constrained_vector_nearby_v3f64(<3 x double> %x) #0 {
4834; PC64LE-LABEL: constrained_vector_nearby_v3f64:
4835; PC64LE:       # %bb.0: # %entry
4836; PC64LE-NEXT:    mflr 0
4837; PC64LE-NEXT:    std 0, 16(1)
4838; PC64LE-NEXT:    stdu 1, -80(1)
4839; PC64LE-NEXT:    li 3, 48
4840; PC64LE-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
4841; PC64LE-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
4842; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4843; PC64LE-NEXT:    fmr 31, 3
4844; PC64LE-NEXT:    fmr 30, 2
4845; PC64LE-NEXT:    bl nearbyint
4846; PC64LE-NEXT:    nop
4847; PC64LE-NEXT:    xxlor 63, 1, 1
4848; PC64LE-NEXT:    fmr 1, 30
4849; PC64LE-NEXT:    bl nearbyint
4850; PC64LE-NEXT:    nop
4851; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4852; PC64LE-NEXT:    xxmrghd 63, 1, 63
4853; PC64LE-NEXT:    fmr 1, 31
4854; PC64LE-NEXT:    bl nearbyint
4855; PC64LE-NEXT:    nop
4856; PC64LE-NEXT:    xxswapd 0, 63
4857; PC64LE-NEXT:    li 3, 48
4858; PC64LE-NEXT:    xxlor 2, 63, 63
4859; PC64LE-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
4860; PC64LE-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
4861; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4862; PC64LE-NEXT:    fmr 3, 1
4863; PC64LE-NEXT:    fmr 1, 0
4864; PC64LE-NEXT:    addi 1, 1, 80
4865; PC64LE-NEXT:    ld 0, 16(1)
4866; PC64LE-NEXT:    mtlr 0
4867; PC64LE-NEXT:    blr
4868;
4869; PC64LE9-LABEL: constrained_vector_nearby_v3f64:
4870; PC64LE9:       # %bb.0: # %entry
4871; PC64LE9-NEXT:    mflr 0
4872; PC64LE9-NEXT:    std 0, 16(1)
4873; PC64LE9-NEXT:    stdu 1, -64(1)
4874; PC64LE9-NEXT:    stfd 30, 48(1) # 8-byte Folded Spill
4875; PC64LE9-NEXT:    stfd 31, 56(1) # 8-byte Folded Spill
4876; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
4877; PC64LE9-NEXT:    fmr 31, 3
4878; PC64LE9-NEXT:    fmr 30, 2
4879; PC64LE9-NEXT:    bl nearbyint
4880; PC64LE9-NEXT:    nop
4881; PC64LE9-NEXT:    xscpsgndp 63, 1, 1
4882; PC64LE9-NEXT:    fmr 1, 30
4883; PC64LE9-NEXT:    bl nearbyint
4884; PC64LE9-NEXT:    nop
4885; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4886; PC64LE9-NEXT:    xxmrghd 63, 1, 63
4887; PC64LE9-NEXT:    fmr 1, 31
4888; PC64LE9-NEXT:    bl nearbyint
4889; PC64LE9-NEXT:    nop
4890; PC64LE9-NEXT:    fmr 3, 1
4891; PC64LE9-NEXT:    xxswapd 1, 63
4892; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
4893; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
4894; PC64LE9-NEXT:    lfd 31, 56(1) # 8-byte Folded Reload
4895; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4896; PC64LE9-NEXT:    lfd 30, 48(1) # 8-byte Folded Reload
4897; PC64LE9-NEXT:    addi 1, 1, 64
4898; PC64LE9-NEXT:    ld 0, 16(1)
4899; PC64LE9-NEXT:    mtlr 0
4900; PC64LE9-NEXT:    blr
4901entry:
4902  %nearby = call <3 x double> @llvm.experimental.constrained.nearbyint.v3f64(
4903                          <3 x double> %x,
4904                          metadata !"round.dynamic",
4905                          metadata !"fpexcept.strict") #1
4906  ret <3 x double> %nearby
4907}
4908
4909define <4 x double> @constrained_vector_nearbyint_v4f64(<4 x double> %x) #0 {
4910; PC64LE-LABEL: constrained_vector_nearbyint_v4f64:
4911; PC64LE:       # %bb.0: # %entry
4912; PC64LE-NEXT:    mflr 0
4913; PC64LE-NEXT:    std 0, 16(1)
4914; PC64LE-NEXT:    stdu 1, -96(1)
4915; PC64LE-NEXT:    li 3, 48
4916; PC64LE-NEXT:    stxvd2x 61, 1, 3 # 16-byte Folded Spill
4917; PC64LE-NEXT:    li 3, 64
4918; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
4919; PC64LE-NEXT:    vmr 30, 2
4920; PC64LE-NEXT:    li 3, 80
4921; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
4922; PC64LE-NEXT:    vmr 31, 3
4923; PC64LE-NEXT:    xxlor 1, 62, 62
4924; PC64LE-NEXT:    bl nearbyint
4925; PC64LE-NEXT:    nop
4926; PC64LE-NEXT:    xxlor 61, 1, 1
4927; PC64LE-NEXT:    xxswapd 1, 62
4928; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4929; PC64LE-NEXT:    bl nearbyint
4930; PC64LE-NEXT:    nop
4931; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4932; PC64LE-NEXT:    xxmrghd 62, 61, 1
4933; PC64LE-NEXT:    xxlor 1, 63, 63
4934; PC64LE-NEXT:    bl nearbyint
4935; PC64LE-NEXT:    nop
4936; PC64LE-NEXT:    xxlor 61, 1, 1
4937; PC64LE-NEXT:    xxswapd 1, 63
4938; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4939; PC64LE-NEXT:    bl nearbyint
4940; PC64LE-NEXT:    nop
4941; PC64LE-NEXT:    li 3, 80
4942; PC64LE-NEXT:    vmr 2, 30
4943; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4944; PC64LE-NEXT:    xxmrghd 35, 61, 1
4945; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
4946; PC64LE-NEXT:    li 3, 64
4947; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
4948; PC64LE-NEXT:    li 3, 48
4949; PC64LE-NEXT:    lxvd2x 61, 1, 3 # 16-byte Folded Reload
4950; PC64LE-NEXT:    addi 1, 1, 96
4951; PC64LE-NEXT:    ld 0, 16(1)
4952; PC64LE-NEXT:    mtlr 0
4953; PC64LE-NEXT:    blr
4954;
4955; PC64LE9-LABEL: constrained_vector_nearbyint_v4f64:
4956; PC64LE9:       # %bb.0: # %entry
4957; PC64LE9-NEXT:    mflr 0
4958; PC64LE9-NEXT:    std 0, 16(1)
4959; PC64LE9-NEXT:    stdu 1, -80(1)
4960; PC64LE9-NEXT:    stxv 62, 48(1) # 16-byte Folded Spill
4961; PC64LE9-NEXT:    vmr 30, 2
4962; PC64LE9-NEXT:    xscpsgndp 1, 62, 62
4963; PC64LE9-NEXT:    stxv 61, 32(1) # 16-byte Folded Spill
4964; PC64LE9-NEXT:    stxv 63, 64(1) # 16-byte Folded Spill
4965; PC64LE9-NEXT:    vmr 31, 3
4966; PC64LE9-NEXT:    bl nearbyint
4967; PC64LE9-NEXT:    nop
4968; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
4969; PC64LE9-NEXT:    xxswapd 1, 62
4970; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4971; PC64LE9-NEXT:    bl nearbyint
4972; PC64LE9-NEXT:    nop
4973; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4974; PC64LE9-NEXT:    xxmrghd 62, 61, 1
4975; PC64LE9-NEXT:    xscpsgndp 1, 63, 63
4976; PC64LE9-NEXT:    bl nearbyint
4977; PC64LE9-NEXT:    nop
4978; PC64LE9-NEXT:    xscpsgndp 61, 1, 1
4979; PC64LE9-NEXT:    xxswapd 1, 63
4980; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
4981; PC64LE9-NEXT:    bl nearbyint
4982; PC64LE9-NEXT:    nop
4983; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4984; PC64LE9-NEXT:    xxmrghd 35, 61, 1
4985; PC64LE9-NEXT:    vmr 2, 30
4986; PC64LE9-NEXT:    lxv 63, 64(1) # 16-byte Folded Reload
4987; PC64LE9-NEXT:    lxv 62, 48(1) # 16-byte Folded Reload
4988; PC64LE9-NEXT:    lxv 61, 32(1) # 16-byte Folded Reload
4989; PC64LE9-NEXT:    addi 1, 1, 80
4990; PC64LE9-NEXT:    ld 0, 16(1)
4991; PC64LE9-NEXT:    mtlr 0
4992; PC64LE9-NEXT:    blr
4993entry:
4994  %nearby = call <4 x double> @llvm.experimental.constrained.nearbyint.v4f64(
4995                                <4 x double> %x,
4996                                metadata !"round.dynamic",
4997                                metadata !"fpexcept.strict") #1
4998  ret <4 x double> %nearby
4999}
5000
5001define <1 x float> @constrained_vector_maxnum_v1f32(<1 x float> %x, <1 x float> %y) #0 {
5002; PC64LE-LABEL: constrained_vector_maxnum_v1f32:
5003; PC64LE:       # %bb.0: # %entry
5004; PC64LE-NEXT:    mflr 0
5005; PC64LE-NEXT:    std 0, 16(1)
5006; PC64LE-NEXT:    stdu 1, -32(1)
5007; PC64LE-NEXT:    bl fmaxf
5008; PC64LE-NEXT:    nop
5009; PC64LE-NEXT:    addi 1, 1, 32
5010; PC64LE-NEXT:    ld 0, 16(1)
5011; PC64LE-NEXT:    mtlr 0
5012; PC64LE-NEXT:    blr
5013;
5014; PC64LE9-LABEL: constrained_vector_maxnum_v1f32:
5015; PC64LE9:       # %bb.0: # %entry
5016; PC64LE9-NEXT:    mflr 0
5017; PC64LE9-NEXT:    std 0, 16(1)
5018; PC64LE9-NEXT:    stdu 1, -32(1)
5019; PC64LE9-NEXT:    bl fmaxf
5020; PC64LE9-NEXT:    nop
5021; PC64LE9-NEXT:    addi 1, 1, 32
5022; PC64LE9-NEXT:    ld 0, 16(1)
5023; PC64LE9-NEXT:    mtlr 0
5024; PC64LE9-NEXT:    blr
5025entry:
5026  %max = call <1 x float> @llvm.experimental.constrained.maxnum.v1f32(
5027                               <1 x float> %x, <1 x float> %y,
5028                               metadata !"fpexcept.strict") #1
5029  ret <1 x float> %max
5030}
5031
5032define <2 x double> @constrained_vector_maxnum_v2f64(<2 x double> %x, <2 x double> %y) #0 {
5033; PC64LE-LABEL: constrained_vector_maxnum_v2f64:
5034; PC64LE:       # %bb.0: # %entry
5035; PC64LE-NEXT:    xvmaxdp 34, 34, 35
5036; PC64LE-NEXT:    blr
5037;
5038; PC64LE9-LABEL: constrained_vector_maxnum_v2f64:
5039; PC64LE9:       # %bb.0: # %entry
5040; PC64LE9-NEXT:    xvmaxdp 34, 34, 35
5041; PC64LE9-NEXT:    blr
5042entry:
5043  %max = call <2 x double> @llvm.experimental.constrained.maxnum.v2f64(
5044                                <2 x double> %x,
5045                                <2 x double> %y,
5046                                metadata !"fpexcept.strict") #1
5047  ret <2 x double> %max
5048}
5049
5050define <3 x float> @constrained_vector_maxnum_v3f32(<3 x float> %x, <3 x float> %y) #0 {
5051; PC64LE-LABEL: constrained_vector_maxnum_v3f32:
5052; PC64LE:       # %bb.0: # %entry
5053; PC64LE-NEXT:    mflr 0
5054; PC64LE-NEXT:    std 0, 16(1)
5055; PC64LE-NEXT:    stdu 1, -96(1)
5056; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
5057; PC64LE-NEXT:    xxsldwi 2, 35, 35, 1
5058; PC64LE-NEXT:    li 3, 48
5059; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
5060; PC64LE-NEXT:    li 3, 64
5061; PC64LE-NEXT:    stfd 30, 80(1) # 8-byte Folded Spill
5062; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
5063; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
5064; PC64LE-NEXT:    xscvspdpn 1, 0
5065; PC64LE-NEXT:    xscvspdpn 2, 2
5066; PC64LE-NEXT:    vmr 31, 3
5067; PC64LE-NEXT:    vmr 30, 2
5068; PC64LE-NEXT:    bl fmaxf
5069; PC64LE-NEXT:    nop
5070; PC64LE-NEXT:    xxswapd 0, 62
5071; PC64LE-NEXT:    xxswapd 2, 63
5072; PC64LE-NEXT:    fmr 31, 1
5073; PC64LE-NEXT:    xscvspdpn 1, 0
5074; PC64LE-NEXT:    xscvspdpn 2, 2
5075; PC64LE-NEXT:    bl fmaxf
5076; PC64LE-NEXT:    nop
5077; PC64LE-NEXT:    xxsldwi 0, 62, 62, 3
5078; PC64LE-NEXT:    xxsldwi 2, 63, 63, 3
5079; PC64LE-NEXT:    fmr 30, 1
5080; PC64LE-NEXT:    xscvspdpn 1, 0
5081; PC64LE-NEXT:    xscvspdpn 2, 2
5082; PC64LE-NEXT:    bl fmaxf
5083; PC64LE-NEXT:    nop
5084; PC64LE-NEXT:    xscvdpspn 0, 30
5085; PC64LE-NEXT:    addis 3, 2, .LCPI87_0@toc@ha
5086; PC64LE-NEXT:    lfd 30, 80(1) # 8-byte Folded Reload
5087; PC64LE-NEXT:    xscvdpspn 1, 1
5088; PC64LE-NEXT:    addi 3, 3, .LCPI87_0@toc@l
5089; PC64LE-NEXT:    xscvdpspn 34, 31
5090; PC64LE-NEXT:    lvx 4, 0, 3
5091; PC64LE-NEXT:    li 3, 64
5092; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
5093; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
5094; PC64LE-NEXT:    li 3, 48
5095; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
5096; PC64LE-NEXT:    xxmrghw 35, 0, 1
5097; PC64LE-NEXT:    vperm 2, 2, 3, 4
5098; PC64LE-NEXT:    addi 1, 1, 96
5099; PC64LE-NEXT:    ld 0, 16(1)
5100; PC64LE-NEXT:    mtlr 0
5101; PC64LE-NEXT:    blr
5102;
5103; PC64LE9-LABEL: constrained_vector_maxnum_v3f32:
5104; PC64LE9:       # %bb.0: # %entry
5105; PC64LE9-NEXT:    mflr 0
5106; PC64LE9-NEXT:    std 0, 16(1)
5107; PC64LE9-NEXT:    stdu 1, -80(1)
5108; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
5109; PC64LE9-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
5110; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
5111; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
5112; PC64LE9-NEXT:    xscvspdpn 1, 0
5113; PC64LE9-NEXT:    xxsldwi 0, 35, 35, 1
5114; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
5115; PC64LE9-NEXT:    xscvspdpn 2, 0
5116; PC64LE9-NEXT:    vmr 31, 3
5117; PC64LE9-NEXT:    vmr 30, 2
5118; PC64LE9-NEXT:    bl fmaxf
5119; PC64LE9-NEXT:    nop
5120; PC64LE9-NEXT:    xxswapd 0, 62
5121; PC64LE9-NEXT:    fmr 31, 1
5122; PC64LE9-NEXT:    xscvspdpn 1, 0
5123; PC64LE9-NEXT:    xxswapd 0, 63
5124; PC64LE9-NEXT:    xscvspdpn 2, 0
5125; PC64LE9-NEXT:    bl fmaxf
5126; PC64LE9-NEXT:    nop
5127; PC64LE9-NEXT:    xxsldwi 0, 62, 62, 3
5128; PC64LE9-NEXT:    fmr 30, 1
5129; PC64LE9-NEXT:    xscvspdpn 1, 0
5130; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
5131; PC64LE9-NEXT:    xscvspdpn 2, 0
5132; PC64LE9-NEXT:    bl fmaxf
5133; PC64LE9-NEXT:    nop
5134; PC64LE9-NEXT:    xscvdpspn 0, 1
5135; PC64LE9-NEXT:    xscvdpspn 1, 30
5136; PC64LE9-NEXT:    addis 3, 2, .LCPI87_0@toc@ha
5137; PC64LE9-NEXT:    xscvdpspn 35, 31
5138; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
5139; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
5140; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
5141; PC64LE9-NEXT:    addi 3, 3, .LCPI87_0@toc@l
5142; PC64LE9-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
5143; PC64LE9-NEXT:    lxv 36, 0(3)
5144; PC64LE9-NEXT:    xxmrghw 34, 1, 0
5145; PC64LE9-NEXT:    vperm 2, 3, 2, 4
5146; PC64LE9-NEXT:    addi 1, 1, 80
5147; PC64LE9-NEXT:    ld 0, 16(1)
5148; PC64LE9-NEXT:    mtlr 0
5149; PC64LE9-NEXT:    blr
5150entry:
5151  %max = call <3 x float> @llvm.experimental.constrained.maxnum.v3f32(
5152                              <3 x float> %x,
5153                              <3 x float> %y,
5154                              metadata !"fpexcept.strict") #1
5155  ret <3 x float> %max
5156}
5157
5158define <3 x double> @constrained_vector_max_v3f64(<3 x double> %x, <3 x double> %y) #0 {
5159; PC64LE-LABEL: constrained_vector_max_v3f64:
5160; PC64LE:       # %bb.0: # %entry
5161; PC64LE-NEXT:    mflr 0
5162; PC64LE-NEXT:    std 0, 16(1)
5163; PC64LE-NEXT:    stdu 1, -64(1)
5164; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
5165; PC64LE-NEXT:    # kill: def $f5 killed $f5 def $vsl5
5166; PC64LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
5167; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
5168; PC64LE-NEXT:    xxmrghd 0, 5, 4
5169; PC64LE-NEXT:    li 3, 48
5170; PC64LE-NEXT:    xxmrghd 1, 2, 1
5171; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
5172; PC64LE-NEXT:    fmr 2, 6
5173; PC64LE-NEXT:    xvmaxdp 63, 1, 0
5174; PC64LE-NEXT:    fmr 1, 3
5175; PC64LE-NEXT:    bl fmax
5176; PC64LE-NEXT:    nop
5177; PC64LE-NEXT:    xxswapd 0, 63
5178; PC64LE-NEXT:    li 3, 48
5179; PC64LE-NEXT:    xxlor 2, 63, 63
5180; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
5181; PC64LE-NEXT:    fmr 3, 1
5182; PC64LE-NEXT:    fmr 1, 0
5183; PC64LE-NEXT:    addi 1, 1, 64
5184; PC64LE-NEXT:    ld 0, 16(1)
5185; PC64LE-NEXT:    mtlr 0
5186; PC64LE-NEXT:    blr
5187;
5188; PC64LE9-LABEL: constrained_vector_max_v3f64:
5189; PC64LE9:       # %bb.0: # %entry
5190; PC64LE9-NEXT:    mflr 0
5191; PC64LE9-NEXT:    std 0, 16(1)
5192; PC64LE9-NEXT:    stdu 1, -48(1)
5193; PC64LE9-NEXT:    # kill: def $f5 killed $f5 def $vsl5
5194; PC64LE9-NEXT:    # kill: def $f4 killed $f4 def $vsl4
5195; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
5196; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
5197; PC64LE9-NEXT:    xxmrghd 0, 5, 4
5198; PC64LE9-NEXT:    xxmrghd 1, 2, 1
5199; PC64LE9-NEXT:    fmr 2, 6
5200; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
5201; PC64LE9-NEXT:    xvmaxdp 63, 1, 0
5202; PC64LE9-NEXT:    fmr 1, 3
5203; PC64LE9-NEXT:    bl fmax
5204; PC64LE9-NEXT:    nop
5205; PC64LE9-NEXT:    fmr 3, 1
5206; PC64LE9-NEXT:    xxswapd 1, 63
5207; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
5208; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
5209; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
5210; PC64LE9-NEXT:    addi 1, 1, 48
5211; PC64LE9-NEXT:    ld 0, 16(1)
5212; PC64LE9-NEXT:    mtlr 0
5213; PC64LE9-NEXT:    blr
5214entry:
5215  %max = call <3 x double> @llvm.experimental.constrained.maxnum.v3f64(
5216                          <3 x double> %x,
5217                          <3 x double> %y,
5218                          metadata !"fpexcept.strict") #1
5219  ret <3 x double> %max
5220}
5221
5222define <4 x double> @constrained_vector_maxnum_v4f64(<4 x double> %x, <4 x double> %y) #0 {
5223; PC64LE-LABEL: constrained_vector_maxnum_v4f64:
5224; PC64LE:       # %bb.0: # %entry
5225; PC64LE-NEXT:    xvmaxdp 34, 34, 36
5226; PC64LE-NEXT:    xvmaxdp 35, 35, 37
5227; PC64LE-NEXT:    blr
5228;
5229; PC64LE9-LABEL: constrained_vector_maxnum_v4f64:
5230; PC64LE9:       # %bb.0: # %entry
5231; PC64LE9-NEXT:    xvmaxdp 34, 34, 36
5232; PC64LE9-NEXT:    xvmaxdp 35, 35, 37
5233; PC64LE9-NEXT:    blr
5234entry:
5235  %max = call <4 x double> @llvm.experimental.constrained.maxnum.v4f64(
5236                                <4 x double> %x,
5237                                <4 x double> %y,
5238                                metadata !"fpexcept.strict") #1
5239  ret <4 x double> %max
5240}
5241
5242define <1 x float> @constrained_vector_minnum_v1f32(<1 x float> %x, <1 x float> %y) #0 {
5243; PC64LE-LABEL: constrained_vector_minnum_v1f32:
5244; PC64LE:       # %bb.0: # %entry
5245; PC64LE-NEXT:    mflr 0
5246; PC64LE-NEXT:    std 0, 16(1)
5247; PC64LE-NEXT:    stdu 1, -32(1)
5248; PC64LE-NEXT:    bl fminf
5249; PC64LE-NEXT:    nop
5250; PC64LE-NEXT:    addi 1, 1, 32
5251; PC64LE-NEXT:    ld 0, 16(1)
5252; PC64LE-NEXT:    mtlr 0
5253; PC64LE-NEXT:    blr
5254;
5255; PC64LE9-LABEL: constrained_vector_minnum_v1f32:
5256; PC64LE9:       # %bb.0: # %entry
5257; PC64LE9-NEXT:    mflr 0
5258; PC64LE9-NEXT:    std 0, 16(1)
5259; PC64LE9-NEXT:    stdu 1, -32(1)
5260; PC64LE9-NEXT:    bl fminf
5261; PC64LE9-NEXT:    nop
5262; PC64LE9-NEXT:    addi 1, 1, 32
5263; PC64LE9-NEXT:    ld 0, 16(1)
5264; PC64LE9-NEXT:    mtlr 0
5265; PC64LE9-NEXT:    blr
5266 entry:
5267  %min = call <1 x float> @llvm.experimental.constrained.minnum.v1f32(
5268                               <1 x float> %x, <1 x float> %y,
5269                               metadata !"fpexcept.strict") #1
5270  ret <1 x float> %min
5271}
5272
5273define <2 x double> @constrained_vector_minnum_v2f64(<2 x double> %x, <2 x double> %y) #0 {
5274; PC64LE-LABEL: constrained_vector_minnum_v2f64:
5275; PC64LE:       # %bb.0: # %entry
5276; PC64LE-NEXT:    xvmindp 34, 34, 35
5277; PC64LE-NEXT:    blr
5278;
5279; PC64LE9-LABEL: constrained_vector_minnum_v2f64:
5280; PC64LE9:       # %bb.0: # %entry
5281; PC64LE9-NEXT:    xvmindp 34, 34, 35
5282; PC64LE9-NEXT:    blr
5283entry:
5284  %min = call <2 x double> @llvm.experimental.constrained.minnum.v2f64(
5285                                <2 x double> %x,
5286                                <2 x double> %y,
5287                                metadata !"fpexcept.strict") #1
5288  ret <2 x double> %min
5289}
5290
5291define <3 x float> @constrained_vector_minnum_v3f32(<3 x float> %x, <3 x float> %y) #0 {
5292; PC64LE-LABEL: constrained_vector_minnum_v3f32:
5293; PC64LE:       # %bb.0: # %entry
5294; PC64LE-NEXT:    mflr 0
5295; PC64LE-NEXT:    std 0, 16(1)
5296; PC64LE-NEXT:    stdu 1, -96(1)
5297; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
5298; PC64LE-NEXT:    xxsldwi 2, 35, 35, 1
5299; PC64LE-NEXT:    li 3, 48
5300; PC64LE-NEXT:    stxvd2x 62, 1, 3 # 16-byte Folded Spill
5301; PC64LE-NEXT:    li 3, 64
5302; PC64LE-NEXT:    stfd 30, 80(1) # 8-byte Folded Spill
5303; PC64LE-NEXT:    stfd 31, 88(1) # 8-byte Folded Spill
5304; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
5305; PC64LE-NEXT:    xscvspdpn 1, 0
5306; PC64LE-NEXT:    xscvspdpn 2, 2
5307; PC64LE-NEXT:    vmr 31, 3
5308; PC64LE-NEXT:    vmr 30, 2
5309; PC64LE-NEXT:    bl fminf
5310; PC64LE-NEXT:    nop
5311; PC64LE-NEXT:    xxswapd 0, 62
5312; PC64LE-NEXT:    xxswapd 2, 63
5313; PC64LE-NEXT:    fmr 31, 1
5314; PC64LE-NEXT:    xscvspdpn 1, 0
5315; PC64LE-NEXT:    xscvspdpn 2, 2
5316; PC64LE-NEXT:    bl fminf
5317; PC64LE-NEXT:    nop
5318; PC64LE-NEXT:    xxsldwi 0, 62, 62, 3
5319; PC64LE-NEXT:    xxsldwi 2, 63, 63, 3
5320; PC64LE-NEXT:    fmr 30, 1
5321; PC64LE-NEXT:    xscvspdpn 1, 0
5322; PC64LE-NEXT:    xscvspdpn 2, 2
5323; PC64LE-NEXT:    bl fminf
5324; PC64LE-NEXT:    nop
5325; PC64LE-NEXT:    xscvdpspn 0, 30
5326; PC64LE-NEXT:    addis 3, 2, .LCPI92_0@toc@ha
5327; PC64LE-NEXT:    lfd 30, 80(1) # 8-byte Folded Reload
5328; PC64LE-NEXT:    xscvdpspn 1, 1
5329; PC64LE-NEXT:    addi 3, 3, .LCPI92_0@toc@l
5330; PC64LE-NEXT:    xscvdpspn 34, 31
5331; PC64LE-NEXT:    lvx 4, 0, 3
5332; PC64LE-NEXT:    li 3, 64
5333; PC64LE-NEXT:    lfd 31, 88(1) # 8-byte Folded Reload
5334; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
5335; PC64LE-NEXT:    li 3, 48
5336; PC64LE-NEXT:    lxvd2x 62, 1, 3 # 16-byte Folded Reload
5337; PC64LE-NEXT:    xxmrghw 35, 0, 1
5338; PC64LE-NEXT:    vperm 2, 2, 3, 4
5339; PC64LE-NEXT:    addi 1, 1, 96
5340; PC64LE-NEXT:    ld 0, 16(1)
5341; PC64LE-NEXT:    mtlr 0
5342; PC64LE-NEXT:    blr
5343;
5344; PC64LE9-LABEL: constrained_vector_minnum_v3f32:
5345; PC64LE9:       # %bb.0: # %entry
5346; PC64LE9-NEXT:    mflr 0
5347; PC64LE9-NEXT:    std 0, 16(1)
5348; PC64LE9-NEXT:    stdu 1, -80(1)
5349; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
5350; PC64LE9-NEXT:    stfd 30, 64(1) # 8-byte Folded Spill
5351; PC64LE9-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
5352; PC64LE9-NEXT:    stxv 62, 32(1) # 16-byte Folded Spill
5353; PC64LE9-NEXT:    xscvspdpn 1, 0
5354; PC64LE9-NEXT:    xxsldwi 0, 35, 35, 1
5355; PC64LE9-NEXT:    stxv 63, 48(1) # 16-byte Folded Spill
5356; PC64LE9-NEXT:    xscvspdpn 2, 0
5357; PC64LE9-NEXT:    vmr 31, 3
5358; PC64LE9-NEXT:    vmr 30, 2
5359; PC64LE9-NEXT:    bl fminf
5360; PC64LE9-NEXT:    nop
5361; PC64LE9-NEXT:    xxswapd 0, 62
5362; PC64LE9-NEXT:    fmr 31, 1
5363; PC64LE9-NEXT:    xscvspdpn 1, 0
5364; PC64LE9-NEXT:    xxswapd 0, 63
5365; PC64LE9-NEXT:    xscvspdpn 2, 0
5366; PC64LE9-NEXT:    bl fminf
5367; PC64LE9-NEXT:    nop
5368; PC64LE9-NEXT:    xxsldwi 0, 62, 62, 3
5369; PC64LE9-NEXT:    fmr 30, 1
5370; PC64LE9-NEXT:    xscvspdpn 1, 0
5371; PC64LE9-NEXT:    xxsldwi 0, 63, 63, 3
5372; PC64LE9-NEXT:    xscvspdpn 2, 0
5373; PC64LE9-NEXT:    bl fminf
5374; PC64LE9-NEXT:    nop
5375; PC64LE9-NEXT:    xscvdpspn 0, 1
5376; PC64LE9-NEXT:    xscvdpspn 1, 30
5377; PC64LE9-NEXT:    addis 3, 2, .LCPI92_0@toc@ha
5378; PC64LE9-NEXT:    xscvdpspn 35, 31
5379; PC64LE9-NEXT:    lxv 63, 48(1) # 16-byte Folded Reload
5380; PC64LE9-NEXT:    lxv 62, 32(1) # 16-byte Folded Reload
5381; PC64LE9-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
5382; PC64LE9-NEXT:    addi 3, 3, .LCPI92_0@toc@l
5383; PC64LE9-NEXT:    lfd 30, 64(1) # 8-byte Folded Reload
5384; PC64LE9-NEXT:    lxv 36, 0(3)
5385; PC64LE9-NEXT:    xxmrghw 34, 1, 0
5386; PC64LE9-NEXT:    vperm 2, 3, 2, 4
5387; PC64LE9-NEXT:    addi 1, 1, 80
5388; PC64LE9-NEXT:    ld 0, 16(1)
5389; PC64LE9-NEXT:    mtlr 0
5390; PC64LE9-NEXT:    blr
5391entry:
5392  %min = call <3 x float> @llvm.experimental.constrained.minnum.v3f32(
5393                              <3 x float> %x,
5394                              <3 x float> %y,
5395                              metadata !"fpexcept.strict") #1
5396  ret <3 x float> %min
5397}
5398
5399define <3 x double> @constrained_vector_min_v3f64(<3 x double> %x, <3 x double> %y) #0 {
5400; PC64LE-LABEL: constrained_vector_min_v3f64:
5401; PC64LE:       # %bb.0: # %entry
5402; PC64LE-NEXT:    mflr 0
5403; PC64LE-NEXT:    std 0, 16(1)
5404; PC64LE-NEXT:    stdu 1, -64(1)
5405; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
5406; PC64LE-NEXT:    # kill: def $f5 killed $f5 def $vsl5
5407; PC64LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
5408; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
5409; PC64LE-NEXT:    xxmrghd 0, 5, 4
5410; PC64LE-NEXT:    li 3, 48
5411; PC64LE-NEXT:    xxmrghd 1, 2, 1
5412; PC64LE-NEXT:    stxvd2x 63, 1, 3 # 16-byte Folded Spill
5413; PC64LE-NEXT:    fmr 2, 6
5414; PC64LE-NEXT:    xvmindp 63, 1, 0
5415; PC64LE-NEXT:    fmr 1, 3
5416; PC64LE-NEXT:    bl fmin
5417; PC64LE-NEXT:    nop
5418; PC64LE-NEXT:    xxswapd 0, 63
5419; PC64LE-NEXT:    li 3, 48
5420; PC64LE-NEXT:    xxlor 2, 63, 63
5421; PC64LE-NEXT:    lxvd2x 63, 1, 3 # 16-byte Folded Reload
5422; PC64LE-NEXT:    fmr 3, 1
5423; PC64LE-NEXT:    fmr 1, 0
5424; PC64LE-NEXT:    addi 1, 1, 64
5425; PC64LE-NEXT:    ld 0, 16(1)
5426; PC64LE-NEXT:    mtlr 0
5427; PC64LE-NEXT:    blr
5428;
5429; PC64LE9-LABEL: constrained_vector_min_v3f64:
5430; PC64LE9:       # %bb.0: # %entry
5431; PC64LE9-NEXT:    mflr 0
5432; PC64LE9-NEXT:    std 0, 16(1)
5433; PC64LE9-NEXT:    stdu 1, -48(1)
5434; PC64LE9-NEXT:    # kill: def $f5 killed $f5 def $vsl5
5435; PC64LE9-NEXT:    # kill: def $f4 killed $f4 def $vsl4
5436; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
5437; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
5438; PC64LE9-NEXT:    xxmrghd 0, 5, 4
5439; PC64LE9-NEXT:    xxmrghd 1, 2, 1
5440; PC64LE9-NEXT:    fmr 2, 6
5441; PC64LE9-NEXT:    stxv 63, 32(1) # 16-byte Folded Spill
5442; PC64LE9-NEXT:    xvmindp 63, 1, 0
5443; PC64LE9-NEXT:    fmr 1, 3
5444; PC64LE9-NEXT:    bl fmin
5445; PC64LE9-NEXT:    nop
5446; PC64LE9-NEXT:    fmr 3, 1
5447; PC64LE9-NEXT:    xxswapd 1, 63
5448; PC64LE9-NEXT:    xscpsgndp 2, 63, 63
5449; PC64LE9-NEXT:    lxv 63, 32(1) # 16-byte Folded Reload
5450; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
5451; PC64LE9-NEXT:    addi 1, 1, 48
5452; PC64LE9-NEXT:    ld 0, 16(1)
5453; PC64LE9-NEXT:    mtlr 0
5454; PC64LE9-NEXT:    blr
5455entry:
5456 %min = call <3 x double> @llvm.experimental.constrained.minnum.v3f64(
5457                          <3 x double> %x,
5458                          <3 x double> %y,
5459                          metadata !"fpexcept.strict") #1
5460  ret <3 x double> %min
5461}
5462
5463define <4 x double> @constrained_vector_minnum_v4f64(<4 x double> %x, <4 x double> %y) #0 {
5464; PC64LE-LABEL: constrained_vector_minnum_v4f64:
5465; PC64LE:       # %bb.0: # %entry
5466; PC64LE-NEXT:    xvmindp 34, 34, 36
5467; PC64LE-NEXT:    xvmindp 35, 35, 37
5468; PC64LE-NEXT:    blr
5469;
5470; PC64LE9-LABEL: constrained_vector_minnum_v4f64:
5471; PC64LE9:       # %bb.0: # %entry
5472; PC64LE9-NEXT:    xvmindp 34, 34, 36
5473; PC64LE9-NEXT:    xvmindp 35, 35, 37
5474; PC64LE9-NEXT:    blr
5475entry:
5476  %min = call <4 x double> @llvm.experimental.constrained.minnum.v4f64(
5477                                <4 x double> %x,
5478                                <4 x double> %y,
5479                                metadata !"fpexcept.strict") #1
5480  ret <4 x double> %min
5481}
5482
5483define <1 x i32> @constrained_vector_fptosi_v1i32_v1f32(<1 x float> %x) #0 {
5484; PC64LE-LABEL: constrained_vector_fptosi_v1i32_v1f32:
5485; PC64LE:       # %bb.0: # %entry
5486; PC64LE-NEXT:    xscvdpsxws 0, 1
5487; PC64LE-NEXT:    mffprwz 3, 0
5488; PC64LE-NEXT:    blr
5489;
5490; PC64LE9-LABEL: constrained_vector_fptosi_v1i32_v1f32:
5491; PC64LE9:       # %bb.0: # %entry
5492; PC64LE9-NEXT:    xscvdpsxws 0, 1
5493; PC64LE9-NEXT:    mffprwz 3, 0
5494; PC64LE9-NEXT:    blr
5495entry:
5496  %result = call <1 x i32> @llvm.experimental.constrained.fptosi.v1i32.v1f32(
5497                               <1 x float> %x,
5498                               metadata !"fpexcept.strict") #0
5499  ret <1 x i32> %result
5500}
5501
5502define <2 x i32> @constrained_vector_fptosi_v2i32_v2f32(<2 x float> %x) #0 {
5503; PC64LE-LABEL: constrained_vector_fptosi_v2i32_v2f32:
5504; PC64LE:       # %bb.0: # %entry
5505; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
5506; PC64LE-NEXT:    xxswapd 1, 34
5507; PC64LE-NEXT:    xscvspdpn 0, 0
5508; PC64LE-NEXT:    xscvspdpn 1, 1
5509; PC64LE-NEXT:    xscvdpsxws 0, 0
5510; PC64LE-NEXT:    xscvdpsxws 1, 1
5511; PC64LE-NEXT:    mffprwz 3, 0
5512; PC64LE-NEXT:    mffprwz 4, 1
5513; PC64LE-NEXT:    mtfprwz 0, 3
5514; PC64LE-NEXT:    mtfprwz 1, 4
5515; PC64LE-NEXT:    xxmrghw 34, 1, 0
5516; PC64LE-NEXT:    blr
5517;
5518; PC64LE9-LABEL: constrained_vector_fptosi_v2i32_v2f32:
5519; PC64LE9:       # %bb.0: # %entry
5520; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
5521; PC64LE9-NEXT:    xxswapd 1, 34
5522; PC64LE9-NEXT:    xscvspdpn 0, 0
5523; PC64LE9-NEXT:    xscvspdpn 1, 1
5524; PC64LE9-NEXT:    xscvdpsxws 0, 0
5525; PC64LE9-NEXT:    xscvdpsxws 1, 1
5526; PC64LE9-NEXT:    mffprwz 3, 0
5527; PC64LE9-NEXT:    mtfprwz 0, 3
5528; PC64LE9-NEXT:    mffprwz 3, 1
5529; PC64LE9-NEXT:    mtfprwz 1, 3
5530; PC64LE9-NEXT:    xxmrghw 34, 1, 0
5531; PC64LE9-NEXT:    blr
5532entry:
5533  %result = call <2 x i32> @llvm.experimental.constrained.fptosi.v2i32.v2f32(
5534                                <2 x float> %x,
5535                                metadata !"fpexcept.strict") #0
5536  ret <2 x i32> %result
5537}
5538
5539define <3 x i32> @constrained_vector_fptosi_v3i32_v3f32(<3 x float> %x) #0 {
5540; PC64LE-LABEL: constrained_vector_fptosi_v3i32_v3f32:
5541; PC64LE:       # %bb.0: # %entry
5542; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
5543; PC64LE-NEXT:    xxswapd 1, 34
5544; PC64LE-NEXT:    addis 3, 2, .LCPI97_0@toc@ha
5545; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
5546; PC64LE-NEXT:    addi 3, 3, .LCPI97_0@toc@l
5547; PC64LE-NEXT:    lvx 2, 0, 3
5548; PC64LE-NEXT:    xscvspdpn 0, 0
5549; PC64LE-NEXT:    xscvspdpn 1, 1
5550; PC64LE-NEXT:    xscvspdpn 2, 2
5551; PC64LE-NEXT:    xscvdpsxws 0, 0
5552; PC64LE-NEXT:    xscvdpsxws 1, 1
5553; PC64LE-NEXT:    xscvdpsxws 2, 2
5554; PC64LE-NEXT:    mffprwz 4, 0
5555; PC64LE-NEXT:    mffprwz 5, 1
5556; PC64LE-NEXT:    mtfprwz 0, 4
5557; PC64LE-NEXT:    mtfprwz 1, 5
5558; PC64LE-NEXT:    mffprwz 4, 2
5559; PC64LE-NEXT:    xxmrghw 35, 1, 0
5560; PC64LE-NEXT:    mtvsrwz 36, 4
5561; PC64LE-NEXT:    vperm 2, 4, 3, 2
5562; PC64LE-NEXT:    blr
5563;
5564; PC64LE9-LABEL: constrained_vector_fptosi_v3i32_v3f32:
5565; PC64LE9:       # %bb.0: # %entry
5566; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
5567; PC64LE9-NEXT:    xxswapd 1, 34
5568; PC64LE9-NEXT:    xscvspdpn 0, 0
5569; PC64LE9-NEXT:    xscvspdpn 1, 1
5570; PC64LE9-NEXT:    xscvdpsxws 0, 0
5571; PC64LE9-NEXT:    xscvdpsxws 1, 1
5572; PC64LE9-NEXT:    mffprwz 3, 0
5573; PC64LE9-NEXT:    mtfprwz 0, 3
5574; PC64LE9-NEXT:    mffprwz 3, 1
5575; PC64LE9-NEXT:    mtfprwz 1, 3
5576; PC64LE9-NEXT:    addis 3, 2, .LCPI97_0@toc@ha
5577; PC64LE9-NEXT:    xxmrghw 35, 1, 0
5578; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
5579; PC64LE9-NEXT:    addi 3, 3, .LCPI97_0@toc@l
5580; PC64LE9-NEXT:    lxv 36, 0(3)
5581; PC64LE9-NEXT:    xscvspdpn 0, 0
5582; PC64LE9-NEXT:    xscvdpsxws 0, 0
5583; PC64LE9-NEXT:    mffprwz 3, 0
5584; PC64LE9-NEXT:    mtvsrwz 34, 3
5585; PC64LE9-NEXT:    vperm 2, 2, 3, 4
5586; PC64LE9-NEXT:    blr
5587entry:
5588  %result = call <3 x i32> @llvm.experimental.constrained.fptosi.v3i32.v3f32(
5589                                <3 x float> %x,
5590                                metadata !"fpexcept.strict") #0
5591  ret <3 x i32> %result
5592}
5593
5594define <4 x i32> @constrained_vector_fptosi_v4i32_v4f32(<4 x float> %x) #0 {
5595; PC64LE-LABEL: constrained_vector_fptosi_v4i32_v4f32:
5596; PC64LE:       # %bb.0: # %entry
5597; PC64LE-NEXT:    xvcvspsxws 34, 34
5598; PC64LE-NEXT:    blr
5599;
5600; PC64LE9-LABEL: constrained_vector_fptosi_v4i32_v4f32:
5601; PC64LE9:       # %bb.0: # %entry
5602; PC64LE9-NEXT:    xvcvspsxws 34, 34
5603; PC64LE9-NEXT:    blr
5604entry:
5605  %result = call <4 x i32> @llvm.experimental.constrained.fptosi.v4i32.v4f32(
5606                                <4 x float> %x,
5607                                metadata !"fpexcept.strict") #0
5608  ret <4 x i32> %result
5609}
5610
5611define <1 x i64> @constrained_vector_fptosi_v1i64_v1f32(<1 x float> %x) #0 {
5612; PC64LE-LABEL: constrained_vector_fptosi_v1i64_v1f32:
5613; PC64LE:       # %bb.0: # %entry
5614; PC64LE-NEXT:    xscvdpsxds 0, 1
5615; PC64LE-NEXT:    mffprd 3, 0
5616; PC64LE-NEXT:    blr
5617;
5618; PC64LE9-LABEL: constrained_vector_fptosi_v1i64_v1f32:
5619; PC64LE9:       # %bb.0: # %entry
5620; PC64LE9-NEXT:    xscvdpsxds 0, 1
5621; PC64LE9-NEXT:    mffprd 3, 0
5622; PC64LE9-NEXT:    blr
5623entry:
5624  %result = call <1 x i64> @llvm.experimental.constrained.fptosi.v1i64.v1f32(
5625                               <1 x float> %x,
5626                               metadata !"fpexcept.strict") #0
5627  ret <1 x i64> %result
5628}
5629
5630define <2 x i64> @constrained_vector_fptosi_v2i64_v2f32(<2 x float> %x) #0 {
5631; PC64LE-LABEL: constrained_vector_fptosi_v2i64_v2f32:
5632; PC64LE:       # %bb.0: # %entry
5633; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
5634; PC64LE-NEXT:    xxswapd 1, 34
5635; PC64LE-NEXT:    xscvspdpn 0, 0
5636; PC64LE-NEXT:    xscvspdpn 1, 1
5637; PC64LE-NEXT:    xscvdpsxds 0, 0
5638; PC64LE-NEXT:    xscvdpsxds 1, 1
5639; PC64LE-NEXT:    mffprd 3, 0
5640; PC64LE-NEXT:    mffprd 4, 1
5641; PC64LE-NEXT:    mtfprd 0, 3
5642; PC64LE-NEXT:    mtfprd 1, 4
5643; PC64LE-NEXT:    xxmrghd 34, 1, 0
5644; PC64LE-NEXT:    blr
5645;
5646; PC64LE9-LABEL: constrained_vector_fptosi_v2i64_v2f32:
5647; PC64LE9:       # %bb.0: # %entry
5648; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
5649; PC64LE9-NEXT:    xscvspdpn 0, 0
5650; PC64LE9-NEXT:    xscvdpsxds 0, 0
5651; PC64LE9-NEXT:    mffprd 3, 0
5652; PC64LE9-NEXT:    xxswapd 0, 34
5653; PC64LE9-NEXT:    xscvspdpn 0, 0
5654; PC64LE9-NEXT:    xscvdpsxds 0, 0
5655; PC64LE9-NEXT:    mffprd 4, 0
5656; PC64LE9-NEXT:    mtvsrdd 34, 4, 3
5657; PC64LE9-NEXT:    blr
5658entry:
5659  %result = call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f32(
5660                                <2 x float> %x,
5661                                metadata !"fpexcept.strict") #0
5662  ret <2 x i64> %result
5663}
5664
5665define <3 x i64> @constrained_vector_fptosi_v3i64_v3f32(<3 x float> %x) #0 {
5666; PC64LE-LABEL: constrained_vector_fptosi_v3i64_v3f32:
5667; PC64LE:       # %bb.0: # %entry
5668; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
5669; PC64LE-NEXT:    xxswapd 1, 34
5670; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
5671; PC64LE-NEXT:    xscvspdpn 0, 0
5672; PC64LE-NEXT:    xscvspdpn 1, 1
5673; PC64LE-NEXT:    xscvspdpn 2, 2
5674; PC64LE-NEXT:    xscvdpsxds 0, 0
5675; PC64LE-NEXT:    xscvdpsxds 1, 1
5676; PC64LE-NEXT:    xscvdpsxds 2, 2
5677; PC64LE-NEXT:    mffprd 3, 0
5678; PC64LE-NEXT:    mffprd 4, 1
5679; PC64LE-NEXT:    mffprd 5, 2
5680; PC64LE-NEXT:    blr
5681;
5682; PC64LE9-LABEL: constrained_vector_fptosi_v3i64_v3f32:
5683; PC64LE9:       # %bb.0: # %entry
5684; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
5685; PC64LE9-NEXT:    xscvspdpn 0, 0
5686; PC64LE9-NEXT:    xscvdpsxds 0, 0
5687; PC64LE9-NEXT:    mffprd 3, 0
5688; PC64LE9-NEXT:    xxswapd 0, 34
5689; PC64LE9-NEXT:    xscvspdpn 0, 0
5690; PC64LE9-NEXT:    xscvdpsxds 0, 0
5691; PC64LE9-NEXT:    mffprd 4, 0
5692; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
5693; PC64LE9-NEXT:    xscvspdpn 0, 0
5694; PC64LE9-NEXT:    xscvdpsxds 0, 0
5695; PC64LE9-NEXT:    mffprd 5, 0
5696; PC64LE9-NEXT:    blr
5697entry:
5698  %result = call <3 x i64> @llvm.experimental.constrained.fptosi.v3i64.v3f32(
5699                                <3 x float> %x,
5700                                metadata !"fpexcept.strict") #0
5701  ret <3 x i64> %result
5702}
5703
5704define <4 x i64> @constrained_vector_fptosi_v4i64_v4f32(<4 x float> %x) #0 {
5705; PC64LE-LABEL: constrained_vector_fptosi_v4i64_v4f32:
5706; PC64LE:       # %bb.0: # %entry
5707; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
5708; PC64LE-NEXT:    xscvspdpn 1, 34
5709; PC64LE-NEXT:    xxswapd 2, 34
5710; PC64LE-NEXT:    xxsldwi 3, 34, 34, 1
5711; PC64LE-NEXT:    xscvspdpn 0, 0
5712; PC64LE-NEXT:    xscvspdpn 2, 2
5713; PC64LE-NEXT:    xscvspdpn 3, 3
5714; PC64LE-NEXT:    xscvdpsxds 1, 1
5715; PC64LE-NEXT:    xscvdpsxds 0, 0
5716; PC64LE-NEXT:    xscvdpsxds 2, 2
5717; PC64LE-NEXT:    xscvdpsxds 3, 3
5718; PC64LE-NEXT:    mffprd 3, 1
5719; PC64LE-NEXT:    mtfprd 1, 3
5720; PC64LE-NEXT:    mffprd 3, 0
5721; PC64LE-NEXT:    mffprd 4, 2
5722; PC64LE-NEXT:    mtfprd 0, 3
5723; PC64LE-NEXT:    mffprd 3, 3
5724; PC64LE-NEXT:    mtfprd 2, 4
5725; PC64LE-NEXT:    mtfprd 3, 3
5726; PC64LE-NEXT:    xxmrghd 34, 2, 0
5727; PC64LE-NEXT:    xxmrghd 35, 1, 3
5728; PC64LE-NEXT:    blr
5729;
5730; PC64LE9-LABEL: constrained_vector_fptosi_v4i64_v4f32:
5731; PC64LE9:       # %bb.0: # %entry
5732; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
5733; PC64LE9-NEXT:    xscvspdpn 0, 0
5734; PC64LE9-NEXT:    xscvdpsxds 0, 0
5735; PC64LE9-NEXT:    mffprd 3, 0
5736; PC64LE9-NEXT:    xxswapd 0, 34
5737; PC64LE9-NEXT:    xscvspdpn 0, 0
5738; PC64LE9-NEXT:    xscvdpsxds 0, 0
5739; PC64LE9-NEXT:    mffprd 4, 0
5740; PC64LE9-NEXT:    xscvspdpn 0, 34
5741; PC64LE9-NEXT:    mtvsrdd 36, 4, 3
5742; PC64LE9-NEXT:    xscvdpsxds 0, 0
5743; PC64LE9-NEXT:    mffprd 3, 0
5744; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
5745; PC64LE9-NEXT:    vmr 2, 4
5746; PC64LE9-NEXT:    xscvspdpn 0, 0
5747; PC64LE9-NEXT:    xscvdpsxds 0, 0
5748; PC64LE9-NEXT:    mffprd 4, 0
5749; PC64LE9-NEXT:    mtvsrdd 35, 3, 4
5750; PC64LE9-NEXT:    blr
5751entry:
5752  %result = call <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f32(
5753                                <4 x float> %x,
5754                                metadata !"fpexcept.strict") #0
5755  ret <4 x i64> %result
5756}
5757
5758define <1 x i32> @constrained_vector_fptosi_v1i32_v1f64(<1 x double> %x) #0 {
5759; PC64LE-LABEL: constrained_vector_fptosi_v1i32_v1f64:
5760; PC64LE:       # %bb.0: # %entry
5761; PC64LE-NEXT:    xscvdpsxws 0, 1
5762; PC64LE-NEXT:    mffprwz 3, 0
5763; PC64LE-NEXT:    blr
5764;
5765; PC64LE9-LABEL: constrained_vector_fptosi_v1i32_v1f64:
5766; PC64LE9:       # %bb.0: # %entry
5767; PC64LE9-NEXT:    xscvdpsxws 0, 1
5768; PC64LE9-NEXT:    mffprwz 3, 0
5769; PC64LE9-NEXT:    blr
5770entry:
5771  %result = call <1 x i32> @llvm.experimental.constrained.fptosi.v1i32.v1f64(
5772                               <1 x double> %x,
5773                               metadata !"fpexcept.strict") #0
5774  ret <1 x i32> %result
5775}
5776
5777
5778define <2 x i32> @constrained_vector_fptosi_v2i32_v2f64(<2 x double> %x) #0 {
5779; PC64LE-LABEL: constrained_vector_fptosi_v2i32_v2f64:
5780; PC64LE:       # %bb.0: # %entry
5781; PC64LE-NEXT:    xxswapd 0, 34
5782; PC64LE-NEXT:    xscvdpsxws 1, 34
5783; PC64LE-NEXT:    xscvdpsxws 0, 0
5784; PC64LE-NEXT:    mffprwz 3, 1
5785; PC64LE-NEXT:    mffprwz 4, 0
5786; PC64LE-NEXT:    mtfprwz 0, 3
5787; PC64LE-NEXT:    mtfprwz 1, 4
5788; PC64LE-NEXT:    xxmrghw 34, 0, 1
5789; PC64LE-NEXT:    blr
5790;
5791; PC64LE9-LABEL: constrained_vector_fptosi_v2i32_v2f64:
5792; PC64LE9:       # %bb.0: # %entry
5793; PC64LE9-NEXT:    xxswapd 1, 34
5794; PC64LE9-NEXT:    xscvdpsxws 0, 34
5795; PC64LE9-NEXT:    xscvdpsxws 1, 1
5796; PC64LE9-NEXT:    mffprwz 3, 0
5797; PC64LE9-NEXT:    mtfprwz 0, 3
5798; PC64LE9-NEXT:    mffprwz 3, 1
5799; PC64LE9-NEXT:    mtfprwz 1, 3
5800; PC64LE9-NEXT:    xxmrghw 34, 0, 1
5801; PC64LE9-NEXT:    blr
5802entry:
5803  %result = call <2 x i32> @llvm.experimental.constrained.fptosi.v2i32.v2f64(
5804                                <2 x double> %x,
5805                                metadata !"fpexcept.strict") #0
5806  ret <2 x i32> %result
5807}
5808
5809define <3 x i32> @constrained_vector_fptosi_v3i32_v3f64(<3 x double> %x) #0 {
5810; PC64LE-LABEL: constrained_vector_fptosi_v3i32_v3f64:
5811; PC64LE:       # %bb.0: # %entry
5812; PC64LE-NEXT:    xscvdpsxws 0, 1
5813; PC64LE-NEXT:    addis 3, 2, .LCPI105_0@toc@ha
5814; PC64LE-NEXT:    xscvdpsxws 1, 2
5815; PC64LE-NEXT:    addi 3, 3, .LCPI105_0@toc@l
5816; PC64LE-NEXT:    xscvdpsxws 2, 3
5817; PC64LE-NEXT:    lvx 2, 0, 3
5818; PC64LE-NEXT:    mffprwz 4, 0
5819; PC64LE-NEXT:    mffprwz 5, 1
5820; PC64LE-NEXT:    mtfprwz 0, 4
5821; PC64LE-NEXT:    mtfprwz 1, 5
5822; PC64LE-NEXT:    mffprwz 4, 2
5823; PC64LE-NEXT:    xxmrghw 35, 1, 0
5824; PC64LE-NEXT:    mtvsrwz 36, 4
5825; PC64LE-NEXT:    vperm 2, 4, 3, 2
5826; PC64LE-NEXT:    blr
5827;
5828; PC64LE9-LABEL: constrained_vector_fptosi_v3i32_v3f64:
5829; PC64LE9:       # %bb.0: # %entry
5830; PC64LE9-NEXT:    xscvdpsxws 0, 1
5831; PC64LE9-NEXT:    xscvdpsxws 1, 2
5832; PC64LE9-NEXT:    mffprwz 3, 0
5833; PC64LE9-NEXT:    mtfprwz 0, 3
5834; PC64LE9-NEXT:    mffprwz 3, 1
5835; PC64LE9-NEXT:    mtfprwz 1, 3
5836; PC64LE9-NEXT:    addis 3, 2, .LCPI105_0@toc@ha
5837; PC64LE9-NEXT:    xxmrghw 34, 1, 0
5838; PC64LE9-NEXT:    xscvdpsxws 0, 3
5839; PC64LE9-NEXT:    addi 3, 3, .LCPI105_0@toc@l
5840; PC64LE9-NEXT:    lxv 35, 0(3)
5841; PC64LE9-NEXT:    mffprwz 3, 0
5842; PC64LE9-NEXT:    mtvsrwz 36, 3
5843; PC64LE9-NEXT:    vperm 2, 4, 2, 3
5844; PC64LE9-NEXT:    blr
5845entry:
5846  %result = call <3 x i32> @llvm.experimental.constrained.fptosi.v3i32.v3f64(
5847                                <3 x double> %x,
5848                                metadata !"fpexcept.strict") #0
5849  ret <3 x i32> %result
5850}
5851
5852define <4 x i32> @constrained_vector_fptosi_v4i32_v4f64(<4 x double> %x) #0 {
5853; PC64LE-LABEL: constrained_vector_fptosi_v4i32_v4f64:
5854; PC64LE:       # %bb.0: # %entry
5855; PC64LE-NEXT:    xxswapd 0, 34
5856; PC64LE-NEXT:    xxswapd 2, 35
5857; PC64LE-NEXT:    xscvdpsxws 1, 34
5858; PC64LE-NEXT:    xscvdpsxws 3, 35
5859; PC64LE-NEXT:    xscvdpsxws 0, 0
5860; PC64LE-NEXT:    xscvdpsxws 2, 2
5861; PC64LE-NEXT:    mffprwz 3, 1
5862; PC64LE-NEXT:    mffprwz 4, 3
5863; PC64LE-NEXT:    mffprwz 5, 0
5864; PC64LE-NEXT:    mffprwz 6, 2
5865; PC64LE-NEXT:    rldimi 5, 3, 32, 0
5866; PC64LE-NEXT:    rldimi 6, 4, 32, 0
5867; PC64LE-NEXT:    mtfprd 0, 5
5868; PC64LE-NEXT:    mtfprd 1, 6
5869; PC64LE-NEXT:    xxmrghd 34, 1, 0
5870; PC64LE-NEXT:    blr
5871;
5872; PC64LE9-LABEL: constrained_vector_fptosi_v4i32_v4f64:
5873; PC64LE9:       # %bb.0: # %entry
5874; PC64LE9-NEXT:    xscvdpsxws 0, 34
5875; PC64LE9-NEXT:    mffprwz 3, 0
5876; PC64LE9-NEXT:    xxswapd 0, 34
5877; PC64LE9-NEXT:    xscvdpsxws 0, 0
5878; PC64LE9-NEXT:    mffprwz 4, 0
5879; PC64LE9-NEXT:    xscvdpsxws 0, 35
5880; PC64LE9-NEXT:    rldimi 4, 3, 32, 0
5881; PC64LE9-NEXT:    mffprwz 3, 0
5882; PC64LE9-NEXT:    xxswapd 0, 35
5883; PC64LE9-NEXT:    xscvdpsxws 0, 0
5884; PC64LE9-NEXT:    mffprwz 5, 0
5885; PC64LE9-NEXT:    rldimi 5, 3, 32, 0
5886; PC64LE9-NEXT:    mtvsrdd 34, 5, 4
5887; PC64LE9-NEXT:    blr
5888entry:
5889  %result = call <4 x i32> @llvm.experimental.constrained.fptosi.v4i32.v4f64(
5890                                <4 x double> %x,
5891                                metadata !"fpexcept.strict") #0
5892  ret <4 x i32> %result
5893}
5894
5895define <1 x i64> @constrained_vector_fptosi_v1i64_v1f64(<1 x double> %x) #0 {
5896; PC64LE-LABEL: constrained_vector_fptosi_v1i64_v1f64:
5897; PC64LE:       # %bb.0: # %entry
5898; PC64LE-NEXT:    xscvdpsxds 0, 1
5899; PC64LE-NEXT:    mffprd 3, 0
5900; PC64LE-NEXT:    blr
5901;
5902; PC64LE9-LABEL: constrained_vector_fptosi_v1i64_v1f64:
5903; PC64LE9:       # %bb.0: # %entry
5904; PC64LE9-NEXT:    xscvdpsxds 0, 1
5905; PC64LE9-NEXT:    mffprd 3, 0
5906; PC64LE9-NEXT:    blr
5907entry:
5908  %result = call <1 x i64> @llvm.experimental.constrained.fptosi.v1i64.v1f64(
5909                               <1 x double> %x,
5910                               metadata !"fpexcept.strict") #0
5911  ret <1 x i64> %result
5912}
5913
5914define <2 x i64> @constrained_vector_fptosi_v2i64_v2f64(<2 x double> %x) #0 {
5915; PC64LE-LABEL: constrained_vector_fptosi_v2i64_v2f64:
5916; PC64LE:       # %bb.0: # %entry
5917; PC64LE-NEXT:    xvcvdpsxds 34, 34
5918; PC64LE-NEXT:    blr
5919;
5920; PC64LE9-LABEL: constrained_vector_fptosi_v2i64_v2f64:
5921; PC64LE9:       # %bb.0: # %entry
5922; PC64LE9-NEXT:    xvcvdpsxds 34, 34
5923; PC64LE9-NEXT:    blr
5924entry:
5925  %result = call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f64(
5926                                <2 x double> %x,
5927                                metadata !"fpexcept.strict") #0
5928  ret <2 x i64> %result
5929}
5930
5931define <3 x i64> @constrained_vector_fptosi_v3i64_v3f64(<3 x double> %x) #0 {
5932; PC64LE-LABEL: constrained_vector_fptosi_v3i64_v3f64:
5933; PC64LE:       # %bb.0: # %entry
5934; PC64LE-NEXT:    xscvdpsxds 0, 1
5935; PC64LE-NEXT:    xscvdpsxds 1, 2
5936; PC64LE-NEXT:    xscvdpsxds 2, 3
5937; PC64LE-NEXT:    mffprd 3, 0
5938; PC64LE-NEXT:    mffprd 4, 1
5939; PC64LE-NEXT:    mffprd 5, 2
5940; PC64LE-NEXT:    blr
5941;
5942; PC64LE9-LABEL: constrained_vector_fptosi_v3i64_v3f64:
5943; PC64LE9:       # %bb.0: # %entry
5944; PC64LE9-NEXT:    xscvdpsxds 0, 1
5945; PC64LE9-NEXT:    mffprd 3, 0
5946; PC64LE9-NEXT:    xscvdpsxds 0, 2
5947; PC64LE9-NEXT:    mffprd 4, 0
5948; PC64LE9-NEXT:    xscvdpsxds 0, 3
5949; PC64LE9-NEXT:    mffprd 5, 0
5950; PC64LE9-NEXT:    blr
5951entry:
5952  %result = call <3 x i64> @llvm.experimental.constrained.fptosi.v3i64.v3f64(
5953                                <3 x double> %x,
5954                                metadata !"fpexcept.strict") #0
5955  ret <3 x i64> %result
5956}
5957
5958define <4 x i64> @constrained_vector_fptosi_v4i64_v4f64(<4 x double> %x) #0 {
5959; PC64LE-LABEL: constrained_vector_fptosi_v4i64_v4f64:
5960; PC64LE:       # %bb.0: # %entry
5961; PC64LE-NEXT:    xvcvdpsxds 35, 35
5962; PC64LE-NEXT:    xvcvdpsxds 34, 34
5963; PC64LE-NEXT:    blr
5964;
5965; PC64LE9-LABEL: constrained_vector_fptosi_v4i64_v4f64:
5966; PC64LE9:       # %bb.0: # %entry
5967; PC64LE9-NEXT:    xvcvdpsxds 35, 35
5968; PC64LE9-NEXT:    xvcvdpsxds 34, 34
5969; PC64LE9-NEXT:    blr
5970entry:
5971  %result = call <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f64(
5972                                <4 x double> %x,
5973                                metadata !"fpexcept.strict") #0
5974  ret <4 x i64> %result
5975}
5976
5977define <1 x i32> @constrained_vector_fptoui_v1i32_v1f32(<1 x float> %x) #0 {
5978; PC64LE-LABEL: constrained_vector_fptoui_v1i32_v1f32:
5979; PC64LE:       # %bb.0: # %entry
5980; PC64LE-NEXT:    xscvdpuxws 0, 1
5981; PC64LE-NEXT:    mffprwz 3, 0
5982; PC64LE-NEXT:    blr
5983;
5984; PC64LE9-LABEL: constrained_vector_fptoui_v1i32_v1f32:
5985; PC64LE9:       # %bb.0: # %entry
5986; PC64LE9-NEXT:    xscvdpuxws 0, 1
5987; PC64LE9-NEXT:    mffprwz 3, 0
5988; PC64LE9-NEXT:    blr
5989entry:
5990  %result = call <1 x i32> @llvm.experimental.constrained.fptoui.v1i32.v1f32(
5991                               <1 x float> %x,
5992                               metadata !"fpexcept.strict") #0
5993  ret <1 x i32> %result
5994}
5995
5996define <2 x i32> @constrained_vector_fptoui_v2i32_v2f32(<2 x float> %x) #0 {
5997; PC64LE-LABEL: constrained_vector_fptoui_v2i32_v2f32:
5998; PC64LE:       # %bb.0: # %entry
5999; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6000; PC64LE-NEXT:    xxswapd 1, 34
6001; PC64LE-NEXT:    xscvspdpn 0, 0
6002; PC64LE-NEXT:    xscvspdpn 1, 1
6003; PC64LE-NEXT:    xscvdpuxws 0, 0
6004; PC64LE-NEXT:    xscvdpuxws 1, 1
6005; PC64LE-NEXT:    mffprwz 3, 0
6006; PC64LE-NEXT:    mffprwz 4, 1
6007; PC64LE-NEXT:    mtfprwz 0, 3
6008; PC64LE-NEXT:    mtfprwz 1, 4
6009; PC64LE-NEXT:    xxmrghw 34, 1, 0
6010; PC64LE-NEXT:    blr
6011;
6012; PC64LE9-LABEL: constrained_vector_fptoui_v2i32_v2f32:
6013; PC64LE9:       # %bb.0: # %entry
6014; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
6015; PC64LE9-NEXT:    xxswapd 1, 34
6016; PC64LE9-NEXT:    xscvspdpn 0, 0
6017; PC64LE9-NEXT:    xscvspdpn 1, 1
6018; PC64LE9-NEXT:    xscvdpuxws 0, 0
6019; PC64LE9-NEXT:    xscvdpuxws 1, 1
6020; PC64LE9-NEXT:    mffprwz 3, 0
6021; PC64LE9-NEXT:    mtfprwz 0, 3
6022; PC64LE9-NEXT:    mffprwz 3, 1
6023; PC64LE9-NEXT:    mtfprwz 1, 3
6024; PC64LE9-NEXT:    xxmrghw 34, 1, 0
6025; PC64LE9-NEXT:    blr
6026entry:
6027  %result = call <2 x i32> @llvm.experimental.constrained.fptoui.v2i32.v2f32(
6028                                <2 x float> %x,
6029                                metadata !"fpexcept.strict") #0
6030  ret <2 x i32> %result
6031}
6032
6033define <3 x i32> @constrained_vector_fptoui_v3i32_v3f32(<3 x float> %x) #0 {
6034; PC64LE-LABEL: constrained_vector_fptoui_v3i32_v3f32:
6035; PC64LE:       # %bb.0: # %entry
6036; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6037; PC64LE-NEXT:    xxswapd 1, 34
6038; PC64LE-NEXT:    addis 3, 2, .LCPI113_0@toc@ha
6039; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
6040; PC64LE-NEXT:    addi 3, 3, .LCPI113_0@toc@l
6041; PC64LE-NEXT:    lvx 2, 0, 3
6042; PC64LE-NEXT:    xscvspdpn 0, 0
6043; PC64LE-NEXT:    xscvspdpn 1, 1
6044; PC64LE-NEXT:    xscvspdpn 2, 2
6045; PC64LE-NEXT:    xscvdpuxws 0, 0
6046; PC64LE-NEXT:    xscvdpuxws 1, 1
6047; PC64LE-NEXT:    xscvdpuxws 2, 2
6048; PC64LE-NEXT:    mffprwz 4, 0
6049; PC64LE-NEXT:    mffprwz 5, 1
6050; PC64LE-NEXT:    mtfprwz 0, 4
6051; PC64LE-NEXT:    mtfprwz 1, 5
6052; PC64LE-NEXT:    mffprwz 4, 2
6053; PC64LE-NEXT:    xxmrghw 35, 1, 0
6054; PC64LE-NEXT:    mtvsrwz 36, 4
6055; PC64LE-NEXT:    vperm 2, 4, 3, 2
6056; PC64LE-NEXT:    blr
6057;
6058; PC64LE9-LABEL: constrained_vector_fptoui_v3i32_v3f32:
6059; PC64LE9:       # %bb.0: # %entry
6060; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
6061; PC64LE9-NEXT:    xxswapd 1, 34
6062; PC64LE9-NEXT:    xscvspdpn 0, 0
6063; PC64LE9-NEXT:    xscvspdpn 1, 1
6064; PC64LE9-NEXT:    xscvdpuxws 0, 0
6065; PC64LE9-NEXT:    xscvdpuxws 1, 1
6066; PC64LE9-NEXT:    mffprwz 3, 0
6067; PC64LE9-NEXT:    mtfprwz 0, 3
6068; PC64LE9-NEXT:    mffprwz 3, 1
6069; PC64LE9-NEXT:    mtfprwz 1, 3
6070; PC64LE9-NEXT:    addis 3, 2, .LCPI113_0@toc@ha
6071; PC64LE9-NEXT:    xxmrghw 35, 1, 0
6072; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
6073; PC64LE9-NEXT:    addi 3, 3, .LCPI113_0@toc@l
6074; PC64LE9-NEXT:    lxv 36, 0(3)
6075; PC64LE9-NEXT:    xscvspdpn 0, 0
6076; PC64LE9-NEXT:    xscvdpuxws 0, 0
6077; PC64LE9-NEXT:    mffprwz 3, 0
6078; PC64LE9-NEXT:    mtvsrwz 34, 3
6079; PC64LE9-NEXT:    vperm 2, 2, 3, 4
6080; PC64LE9-NEXT:    blr
6081entry:
6082  %result = call <3 x i32> @llvm.experimental.constrained.fptoui.v3i32.v3f32(
6083                                <3 x float> %x,
6084                                metadata !"fpexcept.strict") #0
6085  ret <3 x i32> %result
6086}
6087
6088define <4 x i32> @constrained_vector_fptoui_v4i32_v4f32(<4 x float> %x) #0 {
6089; PC64LE-LABEL: constrained_vector_fptoui_v4i32_v4f32:
6090; PC64LE:       # %bb.0: # %entry
6091; PC64LE-NEXT:    xvcvspuxws 34, 34
6092; PC64LE-NEXT:    blr
6093;
6094; PC64LE9-LABEL: constrained_vector_fptoui_v4i32_v4f32:
6095; PC64LE9:       # %bb.0: # %entry
6096; PC64LE9-NEXT:    xvcvspuxws 34, 34
6097; PC64LE9-NEXT:    blr
6098entry:
6099  %result = call <4 x i32> @llvm.experimental.constrained.fptoui.v4i32.v4f32(
6100                                <4 x float> %x,
6101                                metadata !"fpexcept.strict") #0
6102  ret <4 x i32> %result
6103}
6104
6105define <1 x i64> @constrained_vector_fptoui_v1i64_v1f32(<1 x float> %x) #0 {
6106; PC64LE-LABEL: constrained_vector_fptoui_v1i64_v1f32:
6107; PC64LE:       # %bb.0: # %entry
6108; PC64LE-NEXT:    xscvdpuxds 0, 1
6109; PC64LE-NEXT:    mffprd 3, 0
6110; PC64LE-NEXT:    blr
6111;
6112; PC64LE9-LABEL: constrained_vector_fptoui_v1i64_v1f32:
6113; PC64LE9:       # %bb.0: # %entry
6114; PC64LE9-NEXT:    xscvdpuxds 0, 1
6115; PC64LE9-NEXT:    mffprd 3, 0
6116; PC64LE9-NEXT:    blr
6117entry:
6118  %result = call <1 x i64> @llvm.experimental.constrained.fptoui.v1i64.v1f32(
6119                               <1 x float> %x,
6120                               metadata !"fpexcept.strict") #0
6121  ret <1 x i64> %result
6122}
6123
6124define <2 x i64> @constrained_vector_fptoui_v2i64_v2f32(<2 x float> %x) #0 {
6125; PC64LE-LABEL: constrained_vector_fptoui_v2i64_v2f32:
6126; PC64LE:       # %bb.0: # %entry
6127; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6128; PC64LE-NEXT:    xxswapd 1, 34
6129; PC64LE-NEXT:    xscvspdpn 0, 0
6130; PC64LE-NEXT:    xscvspdpn 1, 1
6131; PC64LE-NEXT:    xscvdpuxds 0, 0
6132; PC64LE-NEXT:    xscvdpuxds 1, 1
6133; PC64LE-NEXT:    mffprd 3, 0
6134; PC64LE-NEXT:    mffprd 4, 1
6135; PC64LE-NEXT:    mtfprd 0, 3
6136; PC64LE-NEXT:    mtfprd 1, 4
6137; PC64LE-NEXT:    xxmrghd 34, 1, 0
6138; PC64LE-NEXT:    blr
6139;
6140; PC64LE9-LABEL: constrained_vector_fptoui_v2i64_v2f32:
6141; PC64LE9:       # %bb.0: # %entry
6142; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
6143; PC64LE9-NEXT:    xscvspdpn 0, 0
6144; PC64LE9-NEXT:    xscvdpuxds 0, 0
6145; PC64LE9-NEXT:    mffprd 3, 0
6146; PC64LE9-NEXT:    xxswapd 0, 34
6147; PC64LE9-NEXT:    xscvspdpn 0, 0
6148; PC64LE9-NEXT:    xscvdpuxds 0, 0
6149; PC64LE9-NEXT:    mffprd 4, 0
6150; PC64LE9-NEXT:    mtvsrdd 34, 4, 3
6151; PC64LE9-NEXT:    blr
6152entry:
6153  %result = call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f32(
6154                                <2 x float> %x,
6155                                metadata !"fpexcept.strict") #0
6156  ret <2 x i64> %result
6157}
6158
6159define <3 x i64> @constrained_vector_fptoui_v3i64_v3f32(<3 x float> %x) #0 {
6160; PC64LE-LABEL: constrained_vector_fptoui_v3i64_v3f32:
6161; PC64LE:       # %bb.0: # %entry
6162; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6163; PC64LE-NEXT:    xxswapd 1, 34
6164; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
6165; PC64LE-NEXT:    xscvspdpn 0, 0
6166; PC64LE-NEXT:    xscvspdpn 1, 1
6167; PC64LE-NEXT:    xscvspdpn 2, 2
6168; PC64LE-NEXT:    xscvdpuxds 0, 0
6169; PC64LE-NEXT:    xscvdpuxds 1, 1
6170; PC64LE-NEXT:    xscvdpuxds 2, 2
6171; PC64LE-NEXT:    mffprd 3, 0
6172; PC64LE-NEXT:    mffprd 4, 1
6173; PC64LE-NEXT:    mffprd 5, 2
6174; PC64LE-NEXT:    blr
6175;
6176; PC64LE9-LABEL: constrained_vector_fptoui_v3i64_v3f32:
6177; PC64LE9:       # %bb.0: # %entry
6178; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
6179; PC64LE9-NEXT:    xscvspdpn 0, 0
6180; PC64LE9-NEXT:    xscvdpuxds 0, 0
6181; PC64LE9-NEXT:    mffprd 3, 0
6182; PC64LE9-NEXT:    xxswapd 0, 34
6183; PC64LE9-NEXT:    xscvspdpn 0, 0
6184; PC64LE9-NEXT:    xscvdpuxds 0, 0
6185; PC64LE9-NEXT:    mffprd 4, 0
6186; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
6187; PC64LE9-NEXT:    xscvspdpn 0, 0
6188; PC64LE9-NEXT:    xscvdpuxds 0, 0
6189; PC64LE9-NEXT:    mffprd 5, 0
6190; PC64LE9-NEXT:    blr
6191entry:
6192  %result = call <3 x i64> @llvm.experimental.constrained.fptoui.v3i64.v3f32(
6193                                <3 x float> %x,
6194                                metadata !"fpexcept.strict") #0
6195  ret <3 x i64> %result
6196}
6197
6198define <4 x i64> @constrained_vector_fptoui_v4i64_v4f32(<4 x float> %x) #0 {
6199; PC64LE-LABEL: constrained_vector_fptoui_v4i64_v4f32:
6200; PC64LE:       # %bb.0: # %entry
6201; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6202; PC64LE-NEXT:    xscvspdpn 1, 34
6203; PC64LE-NEXT:    xxswapd 2, 34
6204; PC64LE-NEXT:    xxsldwi 3, 34, 34, 1
6205; PC64LE-NEXT:    xscvspdpn 0, 0
6206; PC64LE-NEXT:    xscvspdpn 2, 2
6207; PC64LE-NEXT:    xscvspdpn 3, 3
6208; PC64LE-NEXT:    xscvdpuxds 1, 1
6209; PC64LE-NEXT:    xscvdpuxds 0, 0
6210; PC64LE-NEXT:    xscvdpuxds 2, 2
6211; PC64LE-NEXT:    xscvdpuxds 3, 3
6212; PC64LE-NEXT:    mffprd 3, 1
6213; PC64LE-NEXT:    mtfprd 1, 3
6214; PC64LE-NEXT:    mffprd 3, 0
6215; PC64LE-NEXT:    mffprd 4, 2
6216; PC64LE-NEXT:    mtfprd 0, 3
6217; PC64LE-NEXT:    mffprd 3, 3
6218; PC64LE-NEXT:    mtfprd 2, 4
6219; PC64LE-NEXT:    mtfprd 3, 3
6220; PC64LE-NEXT:    xxmrghd 34, 2, 0
6221; PC64LE-NEXT:    xxmrghd 35, 1, 3
6222; PC64LE-NEXT:    blr
6223;
6224; PC64LE9-LABEL: constrained_vector_fptoui_v4i64_v4f32:
6225; PC64LE9:       # %bb.0: # %entry
6226; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
6227; PC64LE9-NEXT:    xscvspdpn 0, 0
6228; PC64LE9-NEXT:    xscvdpuxds 0, 0
6229; PC64LE9-NEXT:    mffprd 3, 0
6230; PC64LE9-NEXT:    xxswapd 0, 34
6231; PC64LE9-NEXT:    xscvspdpn 0, 0
6232; PC64LE9-NEXT:    xscvdpuxds 0, 0
6233; PC64LE9-NEXT:    mffprd 4, 0
6234; PC64LE9-NEXT:    xscvspdpn 0, 34
6235; PC64LE9-NEXT:    mtvsrdd 36, 4, 3
6236; PC64LE9-NEXT:    xscvdpuxds 0, 0
6237; PC64LE9-NEXT:    mffprd 3, 0
6238; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
6239; PC64LE9-NEXT:    vmr 2, 4
6240; PC64LE9-NEXT:    xscvspdpn 0, 0
6241; PC64LE9-NEXT:    xscvdpuxds 0, 0
6242; PC64LE9-NEXT:    mffprd 4, 0
6243; PC64LE9-NEXT:    mtvsrdd 35, 3, 4
6244; PC64LE9-NEXT:    blr
6245entry:
6246  %result = call <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f32(
6247                                <4 x float> %x,
6248                                metadata !"fpexcept.strict") #0
6249  ret <4 x i64> %result
6250}
6251
6252define <1 x i32> @constrained_vector_fptoui_v1i32_v1f64(<1 x double> %x) #0 {
6253; PC64LE-LABEL: constrained_vector_fptoui_v1i32_v1f64:
6254; PC64LE:       # %bb.0: # %entry
6255; PC64LE-NEXT:    xscvdpuxws 0, 1
6256; PC64LE-NEXT:    mffprwz 3, 0
6257; PC64LE-NEXT:    blr
6258;
6259; PC64LE9-LABEL: constrained_vector_fptoui_v1i32_v1f64:
6260; PC64LE9:       # %bb.0: # %entry
6261; PC64LE9-NEXT:    xscvdpuxws 0, 1
6262; PC64LE9-NEXT:    mffprwz 3, 0
6263; PC64LE9-NEXT:    blr
6264entry:
6265  %result = call <1 x i32> @llvm.experimental.constrained.fptoui.v1i32.v1f64(
6266                               <1 x double> %x,
6267                               metadata !"fpexcept.strict") #0
6268  ret <1 x i32> %result
6269}
6270
6271define <2 x i32> @constrained_vector_fptoui_v2i32_v2f64(<2 x double> %x) #0 {
6272; PC64LE-LABEL: constrained_vector_fptoui_v2i32_v2f64:
6273; PC64LE:       # %bb.0: # %entry
6274; PC64LE-NEXT:    xxswapd 0, 34
6275; PC64LE-NEXT:    xscvdpuxws 1, 34
6276; PC64LE-NEXT:    xscvdpuxws 0, 0
6277; PC64LE-NEXT:    mffprwz 3, 1
6278; PC64LE-NEXT:    mffprwz 4, 0
6279; PC64LE-NEXT:    mtfprwz 0, 3
6280; PC64LE-NEXT:    mtfprwz 1, 4
6281; PC64LE-NEXT:    xxmrghw 34, 0, 1
6282; PC64LE-NEXT:    blr
6283;
6284; PC64LE9-LABEL: constrained_vector_fptoui_v2i32_v2f64:
6285; PC64LE9:       # %bb.0: # %entry
6286; PC64LE9-NEXT:    xxswapd 1, 34
6287; PC64LE9-NEXT:    xscvdpuxws 0, 34
6288; PC64LE9-NEXT:    xscvdpuxws 1, 1
6289; PC64LE9-NEXT:    mffprwz 3, 0
6290; PC64LE9-NEXT:    mtfprwz 0, 3
6291; PC64LE9-NEXT:    mffprwz 3, 1
6292; PC64LE9-NEXT:    mtfprwz 1, 3
6293; PC64LE9-NEXT:    xxmrghw 34, 0, 1
6294; PC64LE9-NEXT:    blr
6295entry:
6296  %result = call <2 x i32> @llvm.experimental.constrained.fptoui.v2i32.v2f64(
6297                                <2 x double> %x,
6298                                metadata !"fpexcept.strict") #0
6299  ret <2 x i32> %result
6300}
6301
6302define <3 x i32> @constrained_vector_fptoui_v3i32_v3f64(<3 x double> %x) #0 {
6303; PC64LE-LABEL: constrained_vector_fptoui_v3i32_v3f64:
6304; PC64LE:       # %bb.0: # %entry
6305; PC64LE-NEXT:    xscvdpuxws 0, 1
6306; PC64LE-NEXT:    addis 3, 2, .LCPI121_0@toc@ha
6307; PC64LE-NEXT:    xscvdpuxws 1, 2
6308; PC64LE-NEXT:    addi 3, 3, .LCPI121_0@toc@l
6309; PC64LE-NEXT:    xscvdpuxws 2, 3
6310; PC64LE-NEXT:    lvx 2, 0, 3
6311; PC64LE-NEXT:    mffprwz 4, 0
6312; PC64LE-NEXT:    mffprwz 5, 1
6313; PC64LE-NEXT:    mtfprwz 0, 4
6314; PC64LE-NEXT:    mtfprwz 1, 5
6315; PC64LE-NEXT:    mffprwz 4, 2
6316; PC64LE-NEXT:    xxmrghw 35, 1, 0
6317; PC64LE-NEXT:    mtvsrwz 36, 4
6318; PC64LE-NEXT:    vperm 2, 4, 3, 2
6319; PC64LE-NEXT:    blr
6320;
6321; PC64LE9-LABEL: constrained_vector_fptoui_v3i32_v3f64:
6322; PC64LE9:       # %bb.0: # %entry
6323; PC64LE9-NEXT:    xscvdpuxws 0, 1
6324; PC64LE9-NEXT:    xscvdpuxws 1, 2
6325; PC64LE9-NEXT:    mffprwz 3, 0
6326; PC64LE9-NEXT:    mtfprwz 0, 3
6327; PC64LE9-NEXT:    mffprwz 3, 1
6328; PC64LE9-NEXT:    mtfprwz 1, 3
6329; PC64LE9-NEXT:    addis 3, 2, .LCPI121_0@toc@ha
6330; PC64LE9-NEXT:    xxmrghw 34, 1, 0
6331; PC64LE9-NEXT:    xscvdpuxws 0, 3
6332; PC64LE9-NEXT:    addi 3, 3, .LCPI121_0@toc@l
6333; PC64LE9-NEXT:    lxv 35, 0(3)
6334; PC64LE9-NEXT:    mffprwz 3, 0
6335; PC64LE9-NEXT:    mtvsrwz 36, 3
6336; PC64LE9-NEXT:    vperm 2, 4, 2, 3
6337; PC64LE9-NEXT:    blr
6338entry:
6339  %result = call <3 x i32> @llvm.experimental.constrained.fptoui.v3i32.v3f64(
6340                                <3 x double> %x,
6341                                metadata !"fpexcept.strict") #0
6342  ret <3 x i32> %result
6343}
6344
6345define <4 x i32> @constrained_vector_fptoui_v4i32_v4f64(<4 x double> %x) #0 {
6346; PC64LE-LABEL: constrained_vector_fptoui_v4i32_v4f64:
6347; PC64LE:       # %bb.0: # %entry
6348; PC64LE-NEXT:    xxswapd 0, 34
6349; PC64LE-NEXT:    xxswapd 2, 35
6350; PC64LE-NEXT:    xscvdpuxws 1, 34
6351; PC64LE-NEXT:    xscvdpuxws 3, 35
6352; PC64LE-NEXT:    xscvdpuxws 0, 0
6353; PC64LE-NEXT:    xscvdpuxws 2, 2
6354; PC64LE-NEXT:    mffprwz 3, 1
6355; PC64LE-NEXT:    mffprwz 4, 3
6356; PC64LE-NEXT:    mffprwz 5, 0
6357; PC64LE-NEXT:    mffprwz 6, 2
6358; PC64LE-NEXT:    rldimi 5, 3, 32, 0
6359; PC64LE-NEXT:    rldimi 6, 4, 32, 0
6360; PC64LE-NEXT:    mtfprd 0, 5
6361; PC64LE-NEXT:    mtfprd 1, 6
6362; PC64LE-NEXT:    xxmrghd 34, 1, 0
6363; PC64LE-NEXT:    blr
6364;
6365; PC64LE9-LABEL: constrained_vector_fptoui_v4i32_v4f64:
6366; PC64LE9:       # %bb.0: # %entry
6367; PC64LE9-NEXT:    xscvdpuxws 0, 34
6368; PC64LE9-NEXT:    mffprwz 3, 0
6369; PC64LE9-NEXT:    xxswapd 0, 34
6370; PC64LE9-NEXT:    xscvdpuxws 0, 0
6371; PC64LE9-NEXT:    mffprwz 4, 0
6372; PC64LE9-NEXT:    xscvdpuxws 0, 35
6373; PC64LE9-NEXT:    rldimi 4, 3, 32, 0
6374; PC64LE9-NEXT:    mffprwz 3, 0
6375; PC64LE9-NEXT:    xxswapd 0, 35
6376; PC64LE9-NEXT:    xscvdpuxws 0, 0
6377; PC64LE9-NEXT:    mffprwz 5, 0
6378; PC64LE9-NEXT:    rldimi 5, 3, 32, 0
6379; PC64LE9-NEXT:    mtvsrdd 34, 5, 4
6380; PC64LE9-NEXT:    blr
6381entry:
6382  %result = call <4 x i32> @llvm.experimental.constrained.fptoui.v4i32.v4f64(
6383                                <4 x double> %x,
6384                                metadata !"fpexcept.strict") #0
6385  ret <4 x i32> %result
6386}
6387
6388define <1 x i64> @constrained_vector_fptoui_v1i64_v1f64(<1 x double> %x) #0 {
6389; PC64LE-LABEL: constrained_vector_fptoui_v1i64_v1f64:
6390; PC64LE:       # %bb.0: # %entry
6391; PC64LE-NEXT:    xscvdpuxds 0, 1
6392; PC64LE-NEXT:    mffprd 3, 0
6393; PC64LE-NEXT:    blr
6394;
6395; PC64LE9-LABEL: constrained_vector_fptoui_v1i64_v1f64:
6396; PC64LE9:       # %bb.0: # %entry
6397; PC64LE9-NEXT:    xscvdpuxds 0, 1
6398; PC64LE9-NEXT:    mffprd 3, 0
6399; PC64LE9-NEXT:    blr
6400entry:
6401  %result = call <1 x i64> @llvm.experimental.constrained.fptoui.v1i64.v1f64(
6402                               <1 x double> %x,
6403                               metadata !"fpexcept.strict") #0
6404  ret <1 x i64> %result
6405}
6406
6407define <2 x i64> @constrained_vector_fptoui_v2i64_v2f64(<2 x double> %x) #0 {
6408; PC64LE-LABEL: constrained_vector_fptoui_v2i64_v2f64:
6409; PC64LE:       # %bb.0: # %entry
6410; PC64LE-NEXT:    xvcvdpuxds 34, 34
6411; PC64LE-NEXT:    blr
6412;
6413; PC64LE9-LABEL: constrained_vector_fptoui_v2i64_v2f64:
6414; PC64LE9:       # %bb.0: # %entry
6415; PC64LE9-NEXT:    xvcvdpuxds 34, 34
6416; PC64LE9-NEXT:    blr
6417entry:
6418  %result = call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f64(
6419                                <2 x double> %x,
6420                                metadata !"fpexcept.strict") #0
6421  ret <2 x i64> %result
6422}
6423
6424define <3 x i64> @constrained_vector_fptoui_v3i64_v3f64(<3 x double> %x) #0 {
6425; PC64LE-LABEL: constrained_vector_fptoui_v3i64_v3f64:
6426; PC64LE:       # %bb.0: # %entry
6427; PC64LE-NEXT:    xscvdpuxds 0, 1
6428; PC64LE-NEXT:    xscvdpuxds 1, 2
6429; PC64LE-NEXT:    xscvdpuxds 2, 3
6430; PC64LE-NEXT:    mffprd 3, 0
6431; PC64LE-NEXT:    mffprd 4, 1
6432; PC64LE-NEXT:    mffprd 5, 2
6433; PC64LE-NEXT:    blr
6434;
6435; PC64LE9-LABEL: constrained_vector_fptoui_v3i64_v3f64:
6436; PC64LE9:       # %bb.0: # %entry
6437; PC64LE9-NEXT:    xscvdpuxds 0, 1
6438; PC64LE9-NEXT:    mffprd 3, 0
6439; PC64LE9-NEXT:    xscvdpuxds 0, 2
6440; PC64LE9-NEXT:    mffprd 4, 0
6441; PC64LE9-NEXT:    xscvdpuxds 0, 3
6442; PC64LE9-NEXT:    mffprd 5, 0
6443; PC64LE9-NEXT:    blr
6444entry:
6445  %result = call <3 x i64> @llvm.experimental.constrained.fptoui.v3i64.v3f64(
6446                                <3 x double> %x,
6447                                metadata !"fpexcept.strict") #0
6448  ret <3 x i64> %result
6449}
6450
6451define <4 x i64> @constrained_vector_fptoui_v4i64_v4f64(<4 x double> %x) #0 {
6452; PC64LE-LABEL: constrained_vector_fptoui_v4i64_v4f64:
6453; PC64LE:       # %bb.0: # %entry
6454; PC64LE-NEXT:    xvcvdpuxds 35, 35
6455; PC64LE-NEXT:    xvcvdpuxds 34, 34
6456; PC64LE-NEXT:    blr
6457;
6458; PC64LE9-LABEL: constrained_vector_fptoui_v4i64_v4f64:
6459; PC64LE9:       # %bb.0: # %entry
6460; PC64LE9-NEXT:    xvcvdpuxds 35, 35
6461; PC64LE9-NEXT:    xvcvdpuxds 34, 34
6462; PC64LE9-NEXT:    blr
6463entry:
6464  %result = call <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f64(
6465                                <4 x double> %x,
6466                                metadata !"fpexcept.strict") #0
6467  ret <4 x i64> %result
6468}
6469
6470define <1 x float> @constrained_vector_fptrunc_v1f64(<1 x double> %x) #0 {
6471; PC64LE-LABEL: constrained_vector_fptrunc_v1f64:
6472; PC64LE:       # %bb.0: # %entry
6473; PC64LE-NEXT:    xsrsp 1, 1
6474; PC64LE-NEXT:    blr
6475;
6476; PC64LE9-LABEL: constrained_vector_fptrunc_v1f64:
6477; PC64LE9:       # %bb.0: # %entry
6478; PC64LE9-NEXT:    xsrsp 1, 1
6479; PC64LE9-NEXT:    blr
6480entry:
6481  %result = call <1 x float> @llvm.experimental.constrained.fptrunc.v1f32.v1f64(
6482                                <1 x double> %x,
6483                                metadata !"round.dynamic",
6484                                metadata !"fpexcept.strict") #1
6485  ret <1 x float> %result
6486}
6487
6488define <2 x float> @constrained_vector_fptrunc_v2f64(<2 x double> %x) #0 {
6489; PC64LE-LABEL: constrained_vector_fptrunc_v2f64:
6490; PC64LE:       # %bb.0: # %entry
6491; PC64LE-NEXT:    xxswapd 0, 34
6492; PC64LE-NEXT:    xsrsp 1, 34
6493; PC64LE-NEXT:    xsrsp 0, 0
6494; PC64LE-NEXT:    xscvdpspn 1, 1
6495; PC64LE-NEXT:    xscvdpspn 0, 0
6496; PC64LE-NEXT:    xxmrghw 34, 1, 0
6497; PC64LE-NEXT:    blr
6498;
6499; PC64LE9-LABEL: constrained_vector_fptrunc_v2f64:
6500; PC64LE9:       # %bb.0: # %entry
6501; PC64LE9-NEXT:    xxswapd 1, 34
6502; PC64LE9-NEXT:    xsrsp 0, 34
6503; PC64LE9-NEXT:    xsrsp 1, 1
6504; PC64LE9-NEXT:    xscvdpspn 0, 0
6505; PC64LE9-NEXT:    xscvdpspn 1, 1
6506; PC64LE9-NEXT:    xxmrghw 34, 0, 1
6507; PC64LE9-NEXT:    blr
6508entry:
6509  %result = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(
6510                                <2 x double> %x,
6511                                metadata !"round.dynamic",
6512                                metadata !"fpexcept.strict") #1
6513  ret <2 x float> %result
6514}
6515
6516define <3 x float> @constrained_vector_fptrunc_v3f64(<3 x double> %x) #0 {
6517; PC64LE-LABEL: constrained_vector_fptrunc_v3f64:
6518; PC64LE:       # %bb.0: # %entry
6519; PC64LE-NEXT:    xsrsp 0, 1
6520; PC64LE-NEXT:    addis 3, 2, .LCPI129_0@toc@ha
6521; PC64LE-NEXT:    xsrsp 1, 2
6522; PC64LE-NEXT:    addi 3, 3, .LCPI129_0@toc@l
6523; PC64LE-NEXT:    xsrsp 2, 3
6524; PC64LE-NEXT:    lvx 4, 0, 3
6525; PC64LE-NEXT:    xscvdpspn 0, 0
6526; PC64LE-NEXT:    xscvdpspn 1, 1
6527; PC64LE-NEXT:    xscvdpspn 34, 2
6528; PC64LE-NEXT:    xxmrghw 35, 1, 0
6529; PC64LE-NEXT:    vperm 2, 2, 3, 4
6530; PC64LE-NEXT:    blr
6531;
6532; PC64LE9-LABEL: constrained_vector_fptrunc_v3f64:
6533; PC64LE9:       # %bb.0: # %entry
6534; PC64LE9-NEXT:    xsrsp 0, 1
6535; PC64LE9-NEXT:    xsrsp 1, 2
6536; PC64LE9-NEXT:    addis 3, 2, .LCPI129_0@toc@ha
6537; PC64LE9-NEXT:    addi 3, 3, .LCPI129_0@toc@l
6538; PC64LE9-NEXT:    lxv 35, 0(3)
6539; PC64LE9-NEXT:    xscvdpspn 0, 0
6540; PC64LE9-NEXT:    xscvdpspn 1, 1
6541; PC64LE9-NEXT:    xxmrghw 34, 1, 0
6542; PC64LE9-NEXT:    xsrsp 0, 3
6543; PC64LE9-NEXT:    xscvdpspn 36, 0
6544; PC64LE9-NEXT:    vperm 2, 4, 2, 3
6545; PC64LE9-NEXT:    blr
6546entry:
6547  %result = call <3 x float> @llvm.experimental.constrained.fptrunc.v3f32.v3f64(
6548                                <3 x double> %x,
6549                                metadata !"round.dynamic",
6550                                metadata !"fpexcept.strict") #1
6551  ret <3 x float> %result
6552}
6553
6554define <4 x float> @constrained_vector_fptrunc_v4f64(<4 x double> %x) #0 {
6555; PC64LE-LABEL: constrained_vector_fptrunc_v4f64:
6556; PC64LE:       # %bb.0: # %entry
6557; PC64LE-NEXT:    xxmrgld 0, 35, 34
6558; PC64LE-NEXT:    xxmrghd 1, 35, 34
6559; PC64LE-NEXT:    xvcvdpsp 34, 0
6560; PC64LE-NEXT:    xvcvdpsp 35, 1
6561; PC64LE-NEXT:    vmrgew 2, 3, 2
6562; PC64LE-NEXT:    blr
6563;
6564; PC64LE9-LABEL: constrained_vector_fptrunc_v4f64:
6565; PC64LE9:       # %bb.0: # %entry
6566; PC64LE9-NEXT:    xxmrgld 0, 35, 34
6567; PC64LE9-NEXT:    xvcvdpsp 36, 0
6568; PC64LE9-NEXT:    xxmrghd 0, 35, 34
6569; PC64LE9-NEXT:    xvcvdpsp 34, 0
6570; PC64LE9-NEXT:    vmrgew 2, 2, 4
6571; PC64LE9-NEXT:    blr
6572entry:
6573  %result = call <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(
6574                                <4 x double> %x,
6575                                metadata !"round.dynamic",
6576                                metadata !"fpexcept.strict") #1
6577  ret <4 x float> %result
6578}
6579
6580define <1 x double> @constrained_vector_fpext_v1f32(<1 x float> %x) #0 {
6581; PC64LE-LABEL: constrained_vector_fpext_v1f32:
6582; PC64LE:       # %bb.0: # %entry
6583; PC64LE-NEXT:    blr
6584;
6585; PC64LE9-LABEL: constrained_vector_fpext_v1f32:
6586; PC64LE9:       # %bb.0: # %entry
6587; PC64LE9-NEXT:    blr
6588entry:
6589  %result = call <1 x double> @llvm.experimental.constrained.fpext.v1f64.v1f32(
6590                                <1 x float> %x,
6591                                metadata !"fpexcept.strict") #1
6592  ret <1 x double> %result
6593}
6594
6595define <2 x double> @constrained_vector_fpext_v2f32(<2 x float> %x) #0 {
6596; PC64LE-LABEL: constrained_vector_fpext_v2f32:
6597; PC64LE:       # %bb.0: # %entry
6598; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6599; PC64LE-NEXT:    xxswapd 1, 34
6600; PC64LE-NEXT:    xscvspdpn 0, 0
6601; PC64LE-NEXT:    xscvspdpn 1, 1
6602; PC64LE-NEXT:    xxmrghd 34, 1, 0
6603; PC64LE-NEXT:    blr
6604;
6605; PC64LE9-LABEL: constrained_vector_fpext_v2f32:
6606; PC64LE9:       # %bb.0: # %entry
6607; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
6608; PC64LE9-NEXT:    xxswapd 1, 34
6609; PC64LE9-NEXT:    xscvspdpn 0, 0
6610; PC64LE9-NEXT:    xscvspdpn 1, 1
6611; PC64LE9-NEXT:    xxmrghd 34, 1, 0
6612; PC64LE9-NEXT:    blr
6613entry:
6614  %result = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(
6615                                <2 x float> %x,
6616                                metadata !"fpexcept.strict") #1
6617  ret <2 x double> %result
6618}
6619
6620define <3 x double> @constrained_vector_fpext_v3f32(<3 x float> %x) #0 {
6621; PC64LE-LABEL: constrained_vector_fpext_v3f32:
6622; PC64LE:       # %bb.0: # %entry
6623; PC64LE-NEXT:    xxsldwi 0, 34, 34, 1
6624; PC64LE-NEXT:    xxswapd 1, 34
6625; PC64LE-NEXT:    xxsldwi 4, 34, 34, 3
6626; PC64LE-NEXT:    xscvspdpn 3, 0
6627; PC64LE-NEXT:    xscvspdpn 2, 1
6628; PC64LE-NEXT:    xscvspdpn 1, 4
6629; PC64LE-NEXT:    blr
6630;
6631; PC64LE9-LABEL: constrained_vector_fpext_v3f32:
6632; PC64LE9:       # %bb.0: # %entry
6633; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
6634; PC64LE9-NEXT:    xscvspdpn 3, 0
6635; PC64LE9-NEXT:    xxswapd 0, 34
6636; PC64LE9-NEXT:    xscvspdpn 2, 0
6637; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
6638; PC64LE9-NEXT:    xscvspdpn 1, 0
6639; PC64LE9-NEXT:    blr
6640entry:
6641  %result = call <3 x double> @llvm.experimental.constrained.fpext.v3f64.v3f32(
6642                                <3 x float> %x,
6643                                metadata !"fpexcept.strict") #1
6644  ret <3 x double> %result
6645}
6646
6647define <4 x double> @constrained_vector_fpext_v4f32(<4 x float> %x) #0 {
6648; PC64LE-LABEL: constrained_vector_fpext_v4f32:
6649; PC64LE:       # %bb.0: # %entry
6650; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6651; PC64LE-NEXT:    xxswapd 1, 34
6652; PC64LE-NEXT:    xxsldwi 3, 34, 34, 1
6653; PC64LE-NEXT:    xscvspdpn 2, 34
6654; PC64LE-NEXT:    xscvspdpn 0, 0
6655; PC64LE-NEXT:    xscvspdpn 1, 1
6656; PC64LE-NEXT:    xscvspdpn 3, 3
6657; PC64LE-NEXT:    xxmrghd 34, 1, 0
6658; PC64LE-NEXT:    xxmrghd 35, 2, 3
6659; PC64LE-NEXT:    blr
6660;
6661; PC64LE9-LABEL: constrained_vector_fpext_v4f32:
6662; PC64LE9:       # %bb.0: # %entry
6663; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 3
6664; PC64LE9-NEXT:    xxswapd 1, 34
6665; PC64LE9-NEXT:    xscvspdpn 0, 0
6666; PC64LE9-NEXT:    xscvspdpn 1, 1
6667; PC64LE9-NEXT:    xxsldwi 2, 34, 34, 1
6668; PC64LE9-NEXT:    xscvspdpn 2, 2
6669; PC64LE9-NEXT:    xxmrghd 0, 1, 0
6670; PC64LE9-NEXT:    xscvspdpn 1, 34
6671; PC64LE9-NEXT:    xxmrghd 35, 1, 2
6672; PC64LE9-NEXT:    xxlor 34, 0, 0
6673; PC64LE9-NEXT:    blr
6674entry:
6675  %result = call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(
6676                                <4 x float> %x,
6677                                metadata !"fpexcept.strict") #1
6678  ret <4 x double> %result
6679}
6680
6681define <1 x float> @constrained_vector_ceil_v1f32(<1 x float> %x) #0 {
6682; PC64LE-LABEL: constrained_vector_ceil_v1f32:
6683; PC64LE:       # %bb.0: # %entry
6684; PC64LE-NEXT:    xsrdpip 1, 1
6685; PC64LE-NEXT:    blr
6686;
6687; PC64LE9-LABEL: constrained_vector_ceil_v1f32:
6688; PC64LE9:       # %bb.0: # %entry
6689; PC64LE9-NEXT:    xsrdpip 1, 1
6690; PC64LE9-NEXT:    blr
6691entry:
6692  %ceil = call <1 x float> @llvm.experimental.constrained.ceil.v1f32(
6693                               <1 x float> %x,
6694                               metadata !"fpexcept.strict") #1
6695  ret <1 x float> %ceil
6696}
6697
6698define <2 x double> @constrained_vector_ceil_v2f64(<2 x double> %x) #0 {
6699; PC64LE-LABEL: constrained_vector_ceil_v2f64:
6700; PC64LE:       # %bb.0: # %entry
6701; PC64LE-NEXT:    xvrdpip 34, 34
6702; PC64LE-NEXT:    blr
6703;
6704; PC64LE9-LABEL: constrained_vector_ceil_v2f64:
6705; PC64LE9:       # %bb.0: # %entry
6706; PC64LE9-NEXT:    xvrdpip 34, 34
6707; PC64LE9-NEXT:    blr
6708entry:
6709  %ceil = call <2 x double> @llvm.experimental.constrained.ceil.v2f64(
6710                                <2 x double> %x,
6711                                metadata !"fpexcept.strict") #1
6712  ret <2 x double> %ceil
6713}
6714
6715define <3 x float> @constrained_vector_ceil_v3f32(<3 x float> %x) #0 {
6716; PC64LE-LABEL: constrained_vector_ceil_v3f32:
6717; PC64LE:       # %bb.0: # %entry
6718; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6719; PC64LE-NEXT:    xxswapd 1, 34
6720; PC64LE-NEXT:    addis 3, 2, .LCPI137_0@toc@ha
6721; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
6722; PC64LE-NEXT:    addi 3, 3, .LCPI137_0@toc@l
6723; PC64LE-NEXT:    lvx 4, 0, 3
6724; PC64LE-NEXT:    xscvspdpn 0, 0
6725; PC64LE-NEXT:    xscvspdpn 1, 1
6726; PC64LE-NEXT:    xscvspdpn 2, 2
6727; PC64LE-NEXT:    xsrdpip 0, 0
6728; PC64LE-NEXT:    xsrdpip 1, 1
6729; PC64LE-NEXT:    xsrdpip 2, 2
6730; PC64LE-NEXT:    xscvdpspn 0, 0
6731; PC64LE-NEXT:    xscvdpspn 1, 1
6732; PC64LE-NEXT:    xscvdpspn 34, 2
6733; PC64LE-NEXT:    xxmrghw 35, 1, 0
6734; PC64LE-NEXT:    vperm 2, 2, 3, 4
6735; PC64LE-NEXT:    blr
6736;
6737; PC64LE9-LABEL: constrained_vector_ceil_v3f32:
6738; PC64LE9:       # %bb.0: # %entry
6739; PC64LE9-NEXT:    xxswapd 1, 34
6740; PC64LE9-NEXT:    xxsldwi 2, 34, 34, 3
6741; PC64LE9-NEXT:    addis 3, 2, .LCPI137_0@toc@ha
6742; PC64LE9-NEXT:    addi 3, 3, .LCPI137_0@toc@l
6743; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
6744; PC64LE9-NEXT:    xscvspdpn 1, 1
6745; PC64LE9-NEXT:    xscvspdpn 2, 2
6746; PC64LE9-NEXT:    xscvspdpn 0, 0
6747; PC64LE9-NEXT:    lxv 35, 0(3)
6748; PC64LE9-NEXT:    xsrdpip 1, 1
6749; PC64LE9-NEXT:    xsrdpip 2, 2
6750; PC64LE9-NEXT:    xsrdpip 0, 0
6751; PC64LE9-NEXT:    xscvdpspn 2, 2
6752; PC64LE9-NEXT:    xscvdpspn 1, 1
6753; PC64LE9-NEXT:    xscvdpspn 36, 0
6754; PC64LE9-NEXT:    xxmrghw 34, 1, 2
6755; PC64LE9-NEXT:    vperm 2, 4, 2, 3
6756; PC64LE9-NEXT:    blr
6757entry:
6758  %ceil = call <3 x float> @llvm.experimental.constrained.ceil.v3f32(
6759                              <3 x float> %x,
6760                              metadata !"fpexcept.strict") #1
6761  ret <3 x float> %ceil
6762}
6763
6764define <3 x double> @constrained_vector_ceil_v3f64(<3 x double> %x) #0 {
6765; PC64LE-LABEL: constrained_vector_ceil_v3f64:
6766; PC64LE:       # %bb.0: # %entry
6767; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6768; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6769; PC64LE-NEXT:    xxmrghd 0, 2, 1
6770; PC64LE-NEXT:    xsrdpip 3, 3
6771; PC64LE-NEXT:    xvrdpip 2, 0
6772; PC64LE-NEXT:    xxswapd 1, 2
6773; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
6774; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
6775; PC64LE-NEXT:    blr
6776;
6777; PC64LE9-LABEL: constrained_vector_ceil_v3f64:
6778; PC64LE9:       # %bb.0: # %entry
6779; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6780; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6781; PC64LE9-NEXT:    xxmrghd 0, 2, 1
6782; PC64LE9-NEXT:    xsrdpip 3, 3
6783; PC64LE9-NEXT:    xvrdpip 2, 0
6784; PC64LE9-NEXT:    xxswapd 1, 2
6785; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
6786; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
6787; PC64LE9-NEXT:    blr
6788entry:
6789  %ceil = call <3 x double> @llvm.experimental.constrained.ceil.v3f64(
6790                          <3 x double> %x,
6791                          metadata !"fpexcept.strict") #1
6792  ret <3 x double> %ceil
6793}
6794
6795define <1 x float> @constrained_vector_floor_v1f32(<1 x float> %x) #0 {
6796; PC64LE-LABEL: constrained_vector_floor_v1f32:
6797; PC64LE:       # %bb.0: # %entry
6798; PC64LE-NEXT:    xsrdpim 1, 1
6799; PC64LE-NEXT:    blr
6800;
6801; PC64LE9-LABEL: constrained_vector_floor_v1f32:
6802; PC64LE9:       # %bb.0: # %entry
6803; PC64LE9-NEXT:    xsrdpim 1, 1
6804; PC64LE9-NEXT:    blr
6805entry:
6806  %floor = call <1 x float> @llvm.experimental.constrained.floor.v1f32(
6807                               <1 x float> %x,
6808                               metadata !"fpexcept.strict") #1
6809  ret <1 x float> %floor
6810}
6811
6812
6813define <2 x double> @constrained_vector_floor_v2f64(<2 x double> %x) #0 {
6814; PC64LE-LABEL: constrained_vector_floor_v2f64:
6815; PC64LE:       # %bb.0: # %entry
6816; PC64LE-NEXT:    xvrdpim 34, 34
6817; PC64LE-NEXT:    blr
6818;
6819; PC64LE9-LABEL: constrained_vector_floor_v2f64:
6820; PC64LE9:       # %bb.0: # %entry
6821; PC64LE9-NEXT:    xvrdpim 34, 34
6822; PC64LE9-NEXT:    blr
6823entry:
6824  %floor = call <2 x double> @llvm.experimental.constrained.floor.v2f64(
6825                                <2 x double> %x,
6826                                metadata !"fpexcept.strict") #1
6827  ret <2 x double> %floor
6828}
6829
6830define <3 x float> @constrained_vector_floor_v3f32(<3 x float> %x) #0 {
6831; PC64LE-LABEL: constrained_vector_floor_v3f32:
6832; PC64LE:       # %bb.0: # %entry
6833; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6834; PC64LE-NEXT:    xxswapd 1, 34
6835; PC64LE-NEXT:    addis 3, 2, .LCPI141_0@toc@ha
6836; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
6837; PC64LE-NEXT:    addi 3, 3, .LCPI141_0@toc@l
6838; PC64LE-NEXT:    lvx 4, 0, 3
6839; PC64LE-NEXT:    xscvspdpn 0, 0
6840; PC64LE-NEXT:    xscvspdpn 1, 1
6841; PC64LE-NEXT:    xscvspdpn 2, 2
6842; PC64LE-NEXT:    xsrdpim 0, 0
6843; PC64LE-NEXT:    xsrdpim 1, 1
6844; PC64LE-NEXT:    xsrdpim 2, 2
6845; PC64LE-NEXT:    xscvdpspn 0, 0
6846; PC64LE-NEXT:    xscvdpspn 1, 1
6847; PC64LE-NEXT:    xscvdpspn 34, 2
6848; PC64LE-NEXT:    xxmrghw 35, 1, 0
6849; PC64LE-NEXT:    vperm 2, 2, 3, 4
6850; PC64LE-NEXT:    blr
6851;
6852; PC64LE9-LABEL: constrained_vector_floor_v3f32:
6853; PC64LE9:       # %bb.0: # %entry
6854; PC64LE9-NEXT:    xxswapd 1, 34
6855; PC64LE9-NEXT:    xxsldwi 2, 34, 34, 3
6856; PC64LE9-NEXT:    addis 3, 2, .LCPI141_0@toc@ha
6857; PC64LE9-NEXT:    addi 3, 3, .LCPI141_0@toc@l
6858; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
6859; PC64LE9-NEXT:    xscvspdpn 1, 1
6860; PC64LE9-NEXT:    xscvspdpn 2, 2
6861; PC64LE9-NEXT:    xscvspdpn 0, 0
6862; PC64LE9-NEXT:    lxv 35, 0(3)
6863; PC64LE9-NEXT:    xsrdpim 1, 1
6864; PC64LE9-NEXT:    xsrdpim 2, 2
6865; PC64LE9-NEXT:    xsrdpim 0, 0
6866; PC64LE9-NEXT:    xscvdpspn 2, 2
6867; PC64LE9-NEXT:    xscvdpspn 1, 1
6868; PC64LE9-NEXT:    xscvdpspn 36, 0
6869; PC64LE9-NEXT:    xxmrghw 34, 1, 2
6870; PC64LE9-NEXT:    vperm 2, 4, 2, 3
6871; PC64LE9-NEXT:    blr
6872entry:
6873  %floor = call <3 x float> @llvm.experimental.constrained.floor.v3f32(
6874                              <3 x float> %x,
6875                              metadata !"fpexcept.strict") #1
6876  ret <3 x float> %floor
6877}
6878
6879define <3 x double> @constrained_vector_floor_v3f64(<3 x double> %x) #0 {
6880; PC64LE-LABEL: constrained_vector_floor_v3f64:
6881; PC64LE:       # %bb.0: # %entry
6882; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6883; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6884; PC64LE-NEXT:    xxmrghd 0, 2, 1
6885; PC64LE-NEXT:    xsrdpim 3, 3
6886; PC64LE-NEXT:    xvrdpim 2, 0
6887; PC64LE-NEXT:    xxswapd 1, 2
6888; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
6889; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
6890; PC64LE-NEXT:    blr
6891;
6892; PC64LE9-LABEL: constrained_vector_floor_v3f64:
6893; PC64LE9:       # %bb.0: # %entry
6894; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6895; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6896; PC64LE9-NEXT:    xxmrghd 0, 2, 1
6897; PC64LE9-NEXT:    xsrdpim 3, 3
6898; PC64LE9-NEXT:    xvrdpim 2, 0
6899; PC64LE9-NEXT:    xxswapd 1, 2
6900; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
6901; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
6902; PC64LE9-NEXT:    blr
6903entry:
6904  %floor = call <3 x double> @llvm.experimental.constrained.floor.v3f64(
6905                          <3 x double> %x,
6906                          metadata !"fpexcept.strict") #1
6907  ret <3 x double> %floor
6908}
6909
6910define <1 x float> @constrained_vector_round_v1f32(<1 x float> %x) #0 {
6911; PC64LE-LABEL: constrained_vector_round_v1f32:
6912; PC64LE:       # %bb.0: # %entry
6913; PC64LE-NEXT:    xsrdpi 1, 1
6914; PC64LE-NEXT:    blr
6915;
6916; PC64LE9-LABEL: constrained_vector_round_v1f32:
6917; PC64LE9:       # %bb.0: # %entry
6918; PC64LE9-NEXT:    xsrdpi 1, 1
6919; PC64LE9-NEXT:    blr
6920entry:
6921  %round = call <1 x float> @llvm.experimental.constrained.round.v1f32(
6922                               <1 x float> %x,
6923                               metadata !"fpexcept.strict") #1
6924  ret <1 x float> %round
6925}
6926
6927define <2 x double> @constrained_vector_round_v2f64(<2 x double> %x) #0 {
6928; PC64LE-LABEL: constrained_vector_round_v2f64:
6929; PC64LE:       # %bb.0: # %entry
6930; PC64LE-NEXT:    xvrdpi 34, 34
6931; PC64LE-NEXT:    blr
6932;
6933; PC64LE9-LABEL: constrained_vector_round_v2f64:
6934; PC64LE9:       # %bb.0: # %entry
6935; PC64LE9-NEXT:    xvrdpi 34, 34
6936; PC64LE9-NEXT:    blr
6937entry:
6938  %round = call <2 x double> @llvm.experimental.constrained.round.v2f64(
6939                                <2 x double> %x,
6940                                metadata !"fpexcept.strict") #1
6941  ret <2 x double> %round
6942}
6943
6944define <3 x float> @constrained_vector_round_v3f32(<3 x float> %x) #0 {
6945; PC64LE-LABEL: constrained_vector_round_v3f32:
6946; PC64LE:       # %bb.0: # %entry
6947; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
6948; PC64LE-NEXT:    xxswapd 1, 34
6949; PC64LE-NEXT:    addis 3, 2, .LCPI145_0@toc@ha
6950; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
6951; PC64LE-NEXT:    addi 3, 3, .LCPI145_0@toc@l
6952; PC64LE-NEXT:    lvx 4, 0, 3
6953; PC64LE-NEXT:    xscvspdpn 0, 0
6954; PC64LE-NEXT:    xscvspdpn 1, 1
6955; PC64LE-NEXT:    xscvspdpn 2, 2
6956; PC64LE-NEXT:    xsrdpi 0, 0
6957; PC64LE-NEXT:    xsrdpi 1, 1
6958; PC64LE-NEXT:    xsrdpi 2, 2
6959; PC64LE-NEXT:    xscvdpspn 0, 0
6960; PC64LE-NEXT:    xscvdpspn 1, 1
6961; PC64LE-NEXT:    xscvdpspn 34, 2
6962; PC64LE-NEXT:    xxmrghw 35, 1, 0
6963; PC64LE-NEXT:    vperm 2, 2, 3, 4
6964; PC64LE-NEXT:    blr
6965;
6966; PC64LE9-LABEL: constrained_vector_round_v3f32:
6967; PC64LE9:       # %bb.0: # %entry
6968; PC64LE9-NEXT:    xxswapd 1, 34
6969; PC64LE9-NEXT:    xxsldwi 2, 34, 34, 3
6970; PC64LE9-NEXT:    addis 3, 2, .LCPI145_0@toc@ha
6971; PC64LE9-NEXT:    addi 3, 3, .LCPI145_0@toc@l
6972; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
6973; PC64LE9-NEXT:    xscvspdpn 1, 1
6974; PC64LE9-NEXT:    xscvspdpn 2, 2
6975; PC64LE9-NEXT:    xscvspdpn 0, 0
6976; PC64LE9-NEXT:    lxv 35, 0(3)
6977; PC64LE9-NEXT:    xsrdpi 1, 1
6978; PC64LE9-NEXT:    xsrdpi 2, 2
6979; PC64LE9-NEXT:    xsrdpi 0, 0
6980; PC64LE9-NEXT:    xscvdpspn 2, 2
6981; PC64LE9-NEXT:    xscvdpspn 1, 1
6982; PC64LE9-NEXT:    xscvdpspn 36, 0
6983; PC64LE9-NEXT:    xxmrghw 34, 1, 2
6984; PC64LE9-NEXT:    vperm 2, 4, 2, 3
6985; PC64LE9-NEXT:    blr
6986entry:
6987  %round = call <3 x float> @llvm.experimental.constrained.round.v3f32(
6988                              <3 x float> %x,
6989                              metadata !"fpexcept.strict") #1
6990  ret <3 x float> %round
6991}
6992
6993
6994define <3 x double> @constrained_vector_round_v3f64(<3 x double> %x) #0 {
6995; PC64LE-LABEL: constrained_vector_round_v3f64:
6996; PC64LE:       # %bb.0: # %entry
6997; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6998; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6999; PC64LE-NEXT:    xxmrghd 0, 2, 1
7000; PC64LE-NEXT:    xsrdpi 3, 3
7001; PC64LE-NEXT:    xvrdpi 2, 0
7002; PC64LE-NEXT:    xxswapd 1, 2
7003; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
7004; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
7005; PC64LE-NEXT:    blr
7006;
7007; PC64LE9-LABEL: constrained_vector_round_v3f64:
7008; PC64LE9:       # %bb.0: # %entry
7009; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
7010; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
7011; PC64LE9-NEXT:    xxmrghd 0, 2, 1
7012; PC64LE9-NEXT:    xsrdpi 3, 3
7013; PC64LE9-NEXT:    xvrdpi 2, 0
7014; PC64LE9-NEXT:    xxswapd 1, 2
7015; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
7016; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
7017; PC64LE9-NEXT:    blr
7018entry:
7019  %round = call <3 x double> @llvm.experimental.constrained.round.v3f64(
7020                          <3 x double> %x,
7021                          metadata !"fpexcept.strict") #1
7022  ret <3 x double> %round
7023}
7024
7025define <1 x float> @constrained_vector_trunc_v1f32(<1 x float> %x) #0 {
7026; PC64LE-LABEL: constrained_vector_trunc_v1f32:
7027; PC64LE:       # %bb.0: # %entry
7028; PC64LE-NEXT:    xsrdpiz 1, 1
7029; PC64LE-NEXT:    blr
7030;
7031; PC64LE9-LABEL: constrained_vector_trunc_v1f32:
7032; PC64LE9:       # %bb.0: # %entry
7033; PC64LE9-NEXT:    xsrdpiz 1, 1
7034; PC64LE9-NEXT:    blr
7035entry:
7036  %trunc = call <1 x float> @llvm.experimental.constrained.trunc.v1f32(
7037                               <1 x float> %x,
7038                               metadata !"fpexcept.strict") #1
7039  ret <1 x float> %trunc
7040}
7041
7042define <2 x double> @constrained_vector_trunc_v2f64(<2 x double> %x) #0 {
7043; PC64LE-LABEL: constrained_vector_trunc_v2f64:
7044; PC64LE:       # %bb.0: # %entry
7045; PC64LE-NEXT:    xvrdpiz 34, 34
7046; PC64LE-NEXT:    blr
7047;
7048; PC64LE9-LABEL: constrained_vector_trunc_v2f64:
7049; PC64LE9:       # %bb.0: # %entry
7050; PC64LE9-NEXT:    xvrdpiz 34, 34
7051; PC64LE9-NEXT:    blr
7052entry:
7053  %trunc = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(
7054                                <2 x double> %x,
7055                                metadata !"fpexcept.strict") #1
7056  ret <2 x double> %trunc
7057}
7058
7059define <3 x float> @constrained_vector_trunc_v3f32(<3 x float> %x) #0 {
7060; PC64LE-LABEL: constrained_vector_trunc_v3f32:
7061; PC64LE:       # %bb.0: # %entry
7062; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
7063; PC64LE-NEXT:    xxswapd 1, 34
7064; PC64LE-NEXT:    addis 3, 2, .LCPI149_0@toc@ha
7065; PC64LE-NEXT:    xxsldwi 2, 34, 34, 1
7066; PC64LE-NEXT:    addi 3, 3, .LCPI149_0@toc@l
7067; PC64LE-NEXT:    lvx 4, 0, 3
7068; PC64LE-NEXT:    xscvspdpn 0, 0
7069; PC64LE-NEXT:    xscvspdpn 1, 1
7070; PC64LE-NEXT:    xscvspdpn 2, 2
7071; PC64LE-NEXT:    xsrdpiz 0, 0
7072; PC64LE-NEXT:    xsrdpiz 1, 1
7073; PC64LE-NEXT:    xsrdpiz 2, 2
7074; PC64LE-NEXT:    xscvdpspn 0, 0
7075; PC64LE-NEXT:    xscvdpspn 1, 1
7076; PC64LE-NEXT:    xscvdpspn 34, 2
7077; PC64LE-NEXT:    xxmrghw 35, 1, 0
7078; PC64LE-NEXT:    vperm 2, 2, 3, 4
7079; PC64LE-NEXT:    blr
7080;
7081; PC64LE9-LABEL: constrained_vector_trunc_v3f32:
7082; PC64LE9:       # %bb.0: # %entry
7083; PC64LE9-NEXT:    xxswapd 1, 34
7084; PC64LE9-NEXT:    xxsldwi 2, 34, 34, 3
7085; PC64LE9-NEXT:    addis 3, 2, .LCPI149_0@toc@ha
7086; PC64LE9-NEXT:    addi 3, 3, .LCPI149_0@toc@l
7087; PC64LE9-NEXT:    xxsldwi 0, 34, 34, 1
7088; PC64LE9-NEXT:    xscvspdpn 1, 1
7089; PC64LE9-NEXT:    xscvspdpn 2, 2
7090; PC64LE9-NEXT:    xscvspdpn 0, 0
7091; PC64LE9-NEXT:    lxv 35, 0(3)
7092; PC64LE9-NEXT:    xsrdpiz 1, 1
7093; PC64LE9-NEXT:    xsrdpiz 2, 2
7094; PC64LE9-NEXT:    xsrdpiz 0, 0
7095; PC64LE9-NEXT:    xscvdpspn 2, 2
7096; PC64LE9-NEXT:    xscvdpspn 1, 1
7097; PC64LE9-NEXT:    xscvdpspn 36, 0
7098; PC64LE9-NEXT:    xxmrghw 34, 1, 2
7099; PC64LE9-NEXT:    vperm 2, 4, 2, 3
7100; PC64LE9-NEXT:    blr
7101entry:
7102  %trunc = call <3 x float> @llvm.experimental.constrained.trunc.v3f32(
7103                              <3 x float> %x,
7104                              metadata !"fpexcept.strict") #1
7105  ret <3 x float> %trunc
7106}
7107
7108define <3 x double> @constrained_vector_trunc_v3f64(<3 x double> %x) #0 {
7109; PC64LE-LABEL: constrained_vector_trunc_v3f64:
7110; PC64LE:       # %bb.0: # %entry
7111; PC64LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
7112; PC64LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
7113; PC64LE-NEXT:    xxmrghd 0, 2, 1
7114; PC64LE-NEXT:    xsrdpiz 3, 3
7115; PC64LE-NEXT:    xvrdpiz 2, 0
7116; PC64LE-NEXT:    xxswapd 1, 2
7117; PC64LE-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
7118; PC64LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
7119; PC64LE-NEXT:    blr
7120;
7121; PC64LE9-LABEL: constrained_vector_trunc_v3f64:
7122; PC64LE9:       # %bb.0: # %entry
7123; PC64LE9-NEXT:    # kill: def $f2 killed $f2 def $vsl2
7124; PC64LE9-NEXT:    # kill: def $f1 killed $f1 def $vsl1
7125; PC64LE9-NEXT:    xxmrghd 0, 2, 1
7126; PC64LE9-NEXT:    xsrdpiz 3, 3
7127; PC64LE9-NEXT:    xvrdpiz 2, 0
7128; PC64LE9-NEXT:    xxswapd 1, 2
7129; PC64LE9-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
7130; PC64LE9-NEXT:    # kill: def $f2 killed $f2 killed $vsl2
7131; PC64LE9-NEXT:    blr
7132entry:
7133  %trunc = call <3 x double> @llvm.experimental.constrained.trunc.v3f64(
7134                          <3 x double> %x,
7135                          metadata !"fpexcept.strict") #1
7136  ret <3 x double> %trunc
7137}
7138
7139define <1 x double> @constrained_vector_sitofp_v1f64_v1i32(<1 x i32> %x) #0 {
7140; PC64LE-LABEL: constrained_vector_sitofp_v1f64_v1i32:
7141; PC64LE:       # %bb.0: # %entry
7142; PC64LE-NEXT:    mtfprwa 0, 3
7143; PC64LE-NEXT:    xscvsxddp 1, 0
7144; PC64LE-NEXT:    blr
7145;
7146; PC64LE9-LABEL: constrained_vector_sitofp_v1f64_v1i32:
7147; PC64LE9:       # %bb.0: # %entry
7148; PC64LE9-NEXT:    mtfprwa 0, 3
7149; PC64LE9-NEXT:    xscvsxddp 1, 0
7150; PC64LE9-NEXT:    blr
7151entry:
7152  %result = call <1 x double>
7153           @llvm.experimental.constrained.sitofp.v1f64.v1i32(<1 x i32> %x,
7154                                               metadata !"round.dynamic",
7155                                               metadata !"fpexcept.strict") #0
7156  ret <1 x double> %result
7157}
7158
7159define <1 x float> @constrained_vector_sitofp_v1f32_v1i32(<1 x i32> %x) #0 {
7160; PC64LE-LABEL: constrained_vector_sitofp_v1f32_v1i32:
7161; PC64LE:       # %bb.0: # %entry
7162; PC64LE-NEXT:    mtfprwa 0, 3
7163; PC64LE-NEXT:    xscvsxdsp 1, 0
7164; PC64LE-NEXT:    blr
7165;
7166; PC64LE9-LABEL: constrained_vector_sitofp_v1f32_v1i32:
7167; PC64LE9:       # %bb.0: # %entry
7168; PC64LE9-NEXT:    mtfprwa 0, 3
7169; PC64LE9-NEXT:    xscvsxdsp 1, 0
7170; PC64LE9-NEXT:    blr
7171entry:
7172  %result = call <1 x float>
7173           @llvm.experimental.constrained.sitofp.v1f32.v1i32(<1 x i32> %x,
7174                                               metadata !"round.dynamic",
7175                                               metadata !"fpexcept.strict") #0
7176  ret <1 x float> %result
7177}
7178
7179define <1 x double> @constrained_vector_sitofp_v1f64_v1i64(<1 x i64> %x) #0 {
7180; PC64LE-LABEL: constrained_vector_sitofp_v1f64_v1i64:
7181; PC64LE:       # %bb.0: # %entry
7182; PC64LE-NEXT:    mtfprd 0, 3
7183; PC64LE-NEXT:    xscvsxddp 1, 0
7184; PC64LE-NEXT:    blr
7185;
7186; PC64LE9-LABEL: constrained_vector_sitofp_v1f64_v1i64:
7187; PC64LE9:       # %bb.0: # %entry
7188; PC64LE9-NEXT:    mtfprd 0, 3
7189; PC64LE9-NEXT:    xscvsxddp 1, 0
7190; PC64LE9-NEXT:    blr
7191entry:
7192  %result = call <1 x double>
7193           @llvm.experimental.constrained.sitofp.v1f64.v1i64(<1 x i64> %x,
7194                                               metadata !"round.dynamic",
7195                                               metadata !"fpexcept.strict") #0
7196  ret <1 x double> %result
7197}
7198
7199define <1 x float> @constrained_vector_sitofp_v1f32_v1i64(<1 x i64> %x) #0 {
7200; PC64LE-LABEL: constrained_vector_sitofp_v1f32_v1i64:
7201; PC64LE:       # %bb.0: # %entry
7202; PC64LE-NEXT:    mtfprd 0, 3
7203; PC64LE-NEXT:    xscvsxdsp 1, 0
7204; PC64LE-NEXT:    blr
7205;
7206; PC64LE9-LABEL: constrained_vector_sitofp_v1f32_v1i64:
7207; PC64LE9:       # %bb.0: # %entry
7208; PC64LE9-NEXT:    mtfprd 0, 3
7209; PC64LE9-NEXT:    xscvsxdsp 1, 0
7210; PC64LE9-NEXT:    blr
7211entry:
7212  %result = call <1 x float>
7213           @llvm.experimental.constrained.sitofp.v1f32.v1i64(<1 x i64> %x,
7214                                               metadata !"round.dynamic",
7215                                               metadata !"fpexcept.strict") #0
7216  ret <1 x float> %result
7217}
7218
7219define <2 x double> @constrained_vector_sitofp_v2f64_v2i16(<2 x i16> %x) #0 {
7220; PC64LE-LABEL: constrained_vector_sitofp_v2f64_v2i16:
7221; PC64LE:       # %bb.0: # %entry
7222; PC64LE-NEXT:    addis 3, 2, .LCPI155_0@toc@ha
7223; PC64LE-NEXT:    addi 3, 3, .LCPI155_0@toc@l
7224; PC64LE-NEXT:    lvx 3, 0, 3
7225; PC64LE-NEXT:    addis 3, 2, .LCPI155_1@toc@ha
7226; PC64LE-NEXT:    addi 3, 3, .LCPI155_1@toc@l
7227; PC64LE-NEXT:    lxvd2x 0, 0, 3
7228; PC64LE-NEXT:    vperm 2, 2, 2, 3
7229; PC64LE-NEXT:    xxswapd 35, 0
7230; PC64LE-NEXT:    vsld 2, 2, 3
7231; PC64LE-NEXT:    vsrad 2, 2, 3
7232; PC64LE-NEXT:    xvcvsxddp 34, 34
7233; PC64LE-NEXT:    blr
7234;
7235; PC64LE9-LABEL: constrained_vector_sitofp_v2f64_v2i16:
7236; PC64LE9:       # %bb.0: # %entry
7237; PC64LE9-NEXT:    addis 3, 2, .LCPI155_0@toc@ha
7238; PC64LE9-NEXT:    addi 3, 3, .LCPI155_0@toc@l
7239; PC64LE9-NEXT:    lxv 35, 0(3)
7240; PC64LE9-NEXT:    vperm 2, 2, 2, 3
7241; PC64LE9-NEXT:    vextsh2d 2, 2
7242; PC64LE9-NEXT:    xvcvsxddp 34, 34
7243; PC64LE9-NEXT:    blr
7244entry:
7245  %result = call <2 x double>
7246           @llvm.experimental.constrained.sitofp.v2f64.v2i16(<2 x i16> %x,
7247                                                metadata !"round.dynamic",
7248                                                metadata !"fpexcept.strict") #0
7249  ret <2 x double> %result
7250}
7251
7252define <2 x double> @constrained_vector_sitofp_v2f64_v2i32(<2 x i32> %x) #0 {
7253; PC64LE-LABEL: constrained_vector_sitofp_v2f64_v2i32:
7254; PC64LE:       # %bb.0: # %entry
7255; PC64LE-NEXT:    xxswapd 0, 34
7256; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7257; PC64LE-NEXT:    mffprwz 3, 0
7258; PC64LE-NEXT:    mffprwz 4, 1
7259; PC64LE-NEXT:    mtfprwa 0, 3
7260; PC64LE-NEXT:    mtfprwa 1, 4
7261; PC64LE-NEXT:    xscvsxddp 0, 0
7262; PC64LE-NEXT:    xscvsxddp 1, 1
7263; PC64LE-NEXT:    xxmrghd 34, 1, 0
7264; PC64LE-NEXT:    blr
7265;
7266; PC64LE9-LABEL: constrained_vector_sitofp_v2f64_v2i32:
7267; PC64LE9:       # %bb.0: # %entry
7268; PC64LE9-NEXT:    li 3, 0
7269; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7270; PC64LE9-NEXT:    mtfprwa 0, 3
7271; PC64LE9-NEXT:    li 3, 4
7272; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7273; PC64LE9-NEXT:    xscvsxddp 0, 0
7274; PC64LE9-NEXT:    mtfprwa 1, 3
7275; PC64LE9-NEXT:    xscvsxddp 1, 1
7276; PC64LE9-NEXT:    xxmrghd 34, 1, 0
7277; PC64LE9-NEXT:    blr
7278entry:
7279  %result = call <2 x double>
7280           @llvm.experimental.constrained.sitofp.v2f64.v2i32(<2 x i32> %x,
7281                                               metadata !"round.dynamic",
7282                                               metadata !"fpexcept.strict") #0
7283  ret <2 x double> %result
7284}
7285
7286define <2 x float> @constrained_vector_sitofp_v2f32_v2i32(<2 x i32> %x) #0 {
7287; PC64LE-LABEL: constrained_vector_sitofp_v2f32_v2i32:
7288; PC64LE:       # %bb.0: # %entry
7289; PC64LE-NEXT:    xxswapd 0, 34
7290; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7291; PC64LE-NEXT:    mffprwz 3, 0
7292; PC64LE-NEXT:    mffprwz 4, 1
7293; PC64LE-NEXT:    mtfprwa 0, 3
7294; PC64LE-NEXT:    mtfprwa 1, 4
7295; PC64LE-NEXT:    xscvsxdsp 0, 0
7296; PC64LE-NEXT:    xscvsxdsp 1, 1
7297; PC64LE-NEXT:    xscvdpspn 0, 0
7298; PC64LE-NEXT:    xscvdpspn 1, 1
7299; PC64LE-NEXT:    xxmrghw 34, 1, 0
7300; PC64LE-NEXT:    blr
7301;
7302; PC64LE9-LABEL: constrained_vector_sitofp_v2f32_v2i32:
7303; PC64LE9:       # %bb.0: # %entry
7304; PC64LE9-NEXT:    li 3, 0
7305; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7306; PC64LE9-NEXT:    mtfprwa 0, 3
7307; PC64LE9-NEXT:    li 3, 4
7308; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7309; PC64LE9-NEXT:    xscvsxdsp 0, 0
7310; PC64LE9-NEXT:    mtfprwa 1, 3
7311; PC64LE9-NEXT:    xscvsxdsp 1, 1
7312; PC64LE9-NEXT:    xscvdpspn 0, 0
7313; PC64LE9-NEXT:    xscvdpspn 1, 1
7314; PC64LE9-NEXT:    xxmrghw 34, 1, 0
7315; PC64LE9-NEXT:    blr
7316entry:
7317  %result = call <2 x float>
7318           @llvm.experimental.constrained.sitofp.v2f32.v2i32(<2 x i32> %x,
7319                                               metadata !"round.dynamic",
7320                                               metadata !"fpexcept.strict") #0
7321  ret <2 x float> %result
7322}
7323
7324define <2 x double> @constrained_vector_sitofp_v2f64_v2i64(<2 x i64> %x) #0 {
7325; PC64LE-LABEL: constrained_vector_sitofp_v2f64_v2i64:
7326; PC64LE:       # %bb.0: # %entry
7327; PC64LE-NEXT:    xvcvsxddp 34, 34
7328; PC64LE-NEXT:    blr
7329;
7330; PC64LE9-LABEL: constrained_vector_sitofp_v2f64_v2i64:
7331; PC64LE9:       # %bb.0: # %entry
7332; PC64LE9-NEXT:    xvcvsxddp 34, 34
7333; PC64LE9-NEXT:    blr
7334entry:
7335  %result = call <2 x double>
7336           @llvm.experimental.constrained.sitofp.v2f64.v2i64(<2 x i64> %x,
7337                                               metadata !"round.dynamic",
7338                                               metadata !"fpexcept.strict") #0
7339  ret <2 x double> %result
7340}
7341
7342define <2 x float> @constrained_vector_sitofp_v2f32_v2i64(<2 x i64> %x) #0 {
7343; PC64LE-LABEL: constrained_vector_sitofp_v2f32_v2i64:
7344; PC64LE:       # %bb.0: # %entry
7345; PC64LE-NEXT:    xxswapd 0, 34
7346; PC64LE-NEXT:    mfvsrd 3, 34
7347; PC64LE-NEXT:    mffprd 4, 0
7348; PC64LE-NEXT:    mtfprd 0, 3
7349; PC64LE-NEXT:    mtfprd 1, 4
7350; PC64LE-NEXT:    xscvsxdsp 0, 0
7351; PC64LE-NEXT:    xscvsxdsp 1, 1
7352; PC64LE-NEXT:    xscvdpspn 0, 0
7353; PC64LE-NEXT:    xscvdpspn 1, 1
7354; PC64LE-NEXT:    xxmrghw 34, 0, 1
7355; PC64LE-NEXT:    blr
7356;
7357; PC64LE9-LABEL: constrained_vector_sitofp_v2f32_v2i64:
7358; PC64LE9:       # %bb.0: # %entry
7359; PC64LE9-NEXT:    mfvsrld 3, 34
7360; PC64LE9-NEXT:    mtfprd 0, 3
7361; PC64LE9-NEXT:    mfvsrd 3, 34
7362; PC64LE9-NEXT:    mtfprd 1, 3
7363; PC64LE9-NEXT:    xscvsxdsp 0, 0
7364; PC64LE9-NEXT:    xscvsxdsp 1, 1
7365; PC64LE9-NEXT:    xscvdpspn 0, 0
7366; PC64LE9-NEXT:    xscvdpspn 1, 1
7367; PC64LE9-NEXT:    xxmrghw 34, 1, 0
7368; PC64LE9-NEXT:    blr
7369entry:
7370  %result = call <2 x float>
7371           @llvm.experimental.constrained.sitofp.v2f32.v2i64(<2 x i64> %x,
7372                                               metadata !"round.dynamic",
7373                                               metadata !"fpexcept.strict") #0
7374  ret <2 x float> %result
7375}
7376
7377define <3 x double> @constrained_vector_sitofp_v3f64_v3i32(<3 x i32> %x) #0 {
7378; PC64LE-LABEL: constrained_vector_sitofp_v3f64_v3i32:
7379; PC64LE:       # %bb.0: # %entry
7380; PC64LE-NEXT:    xxswapd 0, 34
7381; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7382; PC64LE-NEXT:    mfvsrwz 3, 34
7383; PC64LE-NEXT:    mtfprwa 3, 3
7384; PC64LE-NEXT:    mffprwz 3, 0
7385; PC64LE-NEXT:    mffprwz 4, 1
7386; PC64LE-NEXT:    mtfprwa 0, 3
7387; PC64LE-NEXT:    mtfprwa 2, 4
7388; PC64LE-NEXT:    xscvsxddp 1, 0
7389; PC64LE-NEXT:    xscvsxddp 2, 2
7390; PC64LE-NEXT:    xscvsxddp 3, 3
7391; PC64LE-NEXT:    blr
7392;
7393; PC64LE9-LABEL: constrained_vector_sitofp_v3f64_v3i32:
7394; PC64LE9:       # %bb.0: # %entry
7395; PC64LE9-NEXT:    li 3, 0
7396; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7397; PC64LE9-NEXT:    mtfprwa 0, 3
7398; PC64LE9-NEXT:    li 3, 4
7399; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7400; PC64LE9-NEXT:    xscvsxddp 1, 0
7401; PC64LE9-NEXT:    mtfprwa 0, 3
7402; PC64LE9-NEXT:    mfvsrwz 3, 34
7403; PC64LE9-NEXT:    xscvsxddp 2, 0
7404; PC64LE9-NEXT:    mtfprwa 0, 3
7405; PC64LE9-NEXT:    xscvsxddp 3, 0
7406; PC64LE9-NEXT:    blr
7407entry:
7408  %result = call <3 x double>
7409           @llvm.experimental.constrained.sitofp.v3f64.v3i32(<3 x i32> %x,
7410                                               metadata !"round.dynamic",
7411                                               metadata !"fpexcept.strict") #0
7412  ret <3 x double> %result
7413}
7414
7415define <3 x float> @constrained_vector_sitofp_v3f32_v3i32(<3 x i32> %x) #0 {
7416; PC64LE-LABEL: constrained_vector_sitofp_v3f32_v3i32:
7417; PC64LE:       # %bb.0: # %entry
7418; PC64LE-NEXT:    xxswapd 0, 34
7419; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7420; PC64LE-NEXT:    addis 3, 2, .LCPI161_0@toc@ha
7421; PC64LE-NEXT:    addi 3, 3, .LCPI161_0@toc@l
7422; PC64LE-NEXT:    lvx 4, 0, 3
7423; PC64LE-NEXT:    mffprwz 4, 0
7424; PC64LE-NEXT:    mffprwz 5, 1
7425; PC64LE-NEXT:    mtfprwa 0, 4
7426; PC64LE-NEXT:    mtfprwa 1, 5
7427; PC64LE-NEXT:    mfvsrwz 4, 34
7428; PC64LE-NEXT:    xscvsxdsp 0, 0
7429; PC64LE-NEXT:    xscvsxdsp 1, 1
7430; PC64LE-NEXT:    mtfprwa 2, 4
7431; PC64LE-NEXT:    xscvsxdsp 2, 2
7432; PC64LE-NEXT:    xscvdpspn 0, 0
7433; PC64LE-NEXT:    xscvdpspn 1, 1
7434; PC64LE-NEXT:    xscvdpspn 34, 2
7435; PC64LE-NEXT:    xxmrghw 35, 1, 0
7436; PC64LE-NEXT:    vperm 2, 2, 3, 4
7437; PC64LE-NEXT:    blr
7438;
7439; PC64LE9-LABEL: constrained_vector_sitofp_v3f32_v3i32:
7440; PC64LE9:       # %bb.0: # %entry
7441; PC64LE9-NEXT:    li 3, 0
7442; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7443; PC64LE9-NEXT:    mtfprwa 0, 3
7444; PC64LE9-NEXT:    li 3, 4
7445; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7446; PC64LE9-NEXT:    xscvsxdsp 0, 0
7447; PC64LE9-NEXT:    mtfprwa 1, 3
7448; PC64LE9-NEXT:    addis 3, 2, .LCPI161_0@toc@ha
7449; PC64LE9-NEXT:    xscvsxdsp 1, 1
7450; PC64LE9-NEXT:    addi 3, 3, .LCPI161_0@toc@l
7451; PC64LE9-NEXT:    xscvdpspn 0, 0
7452; PC64LE9-NEXT:    lxv 36, 0(3)
7453; PC64LE9-NEXT:    mfvsrwz 3, 34
7454; PC64LE9-NEXT:    xscvdpspn 1, 1
7455; PC64LE9-NEXT:    xxmrghw 35, 1, 0
7456; PC64LE9-NEXT:    mtfprwa 0, 3
7457; PC64LE9-NEXT:    xscvsxdsp 0, 0
7458; PC64LE9-NEXT:    xscvdpspn 34, 0
7459; PC64LE9-NEXT:    vperm 2, 2, 3, 4
7460; PC64LE9-NEXT:    blr
7461entry:
7462  %result = call <3 x float>
7463           @llvm.experimental.constrained.sitofp.v3f32.v3i32(<3 x i32> %x,
7464                                               metadata !"round.dynamic",
7465                                               metadata !"fpexcept.strict") #0
7466  ret <3 x float> %result
7467}
7468
7469define <3 x double> @constrained_vector_sitofp_v3f64_v3i64(<3 x i64> %x) #0 {
7470; PC64LE-LABEL: constrained_vector_sitofp_v3f64_v3i64:
7471; PC64LE:       # %bb.0: # %entry
7472; PC64LE-NEXT:    mtfprd 0, 3
7473; PC64LE-NEXT:    mtfprd 2, 4
7474; PC64LE-NEXT:    mtfprd 3, 5
7475; PC64LE-NEXT:    xscvsxddp 1, 0
7476; PC64LE-NEXT:    xscvsxddp 2, 2
7477; PC64LE-NEXT:    xscvsxddp 3, 3
7478; PC64LE-NEXT:    blr
7479;
7480; PC64LE9-LABEL: constrained_vector_sitofp_v3f64_v3i64:
7481; PC64LE9:       # %bb.0: # %entry
7482; PC64LE9-NEXT:    mtfprd 0, 3
7483; PC64LE9-NEXT:    xscvsxddp 1, 0
7484; PC64LE9-NEXT:    mtfprd 0, 4
7485; PC64LE9-NEXT:    xscvsxddp 2, 0
7486; PC64LE9-NEXT:    mtfprd 0, 5
7487; PC64LE9-NEXT:    xscvsxddp 3, 0
7488; PC64LE9-NEXT:    blr
7489entry:
7490  %result = call <3 x double>
7491           @llvm.experimental.constrained.sitofp.v3f64.v3i64(<3 x i64> %x,
7492                                               metadata !"round.dynamic",
7493                                               metadata !"fpexcept.strict") #0
7494  ret <3 x double> %result
7495}
7496
7497define <3 x float> @constrained_vector_sitofp_v3f32_v3i64(<3 x i64> %x) #0 {
7498; PC64LE-LABEL: constrained_vector_sitofp_v3f32_v3i64:
7499; PC64LE:       # %bb.0: # %entry
7500; PC64LE-NEXT:    mtfprd 0, 3
7501; PC64LE-NEXT:    addis 6, 2, .LCPI163_0@toc@ha
7502; PC64LE-NEXT:    mtfprd 1, 4
7503; PC64LE-NEXT:    addi 3, 6, .LCPI163_0@toc@l
7504; PC64LE-NEXT:    xscvsxdsp 0, 0
7505; PC64LE-NEXT:    lvx 4, 0, 3
7506; PC64LE-NEXT:    xscvsxdsp 1, 1
7507; PC64LE-NEXT:    mtfprd 2, 5
7508; PC64LE-NEXT:    xscvsxdsp 2, 2
7509; PC64LE-NEXT:    xscvdpspn 0, 0
7510; PC64LE-NEXT:    xscvdpspn 1, 1
7511; PC64LE-NEXT:    xscvdpspn 34, 2
7512; PC64LE-NEXT:    xxmrghw 35, 1, 0
7513; PC64LE-NEXT:    vperm 2, 2, 3, 4
7514; PC64LE-NEXT:    blr
7515;
7516; PC64LE9-LABEL: constrained_vector_sitofp_v3f32_v3i64:
7517; PC64LE9:       # %bb.0: # %entry
7518; PC64LE9-NEXT:    mtfprd 0, 3
7519; PC64LE9-NEXT:    mtfprd 1, 4
7520; PC64LE9-NEXT:    addis 3, 2, .LCPI163_0@toc@ha
7521; PC64LE9-NEXT:    xscvsxdsp 0, 0
7522; PC64LE9-NEXT:    xscvsxdsp 1, 1
7523; PC64LE9-NEXT:    addi 3, 3, .LCPI163_0@toc@l
7524; PC64LE9-NEXT:    lxv 35, 0(3)
7525; PC64LE9-NEXT:    xscvdpspn 0, 0
7526; PC64LE9-NEXT:    xscvdpspn 1, 1
7527; PC64LE9-NEXT:    xxmrghw 34, 1, 0
7528; PC64LE9-NEXT:    mtfprd 0, 5
7529; PC64LE9-NEXT:    xscvsxdsp 0, 0
7530; PC64LE9-NEXT:    xscvdpspn 36, 0
7531; PC64LE9-NEXT:    vperm 2, 4, 2, 3
7532; PC64LE9-NEXT:    blr
7533entry:
7534  %result = call <3 x float>
7535           @llvm.experimental.constrained.sitofp.v3f32.v3i64(<3 x i64> %x,
7536                                               metadata !"round.dynamic",
7537                                               metadata !"fpexcept.strict") #0
7538  ret <3 x float> %result
7539}
7540
7541define <4 x double> @constrained_vector_sitofp_v4f64_v4i32(<4 x i32> %x) #0 {
7542; PC64LE-LABEL: constrained_vector_sitofp_v4f64_v4i32:
7543; PC64LE:       # %bb.0: # %entry
7544; PC64LE-NEXT:    xxswapd 0, 34
7545; PC64LE-NEXT:    mfvsrwz 3, 34
7546; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7547; PC64LE-NEXT:    mtfprwa 2, 3
7548; PC64LE-NEXT:    mffprwz 3, 0
7549; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
7550; PC64LE-NEXT:    mffprwz 4, 1
7551; PC64LE-NEXT:    mtfprwa 1, 3
7552; PC64LE-NEXT:    mffprwz 3, 0
7553; PC64LE-NEXT:    mtfprwa 3, 4
7554; PC64LE-NEXT:    xscvsxddp 0, 2
7555; PC64LE-NEXT:    mtfprwa 2, 3
7556; PC64LE-NEXT:    xscvsxddp 1, 1
7557; PC64LE-NEXT:    xscvsxddp 3, 3
7558; PC64LE-NEXT:    xscvsxddp 2, 2
7559; PC64LE-NEXT:    xxmrghd 34, 3, 1
7560; PC64LE-NEXT:    xxmrghd 35, 2, 0
7561; PC64LE-NEXT:    blr
7562;
7563; PC64LE9-LABEL: constrained_vector_sitofp_v4f64_v4i32:
7564; PC64LE9:       # %bb.0: # %entry
7565; PC64LE9-NEXT:    li 3, 0
7566; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7567; PC64LE9-NEXT:    mtfprwa 0, 3
7568; PC64LE9-NEXT:    li 3, 4
7569; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7570; PC64LE9-NEXT:    xscvsxddp 0, 0
7571; PC64LE9-NEXT:    mtfprwa 1, 3
7572; PC64LE9-NEXT:    li 3, 12
7573; PC64LE9-NEXT:    xscvsxddp 1, 1
7574; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7575; PC64LE9-NEXT:    xxmrghd 0, 1, 0
7576; PC64LE9-NEXT:    mtfprwa 1, 3
7577; PC64LE9-NEXT:    mfvsrwz 3, 34
7578; PC64LE9-NEXT:    mtfprwa 2, 3
7579; PC64LE9-NEXT:    xscvsxddp 1, 1
7580; PC64LE9-NEXT:    xscvsxddp 2, 2
7581; PC64LE9-NEXT:    xxlor 34, 0, 0
7582; PC64LE9-NEXT:    xxmrghd 35, 1, 2
7583; PC64LE9-NEXT:    blr
7584entry:
7585  %result = call <4 x double>
7586           @llvm.experimental.constrained.sitofp.v4f64.v4i32(<4 x i32> %x,
7587                                               metadata !"round.dynamic",
7588                                               metadata !"fpexcept.strict") #0
7589  ret <4 x double> %result
7590}
7591
7592define <4 x float> @constrained_vector_sitofp_v4f32_v4i16(<4 x i16> %x) #0 {
7593; PC64LE-LABEL: constrained_vector_sitofp_v4f32_v4i16:
7594; PC64LE:       # %bb.0: # %entry
7595; PC64LE-NEXT:    vmrglh 2, 2, 2
7596; PC64LE-NEXT:    vspltisw 3, 8
7597; PC64LE-NEXT:    vadduwm 3, 3, 3
7598; PC64LE-NEXT:    vslw 2, 2, 3
7599; PC64LE-NEXT:    vsraw 2, 2, 3
7600; PC64LE-NEXT:    xvcvsxwsp 34, 34
7601; PC64LE-NEXT:    blr
7602;
7603; PC64LE9-LABEL: constrained_vector_sitofp_v4f32_v4i16:
7604; PC64LE9:       # %bb.0: # %entry
7605; PC64LE9-NEXT:    vmrglh 2, 2, 2
7606; PC64LE9-NEXT:    vextsh2w 2, 2
7607; PC64LE9-NEXT:    xvcvsxwsp 34, 34
7608; PC64LE9-NEXT:    blr
7609entry:
7610  %result = call <4 x float>
7611         @llvm.experimental.constrained.sitofp.v4f32.v4i16(<4 x i16> %x,
7612                                               metadata !"round.dynamic",
7613                                               metadata !"fpexcept.strict") #0
7614  ret <4 x float> %result
7615}
7616
7617define <4 x float> @constrained_vector_sitofp_v4f32_v4i32(<4 x i32> %x) #0 {
7618; PC64LE-LABEL: constrained_vector_sitofp_v4f32_v4i32:
7619; PC64LE:       # %bb.0: # %entry
7620; PC64LE-NEXT:    xvcvsxwsp 34, 34
7621; PC64LE-NEXT:    blr
7622;
7623; PC64LE9-LABEL: constrained_vector_sitofp_v4f32_v4i32:
7624; PC64LE9:       # %bb.0: # %entry
7625; PC64LE9-NEXT:    xvcvsxwsp 34, 34
7626; PC64LE9-NEXT:    blr
7627entry:
7628  %result = call <4 x float>
7629           @llvm.experimental.constrained.sitofp.v4f32.v4i32(<4 x i32> %x,
7630                                               metadata !"round.dynamic",
7631                                               metadata !"fpexcept.strict") #0
7632  ret <4 x float> %result
7633}
7634
7635define <4 x double> @constrained_vector_sitofp_v4f64_v4i64(<4 x i64> %x) #0 {
7636; PC64LE-LABEL: constrained_vector_sitofp_v4f64_v4i64:
7637; PC64LE:       # %bb.0: # %entry
7638; PC64LE-NEXT:    xvcvsxddp 35, 35
7639; PC64LE-NEXT:    xvcvsxddp 34, 34
7640; PC64LE-NEXT:    blr
7641;
7642; PC64LE9-LABEL: constrained_vector_sitofp_v4f64_v4i64:
7643; PC64LE9:       # %bb.0: # %entry
7644; PC64LE9-NEXT:    xvcvsxddp 35, 35
7645; PC64LE9-NEXT:    xvcvsxddp 34, 34
7646; PC64LE9-NEXT:    blr
7647entry:
7648  %result = call <4 x double>
7649           @llvm.experimental.constrained.sitofp.v4f64.v4i64(<4 x i64> %x,
7650                                               metadata !"round.dynamic",
7651                                               metadata !"fpexcept.strict") #0
7652  ret <4 x double> %result
7653}
7654
7655define <4 x float> @constrained_vector_sitofp_v4f32_v4i64(<4 x i64> %x) #0 {
7656; PC64LE-LABEL: constrained_vector_sitofp_v4f32_v4i64:
7657; PC64LE:       # %bb.0: # %entry
7658; PC64LE-NEXT:    xxswapd 0, 34
7659; PC64LE-NEXT:    mfvsrd 3, 34
7660; PC64LE-NEXT:    xxswapd 2, 35
7661; PC64LE-NEXT:    mfvsrd 4, 35
7662; PC64LE-NEXT:    mtfprd 1, 3
7663; PC64LE-NEXT:    mffprd 3, 0
7664; PC64LE-NEXT:    mtfprd 0, 4
7665; PC64LE-NEXT:    mtfprd 3, 3
7666; PC64LE-NEXT:    mffprd 3, 2
7667; PC64LE-NEXT:    xscvsxdsp 1, 1
7668; PC64LE-NEXT:    mtfprd 2, 3
7669; PC64LE-NEXT:    xscvsxdsp 0, 0
7670; PC64LE-NEXT:    xscvsxdsp 3, 3
7671; PC64LE-NEXT:    xscvsxdsp 2, 2
7672; PC64LE-NEXT:    xxmrghd 0, 0, 1
7673; PC64LE-NEXT:    xxmrghd 1, 2, 3
7674; PC64LE-NEXT:    xvcvdpsp 34, 0
7675; PC64LE-NEXT:    xvcvdpsp 35, 1
7676; PC64LE-NEXT:    vmrgew 2, 2, 3
7677; PC64LE-NEXT:    blr
7678;
7679; PC64LE9-LABEL: constrained_vector_sitofp_v4f32_v4i64:
7680; PC64LE9:       # %bb.0: # %entry
7681; PC64LE9-NEXT:    mfvsrld 3, 34
7682; PC64LE9-NEXT:    mtfprd 0, 3
7683; PC64LE9-NEXT:    mfvsrld 3, 35
7684; PC64LE9-NEXT:    xscvsxdsp 0, 0
7685; PC64LE9-NEXT:    mtfprd 1, 3
7686; PC64LE9-NEXT:    mfvsrd 3, 34
7687; PC64LE9-NEXT:    xscvsxdsp 1, 1
7688; PC64LE9-NEXT:    xxmrghd 0, 1, 0
7689; PC64LE9-NEXT:    xvcvdpsp 36, 0
7690; PC64LE9-NEXT:    mtfprd 0, 3
7691; PC64LE9-NEXT:    mfvsrd 3, 35
7692; PC64LE9-NEXT:    mtfprd 1, 3
7693; PC64LE9-NEXT:    xscvsxdsp 0, 0
7694; PC64LE9-NEXT:    xscvsxdsp 1, 1
7695; PC64LE9-NEXT:    xxmrghd 0, 1, 0
7696; PC64LE9-NEXT:    xvcvdpsp 34, 0
7697; PC64LE9-NEXT:    vmrgew 2, 2, 4
7698; PC64LE9-NEXT:    blr
7699entry:
7700  %result = call <4 x float>
7701           @llvm.experimental.constrained.sitofp.v4f32.v4i64(<4 x i64> %x,
7702                                               metadata !"round.dynamic",
7703                                               metadata !"fpexcept.strict") #0
7704  ret <4 x float> %result
7705}
7706
7707define <1 x double> @constrained_vector_uitofp_v1f64_v1i32(<1 x i32> %x) #0 {
7708; PC64LE-LABEL: constrained_vector_uitofp_v1f64_v1i32:
7709; PC64LE:       # %bb.0: # %entry
7710; PC64LE-NEXT:    mtfprwz 0, 3
7711; PC64LE-NEXT:    xscvuxddp 1, 0
7712; PC64LE-NEXT:    blr
7713;
7714; PC64LE9-LABEL: constrained_vector_uitofp_v1f64_v1i32:
7715; PC64LE9:       # %bb.0: # %entry
7716; PC64LE9-NEXT:    mtfprwz 0, 3
7717; PC64LE9-NEXT:    xscvuxddp 1, 0
7718; PC64LE9-NEXT:    blr
7719entry:
7720  %result = call <1 x double>
7721           @llvm.experimental.constrained.uitofp.v1f64.v1i32(<1 x i32> %x,
7722                                               metadata !"round.dynamic",
7723                                               metadata !"fpexcept.strict") #0
7724  ret <1 x double> %result
7725}
7726
7727define <1 x float> @constrained_vector_uitofp_v1f32_v1i32(<1 x i32> %x) #0 {
7728; PC64LE-LABEL: constrained_vector_uitofp_v1f32_v1i32:
7729; PC64LE:       # %bb.0: # %entry
7730; PC64LE-NEXT:    mtfprwz 0, 3
7731; PC64LE-NEXT:    xscvuxdsp 1, 0
7732; PC64LE-NEXT:    blr
7733;
7734; PC64LE9-LABEL: constrained_vector_uitofp_v1f32_v1i32:
7735; PC64LE9:       # %bb.0: # %entry
7736; PC64LE9-NEXT:    mtfprwz 0, 3
7737; PC64LE9-NEXT:    xscvuxdsp 1, 0
7738; PC64LE9-NEXT:    blr
7739entry:
7740  %result = call <1 x float>
7741           @llvm.experimental.constrained.uitofp.v1f32.v1i32(<1 x i32> %x,
7742                                               metadata !"round.dynamic",
7743                                               metadata !"fpexcept.strict") #0
7744  ret <1 x float> %result
7745}
7746
7747define <1 x double> @constrained_vector_uitofp_v1f64_v1i64(<1 x i64> %x) #0 {
7748; PC64LE-LABEL: constrained_vector_uitofp_v1f64_v1i64:
7749; PC64LE:       # %bb.0: # %entry
7750; PC64LE-NEXT:    mtfprd 0, 3
7751; PC64LE-NEXT:    xscvuxddp 1, 0
7752; PC64LE-NEXT:    blr
7753;
7754; PC64LE9-LABEL: constrained_vector_uitofp_v1f64_v1i64:
7755; PC64LE9:       # %bb.0: # %entry
7756; PC64LE9-NEXT:    mtfprd 0, 3
7757; PC64LE9-NEXT:    xscvuxddp 1, 0
7758; PC64LE9-NEXT:    blr
7759entry:
7760  %result = call <1 x double>
7761           @llvm.experimental.constrained.uitofp.v1f64.v1i64(<1 x i64> %x,
7762                                               metadata !"round.dynamic",
7763                                               metadata !"fpexcept.strict") #0
7764  ret <1 x double> %result
7765}
7766
7767define <1 x float> @constrained_vector_uitofp_v1f32_v1i64(<1 x i64> %x) #0 {
7768; PC64LE-LABEL: constrained_vector_uitofp_v1f32_v1i64:
7769; PC64LE:       # %bb.0: # %entry
7770; PC64LE-NEXT:    mtfprd 0, 3
7771; PC64LE-NEXT:    xscvuxdsp 1, 0
7772; PC64LE-NEXT:    blr
7773;
7774; PC64LE9-LABEL: constrained_vector_uitofp_v1f32_v1i64:
7775; PC64LE9:       # %bb.0: # %entry
7776; PC64LE9-NEXT:    mtfprd 0, 3
7777; PC64LE9-NEXT:    xscvuxdsp 1, 0
7778; PC64LE9-NEXT:    blr
7779entry:
7780  %result = call <1 x float>
7781           @llvm.experimental.constrained.uitofp.v1f32.v1i64(<1 x i64> %x,
7782                                               metadata !"round.dynamic",
7783                                               metadata !"fpexcept.strict") #0
7784  ret <1 x float> %result
7785}
7786
7787define <2 x double> @constrained_vector_uitofp_v2f64_v2i16(<2 x i16> %x) #0 {
7788; PC64LE-LABEL: constrained_vector_uitofp_v2f64_v2i16:
7789; PC64LE:       # %bb.0: # %entry
7790; PC64LE-NEXT:    addis 3, 2, .LCPI173_0@toc@ha
7791; PC64LE-NEXT:    xxlxor 36, 36, 36
7792; PC64LE-NEXT:    addi 3, 3, .LCPI173_0@toc@l
7793; PC64LE-NEXT:    lvx 3, 0, 3
7794; PC64LE-NEXT:    vperm 2, 4, 2, 3
7795; PC64LE-NEXT:    xvcvuxddp 34, 34
7796; PC64LE-NEXT:    blr
7797;
7798; PC64LE9-LABEL: constrained_vector_uitofp_v2f64_v2i16:
7799; PC64LE9:       # %bb.0: # %entry
7800; PC64LE9-NEXT:    addis 3, 2, .LCPI173_0@toc@ha
7801; PC64LE9-NEXT:    xxlxor 36, 36, 36
7802; PC64LE9-NEXT:    addi 3, 3, .LCPI173_0@toc@l
7803; PC64LE9-NEXT:    lxv 35, 0(3)
7804; PC64LE9-NEXT:    vperm 2, 4, 2, 3
7805; PC64LE9-NEXT:    xvcvuxddp 34, 34
7806; PC64LE9-NEXT:    blr
7807entry:
7808  %result = call <2 x double>
7809           @llvm.experimental.constrained.uitofp.v2f64.v2i16(<2 x i16> %x,
7810                                               metadata !"round.dynamic",
7811                                               metadata !"fpexcept.strict") #0
7812  ret <2 x double> %result
7813}
7814
7815define <2 x double> @constrained_vector_uitofp_v2f64_v2i32(<2 x i32> %x) #0 {
7816; PC64LE-LABEL: constrained_vector_uitofp_v2f64_v2i32:
7817; PC64LE:       # %bb.0: # %entry
7818; PC64LE-NEXT:    xxswapd 0, 34
7819; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7820; PC64LE-NEXT:    mffprwz 3, 0
7821; PC64LE-NEXT:    mffprwz 4, 1
7822; PC64LE-NEXT:    mtfprwz 0, 3
7823; PC64LE-NEXT:    mtfprwz 1, 4
7824; PC64LE-NEXT:    xscvuxddp 0, 0
7825; PC64LE-NEXT:    xscvuxddp 1, 1
7826; PC64LE-NEXT:    xxmrghd 34, 1, 0
7827; PC64LE-NEXT:    blr
7828;
7829; PC64LE9-LABEL: constrained_vector_uitofp_v2f64_v2i32:
7830; PC64LE9:       # %bb.0: # %entry
7831; PC64LE9-NEXT:    li 3, 0
7832; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7833; PC64LE9-NEXT:    mtfprwz 0, 3
7834; PC64LE9-NEXT:    li 3, 4
7835; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7836; PC64LE9-NEXT:    xscvuxddp 0, 0
7837; PC64LE9-NEXT:    mtfprwz 1, 3
7838; PC64LE9-NEXT:    xscvuxddp 1, 1
7839; PC64LE9-NEXT:    xxmrghd 34, 1, 0
7840; PC64LE9-NEXT:    blr
7841entry:
7842  %result = call <2 x double>
7843           @llvm.experimental.constrained.uitofp.v2f64.v2i32(<2 x i32> %x,
7844                                               metadata !"round.dynamic",
7845                                               metadata !"fpexcept.strict") #0
7846  ret <2 x double> %result
7847}
7848
7849define <2 x float> @constrained_vector_uitofp_v2f32_v2i32(<2 x i32> %x) #0 {
7850; PC64LE-LABEL: constrained_vector_uitofp_v2f32_v2i32:
7851; PC64LE:       # %bb.0: # %entry
7852; PC64LE-NEXT:    xxswapd 0, 34
7853; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7854; PC64LE-NEXT:    mffprwz 3, 0
7855; PC64LE-NEXT:    mffprwz 4, 1
7856; PC64LE-NEXT:    mtfprwz 0, 3
7857; PC64LE-NEXT:    mtfprwz 1, 4
7858; PC64LE-NEXT:    xscvuxdsp 0, 0
7859; PC64LE-NEXT:    xscvuxdsp 1, 1
7860; PC64LE-NEXT:    xscvdpspn 0, 0
7861; PC64LE-NEXT:    xscvdpspn 1, 1
7862; PC64LE-NEXT:    xxmrghw 34, 1, 0
7863; PC64LE-NEXT:    blr
7864;
7865; PC64LE9-LABEL: constrained_vector_uitofp_v2f32_v2i32:
7866; PC64LE9:       # %bb.0: # %entry
7867; PC64LE9-NEXT:    li 3, 0
7868; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7869; PC64LE9-NEXT:    mtfprwz 0, 3
7870; PC64LE9-NEXT:    li 3, 4
7871; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7872; PC64LE9-NEXT:    xscvuxdsp 0, 0
7873; PC64LE9-NEXT:    mtfprwz 1, 3
7874; PC64LE9-NEXT:    xscvuxdsp 1, 1
7875; PC64LE9-NEXT:    xscvdpspn 0, 0
7876; PC64LE9-NEXT:    xscvdpspn 1, 1
7877; PC64LE9-NEXT:    xxmrghw 34, 1, 0
7878; PC64LE9-NEXT:    blr
7879entry:
7880  %result = call <2 x float>
7881           @llvm.experimental.constrained.uitofp.v2f32.v2i32(<2 x i32> %x,
7882                                               metadata !"round.dynamic",
7883                                               metadata !"fpexcept.strict") #0
7884  ret <2 x float> %result
7885}
7886
7887define <2 x double> @constrained_vector_uitofp_v2f64_v2i64(<2 x i64> %x) #0 {
7888; PC64LE-LABEL: constrained_vector_uitofp_v2f64_v2i64:
7889; PC64LE:       # %bb.0: # %entry
7890; PC64LE-NEXT:    xvcvuxddp 34, 34
7891; PC64LE-NEXT:    blr
7892;
7893; PC64LE9-LABEL: constrained_vector_uitofp_v2f64_v2i64:
7894; PC64LE9:       # %bb.0: # %entry
7895; PC64LE9-NEXT:    xvcvuxddp 34, 34
7896; PC64LE9-NEXT:    blr
7897entry:
7898  %result = call <2 x double>
7899           @llvm.experimental.constrained.uitofp.v2f64.v2i64(<2 x i64> %x,
7900                                               metadata !"round.dynamic",
7901                                               metadata !"fpexcept.strict") #0
7902  ret <2 x double> %result
7903}
7904
7905define <2 x float> @constrained_vector_uitofp_v2f32_v2i64(<2 x i64> %x) #0 {
7906; PC64LE-LABEL: constrained_vector_uitofp_v2f32_v2i64:
7907; PC64LE:       # %bb.0: # %entry
7908; PC64LE-NEXT:    xxswapd 0, 34
7909; PC64LE-NEXT:    mfvsrd 3, 34
7910; PC64LE-NEXT:    mffprd 4, 0
7911; PC64LE-NEXT:    mtfprd 0, 3
7912; PC64LE-NEXT:    mtfprd 1, 4
7913; PC64LE-NEXT:    xscvuxdsp 0, 0
7914; PC64LE-NEXT:    xscvuxdsp 1, 1
7915; PC64LE-NEXT:    xscvdpspn 0, 0
7916; PC64LE-NEXT:    xscvdpspn 1, 1
7917; PC64LE-NEXT:    xxmrghw 34, 0, 1
7918; PC64LE-NEXT:    blr
7919;
7920; PC64LE9-LABEL: constrained_vector_uitofp_v2f32_v2i64:
7921; PC64LE9:       # %bb.0: # %entry
7922; PC64LE9-NEXT:    mfvsrld 3, 34
7923; PC64LE9-NEXT:    mtfprd 0, 3
7924; PC64LE9-NEXT:    mfvsrd 3, 34
7925; PC64LE9-NEXT:    mtfprd 1, 3
7926; PC64LE9-NEXT:    xscvuxdsp 0, 0
7927; PC64LE9-NEXT:    xscvuxdsp 1, 1
7928; PC64LE9-NEXT:    xscvdpspn 0, 0
7929; PC64LE9-NEXT:    xscvdpspn 1, 1
7930; PC64LE9-NEXT:    xxmrghw 34, 1, 0
7931; PC64LE9-NEXT:    blr
7932entry:
7933  %result = call <2 x float>
7934           @llvm.experimental.constrained.uitofp.v2f32.v2i64(<2 x i64> %x,
7935                                               metadata !"round.dynamic",
7936                                               metadata !"fpexcept.strict") #0
7937  ret <2 x float> %result
7938}
7939
7940define <3 x double> @constrained_vector_uitofp_v3f64_v3i32(<3 x i32> %x) #0 {
7941; PC64LE-LABEL: constrained_vector_uitofp_v3f64_v3i32:
7942; PC64LE:       # %bb.0: # %entry
7943; PC64LE-NEXT:    xxswapd 0, 34
7944; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7945; PC64LE-NEXT:    mfvsrwz 3, 34
7946; PC64LE-NEXT:    mtfprwz 3, 3
7947; PC64LE-NEXT:    mffprwz 3, 0
7948; PC64LE-NEXT:    mffprwz 4, 1
7949; PC64LE-NEXT:    mtfprwz 0, 3
7950; PC64LE-NEXT:    mtfprwz 2, 4
7951; PC64LE-NEXT:    xscvuxddp 1, 0
7952; PC64LE-NEXT:    xscvuxddp 2, 2
7953; PC64LE-NEXT:    xscvuxddp 3, 3
7954; PC64LE-NEXT:    blr
7955;
7956; PC64LE9-LABEL: constrained_vector_uitofp_v3f64_v3i32:
7957; PC64LE9:       # %bb.0: # %entry
7958; PC64LE9-NEXT:    li 3, 0
7959; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7960; PC64LE9-NEXT:    mtfprwz 0, 3
7961; PC64LE9-NEXT:    li 3, 4
7962; PC64LE9-NEXT:    vextuwrx 3, 3, 2
7963; PC64LE9-NEXT:    xscvuxddp 1, 0
7964; PC64LE9-NEXT:    mtfprwz 0, 3
7965; PC64LE9-NEXT:    mfvsrwz 3, 34
7966; PC64LE9-NEXT:    xscvuxddp 2, 0
7967; PC64LE9-NEXT:    mtfprwz 0, 3
7968; PC64LE9-NEXT:    xscvuxddp 3, 0
7969; PC64LE9-NEXT:    blr
7970entry:
7971  %result = call <3 x double>
7972           @llvm.experimental.constrained.uitofp.v3f64.v3i32(<3 x i32> %x,
7973                                               metadata !"round.dynamic",
7974                                               metadata !"fpexcept.strict") #0
7975  ret <3 x double> %result
7976}
7977
7978define <3 x float> @constrained_vector_uitofp_v3f32_v3i32(<3 x i32> %x) #0 {
7979; PC64LE-LABEL: constrained_vector_uitofp_v3f32_v3i32:
7980; PC64LE:       # %bb.0: # %entry
7981; PC64LE-NEXT:    xxswapd 0, 34
7982; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
7983; PC64LE-NEXT:    addis 3, 2, .LCPI179_0@toc@ha
7984; PC64LE-NEXT:    addi 3, 3, .LCPI179_0@toc@l
7985; PC64LE-NEXT:    lvx 4, 0, 3
7986; PC64LE-NEXT:    mffprwz 4, 0
7987; PC64LE-NEXT:    mffprwz 5, 1
7988; PC64LE-NEXT:    mtfprwz 0, 4
7989; PC64LE-NEXT:    mtfprwz 1, 5
7990; PC64LE-NEXT:    mfvsrwz 4, 34
7991; PC64LE-NEXT:    xscvuxdsp 0, 0
7992; PC64LE-NEXT:    xscvuxdsp 1, 1
7993; PC64LE-NEXT:    mtfprwz 2, 4
7994; PC64LE-NEXT:    xscvuxdsp 2, 2
7995; PC64LE-NEXT:    xscvdpspn 0, 0
7996; PC64LE-NEXT:    xscvdpspn 1, 1
7997; PC64LE-NEXT:    xscvdpspn 34, 2
7998; PC64LE-NEXT:    xxmrghw 35, 1, 0
7999; PC64LE-NEXT:    vperm 2, 2, 3, 4
8000; PC64LE-NEXT:    blr
8001;
8002; PC64LE9-LABEL: constrained_vector_uitofp_v3f32_v3i32:
8003; PC64LE9:       # %bb.0: # %entry
8004; PC64LE9-NEXT:    li 3, 0
8005; PC64LE9-NEXT:    vextuwrx 3, 3, 2
8006; PC64LE9-NEXT:    mtfprwz 0, 3
8007; PC64LE9-NEXT:    li 3, 4
8008; PC64LE9-NEXT:    vextuwrx 3, 3, 2
8009; PC64LE9-NEXT:    xscvuxdsp 0, 0
8010; PC64LE9-NEXT:    mtfprwz 1, 3
8011; PC64LE9-NEXT:    addis 3, 2, .LCPI179_0@toc@ha
8012; PC64LE9-NEXT:    xscvuxdsp 1, 1
8013; PC64LE9-NEXT:    addi 3, 3, .LCPI179_0@toc@l
8014; PC64LE9-NEXT:    xscvdpspn 0, 0
8015; PC64LE9-NEXT:    lxv 36, 0(3)
8016; PC64LE9-NEXT:    mfvsrwz 3, 34
8017; PC64LE9-NEXT:    xscvdpspn 1, 1
8018; PC64LE9-NEXT:    xxmrghw 35, 1, 0
8019; PC64LE9-NEXT:    mtfprwz 0, 3
8020; PC64LE9-NEXT:    xscvuxdsp 0, 0
8021; PC64LE9-NEXT:    xscvdpspn 34, 0
8022; PC64LE9-NEXT:    vperm 2, 2, 3, 4
8023; PC64LE9-NEXT:    blr
8024entry:
8025  %result = call <3 x float>
8026           @llvm.experimental.constrained.uitofp.v3f32.v3i32(<3 x i32> %x,
8027                                               metadata !"round.dynamic",
8028                                               metadata !"fpexcept.strict") #0
8029  ret <3 x float> %result
8030}
8031
8032define <3 x double> @constrained_vector_uitofp_v3f64_v3i64(<3 x i64> %x) #0 {
8033; PC64LE-LABEL: constrained_vector_uitofp_v3f64_v3i64:
8034; PC64LE:       # %bb.0: # %entry
8035; PC64LE-NEXT:    mtfprd 0, 3
8036; PC64LE-NEXT:    mtfprd 2, 4
8037; PC64LE-NEXT:    mtfprd 3, 5
8038; PC64LE-NEXT:    xscvuxddp 1, 0
8039; PC64LE-NEXT:    xscvuxddp 2, 2
8040; PC64LE-NEXT:    xscvuxddp 3, 3
8041; PC64LE-NEXT:    blr
8042;
8043; PC64LE9-LABEL: constrained_vector_uitofp_v3f64_v3i64:
8044; PC64LE9:       # %bb.0: # %entry
8045; PC64LE9-NEXT:    mtfprd 0, 3
8046; PC64LE9-NEXT:    xscvuxddp 1, 0
8047; PC64LE9-NEXT:    mtfprd 0, 4
8048; PC64LE9-NEXT:    xscvuxddp 2, 0
8049; PC64LE9-NEXT:    mtfprd 0, 5
8050; PC64LE9-NEXT:    xscvuxddp 3, 0
8051; PC64LE9-NEXT:    blr
8052entry:
8053  %result = call <3 x double>
8054           @llvm.experimental.constrained.uitofp.v3f64.v3i64(<3 x i64> %x,
8055                                               metadata !"round.dynamic",
8056                                               metadata !"fpexcept.strict") #0
8057  ret <3 x double> %result
8058}
8059
8060define <3 x float> @constrained_vector_uitofp_v3f32_v3i64(<3 x i64> %x) #0 {
8061; PC64LE-LABEL: constrained_vector_uitofp_v3f32_v3i64:
8062; PC64LE:       # %bb.0: # %entry
8063; PC64LE-NEXT:    mtfprd 0, 3
8064; PC64LE-NEXT:    addis 6, 2, .LCPI181_0@toc@ha
8065; PC64LE-NEXT:    mtfprd 1, 4
8066; PC64LE-NEXT:    addi 3, 6, .LCPI181_0@toc@l
8067; PC64LE-NEXT:    xscvuxdsp 0, 0
8068; PC64LE-NEXT:    lvx 4, 0, 3
8069; PC64LE-NEXT:    xscvuxdsp 1, 1
8070; PC64LE-NEXT:    mtfprd 2, 5
8071; PC64LE-NEXT:    xscvuxdsp 2, 2
8072; PC64LE-NEXT:    xscvdpspn 0, 0
8073; PC64LE-NEXT:    xscvdpspn 1, 1
8074; PC64LE-NEXT:    xscvdpspn 34, 2
8075; PC64LE-NEXT:    xxmrghw 35, 1, 0
8076; PC64LE-NEXT:    vperm 2, 2, 3, 4
8077; PC64LE-NEXT:    blr
8078;
8079; PC64LE9-LABEL: constrained_vector_uitofp_v3f32_v3i64:
8080; PC64LE9:       # %bb.0: # %entry
8081; PC64LE9-NEXT:    mtfprd 0, 3
8082; PC64LE9-NEXT:    mtfprd 1, 4
8083; PC64LE9-NEXT:    addis 3, 2, .LCPI181_0@toc@ha
8084; PC64LE9-NEXT:    xscvuxdsp 0, 0
8085; PC64LE9-NEXT:    xscvuxdsp 1, 1
8086; PC64LE9-NEXT:    addi 3, 3, .LCPI181_0@toc@l
8087; PC64LE9-NEXT:    lxv 35, 0(3)
8088; PC64LE9-NEXT:    xscvdpspn 0, 0
8089; PC64LE9-NEXT:    xscvdpspn 1, 1
8090; PC64LE9-NEXT:    xxmrghw 34, 1, 0
8091; PC64LE9-NEXT:    mtfprd 0, 5
8092; PC64LE9-NEXT:    xscvuxdsp 0, 0
8093; PC64LE9-NEXT:    xscvdpspn 36, 0
8094; PC64LE9-NEXT:    vperm 2, 4, 2, 3
8095; PC64LE9-NEXT:    blr
8096entry:
8097  %result = call <3 x float>
8098           @llvm.experimental.constrained.uitofp.v3f32.v3i64(<3 x i64> %x,
8099                                               metadata !"round.dynamic",
8100                                               metadata !"fpexcept.strict") #0
8101  ret <3 x float> %result
8102}
8103
8104define <4 x double> @constrained_vector_uitofp_v4f64_v4i32(<4 x i32> %x) #0 {
8105; PC64LE-LABEL: constrained_vector_uitofp_v4f64_v4i32:
8106; PC64LE:       # %bb.0: # %entry
8107; PC64LE-NEXT:    xxswapd 0, 34
8108; PC64LE-NEXT:    mfvsrwz 3, 34
8109; PC64LE-NEXT:    xxsldwi 1, 34, 34, 1
8110; PC64LE-NEXT:    mtfprwz 2, 3
8111; PC64LE-NEXT:    mffprwz 3, 0
8112; PC64LE-NEXT:    xxsldwi 0, 34, 34, 3
8113; PC64LE-NEXT:    mffprwz 4, 1
8114; PC64LE-NEXT:    mtfprwz 1, 3
8115; PC64LE-NEXT:    mffprwz 3, 0
8116; PC64LE-NEXT:    mtfprwz 3, 4
8117; PC64LE-NEXT:    xscvuxddp 0, 2
8118; PC64LE-NEXT:    mtfprwz 2, 3
8119; PC64LE-NEXT:    xscvuxddp 1, 1
8120; PC64LE-NEXT:    xscvuxddp 3, 3
8121; PC64LE-NEXT:    xscvuxddp 2, 2
8122; PC64LE-NEXT:    xxmrghd 34, 3, 1
8123; PC64LE-NEXT:    xxmrghd 35, 2, 0
8124; PC64LE-NEXT:    blr
8125;
8126; PC64LE9-LABEL: constrained_vector_uitofp_v4f64_v4i32:
8127; PC64LE9:       # %bb.0: # %entry
8128; PC64LE9-NEXT:    li 3, 0
8129; PC64LE9-NEXT:    vextuwrx 3, 3, 2
8130; PC64LE9-NEXT:    mtfprwz 0, 3
8131; PC64LE9-NEXT:    li 3, 4
8132; PC64LE9-NEXT:    vextuwrx 3, 3, 2
8133; PC64LE9-NEXT:    xscvuxddp 0, 0
8134; PC64LE9-NEXT:    mtfprwz 1, 3
8135; PC64LE9-NEXT:    li 3, 12
8136; PC64LE9-NEXT:    xscvuxddp 1, 1
8137; PC64LE9-NEXT:    vextuwrx 3, 3, 2
8138; PC64LE9-NEXT:    xxmrghd 0, 1, 0
8139; PC64LE9-NEXT:    mtfprwz 1, 3
8140; PC64LE9-NEXT:    mfvsrwz 3, 34
8141; PC64LE9-NEXT:    mtfprwz 2, 3
8142; PC64LE9-NEXT:    xscvuxddp 1, 1
8143; PC64LE9-NEXT:    xscvuxddp 2, 2
8144; PC64LE9-NEXT:    xxlor 34, 0, 0
8145; PC64LE9-NEXT:    xxmrghd 35, 1, 2
8146; PC64LE9-NEXT:    blr
8147entry:
8148  %result = call <4 x double>
8149           @llvm.experimental.constrained.uitofp.v4f64.v4i32(<4 x i32> %x,
8150                                               metadata !"round.dynamic",
8151                                               metadata !"fpexcept.strict") #0
8152  ret <4 x double> %result
8153}
8154
8155define <4 x float> @constrained_vector_uitofp_v4f32_v4i16(<4 x i16> %x) #0 {
8156; PC64LE-LABEL: constrained_vector_uitofp_v4f32_v4i16:
8157; PC64LE:       # %bb.0: # %entry
8158; PC64LE-NEXT:    xxlxor 35, 35, 35
8159; PC64LE-NEXT:    vmrglh 2, 3, 2
8160; PC64LE-NEXT:    xvcvuxwsp 34, 34
8161; PC64LE-NEXT:    blr
8162;
8163; PC64LE9-LABEL: constrained_vector_uitofp_v4f32_v4i16:
8164; PC64LE9:       # %bb.0: # %entry
8165; PC64LE9-NEXT:    xxlxor 35, 35, 35
8166; PC64LE9-NEXT:    vmrglh 2, 3, 2
8167; PC64LE9-NEXT:    xvcvuxwsp 34, 34
8168; PC64LE9-NEXT:    blr
8169entry:
8170  %result = call <4 x float>
8171         @llvm.experimental.constrained.uitofp.v4f32.v4i16(<4 x i16> %x,
8172                                               metadata !"round.dynamic",
8173                                               metadata !"fpexcept.strict") #0
8174  ret <4 x float> %result
8175}
8176
8177define <4 x float> @constrained_vector_uitofp_v4f32_v4i32(<4 x i32> %x) #0 {
8178; PC64LE-LABEL: constrained_vector_uitofp_v4f32_v4i32:
8179; PC64LE:       # %bb.0: # %entry
8180; PC64LE-NEXT:    xvcvuxwsp 34, 34
8181; PC64LE-NEXT:    blr
8182;
8183; PC64LE9-LABEL: constrained_vector_uitofp_v4f32_v4i32:
8184; PC64LE9:       # %bb.0: # %entry
8185; PC64LE9-NEXT:    xvcvuxwsp 34, 34
8186; PC64LE9-NEXT:    blr
8187entry:
8188  %result = call <4 x float>
8189           @llvm.experimental.constrained.uitofp.v4f32.v4i32(<4 x i32> %x,
8190                                               metadata !"round.dynamic",
8191                                               metadata !"fpexcept.strict") #0
8192  ret <4 x float> %result
8193}
8194
8195define <4 x double> @constrained_vector_uitofp_v4f64_v4i64(<4 x i64> %x) #0 {
8196; PC64LE-LABEL: constrained_vector_uitofp_v4f64_v4i64:
8197; PC64LE:       # %bb.0: # %entry
8198; PC64LE-NEXT:    xvcvuxddp 35, 35
8199; PC64LE-NEXT:    xvcvuxddp 34, 34
8200; PC64LE-NEXT:    blr
8201;
8202; PC64LE9-LABEL: constrained_vector_uitofp_v4f64_v4i64:
8203; PC64LE9:       # %bb.0: # %entry
8204; PC64LE9-NEXT:    xvcvuxddp 35, 35
8205; PC64LE9-NEXT:    xvcvuxddp 34, 34
8206; PC64LE9-NEXT:    blr
8207entry:
8208  %result = call <4 x double>
8209           @llvm.experimental.constrained.uitofp.v4f64.v4i64(<4 x i64> %x,
8210                                               metadata !"round.dynamic",
8211                                               metadata !"fpexcept.strict") #0
8212  ret <4 x double> %result
8213}
8214
8215define <4 x float> @constrained_vector_uitofp_v4f32_v4i64(<4 x i64> %x) #0 {
8216; PC64LE-LABEL: constrained_vector_uitofp_v4f32_v4i64:
8217; PC64LE:       # %bb.0: # %entry
8218; PC64LE-NEXT:    xxswapd 0, 34
8219; PC64LE-NEXT:    mfvsrd 3, 34
8220; PC64LE-NEXT:    xxswapd 2, 35
8221; PC64LE-NEXT:    mfvsrd 4, 35
8222; PC64LE-NEXT:    mtfprd 1, 3
8223; PC64LE-NEXT:    mffprd 3, 0
8224; PC64LE-NEXT:    mtfprd 0, 4
8225; PC64LE-NEXT:    mtfprd 3, 3
8226; PC64LE-NEXT:    mffprd 3, 2
8227; PC64LE-NEXT:    xscvuxdsp 1, 1
8228; PC64LE-NEXT:    mtfprd 2, 3
8229; PC64LE-NEXT:    xscvuxdsp 0, 0
8230; PC64LE-NEXT:    xscvuxdsp 3, 3
8231; PC64LE-NEXT:    xscvuxdsp 2, 2
8232; PC64LE-NEXT:    xxmrghd 0, 0, 1
8233; PC64LE-NEXT:    xxmrghd 1, 2, 3
8234; PC64LE-NEXT:    xvcvdpsp 34, 0
8235; PC64LE-NEXT:    xvcvdpsp 35, 1
8236; PC64LE-NEXT:    vmrgew 2, 2, 3
8237; PC64LE-NEXT:    blr
8238;
8239; PC64LE9-LABEL: constrained_vector_uitofp_v4f32_v4i64:
8240; PC64LE9:       # %bb.0: # %entry
8241; PC64LE9-NEXT:    mfvsrld 3, 34
8242; PC64LE9-NEXT:    mtfprd 0, 3
8243; PC64LE9-NEXT:    mfvsrld 3, 35
8244; PC64LE9-NEXT:    xscvuxdsp 0, 0
8245; PC64LE9-NEXT:    mtfprd 1, 3
8246; PC64LE9-NEXT:    mfvsrd 3, 34
8247; PC64LE9-NEXT:    xscvuxdsp 1, 1
8248; PC64LE9-NEXT:    xxmrghd 0, 1, 0
8249; PC64LE9-NEXT:    xvcvdpsp 36, 0
8250; PC64LE9-NEXT:    mtfprd 0, 3
8251; PC64LE9-NEXT:    mfvsrd 3, 35
8252; PC64LE9-NEXT:    mtfprd 1, 3
8253; PC64LE9-NEXT:    xscvuxdsp 0, 0
8254; PC64LE9-NEXT:    xscvuxdsp 1, 1
8255; PC64LE9-NEXT:    xxmrghd 0, 1, 0
8256; PC64LE9-NEXT:    xvcvdpsp 34, 0
8257; PC64LE9-NEXT:    vmrgew 2, 2, 4
8258; PC64LE9-NEXT:    blr
8259entry:
8260  %result = call <4 x float>
8261           @llvm.experimental.constrained.uitofp.v4f32.v4i64(<4 x i64> %x,
8262                                               metadata !"round.dynamic",
8263                                               metadata !"fpexcept.strict") #0
8264  ret <4 x float> %result
8265}
8266
8267attributes #0 = { nounwind strictfp noimplicitfloat }
8268attributes #1 = { strictfp }
8269
8270; Single width declarations
8271declare <2 x double> @llvm.experimental.constrained.fadd.v2f64(<2 x double>, <2 x double>, metadata, metadata)
8272declare <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double>, <2 x double>, metadata, metadata)
8273declare <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double>, <2 x double>, metadata, metadata)
8274declare <2 x double> @llvm.experimental.constrained.fdiv.v2f64(<2 x double>, <2 x double>, metadata, metadata)
8275declare <2 x double> @llvm.experimental.constrained.frem.v2f64(<2 x double>, <2 x double>, metadata, metadata)
8276declare <2 x double> @llvm.experimental.constrained.sqrt.v2f64(<2 x double>, metadata, metadata)
8277declare <2 x double> @llvm.experimental.constrained.pow.v2f64(<2 x double>, <2 x double>, metadata, metadata)
8278declare <2 x double> @llvm.experimental.constrained.powi.v2f64(<2 x double>, i32, metadata, metadata)
8279declare <2 x double> @llvm.experimental.constrained.sin.v2f64(<2 x double>, metadata, metadata)
8280declare <2 x double> @llvm.experimental.constrained.cos.v2f64(<2 x double>, metadata, metadata)
8281declare <2 x double> @llvm.experimental.constrained.exp.v2f64(<2 x double>, metadata, metadata)
8282declare <2 x double> @llvm.experimental.constrained.exp2.v2f64(<2 x double>, metadata, metadata)
8283declare <2 x double> @llvm.experimental.constrained.log.v2f64(<2 x double>, metadata, metadata)
8284declare <2 x double> @llvm.experimental.constrained.log10.v2f64(<2 x double>, metadata, metadata)
8285declare <2 x double> @llvm.experimental.constrained.log2.v2f64(<2 x double>, metadata, metadata)
8286declare <2 x double> @llvm.experimental.constrained.rint.v2f64(<2 x double>, metadata, metadata)
8287declare <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(<2 x double>, metadata, metadata)
8288declare <2 x double> @llvm.experimental.constrained.maxnum.v2f64(<2 x double>, <2 x double>, metadata)
8289declare <2 x double> @llvm.experimental.constrained.minnum.v2f64(<2 x double>, <2 x double>, metadata)
8290declare <2 x i32> @llvm.experimental.constrained.fptosi.v2i32.v2f32(<2 x float>, metadata)
8291declare <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f32(<2 x float>, metadata)
8292declare <2 x i32> @llvm.experimental.constrained.fptosi.v2i32.v2f64(<2 x double>, metadata)
8293declare <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f64(<2 x double>, metadata)
8294declare <2 x i32> @llvm.experimental.constrained.fptoui.v2i32.v2f32(<2 x float>, metadata)
8295declare <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f32(<2 x float>, metadata)
8296declare <2 x i32> @llvm.experimental.constrained.fptoui.v2i32.v2f64(<2 x double>, metadata)
8297declare <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f64(<2 x double>, metadata)
8298declare <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double>, metadata, metadata)
8299declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float>, metadata)
8300declare <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double>, metadata)
8301declare <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double>, metadata)
8302declare <2 x double> @llvm.experimental.constrained.round.v2f64(<2 x double>, metadata)
8303declare <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double>, metadata)
8304declare <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i16(<2 x i16>, metadata, metadata)
8305declare <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i16(<2 x i16>, metadata, metadata)
8306declare <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i32(<2 x i32>, metadata, metadata)
8307declare <2 x float> @llvm.experimental.constrained.sitofp.v2f32.v2i32(<2 x i32>, metadata, metadata)
8308declare <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i64(<2 x i64>, metadata, metadata)
8309declare <2 x float> @llvm.experimental.constrained.sitofp.v2f32.v2i64(<2 x i64>, metadata, metadata)
8310declare <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i32(<2 x i32>, metadata, metadata)
8311declare <2 x float> @llvm.experimental.constrained.uitofp.v2f32.v2i32(<2 x i32>, metadata, metadata)
8312declare <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i64(<2 x i64>, metadata, metadata)
8313declare <2 x float> @llvm.experimental.constrained.uitofp.v2f32.v2i64(<2 x i64>, metadata, metadata)
8314
8315; Scalar width declarations
8316declare <1 x float> @llvm.experimental.constrained.fadd.v1f32(<1 x float>, <1 x float>, metadata, metadata)
8317declare <1 x float> @llvm.experimental.constrained.fsub.v1f32(<1 x float>, <1 x float>, metadata, metadata)
8318declare <1 x float> @llvm.experimental.constrained.fmul.v1f32(<1 x float>, <1 x float>, metadata, metadata)
8319declare <1 x float> @llvm.experimental.constrained.fdiv.v1f32(<1 x float>, <1 x float>, metadata, metadata)
8320declare <1 x float> @llvm.experimental.constrained.frem.v1f32(<1 x float>, <1 x float>, metadata, metadata)
8321declare <1 x float> @llvm.experimental.constrained.sqrt.v1f32(<1 x float>, metadata, metadata)
8322declare <1 x float> @llvm.experimental.constrained.pow.v1f32(<1 x float>, <1 x float>, metadata, metadata)
8323declare <1 x float> @llvm.experimental.constrained.powi.v1f32(<1 x float>, i32, metadata, metadata)
8324declare <1 x float> @llvm.experimental.constrained.sin.v1f32(<1 x float>, metadata, metadata)
8325declare <1 x float> @llvm.experimental.constrained.cos.v1f32(<1 x float>, metadata, metadata)
8326declare <1 x float> @llvm.experimental.constrained.exp.v1f32(<1 x float>, metadata, metadata)
8327declare <1 x float> @llvm.experimental.constrained.exp2.v1f32(<1 x float>, metadata, metadata)
8328declare <1 x float> @llvm.experimental.constrained.log.v1f32(<1 x float>, metadata, metadata)
8329declare <1 x float> @llvm.experimental.constrained.log10.v1f32(<1 x float>, metadata, metadata)
8330declare <1 x float> @llvm.experimental.constrained.log2.v1f32(<1 x float>, metadata, metadata)
8331declare <1 x float> @llvm.experimental.constrained.rint.v1f32(<1 x float>, metadata, metadata)
8332declare <1 x float> @llvm.experimental.constrained.nearbyint.v1f32(<1 x float>, metadata, metadata)
8333declare <1 x float> @llvm.experimental.constrained.maxnum.v1f32(<1 x float>, <1 x float>, metadata)
8334declare <1 x float> @llvm.experimental.constrained.minnum.v1f32(<1 x float>, <1 x float>, metadata)
8335declare <1 x i32> @llvm.experimental.constrained.fptosi.v1i32.v1f32(<1 x float>, metadata)
8336declare <1 x i64> @llvm.experimental.constrained.fptosi.v1i64.v1f32(<1 x float>, metadata)
8337declare <1 x i32> @llvm.experimental.constrained.fptosi.v1i32.v1f64(<1 x double>, metadata)
8338declare <1 x i64> @llvm.experimental.constrained.fptosi.v1i64.v1f64(<1 x double>, metadata)
8339declare <1 x i32> @llvm.experimental.constrained.fptoui.v1i32.v1f32(<1 x float>, metadata)
8340declare <1 x i64> @llvm.experimental.constrained.fptoui.v1i64.v1f32(<1 x float>, metadata)
8341declare <1 x i32> @llvm.experimental.constrained.fptoui.v1i32.v1f64(<1 x double>, metadata)
8342declare <1 x i64> @llvm.experimental.constrained.fptoui.v1i64.v1f64(<1 x double>, metadata)
8343declare <1 x float> @llvm.experimental.constrained.fptrunc.v1f32.v1f64(<1 x double>, metadata, metadata)
8344declare <1 x double> @llvm.experimental.constrained.fpext.v1f64.v1f32(<1 x float>, metadata)
8345declare <1 x float> @llvm.experimental.constrained.ceil.v1f32(<1 x float>, metadata)
8346declare <1 x float> @llvm.experimental.constrained.floor.v1f32(<1 x float>, metadata)
8347declare <1 x float> @llvm.experimental.constrained.round.v1f32(<1 x float>, metadata)
8348declare <1 x float> @llvm.experimental.constrained.trunc.v1f32(<1 x float>, metadata)
8349declare <1 x double> @llvm.experimental.constrained.sitofp.v1f64.v1i32(<1 x i32>, metadata, metadata)
8350declare <1 x float> @llvm.experimental.constrained.sitofp.v1f32.v1i32(<1 x i32>, metadata, metadata)
8351declare <1 x double> @llvm.experimental.constrained.sitofp.v1f64.v1i64(<1 x i64>, metadata, metadata)
8352declare <1 x float> @llvm.experimental.constrained.sitofp.v1f32.v1i64(<1 x i64>, metadata, metadata)
8353declare <1 x double> @llvm.experimental.constrained.uitofp.v1f64.v1i32(<1 x i32>, metadata, metadata)
8354declare <1 x float> @llvm.experimental.constrained.uitofp.v1f32.v1i32(<1 x i32>, metadata, metadata)
8355declare <1 x double> @llvm.experimental.constrained.uitofp.v1f64.v1i64(<1 x i64>, metadata, metadata)
8356declare <1 x float> @llvm.experimental.constrained.uitofp.v1f32.v1i64(<1 x i64>, metadata, metadata)
8357
8358; Illegal width declarations
8359declare <3 x float> @llvm.experimental.constrained.fadd.v3f32(<3 x float>, <3 x float>, metadata, metadata)
8360declare <3 x double> @llvm.experimental.constrained.fadd.v3f64(<3 x double>, <3 x double>, metadata, metadata)
8361declare <3 x float> @llvm.experimental.constrained.fsub.v3f32(<3 x float>, <3 x float>, metadata, metadata)
8362declare <3 x double> @llvm.experimental.constrained.fsub.v3f64(<3 x double>, <3 x double>, metadata, metadata)
8363declare <3 x float> @llvm.experimental.constrained.fmul.v3f32(<3 x float>, <3 x float>, metadata, metadata)
8364declare <3 x double> @llvm.experimental.constrained.fmul.v3f64(<3 x double>, <3 x double>, metadata, metadata)
8365declare <3 x float> @llvm.experimental.constrained.fdiv.v3f32(<3 x float>, <3 x float>, metadata, metadata)
8366declare <3 x double> @llvm.experimental.constrained.fdiv.v3f64(<3 x double>, <3 x double>, metadata, metadata)
8367declare <3 x float> @llvm.experimental.constrained.frem.v3f32(<3 x float>, <3 x float>, metadata, metadata)
8368declare <3 x double> @llvm.experimental.constrained.frem.v3f64(<3 x double>, <3 x double>, metadata, metadata)
8369declare <3 x float> @llvm.experimental.constrained.sqrt.v3f32(<3 x float>, metadata, metadata)
8370declare <3 x double> @llvm.experimental.constrained.sqrt.v3f64(<3 x double>, metadata, metadata)
8371declare <3 x float> @llvm.experimental.constrained.pow.v3f32(<3 x float>, <3 x float>, metadata, metadata)
8372declare <3 x double> @llvm.experimental.constrained.pow.v3f64(<3 x double>, <3 x double>, metadata, metadata)
8373declare <3 x float> @llvm.experimental.constrained.powi.v3f32(<3 x float>, i32, metadata, metadata)
8374declare <3 x double> @llvm.experimental.constrained.powi.v3f64(<3 x double>, i32, metadata, metadata)
8375declare <3 x float> @llvm.experimental.constrained.sin.v3f32(<3 x float>, metadata, metadata)
8376declare <3 x double> @llvm.experimental.constrained.sin.v3f64(<3 x double>, metadata, metadata)
8377declare <3 x float> @llvm.experimental.constrained.cos.v3f32(<3 x float>, metadata, metadata)
8378declare <3 x double> @llvm.experimental.constrained.cos.v3f64(<3 x double>, metadata, metadata)
8379declare <3 x float> @llvm.experimental.constrained.exp.v3f32(<3 x float>, metadata, metadata)
8380declare <3 x double> @llvm.experimental.constrained.exp.v3f64(<3 x double>, metadata, metadata)
8381declare <3 x float> @llvm.experimental.constrained.exp2.v3f32(<3 x float>, metadata, metadata)
8382declare <3 x double> @llvm.experimental.constrained.exp2.v3f64(<3 x double>, metadata, metadata)
8383declare <3 x float> @llvm.experimental.constrained.log.v3f32(<3 x float>, metadata, metadata)
8384declare <3 x double> @llvm.experimental.constrained.log.v3f64(<3 x double>, metadata, metadata)
8385declare <3 x float> @llvm.experimental.constrained.log10.v3f32(<3 x float>, metadata, metadata)
8386declare <3 x double> @llvm.experimental.constrained.log10.v3f64(<3 x double>, metadata, metadata)
8387declare <3 x float> @llvm.experimental.constrained.log2.v3f32(<3 x float>, metadata, metadata)
8388declare <3 x double> @llvm.experimental.constrained.log2.v3f64(<3 x double>, metadata, metadata)
8389declare <3 x float> @llvm.experimental.constrained.rint.v3f32(<3 x float>, metadata, metadata)
8390declare <3 x double> @llvm.experimental.constrained.rint.v3f64(<3 x double>, metadata, metadata)
8391declare <3 x float> @llvm.experimental.constrained.nearbyint.v3f32(<3 x float>, metadata, metadata)
8392declare <3 x double> @llvm.experimental.constrained.nearbyint.v3f64(<3 x double>, metadata, metadata)
8393declare <3 x float> @llvm.experimental.constrained.maxnum.v3f32(<3 x float>, <3 x float>, metadata)
8394declare <3 x double> @llvm.experimental.constrained.maxnum.v3f64(<3 x double>, <3 x double>, metadata)
8395declare <3 x float> @llvm.experimental.constrained.minnum.v3f32(<3 x float>, <3 x float>, metadata)
8396declare <3 x double> @llvm.experimental.constrained.minnum.v3f64(<3 x double>, <3 x double>, metadata)
8397declare <3 x i32> @llvm.experimental.constrained.fptosi.v3i32.v3f32(<3 x float>, metadata)
8398declare <3 x i64> @llvm.experimental.constrained.fptosi.v3i64.v3f32(<3 x float>, metadata)
8399declare <3 x i32> @llvm.experimental.constrained.fptosi.v3i32.v3f64(<3 x double>, metadata)
8400declare <3 x i64> @llvm.experimental.constrained.fptosi.v3i64.v3f64(<3 x double>, metadata)
8401declare <3 x i32> @llvm.experimental.constrained.fptoui.v3i32.v3f32(<3 x float>, metadata)
8402declare <3 x i64> @llvm.experimental.constrained.fptoui.v3i64.v3f32(<3 x float>, metadata)
8403declare <3 x i32> @llvm.experimental.constrained.fptoui.v3i32.v3f64(<3 x double>, metadata)
8404declare <3 x i64> @llvm.experimental.constrained.fptoui.v3i64.v3f64(<3 x double>, metadata)
8405declare <3 x float> @llvm.experimental.constrained.fptrunc.v3f32.v3f64(<3 x double>, metadata, metadata)
8406declare <3 x double> @llvm.experimental.constrained.fpext.v3f64.v3f32(<3 x float>, metadata)
8407declare <3 x float> @llvm.experimental.constrained.ceil.v3f32(<3 x float>, metadata)
8408declare <3 x double> @llvm.experimental.constrained.ceil.v3f64(<3 x double>, metadata)
8409declare <3 x float> @llvm.experimental.constrained.floor.v3f32(<3 x float>, metadata)
8410declare <3 x double> @llvm.experimental.constrained.floor.v3f64(<3 x double>, metadata)
8411declare <3 x float> @llvm.experimental.constrained.round.v3f32(<3 x float>, metadata)
8412declare <3 x double> @llvm.experimental.constrained.round.v3f64(<3 x double>, metadata)
8413declare <3 x float> @llvm.experimental.constrained.trunc.v3f32(<3 x float>, metadata)
8414declare <3 x double> @llvm.experimental.constrained.trunc.v3f64(<3 x double>, metadata)
8415declare <3 x double> @llvm.experimental.constrained.sitofp.v3f64.v3i32(<3 x i32>, metadata, metadata)
8416declare <3 x float> @llvm.experimental.constrained.sitofp.v3f32.v3i32(<3 x i32>, metadata, metadata)
8417declare <3 x double> @llvm.experimental.constrained.sitofp.v3f64.v3i64(<3 x i64>, metadata, metadata)
8418declare <3 x float> @llvm.experimental.constrained.sitofp.v3f32.v3i64(<3 x i64>, metadata, metadata)
8419declare <3 x double> @llvm.experimental.constrained.uitofp.v3f64.v3i32(<3 x i32>, metadata, metadata)
8420declare <3 x float> @llvm.experimental.constrained.uitofp.v3f32.v3i32(<3 x i32>, metadata, metadata)
8421declare <3 x double> @llvm.experimental.constrained.uitofp.v3f64.v3i64(<3 x i64>, metadata, metadata)
8422declare <3 x float> @llvm.experimental.constrained.uitofp.v3f32.v3i64(<3 x i64>, metadata, metadata)
8423
8424; Double width declarations
8425declare <4 x double> @llvm.experimental.constrained.fadd.v4f64(<4 x double>, <4 x double>, metadata, metadata)
8426declare <4 x double> @llvm.experimental.constrained.fsub.v4f64(<4 x double>, <4 x double>, metadata, metadata)
8427declare <4 x double> @llvm.experimental.constrained.fmul.v4f64(<4 x double>, <4 x double>, metadata, metadata)
8428declare <4 x double> @llvm.experimental.constrained.fdiv.v4f64(<4 x double>, <4 x double>, metadata, metadata)
8429declare <4 x double> @llvm.experimental.constrained.frem.v4f64(<4 x double>, <4 x double>, metadata, metadata)
8430declare <4 x double> @llvm.experimental.constrained.sqrt.v4f64(<4 x double>, metadata, metadata)
8431declare <4 x double> @llvm.experimental.constrained.pow.v4f64(<4 x double>, <4 x double>, metadata, metadata)
8432declare <4 x double> @llvm.experimental.constrained.powi.v4f64(<4 x double>, i32, metadata, metadata)
8433declare <4 x double> @llvm.experimental.constrained.sin.v4f64(<4 x double>, metadata, metadata)
8434declare <4 x double> @llvm.experimental.constrained.cos.v4f64(<4 x double>, metadata, metadata)
8435declare <4 x double> @llvm.experimental.constrained.exp.v4f64(<4 x double>, metadata, metadata)
8436declare <4 x double> @llvm.experimental.constrained.exp2.v4f64(<4 x double>, metadata, metadata)
8437declare <4 x double> @llvm.experimental.constrained.log.v4f64(<4 x double>, metadata, metadata)
8438declare <4 x double> @llvm.experimental.constrained.log10.v4f64(<4 x double>, metadata, metadata)
8439declare <4 x double> @llvm.experimental.constrained.log2.v4f64(<4 x double>, metadata, metadata)
8440declare <4 x double> @llvm.experimental.constrained.rint.v4f64(<4 x double>, metadata, metadata)
8441declare <4 x double> @llvm.experimental.constrained.nearbyint.v4f64(<4 x double>, metadata, metadata)
8442declare <4 x double> @llvm.experimental.constrained.maxnum.v4f64(<4 x double>, <4 x double>, metadata)
8443declare <4 x double> @llvm.experimental.constrained.minnum.v4f64(<4 x double>, <4 x double>, metadata)
8444declare <4 x i32> @llvm.experimental.constrained.fptosi.v4i32.v4f32(<4 x float>, metadata)
8445declare <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f32(<4 x float>, metadata)
8446declare <4 x i32> @llvm.experimental.constrained.fptosi.v4i32.v4f64(<4 x double>, metadata)
8447declare <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f64(<4 x double>, metadata)
8448declare <4 x i32> @llvm.experimental.constrained.fptoui.v4i32.v4f32(<4 x float>, metadata)
8449declare <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f32(<4 x float>, metadata)
8450declare <4 x i32> @llvm.experimental.constrained.fptoui.v4i32.v4f64(<4 x double>, metadata)
8451declare <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f64(<4 x double>, metadata)
8452declare <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(<4 x double>, metadata, metadata)
8453declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)
8454declare <4 x double> @llvm.experimental.constrained.ceil.v4f64(<4 x double>, metadata)
8455declare <4 x double> @llvm.experimental.constrained.floor.v4f64(<4 x double>, metadata)
8456declare <4 x double> @llvm.experimental.constrained.round.v4f64(<4 x double>, metadata)
8457declare <4 x double> @llvm.experimental.constrained.trunc.v4f64(<4 x double>, metadata)
8458declare <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i16(<4 x i16>, metadata, metadata)
8459declare <4 x double> @llvm.experimental.constrained.sitofp.v4f64.v4i32(<4 x i32>, metadata, metadata)
8460declare <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i32(<4 x i32>, metadata, metadata)
8461declare <4 x double> @llvm.experimental.constrained.sitofp.v4f64.v4i64(<4 x i64>, metadata, metadata)
8462declare <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i64(<4 x i64>, metadata, metadata)
8463declare <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i16(<4 x i16>, metadata, metadata)
8464declare <4 x double> @llvm.experimental.constrained.uitofp.v4f64.v4i32(<4 x i32>, metadata, metadata)
8465declare <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i32(<4 x i32>, metadata, metadata)
8466declare <4 x double> @llvm.experimental.constrained.uitofp.v4f64.v4i64(<4 x i64>, metadata, metadata)
8467declare <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i64(<4 x i64>, metadata, metadata)
8468