xref: /llvm-project/llvm/test/CodeGen/PowerPC/f128-compare.ll (revision b922a3621116b404d868af8b74cab25ab78555be)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
3; RUN:   -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s
4; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
5; RUN:   -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s \
6; RUN:   -check-prefix=CHECK-P8
7
8@a_qp = common dso_local global fp128 0xL00000000000000000000000000000000, align 16
9@b_qp = common dso_local global fp128 0xL00000000000000000000000000000000, align 16
10
11; Function Attrs: noinline nounwind optnone
12define dso_local signext i32 @greater_qp() {
13; CHECK-LABEL: greater_qp:
14; CHECK:       # %bb.0: # %entry
15; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
16; CHECK-NEXT:    li r4, 1
17; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
18; CHECK-NEXT:    lxv v2, 0(r3)
19; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
20; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
21; CHECK-NEXT:    lxv v3, 0(r3)
22; CHECK-NEXT:    li r3, 0
23; CHECK-NEXT:    xscmpuqp cr0, v2, v3
24; CHECK-NEXT:    iselgt r3, r4, r3
25; CHECK-NEXT:    blr
26;
27; CHECK-P8-LABEL: greater_qp:
28; CHECK-P8:       # %bb.0: # %entry
29; CHECK-P8-NEXT:    mflr r0
30; CHECK-P8-NEXT:    stdu r1, -32(r1)
31; CHECK-P8-NEXT:    std r0, 48(r1)
32; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
33; CHECK-P8-NEXT:    .cfi_offset lr, 16
34; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
35; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
36; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
37; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
38; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
39; CHECK-P8-NEXT:    xxswapd v2, vs0
40; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
41; CHECK-P8-NEXT:    xxswapd v3, vs0
42; CHECK-P8-NEXT:    bl __gtkf2
43; CHECK-P8-NEXT:    nop
44; CHECK-P8-NEXT:    extsw r3, r3
45; CHECK-P8-NEXT:    neg r3, r3
46; CHECK-P8-NEXT:    rldicl r3, r3, 1, 63
47; CHECK-P8-NEXT:    addi r1, r1, 32
48; CHECK-P8-NEXT:    ld r0, 16(r1)
49; CHECK-P8-NEXT:    mtlr r0
50; CHECK-P8-NEXT:    blr
51entry:
52  %0 = load fp128, ptr @a_qp, align 16
53  %1 = load fp128, ptr @b_qp, align 16
54  %cmp = fcmp ogt fp128 %0, %1
55  %conv = zext i1 %cmp to i32
56  ret i32 %conv
57}
58
59; Function Attrs: noinline nounwind optnone
60define dso_local signext i32 @less_qp() {
61; CHECK-LABEL: less_qp:
62; CHECK:       # %bb.0: # %entry
63; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
64; CHECK-NEXT:    li r4, 1
65; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
66; CHECK-NEXT:    lxv v2, 0(r3)
67; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
68; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
69; CHECK-NEXT:    lxv v3, 0(r3)
70; CHECK-NEXT:    li r3, 0
71; CHECK-NEXT:    xscmpuqp cr0, v2, v3
72; CHECK-NEXT:    isellt r3, r4, r3
73; CHECK-NEXT:    blr
74;
75; CHECK-P8-LABEL: less_qp:
76; CHECK-P8:       # %bb.0: # %entry
77; CHECK-P8-NEXT:    mflr r0
78; CHECK-P8-NEXT:    stdu r1, -32(r1)
79; CHECK-P8-NEXT:    std r0, 48(r1)
80; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
81; CHECK-P8-NEXT:    .cfi_offset lr, 16
82; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
83; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
84; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
85; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
86; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
87; CHECK-P8-NEXT:    xxswapd v2, vs0
88; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
89; CHECK-P8-NEXT:    xxswapd v3, vs0
90; CHECK-P8-NEXT:    bl __ltkf2
91; CHECK-P8-NEXT:    nop
92; CHECK-P8-NEXT:    rlwinm r3, r3, 1, 31, 31
93; CHECK-P8-NEXT:    addi r1, r1, 32
94; CHECK-P8-NEXT:    ld r0, 16(r1)
95; CHECK-P8-NEXT:    mtlr r0
96; CHECK-P8-NEXT:    blr
97entry:
98  %0 = load fp128, ptr @a_qp, align 16
99  %1 = load fp128, ptr @b_qp, align 16
100  %cmp = fcmp olt fp128 %0, %1
101  %conv = zext i1 %cmp to i32
102  ret i32 %conv
103}
104
105; Function Attrs: noinline nounwind optnone
106define dso_local signext i32 @greater_eq_qp() {
107; CHECK-LABEL: greater_eq_qp:
108; CHECK:       # %bb.0: # %entry
109; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
110; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
111; CHECK-NEXT:    lxv v2, 0(r3)
112; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
113; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
114; CHECK-NEXT:    lxv v3, 0(r3)
115; CHECK-NEXT:    li r3, 1
116; CHECK-NEXT:    xscmpuqp cr0, v2, v3
117; CHECK-NEXT:    cror 4*cr5+lt, un, lt
118; CHECK-NEXT:    isel r3, 0, r3, 4*cr5+lt
119; CHECK-NEXT:    blr
120;
121; CHECK-P8-LABEL: greater_eq_qp:
122; CHECK-P8:       # %bb.0: # %entry
123; CHECK-P8-NEXT:    mflr r0
124; CHECK-P8-NEXT:    stdu r1, -32(r1)
125; CHECK-P8-NEXT:    std r0, 48(r1)
126; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
127; CHECK-P8-NEXT:    .cfi_offset lr, 16
128; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
129; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
130; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
131; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
132; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
133; CHECK-P8-NEXT:    xxswapd v2, vs0
134; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
135; CHECK-P8-NEXT:    xxswapd v3, vs0
136; CHECK-P8-NEXT:    bl __gekf2
137; CHECK-P8-NEXT:    nop
138; CHECK-P8-NEXT:    rlwinm r3, r3, 1, 31, 31
139; CHECK-P8-NEXT:    xori r3, r3, 1
140; CHECK-P8-NEXT:    addi r1, r1, 32
141; CHECK-P8-NEXT:    ld r0, 16(r1)
142; CHECK-P8-NEXT:    mtlr r0
143; CHECK-P8-NEXT:    blr
144entry:
145  %0 = load fp128, ptr @a_qp, align 16
146  %1 = load fp128, ptr @b_qp, align 16
147  %cmp = fcmp oge fp128 %0, %1
148  %conv = zext i1 %cmp to i32
149  ret i32 %conv
150}
151
152; Function Attrs: noinline nounwind optnone
153define dso_local signext i32 @less_eq_qp() {
154; CHECK-LABEL: less_eq_qp:
155; CHECK:       # %bb.0: # %entry
156; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
157; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
158; CHECK-NEXT:    lxv v2, 0(r3)
159; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
160; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
161; CHECK-NEXT:    lxv v3, 0(r3)
162; CHECK-NEXT:    li r3, 1
163; CHECK-NEXT:    xscmpuqp cr0, v2, v3
164; CHECK-NEXT:    cror 4*cr5+lt, un, gt
165; CHECK-NEXT:    isel r3, 0, r3, 4*cr5+lt
166; CHECK-NEXT:    blr
167;
168; CHECK-P8-LABEL: less_eq_qp:
169; CHECK-P8:       # %bb.0: # %entry
170; CHECK-P8-NEXT:    mflr r0
171; CHECK-P8-NEXT:    stdu r1, -32(r1)
172; CHECK-P8-NEXT:    std r0, 48(r1)
173; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
174; CHECK-P8-NEXT:    .cfi_offset lr, 16
175; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
176; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
177; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
178; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
179; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
180; CHECK-P8-NEXT:    xxswapd v2, vs0
181; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
182; CHECK-P8-NEXT:    xxswapd v3, vs0
183; CHECK-P8-NEXT:    bl __lekf2
184; CHECK-P8-NEXT:    nop
185; CHECK-P8-NEXT:    extsw r3, r3
186; CHECK-P8-NEXT:    neg r3, r3
187; CHECK-P8-NEXT:    rldicl r3, r3, 1, 63
188; CHECK-P8-NEXT:    xori r3, r3, 1
189; CHECK-P8-NEXT:    addi r1, r1, 32
190; CHECK-P8-NEXT:    ld r0, 16(r1)
191; CHECK-P8-NEXT:    mtlr r0
192; CHECK-P8-NEXT:    blr
193entry:
194  %0 = load fp128, ptr @a_qp, align 16
195  %1 = load fp128, ptr @b_qp, align 16
196  %cmp = fcmp ole fp128 %0, %1
197  %conv = zext i1 %cmp to i32
198  ret i32 %conv
199}
200
201; Function Attrs: noinline nounwind optnone
202define dso_local signext i32 @equal_qp() {
203; CHECK-LABEL: equal_qp:
204; CHECK:       # %bb.0: # %entry
205; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
206; CHECK-NEXT:    li r4, 1
207; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
208; CHECK-NEXT:    lxv v2, 0(r3)
209; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
210; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
211; CHECK-NEXT:    lxv v3, 0(r3)
212; CHECK-NEXT:    li r3, 0
213; CHECK-NEXT:    xscmpuqp cr0, v2, v3
214; CHECK-NEXT:    iseleq r3, r4, r3
215; CHECK-NEXT:    blr
216;
217; CHECK-P8-LABEL: equal_qp:
218; CHECK-P8:       # %bb.0: # %entry
219; CHECK-P8-NEXT:    mflr r0
220; CHECK-P8-NEXT:    stdu r1, -32(r1)
221; CHECK-P8-NEXT:    std r0, 48(r1)
222; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
223; CHECK-P8-NEXT:    .cfi_offset lr, 16
224; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
225; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
226; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
227; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
228; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
229; CHECK-P8-NEXT:    xxswapd v2, vs0
230; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
231; CHECK-P8-NEXT:    xxswapd v3, vs0
232; CHECK-P8-NEXT:    bl __eqkf2
233; CHECK-P8-NEXT:    nop
234; CHECK-P8-NEXT:    cntlzw r3, r3
235; CHECK-P8-NEXT:    srwi r3, r3, 5
236; CHECK-P8-NEXT:    addi r1, r1, 32
237; CHECK-P8-NEXT:    ld r0, 16(r1)
238; CHECK-P8-NEXT:    mtlr r0
239; CHECK-P8-NEXT:    blr
240entry:
241  %0 = load fp128, ptr @a_qp, align 16
242  %1 = load fp128, ptr @b_qp, align 16
243  %cmp = fcmp oeq fp128 %0, %1
244  %conv = zext i1 %cmp to i32
245  ret i32 %conv
246}
247
248; Function Attrs: noinline nounwind optnone
249define dso_local signext i32 @not_greater_qp() {
250; CHECK-LABEL: not_greater_qp:
251; CHECK:       # %bb.0: # %entry
252; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
253; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
254; CHECK-NEXT:    lxv v2, 0(r3)
255; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
256; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
257; CHECK-NEXT:    lxv v3, 0(r3)
258; CHECK-NEXT:    li r3, 1
259; CHECK-NEXT:    xscmpuqp cr0, v2, v3
260; CHECK-NEXT:    iselgt r3, 0, r3
261; CHECK-NEXT:    blr
262;
263; CHECK-P8-LABEL: not_greater_qp:
264; CHECK-P8:       # %bb.0: # %entry
265; CHECK-P8-NEXT:    mflr r0
266; CHECK-P8-NEXT:    stdu r1, -32(r1)
267; CHECK-P8-NEXT:    std r0, 48(r1)
268; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
269; CHECK-P8-NEXT:    .cfi_offset lr, 16
270; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
271; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
272; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
273; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
274; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
275; CHECK-P8-NEXT:    xxswapd v2, vs0
276; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
277; CHECK-P8-NEXT:    xxswapd v3, vs0
278; CHECK-P8-NEXT:    bl __gtkf2
279; CHECK-P8-NEXT:    nop
280; CHECK-P8-NEXT:    extsw r3, r3
281; CHECK-P8-NEXT:    neg r3, r3
282; CHECK-P8-NEXT:    rldicl r3, r3, 1, 63
283; CHECK-P8-NEXT:    xori r3, r3, 1
284; CHECK-P8-NEXT:    addi r1, r1, 32
285; CHECK-P8-NEXT:    ld r0, 16(r1)
286; CHECK-P8-NEXT:    mtlr r0
287; CHECK-P8-NEXT:    blr
288entry:
289  %0 = load fp128, ptr @a_qp, align 16
290  %1 = load fp128, ptr @b_qp, align 16
291  %cmp = fcmp ogt fp128 %0, %1
292  %lnot = xor i1 %cmp, true
293  %lnot.ext = zext i1 %lnot to i32
294  ret i32 %lnot.ext
295}
296
297; Function Attrs: noinline nounwind optnone
298define dso_local signext i32 @not_less_qp() {
299; CHECK-LABEL: not_less_qp:
300; CHECK:       # %bb.0: # %entry
301; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
302; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
303; CHECK-NEXT:    lxv v2, 0(r3)
304; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
305; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
306; CHECK-NEXT:    lxv v3, 0(r3)
307; CHECK-NEXT:    li r3, 1
308; CHECK-NEXT:    xscmpuqp cr0, v2, v3
309; CHECK-NEXT:    isellt r3, 0, r3
310; CHECK-NEXT:    blr
311;
312; CHECK-P8-LABEL: not_less_qp:
313; CHECK-P8:       # %bb.0: # %entry
314; CHECK-P8-NEXT:    mflr r0
315; CHECK-P8-NEXT:    stdu r1, -32(r1)
316; CHECK-P8-NEXT:    std r0, 48(r1)
317; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
318; CHECK-P8-NEXT:    .cfi_offset lr, 16
319; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
320; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
321; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
322; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
323; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
324; CHECK-P8-NEXT:    xxswapd v2, vs0
325; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
326; CHECK-P8-NEXT:    xxswapd v3, vs0
327; CHECK-P8-NEXT:    bl __ltkf2
328; CHECK-P8-NEXT:    nop
329; CHECK-P8-NEXT:    rlwinm r3, r3, 1, 31, 31
330; CHECK-P8-NEXT:    xori r3, r3, 1
331; CHECK-P8-NEXT:    addi r1, r1, 32
332; CHECK-P8-NEXT:    ld r0, 16(r1)
333; CHECK-P8-NEXT:    mtlr r0
334; CHECK-P8-NEXT:    blr
335entry:
336  %0 = load fp128, ptr @a_qp, align 16
337  %1 = load fp128, ptr @b_qp, align 16
338  %cmp = fcmp olt fp128 %0, %1
339  %lnot = xor i1 %cmp, true
340  %lnot.ext = zext i1 %lnot to i32
341  ret i32 %lnot.ext
342}
343
344; Function Attrs: noinline nounwind optnone
345define dso_local signext i32 @not_greater_eq_qp() {
346; CHECK-LABEL: not_greater_eq_qp:
347; CHECK:       # %bb.0: # %entry
348; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
349; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
350; CHECK-NEXT:    lxv v2, 0(r3)
351; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
352; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
353; CHECK-NEXT:    lxv v3, 0(r3)
354; CHECK-NEXT:    li r3, 1
355; CHECK-NEXT:    xscmpuqp cr0, v2, v3
356; CHECK-NEXT:    crnor 4*cr5+lt, lt, un
357; CHECK-NEXT:    isel r3, 0, r3, 4*cr5+lt
358; CHECK-NEXT:    blr
359;
360; CHECK-P8-LABEL: not_greater_eq_qp:
361; CHECK-P8:       # %bb.0: # %entry
362; CHECK-P8-NEXT:    mflr r0
363; CHECK-P8-NEXT:    stdu r1, -32(r1)
364; CHECK-P8-NEXT:    std r0, 48(r1)
365; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
366; CHECK-P8-NEXT:    .cfi_offset lr, 16
367; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
368; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
369; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
370; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
371; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
372; CHECK-P8-NEXT:    xxswapd v2, vs0
373; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
374; CHECK-P8-NEXT:    xxswapd v3, vs0
375; CHECK-P8-NEXT:    bl __gekf2
376; CHECK-P8-NEXT:    nop
377; CHECK-P8-NEXT:    rlwinm r3, r3, 1, 31, 31
378; CHECK-P8-NEXT:    addi r1, r1, 32
379; CHECK-P8-NEXT:    ld r0, 16(r1)
380; CHECK-P8-NEXT:    mtlr r0
381; CHECK-P8-NEXT:    blr
382entry:
383  %0 = load fp128, ptr @a_qp, align 16
384  %1 = load fp128, ptr @b_qp, align 16
385  %cmp = fcmp oge fp128 %0, %1
386  %lnot = xor i1 %cmp, true
387  %lnot.ext = zext i1 %lnot to i32
388  ret i32 %lnot.ext
389}
390
391; Function Attrs: noinline nounwind optnone
392define dso_local signext i32 @not_less_eq_qp() {
393; CHECK-LABEL: not_less_eq_qp:
394; CHECK:       # %bb.0: # %entry
395; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
396; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
397; CHECK-NEXT:    lxv v2, 0(r3)
398; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
399; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
400; CHECK-NEXT:    lxv v3, 0(r3)
401; CHECK-NEXT:    li r3, 1
402; CHECK-NEXT:    xscmpuqp cr0, v2, v3
403; CHECK-NEXT:    crnor 4*cr5+lt, gt, un
404; CHECK-NEXT:    isel r3, 0, r3, 4*cr5+lt
405; CHECK-NEXT:    blr
406;
407; CHECK-P8-LABEL: not_less_eq_qp:
408; CHECK-P8:       # %bb.0: # %entry
409; CHECK-P8-NEXT:    mflr r0
410; CHECK-P8-NEXT:    stdu r1, -32(r1)
411; CHECK-P8-NEXT:    std r0, 48(r1)
412; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
413; CHECK-P8-NEXT:    .cfi_offset lr, 16
414; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
415; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
416; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
417; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
418; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
419; CHECK-P8-NEXT:    xxswapd v2, vs0
420; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
421; CHECK-P8-NEXT:    xxswapd v3, vs0
422; CHECK-P8-NEXT:    bl __lekf2
423; CHECK-P8-NEXT:    nop
424; CHECK-P8-NEXT:    extsw r3, r3
425; CHECK-P8-NEXT:    neg r3, r3
426; CHECK-P8-NEXT:    rldicl r3, r3, 1, 63
427; CHECK-P8-NEXT:    addi r1, r1, 32
428; CHECK-P8-NEXT:    ld r0, 16(r1)
429; CHECK-P8-NEXT:    mtlr r0
430; CHECK-P8-NEXT:    blr
431entry:
432  %0 = load fp128, ptr @a_qp, align 16
433  %1 = load fp128, ptr @b_qp, align 16
434  %cmp = fcmp ole fp128 %0, %1
435  %lnot = xor i1 %cmp, true
436  %lnot.ext = zext i1 %lnot to i32
437  ret i32 %lnot.ext
438}
439
440; Function Attrs: noinline nounwind optnone
441define dso_local signext i32 @not_equal_qp() {
442; CHECK-LABEL: not_equal_qp:
443; CHECK:       # %bb.0: # %entry
444; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
445; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
446; CHECK-NEXT:    lxv v2, 0(r3)
447; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
448; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
449; CHECK-NEXT:    lxv v3, 0(r3)
450; CHECK-NEXT:    li r3, 1
451; CHECK-NEXT:    xscmpuqp cr0, v2, v3
452; CHECK-NEXT:    iseleq r3, 0, r3
453; CHECK-NEXT:    blr
454;
455; CHECK-P8-LABEL: not_equal_qp:
456; CHECK-P8:       # %bb.0: # %entry
457; CHECK-P8-NEXT:    mflr r0
458; CHECK-P8-NEXT:    stdu r1, -32(r1)
459; CHECK-P8-NEXT:    std r0, 48(r1)
460; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
461; CHECK-P8-NEXT:    .cfi_offset lr, 16
462; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
463; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
464; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
465; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
466; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
467; CHECK-P8-NEXT:    xxswapd v2, vs0
468; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
469; CHECK-P8-NEXT:    xxswapd v3, vs0
470; CHECK-P8-NEXT:    bl __nekf2
471; CHECK-P8-NEXT:    nop
472; CHECK-P8-NEXT:    cntlzw r3, r3
473; CHECK-P8-NEXT:    srwi r3, r3, 5
474; CHECK-P8-NEXT:    xori r3, r3, 1
475; CHECK-P8-NEXT:    addi r1, r1, 32
476; CHECK-P8-NEXT:    ld r0, 16(r1)
477; CHECK-P8-NEXT:    mtlr r0
478; CHECK-P8-NEXT:    blr
479entry:
480  %0 = load fp128, ptr @a_qp, align 16
481  %1 = load fp128, ptr @b_qp, align 16
482  %cmp = fcmp une fp128 %0, %1
483  %conv = zext i1 %cmp to i32
484  ret i32 %conv
485}
486
487; Function Attrs: norecurse nounwind readonly
488define fp128 @greater_sel_qp() {
489; CHECK-LABEL: greater_sel_qp:
490; CHECK:       # %bb.0: # %entry
491; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
492; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
493; CHECK-NEXT:    lxv v2, 0(r3)
494; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
495; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
496; CHECK-NEXT:    lxv v3, 0(r3)
497; CHECK-NEXT:    xscmpuqp cr0, v2, v3
498; CHECK-NEXT:    bgtlr cr0
499; CHECK-NEXT:  # %bb.1: # %entry
500; CHECK-NEXT:    vmr v2, v3
501; CHECK-NEXT:    blr
502;
503; CHECK-P8-LABEL: greater_sel_qp:
504; CHECK-P8:       # %bb.0: # %entry
505; CHECK-P8-NEXT:    mflr r0
506; CHECK-P8-NEXT:    stdu r1, -80(r1)
507; CHECK-P8-NEXT:    std r0, 96(r1)
508; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
509; CHECK-P8-NEXT:    .cfi_offset lr, 16
510; CHECK-P8-NEXT:    .cfi_offset v30, -32
511; CHECK-P8-NEXT:    .cfi_offset v31, -16
512; CHECK-P8-NEXT:    li r3, 48
513; CHECK-P8-NEXT:    stvx v30, r1, r3 # 16-byte Folded Spill
514; CHECK-P8-NEXT:    li r3, 64
515; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
516; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
517; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
518; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
519; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
520; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
521; CHECK-P8-NEXT:    xxswapd v31, vs0
522; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
523; CHECK-P8-NEXT:    vmr v2, v31
524; CHECK-P8-NEXT:    xxswapd v30, vs0
525; CHECK-P8-NEXT:    vmr v3, v30
526; CHECK-P8-NEXT:    bl __gtkf2
527; CHECK-P8-NEXT:    nop
528; CHECK-P8-NEXT:    cmpwi r3, 0
529; CHECK-P8-NEXT:    bgt cr0, .LBB10_2
530; CHECK-P8-NEXT:  # %bb.1: # %entry
531; CHECK-P8-NEXT:    vmr v31, v30
532; CHECK-P8-NEXT:  .LBB10_2: # %entry
533; CHECK-P8-NEXT:    li r3, 64
534; CHECK-P8-NEXT:    vmr v2, v31
535; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
536; CHECK-P8-NEXT:    li r3, 48
537; CHECK-P8-NEXT:    lvx v30, r1, r3 # 16-byte Folded Reload
538; CHECK-P8-NEXT:    addi r1, r1, 80
539; CHECK-P8-NEXT:    ld r0, 16(r1)
540; CHECK-P8-NEXT:    mtlr r0
541; CHECK-P8-NEXT:    blr
542entry:
543  %0 = load fp128, ptr @a_qp, align 16
544  %1 = load fp128, ptr @b_qp, align 16
545  %cmp = fcmp ogt fp128 %0, %1
546  %cond = select i1 %cmp, fp128 %0, fp128 %1
547  ret fp128 %cond
548}
549
550; Function Attrs: noinline nounwind optnone
551define fp128 @less_sel_qp() {
552; CHECK-LABEL: less_sel_qp:
553; CHECK:       # %bb.0: # %entry
554; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
555; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
556; CHECK-NEXT:    lxv v2, 0(r3)
557; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
558; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
559; CHECK-NEXT:    lxv v3, 0(r3)
560; CHECK-NEXT:    xscmpuqp cr0, v2, v3
561; CHECK-NEXT:    bltlr cr0
562; CHECK-NEXT:  # %bb.1: # %entry
563; CHECK-NEXT:    vmr v2, v3
564; CHECK-NEXT:    blr
565;
566; CHECK-P8-LABEL: less_sel_qp:
567; CHECK-P8:       # %bb.0: # %entry
568; CHECK-P8-NEXT:    mflr r0
569; CHECK-P8-NEXT:    stdu r1, -80(r1)
570; CHECK-P8-NEXT:    std r0, 96(r1)
571; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
572; CHECK-P8-NEXT:    .cfi_offset lr, 16
573; CHECK-P8-NEXT:    .cfi_offset v30, -32
574; CHECK-P8-NEXT:    .cfi_offset v31, -16
575; CHECK-P8-NEXT:    li r3, 48
576; CHECK-P8-NEXT:    stvx v30, r1, r3 # 16-byte Folded Spill
577; CHECK-P8-NEXT:    li r3, 64
578; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
579; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
580; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
581; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
582; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
583; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
584; CHECK-P8-NEXT:    xxswapd v31, vs0
585; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
586; CHECK-P8-NEXT:    vmr v2, v31
587; CHECK-P8-NEXT:    xxswapd v30, vs0
588; CHECK-P8-NEXT:    vmr v3, v30
589; CHECK-P8-NEXT:    bl __ltkf2
590; CHECK-P8-NEXT:    nop
591; CHECK-P8-NEXT:    cmpwi r3, 0
592; CHECK-P8-NEXT:    blt cr0, .LBB11_2
593; CHECK-P8-NEXT:  # %bb.1: # %entry
594; CHECK-P8-NEXT:    vmr v31, v30
595; CHECK-P8-NEXT:  .LBB11_2: # %entry
596; CHECK-P8-NEXT:    li r3, 64
597; CHECK-P8-NEXT:    vmr v2, v31
598; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
599; CHECK-P8-NEXT:    li r3, 48
600; CHECK-P8-NEXT:    lvx v30, r1, r3 # 16-byte Folded Reload
601; CHECK-P8-NEXT:    addi r1, r1, 80
602; CHECK-P8-NEXT:    ld r0, 16(r1)
603; CHECK-P8-NEXT:    mtlr r0
604; CHECK-P8-NEXT:    blr
605entry:
606  %0 = load fp128, ptr @a_qp, align 16
607  %1 = load fp128, ptr @b_qp, align 16
608  %cmp = fcmp olt fp128 %0, %1
609  %cond = select i1 %cmp, fp128 %0, fp128 %1
610  ret fp128 %cond
611}
612
613; Function Attrs: noinline nounwind optnone
614define fp128 @greater_eq_sel_qp() {
615; CHECK-LABEL: greater_eq_sel_qp:
616; CHECK:       # %bb.0: # %entry
617; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
618; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
619; CHECK-NEXT:    lxv v2, 0(r3)
620; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
621; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
622; CHECK-NEXT:    lxv v3, 0(r3)
623; CHECK-NEXT:    xscmpuqp cr0, v2, v3
624; CHECK-NEXT:    crnor 4*cr5+lt, un, lt
625; CHECK-NEXT:    bclr 12, 4*cr5+lt, 0
626; CHECK-NEXT:  # %bb.1: # %entry
627; CHECK-NEXT:    vmr v2, v3
628; CHECK-NEXT:    blr
629;
630; CHECK-P8-LABEL: greater_eq_sel_qp:
631; CHECK-P8:       # %bb.0: # %entry
632; CHECK-P8-NEXT:    mflr r0
633; CHECK-P8-NEXT:    stdu r1, -80(r1)
634; CHECK-P8-NEXT:    std r0, 96(r1)
635; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
636; CHECK-P8-NEXT:    .cfi_offset lr, 16
637; CHECK-P8-NEXT:    .cfi_offset v30, -32
638; CHECK-P8-NEXT:    .cfi_offset v31, -16
639; CHECK-P8-NEXT:    li r3, 48
640; CHECK-P8-NEXT:    stvx v30, r1, r3 # 16-byte Folded Spill
641; CHECK-P8-NEXT:    li r3, 64
642; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
643; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
644; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
645; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
646; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
647; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
648; CHECK-P8-NEXT:    xxswapd v31, vs0
649; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
650; CHECK-P8-NEXT:    vmr v2, v31
651; CHECK-P8-NEXT:    xxswapd v30, vs0
652; CHECK-P8-NEXT:    vmr v3, v30
653; CHECK-P8-NEXT:    bl __gekf2
654; CHECK-P8-NEXT:    nop
655; CHECK-P8-NEXT:    cmpwi r3, -1
656; CHECK-P8-NEXT:    bgt cr0, .LBB12_2
657; CHECK-P8-NEXT:  # %bb.1: # %entry
658; CHECK-P8-NEXT:    vmr v31, v30
659; CHECK-P8-NEXT:  .LBB12_2: # %entry
660; CHECK-P8-NEXT:    li r3, 64
661; CHECK-P8-NEXT:    vmr v2, v31
662; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
663; CHECK-P8-NEXT:    li r3, 48
664; CHECK-P8-NEXT:    lvx v30, r1, r3 # 16-byte Folded Reload
665; CHECK-P8-NEXT:    addi r1, r1, 80
666; CHECK-P8-NEXT:    ld r0, 16(r1)
667; CHECK-P8-NEXT:    mtlr r0
668; CHECK-P8-NEXT:    blr
669entry:
670  %0 = load fp128, ptr @a_qp, align 16
671  %1 = load fp128, ptr @b_qp, align 16
672  %cmp = fcmp oge fp128 %0, %1
673  %cond = select i1 %cmp, fp128 %0, fp128 %1
674  ret fp128 %cond
675}
676
677; Function Attrs: noinline nounwind optnone
678define fp128 @less_eq_sel_qp() {
679; CHECK-LABEL: less_eq_sel_qp:
680; CHECK:       # %bb.0: # %entry
681; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
682; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
683; CHECK-NEXT:    lxv v2, 0(r3)
684; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
685; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
686; CHECK-NEXT:    lxv v3, 0(r3)
687; CHECK-NEXT:    xscmpuqp cr0, v2, v3
688; CHECK-NEXT:    crnor 4*cr5+lt, un, gt
689; CHECK-NEXT:    bclr 12, 4*cr5+lt, 0
690; CHECK-NEXT:  # %bb.1: # %entry
691; CHECK-NEXT:    vmr v2, v3
692; CHECK-NEXT:    blr
693;
694; CHECK-P8-LABEL: less_eq_sel_qp:
695; CHECK-P8:       # %bb.0: # %entry
696; CHECK-P8-NEXT:    mflr r0
697; CHECK-P8-NEXT:    stdu r1, -80(r1)
698; CHECK-P8-NEXT:    std r0, 96(r1)
699; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
700; CHECK-P8-NEXT:    .cfi_offset lr, 16
701; CHECK-P8-NEXT:    .cfi_offset v30, -32
702; CHECK-P8-NEXT:    .cfi_offset v31, -16
703; CHECK-P8-NEXT:    li r3, 48
704; CHECK-P8-NEXT:    stvx v30, r1, r3 # 16-byte Folded Spill
705; CHECK-P8-NEXT:    li r3, 64
706; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
707; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
708; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
709; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
710; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
711; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
712; CHECK-P8-NEXT:    xxswapd v31, vs0
713; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
714; CHECK-P8-NEXT:    vmr v2, v31
715; CHECK-P8-NEXT:    xxswapd v30, vs0
716; CHECK-P8-NEXT:    vmr v3, v30
717; CHECK-P8-NEXT:    bl __lekf2
718; CHECK-P8-NEXT:    nop
719; CHECK-P8-NEXT:    cmpwi r3, 1
720; CHECK-P8-NEXT:    blt cr0, .LBB13_2
721; CHECK-P8-NEXT:  # %bb.1: # %entry
722; CHECK-P8-NEXT:    vmr v31, v30
723; CHECK-P8-NEXT:  .LBB13_2: # %entry
724; CHECK-P8-NEXT:    li r3, 64
725; CHECK-P8-NEXT:    vmr v2, v31
726; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
727; CHECK-P8-NEXT:    li r3, 48
728; CHECK-P8-NEXT:    lvx v30, r1, r3 # 16-byte Folded Reload
729; CHECK-P8-NEXT:    addi r1, r1, 80
730; CHECK-P8-NEXT:    ld r0, 16(r1)
731; CHECK-P8-NEXT:    mtlr r0
732; CHECK-P8-NEXT:    blr
733entry:
734  %0 = load fp128, ptr @a_qp, align 16
735  %1 = load fp128, ptr @b_qp, align 16
736  %cmp = fcmp ole fp128 %0, %1
737  %cond = select i1 %cmp, fp128 %0, fp128 %1
738  ret fp128 %cond
739}
740
741; Function Attrs: noinline nounwind optnone
742define fp128 @equal_sel_qp() {
743; CHECK-LABEL: equal_sel_qp:
744; CHECK:       # %bb.0: # %entry
745; CHECK-NEXT:    addis r3, r2, a_qp@toc@ha
746; CHECK-NEXT:    addi r3, r3, a_qp@toc@l
747; CHECK-NEXT:    lxv v2, 0(r3)
748; CHECK-NEXT:    addis r3, r2, b_qp@toc@ha
749; CHECK-NEXT:    addi r3, r3, b_qp@toc@l
750; CHECK-NEXT:    lxv v3, 0(r3)
751; CHECK-NEXT:    xscmpuqp cr0, v2, v3
752; CHECK-NEXT:    beqlr cr0
753; CHECK-NEXT:  # %bb.1: # %entry
754; CHECK-NEXT:    vmr v2, v3
755; CHECK-NEXT:    blr
756;
757; CHECK-P8-LABEL: equal_sel_qp:
758; CHECK-P8:       # %bb.0: # %entry
759; CHECK-P8-NEXT:    mflr r0
760; CHECK-P8-NEXT:    stdu r1, -80(r1)
761; CHECK-P8-NEXT:    std r0, 96(r1)
762; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
763; CHECK-P8-NEXT:    .cfi_offset lr, 16
764; CHECK-P8-NEXT:    .cfi_offset v30, -32
765; CHECK-P8-NEXT:    .cfi_offset v31, -16
766; CHECK-P8-NEXT:    li r3, 48
767; CHECK-P8-NEXT:    stvx v30, r1, r3 # 16-byte Folded Spill
768; CHECK-P8-NEXT:    li r3, 64
769; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
770; CHECK-P8-NEXT:    addis r3, r2, a_qp@toc@ha
771; CHECK-P8-NEXT:    addi r3, r3, a_qp@toc@l
772; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
773; CHECK-P8-NEXT:    addis r3, r2, b_qp@toc@ha
774; CHECK-P8-NEXT:    addi r3, r3, b_qp@toc@l
775; CHECK-P8-NEXT:    xxswapd v31, vs0
776; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
777; CHECK-P8-NEXT:    vmr v2, v31
778; CHECK-P8-NEXT:    xxswapd v30, vs0
779; CHECK-P8-NEXT:    vmr v3, v30
780; CHECK-P8-NEXT:    bl __eqkf2
781; CHECK-P8-NEXT:    nop
782; CHECK-P8-NEXT:    cmplwi r3, 0
783; CHECK-P8-NEXT:    beq cr0, .LBB14_2
784; CHECK-P8-NEXT:  # %bb.1: # %entry
785; CHECK-P8-NEXT:    vmr v31, v30
786; CHECK-P8-NEXT:  .LBB14_2: # %entry
787; CHECK-P8-NEXT:    li r3, 64
788; CHECK-P8-NEXT:    vmr v2, v31
789; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
790; CHECK-P8-NEXT:    li r3, 48
791; CHECK-P8-NEXT:    lvx v30, r1, r3 # 16-byte Folded Reload
792; CHECK-P8-NEXT:    addi r1, r1, 80
793; CHECK-P8-NEXT:    ld r0, 16(r1)
794; CHECK-P8-NEXT:    mtlr r0
795; CHECK-P8-NEXT:    blr
796entry:
797  %0 = load fp128, ptr @a_qp, align 16
798  %1 = load fp128, ptr @b_qp, align 16
799  %cmp = fcmp oeq fp128 %0, %1
800  %cond = select i1 %cmp, fp128 %0, fp128 %1
801  ret fp128 %cond
802}
803