AMDGPU: Add pass to detect used kernel features
[oota-llvm.git] / test / CodeGen / AMDGPU / imm.ll
1 ; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=CHECK %s
2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=VI -check-prefix=CHECK %s
3
4 ; Use a 64-bit value with lo bits that can be represented as an inline constant
5 ; CHECK-LABEL: {{^}}i64_imm_inline_lo:
6 ; CHECK: v_mov_b32_e32 v[[LO_VGPR:[0-9]+]], 5
7 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VGPR]]:
8 define void @i64_imm_inline_lo(i64 addrspace(1) *%out) {
9 entry:
10   store i64 1311768464867721221, i64 addrspace(1) *%out ; 0x1234567800000005
11   ret void
12 }
13
14 ; Use a 64-bit value with hi bits that can be represented as an inline constant
15 ; CHECK-LABEL: {{^}}i64_imm_inline_hi:
16 ; CHECK: v_mov_b32_e32 v[[HI_VGPR:[0-9]+]], 5
17 ; CHECK: buffer_store_dwordx2 v{{\[[0-9]+:}}[[HI_VGPR]]
18 define void @i64_imm_inline_hi(i64 addrspace(1) *%out) {
19 entry:
20   store i64 21780256376, i64 addrspace(1) *%out ; 0x0000000512345678
21   ret void
22 }
23
24 ; CHECK-LABEL: {{^}}store_imm_neg_0.0_i64:
25 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
26 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0x80000000
27 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
28 define void @store_imm_neg_0.0_i64(i64 addrspace(1) *%out) {
29   store i64 -9223372036854775808, i64 addrspace(1) *%out
30   ret void
31 }
32
33 ; CHECK-LABEL: {{^}}store_inline_imm_neg_0.0_i32:
34 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], 0x80000000
35 ; CHECK: buffer_store_dword [[REG]]
36 define void @store_inline_imm_neg_0.0_i32(i32 addrspace(1)* %out) {
37   store i32 -2147483648, i32 addrspace(1)* %out
38   ret void
39 }
40
41 ; CHECK-LABEL: {{^}}store_inline_imm_0.0_f32:
42 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
43 ; CHECK: buffer_store_dword [[REG]]
44 define void @store_inline_imm_0.0_f32(float addrspace(1)* %out) {
45   store float 0.0, float addrspace(1)* %out
46   ret void
47 }
48
49 ; CHECK-LABEL: {{^}}store_imm_neg_0.0_f32:
50 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], 0x80000000
51 ; CHECK: buffer_store_dword [[REG]]
52 define void @store_imm_neg_0.0_f32(float addrspace(1)* %out) {
53   store float -0.0, float addrspace(1)* %out
54   ret void
55 }
56
57 ; CHECK-LABEL: {{^}}store_inline_imm_0.5_f32:
58 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], 0.5{{$}}
59 ; CHECK: buffer_store_dword [[REG]]
60 define void @store_inline_imm_0.5_f32(float addrspace(1)* %out) {
61   store float 0.5, float addrspace(1)* %out
62   ret void
63 }
64
65 ; CHECK-LABEL: {{^}}store_inline_imm_m_0.5_f32:
66 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], -0.5{{$}}
67 ; CHECK: buffer_store_dword [[REG]]
68 define void @store_inline_imm_m_0.5_f32(float addrspace(1)* %out) {
69   store float -0.5, float addrspace(1)* %out
70   ret void
71 }
72
73 ; CHECK-LABEL: {{^}}store_inline_imm_1.0_f32:
74 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], 1.0{{$}}
75 ; CHECK: buffer_store_dword [[REG]]
76 define void @store_inline_imm_1.0_f32(float addrspace(1)* %out) {
77   store float 1.0, float addrspace(1)* %out
78   ret void
79 }
80
81 ; CHECK-LABEL: {{^}}store_inline_imm_m_1.0_f32:
82 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], -1.0{{$}}
83 ; CHECK: buffer_store_dword [[REG]]
84 define void @store_inline_imm_m_1.0_f32(float addrspace(1)* %out) {
85   store float -1.0, float addrspace(1)* %out
86   ret void
87 }
88
89 ; CHECK-LABEL: {{^}}store_inline_imm_2.0_f32:
90 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], 2.0{{$}}
91 ; CHECK: buffer_store_dword [[REG]]
92 define void @store_inline_imm_2.0_f32(float addrspace(1)* %out) {
93   store float 2.0, float addrspace(1)* %out
94   ret void
95 }
96
97 ; CHECK-LABEL: {{^}}store_inline_imm_m_2.0_f32:
98 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], -2.0{{$}}
99 ; CHECK: buffer_store_dword [[REG]]
100 define void @store_inline_imm_m_2.0_f32(float addrspace(1)* %out) {
101   store float -2.0, float addrspace(1)* %out
102   ret void
103 }
104
105 ; CHECK-LABEL: {{^}}store_inline_imm_4.0_f32:
106 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], 4.0{{$}}
107 ; CHECK: buffer_store_dword [[REG]]
108 define void @store_inline_imm_4.0_f32(float addrspace(1)* %out) {
109   store float 4.0, float addrspace(1)* %out
110   ret void
111 }
112
113 ; CHECK-LABEL: {{^}}store_inline_imm_m_4.0_f32:
114 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], -4.0{{$}}
115 ; CHECK: buffer_store_dword [[REG]]
116 define void @store_inline_imm_m_4.0_f32(float addrspace(1)* %out) {
117   store float -4.0, float addrspace(1)* %out
118   ret void
119 }
120
121 ; CHECK-LABEL: {{^}}store_literal_imm_f32:
122 ; CHECK: v_mov_b32_e32 [[REG:v[0-9]+]], 0x45800000
123 ; CHECK: buffer_store_dword [[REG]]
124 define void @store_literal_imm_f32(float addrspace(1)* %out) {
125   store float 4096.0, float addrspace(1)* %out
126   ret void
127 }
128
129 ; CHECK-LABEL: {{^}}add_inline_imm_0.0_f32:
130 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
131 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 0, [[VAL]]{{$}}
132 ; CHECK: buffer_store_dword [[REG]]
133 define void @add_inline_imm_0.0_f32(float addrspace(1)* %out, float %x) {
134   %y = fadd float %x, 0.0
135   store float %y, float addrspace(1)* %out
136   ret void
137 }
138
139 ; CHECK-LABEL: {{^}}add_inline_imm_0.5_f32:
140 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
141 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 0.5, [[VAL]]{{$}}
142 ; CHECK: buffer_store_dword [[REG]]
143 define void @add_inline_imm_0.5_f32(float addrspace(1)* %out, float %x) {
144   %y = fadd float %x, 0.5
145   store float %y, float addrspace(1)* %out
146   ret void
147 }
148
149 ; CHECK-LABEL: {{^}}add_inline_imm_neg_0.5_f32:
150 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
151 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -0.5, [[VAL]]{{$}}
152 ; CHECK: buffer_store_dword [[REG]]
153 define void @add_inline_imm_neg_0.5_f32(float addrspace(1)* %out, float %x) {
154   %y = fadd float %x, -0.5
155   store float %y, float addrspace(1)* %out
156   ret void
157 }
158
159 ; CHECK-LABEL: {{^}}add_inline_imm_1.0_f32:
160 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
161 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 1.0, [[VAL]]{{$}}
162 ; CHECK: buffer_store_dword [[REG]]
163 define void @add_inline_imm_1.0_f32(float addrspace(1)* %out, float %x) {
164   %y = fadd float %x, 1.0
165   store float %y, float addrspace(1)* %out
166   ret void
167 }
168
169 ; CHECK-LABEL: {{^}}add_inline_imm_neg_1.0_f32:
170 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
171 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -1.0, [[VAL]]{{$}}
172 ; CHECK: buffer_store_dword [[REG]]
173 define void @add_inline_imm_neg_1.0_f32(float addrspace(1)* %out, float %x) {
174   %y = fadd float %x, -1.0
175   store float %y, float addrspace(1)* %out
176   ret void
177 }
178
179 ; CHECK-LABEL: {{^}}add_inline_imm_2.0_f32:
180 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
181 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 2.0, [[VAL]]{{$}}
182 ; CHECK: buffer_store_dword [[REG]]
183 define void @add_inline_imm_2.0_f32(float addrspace(1)* %out, float %x) {
184   %y = fadd float %x, 2.0
185   store float %y, float addrspace(1)* %out
186   ret void
187 }
188
189 ; CHECK-LABEL: {{^}}add_inline_imm_neg_2.0_f32:
190 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
191 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -2.0, [[VAL]]{{$}}
192 ; CHECK: buffer_store_dword [[REG]]
193 define void @add_inline_imm_neg_2.0_f32(float addrspace(1)* %out, float %x) {
194   %y = fadd float %x, -2.0
195   store float %y, float addrspace(1)* %out
196   ret void
197 }
198
199 ; CHECK-LABEL: {{^}}add_inline_imm_4.0_f32:
200 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
201 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 4.0, [[VAL]]{{$}}
202 ; CHECK: buffer_store_dword [[REG]]
203 define void @add_inline_imm_4.0_f32(float addrspace(1)* %out, float %x) {
204   %y = fadd float %x, 4.0
205   store float %y, float addrspace(1)* %out
206   ret void
207 }
208
209 ; CHECK-LABEL: {{^}}add_inline_imm_neg_4.0_f32:
210 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
211 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -4.0, [[VAL]]{{$}}
212 ; CHECK: buffer_store_dword [[REG]]
213 define void @add_inline_imm_neg_4.0_f32(float addrspace(1)* %out, float %x) {
214   %y = fadd float %x, -4.0
215   store float %y, float addrspace(1)* %out
216   ret void
217 }
218
219 ; CHECK-LABEL: {{^}}commute_add_inline_imm_0.5_f32:
220 ; CHECK: buffer_load_dword [[VAL:v[0-9]+]]
221 ; CHECK: v_add_f32_e32 [[REG:v[0-9]+]], 0.5, [[VAL]]
222 ; CHECK: buffer_store_dword [[REG]]
223 define void @commute_add_inline_imm_0.5_f32(float addrspace(1)* %out, float addrspace(1)* %in) {
224   %x = load float, float addrspace(1)* %in
225   %y = fadd float %x, 0.5
226   store float %y, float addrspace(1)* %out
227   ret void
228 }
229
230 ; CHECK-LABEL: {{^}}commute_add_literal_f32:
231 ; CHECK: buffer_load_dword [[VAL:v[0-9]+]]
232 ; CHECK: v_add_f32_e32 [[REG:v[0-9]+]], 0x44800000, [[VAL]]
233 ; CHECK: buffer_store_dword [[REG]]
234 define void @commute_add_literal_f32(float addrspace(1)* %out, float addrspace(1)* %in) {
235   %x = load float, float addrspace(1)* %in
236   %y = fadd float %x, 1024.0
237   store float %y, float addrspace(1)* %out
238   ret void
239 }
240
241 ; CHECK-LABEL: {{^}}add_inline_imm_1_f32:
242 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
243 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 1, [[VAL]]{{$}}
244 ; CHECK: buffer_store_dword [[REG]]
245 define void @add_inline_imm_1_f32(float addrspace(1)* %out, float %x) {
246   %y = fadd float %x, 0x36a0000000000000
247   store float %y, float addrspace(1)* %out
248   ret void
249 }
250
251 ; CHECK-LABEL: {{^}}add_inline_imm_2_f32:
252 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
253 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 2, [[VAL]]{{$}}
254 ; CHECK: buffer_store_dword [[REG]]
255 define void @add_inline_imm_2_f32(float addrspace(1)* %out, float %x) {
256   %y = fadd float %x, 0x36b0000000000000
257   store float %y, float addrspace(1)* %out
258   ret void
259 }
260
261 ; CHECK-LABEL: {{^}}add_inline_imm_16_f32:
262 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
263 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 16, [[VAL]]
264 ; CHECK: buffer_store_dword [[REG]]
265 define void @add_inline_imm_16_f32(float addrspace(1)* %out, float %x) {
266   %y = fadd float %x, 0x36e0000000000000
267   store float %y, float addrspace(1)* %out
268   ret void
269 }
270
271 ; CHECK-LABEL: {{^}}add_inline_imm_neg_1_f32:
272 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
273 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -1, [[VAL]]
274 ; CHECK: buffer_store_dword [[REG]]
275 define void @add_inline_imm_neg_1_f32(float addrspace(1)* %out, float %x) {
276   %y = fadd float %x, 0xffffffffe0000000
277   store float %y, float addrspace(1)* %out
278   ret void
279 }
280
281 ; CHECK-LABEL: {{^}}add_inline_imm_neg_2_f32:
282 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
283 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -2, [[VAL]]
284 ; CHECK: buffer_store_dword [[REG]]
285 define void @add_inline_imm_neg_2_f32(float addrspace(1)* %out, float %x) {
286   %y = fadd float %x, 0xffffffffc0000000
287   store float %y, float addrspace(1)* %out
288   ret void
289 }
290
291 ; CHECK-LABEL: {{^}}add_inline_imm_neg_16_f32:
292 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
293 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -16, [[VAL]]
294 ; CHECK: buffer_store_dword [[REG]]
295 define void @add_inline_imm_neg_16_f32(float addrspace(1)* %out, float %x) {
296   %y = fadd float %x, 0xfffffffe00000000
297   store float %y, float addrspace(1)* %out
298   ret void
299 }
300
301 ; CHECK-LABEL: {{^}}add_inline_imm_63_f32:
302 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
303 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 63, [[VAL]]
304 ; CHECK: buffer_store_dword [[REG]]
305 define void @add_inline_imm_63_f32(float addrspace(1)* %out, float %x) {
306   %y = fadd float %x, 0x36ff800000000000
307   store float %y, float addrspace(1)* %out
308   ret void
309 }
310
311 ; CHECK-LABEL: {{^}}add_inline_imm_64_f32:
312 ; CHECK: s_load_dword [[VAL:s[0-9]+]]
313 ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 64, [[VAL]]
314 ; CHECK: buffer_store_dword [[REG]]
315 define void @add_inline_imm_64_f32(float addrspace(1)* %out, float %x) {
316   %y = fadd float %x, 0x3700000000000000
317   store float %y, float addrspace(1)* %out
318   ret void
319 }
320
321
322 ; CHECK-LABEL: {{^}}add_inline_imm_0.0_f64:
323 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
324 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
325 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 0, [[VAL]]
326 ; CHECK: buffer_store_dwordx2 [[REG]]
327 define void @add_inline_imm_0.0_f64(double addrspace(1)* %out, double %x) {
328   %y = fadd double %x, 0.0
329   store double %y, double addrspace(1)* %out
330   ret void
331 }
332
333 ; CHECK-LABEL: {{^}}add_inline_imm_0.5_f64:
334 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
335 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
336 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 0.5, [[VAL]]
337 ; CHECK: buffer_store_dwordx2 [[REG]]
338 define void @add_inline_imm_0.5_f64(double addrspace(1)* %out, double %x) {
339   %y = fadd double %x, 0.5
340   store double %y, double addrspace(1)* %out
341   ret void
342 }
343
344 ; CHECK-LABEL: {{^}}add_inline_imm_neg_0.5_f64:
345 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
346 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
347 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -0.5, [[VAL]]
348 ; CHECK: buffer_store_dwordx2 [[REG]]
349 define void @add_inline_imm_neg_0.5_f64(double addrspace(1)* %out, double %x) {
350   %y = fadd double %x, -0.5
351   store double %y, double addrspace(1)* %out
352   ret void
353 }
354
355 ; CHECK-LABEL: {{^}}add_inline_imm_1.0_f64:
356 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
357 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
358 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 1.0, [[VAL]]
359 ; CHECK: buffer_store_dwordx2 [[REG]]
360 define void @add_inline_imm_1.0_f64(double addrspace(1)* %out, double %x) {
361   %y = fadd double %x, 1.0
362   store double %y, double addrspace(1)* %out
363   ret void
364 }
365
366 ; CHECK-LABEL: {{^}}add_inline_imm_neg_1.0_f64:
367 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
368 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
369 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -1.0, [[VAL]]
370 ; CHECK: buffer_store_dwordx2 [[REG]]
371 define void @add_inline_imm_neg_1.0_f64(double addrspace(1)* %out, double %x) {
372   %y = fadd double %x, -1.0
373   store double %y, double addrspace(1)* %out
374   ret void
375 }
376
377 ; CHECK-LABEL: {{^}}add_inline_imm_2.0_f64:
378 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
379 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
380 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 2.0, [[VAL]]
381 ; CHECK: buffer_store_dwordx2 [[REG]]
382 define void @add_inline_imm_2.0_f64(double addrspace(1)* %out, double %x) {
383   %y = fadd double %x, 2.0
384   store double %y, double addrspace(1)* %out
385   ret void
386 }
387
388 ; CHECK-LABEL: {{^}}add_inline_imm_neg_2.0_f64:
389 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
390 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
391 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -2.0, [[VAL]]
392 ; CHECK: buffer_store_dwordx2 [[REG]]
393 define void @add_inline_imm_neg_2.0_f64(double addrspace(1)* %out, double %x) {
394   %y = fadd double %x, -2.0
395   store double %y, double addrspace(1)* %out
396   ret void
397 }
398
399 ; CHECK-LABEL: {{^}}add_inline_imm_4.0_f64:
400 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
401 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
402 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 4.0, [[VAL]]
403 ; CHECK: buffer_store_dwordx2 [[REG]]
404 define void @add_inline_imm_4.0_f64(double addrspace(1)* %out, double %x) {
405   %y = fadd double %x, 4.0
406   store double %y, double addrspace(1)* %out
407   ret void
408 }
409
410 ; CHECK-LABEL: {{^}}add_inline_imm_neg_4.0_f64:
411 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
412 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
413 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -4.0, [[VAL]]
414 ; CHECK: buffer_store_dwordx2 [[REG]]
415 define void @add_inline_imm_neg_4.0_f64(double addrspace(1)* %out, double %x) {
416   %y = fadd double %x, -4.0
417   store double %y, double addrspace(1)* %out
418   ret void
419 }
420
421
422 ; CHECK-LABEL: {{^}}add_inline_imm_1_f64:
423 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
424 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
425 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 1, [[VAL]]
426 ; CHECK: buffer_store_dwordx2 [[REG]]
427 define void @add_inline_imm_1_f64(double addrspace(1)* %out, double %x) {
428   %y = fadd double %x, 0x0000000000000001
429   store double %y, double addrspace(1)* %out
430   ret void
431 }
432
433 ; CHECK-LABEL: {{^}}add_inline_imm_2_f64:
434 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
435 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
436 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 2, [[VAL]]
437 ; CHECK: buffer_store_dwordx2 [[REG]]
438 define void @add_inline_imm_2_f64(double addrspace(1)* %out, double %x) {
439   %y = fadd double %x, 0x0000000000000002
440   store double %y, double addrspace(1)* %out
441   ret void
442 }
443
444 ; CHECK-LABEL: {{^}}add_inline_imm_16_f64:
445 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
446 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
447 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 16, [[VAL]]
448 ; CHECK: buffer_store_dwordx2 [[REG]]
449 define void @add_inline_imm_16_f64(double addrspace(1)* %out, double %x) {
450   %y = fadd double %x, 0x0000000000000010
451   store double %y, double addrspace(1)* %out
452   ret void
453 }
454
455 ; CHECK-LABEL: {{^}}add_inline_imm_neg_1_f64:
456 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
457 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
458 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -1, [[VAL]]
459 ; CHECK: buffer_store_dwordx2 [[REG]]
460 define void @add_inline_imm_neg_1_f64(double addrspace(1)* %out, double %x) {
461   %y = fadd double %x, 0xffffffffffffffff
462   store double %y, double addrspace(1)* %out
463   ret void
464 }
465
466 ; CHECK-LABEL: {{^}}add_inline_imm_neg_2_f64:
467 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
468 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
469 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -2, [[VAL]]
470 ; CHECK: buffer_store_dwordx2 [[REG]]
471 define void @add_inline_imm_neg_2_f64(double addrspace(1)* %out, double %x) {
472   %y = fadd double %x, 0xfffffffffffffffe
473   store double %y, double addrspace(1)* %out
474   ret void
475 }
476
477 ; CHECK-LABEL: {{^}}add_inline_imm_neg_16_f64:
478 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
479 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
480 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -16, [[VAL]]
481 ; CHECK: buffer_store_dwordx2 [[REG]]
482 define void @add_inline_imm_neg_16_f64(double addrspace(1)* %out, double %x) {
483   %y = fadd double %x, 0xfffffffffffffff0
484   store double %y, double addrspace(1)* %out
485   ret void
486 }
487
488 ; CHECK-LABEL: {{^}}add_inline_imm_63_f64:
489 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
490 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
491 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 63, [[VAL]]
492 ; CHECK: buffer_store_dwordx2 [[REG]]
493 define void @add_inline_imm_63_f64(double addrspace(1)* %out, double %x) {
494   %y = fadd double %x, 0x000000000000003F
495   store double %y, double addrspace(1)* %out
496   ret void
497 }
498
499 ; CHECK-LABEL: {{^}}add_inline_imm_64_f64:
500 ; SI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
501 ; VI: s_load_dwordx2 [[VAL:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0x2c
502 ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 64, [[VAL]]
503 ; CHECK: buffer_store_dwordx2 [[REG]]
504 define void @add_inline_imm_64_f64(double addrspace(1)* %out, double %x) {
505   %y = fadd double %x, 0x0000000000000040
506   store double %y, double addrspace(1)* %out
507   ret void
508 }
509
510
511 ; CHECK-LABEL: {{^}}store_inline_imm_0.0_f64:
512 ; CHECK: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0
513 ; CHECK: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0
514 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
515 define void @store_inline_imm_0.0_f64(double addrspace(1)* %out) {
516   store double 0.0, double addrspace(1)* %out
517   ret void
518 }
519
520
521 ; CHECK-LABEL: {{^}}store_literal_imm_neg_0.0_f64:
522 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
523 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0x80000000
524 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
525 define void @store_literal_imm_neg_0.0_f64(double addrspace(1)* %out) {
526   store double -0.0, double addrspace(1)* %out
527   ret void
528 }
529
530 ; CHECK-LABEL: {{^}}store_inline_imm_0.5_f64:
531 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
532 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0x3fe00000
533 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
534 define void @store_inline_imm_0.5_f64(double addrspace(1)* %out) {
535   store double 0.5, double addrspace(1)* %out
536   ret void
537 }
538
539 ; CHECK-LABEL: {{^}}store_inline_imm_m_0.5_f64:
540 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
541 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0xbfe00000
542 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
543 define void @store_inline_imm_m_0.5_f64(double addrspace(1)* %out) {
544   store double -0.5, double addrspace(1)* %out
545   ret void
546 }
547
548 ; CHECK-LABEL: {{^}}store_inline_imm_1.0_f64:
549 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
550 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0x3ff00000
551 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
552 define void @store_inline_imm_1.0_f64(double addrspace(1)* %out) {
553   store double 1.0, double addrspace(1)* %out
554   ret void
555 }
556
557 ; CHECK-LABEL: {{^}}store_inline_imm_m_1.0_f64:
558 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
559 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0xbff00000
560 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
561 define void @store_inline_imm_m_1.0_f64(double addrspace(1)* %out) {
562   store double -1.0, double addrspace(1)* %out
563   ret void
564 }
565
566 ; CHECK-LABEL: {{^}}store_inline_imm_2.0_f64:
567 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
568 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 2.0
569 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
570 define void @store_inline_imm_2.0_f64(double addrspace(1)* %out) {
571   store double 2.0, double addrspace(1)* %out
572   ret void
573 }
574
575 ; CHECK-LABEL: {{^}}store_inline_imm_m_2.0_f64:
576 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
577 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], -2.0
578 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
579 define void @store_inline_imm_m_2.0_f64(double addrspace(1)* %out) {
580   store double -2.0, double addrspace(1)* %out
581   ret void
582 }
583
584 ; CHECK-LABEL: {{^}}store_inline_imm_4.0_f64:
585 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
586 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0x40100000
587 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
588 define void @store_inline_imm_4.0_f64(double addrspace(1)* %out) {
589   store double 4.0, double addrspace(1)* %out
590   ret void
591 }
592
593 ; CHECK-LABEL: {{^}}store_inline_imm_m_4.0_f64:
594 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
595 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0xc0100000
596 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
597 define void @store_inline_imm_m_4.0_f64(double addrspace(1)* %out) {
598   store double -4.0, double addrspace(1)* %out
599   ret void
600 }
601
602 ; CHECK-LABEL: {{^}}store_literal_imm_f64:
603 ; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], 0{{$}}
604 ; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], 0x40b00000
605 ; CHECK: buffer_store_dwordx2 v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}
606 define void @store_literal_imm_f64(double addrspace(1)* %out) {
607   store double 4096.0, double addrspace(1)* %out
608   ret void
609 }