blob: 2e73eb06502f53e85df1dd4dce3c6388633dbbc5 [file] [log] [blame]
Matt Arsenault7aad8fd2017-01-24 22:02:15 +00001; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=tonga -mattr=-flat-for-global -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
Matt Arsenault4bd72362016-12-10 00:39:12 +00002; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
3
4; FIXME: Merge into imm.ll
5
6; GCN-LABEL: {{^}}store_inline_imm_neg_0.0_i16:
7; SI: v_mov_b32_e32 [[REG:v[0-9]+]], 0x8000{{$}}
8; VI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xffff8000{{$}}
9; GCN: buffer_store_short [[REG]]
10define void @store_inline_imm_neg_0.0_i16(i16 addrspace(1)* %out) {
11 store volatile i16 -32768, i16 addrspace(1)* %out
12 ret void
13}
14
15; GCN-LABEL: {{^}}store_inline_imm_0.0_f16:
16; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0{{$}}
17; GCN: buffer_store_short [[REG]]
18define void @store_inline_imm_0.0_f16(half addrspace(1)* %out) {
19 store half 0.0, half addrspace(1)* %out
20 ret void
21}
22
23; GCN-LABEL: {{^}}store_imm_neg_0.0_f16:
24; SI: v_mov_b32_e32 [[REG:v[0-9]+]], 0x8000{{$}}
25; VI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xffff8000{{$}}
26; GCN: buffer_store_short [[REG]]
27define void @store_imm_neg_0.0_f16(half addrspace(1)* %out) {
28 store half -0.0, half addrspace(1)* %out
29 ret void
30}
31
32; GCN-LABEL: {{^}}store_inline_imm_0.5_f16:
33; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x3800{{$}}
34; GCN: buffer_store_short [[REG]]
35define void @store_inline_imm_0.5_f16(half addrspace(1)* %out) {
36 store half 0.5, half addrspace(1)* %out
37 ret void
38}
39
40; GCN-LABEL: {{^}}store_inline_imm_m_0.5_f16:
41; SI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xb800{{$}}
42; VI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xffffb800{{$}}
43; GCN: buffer_store_short [[REG]]
44define void @store_inline_imm_m_0.5_f16(half addrspace(1)* %out) {
45 store half -0.5, half addrspace(1)* %out
46 ret void
47}
48
49; GCN-LABEL: {{^}}store_inline_imm_1.0_f16:
50; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x3c00{{$}}
51; GCN: buffer_store_short [[REG]]
52define void @store_inline_imm_1.0_f16(half addrspace(1)* %out) {
53 store half 1.0, half addrspace(1)* %out
54 ret void
55}
56
57; GCN-LABEL: {{^}}store_inline_imm_m_1.0_f16:
58; SI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xbc00{{$}}
59; VI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xffffbc00{{$}}
60; GCN: buffer_store_short [[REG]]
61define void @store_inline_imm_m_1.0_f16(half addrspace(1)* %out) {
62 store half -1.0, half addrspace(1)* %out
63 ret void
64}
65
66; GCN-LABEL: {{^}}store_inline_imm_2.0_f16:
67; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x4000{{$}}
68; GCN: buffer_store_short [[REG]]
69define void @store_inline_imm_2.0_f16(half addrspace(1)* %out) {
70 store half 2.0, half addrspace(1)* %out
71 ret void
72}
73
74; GCN-LABEL: {{^}}store_inline_imm_m_2.0_f16:
75; SI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xc000{{$}}
76; VI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xffffc000{{$}}
77; GCN: buffer_store_short [[REG]]
78define void @store_inline_imm_m_2.0_f16(half addrspace(1)* %out) {
79 store half -2.0, half addrspace(1)* %out
80 ret void
81}
82
83; GCN-LABEL: {{^}}store_inline_imm_4.0_f16:
84; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x4400{{$}}
85; GCN: buffer_store_short [[REG]]
86define void @store_inline_imm_4.0_f16(half addrspace(1)* %out) {
87 store half 4.0, half addrspace(1)* %out
88 ret void
89}
90
91; GCN-LABEL: {{^}}store_inline_imm_m_4.0_f16:
92; SI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xc400{{$}}
93; VI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xffffc400{{$}}
94; GCN: buffer_store_short [[REG]]
95define void @store_inline_imm_m_4.0_f16(half addrspace(1)* %out) {
96 store half -4.0, half addrspace(1)* %out
97 ret void
98}
99
100
101; GCN-LABEL: {{^}}store_inline_imm_inv_2pi_f16:
102; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x3118{{$}}
103; GCN: buffer_store_short [[REG]]
104define void @store_inline_imm_inv_2pi_f16(half addrspace(1)* %out) {
105 store half 0xH3118, half addrspace(1)* %out
106 ret void
107}
108
109; GCN-LABEL: {{^}}store_inline_imm_m_inv_2pi_f16:
110; SI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xb118{{$}}
111; VI: v_mov_b32_e32 [[REG:v[0-9]+]], 0xffffb118{{$}}
112; GCN: buffer_store_short [[REG]]
113define void @store_inline_imm_m_inv_2pi_f16(half addrspace(1)* %out) {
114 store half 0xHB118, half addrspace(1)* %out
115 ret void
116}
117
118; GCN-LABEL: {{^}}store_literal_imm_f16:
119; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x6c00
120; GCN: buffer_store_short [[REG]]
121define void @store_literal_imm_f16(half addrspace(1)* %out) {
122 store half 4096.0, half addrspace(1)* %out
123 ret void
124}
125
126; GCN-LABEL: {{^}}add_inline_imm_0.0_f16:
127; VI: buffer_load_ushort [[VAL:v[0-9]+]]
128; VI: v_add_f16_e32 [[REG:v[0-9]+]], 0, [[VAL]]{{$}}
129; VI: buffer_store_short [[REG]]
130define void @add_inline_imm_0.0_f16(half addrspace(1)* %out, half %x) {
131 %y = fadd half %x, 0.0
132 store half %y, half addrspace(1)* %out
133 ret void
134}
135
136; GCN-LABEL: {{^}}add_inline_imm_0.5_f16:
137; VI: buffer_load_ushort [[VAL:v[0-9]+]]
138; VI: v_add_f16_e32 [[REG:v[0-9]+]], 0.5, [[VAL]]{{$}}
139; VI: buffer_store_short [[REG]]
140define void @add_inline_imm_0.5_f16(half addrspace(1)* %out, half %x) {
141 %y = fadd half %x, 0.5
142 store half %y, half addrspace(1)* %out
143 ret void
144}
145
146; GCN-LABEL: {{^}}add_inline_imm_neg_0.5_f16:
147; VI: buffer_load_ushort [[VAL:v[0-9]+]]
148; VI: v_add_f16_e32 [[REG:v[0-9]+]], -0.5, [[VAL]]{{$}}
149; VI: buffer_store_short [[REG]]
150define void @add_inline_imm_neg_0.5_f16(half addrspace(1)* %out, half %x) {
151 %y = fadd half %x, -0.5
152 store half %y, half addrspace(1)* %out
153 ret void
154}
155
156; GCN-LABEL: {{^}}add_inline_imm_1.0_f16:
157; VI: buffer_load_ushort [[VAL:v[0-9]+]]
158; VI: v_add_f16_e32 [[REG:v[0-9]+]], 1.0, [[VAL]]{{$}}
159; VI: buffer_store_short [[REG]]
160define void @add_inline_imm_1.0_f16(half addrspace(1)* %out, half %x) {
161 %y = fadd half %x, 1.0
162 store half %y, half addrspace(1)* %out
163 ret void
164}
165
166; GCN-LABEL: {{^}}add_inline_imm_neg_1.0_f16:
167; VI: buffer_load_ushort [[VAL:v[0-9]+]]
168; VI: v_add_f16_e32 [[REG:v[0-9]+]], -1.0, [[VAL]]{{$}}
169; VI: buffer_store_short [[REG]]
170define void @add_inline_imm_neg_1.0_f16(half addrspace(1)* %out, half %x) {
171 %y = fadd half %x, -1.0
172 store half %y, half addrspace(1)* %out
173 ret void
174}
175
176; GCN-LABEL: {{^}}add_inline_imm_2.0_f16:
177; VI: buffer_load_ushort [[VAL:v[0-9]+]]
178; VI: v_add_f16_e32 [[REG:v[0-9]+]], 2.0, [[VAL]]{{$}}
179; VI: buffer_store_short [[REG]]
180define void @add_inline_imm_2.0_f16(half addrspace(1)* %out, half %x) {
181 %y = fadd half %x, 2.0
182 store half %y, half addrspace(1)* %out
183 ret void
184}
185
186; GCN-LABEL: {{^}}add_inline_imm_neg_2.0_f16:
187; VI: buffer_load_ushort [[VAL:v[0-9]+]]
188; VI: v_add_f16_e32 [[REG:v[0-9]+]], -2.0, [[VAL]]{{$}}
189; VI: buffer_store_short [[REG]]
190define void @add_inline_imm_neg_2.0_f16(half addrspace(1)* %out, half %x) {
191 %y = fadd half %x, -2.0
192 store half %y, half addrspace(1)* %out
193 ret void
194}
195
196; GCN-LABEL: {{^}}add_inline_imm_4.0_f16:
197; VI: buffer_load_ushort [[VAL:v[0-9]+]]
198; VI: v_add_f16_e32 [[REG:v[0-9]+]], 4.0, [[VAL]]{{$}}
199; VI: buffer_store_short [[REG]]
200define void @add_inline_imm_4.0_f16(half addrspace(1)* %out, half %x) {
201 %y = fadd half %x, 4.0
202 store half %y, half addrspace(1)* %out
203 ret void
204}
205
206; GCN-LABEL: {{^}}add_inline_imm_neg_4.0_f16:
207; VI: buffer_load_ushort [[VAL:v[0-9]+]]
208; VI: v_add_f16_e32 [[REG:v[0-9]+]], -4.0, [[VAL]]{{$}}
209; VI: buffer_store_short [[REG]]
210define void @add_inline_imm_neg_4.0_f16(half addrspace(1)* %out, half %x) {
211 %y = fadd half %x, -4.0
212 store half %y, half addrspace(1)* %out
213 ret void
214}
215
216; GCN-LABEL: {{^}}commute_add_inline_imm_0.5_f16:
217; VI: buffer_load_ushort [[VAL:v[0-9]+]]
218; VI: v_add_f16_e32 [[REG:v[0-9]+]], 0.5, [[VAL]]
219; VI: buffer_store_short [[REG]]
220define void @commute_add_inline_imm_0.5_f16(half addrspace(1)* %out, half addrspace(1)* %in) {
221 %x = load half, half addrspace(1)* %in
222 %y = fadd half %x, 0.5
223 store half %y, half addrspace(1)* %out
224 ret void
225}
226
227; GCN-LABEL: {{^}}commute_add_literal_f16:
228; VI: buffer_load_ushort [[VAL:v[0-9]+]]
229; VI: v_add_f16_e32 [[REG:v[0-9]+]], 0x6400, [[VAL]]
230; VI: buffer_store_short [[REG]]
231define void @commute_add_literal_f16(half addrspace(1)* %out, half addrspace(1)* %in) {
232 %x = load half, half addrspace(1)* %in
233 %y = fadd half %x, 1024.0
234 store half %y, half addrspace(1)* %out
235 ret void
236}
237
238; GCN-LABEL: {{^}}add_inline_imm_1_f16:
239; VI: buffer_load_ushort [[VAL:v[0-9]+]]
240; VI: v_add_f16_e32 [[REG:v[0-9]+]], 1, [[VAL]]{{$}}
241; VI: buffer_store_short [[REG]]
242define void @add_inline_imm_1_f16(half addrspace(1)* %out, half %x) {
243 %y = fadd half %x, 0xH0001
244 store half %y, half addrspace(1)* %out
245 ret void
246}
247
248; GCN-LABEL: {{^}}add_inline_imm_2_f16:
249; VI: buffer_load_ushort [[VAL:v[0-9]+]]
250; VI: v_add_f16_e32 [[REG:v[0-9]+]], 2, [[VAL]]{{$}}
251; VI: buffer_store_short [[REG]]
252define void @add_inline_imm_2_f16(half addrspace(1)* %out, half %x) {
253 %y = fadd half %x, 0xH0002
254 store half %y, half addrspace(1)* %out
255 ret void
256}
257
258; GCN-LABEL: {{^}}add_inline_imm_16_f16:
259; VI: buffer_load_ushort [[VAL:v[0-9]+]]
260; VI: v_add_f16_e32 [[REG:v[0-9]+]], 16, [[VAL]]{{$}}
261; VI: buffer_store_short [[REG]]
262define void @add_inline_imm_16_f16(half addrspace(1)* %out, half %x) {
263 %y = fadd half %x, 0xH0010
264 store half %y, half addrspace(1)* %out
265 ret void
266}
267
268; GCN-LABEL: {{^}}add_inline_imm_neg_1_f16:
269; VI: buffer_load_ushort [[VAL:v[0-9]+]]
270; VI: v_add_f16_e32 [[REG:v[0-9]+]], -1, [[VAL]]{{$}}
271; VI: buffer_store_short [[REG]]
272define void @add_inline_imm_neg_1_f16(half addrspace(1)* %out, half %x) {
273 %y = fadd half %x, 0xHFFFF
274 store half %y, half addrspace(1)* %out
275 ret void
276}
277
278; GCN-LABEL: {{^}}add_inline_imm_neg_2_f16:
279; VI: buffer_load_ushort [[VAL:v[0-9]+]]
280; VI: v_add_f16_e32 [[REG:v[0-9]+]], -2, [[VAL]]{{$}}
281; VI: buffer_store_short [[REG]]
282define void @add_inline_imm_neg_2_f16(half addrspace(1)* %out, half %x) {
283 %y = fadd half %x, 0xHFFFE
284 store half %y, half addrspace(1)* %out
285 ret void
286}
287
288; GCN-LABEL: {{^}}add_inline_imm_neg_16_f16:
289; VI: buffer_load_ushort [[VAL:v[0-9]+]]
290; VI: v_add_f16_e32 [[REG:v[0-9]+]], -16, [[VAL]]{{$}}
291; VI: buffer_store_short [[REG]]
292define void @add_inline_imm_neg_16_f16(half addrspace(1)* %out, half %x) {
293 %y = fadd half %x, 0xHFFF0
294 store half %y, half addrspace(1)* %out
295 ret void
296}
297
298; GCN-LABEL: {{^}}add_inline_imm_63_f16:
299; VI: buffer_load_ushort [[VAL:v[0-9]+]]
300; VI: v_add_f16_e32 [[REG:v[0-9]+]], 63, [[VAL]]
301; VI: buffer_store_short [[REG]]
302define void @add_inline_imm_63_f16(half addrspace(1)* %out, half %x) {
303 %y = fadd half %x, 0xH003F
304 store half %y, half addrspace(1)* %out
305 ret void
306}
307
308; GCN-LABEL: {{^}}add_inline_imm_64_f16:
309; VI: buffer_load_ushort [[VAL:v[0-9]+]]
310; VI: v_add_f16_e32 [[REG:v[0-9]+]], 64, [[VAL]]
311; VI: buffer_store_short [[REG]]
312define void @add_inline_imm_64_f16(half addrspace(1)* %out, half %x) {
313 %y = fadd half %x, 0xH0040
314 store half %y, half addrspace(1)* %out
315 ret void
316}