xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/fp-classify.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float) #1
5*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fabs.f64(double) #1
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_isinf_pattern:
8*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x204{{$}}
9*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, s{{[0-9]+}}, [[MASK]]
10*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp
11*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
12*9880d681SAndroid Build Coastguard Workerdefine void @test_isinf_pattern(i32 addrspace(1)* nocapture %out, float %x) #0 {
13*9880d681SAndroid Build Coastguard Worker  %fabs = tail call float @llvm.fabs.f32(float %x) #1
14*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %fabs, 0x7FF0000000000000
15*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %cmp to i32
16*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
17*9880d681SAndroid Build Coastguard Worker  ret void
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_not_isinf_pattern_0:
21*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
22*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
23*9880d681SAndroid Build Coastguard Workerdefine void @test_not_isinf_pattern_0(i32 addrspace(1)* nocapture %out, float %x) #0 {
24*9880d681SAndroid Build Coastguard Worker  %fabs = tail call float @llvm.fabs.f32(float %x) #1
25*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %fabs, 0x7FF0000000000000
26*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %cmp to i32
27*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
28*9880d681SAndroid Build Coastguard Worker  ret void
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_not_isinf_pattern_1:
32*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
33*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
34*9880d681SAndroid Build Coastguard Workerdefine void @test_not_isinf_pattern_1(i32 addrspace(1)* nocapture %out, float %x) #0 {
35*9880d681SAndroid Build Coastguard Worker  %fabs = tail call float @llvm.fabs.f32(float %x) #1
36*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %fabs, 0xFFF0000000000000
37*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %cmp to i32
38*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
39*9880d681SAndroid Build Coastguard Worker  ret void
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_isfinite_pattern_0:
43*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp
44*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1f8{{$}}
45*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, s{{[0-9]+}}, [[MASK]]
46*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp
47*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
48*9880d681SAndroid Build Coastguard Workerdefine void @test_isfinite_pattern_0(i32 addrspace(1)* nocapture %out, float %x) #0 {
49*9880d681SAndroid Build Coastguard Worker  %ord = fcmp ord float %x, 0.000000e+00
50*9880d681SAndroid Build Coastguard Worker  %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
51*9880d681SAndroid Build Coastguard Worker  %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
52*9880d681SAndroid Build Coastguard Worker  %and = and i1 %ord, %ninf
53*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %and to i32
54*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
55*9880d681SAndroid Build Coastguard Worker  ret void
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; Use negative infinity
59*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_isfinite_not_pattern_0:
60*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class_f32
61*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
62*9880d681SAndroid Build Coastguard Workerdefine void @test_isfinite_not_pattern_0(i32 addrspace(1)* nocapture %out, float %x) #0 {
63*9880d681SAndroid Build Coastguard Worker  %ord = fcmp ord float %x, 0.000000e+00
64*9880d681SAndroid Build Coastguard Worker  %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
65*9880d681SAndroid Build Coastguard Worker  %ninf = fcmp une float %x.fabs, 0xFFF0000000000000
66*9880d681SAndroid Build Coastguard Worker  %and = and i1 %ord, %ninf
67*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %and to i32
68*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
69*9880d681SAndroid Build Coastguard Worker  ret void
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; No fabs
73*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_isfinite_not_pattern_1:
74*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class_f32
75*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
76*9880d681SAndroid Build Coastguard Workerdefine void @test_isfinite_not_pattern_1(i32 addrspace(1)* nocapture %out, float %x) #0 {
77*9880d681SAndroid Build Coastguard Worker  %ord = fcmp ord float %x, 0.000000e+00
78*9880d681SAndroid Build Coastguard Worker  %ninf = fcmp une float %x, 0x7FF0000000000000
79*9880d681SAndroid Build Coastguard Worker  %and = and i1 %ord, %ninf
80*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %and to i32
81*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
82*9880d681SAndroid Build Coastguard Worker  ret void
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; fabs of different value
86*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_isfinite_not_pattern_2:
87*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class_f32
88*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
89*9880d681SAndroid Build Coastguard Workerdefine void @test_isfinite_not_pattern_2(i32 addrspace(1)* nocapture %out, float %x, float %y) #0 {
90*9880d681SAndroid Build Coastguard Worker  %ord = fcmp ord float %x, 0.000000e+00
91*9880d681SAndroid Build Coastguard Worker  %x.fabs = tail call float @llvm.fabs.f32(float %y) #1
92*9880d681SAndroid Build Coastguard Worker  %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
93*9880d681SAndroid Build Coastguard Worker  %and = and i1 %ord, %ninf
94*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %and to i32
95*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
96*9880d681SAndroid Build Coastguard Worker  ret void
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; Wrong ordered compare type
100*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_isfinite_not_pattern_3:
101*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class_f32
102*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
103*9880d681SAndroid Build Coastguard Workerdefine void @test_isfinite_not_pattern_3(i32 addrspace(1)* nocapture %out, float %x) #0 {
104*9880d681SAndroid Build Coastguard Worker  %ord = fcmp uno float %x, 0.000000e+00
105*9880d681SAndroid Build Coastguard Worker  %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
106*9880d681SAndroid Build Coastguard Worker  %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
107*9880d681SAndroid Build Coastguard Worker  %and = and i1 %ord, %ninf
108*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %and to i32
109*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
110*9880d681SAndroid Build Coastguard Worker  ret void
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; Wrong unordered compare
114*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_isfinite_not_pattern_4:
115*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class_f32
116*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
117*9880d681SAndroid Build Coastguard Workerdefine void @test_isfinite_not_pattern_4(i32 addrspace(1)* nocapture %out, float %x) #0 {
118*9880d681SAndroid Build Coastguard Worker  %ord = fcmp ord float %x, 0.000000e+00
119*9880d681SAndroid Build Coastguard Worker  %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
120*9880d681SAndroid Build Coastguard Worker  %ninf = fcmp one float %x.fabs, 0x7FF0000000000000
121*9880d681SAndroid Build Coastguard Worker  %and = and i1 %ord, %ninf
122*9880d681SAndroid Build Coastguard Worker  %ext = zext i1 %and to i32
123*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
124*9880d681SAndroid Build Coastguard Worker  ret void
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
128*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone }
129