blob: a67e54d81ce547e50049f4ccd817c415341df5a8 [file] [log] [blame]
Matt Arsenault9cd90712016-04-14 01:42:16 +00001; RUN: llc -march=amdgcn -verify-machineinstrs -mattr=-fp32-denormals,-fp64-denormals < %s | FileCheck -check-prefix=GCN -check-prefix=NODENORM %s
2; RUN: llc -march=amdgcn -verify-machineinstrs -mattr=+fp32-denormals,+fp64-denormals < %s | FileCheck -check-prefix=GCN -check-prefix=DENORM %s
3
4declare float @llvm.canonicalize.f32(float) #0
5declare double @llvm.canonicalize.f64(double) #0
6
7; GCN-LABEL: {{^}}v_test_canonicalize_var_f32:
8; GCN: v_mul_f32_e32 [[REG:v[0-9]+]], 1.0, {{v[0-9]+}}
9; GCN: buffer_store_dword [[REG]]
10define void @v_test_canonicalize_var_f32(float addrspace(1)* %out) #1 {
11 %val = load float, float addrspace(1)* %out
12 %canonicalized = call float @llvm.canonicalize.f32(float %val)
13 store float %canonicalized, float addrspace(1)* %out
14 ret void
15}
16
17; GCN-LABEL: {{^}}s_test_canonicalize_var_f32:
18; GCN: v_mul_f32_e64 [[REG:v[0-9]+]], 1.0, {{s[0-9]+}}
19; GCN: buffer_store_dword [[REG]]
20define void @s_test_canonicalize_var_f32(float addrspace(1)* %out, float %val) #1 {
21 %canonicalized = call float @llvm.canonicalize.f32(float %val)
22 store float %canonicalized, float addrspace(1)* %out
23 ret void
24}
25
26; GCN-LABEL: {{^}}test_fold_canonicalize_p0_f32:
27; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
28; GCN: buffer_store_dword [[REG]]
29define void @test_fold_canonicalize_p0_f32(float addrspace(1)* %out) #1 {
30 %canonicalized = call float @llvm.canonicalize.f32(float 0.0)
31 store float %canonicalized, float addrspace(1)* %out
32 ret void
33}
34
35; GCN-LABEL: {{^}}test_fold_canonicalize_n0_f32:
36; GCN: v_bfrev_b32_e32 [[REG:v[0-9]+]], 1{{$}}
37; GCN: buffer_store_dword [[REG]]
38define void @test_fold_canonicalize_n0_f32(float addrspace(1)* %out) #1 {
39 %canonicalized = call float @llvm.canonicalize.f32(float -0.0)
40 store float %canonicalized, float addrspace(1)* %out
41 ret void
42}
43
44; GCN-LABEL: {{^}}test_fold_canonicalize_p1_f32:
45; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 1.0{{$}}
46; GCN: buffer_store_dword [[REG]]
47define void @test_fold_canonicalize_p1_f32(float addrspace(1)* %out) #1 {
48 %canonicalized = call float @llvm.canonicalize.f32(float 1.0)
49 store float %canonicalized, float addrspace(1)* %out
50 ret void
51}
52
53; GCN-LABEL: {{^}}test_fold_canonicalize_n1_f32:
54; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], -1.0{{$}}
55; GCN: buffer_store_dword [[REG]]
56define void @test_fold_canonicalize_n1_f32(float addrspace(1)* %out) #1 {
57 %canonicalized = call float @llvm.canonicalize.f32(float -1.0)
58 store float %canonicalized, float addrspace(1)* %out
59 ret void
60}
61
62; GCN-LABEL: {{^}}test_fold_canonicalize_literal_f32:
63; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x41800000{{$}}
64; GCN: buffer_store_dword [[REG]]
65define void @test_fold_canonicalize_literal_f32(float addrspace(1)* %out) #1 {
66 %canonicalized = call float @llvm.canonicalize.f32(float 16.0)
67 store float %canonicalized, float addrspace(1)* %out
68 ret void
69}
70
71; GCN-LABEL: {{^}}test_fold_canonicalize_denormal0_f32:
72; NODENORM: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
73; DENORM: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fffff{{$}}
74; GCN: buffer_store_dword [[REG]]
75define void @test_fold_canonicalize_denormal0_f32(float addrspace(1)* %out) #1 {
76 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
77 store float %canonicalized, float addrspace(1)* %out
78 ret void
79}
80
81; GCN-LABEL: {{^}}test_fold_canonicalize_denormal1_f32:
82; NODENORM: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
83; DENORM: v_mov_b32_e32 [[REG:v[0-9]+]], 0x807fffff{{$}}
84; GCN: buffer_store_dword [[REG]]
85define void @test_fold_canonicalize_denormal1_f32(float addrspace(1)* %out) #1 {
86 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))
87 store float %canonicalized, float addrspace(1)* %out
88 ret void
89}
90
91; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_f32:
92; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
93; GCN: buffer_store_dword [[REG]]
94define void @test_fold_canonicalize_qnan_f32(float addrspace(1)* %out) #1 {
95 %canonicalized = call float @llvm.canonicalize.f32(float 0x7FF8000000000000)
96 store float %canonicalized, float addrspace(1)* %out
97 ret void
98}
99
100; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg1_f32:
101; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
102; GCN: buffer_store_dword [[REG]]
103define void @test_fold_canonicalize_qnan_value_neg1_f32(float addrspace(1)* %out) #1 {
104 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -1 to float))
105 store float %canonicalized, float addrspace(1)* %out
106 ret void
107}
108
109; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg2_f32:
110; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
111; GCN: buffer_store_dword [[REG]]
112define void @test_fold_canonicalize_qnan_value_neg2_f32(float addrspace(1)* %out) #1 {
113 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -2 to float))
114 store float %canonicalized, float addrspace(1)* %out
115 ret void
116}
117
118; GCN-LABEL: {{^}}test_fold_canonicalize_snan0_value_f32:
119; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
120; GCN: buffer_store_dword [[REG]]
121define void @test_fold_canonicalize_snan0_value_f32(float addrspace(1)* %out) #1 {
122 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2139095041 to float))
123 store float %canonicalized, float addrspace(1)* %out
124 ret void
125}
126
127; GCN-LABEL: {{^}}test_fold_canonicalize_snan1_value_f32:
128; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
129; GCN: buffer_store_dword [[REG]]
130define void @test_fold_canonicalize_snan1_value_f32(float addrspace(1)* %out) #1 {
131 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2143289343 to float))
132 store float %canonicalized, float addrspace(1)* %out
133 ret void
134}
135
136; GCN-LABEL: {{^}}test_fold_canonicalize_snan2_value_f32:
137; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
138; GCN: buffer_store_dword [[REG]]
139define void @test_fold_canonicalize_snan2_value_f32(float addrspace(1)* %out) #1 {
140 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4286578689 to float))
141 store float %canonicalized, float addrspace(1)* %out
142 ret void
143}
144
145; GCN-LABEL: {{^}}test_fold_canonicalize_snan3_value_f32:
146; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x7fc00000{{$}}
147; GCN: buffer_store_dword [[REG]]
148define void @test_fold_canonicalize_snan3_value_f32(float addrspace(1)* %out) #1 {
149 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4290772991 to float))
150 store float %canonicalized, float addrspace(1)* %out
151 ret void
152}
153
154; GCN-LABEL: {{^}}v_test_canonicalize_var_f64:
155; GCN: v_mul_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 1.0, {{v\[[0-9]+:[0-9]+\]}}
156; GCN: buffer_store_dwordx2 [[REG]]
157define void @v_test_canonicalize_var_f64(double addrspace(1)* %out) #1 {
158 %val = load double, double addrspace(1)* %out
159 %canonicalized = call double @llvm.canonicalize.f64(double %val)
160 store double %canonicalized, double addrspace(1)* %out
161 ret void
162}
163
164; GCN-LABEL: {{^}}s_test_canonicalize_var_f64:
165; GCN: v_mul_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 1.0, {{s\[[0-9]+:[0-9]+\]}}
166; GCN: buffer_store_dwordx2 [[REG]]
167define void @s_test_canonicalize_var_f64(double addrspace(1)* %out, double %val) #1 {
168 %canonicalized = call double @llvm.canonicalize.f64(double %val)
169 store double %canonicalized, double addrspace(1)* %out
170 ret void
171}
172
173; GCN-LABEL: {{^}}test_fold_canonicalize_p0_f64:
174; GCN: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
Matt Arsenault2b957b52016-05-02 20:07:26 +0000175; GCN: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000176; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
177define void @test_fold_canonicalize_p0_f64(double addrspace(1)* %out) #1 {
178 %canonicalized = call double @llvm.canonicalize.f64(double 0.0)
179 store double %canonicalized, double addrspace(1)* %out
180 ret void
181}
182
183; GCN-LABEL: {{^}}test_fold_canonicalize_n0_f64:
184; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
185; GCN-DAG: v_bfrev_b32_e32 v[[HI:[0-9]+]], 1{{$}}
186; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
187define void @test_fold_canonicalize_n0_f64(double addrspace(1)* %out) #1 {
188 %canonicalized = call double @llvm.canonicalize.f64(double -0.0)
189 store double %canonicalized, double addrspace(1)* %out
190 ret void
191}
192
193; GCN-LABEL: {{^}}test_fold_canonicalize_p1_f64:
194; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
195; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x3ff00000{{$}}
196; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
197define void @test_fold_canonicalize_p1_f64(double addrspace(1)* %out) #1 {
198 %canonicalized = call double @llvm.canonicalize.f64(double 1.0)
199 store double %canonicalized, double addrspace(1)* %out
200 ret void
201}
202
203; GCN-LABEL: {{^}}test_fold_canonicalize_n1_f64:
204; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
205; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0xbff00000{{$}}
206; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
207define void @test_fold_canonicalize_n1_f64(double addrspace(1)* %out) #1 {
208 %canonicalized = call double @llvm.canonicalize.f64(double -1.0)
209 store double %canonicalized, double addrspace(1)* %out
210 ret void
211}
212
213; GCN-LABEL: {{^}}test_fold_canonicalize_literal_f64:
214; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
215; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x40300000{{$}}
216; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
217define void @test_fold_canonicalize_literal_f64(double addrspace(1)* %out) #1 {
218 %canonicalized = call double @llvm.canonicalize.f64(double 16.0)
219 store double %canonicalized, double addrspace(1)* %out
220 ret void
221}
222
223; GCN-LABEL: {{^}}test_fold_canonicalize_denormal0_f64:
224; DENORM-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], -1{{$}}
225; DENORM-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0xfffff{{$}}
226
227; NODENORM: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
Matt Arsenault2b957b52016-05-02 20:07:26 +0000228; NODENORM: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000229; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
230define void @test_fold_canonicalize_denormal0_f64(double addrspace(1)* %out) #1 {
231 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))
232 store double %canonicalized, double addrspace(1)* %out
233 ret void
234}
235
236; GCN-LABEL: {{^}}test_fold_canonicalize_denormal1_f64:
237; DENORM-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], -1{{$}}
238; DENORM-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x800fffff{{$}}
239
240; NODENORM: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
Matt Arsenault2b957b52016-05-02 20:07:26 +0000241; NODENORM: v_mov_b32_e32 v[[HI:[0-9]+]], v[[LO]]{{$}}
Matt Arsenault9cd90712016-04-14 01:42:16 +0000242; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
243define void @test_fold_canonicalize_denormal1_f64(double addrspace(1)* %out) #1 {
244 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))
245 store double %canonicalized, double addrspace(1)* %out
246 ret void
247}
248
249; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_f64:
250; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
251; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
252; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
253define void @test_fold_canonicalize_qnan_f64(double addrspace(1)* %out) #1 {
254 %canonicalized = call double @llvm.canonicalize.f64(double 0x7FF8000000000000)
255 store double %canonicalized, double addrspace(1)* %out
256 ret void
257}
258
259; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg1_f64:
260; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
261; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
262; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
263define void @test_fold_canonicalize_qnan_value_neg1_f64(double addrspace(1)* %out) #1 {
264 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -1 to double))
265 store double %canonicalized, double addrspace(1)* %out
266 ret void
267}
268
269; GCN-LABEL: {{^}}test_fold_canonicalize_qnan_value_neg2_f64:
270; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
271; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
272; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
273define void @test_fold_canonicalize_qnan_value_neg2_f64(double addrspace(1)* %out) #1 {
274 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -2 to double))
275 store double %canonicalized, double addrspace(1)* %out
276 ret void
277}
278
279; GCN-LABEL: {{^}}test_fold_canonicalize_snan0_value_f64:
280; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
281; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
282; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
283define void @test_fold_canonicalize_snan0_value_f64(double addrspace(1)* %out) #1 {
284 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9218868437227405313 to double))
285 store double %canonicalized, double addrspace(1)* %out
286 ret void
287}
288
289; GCN-LABEL: {{^}}test_fold_canonicalize_snan1_value_f64:
290; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
291; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
292; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
293define void @test_fold_canonicalize_snan1_value_f64(double addrspace(1)* %out) #1 {
294 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9223372036854775807 to double))
295 store double %canonicalized, double addrspace(1)* %out
296 ret void
297}
298
299; GCN-LABEL: {{^}}test_fold_canonicalize_snan2_value_f64:
300; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
301; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
302; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
303define void @test_fold_canonicalize_snan2_value_f64(double addrspace(1)* %out) #1 {
304 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18442240474082181121 to double))
305 store double %canonicalized, double addrspace(1)* %out
306 ret void
307}
308
309; GCN-LABEL: {{^}}test_fold_canonicalize_snan3_value_f64:
310; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0x7ff80000{{$}}
311; GCN-DAG: v_mov_b32_e32 v[[LO:[0-9]+]], 0{{$}}
312; GCN: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
313define void @test_fold_canonicalize_snan3_value_f64(double addrspace(1)* %out) #1 {
314 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18446744073709551615 to double))
315 store double %canonicalized, double addrspace(1)* %out
316 ret void
317}
318
319attributes #0 = { nounwind readnone }
320attributes #1 = { nounwind }