xref: /llvm-project/llvm/test/CodeGen/PowerPC/fp-classify.ll (revision fc3e6a81868a0c84e405622a64756e57f020ca37)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s \
3; RUN:   -verify-machineinstrs | FileCheck %s --check-prefix=P8
4; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 < %s \
5; RUN:   -verify-machineinstrs | FileCheck %s --check-prefix=P9
6
7define zeroext i1 @abs_isinff(float %x) {
8; P8-LABEL: abs_isinff:
9; P8:       # %bb.0: # %entry
10; P8-NEXT:    xscvdpspn 0, 1
11; P8-NEXT:    lis 4, 32640
12; P8-NEXT:    mffprwz 3, 0
13; P8-NEXT:    clrlwi 3, 3, 1
14; P8-NEXT:    xor 3, 3, 4
15; P8-NEXT:    cntlzw 3, 3
16; P8-NEXT:    srwi 3, 3, 5
17; P8-NEXT:    blr
18;
19; P9-LABEL: abs_isinff:
20; P9:       # %bb.0: # %entry
21; P9-NEXT:    xststdcsp 0, 1, 48
22; P9-NEXT:    li 3, 0
23; P9-NEXT:    li 4, 1
24; P9-NEXT:    iseleq 3, 4, 3
25; P9-NEXT:    blr
26entry:
27  %0 = tail call float @llvm.fabs.f32(float %x)
28  %cmpinf = fcmp oeq float %0, 0x7FF0000000000000
29  ret i1 %cmpinf
30}
31
32define zeroext i1 @abs_isinf(double %x) {
33; P8-LABEL: abs_isinf:
34; P8:       # %bb.0: # %entry
35; P8-NEXT:    mffprd 3, 1
36; P8-NEXT:    li 4, 2047
37; P8-NEXT:    rldic 4, 4, 52, 1
38; P8-NEXT:    clrldi 3, 3, 1
39; P8-NEXT:    xor 3, 3, 4
40; P8-NEXT:    cntlzd 3, 3
41; P8-NEXT:    rldicl 3, 3, 58, 63
42; P8-NEXT:    blr
43;
44; P9-LABEL: abs_isinf:
45; P9:       # %bb.0: # %entry
46; P9-NEXT:    xststdcdp 0, 1, 48
47; P9-NEXT:    li 3, 0
48; P9-NEXT:    li 4, 1
49; P9-NEXT:    iseleq 3, 4, 3
50; P9-NEXT:    blr
51entry:
52  %0 = tail call double @llvm.fabs.f64(double %x)
53  %cmpinf = fcmp oeq double %0, 0x7FF0000000000000
54  ret i1 %cmpinf
55}
56
57define zeroext i1 @abs_isinfq(fp128 %x) {
58; P8-LABEL: abs_isinfq:
59; P8:       # %bb.0: # %entry
60; P8-NEXT:    xxswapd 0, 34
61; P8-NEXT:    addi 3, 1, -16
62; P8-NEXT:    li 5, 32767
63; P8-NEXT:    stxvd2x 0, 0, 3
64; P8-NEXT:    rldic 5, 5, 48, 1
65; P8-NEXT:    ld 4, -8(1)
66; P8-NEXT:    ld 3, -16(1)
67; P8-NEXT:    clrldi 4, 4, 1
68; P8-NEXT:    xor 4, 4, 5
69; P8-NEXT:    or 3, 3, 4
70; P8-NEXT:    cntlzd 3, 3
71; P8-NEXT:    rldicl 3, 3, 58, 63
72; P8-NEXT:    blr
73;
74; P9-LABEL: abs_isinfq:
75; P9:       # %bb.0: # %entry
76; P9-NEXT:    xststdcqp 0, 2, 48
77; P9-NEXT:    li 3, 0
78; P9-NEXT:    li 4, 1
79; P9-NEXT:    iseleq 3, 4, 3
80; P9-NEXT:    blr
81entry:
82  %0 = tail call fp128 @llvm.fabs.f128(fp128 %x)
83  %cmpinf = fcmp oeq fp128 %0, 0xL00000000000000007FFF000000000000
84  ret i1 %cmpinf
85}
86
87define zeroext i1 @abs_isinfornanf(float %x) {
88; P8-LABEL: abs_isinfornanf:
89; P8:       # %bb.0: # %entry
90; P8-NEXT:    xscvdpspn 0, 1
91; P8-NEXT:    lis 4, 32639
92; P8-NEXT:    ori 4, 4, 65535
93; P8-NEXT:    mffprwz 3, 0
94; P8-NEXT:    clrlwi 3, 3, 1
95; P8-NEXT:    sub 3, 4, 3
96; P8-NEXT:    rldicl 3, 3, 1, 63
97; P8-NEXT:    blr
98;
99; P9-LABEL: abs_isinfornanf:
100; P9:       # %bb.0: # %entry
101; P9-NEXT:    xststdcsp 0, 1, 112
102; P9-NEXT:    li 3, 0
103; P9-NEXT:    li 4, 1
104; P9-NEXT:    iseleq 3, 4, 3
105; P9-NEXT:    blr
106entry:
107  %0 = tail call float @llvm.fabs.f32(float %x)
108  %cmpinf = fcmp ueq float %0, 0x7FF0000000000000
109  ret i1 %cmpinf
110}
111
112define zeroext i1 @abs_isinfornan(double %x) {
113; P8-LABEL: abs_isinfornan:
114; P8:       # %bb.0: # %entry
115; P8-NEXT:    mffprd 3, 1
116; P8-NEXT:    li 4, -33
117; P8-NEXT:    rldicl 4, 4, 47, 1
118; P8-NEXT:    sradi 5, 4, 63
119; P8-NEXT:    clrldi 3, 3, 1
120; P8-NEXT:    rldicl 6, 3, 1, 63
121; P8-NEXT:    subc 3, 4, 3
122; P8-NEXT:    adde 3, 6, 5
123; P8-NEXT:    xori 3, 3, 1
124; P8-NEXT:    blr
125;
126; P9-LABEL: abs_isinfornan:
127; P9:       # %bb.0: # %entry
128; P9-NEXT:    xststdcdp 0, 1, 112
129; P9-NEXT:    li 3, 0
130; P9-NEXT:    li 4, 1
131; P9-NEXT:    iseleq 3, 4, 3
132; P9-NEXT:    blr
133entry:
134  %0 = tail call double @llvm.fabs.f64(double %x)
135  %cmpinf = fcmp ueq double %0, 0x7FF0000000000000
136  ret i1 %cmpinf
137}
138
139define zeroext i1 @abs_isinfornanq(fp128 %x) {
140; P8-LABEL: abs_isinfornanq:
141; P8:       # %bb.0: # %entry
142; P8-NEXT:    xxswapd 0, 34
143; P8-NEXT:    addi 3, 1, -16
144; P8-NEXT:    li 4, -3
145; P8-NEXT:    stxvd2x 0, 0, 3
146; P8-NEXT:    rldicl 4, 4, 47, 1
147; P8-NEXT:    ld 3, -8(1)
148; P8-NEXT:    sradi 5, 4, 63
149; P8-NEXT:    clrldi 3, 3, 1
150; P8-NEXT:    rldicl 6, 3, 1, 63
151; P8-NEXT:    subc 3, 4, 3
152; P8-NEXT:    adde 3, 6, 5
153; P8-NEXT:    xori 3, 3, 1
154; P8-NEXT:    blr
155;
156; P9-LABEL: abs_isinfornanq:
157; P9:       # %bb.0: # %entry
158; P9-NEXT:    xststdcqp 0, 2, 112
159; P9-NEXT:    li 3, 0
160; P9-NEXT:    li 4, 1
161; P9-NEXT:    iseleq 3, 4, 3
162; P9-NEXT:    blr
163entry:
164  %0 = tail call fp128 @llvm.fabs.f128(fp128 %x)
165  %cmpinf = fcmp ueq fp128 %0, 0xL00000000000000007FFF000000000000
166  ret i1 %cmpinf
167}
168
169define <4 x i1> @abs_isinfv4f32(<4 x float> %x) {
170; P8-LABEL: abs_isinfv4f32:
171; P8:       # %bb.0: # %entry
172; P8-NEXT:    addis 3, 2, .LCPI6_0@toc@ha
173; P8-NEXT:    xvabssp 0, 34
174; P8-NEXT:    addi 3, 3, .LCPI6_0@toc@l
175; P8-NEXT:    lxvd2x 1, 0, 3
176; P8-NEXT:    xvcmpeqsp 34, 0, 1
177; P8-NEXT:    blr
178;
179; P9-LABEL: abs_isinfv4f32:
180; P9:       # %bb.0: # %entry
181; P9-NEXT:    addis 3, 2, .LCPI6_0@toc@ha
182; P9-NEXT:    xvabssp 0, 34
183; P9-NEXT:    addi 3, 3, .LCPI6_0@toc@l
184; P9-NEXT:    lxv 1, 0(3)
185; P9-NEXT:    xvcmpeqsp 34, 0, 1
186; P9-NEXT:    blr
187entry:
188  %0 = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %x)
189  %cmpinf = fcmp oeq <4 x float> %0, <float 0x7FF0000000000000, float 0x7FF0000000000000, float 0x7FF0000000000000, float 0x7FF0000000000000>
190  ret <4 x i1> %cmpinf
191}
192
193define <2 x i1> @abs_isinfv2f64(<2 x double> %x) {
194; P8-LABEL: abs_isinfv2f64:
195; P8:       # %bb.0: # %entry
196; P8-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
197; P8-NEXT:    xvabsdp 0, 34
198; P8-NEXT:    addi 3, 3, .LCPI7_0@toc@l
199; P8-NEXT:    lxvd2x 1, 0, 3
200; P8-NEXT:    xvcmpeqdp 34, 0, 1
201; P8-NEXT:    blr
202;
203; P9-LABEL: abs_isinfv2f64:
204; P9:       # %bb.0: # %entry
205; P9-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
206; P9-NEXT:    xvabsdp 0, 34
207; P9-NEXT:    addi 3, 3, .LCPI7_0@toc@l
208; P9-NEXT:    lxv 1, 0(3)
209; P9-NEXT:    xvcmpeqdp 34, 0, 1
210; P9-NEXT:    blr
211entry:
212  %0 = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %x)
213  %cmpinf = fcmp oeq <2 x double> %0, <double 0x7FF0000000000000, double 0x7FF0000000000000>
214  ret <2 x i1> %cmpinf
215}
216
217define zeroext i1 @iszerof(float %x) {
218; P8-LABEL: iszerof:
219; P8:       # %bb.0: # %entry
220; P8-NEXT:    xxlxor 0, 0, 0
221; P8-NEXT:    li 3, 0
222; P8-NEXT:    li 4, 1
223; P8-NEXT:    fcmpu 0, 1, 0
224; P8-NEXT:    iseleq 3, 4, 3
225; P8-NEXT:    blr
226;
227; P9-LABEL: iszerof:
228; P9:       # %bb.0: # %entry
229; P9-NEXT:    xxlxor 0, 0, 0
230; P9-NEXT:    li 3, 0
231; P9-NEXT:    li 4, 1
232; P9-NEXT:    fcmpu 0, 1, 0
233; P9-NEXT:    iseleq 3, 4, 3
234; P9-NEXT:    blr
235entry:
236  %cmp = fcmp oeq float %x, 0.000000e+00
237  ret i1 %cmp
238}
239
240define zeroext i1 @iszero(double %x) {
241; P8-LABEL: iszero:
242; P8:       # %bb.0: # %entry
243; P8-NEXT:    xxlxor 0, 0, 0
244; P8-NEXT:    li 3, 0
245; P8-NEXT:    li 4, 1
246; P8-NEXT:    fcmpu 0, 1, 0
247; P8-NEXT:    iseleq 3, 4, 3
248; P8-NEXT:    blr
249;
250; P9-LABEL: iszero:
251; P9:       # %bb.0: # %entry
252; P9-NEXT:    xxlxor 0, 0, 0
253; P9-NEXT:    li 3, 0
254; P9-NEXT:    li 4, 1
255; P9-NEXT:    fcmpu 0, 1, 0
256; P9-NEXT:    iseleq 3, 4, 3
257; P9-NEXT:    blr
258entry:
259  %cmp = fcmp oeq double %x, 0.000000e+00
260  ret i1 %cmp
261}
262
263define zeroext i1 @iszeroq(fp128 %x) {
264; P8-LABEL: iszeroq:
265; P8:       # %bb.0: # %entry
266; P8-NEXT:    mflr 0
267; P8-NEXT:    stdu 1, -32(1)
268; P8-NEXT:    std 0, 48(1)
269; P8-NEXT:    .cfi_def_cfa_offset 32
270; P8-NEXT:    .cfi_offset lr, 16
271; P8-NEXT:    addis 3, 2, .LCPI10_0@toc@ha
272; P8-NEXT:    addi 3, 3, .LCPI10_0@toc@l
273; P8-NEXT:    lxvd2x 0, 0, 3
274; P8-NEXT:    xxswapd 35, 0
275; P8-NEXT:    bl __eqkf2
276; P8-NEXT:    nop
277; P8-NEXT:    cntlzw 3, 3
278; P8-NEXT:    srwi 3, 3, 5
279; P8-NEXT:    addi 1, 1, 32
280; P8-NEXT:    ld 0, 16(1)
281; P8-NEXT:    mtlr 0
282; P8-NEXT:    blr
283;
284; P9-LABEL: iszeroq:
285; P9:       # %bb.0: # %entry
286; P9-NEXT:    addis 3, 2, .LCPI10_0@toc@ha
287; P9-NEXT:    li 4, 1
288; P9-NEXT:    addi 3, 3, .LCPI10_0@toc@l
289; P9-NEXT:    lxv 35, 0(3)
290; P9-NEXT:    li 3, 0
291; P9-NEXT:    xscmpuqp 0, 2, 3
292; P9-NEXT:    iseleq 3, 4, 3
293; P9-NEXT:    blr
294entry:
295  %cmp = fcmp oeq fp128 %x, 0xL00000000000000000000000000000000
296  ret i1 %cmp
297}
298
299define <4 x i1> @iszerov4f32(<4 x float> %x) {
300; P8-LABEL: iszerov4f32:
301; P8:       # %bb.0: # %entry
302; P8-NEXT:    xxlxor 0, 0, 0
303; P8-NEXT:    xvcmpeqsp 34, 34, 0
304; P8-NEXT:    blr
305;
306; P9-LABEL: iszerov4f32:
307; P9:       # %bb.0: # %entry
308; P9-NEXT:    xxlxor 0, 0, 0
309; P9-NEXT:    xvcmpeqsp 34, 34, 0
310; P9-NEXT:    blr
311entry:
312  %cmp = fcmp oeq <4 x float> %x, <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>
313  ret <4 x i1> %cmp
314}
315
316define <2 x i1> @iszerov2f64(<2 x double> %x) {
317; P8-LABEL: iszerov2f64:
318; P8:       # %bb.0: # %entry
319; P8-NEXT:    xxlxor 0, 0, 0
320; P8-NEXT:    xvcmpeqdp 34, 34, 0
321; P8-NEXT:    blr
322;
323; P9-LABEL: iszerov2f64:
324; P9:       # %bb.0: # %entry
325; P9-NEXT:    xxlxor 0, 0, 0
326; P9-NEXT:    xvcmpeqdp 34, 34, 0
327; P9-NEXT:    blr
328entry:
329  %cmp = fcmp oeq <2 x double> %x, <double 0.000000e+00, double 0.000000e+00>
330  ret <2 x i1> %cmp
331}
332
333declare float @llvm.fabs.f32(float)
334declare double @llvm.fabs.f64(double)
335declare fp128 @llvm.fabs.f128(fp128)
336declare <4 x float> @llvm.fabs.v4f32(<4 x float>)
337declare <2 x double> @llvm.fabs.v2f64(<2 x double>)
338