xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.class.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
3*9880d681SAndroid Build Coastguard Workerdeclare i1 @llvm.amdgcn.class.f32(float, i32) #1
4*9880d681SAndroid Build Coastguard Workerdeclare i1 @llvm.amdgcn.class.f64(double, i32) #1
5*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #1
6*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float) #1
7*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fabs.f64(double) #1
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_f32:
10*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
11*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc
12*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
13*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[SA]], [[VB]]
14*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
15*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
16*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
17*9880d681SAndroid Build Coastguard Workerdefine void @test_class_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 {
18*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 %b) #1
19*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
20*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
21*9880d681SAndroid Build Coastguard Worker  ret void
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fabs_f32:
25*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
26*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc
27*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
28*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], |[[SA]]|, [[VB]]
29*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]]
30*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
31*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
32*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fabs_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 {
33*9880d681SAndroid Build Coastguard Worker  %a.fabs = call float @llvm.fabs.f32(float %a) #1
34*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a.fabs, i32 %b) #1
35*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
36*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
37*9880d681SAndroid Build Coastguard Worker  ret void
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fneg_f32:
41*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
42*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc
43*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
44*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -[[SA]], [[VB]]
45*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]]
46*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
47*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
48*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fneg_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 {
49*9880d681SAndroid Build Coastguard Worker  %a.fneg = fsub float -0.0, %a
50*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a.fneg, i32 %b) #1
51*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
52*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
53*9880d681SAndroid Build Coastguard Worker  ret void
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fneg_fabs_f32:
57*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
58*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc
59*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
60*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -|[[SA]]|, [[VB]]
61*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]]
62*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
63*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
64*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fneg_fabs_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 {
65*9880d681SAndroid Build Coastguard Worker  %a.fabs = call float @llvm.fabs.f32(float %a) #1
66*9880d681SAndroid Build Coastguard Worker  %a.fneg.fabs = fsub float -0.0, %a.fabs
67*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a.fneg.fabs, i32 %b) #1
68*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
69*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
70*9880d681SAndroid Build Coastguard Worker  ret void
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_1_f32:
74*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
75*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[COND:s\[[0-9]+:[0-9]+\]]], [[SA]], 1{{$}}
76*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[COND]]
77*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
78*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
79*9880d681SAndroid Build Coastguard Workerdefine void @test_class_1_f32(i32 addrspace(1)* %out, float %a) #0 {
80*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 1) #1
81*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
82*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
83*9880d681SAndroid Build Coastguard Worker  ret void
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_64_f32:
87*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
88*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[COND:s\[[0-9]+:[0-9]+\]]], [[SA]], 64{{$}}
89*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[COND]]
90*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
91*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
92*9880d681SAndroid Build Coastguard Workerdefine void @test_class_64_f32(i32 addrspace(1)* %out, float %a) #0 {
93*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 64) #1
94*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
95*9880d681SAndroid Build Coastguard Worker  store i32 %sext, 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; Set all 10 bits of mask
100*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_full_mask_f32:
101*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
102*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x3ff{{$}}
103*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[SA]], [[MASK]]
104*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
105*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
106*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
107*9880d681SAndroid Build Coastguard Workerdefine void @test_class_full_mask_f32(i32 addrspace(1)* %out, float %a) #0 {
108*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 1023) #1
109*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
110*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
111*9880d681SAndroid Build Coastguard Worker  ret void
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_9bit_mask_f32:
115*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
116*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1ff{{$}}
117*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[SA]], [[MASK]]
118*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
119*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
120*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
121*9880d681SAndroid Build Coastguard Workerdefine void @test_class_9bit_mask_f32(i32 addrspace(1)* %out, float %a) #0 {
122*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 511) #1
123*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
124*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
125*9880d681SAndroid Build Coastguard Worker  ret void
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}v_test_class_full_mask_f32:
129*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[VA:v[0-9]+]]
130*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1ff{{$}}
131*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[VA]], [[MASK]]
132*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
133*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]]
134*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
135*9880d681SAndroid Build Coastguard Workerdefine void @v_test_class_full_mask_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 {
136*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
137*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
138*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
139*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.in
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 511) #1
142*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
143*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %gep.out, align 4
144*9880d681SAndroid Build Coastguard Worker  ret void
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_inline_imm_constant_dynamic_mask_f32:
148*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[VB:v[0-9]+]]
149*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, 1.0, [[VB]]
150*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
151*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]]
152*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
153*9880d681SAndroid Build Coastguard Workerdefine void @test_class_inline_imm_constant_dynamic_mask_f32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 {
154*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
155*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
156*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
157*9880d681SAndroid Build Coastguard Worker  %b = load i32, i32 addrspace(1)* %gep.in
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float 1.0, i32 %b) #1
160*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
161*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %gep.out, align 4
162*9880d681SAndroid Build Coastguard Worker  ret void
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; FIXME: Why isn't this using a literal constant operand?
166*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_lit_constant_dynamic_mask_f32:
167*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[VB:v[0-9]+]]
168*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VK:v[0-9]+]], 0x44800000
169*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[VK]], [[VB]]
170*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
171*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]]
172*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
173*9880d681SAndroid Build Coastguard Workerdefine void @test_class_lit_constant_dynamic_mask_f32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 {
174*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
175*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
176*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
177*9880d681SAndroid Build Coastguard Worker  %b = load i32, i32 addrspace(1)* %gep.in
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float 1024.0, i32 %b) #1
180*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
181*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %gep.out, align 4
182*9880d681SAndroid Build Coastguard Worker  ret void
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_f64:
186*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
187*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd
188*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
189*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, [[SA]], [[VB]]
190*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
191*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
192*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
193*9880d681SAndroid Build Coastguard Workerdefine void @test_class_f64(i32 addrspace(1)* %out, double %a, i32 %b) #0 {
194*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 %b) #1
195*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
196*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
197*9880d681SAndroid Build Coastguard Worker  ret void
198*9880d681SAndroid Build Coastguard Worker}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fabs_f64:
201*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
202*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd
203*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
204*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], |[[SA]]|, [[VB]]
205*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]]
206*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
207*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
208*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fabs_f64(i32 addrspace(1)* %out, double %a, i32 %b) #0 {
209*9880d681SAndroid Build Coastguard Worker  %a.fabs = call double @llvm.fabs.f64(double %a) #1
210*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a.fabs, i32 %b) #1
211*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
212*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
213*9880d681SAndroid Build Coastguard Worker  ret void
214*9880d681SAndroid Build Coastguard Worker}
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fneg_f64:
217*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
218*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd
219*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
220*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -[[SA]], [[VB]]
221*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]]
222*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
223*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
224*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fneg_f64(i32 addrspace(1)* %out, double %a, i32 %b) #0 {
225*9880d681SAndroid Build Coastguard Worker  %a.fneg = fsub double -0.0, %a
226*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a.fneg, i32 %b) #1
227*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
228*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
229*9880d681SAndroid Build Coastguard Worker  ret void
230*9880d681SAndroid Build Coastguard Worker}
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fneg_fabs_f64:
233*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
234*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd
235*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
236*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -|[[SA]]|, [[VB]]
237*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]]
238*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
239*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
240*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fneg_fabs_f64(i32 addrspace(1)* %out, double %a, i32 %b) #0 {
241*9880d681SAndroid Build Coastguard Worker  %a.fabs = call double @llvm.fabs.f64(double %a) #1
242*9880d681SAndroid Build Coastguard Worker  %a.fneg.fabs = fsub double -0.0, %a.fabs
243*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a.fneg.fabs, i32 %b) #1
244*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
245*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
246*9880d681SAndroid Build Coastguard Worker  ret void
247*9880d681SAndroid Build Coastguard Worker}
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_1_f64:
250*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 1{{$}}
251*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
252*9880d681SAndroid Build Coastguard Workerdefine void @test_class_1_f64(i32 addrspace(1)* %out, double %a) #0 {
253*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 1) #1
254*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
255*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
256*9880d681SAndroid Build Coastguard Worker  ret void
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_64_f64:
260*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 64{{$}}
261*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
262*9880d681SAndroid Build Coastguard Workerdefine void @test_class_64_f64(i32 addrspace(1)* %out, double %a) #0 {
263*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 64) #1
264*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
265*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
266*9880d681SAndroid Build Coastguard Worker  ret void
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; Set all 9 bits of mask
270*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_full_mask_f64:
271*9880d681SAndroid Build Coastguard Worker; SI: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
272*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1ff{{$}}
273*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, [[SA]], [[MASK]]
274*9880d681SAndroid Build Coastguard Worker; SI-NOT: vcc
275*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
276*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]]
277*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
278*9880d681SAndroid Build Coastguard Workerdefine void @test_class_full_mask_f64(i32 addrspace(1)* %out, double %a) #0 {
279*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 511) #1
280*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
281*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
282*9880d681SAndroid Build Coastguard Worker  ret void
283*9880d681SAndroid Build Coastguard Worker}
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}v_test_class_full_mask_f64:
286*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[VA:v\[[0-9]+:[0-9]+\]]]
287*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1ff{{$}}
288*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, [[VA]], [[MASK]]
289*9880d681SAndroid Build Coastguard Worker; SI-NOT: vcc
290*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc
291*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]]
292*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
293*9880d681SAndroid Build Coastguard Workerdefine void @v_test_class_full_mask_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #0 {
294*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
295*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
296*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
297*9880d681SAndroid Build Coastguard Worker  %a = load double, double addrspace(1)* %in
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 511) #1
300*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
301*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %gep.out, align 4
302*9880d681SAndroid Build Coastguard Worker  ret void
303*9880d681SAndroid Build Coastguard Worker}
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_inline_imm_constant_dynamic_mask_f64:
306*9880d681SAndroid Build Coastguard Worker; XSI: v_cmp_class_f64_e32 vcc, 1.0,
307*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc,
308*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
309*9880d681SAndroid Build Coastguard Workerdefine void @test_class_inline_imm_constant_dynamic_mask_f64(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 {
310*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
311*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
312*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
313*9880d681SAndroid Build Coastguard Worker  %b = load i32, i32 addrspace(1)* %gep.in
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double 1.0, i32 %b) #1
316*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
317*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %gep.out, align 4
318*9880d681SAndroid Build Coastguard Worker  ret void
319*9880d681SAndroid Build Coastguard Worker}
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_lit_constant_dynamic_mask_f64:
322*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, s{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}
323*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
324*9880d681SAndroid Build Coastguard Workerdefine void @test_class_lit_constant_dynamic_mask_f64(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 {
325*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
326*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
327*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
328*9880d681SAndroid Build Coastguard Worker  %b = load i32, i32 addrspace(1)* %gep.in
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double 1024.0, i32 %b) #1
331*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
332*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %gep.out, align 4
333*9880d681SAndroid Build Coastguard Worker  ret void
334*9880d681SAndroid Build Coastguard Worker}
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or_class_f32_0:
337*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
338*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 3{{$}}
339*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
340*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
341*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or_class_f32_0(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 {
342*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
343*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
344*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
345*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.in
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Worker  %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 1) #1
348*9880d681SAndroid Build Coastguard Worker  %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 3) #1
349*9880d681SAndroid Build Coastguard Worker  %or = or i1 %class0, %class1
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %or to i32
352*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
353*9880d681SAndroid Build Coastguard Worker  ret void
354*9880d681SAndroid Build Coastguard Worker}
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or3_class_f32_0:
357*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
358*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 s{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 7{{$}}
359*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
360*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
361*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or3_class_f32_0(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 {
362*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
363*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
364*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
365*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.in
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Worker  %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 1) #1
368*9880d681SAndroid Build Coastguard Worker  %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 2) #1
369*9880d681SAndroid Build Coastguard Worker  %class2 = call i1 @llvm.amdgcn.class.f32(float %a, i32 4) #1
370*9880d681SAndroid Build Coastguard Worker  %or.0 = or i1 %class0, %class1
371*9880d681SAndroid Build Coastguard Worker  %or.1 = or i1 %or.0, %class2
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %or.1 to i32
374*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
375*9880d681SAndroid Build Coastguard Worker  ret void
376*9880d681SAndroid Build Coastguard Worker}
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or_all_tests_class_f32_0:
379*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
380*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x3ff{{$}}
381*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, v{{[0-9]+}}, [[MASK]]{{$}}
382*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
383*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
384*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or_all_tests_class_f32_0(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 {
385*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
386*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
387*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
388*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.in
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker  %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 1) #1
391*9880d681SAndroid Build Coastguard Worker  %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 2) #1
392*9880d681SAndroid Build Coastguard Worker  %class2 = call i1 @llvm.amdgcn.class.f32(float %a, i32 4) #1
393*9880d681SAndroid Build Coastguard Worker  %class3 = call i1 @llvm.amdgcn.class.f32(float %a, i32 8) #1
394*9880d681SAndroid Build Coastguard Worker  %class4 = call i1 @llvm.amdgcn.class.f32(float %a, i32 16) #1
395*9880d681SAndroid Build Coastguard Worker  %class5 = call i1 @llvm.amdgcn.class.f32(float %a, i32 32) #1
396*9880d681SAndroid Build Coastguard Worker  %class6 = call i1 @llvm.amdgcn.class.f32(float %a, i32 64) #1
397*9880d681SAndroid Build Coastguard Worker  %class7 = call i1 @llvm.amdgcn.class.f32(float %a, i32 128) #1
398*9880d681SAndroid Build Coastguard Worker  %class8 = call i1 @llvm.amdgcn.class.f32(float %a, i32 256) #1
399*9880d681SAndroid Build Coastguard Worker  %class9 = call i1 @llvm.amdgcn.class.f32(float %a, i32 512) #1
400*9880d681SAndroid Build Coastguard Worker  %or.0 = or i1 %class0, %class1
401*9880d681SAndroid Build Coastguard Worker  %or.1 = or i1 %or.0, %class2
402*9880d681SAndroid Build Coastguard Worker  %or.2 = or i1 %or.1, %class3
403*9880d681SAndroid Build Coastguard Worker  %or.3 = or i1 %or.2, %class4
404*9880d681SAndroid Build Coastguard Worker  %or.4 = or i1 %or.3, %class5
405*9880d681SAndroid Build Coastguard Worker  %or.5 = or i1 %or.4, %class6
406*9880d681SAndroid Build Coastguard Worker  %or.6 = or i1 %or.5, %class7
407*9880d681SAndroid Build Coastguard Worker  %or.7 = or i1 %or.6, %class8
408*9880d681SAndroid Build Coastguard Worker  %or.8 = or i1 %or.7, %class9
409*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %or.8 to i32
410*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
411*9880d681SAndroid Build Coastguard Worker  ret void
412*9880d681SAndroid Build Coastguard Worker}
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or_class_f32_1:
415*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
416*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 12{{$}}
417*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
418*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
419*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or_class_f32_1(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 {
420*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
421*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
422*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
423*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.in
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker  %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 4) #1
426*9880d681SAndroid Build Coastguard Worker  %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 8) #1
427*9880d681SAndroid Build Coastguard Worker  %or = or i1 %class0, %class1
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %or to i32
430*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
431*9880d681SAndroid Build Coastguard Worker  ret void
432*9880d681SAndroid Build Coastguard Worker}
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or_class_f32_2:
435*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
436*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 7{{$}}
437*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
438*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
439*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or_class_f32_2(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 {
440*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
441*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
442*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
443*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.in
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard Worker  %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 7) #1
446*9880d681SAndroid Build Coastguard Worker  %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 7) #1
447*9880d681SAndroid Build Coastguard Worker  %or = or i1 %class0, %class1
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %or to i32
450*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
451*9880d681SAndroid Build Coastguard Worker  ret void
452*9880d681SAndroid Build Coastguard Worker}
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_no_fold_or_class_f32_0:
455*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 4{{$}}
456*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, s{{[0-9]+}}, 8{{$}}
457*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64
458*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
459*9880d681SAndroid Build Coastguard Workerdefine void @test_no_fold_or_class_f32_0(i32 addrspace(1)* %out, float addrspace(1)* %in, float %b) #0 {
460*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
461*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
462*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
463*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.in
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker  %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 4) #1
466*9880d681SAndroid Build Coastguard Worker  %class1 = call i1 @llvm.amdgcn.class.f32(float %b, i32 8) #1
467*9880d681SAndroid Build Coastguard Worker  %or = or i1 %class0, %class1
468*9880d681SAndroid Build Coastguard Worker
469*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %or to i32
470*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
471*9880d681SAndroid Build Coastguard Worker  ret void
472*9880d681SAndroid Build Coastguard Worker}
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_0_f32:
475*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
476*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}}
477*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]]
478*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
479*9880d681SAndroid Build Coastguard Workerdefine void @test_class_0_f32(i32 addrspace(1)* %out, float %a) #0 {
480*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 0) #1
481*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
482*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
483*9880d681SAndroid Build Coastguard Worker  ret void
484*9880d681SAndroid Build Coastguard Worker}
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_0_f64:
487*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
488*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}}
489*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]]
490*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
491*9880d681SAndroid Build Coastguard Workerdefine void @test_class_0_f64(i32 addrspace(1)* %out, double %a) #0 {
492*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 0) #1
493*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
494*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
495*9880d681SAndroid Build Coastguard Worker  ret void
496*9880d681SAndroid Build Coastguard Worker}
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Worker; FIXME: Why is the extension still here?
499*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_undef_f32:
500*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class
501*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 v{{[0-9]+}}, 0, -1,
502*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword
503*9880d681SAndroid Build Coastguard Workerdefine void @test_class_undef_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 {
504*9880d681SAndroid Build Coastguard Worker  %result = call i1 @llvm.amdgcn.class.f32(float undef, i32 %b) #1
505*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %result to i32
506*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
507*9880d681SAndroid Build Coastguard Worker  ret void
508*9880d681SAndroid Build Coastguard Worker}
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
511*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone }
512