1; RUN:  llc -amdgpu-scalarize-global-loads=false  -mtriple=amdgcn--amdhsa -mcpu=gfx1010 -mattr=-flat-for-global,-xnack -verify-machineinstrs -show-mc-encoding < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX10 %s
2; RUN:  llc -amdgpu-scalarize-global-loads=false  -mtriple=amdgcn--amdhsa -mcpu=gfx900 -mattr=-flat-for-global,-xnack -verify-machineinstrs -show-mc-encoding < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX9 %s
3; RUN:  llc -amdgpu-scalarize-global-loads=false  -mtriple=amdgcn--amdhsa -mcpu=fiji -mattr=-flat-for-global,-xnack -verify-machineinstrs -show-mc-encoding < %s | FileCheck -enable-var-scope -check-prefixes=GCN,VI %s
4; RUN:  llc -amdgpu-scalarize-global-loads=false  -mtriple=amdgcn--amdhsa -mcpu=kaveri -mattr=-flat-for-global -verify-machineinstrs -show-mc-encoding < %s | FileCheck -enable-var-scope -check-prefixes=GCN %s
5; FIXME: Merge into imm.ll
6
7; GCN-LABEL: {{^}}store_inline_imm_neg_0.0_v2i16:
8; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x80008000 ; encoding
9; GCN: buffer_store_dword [[REG]]
10define amdgpu_kernel void @store_inline_imm_neg_0.0_v2i16(<2 x i16> addrspace(1)* %out) #0 {
11  store <2 x i16> <i16 -32768, i16 -32768>, <2 x i16> addrspace(1)* %out
12  ret void
13}
14
15; GCN-LABEL: {{^}}store_inline_imm_0.0_v2f16:
16; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0 ; encoding
17; GCN: buffer_store_dword [[REG]]
18define amdgpu_kernel void @store_inline_imm_0.0_v2f16(<2 x half> addrspace(1)* %out) #0 {
19  store <2 x half> <half 0.0, half 0.0>, <2 x half> addrspace(1)* %out
20  ret void
21}
22
23; GCN-LABEL: {{^}}store_imm_neg_0.0_v2f16:
24; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x80008000 ; encoding
25; GCN: buffer_store_dword [[REG]]
26define amdgpu_kernel void @store_imm_neg_0.0_v2f16(<2 x half> addrspace(1)* %out) #0 {
27  store <2 x half> <half -0.0, half -0.0>, <2 x half> addrspace(1)* %out
28  ret void
29}
30
31; GCN-LABEL: {{^}}store_inline_imm_0.5_v2f16:
32; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x38003800 ; encoding
33; GCN: buffer_store_dword [[REG]]
34define amdgpu_kernel void @store_inline_imm_0.5_v2f16(<2 x half> addrspace(1)* %out) #0 {
35  store <2 x half> <half 0.5, half 0.5>, <2 x half> addrspace(1)* %out
36  ret void
37}
38
39; GCN-LABEL: {{^}}store_inline_imm_m_0.5_v2f16:
40; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xb800b800 ; encoding
41; GCN: buffer_store_dword [[REG]]
42define amdgpu_kernel void @store_inline_imm_m_0.5_v2f16(<2 x half> addrspace(1)* %out) #0 {
43  store <2 x half> <half -0.5, half -0.5>, <2 x half> addrspace(1)* %out
44  ret void
45}
46
47; GCN-LABEL: {{^}}store_inline_imm_1.0_v2f16:
48; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x3c003c00 ; encoding
49; GCN: buffer_store_dword [[REG]]
50define amdgpu_kernel void @store_inline_imm_1.0_v2f16(<2 x half> addrspace(1)* %out) #0 {
51  store <2 x half> <half 1.0, half 1.0>, <2 x half> addrspace(1)* %out
52  ret void
53}
54
55; GCN-LABEL: {{^}}store_inline_imm_m_1.0_v2f16:
56; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xbc00bc00 ; encoding
57; GCN: buffer_store_dword [[REG]]
58define amdgpu_kernel void @store_inline_imm_m_1.0_v2f16(<2 x half> addrspace(1)* %out) #0 {
59  store <2 x half> <half -1.0, half -1.0>, <2 x half> addrspace(1)* %out
60  ret void
61}
62
63; GCN-LABEL: {{^}}store_inline_imm_2.0_v2f16:
64; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x40004000 ; encoding
65; GCN: buffer_store_dword [[REG]]
66define amdgpu_kernel void @store_inline_imm_2.0_v2f16(<2 x half> addrspace(1)* %out) #0 {
67  store <2 x half> <half 2.0, half 2.0>, <2 x half> addrspace(1)* %out
68  ret void
69}
70
71; GCN-LABEL: {{^}}store_inline_imm_m_2.0_v2f16:
72; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xc000c000 ; encoding
73; GCN: buffer_store_dword [[REG]]
74define amdgpu_kernel void @store_inline_imm_m_2.0_v2f16(<2 x half> addrspace(1)* %out) #0 {
75  store <2 x half> <half -2.0, half -2.0>, <2 x half> addrspace(1)* %out
76  ret void
77}
78
79; GCN-LABEL: {{^}}store_inline_imm_4.0_v2f16:
80; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x44004400 ; encoding
81; GCN: buffer_store_dword [[REG]]
82define amdgpu_kernel void @store_inline_imm_4.0_v2f16(<2 x half> addrspace(1)* %out) #0 {
83  store <2 x half> <half 4.0, half 4.0>, <2 x half> addrspace(1)* %out
84  ret void
85}
86
87; GCN-LABEL: {{^}}store_inline_imm_m_4.0_v2f16:
88; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xc400c400 ; encoding
89; GCN: buffer_store_dword [[REG]]
90define amdgpu_kernel void @store_inline_imm_m_4.0_v2f16(<2 x half> addrspace(1)* %out) #0 {
91  store <2 x half> <half -4.0, half -4.0>, <2 x half> addrspace(1)* %out
92  ret void
93}
94
95; GCN-LABEL: {{^}}store_inline_imm_inv_2pi_v2f16:
96; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x31183118 ; encoding
97; GCN: buffer_store_dword [[REG]]
98define amdgpu_kernel void @store_inline_imm_inv_2pi_v2f16(<2 x half> addrspace(1)* %out) #0 {
99  store <2 x half> <half 0xH3118, half 0xH3118>, <2 x half> addrspace(1)* %out
100  ret void
101}
102
103; GCN-LABEL: {{^}}store_inline_imm_m_inv_2pi_v2f16:
104; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xb118b118 ; encoding
105; GCN: buffer_store_dword [[REG]]
106define amdgpu_kernel void @store_inline_imm_m_inv_2pi_v2f16(<2 x half> addrspace(1)* %out) #0 {
107  store <2 x half> <half 0xHB118, half 0xHB118>, <2 x half> addrspace(1)* %out
108  ret void
109}
110
111; GCN-LABEL: {{^}}store_literal_imm_v2f16:
112; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x6c006c00
113; GCN: buffer_store_dword [[REG]]
114define amdgpu_kernel void @store_literal_imm_v2f16(<2 x half> addrspace(1)* %out) #0 {
115  store <2 x half> <half 4096.0, half 4096.0>, <2 x half> addrspace(1)* %out
116  ret void
117}
118
119; GCN-LABEL: {{^}}add_inline_imm_0.0_v2f16:
120; GFX9: s_load_dword [[VAL:s[0-9]+]]
121; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 0 ; encoding
122; GFX9: buffer_store_dword [[REG]]
123
124; FIXME: Shouldn't need right shift and SDWA, also extra copy
125; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
126; VI-DAG: v_mov_b32_e32 [[CONST0:v[0-9]+]], 0
127; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
128; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
129
130; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST0]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
131; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 0
132; VI: v_or_b32
133; VI: buffer_store_dword
134define amdgpu_kernel void @add_inline_imm_0.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
135  %y = fadd <2 x half> %x, <half 0.0, half 0.0>
136  store <2 x half> %y, <2 x half> addrspace(1)* %out
137  ret void
138}
139
140; GCN-LABEL: {{^}}add_inline_imm_0.5_v2f16:
141; GFX10: s_load_dword [[VAL:s[0-9]+]]
142; GFX10: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 0.5 op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x0f,0xcc,0x02,0xe0,0x01,0x08]
143; GFX10: buffer_store_dword [[REG]]
144
145; GFX9: s_load_dword [[VAL:s[0-9]+]]
146; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 0.5 op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x8f,0xd3,0x06,0xe0,0x01,0x08]
147; GFX9: buffer_store_dword [[REG]]
148
149; FIXME: Shouldn't need right shift and SDWA, also extra copy
150; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
151; VI-DAG: v_mov_b32_e32 [[CONST05:v[0-9]+]], 0x3800
152; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
153; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
154
155; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST05]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
156; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 0.5
157; VI: v_or_b32
158; VI: buffer_store_dword
159define amdgpu_kernel void @add_inline_imm_0.5_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
160  %y = fadd <2 x half> %x, <half 0.5, half 0.5>
161  store <2 x half> %y, <2 x half> addrspace(1)* %out
162  ret void
163}
164
165; GCN-LABEL: {{^}}add_inline_imm_neg_0.5_v2f16:
166; GFX10: s_load_dword [[VAL:s[0-9]+]]
167; GFX10: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -0.5 op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x0f,0xcc,0x02,0xe2,0x01,0x08]
168; GFX10: buffer_store_dword [[REG]]
169
170; GFX9: s_load_dword [[VAL:s[0-9]+]]
171; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -0.5 op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x8f,0xd3,0x06,0xe2,0x01,0x08]
172; GFX9: buffer_store_dword [[REG]]
173
174; FIXME: Shouldn't need right shift and SDWA, also extra copy
175; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
176; VI-DAG: v_mov_b32_e32 [[CONSTM05:v[0-9]+]], 0xb800
177; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
178; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
179
180; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONSTM05]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
181; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], -0.5
182; VI: v_or_b32
183; VI: buffer_store_dword
184define amdgpu_kernel void @add_inline_imm_neg_0.5_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
185  %y = fadd <2 x half> %x, <half -0.5, half -0.5>
186  store <2 x half> %y, <2 x half> addrspace(1)* %out
187  ret void
188}
189
190; GCN-LABEL: {{^}}add_inline_imm_1.0_v2f16:
191; GFX9: s_load_dword [[VAL:s[0-9]+]]
192; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 1.0 op_sel_hi:[1,0] ; encoding
193; GFX9: buffer_store_dword [[REG]]
194
195; FIXME: Shouldn't need right shift and SDWA, also extra copy
196; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
197; VI-DAG: v_mov_b32_e32 [[CONST1:v[0-9]+]], 0x3c00
198; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
199; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
200
201; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST1]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
202; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 1.0
203; VI: v_or_b32
204; VI: buffer_store_dword
205define amdgpu_kernel void @add_inline_imm_1.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
206  %y = fadd <2 x half> %x, <half 1.0, half 1.0>
207  store <2 x half> %y, <2 x half> addrspace(1)* %out
208  ret void
209}
210
211; GCN-LABEL: {{^}}add_inline_imm_neg_1.0_v2f16:
212; GFX9: s_load_dword [[VAL:s[0-9]+]]
213; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -1.0 op_sel_hi:[1,0] ; encoding
214; GFX9: buffer_store_dword [[REG]]
215
216
217; FIXME: Shouldn't need right shift and SDWA, also extra copy
218; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
219; VI-DAG: v_mov_b32_e32 [[CONST1:v[0-9]+]], 0xbc00
220; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
221; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
222
223; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST1]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
224; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], -1.0
225; VI: v_or_b32
226; VI: buffer_store_dword
227define amdgpu_kernel void @add_inline_imm_neg_1.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
228  %y = fadd <2 x half> %x, <half -1.0, half -1.0>
229  store <2 x half> %y, <2 x half> addrspace(1)* %out
230  ret void
231}
232
233; GCN-LABEL: {{^}}add_inline_imm_2.0_v2f16:
234; GFX9: s_load_dword [[VAL:s[0-9]+]]
235; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 2.0 op_sel_hi:[1,0] ; encoding
236; GFX9: buffer_store_dword [[REG]]
237
238; FIXME: Shouldn't need right shift and SDWA, also extra copy
239; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
240; VI-DAG: v_mov_b32_e32 [[CONST2:v[0-9]+]], 0x4000
241; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
242; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
243
244; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST2]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
245; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 2.0
246; VI: v_or_b32
247; VI: buffer_store_dword
248define amdgpu_kernel void @add_inline_imm_2.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
249  %y = fadd <2 x half> %x, <half 2.0, half 2.0>
250  store <2 x half> %y, <2 x half> addrspace(1)* %out
251  ret void
252}
253
254; GCN-LABEL: {{^}}add_inline_imm_neg_2.0_v2f16:
255; GFX9: s_load_dword [[VAL:s[0-9]+]]
256; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -2.0 op_sel_hi:[1,0] ; encoding
257; GFX9: buffer_store_dword [[REG]]
258
259; FIXME: Shouldn't need right shift and SDWA, also extra copy
260; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
261; VI-DAG: v_mov_b32_e32 [[CONSTM2:v[0-9]+]], 0xc000
262; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
263; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
264
265; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONSTM2]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
266; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], -2.0
267; VI: v_or_b32
268; VI: buffer_store_dword
269define amdgpu_kernel void @add_inline_imm_neg_2.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
270  %y = fadd <2 x half> %x, <half -2.0, half -2.0>
271  store <2 x half> %y, <2 x half> addrspace(1)* %out
272  ret void
273}
274
275; GCN-LABEL: {{^}}add_inline_imm_4.0_v2f16:
276; GFX9: s_load_dword [[VAL:s[0-9]+]]
277; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 4.0 op_sel_hi:[1,0] ; encoding
278; GFX9: buffer_store_dword [[REG]]
279
280; FIXME: Shouldn't need right shift and SDWA, also extra copy
281; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
282; VI-DAG: v_mov_b32_e32 [[CONST4:v[0-9]+]], 0x4400
283; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
284; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
285
286; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST4]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
287; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 4.0
288; VI: v_or_b32
289; VI: buffer_store_dword
290define amdgpu_kernel void @add_inline_imm_4.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
291  %y = fadd <2 x half> %x, <half 4.0, half 4.0>
292  store <2 x half> %y, <2 x half> addrspace(1)* %out
293  ret void
294}
295
296; GCN-LABEL: {{^}}add_inline_imm_neg_4.0_v2f16:
297; GFX9: s_load_dword [[VAL:s[0-9]+]]
298; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -4.0 op_sel_hi:[1,0] ; encoding
299; GFX9: buffer_store_dword [[REG]]
300
301; FIXME: Shouldn't need right shift and SDWA, also extra copy
302; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
303; VI-DAG: v_mov_b32_e32 [[CONSTM4:v[0-9]+]], 0xc400
304; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
305; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
306
307; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONSTM4]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
308; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], -4.0
309; VI: v_or_b32
310; VI: buffer_store_dword
311define amdgpu_kernel void @add_inline_imm_neg_4.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
312  %y = fadd <2 x half> %x, <half -4.0, half -4.0>
313  store <2 x half> %y, <2 x half> addrspace(1)* %out
314  ret void
315}
316
317; GCN-LABEL: {{^}}commute_add_inline_imm_0.5_v2f16:
318; GFX9: buffer_load_dword [[VAL:v[0-9]+]]
319; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 0.5
320; GFX9: buffer_store_dword [[REG]]
321
322; VI-DAG: v_mov_b32_e32 [[CONST05:v[0-9]+]], 0x3800
323; VI-DAG: buffer_load_dword
324; VI-NOT: and
325; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, v{{[0-9]+}}, [[CONST05]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
326; VI-DAG: v_add_f16_e32 v{{[0-9]+}}, 0.5, v{{[0-9]+}}
327; VI: v_or_b32
328; VI: buffer_store_dword
329define amdgpu_kernel void @commute_add_inline_imm_0.5_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
330  %x = load <2 x half>, <2 x half> addrspace(1)* %in
331  %y = fadd <2 x half> %x, <half 0.5, half 0.5>
332  store <2 x half> %y, <2 x half> addrspace(1)* %out
333  ret void
334}
335
336; GCN-LABEL: {{^}}commute_add_literal_v2f16:
337; GFX10: v_pk_add_f16 v0, 0x6400, v0 op_sel_hi:[0,1] ; encoding: [0x00,0x40,0x0f,0xcc,0xff,0x00,0x02,0x10,0x00,0x64,0x00,0x00]
338
339; GFX9-DAG: buffer_load_dword [[VAL:v[0-9]+]]
340; GFX9-DAG: s_movk_i32 [[K:s[0-9]+]], 0x6400 ; encoding
341; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], [[K]] op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x8f,0xd3,0x00,0x01,0x00,0x08]
342; GFX9: buffer_store_dword [[REG]]
343
344; VI-DAG: buffer_load_dword
345; VI-NOT: and
346; VI-DAG: v_add_f16_e32 v{{[0-9]+}}, 0x6400, v{{[0-9]+}}
347; gfx8 does not support sreg or imm in sdwa - this will be move then
348; VI-DAG: v_mov_b32_e32 [[VK:v[0-9]+]], 0x6400
349; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, v{{[0-9]+}}, [[VK]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
350; VI: v_or_b32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
351; VI: buffer_store_dword
352define amdgpu_kernel void @commute_add_literal_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
353  %x = load <2 x half>, <2 x half> addrspace(1)* %in
354  %y = fadd <2 x half> %x, <half 1024.0, half 1024.0>
355  store <2 x half> %y, <2 x half> addrspace(1)* %out
356  ret void
357}
358
359; GCN-LABEL: {{^}}add_inline_imm_1_v2f16:
360; GFX9: s_load_dword [[VAL:s[0-9]+]]
361; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 1 op_sel_hi:[1,0] ; encoding
362; GFX9: buffer_store_dword [[REG]]
363
364; FIXME: Shouldn't need right shift and SDWA, also extra copy
365; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
366; VI-DAG: v_mov_b32_e32 [[CONST1:v[0-9]+]], 1 ; encoding
367; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
368; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
369
370; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST1]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
371; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 1 ; encoding
372; VI: v_or_b32
373; VI: buffer_store_dword
374define amdgpu_kernel void @add_inline_imm_1_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
375  %y = fadd <2 x half> %x, <half 0xH0001, half 0xH0001>
376  store <2 x half> %y, <2 x half> addrspace(1)* %out
377  ret void
378}
379
380; GCN-LABEL: {{^}}add_inline_imm_2_v2f16:
381; GFX9: s_load_dword [[VAL:s[0-9]+]]
382; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 2 op_sel_hi:[1,0] ; encoding
383; GFX9: buffer_store_dword [[REG]]
384
385
386; FIXME: Shouldn't need right shift and SDWA, also extra copy
387; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
388; VI-DAG: v_mov_b32_e32 [[CONST2:v[0-9]+]], 2 ; encoding
389; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
390; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
391
392; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST2]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
393; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 2 ; encoding
394; VI: v_or_b32
395; VI: buffer_store_dword
396define amdgpu_kernel void @add_inline_imm_2_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
397  %y = fadd <2 x half> %x, <half 0xH0002, half 0xH0002>
398  store <2 x half> %y, <2 x half> addrspace(1)* %out
399  ret void
400}
401
402; GCN-LABEL: {{^}}add_inline_imm_16_v2f16:
403; GFX9: s_load_dword [[VAL:s[0-9]+]]
404; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 16 op_sel_hi:[1,0] ; encoding
405; GFX9: buffer_store_dword [[REG]]
406
407
408; FIXME: Shouldn't need right shift and SDWA, also extra copy
409; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
410; VI-DAG: v_mov_b32_e32 [[CONST16:v[0-9]+]], 16 ; encoding
411; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
412; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
413
414; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST16]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
415; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 16 ; encoding
416; VI: v_or_b32
417; VI: buffer_store_dword
418define amdgpu_kernel void @add_inline_imm_16_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
419  %y = fadd <2 x half> %x, <half 0xH0010, half 0xH0010>
420  store <2 x half> %y, <2 x half> addrspace(1)* %out
421  ret void
422}
423
424; GCN-LABEL: {{^}}add_inline_imm_neg_1_v2f16:
425; GFX9: s_add_i32 [[VAL:s[0-9]+]], s6, -1
426; GFX9: v_mov_b32_e32 [[REG:v[0-9]+]], [[VAL]]
427; GFX9: buffer_store_dword [[REG]]
428
429; VI: s_load_dword [[VAL:s[0-9]+]]
430; VI: s_add_i32 [[ADD:s[0-9]+]], [[VAL]], -1 ; encoding
431; VI: v_mov_b32_e32 [[REG:v[0-9]+]], [[ADD]]
432; VI: buffer_store_dword [[REG]]
433define amdgpu_kernel void @add_inline_imm_neg_1_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
434  %xbc = bitcast <2 x half> %x to i32
435  %y = add i32 %xbc, -1
436  %ybc = bitcast i32 %y to <2 x half>
437  store <2 x half> %ybc, <2 x half> addrspace(1)* %out
438  ret void
439}
440
441; GCN-LABEL: {{^}}add_inline_imm_neg_2_v2f16:
442; GFX9: s_add_i32 [[VAL:s[0-9]+]], s6, 0xfffefffe
443; GFX9: v_mov_b32_e32 [[REG:v[0-9]+]], [[VAL]]
444; GFX9: buffer_store_dword [[REG]]
445
446; VI: s_load_dword [[VAL:s[0-9]+]]
447; VI: s_add_i32 [[ADD:s[0-9]+]], [[VAL]], 0xfffefffe ; encoding
448; VI: v_mov_b32_e32 [[REG:v[0-9]+]], [[ADD]]
449; VI: buffer_store_dword [[REG]]
450define amdgpu_kernel void @add_inline_imm_neg_2_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
451  %xbc = bitcast <2 x half> %x to i32
452  %y = add i32 %xbc, 4294901758 ; 0xfffefffe
453  %ybc = bitcast i32 %y to <2 x half>
454  store <2 x half> %ybc, <2 x half> addrspace(1)* %out
455  ret void
456}
457
458; GCN-LABEL: {{^}}add_inline_imm_neg_16_v2f16:
459; GFX9: s_add_i32 [[VAL:s[0-9]+]], s6, 0xfff0fff0
460; GFX9: v_mov_b32_e32 [[REG:v[0-9]+]], [[VAL]]
461; GFX9: buffer_store_dword [[REG]]
462
463
464; VI: s_load_dword [[VAL:s[0-9]+]]
465; VI: s_add_i32 [[ADD:s[0-9]+]], [[VAL]], 0xfff0fff0 ; encoding
466; VI: v_mov_b32_e32 [[REG:v[0-9]+]], [[ADD]]
467; VI: buffer_store_dword [[REG]]
468define amdgpu_kernel void @add_inline_imm_neg_16_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
469  %xbc = bitcast <2 x half> %x to i32
470  %y = add i32 %xbc, 4293984240 ; 0xfff0fff0
471  %ybc = bitcast i32 %y to <2 x half>
472  store <2 x half> %ybc, <2 x half> addrspace(1)* %out
473  ret void
474}
475
476; GCN-LABEL: {{^}}add_inline_imm_63_v2f16:
477; GFX9: s_load_dword [[VAL:s[0-9]+]]
478; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 63
479; GFX9: buffer_store_dword [[REG]]
480
481; FIXME: Shouldn't need right shift and SDWA, also extra copy
482; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
483; VI-DAG: v_mov_b32_e32 [[CONST63:v[0-9]+]], 63
484; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
485; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
486
487; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST63]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
488; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 63
489; VI: v_or_b32
490; VI: buffer_store_dword
491define amdgpu_kernel void @add_inline_imm_63_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
492  %y = fadd <2 x half> %x, <half 0xH003F, half 0xH003F>
493  store <2 x half> %y, <2 x half> addrspace(1)* %out
494  ret void
495}
496
497; GCN-LABEL: {{^}}add_inline_imm_64_v2f16:
498; GFX9: s_load_dword [[VAL:s[0-9]+]]
499; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 64
500; GFX9: buffer_store_dword [[REG]]
501
502; FIXME: Shouldn't need right shift and SDWA, also extra copy
503; VI-DAG: s_load_dword [[VAL:s[0-9]+]]
504; VI-DAG: v_mov_b32_e32 [[CONST64:v[0-9]+]], 64
505; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16
506; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]]
507
508; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST64]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
509; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 64
510; VI: v_or_b32
511; VI: buffer_store_dword
512define amdgpu_kernel void @add_inline_imm_64_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 {
513  %y = fadd <2 x half> %x, <half 0xH0040, half 0xH0040>
514  store <2 x half> %y, <2 x half> addrspace(1)* %out
515  ret void
516}
517
518; GCN-LABEL: {{^}}mul_inline_imm_0.5_v2i16:
519; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x38003800
520; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]]
521
522; GFX10: v_pk_mul_lo_u16 v0, 0x3800, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0x38,0x00,0x00]
523define <2 x i16> @mul_inline_imm_0.5_v2i16(<2 x i16> %x) {
524  %y = mul <2 x i16> %x, bitcast (<2 x half> <half 0.5, half 0.5> to <2 x i16>)
525  ret <2 x i16> %y
526}
527
528; GCN-LABEL: {{^}}mul_inline_imm_neg_0.5_v2i16:
529; GFX9: s_mov_b32 [[K:s[0-9]+]], 0xb800b800
530; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]]
531
532; GFX10: v_pk_mul_lo_u16 v0, 0xb800, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0xb8,0x00,0x00]
533define <2 x i16> @mul_inline_imm_neg_0.5_v2i16(<2 x i16> %x) {
534  %y = mul <2 x i16> %x, bitcast (<2 x half> <half -0.5, half -0.5> to <2 x i16>)
535  ret <2 x i16> %y
536}
537
538; GCN-LABEL: {{^}}mul_inline_imm_1.0_v2i16:
539; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x3c003c00
540; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]]
541
542; GFX10: v_pk_mul_lo_u16 v0, 0x3c00, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0x3c,0x00,0x00]
543define <2 x i16> @mul_inline_imm_1.0_v2i16(<2 x i16> %x) {
544  %y = mul <2 x i16> %x, bitcast (<2 x half> <half 1.0, half 1.0> to <2 x i16>)
545  ret <2 x i16> %y
546}
547
548; GCN-LABEL: {{^}}mul_inline_imm_neg_1.0_v2i16:
549; GFX9: s_mov_b32 [[K:s[0-9]+]], 0xbc00bc00
550; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]]
551
552; GFX10: v_pk_mul_lo_u16 v0, 0xbc00, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0xbc,0x00,0x00]
553define <2 x i16> @mul_inline_imm_neg_1.0_v2i16(<2 x i16> %x) {
554  %y = mul <2 x i16> %x, bitcast (<2 x half> <half -1.0, half -1.0> to <2 x i16>)
555  ret <2 x i16> %y
556}
557
558; GCN-LABEL: {{^}}shl_inline_imm_2.0_v2i16:
559; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x40004000
560; GFX9: v_pk_lshlrev_b16 v0, v0, [[K]]
561
562; GFX10: v_pk_lshlrev_b16 v0, v0, 0x4000 op_sel_hi:[1,0] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0x40,0x00,0x00]
563define <2 x i16> @shl_inline_imm_2.0_v2i16(<2 x i16> %x) {
564  %y = shl <2 x i16> bitcast (<2 x half> <half 2.0, half 2.0> to <2 x i16>), %x
565  ret <2 x i16> %y
566}
567
568; GCN-LABEL: {{^}}shl_inline_imm_neg_2.0_v2i16:
569; GFX9: s_mov_b32 [[K:s[0-9]+]], 0xc000c000
570; GFX9: v_pk_lshlrev_b16 v0, v0, [[K]]
571
572; GFX10: v_pk_lshlrev_b16 v0, v0, 0xc000 op_sel_hi:[1,0] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0xc0,0x00,0x00]
573define <2 x i16> @shl_inline_imm_neg_2.0_v2i16(<2 x i16> %x) {
574  %y = shl <2 x i16> bitcast (<2 x half> <half -2.0, half -2.0> to <2 x i16>), %x
575  ret <2 x i16> %y
576}
577
578; GCN-LABEL: {{^}}mul_inline_imm_4.0_v2i16:
579; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x44004400
580; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]]
581
582; GFX10: v_pk_mul_lo_u16 v0, 0x4400, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0x44,0x00,0x00]
583define <2 x i16> @mul_inline_imm_4.0_v2i16(<2 x i16> %x) {
584  %y = mul <2 x i16> %x, bitcast (<2 x half> <half 4.0, half 4.0> to <2 x i16>)
585  ret <2 x i16> %y
586
587}
588
589; GCN-LABEL: {{^}}mul_inline_imm_neg_4.0_v2i16:
590; GFX9: s_mov_b32 [[K:s[0-9]+]], 0xc400c400
591; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]]
592
593; GFX10: v_pk_mul_lo_u16 v0, 0xc400, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0xc4,0x00,0x00]
594define <2 x i16> @mul_inline_imm_neg_4.0_v2i16(<2 x i16> %x) {
595  %y = mul <2 x i16> %x, bitcast (<2 x half> <half -4.0, half -4.0> to <2 x i16>)
596  ret <2 x i16> %y
597}
598
599; GCN-LABEL: {{^}}mul_inline_imm_inv2pi_v2i16:
600; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x31183118
601; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]]
602
603; GFX10: v_pk_mul_lo_u16 v0, 0x3118, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x18,0x31,0x00,0x00]
604define <2 x i16> @mul_inline_imm_inv2pi_v2i16(<2 x i16> %x) {
605  %y = mul <2 x i16> %x, bitcast (<2 x half> <half 0xH3118, half 0xH3118> to <2 x i16>)
606  ret <2 x i16> %y
607}
608
609attributes #0 = { nounwind }
610