xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/compare-inf.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Convert oeq and une to ole/oge/ule/uge when comparing with infinity
4*9880d681SAndroid Build Coastguard Worker; and negative infinity, because those are more efficient on x86.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdeclare void @f() nounwind
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: oeq_inff:
9*9880d681SAndroid Build Coastguard Worker; CHECK: ucomiss
10*9880d681SAndroid Build Coastguard Worker; CHECK: jb
11*9880d681SAndroid Build Coastguard Workerdefine void @oeq_inff(float %x) nounwind {
12*9880d681SAndroid Build Coastguard Worker  %t0 = fcmp oeq float %x, 0x7FF0000000000000
13*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %true, label %false
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workertrue:
16*9880d681SAndroid Build Coastguard Worker  call void @f() nounwind
17*9880d681SAndroid Build Coastguard Worker  br label %false
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerfalse:
20*9880d681SAndroid Build Coastguard Worker  ret void
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: oeq_inf:
24*9880d681SAndroid Build Coastguard Worker; CHECK: ucomisd
25*9880d681SAndroid Build Coastguard Worker; CHECK: jb
26*9880d681SAndroid Build Coastguard Workerdefine void @oeq_inf(double %x) nounwind {
27*9880d681SAndroid Build Coastguard Worker  %t0 = fcmp oeq double %x, 0x7FF0000000000000
28*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %true, label %false
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workertrue:
31*9880d681SAndroid Build Coastguard Worker  call void @f() nounwind
32*9880d681SAndroid Build Coastguard Worker  br label %false
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerfalse:
35*9880d681SAndroid Build Coastguard Worker  ret void
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: une_inff:
39*9880d681SAndroid Build Coastguard Worker; CHECK: ucomiss
40*9880d681SAndroid Build Coastguard Worker; CHECK: jae
41*9880d681SAndroid Build Coastguard Workerdefine void @une_inff(float %x) nounwind {
42*9880d681SAndroid Build Coastguard Worker  %t0 = fcmp une float %x, 0x7FF0000000000000
43*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %true, label %false
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workertrue:
46*9880d681SAndroid Build Coastguard Worker  call void @f() nounwind
47*9880d681SAndroid Build Coastguard Worker  br label %false
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerfalse:
50*9880d681SAndroid Build Coastguard Worker  ret void
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: une_inf:
54*9880d681SAndroid Build Coastguard Worker; CHECK: ucomisd
55*9880d681SAndroid Build Coastguard Worker; CHECK: jae
56*9880d681SAndroid Build Coastguard Workerdefine void @une_inf(double %x) nounwind {
57*9880d681SAndroid Build Coastguard Worker  %t0 = fcmp une double %x, 0x7FF0000000000000
58*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %true, label %false
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workertrue:
61*9880d681SAndroid Build Coastguard Worker  call void @f() nounwind
62*9880d681SAndroid Build Coastguard Worker  br label %false
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerfalse:
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: oeq_neg_inff:
69*9880d681SAndroid Build Coastguard Worker; CHECK: ucomiss
70*9880d681SAndroid Build Coastguard Worker; CHECK: jb
71*9880d681SAndroid Build Coastguard Workerdefine void @oeq_neg_inff(float %x) nounwind {
72*9880d681SAndroid Build Coastguard Worker  %t0 = fcmp oeq float %x, 0xFFF0000000000000
73*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %true, label %false
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workertrue:
76*9880d681SAndroid Build Coastguard Worker  call void @f() nounwind
77*9880d681SAndroid Build Coastguard Worker  br label %false
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerfalse:
80*9880d681SAndroid Build Coastguard Worker  ret void
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: oeq_neg_inf:
84*9880d681SAndroid Build Coastguard Worker; CHECK: ucomisd
85*9880d681SAndroid Build Coastguard Worker; CHECK: jb
86*9880d681SAndroid Build Coastguard Workerdefine void @oeq_neg_inf(double %x) nounwind {
87*9880d681SAndroid Build Coastguard Worker  %t0 = fcmp oeq double %x, 0xFFF0000000000000
88*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %true, label %false
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workertrue:
91*9880d681SAndroid Build Coastguard Worker  call void @f() nounwind
92*9880d681SAndroid Build Coastguard Worker  br label %false
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerfalse:
95*9880d681SAndroid Build Coastguard Worker  ret void
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: une_neg_inff:
99*9880d681SAndroid Build Coastguard Worker; CHECK: ucomiss
100*9880d681SAndroid Build Coastguard Worker; CHECK: jae
101*9880d681SAndroid Build Coastguard Workerdefine void @une_neg_inff(float %x) nounwind {
102*9880d681SAndroid Build Coastguard Worker  %t0 = fcmp une float %x, 0xFFF0000000000000
103*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %true, label %false
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workertrue:
106*9880d681SAndroid Build Coastguard Worker  call void @f() nounwind
107*9880d681SAndroid Build Coastguard Worker  br label %false
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerfalse:
110*9880d681SAndroid Build Coastguard Worker  ret void
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: une_neg_inf:
114*9880d681SAndroid Build Coastguard Worker; CHECK: ucomisd
115*9880d681SAndroid Build Coastguard Worker; CHECK: jae
116*9880d681SAndroid Build Coastguard Workerdefine void @une_neg_inf(double %x) nounwind {
117*9880d681SAndroid Build Coastguard Worker  %t0 = fcmp une double %x, 0xFFF0000000000000
118*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %true, label %false
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workertrue:
121*9880d681SAndroid Build Coastguard Worker  call void @f() nounwind
122*9880d681SAndroid Build Coastguard Worker  br label %false
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerfalse:
125*9880d681SAndroid Build Coastguard Worker  ret void
126*9880d681SAndroid Build Coastguard Worker}
127