xref: /llvm-project/llvm/test/CodeGen/PowerPC/fminimum-fmaximum.ll (revision 6a8d30b1c1be5e46deb9b3a17915d488e1dbc470)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -mattr=-vsx < %s | FileCheck %s --check-prefix=NOVSX
3; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s --check-prefix=VSX
4; RUN: llc -mtriple=powerpc64-ibm-aix -mcpu=pwr8 < %s | FileCheck %s --check-prefix=AIX
5
6define float @f32_minimum(float %a, float %b) {
7; NOVSX-LABEL: f32_minimum:
8; NOVSX:       # %bb.0: # %entry
9; NOVSX-NEXT:    fcmpu 0, 1, 2
10; NOVSX-NEXT:    fmr 0, 1
11; NOVSX-NEXT:    stfs 2, -8(1)
12; NOVSX-NEXT:    stfs 1, -4(1)
13; NOVSX-NEXT:    bc 12, 0, .LBB0_2
14; NOVSX-NEXT:  # %bb.1: # %entry
15; NOVSX-NEXT:    fmr 0, 2
16; NOVSX-NEXT:  .LBB0_2: # %entry
17; NOVSX-NEXT:    lwz 3, -4(1)
18; NOVSX-NEXT:    bc 4, 3, .LBB0_4
19; NOVSX-NEXT:  # %bb.3:
20; NOVSX-NEXT:    addis 4, 2, .LCPI0_0@toc@ha
21; NOVSX-NEXT:    lfs 0, .LCPI0_0@toc@l(4)
22; NOVSX-NEXT:  .LBB0_4: # %entry
23; NOVSX-NEXT:    xoris 3, 3, 32768
24; NOVSX-NEXT:    lwz 4, -8(1)
25; NOVSX-NEXT:    cmplwi 3, 0
26; NOVSX-NEXT:    bc 12, 2, .LBB0_6
27; NOVSX-NEXT:  # %bb.5: # %entry
28; NOVSX-NEXT:    fmr 1, 0
29; NOVSX-NEXT:  .LBB0_6: # %entry
30; NOVSX-NEXT:    xoris 3, 4, 32768
31; NOVSX-NEXT:    cmplwi 3, 0
32; NOVSX-NEXT:    bc 12, 2, .LBB0_8
33; NOVSX-NEXT:  # %bb.7: # %entry
34; NOVSX-NEXT:    fmr 2, 1
35; NOVSX-NEXT:  .LBB0_8: # %entry
36; NOVSX-NEXT:    addis 3, 2, .LCPI0_1@toc@ha
37; NOVSX-NEXT:    lfs 1, .LCPI0_1@toc@l(3)
38; NOVSX-NEXT:    fcmpu 0, 0, 1
39; NOVSX-NEXT:    bc 12, 2, .LBB0_10
40; NOVSX-NEXT:  # %bb.9: # %entry
41; NOVSX-NEXT:    fmr 2, 0
42; NOVSX-NEXT:  .LBB0_10: # %entry
43; NOVSX-NEXT:    fmr 1, 2
44; NOVSX-NEXT:    blr
45;
46; VSX-LABEL: f32_minimum:
47; VSX:       # %bb.0: # %entry
48; VSX-NEXT:    fcmpu 0, 1, 2
49; VSX-NEXT:    bc 12, 3, .LBB0_2
50; VSX-NEXT:  # %bb.1: # %entry
51; VSX-NEXT:    xsmindp 1, 1, 2
52; VSX-NEXT:    blr
53; VSX-NEXT:  .LBB0_2:
54; VSX-NEXT:    addis 3, 2, .LCPI0_0@toc@ha
55; VSX-NEXT:    lfs 1, .LCPI0_0@toc@l(3)
56; VSX-NEXT:    blr
57;
58; AIX-LABEL: f32_minimum:
59; AIX:       # %bb.0: # %entry
60; AIX-NEXT:    fcmpu 0, 1, 2
61; AIX-NEXT:    bc 12, 3, L..BB0_2
62; AIX-NEXT:  # %bb.1: # %entry
63; AIX-NEXT:    xsmindp 1, 1, 2
64; AIX-NEXT:    blr
65; AIX-NEXT:  L..BB0_2:
66; AIX-NEXT:    ld 3, L..C0(2) # %const.0
67; AIX-NEXT:    lfs 1, 0(3)
68; AIX-NEXT:    blr
69entry:
70  %m = call float @llvm.minimum.f32(float %a, float %b)
71  ret float %m
72}
73
74define float @f32_maximum(float %a, float %b) {
75; NOVSX-LABEL: f32_maximum:
76; NOVSX:       # %bb.0: # %entry
77; NOVSX-NEXT:    fcmpu 0, 1, 2
78; NOVSX-NEXT:    fmr 0, 1
79; NOVSX-NEXT:    stfs 2, -8(1)
80; NOVSX-NEXT:    stfs 1, -4(1)
81; NOVSX-NEXT:    bc 12, 1, .LBB1_2
82; NOVSX-NEXT:  # %bb.1: # %entry
83; NOVSX-NEXT:    fmr 0, 2
84; NOVSX-NEXT:  .LBB1_2: # %entry
85; NOVSX-NEXT:    lwz 3, -4(1)
86; NOVSX-NEXT:    bc 4, 3, .LBB1_4
87; NOVSX-NEXT:  # %bb.3:
88; NOVSX-NEXT:    addis 4, 2, .LCPI1_0@toc@ha
89; NOVSX-NEXT:    lfs 0, .LCPI1_0@toc@l(4)
90; NOVSX-NEXT:  .LBB1_4: # %entry
91; NOVSX-NEXT:    cmpwi 3, 0
92; NOVSX-NEXT:    lwz 4, -8(1)
93; NOVSX-NEXT:    bc 12, 2, .LBB1_6
94; NOVSX-NEXT:  # %bb.5: # %entry
95; NOVSX-NEXT:    fmr 1, 0
96; NOVSX-NEXT:  .LBB1_6: # %entry
97; NOVSX-NEXT:    cmpwi 4, 0
98; NOVSX-NEXT:    bc 12, 2, .LBB1_8
99; NOVSX-NEXT:  # %bb.7: # %entry
100; NOVSX-NEXT:    fmr 2, 1
101; NOVSX-NEXT:  .LBB1_8: # %entry
102; NOVSX-NEXT:    addis 3, 2, .LCPI1_1@toc@ha
103; NOVSX-NEXT:    lfs 1, .LCPI1_1@toc@l(3)
104; NOVSX-NEXT:    fcmpu 0, 0, 1
105; NOVSX-NEXT:    bc 12, 2, .LBB1_10
106; NOVSX-NEXT:  # %bb.9: # %entry
107; NOVSX-NEXT:    fmr 2, 0
108; NOVSX-NEXT:  .LBB1_10: # %entry
109; NOVSX-NEXT:    fmr 1, 2
110; NOVSX-NEXT:    blr
111;
112; VSX-LABEL: f32_maximum:
113; VSX:       # %bb.0: # %entry
114; VSX-NEXT:    fcmpu 0, 1, 2
115; VSX-NEXT:    bc 12, 3, .LBB1_2
116; VSX-NEXT:  # %bb.1: # %entry
117; VSX-NEXT:    xsmaxdp 1, 1, 2
118; VSX-NEXT:    blr
119; VSX-NEXT:  .LBB1_2:
120; VSX-NEXT:    addis 3, 2, .LCPI1_0@toc@ha
121; VSX-NEXT:    lfs 1, .LCPI1_0@toc@l(3)
122; VSX-NEXT:    blr
123;
124; AIX-LABEL: f32_maximum:
125; AIX:       # %bb.0: # %entry
126; AIX-NEXT:    fcmpu 0, 1, 2
127; AIX-NEXT:    bc 12, 3, L..BB1_2
128; AIX-NEXT:  # %bb.1: # %entry
129; AIX-NEXT:    xsmaxdp 1, 1, 2
130; AIX-NEXT:    blr
131; AIX-NEXT:  L..BB1_2:
132; AIX-NEXT:    ld 3, L..C1(2) # %const.0
133; AIX-NEXT:    lfs 1, 0(3)
134; AIX-NEXT:    blr
135entry:
136  %m = call float @llvm.maximum.f32(float %a, float %b)
137  ret float %m
138}
139
140define double @f64_minimum(double %a, double %b) {
141; NOVSX-LABEL: f64_minimum:
142; NOVSX:       # %bb.0: # %entry
143; NOVSX-NEXT:    fcmpu 0, 1, 2
144; NOVSX-NEXT:    fmr 0, 1
145; NOVSX-NEXT:    stfd 2, -16(1)
146; NOVSX-NEXT:    stfd 1, -8(1)
147; NOVSX-NEXT:    bc 12, 0, .LBB2_2
148; NOVSX-NEXT:  # %bb.1: # %entry
149; NOVSX-NEXT:    fmr 0, 2
150; NOVSX-NEXT:  .LBB2_2: # %entry
151; NOVSX-NEXT:    ld 3, -8(1)
152; NOVSX-NEXT:    bc 4, 3, .LBB2_4
153; NOVSX-NEXT:  # %bb.3:
154; NOVSX-NEXT:    addis 4, 2, .LCPI2_0@toc@ha
155; NOVSX-NEXT:    lfs 0, .LCPI2_0@toc@l(4)
156; NOVSX-NEXT:  .LBB2_4: # %entry
157; NOVSX-NEXT:    li 5, 1
158; NOVSX-NEXT:    ld 4, -16(1)
159; NOVSX-NEXT:    rldic 5, 5, 63, 0
160; NOVSX-NEXT:    cmpd 3, 5
161; NOVSX-NEXT:    bc 12, 2, .LBB2_6
162; NOVSX-NEXT:  # %bb.5: # %entry
163; NOVSX-NEXT:    fmr 1, 0
164; NOVSX-NEXT:  .LBB2_6: # %entry
165; NOVSX-NEXT:    cmpd 4, 5
166; NOVSX-NEXT:    bc 12, 2, .LBB2_8
167; NOVSX-NEXT:  # %bb.7: # %entry
168; NOVSX-NEXT:    fmr 2, 1
169; NOVSX-NEXT:  .LBB2_8: # %entry
170; NOVSX-NEXT:    addis 3, 2, .LCPI2_1@toc@ha
171; NOVSX-NEXT:    lfs 1, .LCPI2_1@toc@l(3)
172; NOVSX-NEXT:    fcmpu 0, 0, 1
173; NOVSX-NEXT:    bc 12, 2, .LBB2_10
174; NOVSX-NEXT:  # %bb.9: # %entry
175; NOVSX-NEXT:    fmr 2, 0
176; NOVSX-NEXT:  .LBB2_10: # %entry
177; NOVSX-NEXT:    fmr 1, 2
178; NOVSX-NEXT:    blr
179;
180; VSX-LABEL: f64_minimum:
181; VSX:       # %bb.0: # %entry
182; VSX-NEXT:    fcmpu 0, 1, 2
183; VSX-NEXT:    bc 12, 3, .LBB2_2
184; VSX-NEXT:  # %bb.1: # %entry
185; VSX-NEXT:    xsmindp 1, 1, 2
186; VSX-NEXT:    blr
187; VSX-NEXT:  .LBB2_2:
188; VSX-NEXT:    addis 3, 2, .LCPI2_0@toc@ha
189; VSX-NEXT:    lfs 1, .LCPI2_0@toc@l(3)
190; VSX-NEXT:    blr
191;
192; AIX-LABEL: f64_minimum:
193; AIX:       # %bb.0: # %entry
194; AIX-NEXT:    fcmpu 0, 1, 2
195; AIX-NEXT:    bc 12, 3, L..BB2_2
196; AIX-NEXT:  # %bb.1: # %entry
197; AIX-NEXT:    xsmindp 1, 1, 2
198; AIX-NEXT:    blr
199; AIX-NEXT:  L..BB2_2:
200; AIX-NEXT:    ld 3, L..C2(2) # %const.0
201; AIX-NEXT:    lfs 1, 0(3)
202; AIX-NEXT:    blr
203entry:
204  %m = call double @llvm.minimum.f64(double %a, double %b)
205  ret double %m
206}
207
208define double @f64_maximum(double %a, double %b) {
209; NOVSX-LABEL: f64_maximum:
210; NOVSX:       # %bb.0: # %entry
211; NOVSX-NEXT:    fcmpu 0, 1, 2
212; NOVSX-NEXT:    fmr 0, 1
213; NOVSX-NEXT:    stfd 2, -16(1)
214; NOVSX-NEXT:    stfd 1, -8(1)
215; NOVSX-NEXT:    bc 12, 1, .LBB3_2
216; NOVSX-NEXT:  # %bb.1: # %entry
217; NOVSX-NEXT:    fmr 0, 2
218; NOVSX-NEXT:  .LBB3_2: # %entry
219; NOVSX-NEXT:    ld 3, -8(1)
220; NOVSX-NEXT:    bc 4, 3, .LBB3_4
221; NOVSX-NEXT:  # %bb.3:
222; NOVSX-NEXT:    addis 4, 2, .LCPI3_0@toc@ha
223; NOVSX-NEXT:    lfs 0, .LCPI3_0@toc@l(4)
224; NOVSX-NEXT:  .LBB3_4: # %entry
225; NOVSX-NEXT:    cmpdi 3, 0
226; NOVSX-NEXT:    ld 4, -16(1)
227; NOVSX-NEXT:    bc 12, 2, .LBB3_6
228; NOVSX-NEXT:  # %bb.5: # %entry
229; NOVSX-NEXT:    fmr 1, 0
230; NOVSX-NEXT:  .LBB3_6: # %entry
231; NOVSX-NEXT:    cmpdi 4, 0
232; NOVSX-NEXT:    bc 12, 2, .LBB3_8
233; NOVSX-NEXT:  # %bb.7: # %entry
234; NOVSX-NEXT:    fmr 2, 1
235; NOVSX-NEXT:  .LBB3_8: # %entry
236; NOVSX-NEXT:    addis 3, 2, .LCPI3_1@toc@ha
237; NOVSX-NEXT:    lfs 1, .LCPI3_1@toc@l(3)
238; NOVSX-NEXT:    fcmpu 0, 0, 1
239; NOVSX-NEXT:    bc 12, 2, .LBB3_10
240; NOVSX-NEXT:  # %bb.9: # %entry
241; NOVSX-NEXT:    fmr 2, 0
242; NOVSX-NEXT:  .LBB3_10: # %entry
243; NOVSX-NEXT:    fmr 1, 2
244; NOVSX-NEXT:    blr
245;
246; VSX-LABEL: f64_maximum:
247; VSX:       # %bb.0: # %entry
248; VSX-NEXT:    fcmpu 0, 1, 2
249; VSX-NEXT:    bc 12, 3, .LBB3_2
250; VSX-NEXT:  # %bb.1: # %entry
251; VSX-NEXT:    xsmaxdp 1, 1, 2
252; VSX-NEXT:    blr
253; VSX-NEXT:  .LBB3_2:
254; VSX-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
255; VSX-NEXT:    lfs 1, .LCPI3_0@toc@l(3)
256; VSX-NEXT:    blr
257;
258; AIX-LABEL: f64_maximum:
259; AIX:       # %bb.0: # %entry
260; AIX-NEXT:    fcmpu 0, 1, 2
261; AIX-NEXT:    bc 12, 3, L..BB3_2
262; AIX-NEXT:  # %bb.1: # %entry
263; AIX-NEXT:    xsmaxdp 1, 1, 2
264; AIX-NEXT:    blr
265; AIX-NEXT:  L..BB3_2:
266; AIX-NEXT:    ld 3, L..C3(2) # %const.0
267; AIX-NEXT:    lfs 1, 0(3)
268; AIX-NEXT:    blr
269entry:
270  %m = call double @llvm.maximum.f64(double %a, double %b)
271  ret double %m
272}
273
274define <4 x float> @v4f32_minimum(<4 x float> %a, <4 x float> %b) {
275; NOVSX-LABEL: v4f32_minimum:
276; NOVSX:       # %bb.0: # %entry
277; NOVSX-NEXT:    vcmpeqfp 0, 3, 3
278; NOVSX-NEXT:    vcmpeqfp 1, 2, 2
279; NOVSX-NEXT:    addis 3, 2, .LCPI4_0@toc@ha
280; NOVSX-NEXT:    addi 3, 3, .LCPI4_0@toc@l
281; NOVSX-NEXT:    vnot 0, 0
282; NOVSX-NEXT:    vnot 1, 1
283; NOVSX-NEXT:    vspltisb 4, -1
284; NOVSX-NEXT:    vcmpgtfp 5, 3, 2
285; NOVSX-NEXT:    vslw 4, 4, 4
286; NOVSX-NEXT:    vor 0, 1, 0
287; NOVSX-NEXT:    lvx 1, 0, 3
288; NOVSX-NEXT:    vsel 5, 3, 2, 5
289; NOVSX-NEXT:    vsel 5, 5, 1, 0
290; NOVSX-NEXT:    vcmpequw 0, 2, 4
291; NOVSX-NEXT:    vcmpequw 4, 3, 4
292; NOVSX-NEXT:    vsel 2, 5, 2, 0
293; NOVSX-NEXT:    vsel 2, 2, 3, 4
294; NOVSX-NEXT:    vxor 3, 3, 3
295; NOVSX-NEXT:    vcmpeqfp 3, 5, 3
296; NOVSX-NEXT:    vsel 2, 5, 2, 3
297; NOVSX-NEXT:    blr
298;
299; VSX-LABEL: v4f32_minimum:
300; VSX:       # %bb.0: # %entry
301; VSX-NEXT:    xvcmpeqsp 1, 35, 35
302; VSX-NEXT:    xvcmpeqsp 2, 34, 34
303; VSX-NEXT:    addis 3, 2, .LCPI4_0@toc@ha
304; VSX-NEXT:    xxleqv 36, 36, 36
305; VSX-NEXT:    xvminsp 0, 34, 35
306; VSX-NEXT:    vslw 4, 4, 4
307; VSX-NEXT:    addi 3, 3, .LCPI4_0@toc@l
308; VSX-NEXT:    xxlnor 1, 1, 1
309; VSX-NEXT:    xxlnor 2, 2, 2
310; VSX-NEXT:    vcmpequw 5, 2, 4
311; VSX-NEXT:    xxlor 1, 2, 1
312; VSX-NEXT:    lxvd2x 2, 0, 3
313; VSX-NEXT:    xxsel 0, 0, 2, 1
314; VSX-NEXT:    xxlxor 2, 2, 2
315; VSX-NEXT:    xvcmpeqsp 2, 0, 2
316; VSX-NEXT:    xxsel 1, 0, 34, 37
317; VSX-NEXT:    vcmpequw 2, 3, 4
318; VSX-NEXT:    xxsel 1, 1, 35, 34
319; VSX-NEXT:    xxsel 34, 0, 1, 2
320; VSX-NEXT:    blr
321;
322; AIX-LABEL: v4f32_minimum:
323; AIX:       # %bb.0: # %entry
324; AIX-NEXT:    xvcmpeqsp 1, 35, 35
325; AIX-NEXT:    xvcmpeqsp 2, 34, 34
326; AIX-NEXT:    ld 3, L..C4(2) # %const.0
327; AIX-NEXT:    xxleqv 36, 36, 36
328; AIX-NEXT:    xvminsp 0, 34, 35
329; AIX-NEXT:    vslw 4, 4, 4
330; AIX-NEXT:    xxlnor 1, 1, 1
331; AIX-NEXT:    xxlnor 2, 2, 2
332; AIX-NEXT:    vcmpequw 5, 2, 4
333; AIX-NEXT:    xxlor 1, 2, 1
334; AIX-NEXT:    lxvw4x 2, 0, 3
335; AIX-NEXT:    xxsel 0, 0, 2, 1
336; AIX-NEXT:    xxlxor 2, 2, 2
337; AIX-NEXT:    xvcmpeqsp 2, 0, 2
338; AIX-NEXT:    xxsel 1, 0, 34, 37
339; AIX-NEXT:    vcmpequw 2, 3, 4
340; AIX-NEXT:    xxsel 1, 1, 35, 34
341; AIX-NEXT:    xxsel 34, 0, 1, 2
342; AIX-NEXT:    blr
343entry:
344  %m = call <4 x float> @llvm.minimum.v4f32(<4 x float> %a, <4 x float> %b)
345  ret <4 x float> %m
346}
347
348define <4 x float> @v4f32_maximum(<4 x float> %a, <4 x float> %b) {
349; NOVSX-LABEL: v4f32_maximum:
350; NOVSX:       # %bb.0: # %entry
351; NOVSX-NEXT:    vcmpeqfp 5, 3, 3
352; NOVSX-NEXT:    vcmpeqfp 0, 2, 2
353; NOVSX-NEXT:    addis 3, 2, .LCPI5_0@toc@ha
354; NOVSX-NEXT:    addi 3, 3, .LCPI5_0@toc@l
355; NOVSX-NEXT:    vnot 5, 5
356; NOVSX-NEXT:    vnot 0, 0
357; NOVSX-NEXT:    vcmpgtfp 4, 2, 3
358; NOVSX-NEXT:    vor 5, 0, 5
359; NOVSX-NEXT:    lvx 0, 0, 3
360; NOVSX-NEXT:    vsel 4, 3, 2, 4
361; NOVSX-NEXT:    vsel 4, 4, 0, 5
362; NOVSX-NEXT:    vxor 5, 5, 5
363; NOVSX-NEXT:    vcmpequw 0, 2, 5
364; NOVSX-NEXT:    vsel 2, 4, 2, 0
365; NOVSX-NEXT:    vcmpequw 0, 3, 5
366; NOVSX-NEXT:    vsel 2, 2, 3, 0
367; NOVSX-NEXT:    vcmpeqfp 3, 4, 5
368; NOVSX-NEXT:    vsel 2, 4, 2, 3
369; NOVSX-NEXT:    blr
370;
371; VSX-LABEL: v4f32_maximum:
372; VSX:       # %bb.0: # %entry
373; VSX-NEXT:    xvcmpeqsp 1, 35, 35
374; VSX-NEXT:    xvcmpeqsp 2, 34, 34
375; VSX-NEXT:    addis 3, 2, .LCPI5_0@toc@ha
376; VSX-NEXT:    addi 3, 3, .LCPI5_0@toc@l
377; VSX-NEXT:    xxlnor 1, 1, 1
378; VSX-NEXT:    xxlnor 2, 2, 2
379; VSX-NEXT:    xvmaxsp 0, 34, 35
380; VSX-NEXT:    xxlxor 36, 36, 36
381; VSX-NEXT:    vcmpequw 5, 2, 4
382; VSX-NEXT:    xxlor 1, 2, 1
383; VSX-NEXT:    lxvd2x 2, 0, 3
384; VSX-NEXT:    xxsel 0, 0, 2, 1
385; VSX-NEXT:    xvcmpeqsp 2, 0, 36
386; VSX-NEXT:    xxsel 1, 0, 34, 37
387; VSX-NEXT:    vcmpequw 2, 3, 4
388; VSX-NEXT:    xxsel 1, 1, 35, 34
389; VSX-NEXT:    xxsel 34, 0, 1, 2
390; VSX-NEXT:    blr
391;
392; AIX-LABEL: v4f32_maximum:
393; AIX:       # %bb.0: # %entry
394; AIX-NEXT:    xvcmpeqsp 1, 35, 35
395; AIX-NEXT:    xvcmpeqsp 2, 34, 34
396; AIX-NEXT:    ld 3, L..C5(2) # %const.0
397; AIX-NEXT:    xvmaxsp 0, 34, 35
398; AIX-NEXT:    xxlxor 36, 36, 36
399; AIX-NEXT:    xxlnor 1, 1, 1
400; AIX-NEXT:    xxlnor 2, 2, 2
401; AIX-NEXT:    vcmpequw 5, 2, 4
402; AIX-NEXT:    xxlor 1, 2, 1
403; AIX-NEXT:    lxvw4x 2, 0, 3
404; AIX-NEXT:    xxsel 0, 0, 2, 1
405; AIX-NEXT:    xvcmpeqsp 2, 0, 36
406; AIX-NEXT:    xxsel 1, 0, 34, 37
407; AIX-NEXT:    vcmpequw 2, 3, 4
408; AIX-NEXT:    xxsel 1, 1, 35, 34
409; AIX-NEXT:    xxsel 34, 0, 1, 2
410; AIX-NEXT:    blr
411entry:
412  %m = call <4 x float> @llvm.maximum.v4f32(<4 x float> %a, <4 x float> %b)
413  ret <4 x float> %m
414}
415
416define <2 x double> @v2f64_minimum(<2 x double> %a, <2 x double> %b) {
417; NOVSX-LABEL: v2f64_minimum:
418; NOVSX:       # %bb.0: # %entry
419; NOVSX-NEXT:    fcmpu 0, 1, 3
420; NOVSX-NEXT:    fmr 6, 1
421; NOVSX-NEXT:    stfd 4, -16(1)
422; NOVSX-NEXT:    stfd 2, -8(1)
423; NOVSX-NEXT:    stfd 3, -32(1)
424; NOVSX-NEXT:    stfd 1, -24(1)
425; NOVSX-NEXT:    bc 12, 0, .LBB6_2
426; NOVSX-NEXT:  # %bb.1: # %entry
427; NOVSX-NEXT:    fmr 6, 3
428; NOVSX-NEXT:  .LBB6_2: # %entry
429; NOVSX-NEXT:    addis 3, 2, .LCPI6_0@toc@ha
430; NOVSX-NEXT:    ld 4, -24(1)
431; NOVSX-NEXT:    lfs 0, .LCPI6_0@toc@l(3)
432; NOVSX-NEXT:    fmr 5, 0
433; NOVSX-NEXT:    bc 12, 3, .LBB6_4
434; NOVSX-NEXT:  # %bb.3: # %entry
435; NOVSX-NEXT:    fmr 5, 6
436; NOVSX-NEXT:  .LBB6_4: # %entry
437; NOVSX-NEXT:    li 3, 1
438; NOVSX-NEXT:    ld 5, -32(1)
439; NOVSX-NEXT:    rldic 3, 3, 63, 0
440; NOVSX-NEXT:    cmpd 4, 3
441; NOVSX-NEXT:    bc 12, 2, .LBB6_6
442; NOVSX-NEXT:  # %bb.5: # %entry
443; NOVSX-NEXT:    fmr 1, 5
444; NOVSX-NEXT:  .LBB6_6: # %entry
445; NOVSX-NEXT:    cmpd 5, 3
446; NOVSX-NEXT:    bc 12, 2, .LBB6_8
447; NOVSX-NEXT:  # %bb.7: # %entry
448; NOVSX-NEXT:    fmr 3, 1
449; NOVSX-NEXT:  .LBB6_8: # %entry
450; NOVSX-NEXT:    addis 4, 2, .LCPI6_1@toc@ha
451; NOVSX-NEXT:    lfs 1, .LCPI6_1@toc@l(4)
452; NOVSX-NEXT:    fcmpu 0, 5, 1
453; NOVSX-NEXT:    bc 12, 2, .LBB6_10
454; NOVSX-NEXT:  # %bb.9: # %entry
455; NOVSX-NEXT:    fmr 3, 5
456; NOVSX-NEXT:  .LBB6_10: # %entry
457; NOVSX-NEXT:    fcmpu 0, 2, 4
458; NOVSX-NEXT:    fmr 5, 2
459; NOVSX-NEXT:    bc 12, 0, .LBB6_12
460; NOVSX-NEXT:  # %bb.11: # %entry
461; NOVSX-NEXT:    fmr 5, 4
462; NOVSX-NEXT:  .LBB6_12: # %entry
463; NOVSX-NEXT:    ld 5, -8(1)
464; NOVSX-NEXT:    bc 12, 3, .LBB6_14
465; NOVSX-NEXT:  # %bb.13: # %entry
466; NOVSX-NEXT:    fmr 0, 5
467; NOVSX-NEXT:  .LBB6_14: # %entry
468; NOVSX-NEXT:    cmpd 5, 3
469; NOVSX-NEXT:    ld 4, -16(1)
470; NOVSX-NEXT:    bc 4, 2, .LBB6_19
471; NOVSX-NEXT:  # %bb.15: # %entry
472; NOVSX-NEXT:    cmpd 4, 3
473; NOVSX-NEXT:    bc 4, 2, .LBB6_20
474; NOVSX-NEXT:  .LBB6_16: # %entry
475; NOVSX-NEXT:    fcmpu 0, 0, 1
476; NOVSX-NEXT:    bc 12, 2, .LBB6_18
477; NOVSX-NEXT:  .LBB6_17: # %entry
478; NOVSX-NEXT:    fmr 4, 0
479; NOVSX-NEXT:  .LBB6_18: # %entry
480; NOVSX-NEXT:    fmr 1, 3
481; NOVSX-NEXT:    fmr 2, 4
482; NOVSX-NEXT:    blr
483; NOVSX-NEXT:  .LBB6_19: # %entry
484; NOVSX-NEXT:    fmr 2, 0
485; NOVSX-NEXT:    cmpd 4, 3
486; NOVSX-NEXT:    bc 12, 2, .LBB6_16
487; NOVSX-NEXT:  .LBB6_20: # %entry
488; NOVSX-NEXT:    fmr 4, 2
489; NOVSX-NEXT:    fcmpu 0, 0, 1
490; NOVSX-NEXT:    bc 4, 2, .LBB6_17
491; NOVSX-NEXT:    b .LBB6_18
492;
493; VSX-LABEL: v2f64_minimum:
494; VSX:       # %bb.0: # %entry
495; VSX-NEXT:    addis 3, 2, .LCPI6_0@toc@ha
496; VSX-NEXT:    xvcmpeqdp 36, 35, 35
497; VSX-NEXT:    xvcmpeqdp 37, 34, 34
498; VSX-NEXT:    addi 3, 3, .LCPI6_0@toc@l
499; VSX-NEXT:    xxlnor 36, 36, 36
500; VSX-NEXT:    xxlnor 37, 37, 37
501; VSX-NEXT:    xvmindp 0, 34, 35
502; VSX-NEXT:    lxvd2x 2, 0, 3
503; VSX-NEXT:    addis 3, 2, .LCPI6_1@toc@ha
504; VSX-NEXT:    xxlor 1, 37, 36
505; VSX-NEXT:    addi 3, 3, .LCPI6_1@toc@l
506; VSX-NEXT:    lxvd2x 36, 0, 3
507; VSX-NEXT:    vcmpequd 5, 2, 4
508; VSX-NEXT:    xxsel 0, 0, 2, 1
509; VSX-NEXT:    xxlxor 2, 2, 2
510; VSX-NEXT:    xxsel 1, 0, 34, 37
511; VSX-NEXT:    vcmpequd 2, 3, 4
512; VSX-NEXT:    xxsel 1, 1, 35, 34
513; VSX-NEXT:    xvcmpeqdp 34, 0, 2
514; VSX-NEXT:    xxsel 34, 0, 1, 34
515; VSX-NEXT:    blr
516;
517; AIX-LABEL: v2f64_minimum:
518; AIX:       # %bb.0: # %entry
519; AIX-NEXT:    ld 3, L..C6(2) # %const.0
520; AIX-NEXT:    xvcmpeqdp 36, 35, 35
521; AIX-NEXT:    xvcmpeqdp 37, 34, 34
522; AIX-NEXT:    lxvd2x 2, 0, 3
523; AIX-NEXT:    ld 3, L..C7(2) # %const.1
524; AIX-NEXT:    xxlnor 36, 36, 36
525; AIX-NEXT:    xxlnor 37, 37, 37
526; AIX-NEXT:    xvmindp 0, 34, 35
527; AIX-NEXT:    xxlor 1, 37, 36
528; AIX-NEXT:    lxvd2x 36, 0, 3
529; AIX-NEXT:    vcmpequd 5, 2, 4
530; AIX-NEXT:    xxsel 0, 0, 2, 1
531; AIX-NEXT:    xxlxor 2, 2, 2
532; AIX-NEXT:    xxsel 1, 0, 34, 37
533; AIX-NEXT:    vcmpequd 2, 3, 4
534; AIX-NEXT:    xxsel 1, 1, 35, 34
535; AIX-NEXT:    xvcmpeqdp 34, 0, 2
536; AIX-NEXT:    xxsel 34, 0, 1, 34
537; AIX-NEXT:    blr
538entry:
539  %m = call <2 x double> @llvm.minimum.v2f64(<2 x double> %a, <2 x double> %b)
540  ret <2 x double> %m
541}
542
543define <2 x double> @v2f64_maximum(<2 x double> %a, <2 x double> %b) {
544; NOVSX-LABEL: v2f64_maximum:
545; NOVSX:       # %bb.0: # %entry
546; NOVSX-NEXT:    fcmpu 0, 1, 3
547; NOVSX-NEXT:    fmr 6, 1
548; NOVSX-NEXT:    stfd 4, -16(1)
549; NOVSX-NEXT:    stfd 2, -8(1)
550; NOVSX-NEXT:    stfd 3, -32(1)
551; NOVSX-NEXT:    stfd 1, -24(1)
552; NOVSX-NEXT:    bc 12, 1, .LBB7_2
553; NOVSX-NEXT:  # %bb.1: # %entry
554; NOVSX-NEXT:    fmr 6, 3
555; NOVSX-NEXT:  .LBB7_2: # %entry
556; NOVSX-NEXT:    addis 4, 2, .LCPI7_0@toc@ha
557; NOVSX-NEXT:    ld 3, -24(1)
558; NOVSX-NEXT:    lfs 0, .LCPI7_0@toc@l(4)
559; NOVSX-NEXT:    fmr 5, 0
560; NOVSX-NEXT:    bc 12, 3, .LBB7_4
561; NOVSX-NEXT:  # %bb.3: # %entry
562; NOVSX-NEXT:    fmr 5, 6
563; NOVSX-NEXT:  .LBB7_4: # %entry
564; NOVSX-NEXT:    cmpdi 3, 0
565; NOVSX-NEXT:    ld 4, -32(1)
566; NOVSX-NEXT:    bc 12, 2, .LBB7_6
567; NOVSX-NEXT:  # %bb.5: # %entry
568; NOVSX-NEXT:    fmr 1, 5
569; NOVSX-NEXT:  .LBB7_6: # %entry
570; NOVSX-NEXT:    cmpdi 4, 0
571; NOVSX-NEXT:    bc 12, 2, .LBB7_8
572; NOVSX-NEXT:  # %bb.7: # %entry
573; NOVSX-NEXT:    fmr 3, 1
574; NOVSX-NEXT:  .LBB7_8: # %entry
575; NOVSX-NEXT:    addis 3, 2, .LCPI7_1@toc@ha
576; NOVSX-NEXT:    lfs 1, .LCPI7_1@toc@l(3)
577; NOVSX-NEXT:    fcmpu 0, 5, 1
578; NOVSX-NEXT:    bc 12, 2, .LBB7_10
579; NOVSX-NEXT:  # %bb.9: # %entry
580; NOVSX-NEXT:    fmr 3, 5
581; NOVSX-NEXT:  .LBB7_10: # %entry
582; NOVSX-NEXT:    fcmpu 0, 2, 4
583; NOVSX-NEXT:    fmr 5, 2
584; NOVSX-NEXT:    bc 12, 1, .LBB7_12
585; NOVSX-NEXT:  # %bb.11: # %entry
586; NOVSX-NEXT:    fmr 5, 4
587; NOVSX-NEXT:  .LBB7_12: # %entry
588; NOVSX-NEXT:    ld 4, -8(1)
589; NOVSX-NEXT:    bc 12, 3, .LBB7_14
590; NOVSX-NEXT:  # %bb.13: # %entry
591; NOVSX-NEXT:    fmr 0, 5
592; NOVSX-NEXT:  .LBB7_14: # %entry
593; NOVSX-NEXT:    cmpdi 4, 0
594; NOVSX-NEXT:    ld 3, -16(1)
595; NOVSX-NEXT:    bc 4, 2, .LBB7_19
596; NOVSX-NEXT:  # %bb.15: # %entry
597; NOVSX-NEXT:    cmpdi 3, 0
598; NOVSX-NEXT:    bc 4, 2, .LBB7_20
599; NOVSX-NEXT:  .LBB7_16: # %entry
600; NOVSX-NEXT:    fcmpu 0, 0, 1
601; NOVSX-NEXT:    bc 12, 2, .LBB7_18
602; NOVSX-NEXT:  .LBB7_17: # %entry
603; NOVSX-NEXT:    fmr 4, 0
604; NOVSX-NEXT:  .LBB7_18: # %entry
605; NOVSX-NEXT:    fmr 1, 3
606; NOVSX-NEXT:    fmr 2, 4
607; NOVSX-NEXT:    blr
608; NOVSX-NEXT:  .LBB7_19: # %entry
609; NOVSX-NEXT:    fmr 2, 0
610; NOVSX-NEXT:    cmpdi 3, 0
611; NOVSX-NEXT:    bc 12, 2, .LBB7_16
612; NOVSX-NEXT:  .LBB7_20: # %entry
613; NOVSX-NEXT:    fmr 4, 2
614; NOVSX-NEXT:    fcmpu 0, 0, 1
615; NOVSX-NEXT:    bc 4, 2, .LBB7_17
616; NOVSX-NEXT:    b .LBB7_18
617;
618; VSX-LABEL: v2f64_maximum:
619; VSX:       # %bb.0: # %entry
620; VSX-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
621; VSX-NEXT:    xvcmpeqdp 36, 35, 35
622; VSX-NEXT:    xvcmpeqdp 37, 34, 34
623; VSX-NEXT:    addi 3, 3, .LCPI7_0@toc@l
624; VSX-NEXT:    xxlnor 36, 36, 36
625; VSX-NEXT:    xxlnor 37, 37, 37
626; VSX-NEXT:    xvmaxdp 0, 34, 35
627; VSX-NEXT:    lxvd2x 2, 0, 3
628; VSX-NEXT:    xxlor 1, 37, 36
629; VSX-NEXT:    xxlxor 36, 36, 36
630; VSX-NEXT:    vcmpequd 5, 2, 4
631; VSX-NEXT:    xxsel 0, 0, 2, 1
632; VSX-NEXT:    xxsel 1, 0, 34, 37
633; VSX-NEXT:    vcmpequd 2, 3, 4
634; VSX-NEXT:    xxsel 1, 1, 35, 34
635; VSX-NEXT:    xvcmpeqdp 34, 0, 36
636; VSX-NEXT:    xxsel 34, 0, 1, 34
637; VSX-NEXT:    blr
638;
639; AIX-LABEL: v2f64_maximum:
640; AIX:       # %bb.0: # %entry
641; AIX-NEXT:    ld 3, L..C8(2) # %const.0
642; AIX-NEXT:    xvcmpeqdp 36, 35, 35
643; AIX-NEXT:    xvcmpeqdp 37, 34, 34
644; AIX-NEXT:    lxvd2x 2, 0, 3
645; AIX-NEXT:    xxlnor 36, 36, 36
646; AIX-NEXT:    xxlnor 37, 37, 37
647; AIX-NEXT:    xvmaxdp 0, 34, 35
648; AIX-NEXT:    xxlor 1, 37, 36
649; AIX-NEXT:    xxlxor 36, 36, 36
650; AIX-NEXT:    vcmpequd 5, 2, 4
651; AIX-NEXT:    xxsel 0, 0, 2, 1
652; AIX-NEXT:    xxsel 1, 0, 34, 37
653; AIX-NEXT:    vcmpequd 2, 3, 4
654; AIX-NEXT:    xxsel 1, 1, 35, 34
655; AIX-NEXT:    xvcmpeqdp 34, 0, 36
656; AIX-NEXT:    xxsel 34, 0, 1, 34
657; AIX-NEXT:    blr
658entry:
659  %m = call <2 x double> @llvm.maximum.v2f64(<2 x double> %a, <2 x double> %b)
660  ret <2 x double> %m
661}
662
663declare float @llvm.maximum.f32(float, float)
664declare double @llvm.maximum.f64(double, double)
665declare <4 x float> @llvm.maximum.v4f32(<4 x float>, <4 x float>)
666declare <2 x double> @llvm.maximum.v2f64(<2 x double>, <2 x double>)
667
668declare float @llvm.minimum.f32(float, float)
669declare double @llvm.minimum.f64(double, double)
670declare <4 x float> @llvm.minimum.v4f32(<4 x float>, <4 x float>)
671declare <2 x double> @llvm.minimum.v2f64(<2 x double>, <2 x double>)
672