1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -amdgpu-scalarize-global-loads=false  -march=amdgcn -mtriple=amdgcn-- -mcpu=verde -verify-machineinstrs | FileCheck %s --check-prefixes=SI
3; RUN: llc < %s -march=amdgcn -mtriple=amdgcn-- -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs | FileCheck %s -check-prefixes=VI
4; RUN: llc < %s -amdgpu-scalarize-global-loads=false  -march=r600 -mtriple=r600-- -mcpu=redwood -verify-machineinstrs | FileCheck %s --check-prefixes=EG
5
6declare i32 @llvm.amdgcn.workitem.id.x() #0
7
8declare i32 @llvm.amdgcn.workgroup.id.x() #0
9
10define amdgpu_kernel void @shl_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) {
11; SI-LABEL: shl_v2i32:
12; SI:       ; %bb.0:
13; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
14; SI-NEXT:    s_mov_b32 s7, 0xf000
15; SI-NEXT:    s_mov_b32 s6, -1
16; SI-NEXT:    s_mov_b32 s10, s6
17; SI-NEXT:    s_mov_b32 s11, s7
18; SI-NEXT:    s_waitcnt lgkmcnt(0)
19; SI-NEXT:    s_mov_b32 s8, s2
20; SI-NEXT:    s_mov_b32 s9, s3
21; SI-NEXT:    buffer_load_dwordx4 v[0:3], off, s[8:11], 0
22; SI-NEXT:    s_mov_b32 s4, s0
23; SI-NEXT:    s_mov_b32 s5, s1
24; SI-NEXT:    s_waitcnt vmcnt(0)
25; SI-NEXT:    v_lshl_b32_e32 v1, v1, v3
26; SI-NEXT:    v_lshl_b32_e32 v0, v0, v2
27; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
28; SI-NEXT:    s_endpgm
29;
30; VI-LABEL: shl_v2i32:
31; VI:       ; %bb.0:
32; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
33; VI-NEXT:    s_waitcnt lgkmcnt(0)
34; VI-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x0
35; VI-NEXT:    s_mov_b32 s3, 0xf000
36; VI-NEXT:    s_mov_b32 s2, -1
37; VI-NEXT:    s_waitcnt lgkmcnt(0)
38; VI-NEXT:    s_lshl_b32 s5, s5, s7
39; VI-NEXT:    s_lshl_b32 s4, s4, s6
40; VI-NEXT:    v_mov_b32_e32 v0, s4
41; VI-NEXT:    v_mov_b32_e32 v1, s5
42; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
43; VI-NEXT:    s_endpgm
44;
45; EG-LABEL: shl_v2i32:
46; EG:       ; %bb.0:
47; EG-NEXT:    ALU 0, @8, KC0[CB0:0-32], KC1[]
48; EG-NEXT:    TEX 0 @6
49; EG-NEXT:    ALU 3, @9, KC0[CB0:0-32], KC1[]
50; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
51; EG-NEXT:    CF_END
52; EG-NEXT:    PAD
53; EG-NEXT:    Fetch clause starting at 6:
54; EG-NEXT:     VTX_READ_128 T0.XYZW, T0.X, 0, #1
55; EG-NEXT:    ALU clause starting at 8:
56; EG-NEXT:     MOV * T0.X, KC0[2].Z,
57; EG-NEXT:    ALU clause starting at 9:
58; EG-NEXT:     LSHL * T0.Y, T0.Y, T0.W,
59; EG-NEXT:     LSHL T0.X, T0.X, T0.Z,
60; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
61; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
62  %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1
63  %a = load <2 x i32>, <2 x i32> addrspace(1)* %in
64  %b = load <2 x i32>, <2 x i32> addrspace(1)* %b_ptr
65  %result = shl <2 x i32> %a, %b
66  store <2 x i32> %result, <2 x i32> addrspace(1)* %out
67  ret void
68}
69
70define amdgpu_kernel void @shl_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
71; SI-LABEL: shl_v4i32:
72; SI:       ; %bb.0:
73; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
74; SI-NEXT:    s_mov_b32 s7, 0xf000
75; SI-NEXT:    s_mov_b32 s6, -1
76; SI-NEXT:    s_mov_b32 s10, s6
77; SI-NEXT:    s_mov_b32 s11, s7
78; SI-NEXT:    s_waitcnt lgkmcnt(0)
79; SI-NEXT:    s_mov_b32 s8, s2
80; SI-NEXT:    s_mov_b32 s9, s3
81; SI-NEXT:    buffer_load_dwordx4 v[0:3], off, s[8:11], 0
82; SI-NEXT:    buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16
83; SI-NEXT:    s_mov_b32 s4, s0
84; SI-NEXT:    s_mov_b32 s5, s1
85; SI-NEXT:    s_waitcnt vmcnt(0)
86; SI-NEXT:    v_lshl_b32_e32 v3, v3, v7
87; SI-NEXT:    v_lshl_b32_e32 v2, v2, v6
88; SI-NEXT:    v_lshl_b32_e32 v1, v1, v5
89; SI-NEXT:    v_lshl_b32_e32 v0, v0, v4
90; SI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[4:7], 0
91; SI-NEXT:    s_endpgm
92;
93; VI-LABEL: shl_v4i32:
94; VI:       ; %bb.0:
95; VI-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x24
96; VI-NEXT:    s_waitcnt lgkmcnt(0)
97; VI-NEXT:    s_load_dwordx8 s[0:7], s[10:11], 0x0
98; VI-NEXT:    s_mov_b32 s11, 0xf000
99; VI-NEXT:    s_mov_b32 s10, -1
100; VI-NEXT:    s_waitcnt lgkmcnt(0)
101; VI-NEXT:    s_lshl_b32 s3, s3, s7
102; VI-NEXT:    s_lshl_b32 s2, s2, s6
103; VI-NEXT:    s_lshl_b32 s1, s1, s5
104; VI-NEXT:    s_lshl_b32 s0, s0, s4
105; VI-NEXT:    v_mov_b32_e32 v0, s0
106; VI-NEXT:    v_mov_b32_e32 v1, s1
107; VI-NEXT:    v_mov_b32_e32 v2, s2
108; VI-NEXT:    v_mov_b32_e32 v3, s3
109; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[8:11], 0
110; VI-NEXT:    s_endpgm
111;
112; EG-LABEL: shl_v4i32:
113; EG:       ; %bb.0:
114; EG-NEXT:    ALU 0, @10, KC0[CB0:0-32], KC1[]
115; EG-NEXT:    TEX 1 @6
116; EG-NEXT:    ALU 5, @11, KC0[CB0:0-32], KC1[]
117; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XYZW, T1.X, 1
118; EG-NEXT:    CF_END
119; EG-NEXT:    PAD
120; EG-NEXT:    Fetch clause starting at 6:
121; EG-NEXT:     VTX_READ_128 T1.XYZW, T0.X, 16, #1
122; EG-NEXT:     VTX_READ_128 T0.XYZW, T0.X, 0, #1
123; EG-NEXT:    ALU clause starting at 10:
124; EG-NEXT:     MOV * T0.X, KC0[2].Z,
125; EG-NEXT:    ALU clause starting at 11:
126; EG-NEXT:     LSHL * T0.W, T0.W, T1.W,
127; EG-NEXT:     LSHL * T0.Z, T0.Z, T1.Z,
128; EG-NEXT:     LSHL * T0.Y, T0.Y, T1.Y,
129; EG-NEXT:     LSHL T0.X, T0.X, T1.X,
130; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
131; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
132  %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1
133  %a = load <4 x i32>, <4 x i32> addrspace(1)* %in
134  %b = load <4 x i32>, <4 x i32> addrspace(1)* %b_ptr
135  %result = shl <4 x i32> %a, %b
136  store <4 x i32> %result, <4 x i32> addrspace(1)* %out
137  ret void
138}
139
140define amdgpu_kernel void @shl_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
141; SI-LABEL: shl_i16:
142; SI:       ; %bb.0:
143; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
144; SI-NEXT:    s_mov_b32 s7, 0xf000
145; SI-NEXT:    s_mov_b32 s6, -1
146; SI-NEXT:    s_mov_b32 s10, s6
147; SI-NEXT:    s_mov_b32 s11, s7
148; SI-NEXT:    s_waitcnt lgkmcnt(0)
149; SI-NEXT:    s_mov_b32 s8, s2
150; SI-NEXT:    s_mov_b32 s9, s3
151; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
152; SI-NEXT:    buffer_load_ushort v1, off, s[8:11], 0 offset:2
153; SI-NEXT:    s_mov_b32 s4, s0
154; SI-NEXT:    s_mov_b32 s5, s1
155; SI-NEXT:    s_waitcnt vmcnt(0)
156; SI-NEXT:    v_lshlrev_b32_e32 v0, v1, v0
157; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
158; SI-NEXT:    s_endpgm
159;
160; VI-LABEL: shl_i16:
161; VI:       ; %bb.0:
162; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
163; VI-NEXT:    s_mov_b32 s7, 0xf000
164; VI-NEXT:    s_mov_b32 s6, -1
165; VI-NEXT:    s_mov_b32 s10, s6
166; VI-NEXT:    s_mov_b32 s11, s7
167; VI-NEXT:    s_waitcnt lgkmcnt(0)
168; VI-NEXT:    s_mov_b32 s8, s2
169; VI-NEXT:    s_mov_b32 s9, s3
170; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
171; VI-NEXT:    buffer_load_ushort v1, off, s[8:11], 0 offset:2
172; VI-NEXT:    s_mov_b32 s4, s0
173; VI-NEXT:    s_mov_b32 s5, s1
174; VI-NEXT:    s_waitcnt vmcnt(0)
175; VI-NEXT:    v_lshlrev_b32_e32 v0, v1, v0
176; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
177; VI-NEXT:    s_endpgm
178;
179; EG-LABEL: shl_i16:
180; EG:       ; %bb.0:
181; EG-NEXT:    ALU 0, @10, KC0[CB0:0-32], KC1[]
182; EG-NEXT:    TEX 1 @6
183; EG-NEXT:    ALU 12, @11, KC0[CB0:0-32], KC1[]
184; EG-NEXT:    MEM_RAT MSKOR T0.XW, T1.X
185; EG-NEXT:    CF_END
186; EG-NEXT:    PAD
187; EG-NEXT:    Fetch clause starting at 6:
188; EG-NEXT:     VTX_READ_16 T1.X, T0.X, 2, #1
189; EG-NEXT:     VTX_READ_16 T0.X, T0.X, 0, #1
190; EG-NEXT:    ALU clause starting at 10:
191; EG-NEXT:     MOV * T0.X, KC0[2].Z,
192; EG-NEXT:    ALU clause starting at 11:
193; EG-NEXT:     AND_INT T0.W, KC0[2].Y, literal.x,
194; EG-NEXT:     LSHL * T1.W, T0.X, T1.X,
195; EG-NEXT:    3(4.203895e-45), 0(0.000000e+00)
196; EG-NEXT:     AND_INT T1.W, PS, literal.x,
197; EG-NEXT:     LSHL * T0.W, PV.W, literal.y,
198; EG-NEXT:    65535(9.183409e-41), 3(4.203895e-45)
199; EG-NEXT:     LSHL T0.X, PV.W, PS,
200; EG-NEXT:     LSHL * T0.W, literal.x, PS,
201; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
202; EG-NEXT:     MOV T0.Y, 0.0,
203; EG-NEXT:     MOV * T0.Z, 0.0,
204; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
205; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
206  %b_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1
207  %a = load i16, i16 addrspace(1)* %in
208  %b = load i16, i16 addrspace(1)* %b_ptr
209  %result = shl i16 %a, %b
210  store i16 %result, i16 addrspace(1)* %out
211  ret void
212}
213
214define amdgpu_kernel void @shl_i16_v_s(i16 addrspace(1)* %out, i16 addrspace(1)* %in, i16 %b) {
215; SI-LABEL: shl_i16_v_s:
216; SI:       ; %bb.0:
217; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
218; SI-NEXT:    s_load_dword s12, s[0:1], 0xd
219; SI-NEXT:    s_mov_b32 s3, 0xf000
220; SI-NEXT:    s_mov_b32 s2, -1
221; SI-NEXT:    s_mov_b32 s10, s2
222; SI-NEXT:    s_waitcnt lgkmcnt(0)
223; SI-NEXT:    s_mov_b32 s8, s6
224; SI-NEXT:    s_mov_b32 s9, s7
225; SI-NEXT:    s_mov_b32 s11, s3
226; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
227; SI-NEXT:    s_mov_b32 s0, s4
228; SI-NEXT:    s_mov_b32 s1, s5
229; SI-NEXT:    s_waitcnt vmcnt(0)
230; SI-NEXT:    v_lshlrev_b32_e32 v0, s12, v0
231; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0
232; SI-NEXT:    s_endpgm
233;
234; VI-LABEL: shl_i16_v_s:
235; VI:       ; %bb.0:
236; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
237; VI-NEXT:    s_load_dword s12, s[0:1], 0x34
238; VI-NEXT:    s_mov_b32 s3, 0xf000
239; VI-NEXT:    s_mov_b32 s2, -1
240; VI-NEXT:    s_mov_b32 s10, s2
241; VI-NEXT:    s_waitcnt lgkmcnt(0)
242; VI-NEXT:    s_mov_b32 s8, s6
243; VI-NEXT:    s_mov_b32 s9, s7
244; VI-NEXT:    s_mov_b32 s11, s3
245; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
246; VI-NEXT:    s_mov_b32 s0, s4
247; VI-NEXT:    s_mov_b32 s1, s5
248; VI-NEXT:    s_waitcnt vmcnt(0)
249; VI-NEXT:    v_lshlrev_b32_e32 v0, s12, v0
250; VI-NEXT:    buffer_store_short v0, off, s[0:3], 0
251; VI-NEXT:    s_endpgm
252;
253; EG-LABEL: shl_i16_v_s:
254; EG:       ; %bb.0:
255; EG-NEXT:    ALU 1, @10, KC0[CB0:0-32], KC1[]
256; EG-NEXT:    TEX 1 @6
257; EG-NEXT:    ALU 12, @12, KC0[CB0:0-32], KC1[]
258; EG-NEXT:    MEM_RAT MSKOR T0.XW, T1.X
259; EG-NEXT:    CF_END
260; EG-NEXT:    PAD
261; EG-NEXT:    Fetch clause starting at 6:
262; EG-NEXT:     VTX_READ_16 T1.X, T1.X, 0, #1
263; EG-NEXT:     VTX_READ_16 T0.X, T0.X, 44, #3
264; EG-NEXT:    ALU clause starting at 10:
265; EG-NEXT:     MOV T0.X, 0.0,
266; EG-NEXT:     MOV * T1.X, KC0[2].Z,
267; EG-NEXT:    ALU clause starting at 12:
268; EG-NEXT:     AND_INT T0.W, KC0[2].Y, literal.x,
269; EG-NEXT:     LSHL * T1.W, T1.X, T0.X,
270; EG-NEXT:    3(4.203895e-45), 0(0.000000e+00)
271; EG-NEXT:     AND_INT T1.W, PS, literal.x,
272; EG-NEXT:     LSHL * T0.W, PV.W, literal.y,
273; EG-NEXT:    65535(9.183409e-41), 3(4.203895e-45)
274; EG-NEXT:     LSHL T0.X, PV.W, PS,
275; EG-NEXT:     LSHL * T0.W, literal.x, PS,
276; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
277; EG-NEXT:     MOV T0.Y, 0.0,
278; EG-NEXT:     MOV * T0.Z, 0.0,
279; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
280; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
281  %a = load i16, i16 addrspace(1)* %in
282  %result = shl i16 %a, %b
283  store i16 %result, i16 addrspace(1)* %out
284  ret void
285}
286
287define amdgpu_kernel void @shl_i16_v_compute_s(i16 addrspace(1)* %out, i16 addrspace(1)* %in, i16 %b) {
288; SI-LABEL: shl_i16_v_compute_s:
289; SI:       ; %bb.0:
290; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
291; SI-NEXT:    s_load_dword s12, s[0:1], 0xd
292; SI-NEXT:    s_mov_b32 s3, 0xf000
293; SI-NEXT:    s_mov_b32 s2, -1
294; SI-NEXT:    s_mov_b32 s10, s2
295; SI-NEXT:    s_waitcnt lgkmcnt(0)
296; SI-NEXT:    s_mov_b32 s8, s6
297; SI-NEXT:    s_mov_b32 s9, s7
298; SI-NEXT:    s_mov_b32 s11, s3
299; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
300; SI-NEXT:    s_add_i32 s12, s12, 3
301; SI-NEXT:    s_mov_b32 s0, s4
302; SI-NEXT:    s_mov_b32 s1, s5
303; SI-NEXT:    s_waitcnt vmcnt(0)
304; SI-NEXT:    v_lshlrev_b32_e32 v0, s12, v0
305; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0
306; SI-NEXT:    s_endpgm
307;
308; VI-LABEL: shl_i16_v_compute_s:
309; VI:       ; %bb.0:
310; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
311; VI-NEXT:    s_load_dword s12, s[0:1], 0x34
312; VI-NEXT:    s_mov_b32 s3, 0xf000
313; VI-NEXT:    s_mov_b32 s2, -1
314; VI-NEXT:    s_mov_b32 s10, s2
315; VI-NEXT:    s_waitcnt lgkmcnt(0)
316; VI-NEXT:    s_mov_b32 s8, s6
317; VI-NEXT:    s_mov_b32 s9, s7
318; VI-NEXT:    s_mov_b32 s11, s3
319; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
320; VI-NEXT:    s_add_i32 s12, s12, 3
321; VI-NEXT:    s_mov_b32 s0, s4
322; VI-NEXT:    s_mov_b32 s1, s5
323; VI-NEXT:    s_waitcnt vmcnt(0)
324; VI-NEXT:    v_lshlrev_b32_e32 v0, s12, v0
325; VI-NEXT:    buffer_store_short v0, off, s[0:3], 0
326; VI-NEXT:    s_endpgm
327;
328; EG-LABEL: shl_i16_v_compute_s:
329; EG:       ; %bb.0:
330; EG-NEXT:    ALU 0, @12, KC0[], KC1[]
331; EG-NEXT:    TEX 0 @8
332; EG-NEXT:    ALU 0, @13, KC0[CB0:0-32], KC1[]
333; EG-NEXT:    TEX 0 @10
334; EG-NEXT:    ALU 15, @14, KC0[CB0:0-32], KC1[]
335; EG-NEXT:    MEM_RAT MSKOR T0.XW, T1.X
336; EG-NEXT:    CF_END
337; EG-NEXT:    PAD
338; EG-NEXT:    Fetch clause starting at 8:
339; EG-NEXT:     VTX_READ_16 T0.X, T0.X, 44, #3
340; EG-NEXT:    Fetch clause starting at 10:
341; EG-NEXT:     VTX_READ_16 T1.X, T1.X, 0, #1
342; EG-NEXT:    ALU clause starting at 12:
343; EG-NEXT:     MOV * T0.X, 0.0,
344; EG-NEXT:    ALU clause starting at 13:
345; EG-NEXT:     MOV * T1.X, KC0[2].Z,
346; EG-NEXT:    ALU clause starting at 14:
347; EG-NEXT:     ADD_INT * T0.W, T0.X, literal.x,
348; EG-NEXT:    3(4.203895e-45), 0(0.000000e+00)
349; EG-NEXT:     AND_INT T0.W, PV.W, literal.x,
350; EG-NEXT:     AND_INT * T1.W, KC0[2].Y, literal.y,
351; EG-NEXT:    65535(9.183409e-41), 3(4.203895e-45)
352; EG-NEXT:     LSHL * T0.W, T1.X, PV.W,
353; EG-NEXT:     AND_INT T0.W, PV.W, literal.x,
354; EG-NEXT:     LSHL * T1.W, T1.W, literal.y,
355; EG-NEXT:    65535(9.183409e-41), 3(4.203895e-45)
356; EG-NEXT:     LSHL T0.X, PV.W, PS,
357; EG-NEXT:     LSHL * T0.W, literal.x, PS,
358; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
359; EG-NEXT:     MOV T0.Y, 0.0,
360; EG-NEXT:     MOV * T0.Z, 0.0,
361; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
362; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
363  %a = load i16, i16 addrspace(1)* %in
364  %b.add = add i16 %b, 3
365  %result = shl i16 %a, %b.add
366  store i16 %result, i16 addrspace(1)* %out
367  ret void
368}
369
370define amdgpu_kernel void @shl_i16_computed_amount(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
371; SI-LABEL: shl_i16_computed_amount:
372; SI:       ; %bb.0:
373; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
374; SI-NEXT:    s_mov_b32 s7, 0xf000
375; SI-NEXT:    s_mov_b32 s6, -1
376; SI-NEXT:    s_mov_b32 s10, s6
377; SI-NEXT:    s_mov_b32 s11, s7
378; SI-NEXT:    s_waitcnt lgkmcnt(0)
379; SI-NEXT:    s_mov_b32 s8, s2
380; SI-NEXT:    s_mov_b32 s9, s3
381; SI-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
382; SI-NEXT:    v_mov_b32_e32 v1, 0
383; SI-NEXT:    s_mov_b32 s14, 0
384; SI-NEXT:    s_mov_b32 s15, s7
385; SI-NEXT:    s_mov_b64 s[12:13], s[2:3]
386; SI-NEXT:    buffer_load_ushort v2, off, s[8:11], 0 glc
387; SI-NEXT:    s_waitcnt vmcnt(0)
388; SI-NEXT:    buffer_load_ushort v0, v[0:1], s[12:15], 0 addr64 offset:2 glc
389; SI-NEXT:    s_waitcnt vmcnt(0)
390; SI-NEXT:    s_mov_b32 s4, s0
391; SI-NEXT:    s_mov_b32 s5, s1
392; SI-NEXT:    v_add_i32_e32 v0, vcc, 3, v0
393; SI-NEXT:    v_lshlrev_b32_e32 v0, v0, v2
394; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
395; SI-NEXT:    s_endpgm
396;
397; VI-LABEL: shl_i16_computed_amount:
398; VI:       ; %bb.0:
399; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
400; VI-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
401; VI-NEXT:    s_mov_b32 s7, 0xf000
402; VI-NEXT:    s_mov_b32 s6, -1
403; VI-NEXT:    s_mov_b32 s10, s6
404; VI-NEXT:    s_waitcnt lgkmcnt(0)
405; VI-NEXT:    v_mov_b32_e32 v1, s3
406; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
407; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
408; VI-NEXT:    v_add_u32_e32 v0, vcc, 2, v0
409; VI-NEXT:    s_mov_b32 s8, s2
410; VI-NEXT:    s_mov_b32 s9, s3
411; VI-NEXT:    s_mov_b32 s11, s7
412; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
413; VI-NEXT:    buffer_load_ushort v2, off, s[8:11], 0 glc
414; VI-NEXT:    s_waitcnt vmcnt(0)
415; VI-NEXT:    flat_load_ushort v0, v[0:1] glc
416; VI-NEXT:    s_waitcnt vmcnt(0)
417; VI-NEXT:    s_mov_b32 s4, s0
418; VI-NEXT:    s_mov_b32 s5, s1
419; VI-NEXT:    v_add_u16_e32 v0, 3, v0
420; VI-NEXT:    v_lshlrev_b16_e32 v0, v0, v2
421; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
422; VI-NEXT:    s_endpgm
423;
424; EG-LABEL: shl_i16_computed_amount:
425; EG:       ; %bb.0:
426; EG-NEXT:    ALU 0, @12, KC0[CB0:0-32], KC1[]
427; EG-NEXT:    TEX 0 @8
428; EG-NEXT:    ALU 1, @13, KC0[CB0:0-32], KC1[]
429; EG-NEXT:    TEX 0 @10
430; EG-NEXT:    ALU 15, @15, KC0[CB0:0-32], KC1[]
431; EG-NEXT:    MEM_RAT MSKOR T0.XW, T1.X
432; EG-NEXT:    CF_END
433; EG-NEXT:    PAD
434; EG-NEXT:    Fetch clause starting at 8:
435; EG-NEXT:     VTX_READ_16 T1.X, T1.X, 0, #1
436; EG-NEXT:    Fetch clause starting at 10:
437; EG-NEXT:     VTX_READ_16 T0.X, T0.X, 2, #1
438; EG-NEXT:    ALU clause starting at 12:
439; EG-NEXT:     MOV * T1.X, KC0[2].Z,
440; EG-NEXT:    ALU clause starting at 13:
441; EG-NEXT:     LSHL * T0.W, T0.X, 1,
442; EG-NEXT:     ADD_INT * T0.X, KC0[2].Z, PV.W,
443; EG-NEXT:    ALU clause starting at 15:
444; EG-NEXT:     ADD_INT * T0.W, T0.X, literal.x,
445; EG-NEXT:    3(4.203895e-45), 0(0.000000e+00)
446; EG-NEXT:     AND_INT T0.W, PV.W, literal.x,
447; EG-NEXT:     AND_INT * T1.W, KC0[2].Y, literal.y,
448; EG-NEXT:    65535(9.183409e-41), 3(4.203895e-45)
449; EG-NEXT:     LSHL * T0.W, T1.X, PV.W,
450; EG-NEXT:     AND_INT T0.W, PV.W, literal.x,
451; EG-NEXT:     LSHL * T1.W, T1.W, literal.y,
452; EG-NEXT:    65535(9.183409e-41), 3(4.203895e-45)
453; EG-NEXT:     LSHL T0.X, PV.W, PS,
454; EG-NEXT:     LSHL * T0.W, literal.x, PS,
455; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
456; EG-NEXT:     MOV T0.Y, 0.0,
457; EG-NEXT:     MOV * T0.Z, 0.0,
458; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
459; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
460  %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
461  %gep = getelementptr inbounds i16, i16 addrspace(1)* %in, i32 %tid
462  %gep.out = getelementptr inbounds i16, i16 addrspace(1)* %out, i32 %tid
463  %b_ptr = getelementptr i16, i16 addrspace(1)* %gep, i16 1
464  %a = load volatile i16, i16 addrspace(1)* %in
465  %b = load volatile i16, i16 addrspace(1)* %b_ptr
466  %b.add = add i16 %b, 3
467  %result = shl i16 %a, %b.add
468  store i16 %result, i16 addrspace(1)* %out
469  ret void
470}
471
472define amdgpu_kernel void @shl_i16_i_s(i16 addrspace(1)* %out, i16 zeroext %a) {
473; SI-LABEL: shl_i16_i_s:
474; SI:       ; %bb.0:
475; SI-NEXT:    s_load_dword s4, s[0:1], 0xb
476; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
477; SI-NEXT:    s_mov_b32 s3, 0xf000
478; SI-NEXT:    s_mov_b32 s2, -1
479; SI-NEXT:    s_waitcnt lgkmcnt(0)
480; SI-NEXT:    s_lshl_b32 s4, s4, 12
481; SI-NEXT:    v_mov_b32_e32 v0, s4
482; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0
483; SI-NEXT:    s_endpgm
484;
485; VI-LABEL: shl_i16_i_s:
486; VI:       ; %bb.0:
487; VI-NEXT:    s_load_dword s4, s[0:1], 0x2c
488; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
489; VI-NEXT:    s_mov_b32 s3, 0xf000
490; VI-NEXT:    s_mov_b32 s2, -1
491; VI-NEXT:    s_waitcnt lgkmcnt(0)
492; VI-NEXT:    s_lshl_b32 s4, s4, 12
493; VI-NEXT:    v_mov_b32_e32 v0, s4
494; VI-NEXT:    buffer_store_short v0, off, s[0:3], 0
495; VI-NEXT:    s_endpgm
496;
497; EG-LABEL: shl_i16_i_s:
498; EG:       ; %bb.0:
499; EG-NEXT:    ALU 0, @8, KC0[], KC1[]
500; EG-NEXT:    TEX 0 @6
501; EG-NEXT:    ALU 14, @9, KC0[CB0:0-32], KC1[]
502; EG-NEXT:    MEM_RAT MSKOR T0.XW, T1.X
503; EG-NEXT:    CF_END
504; EG-NEXT:    PAD
505; EG-NEXT:    Fetch clause starting at 6:
506; EG-NEXT:     VTX_READ_16 T0.X, T0.X, 40, #3
507; EG-NEXT:    ALU clause starting at 8:
508; EG-NEXT:     MOV * T0.X, 0.0,
509; EG-NEXT:    ALU clause starting at 9:
510; EG-NEXT:     BFE_INT T0.W, T0.X, 0.0, literal.x,
511; EG-NEXT:     AND_INT * T1.W, KC0[2].Y, literal.y,
512; EG-NEXT:    16(2.242078e-44), 3(4.203895e-45)
513; EG-NEXT:     LSHL * T0.W, PV.W, literal.x,
514; EG-NEXT:    12(1.681558e-44), 0(0.000000e+00)
515; EG-NEXT:     AND_INT T0.W, PV.W, literal.x,
516; EG-NEXT:     LSHL * T1.W, T1.W, literal.y,
517; EG-NEXT:    61440(8.609578e-41), 3(4.203895e-45)
518; EG-NEXT:     LSHL T0.X, PV.W, PS,
519; EG-NEXT:     LSHL * T0.W, literal.x, PS,
520; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
521; EG-NEXT:     MOV T0.Y, 0.0,
522; EG-NEXT:     MOV * T0.Z, 0.0,
523; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
524; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
525  %result = shl i16 %a, 12
526  store i16 %result, i16 addrspace(1)* %out
527  ret void
528}
529
530define amdgpu_kernel void @shl_v2i16(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) {
531; SI-LABEL: shl_v2i16:
532; SI:       ; %bb.0:
533; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
534; SI-NEXT:    s_mov_b32 s7, 0xf000
535; SI-NEXT:    s_mov_b32 s6, -1
536; SI-NEXT:    s_mov_b32 s10, s6
537; SI-NEXT:    s_mov_b32 s11, s7
538; SI-NEXT:    s_waitcnt lgkmcnt(0)
539; SI-NEXT:    s_mov_b32 s8, s2
540; SI-NEXT:    s_mov_b32 s9, s3
541; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
542; SI-NEXT:    v_mov_b32_e32 v1, 0
543; SI-NEXT:    s_mov_b32 s14, 0
544; SI-NEXT:    s_mov_b32 s15, s7
545; SI-NEXT:    s_mov_b64 s[12:13], s[2:3]
546; SI-NEXT:    buffer_load_dword v2, off, s[8:11], 0
547; SI-NEXT:    buffer_load_dword v0, v[0:1], s[12:15], 0 addr64 offset:4
548; SI-NEXT:    s_mov_b32 s4, s0
549; SI-NEXT:    s_mov_b32 s5, s1
550; SI-NEXT:    s_waitcnt vmcnt(1)
551; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
552; SI-NEXT:    s_waitcnt vmcnt(0)
553; SI-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
554; SI-NEXT:    v_lshlrev_b32_e32 v0, v0, v2
555; SI-NEXT:    v_lshlrev_b32_e32 v1, v3, v1
556; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0
557; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
558; SI-NEXT:    v_or_b32_e32 v0, v0, v1
559; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
560; SI-NEXT:    s_endpgm
561;
562; VI-LABEL: shl_v2i16:
563; VI:       ; %bb.0:
564; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
565; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
566; VI-NEXT:    s_waitcnt lgkmcnt(0)
567; VI-NEXT:    v_mov_b32_e32 v1, s3
568; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
569; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
570; VI-NEXT:    v_add_u32_e32 v0, vcc, 4, v0
571; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
572; VI-NEXT:    flat_load_dword v0, v[0:1]
573; VI-NEXT:    s_load_dword s4, s[2:3], 0x0
574; VI-NEXT:    s_mov_b32 s3, 0xf000
575; VI-NEXT:    s_mov_b32 s2, -1
576; VI-NEXT:    s_waitcnt lgkmcnt(0)
577; VI-NEXT:    s_lshr_b32 s5, s4, 16
578; VI-NEXT:    v_mov_b32_e32 v1, s5
579; VI-NEXT:    s_waitcnt vmcnt(0)
580; VI-NEXT:    v_lshlrev_b16_e64 v2, v0, s4
581; VI-NEXT:    v_lshlrev_b16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
582; VI-NEXT:    v_or_b32_e32 v0, v2, v0
583; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
584; VI-NEXT:    s_endpgm
585;
586; EG-LABEL: shl_v2i16:
587; EG:       ; %bb.0:
588; EG-NEXT:    ALU 2, @12, KC0[CB0:0-32], KC1[]
589; EG-NEXT:    TEX 0 @8
590; EG-NEXT:    ALU 0, @15, KC0[CB0:0-32], KC1[]
591; EG-NEXT:    TEX 0 @10
592; EG-NEXT:    ALU 12, @16, KC0[CB0:0-32], KC1[]
593; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.X, T7.X, 1
594; EG-NEXT:    CF_END
595; EG-NEXT:    PAD
596; EG-NEXT:    Fetch clause starting at 8:
597; EG-NEXT:     VTX_READ_32 T0.X, T0.X, 4, #1
598; EG-NEXT:    Fetch clause starting at 10:
599; EG-NEXT:     VTX_READ_32 T7.X, T7.X, 0, #1
600; EG-NEXT:    ALU clause starting at 12:
601; EG-NEXT:     LSHL * T0.W, T0.X, literal.x,
602; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
603; EG-NEXT:     ADD_INT * T0.X, KC0[2].Z, PV.W,
604; EG-NEXT:    ALU clause starting at 15:
605; EG-NEXT:     MOV * T7.X, KC0[2].Z,
606; EG-NEXT:    ALU clause starting at 16:
607; EG-NEXT:     AND_INT T0.Y, T0.X, literal.x,
608; EG-NEXT:     AND_INT T0.Z, T7.X, literal.x, BS:VEC_120/SCL_212
609; EG-NEXT:     LSHR T0.W, T0.X, literal.y,
610; EG-NEXT:     LSHR * T1.W, T7.X, literal.y,
611; EG-NEXT:    65535(9.183409e-41), 16(2.242078e-44)
612; EG-NEXT:     LSHL T0.W, PS, PV.W,
613; EG-NEXT:     LSHL * T1.W, PV.Z, PV.Y,
614; EG-NEXT:     AND_INT T1.W, PS, literal.x,
615; EG-NEXT:     LSHL * T0.W, PV.W, literal.y,
616; EG-NEXT:    65535(9.183409e-41), 16(2.242078e-44)
617; EG-NEXT:     OR_INT T0.X, PV.W, PS,
618; EG-NEXT:     LSHR * T7.X, KC0[2].Y, literal.x,
619; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
620  %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
621  %gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i32 %tid
622  %gep.out = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i32 %tid
623  %b_ptr = getelementptr <2 x i16>, <2 x i16> addrspace(1)* %gep, i16 1
624  %a = load <2 x i16>, <2 x i16> addrspace(1)* %in
625  %b = load <2 x i16>, <2 x i16> addrspace(1)* %b_ptr
626  %result = shl <2 x i16> %a, %b
627  store <2 x i16> %result, <2 x i16> addrspace(1)* %out
628  ret void
629}
630
631define amdgpu_kernel void @shl_v4i16(<4 x i16> addrspace(1)* %out, <4 x i16> addrspace(1)* %in) {
632; SI-LABEL: shl_v4i16:
633; SI:       ; %bb.0:
634; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
635; SI-NEXT:    s_mov_b32 s7, 0xf000
636; SI-NEXT:    s_mov_b32 s6, 0
637; SI-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
638; SI-NEXT:    v_mov_b32_e32 v5, 0
639; SI-NEXT:    s_waitcnt lgkmcnt(0)
640; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
641; SI-NEXT:    buffer_load_dwordx4 v[0:3], v[4:5], s[4:7], 0 addr64
642; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
643; SI-NEXT:    s_waitcnt vmcnt(0)
644; SI-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
645; SI-NEXT:    v_lshrrev_b32_e32 v7, 16, v1
646; SI-NEXT:    v_lshrrev_b32_e32 v8, 16, v2
647; SI-NEXT:    v_lshrrev_b32_e32 v9, 16, v3
648; SI-NEXT:    v_lshlrev_b32_e32 v1, v3, v1
649; SI-NEXT:    v_lshlrev_b32_e32 v0, v2, v0
650; SI-NEXT:    v_lshlrev_b32_e32 v2, v9, v7
651; SI-NEXT:    v_lshlrev_b32_e32 v3, v8, v6
652; SI-NEXT:    v_and_b32_e32 v1, 0xffff, v1
653; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0
654; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
655; SI-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
656; SI-NEXT:    v_or_b32_e32 v1, v1, v2
657; SI-NEXT:    v_or_b32_e32 v0, v0, v3
658; SI-NEXT:    buffer_store_dwordx2 v[0:1], v[4:5], s[0:3], 0 addr64
659; SI-NEXT:    s_endpgm
660;
661; VI-LABEL: shl_v4i16:
662; VI:       ; %bb.0:
663; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
664; VI-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
665; VI-NEXT:    s_waitcnt lgkmcnt(0)
666; VI-NEXT:    v_mov_b32_e32 v1, s3
667; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v4
668; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
669; VI-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
670; VI-NEXT:    v_mov_b32_e32 v5, s1
671; VI-NEXT:    v_add_u32_e32 v4, vcc, s0, v4
672; VI-NEXT:    v_addc_u32_e32 v5, vcc, 0, v5, vcc
673; VI-NEXT:    s_waitcnt vmcnt(0)
674; VI-NEXT:    v_lshlrev_b16_e32 v6, v3, v1
675; VI-NEXT:    v_lshlrev_b16_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
676; VI-NEXT:    v_lshlrev_b16_e32 v3, v2, v0
677; VI-NEXT:    v_lshlrev_b16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
678; VI-NEXT:    v_or_b32_e32 v1, v6, v1
679; VI-NEXT:    v_or_b32_e32 v0, v3, v0
680; VI-NEXT:    flat_store_dwordx2 v[4:5], v[0:1]
681; VI-NEXT:    s_endpgm
682;
683; EG-LABEL: shl_v4i16:
684; EG:       ; %bb.0:
685; EG-NEXT:    ALU 2, @8, KC0[CB0:0-32], KC1[]
686; EG-NEXT:    TEX 0 @6
687; EG-NEXT:    ALU 53, @11, KC0[CB0:0-32], KC1[]
688; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T10.XY, T0.X, 1
689; EG-NEXT:    CF_END
690; EG-NEXT:    PAD
691; EG-NEXT:    Fetch clause starting at 6:
692; EG-NEXT:     VTX_READ_128 T10.XYZW, T0.X, 0, #1
693; EG-NEXT:    ALU clause starting at 8:
694; EG-NEXT:     LSHL * T0.W, T0.X, literal.x,
695; EG-NEXT:    3(4.203895e-45), 0(0.000000e+00)
696; EG-NEXT:     ADD_INT * T0.X, KC0[2].Z, PV.W,
697; EG-NEXT:    ALU clause starting at 11:
698; EG-NEXT:     MOV T4.X, T10.X,
699; EG-NEXT:     MOV * T5.X, T10.Y,
700; EG-NEXT:     MOV T0.X, PV.X,
701; EG-NEXT:     MOV T0.Y, PS,
702; EG-NEXT:     MOV * T2.X, T10.Z,
703; EG-NEXT:     MOV T3.X, T10.W,
704; EG-NEXT:     MOV * T0.Z, T6.X,
705; EG-NEXT:     MOV * T1.Y, T2.X,
706; EG-NEXT:     AND_INT T1.W, PV.Y, literal.x,
707; EG-NEXT:     AND_INT * T2.W, T0.X, literal.x,
708; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
709; EG-NEXT:     LSHL * T1.W, PS, PV.W,
710; EG-NEXT:     AND_INT T1.W, PV.W, literal.x,
711; EG-NEXT:     AND_INT * T2.W, T0.Z, literal.y,
712; EG-NEXT:    65535(9.183409e-41), -65536(nan)
713; EG-NEXT:     OR_INT * T1.W, PS, PV.W,
714; EG-NEXT:     MOV * T0.Z, T3.X,
715; EG-NEXT:     MOV * T6.X, T1.W,
716; EG-NEXT:     MOV T1.Z, PV.X,
717; EG-NEXT:     LSHR T1.W, T1.Y, literal.x,
718; EG-NEXT:     LSHR * T2.W, T0.X, literal.x,
719; EG-NEXT:    16(2.242078e-44), 0(0.000000e+00)
720; EG-NEXT:     LSHL T1.W, PS, PV.W,
721; EG-NEXT:     AND_INT * T2.W, PV.Z, literal.x,
722; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
723; EG-NEXT:     LSHL * T1.W, PV.W, literal.x,
724; EG-NEXT:    16(2.242078e-44), 0(0.000000e+00)
725; EG-NEXT:     OR_INT * T1.W, T2.W, PV.W,
726; EG-NEXT:     MOV T6.X, PV.W,
727; EG-NEXT:     MOV * T0.X, T7.X,
728; EG-NEXT:     AND_INT T1.W, T0.Z, literal.x,
729; EG-NEXT:     AND_INT * T2.W, T0.Y, literal.x,
730; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
731; EG-NEXT:     LSHL T1.W, PS, PV.W,
732; EG-NEXT:     AND_INT * T2.W, T0.X, literal.x,
733; EG-NEXT:    -65536(nan), 0(0.000000e+00)
734; EG-NEXT:     AND_INT * T1.W, PV.W, literal.x,
735; EG-NEXT:    65535(9.183409e-41), 0(0.000000e+00)
736; EG-NEXT:     OR_INT * T1.W, T2.W, PV.W,
737; EG-NEXT:     MOV * T7.X, PV.W,
738; EG-NEXT:     MOV T0.X, PV.X,
739; EG-NEXT:     LSHR T1.W, T0.Z, literal.x,
740; EG-NEXT:     LSHR * T2.W, T0.Y, literal.x,
741; EG-NEXT:    16(2.242078e-44), 0(0.000000e+00)
742; EG-NEXT:     LSHL * T1.W, PS, PV.W,
743; EG-NEXT:     AND_INT T0.Z, T0.X, literal.x,
744; EG-NEXT:     LSHL T1.W, PV.W, literal.y,
745; EG-NEXT:     ADD_INT * T0.W, KC0[2].Y, T0.W,
746; EG-NEXT:    65535(9.183409e-41), 16(2.242078e-44)
747; EG-NEXT:     LSHR T0.X, PS, literal.x,
748; EG-NEXT:     OR_INT * T10.Y, PV.Z, PV.W,
749; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
750; EG-NEXT:     MOV T7.X, PV.Y,
751; EG-NEXT:     MOV * T10.X, T6.X,
752  %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
753  %gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %in, i32 %tid
754  %gep.out = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %out, i32 %tid
755  %b_ptr = getelementptr <4 x i16>, <4 x i16> addrspace(1)* %gep, i16 1
756  %a = load <4 x i16>, <4 x i16> addrspace(1)* %gep
757  %b = load <4 x i16>, <4 x i16> addrspace(1)* %b_ptr
758  %result = shl <4 x i16> %a, %b
759  store <4 x i16> %result, <4 x i16> addrspace(1)* %gep.out
760  ret void
761}
762
763define amdgpu_kernel void @shl_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) {
764; SI-LABEL: shl_i64:
765; SI:       ; %bb.0:
766; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
767; SI-NEXT:    s_mov_b32 s7, 0xf000
768; SI-NEXT:    s_mov_b32 s6, -1
769; SI-NEXT:    s_mov_b32 s10, s6
770; SI-NEXT:    s_mov_b32 s11, s7
771; SI-NEXT:    s_waitcnt lgkmcnt(0)
772; SI-NEXT:    s_mov_b32 s8, s2
773; SI-NEXT:    s_mov_b32 s9, s3
774; SI-NEXT:    buffer_load_dwordx4 v[0:3], off, s[8:11], 0
775; SI-NEXT:    s_mov_b32 s4, s0
776; SI-NEXT:    s_mov_b32 s5, s1
777; SI-NEXT:    s_waitcnt vmcnt(0)
778; SI-NEXT:    v_lshl_b64 v[0:1], v[0:1], v2
779; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
780; SI-NEXT:    s_endpgm
781;
782; VI-LABEL: shl_i64:
783; VI:       ; %bb.0:
784; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
785; VI-NEXT:    s_waitcnt lgkmcnt(0)
786; VI-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x0
787; VI-NEXT:    s_mov_b32 s3, 0xf000
788; VI-NEXT:    s_mov_b32 s2, -1
789; VI-NEXT:    s_waitcnt lgkmcnt(0)
790; VI-NEXT:    s_lshl_b64 s[4:5], s[4:5], s6
791; VI-NEXT:    v_mov_b32_e32 v0, s4
792; VI-NEXT:    v_mov_b32_e32 v1, s5
793; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
794; VI-NEXT:    s_endpgm
795;
796; EG-LABEL: shl_i64:
797; EG:       ; %bb.0:
798; EG-NEXT:    ALU 0, @8, KC0[CB0:0-32], KC1[]
799; EG-NEXT:    TEX 0 @6
800; EG-NEXT:    ALU 12, @9, KC0[CB0:0-32], KC1[]
801; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
802; EG-NEXT:    CF_END
803; EG-NEXT:    PAD
804; EG-NEXT:    Fetch clause starting at 6:
805; EG-NEXT:     VTX_READ_128 T0.XYZW, T0.X, 0, #1
806; EG-NEXT:    ALU clause starting at 8:
807; EG-NEXT:     MOV * T0.X, KC0[2].Z,
808; EG-NEXT:    ALU clause starting at 9:
809; EG-NEXT:     AND_INT T1.Y, T0.Z, literal.x,
810; EG-NEXT:     LSHR T1.Z, T0.Y, 1,
811; EG-NEXT:     BIT_ALIGN_INT T0.W, T0.Y, T0.X, 1,
812; EG-NEXT:     NOT_INT * T1.W, T0.Z,
813; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
814; EG-NEXT:     BIT_ALIGN_INT T1.Z, PV.Z, PV.W, PS,
815; EG-NEXT:     LSHL T0.W, T0.X, PV.Y,
816; EG-NEXT:     AND_INT * T1.W, T0.Z, literal.x,
817; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
818; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.Z, PV.W,
819; EG-NEXT:     CNDE_INT T0.X, T1.W, T0.W, 0.0,
820; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
821; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
822  %b_ptr = getelementptr i64, i64 addrspace(1)* %in, i64 1
823  %a = load i64, i64 addrspace(1)* %in
824  %b = load i64, i64 addrspace(1)* %b_ptr
825  %result = shl i64 %a, %b
826  store i64 %result, i64 addrspace(1)* %out
827  ret void
828}
829
830define amdgpu_kernel void @shl_v2i64(<2 x i64> addrspace(1)* %out, <2 x i64> addrspace(1)* %in) {
831; SI-LABEL: shl_v2i64:
832; SI:       ; %bb.0:
833; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
834; SI-NEXT:    s_mov_b32 s7, 0xf000
835; SI-NEXT:    s_mov_b32 s6, -1
836; SI-NEXT:    s_mov_b32 s10, s6
837; SI-NEXT:    s_mov_b32 s11, s7
838; SI-NEXT:    s_waitcnt lgkmcnt(0)
839; SI-NEXT:    s_mov_b32 s8, s2
840; SI-NEXT:    s_mov_b32 s9, s3
841; SI-NEXT:    buffer_load_dwordx4 v[0:3], off, s[8:11], 0
842; SI-NEXT:    buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16
843; SI-NEXT:    s_mov_b32 s4, s0
844; SI-NEXT:    s_mov_b32 s5, s1
845; SI-NEXT:    s_waitcnt vmcnt(0)
846; SI-NEXT:    v_lshl_b64 v[2:3], v[2:3], v6
847; SI-NEXT:    v_lshl_b64 v[0:1], v[0:1], v4
848; SI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[4:7], 0
849; SI-NEXT:    s_endpgm
850;
851; VI-LABEL: shl_v2i64:
852; VI:       ; %bb.0:
853; VI-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x24
854; VI-NEXT:    s_waitcnt lgkmcnt(0)
855; VI-NEXT:    s_load_dwordx8 s[0:7], s[10:11], 0x0
856; VI-NEXT:    s_mov_b32 s11, 0xf000
857; VI-NEXT:    s_mov_b32 s10, -1
858; VI-NEXT:    s_waitcnt lgkmcnt(0)
859; VI-NEXT:    s_lshl_b64 s[2:3], s[2:3], s6
860; VI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s4
861; VI-NEXT:    v_mov_b32_e32 v0, s0
862; VI-NEXT:    v_mov_b32_e32 v1, s1
863; VI-NEXT:    v_mov_b32_e32 v2, s2
864; VI-NEXT:    v_mov_b32_e32 v3, s3
865; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[8:11], 0
866; VI-NEXT:    s_endpgm
867;
868; EG-LABEL: shl_v2i64:
869; EG:       ; %bb.0:
870; EG-NEXT:    ALU 0, @10, KC0[CB0:0-32], KC1[]
871; EG-NEXT:    TEX 1 @6
872; EG-NEXT:    ALU 22, @11, KC0[CB0:0-32], KC1[]
873; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T3.XYZW, T0.X, 1
874; EG-NEXT:    CF_END
875; EG-NEXT:    PAD
876; EG-NEXT:    Fetch clause starting at 6:
877; EG-NEXT:     VTX_READ_128 T1.XYZW, T0.X, 16, #1
878; EG-NEXT:     VTX_READ_128 T0.XYZW, T0.X, 0, #1
879; EG-NEXT:    ALU clause starting at 10:
880; EG-NEXT:     MOV * T0.X, KC0[2].Z,
881; EG-NEXT:    ALU clause starting at 11:
882; EG-NEXT:     AND_INT T1.Y, T1.Z, literal.x,
883; EG-NEXT:     LSHR T2.Z, T0.W, 1,
884; EG-NEXT:     BIT_ALIGN_INT T0.W, T0.W, T0.Z, 1,
885; EG-NEXT:     NOT_INT * T1.W, T1.Z,
886; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
887; EG-NEXT:     BIT_ALIGN_INT T0.W, PV.Z, PV.W, PS,
888; EG-NEXT:     LSHL * T1.W, T0.Z, PV.Y,
889; EG-NEXT:     AND_INT T2.X, T1.Z, literal.x,
890; EG-NEXT:     AND_INT T1.Y, T1.X, literal.y,
891; EG-NEXT:     LSHR T0.Z, T0.Y, 1,
892; EG-NEXT:     BIT_ALIGN_INT T2.W, T0.Y, T0.X, 1,
893; EG-NEXT:     NOT_INT * T3.W, T1.X,
894; EG-NEXT:    32(4.484155e-44), 31(4.344025e-44)
895; EG-NEXT:     BIT_ALIGN_INT T0.Y, PV.Z, PV.W, PS,
896; EG-NEXT:     LSHL T0.Z, T0.X, PV.Y,
897; EG-NEXT:     AND_INT T2.W, T1.X, literal.x, BS:VEC_120/SCL_212
898; EG-NEXT:     CNDE_INT * T3.W, PV.X, T0.W, T1.W,
899; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
900; EG-NEXT:     CNDE_INT T3.Y, PV.W, PV.Y, PV.Z,
901; EG-NEXT:     CNDE_INT * T3.Z, T2.X, T1.W, 0.0,
902; EG-NEXT:     CNDE_INT T3.X, T2.W, T0.Z, 0.0,
903; EG-NEXT:     LSHR * T0.X, KC0[2].Y, literal.x,
904; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
905  %b_ptr = getelementptr <2 x i64>, <2 x i64> addrspace(1)* %in, i64 1
906  %a = load <2 x i64>, <2 x i64> addrspace(1)* %in
907  %b = load <2 x i64>, <2 x i64> addrspace(1)* %b_ptr
908  %result = shl <2 x i64> %a, %b
909  store <2 x i64> %result, <2 x i64> addrspace(1)* %out
910  ret void
911}
912
913define amdgpu_kernel void @shl_v4i64(<4 x i64> addrspace(1)* %out, <4 x i64> addrspace(1)* %in) {
914; SI-LABEL: shl_v4i64:
915; SI:       ; %bb.0:
916; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
917; SI-NEXT:    s_mov_b32 s3, 0xf000
918; SI-NEXT:    s_mov_b32 s2, -1
919; SI-NEXT:    s_mov_b32 s10, s2
920; SI-NEXT:    s_mov_b32 s11, s3
921; SI-NEXT:    s_waitcnt lgkmcnt(0)
922; SI-NEXT:    s_mov_b32 s8, s6
923; SI-NEXT:    s_mov_b32 s9, s7
924; SI-NEXT:    buffer_load_dwordx4 v[0:3], off, s[8:11], 0 offset:16
925; SI-NEXT:    buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:48
926; SI-NEXT:    buffer_load_dwordx4 v[7:10], off, s[8:11], 0
927; SI-NEXT:    buffer_load_dwordx4 v[11:14], off, s[8:11], 0 offset:32
928; SI-NEXT:    s_mov_b32 s0, s4
929; SI-NEXT:    s_mov_b32 s1, s5
930; SI-NEXT:    s_waitcnt vmcnt(2)
931; SI-NEXT:    v_lshl_b64 v[2:3], v[2:3], v6
932; SI-NEXT:    v_lshl_b64 v[0:1], v[0:1], v4
933; SI-NEXT:    s_waitcnt vmcnt(0)
934; SI-NEXT:    v_lshl_b64 v[9:10], v[9:10], v13
935; SI-NEXT:    v_lshl_b64 v[7:8], v[7:8], v11
936; SI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0 offset:16
937; SI-NEXT:    buffer_store_dwordx4 v[7:10], off, s[0:3], 0
938; SI-NEXT:    s_endpgm
939;
940; VI-LABEL: shl_v4i64:
941; VI:       ; %bb.0:
942; VI-NEXT:    s_load_dwordx4 s[16:19], s[0:1], 0x24
943; VI-NEXT:    s_waitcnt lgkmcnt(0)
944; VI-NEXT:    s_load_dwordx16 s[0:15], s[18:19], 0x0
945; VI-NEXT:    s_mov_b32 s19, 0xf000
946; VI-NEXT:    s_mov_b32 s18, -1
947; VI-NEXT:    s_waitcnt lgkmcnt(0)
948; VI-NEXT:    s_lshl_b64 s[6:7], s[6:7], s14
949; VI-NEXT:    s_lshl_b64 s[4:5], s[4:5], s12
950; VI-NEXT:    s_lshl_b64 s[2:3], s[2:3], s10
951; VI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s8
952; VI-NEXT:    v_mov_b32_e32 v0, s4
953; VI-NEXT:    v_mov_b32_e32 v1, s5
954; VI-NEXT:    v_mov_b32_e32 v2, s6
955; VI-NEXT:    v_mov_b32_e32 v3, s7
956; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[16:19], 0 offset:16
957; VI-NEXT:    s_nop 0
958; VI-NEXT:    v_mov_b32_e32 v0, s0
959; VI-NEXT:    v_mov_b32_e32 v1, s1
960; VI-NEXT:    v_mov_b32_e32 v2, s2
961; VI-NEXT:    v_mov_b32_e32 v3, s3
962; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[16:19], 0
963; VI-NEXT:    s_endpgm
964;
965; EG-LABEL: shl_v4i64:
966; EG:       ; %bb.0:
967; EG-NEXT:    ALU 0, @14, KC0[CB0:0-32], KC1[]
968; EG-NEXT:    TEX 3 @6
969; EG-NEXT:    ALU 47, @15, KC0[CB0:0-32], KC1[]
970; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T1.XYZW, T2.X, 0
971; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T4.XYZW, T0.X, 1
972; EG-NEXT:    CF_END
973; EG-NEXT:    Fetch clause starting at 6:
974; EG-NEXT:     VTX_READ_128 T1.XYZW, T0.X, 48, #1
975; EG-NEXT:     VTX_READ_128 T2.XYZW, T0.X, 0, #1
976; EG-NEXT:     VTX_READ_128 T3.XYZW, T0.X, 32, #1
977; EG-NEXT:     VTX_READ_128 T0.XYZW, T0.X, 16, #1
978; EG-NEXT:    ALU clause starting at 14:
979; EG-NEXT:     MOV * T0.X, KC0[2].Z,
980; EG-NEXT:    ALU clause starting at 15:
981; EG-NEXT:     AND_INT T4.Z, T1.Z, literal.x,
982; EG-NEXT:     LSHR T1.W, T0.W, 1,
983; EG-NEXT:     NOT_INT * T3.W, T1.Z,
984; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
985; EG-NEXT:     BIT_ALIGN_INT T4.X, T0.W, T0.Z, 1,
986; EG-NEXT:     AND_INT T1.Y, T3.Z, literal.x, BS:VEC_201
987; EG-NEXT:     LSHR T5.Z, T2.W, 1, BS:VEC_120/SCL_212
988; EG-NEXT:     BIT_ALIGN_INT T0.W, T2.W, T2.Z, 1, BS:VEC_102/SCL_221
989; EG-NEXT:     NOT_INT * T2.W, T3.Z,
990; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
991; EG-NEXT:     BIT_ALIGN_INT T3.Y, PV.Z, PV.W, PS,
992; EG-NEXT:     LSHL T2.Z, T2.Z, PV.Y,
993; EG-NEXT:     BIT_ALIGN_INT T0.W, T1.W, PV.X, T3.W,
994; EG-NEXT:     LSHL * T1.W, T0.Z, T4.Z,
995; EG-NEXT:     AND_INT T4.X, T1.Z, literal.x,
996; EG-NEXT:     AND_INT T1.Y, T1.X, literal.y,
997; EG-NEXT:     LSHR T0.Z, T0.Y, 1,
998; EG-NEXT:     BIT_ALIGN_INT T2.W, T0.Y, T0.X, 1,
999; EG-NEXT:     NOT_INT * T3.W, T1.X,
1000; EG-NEXT:    32(4.484155e-44), 31(4.344025e-44)
1001; EG-NEXT:     AND_INT T5.X, T3.Z, literal.x,
1002; EG-NEXT:     BIT_ALIGN_INT T0.Y, PV.Z, PV.W, PS,
1003; EG-NEXT:     LSHL T0.Z, T0.X, PV.Y,
1004; EG-NEXT:     AND_INT T2.W, T1.X, literal.x, BS:VEC_120/SCL_212
1005; EG-NEXT:     CNDE_INT * T4.W, PV.X, T0.W, T1.W,
1006; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
1007; EG-NEXT:     AND_INT T0.X, T3.X, literal.x,
1008; EG-NEXT:     CNDE_INT T4.Y, PV.W, PV.Y, PV.Z,
1009; EG-NEXT:     LSHR T1.Z, T2.Y, 1,
1010; EG-NEXT:     BIT_ALIGN_INT T0.W, T2.Y, T2.X, 1,
1011; EG-NEXT:     NOT_INT * T3.W, T3.X,
1012; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
1013; EG-NEXT:     BIT_ALIGN_INT T1.X, PV.Z, PV.W, PS,
1014; EG-NEXT:     LSHL T0.Y, T2.X, PV.X,
1015; EG-NEXT:     CNDE_INT T4.Z, T4.X, T1.W, 0.0, BS:VEC_120/SCL_212
1016; EG-NEXT:     AND_INT * T0.W, T3.X, literal.x, BS:VEC_201
1017; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
1018; EG-NEXT:     CNDE_INT * T1.W, T5.X, T3.Y, T2.Z,
1019; EG-NEXT:     CNDE_INT T4.X, T2.W, T0.Z, 0.0,
1020; EG-NEXT:     CNDE_INT T1.Y, T0.W, T1.X, T0.Y, BS:VEC_120/SCL_212
1021; EG-NEXT:     ADD_INT * T2.W, KC0[2].Y, literal.x,
1022; EG-NEXT:    16(2.242078e-44), 0(0.000000e+00)
1023; EG-NEXT:     LSHR T0.X, PV.W, literal.x,
1024; EG-NEXT:     CNDE_INT T1.Z, T5.X, T2.Z, 0.0,
1025; EG-NEXT:     CNDE_INT * T1.X, T0.W, T0.Y, 0.0,
1026; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1027; EG-NEXT:     LSHR * T2.X, KC0[2].Y, literal.x,
1028; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1029  %b_ptr = getelementptr <4 x i64>, <4 x i64> addrspace(1)* %in, i64 1
1030  %a = load <4 x i64>, <4 x i64> addrspace(1)* %in
1031  %b = load <4 x i64>, <4 x i64> addrspace(1)* %b_ptr
1032  %result = shl <4 x i64> %a, %b
1033  store <4 x i64> %result, <4 x i64> addrspace(1)* %out
1034  ret void
1035}
1036
1037; Make sure load width gets reduced to i32 load.
1038define amdgpu_kernel void @s_shl_32_i64(i64 addrspace(1)* %out, [8 x i32], i64 %a) {
1039; SI-LABEL: s_shl_32_i64:
1040; SI:       ; %bb.0:
1041; SI-NEXT:    s_load_dword s4, s[0:1], 0x13
1042; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1043; SI-NEXT:    s_mov_b32 s3, 0xf000
1044; SI-NEXT:    s_mov_b32 s2, -1
1045; SI-NEXT:    v_mov_b32_e32 v0, 0
1046; SI-NEXT:    s_waitcnt lgkmcnt(0)
1047; SI-NEXT:    v_mov_b32_e32 v1, s4
1048; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1049; SI-NEXT:    s_endpgm
1050;
1051; VI-LABEL: s_shl_32_i64:
1052; VI:       ; %bb.0:
1053; VI-NEXT:    s_load_dword s4, s[0:1], 0x4c
1054; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1055; VI-NEXT:    s_mov_b32 s3, 0xf000
1056; VI-NEXT:    s_mov_b32 s2, -1
1057; VI-NEXT:    v_mov_b32_e32 v0, 0
1058; VI-NEXT:    s_waitcnt lgkmcnt(0)
1059; VI-NEXT:    v_mov_b32_e32 v1, s4
1060; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1061; VI-NEXT:    s_endpgm
1062;
1063; EG-LABEL: s_shl_32_i64:
1064; EG:       ; %bb.0:
1065; EG-NEXT:    ALU 3, @4, KC0[CB0:0-32], KC1[]
1066; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1067; EG-NEXT:    CF_END
1068; EG-NEXT:    PAD
1069; EG-NEXT:    ALU clause starting at 4:
1070; EG-NEXT:     MOV * T0.Y, KC0[4].W,
1071; EG-NEXT:     MOV T0.X, 0.0,
1072; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1073; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1074  %result = shl i64 %a, 32
1075  store i64 %result, i64 addrspace(1)* %out
1076  ret void
1077}
1078
1079define amdgpu_kernel void @v_shl_32_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) {
1080; SI-LABEL: v_shl_32_i64:
1081; SI:       ; %bb.0:
1082; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1083; SI-NEXT:    s_ashr_i32 s3, s2, 31
1084; SI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 3
1085; SI-NEXT:    v_mov_b32_e32 v0, s0
1086; SI-NEXT:    s_mov_b32 s11, 0xf000
1087; SI-NEXT:    s_mov_b32 s10, 0
1088; SI-NEXT:    s_waitcnt lgkmcnt(0)
1089; SI-NEXT:    s_mov_b64 s[8:9], s[6:7]
1090; SI-NEXT:    v_mov_b32_e32 v1, s1
1091; SI-NEXT:    buffer_load_dword v3, v[0:1], s[8:11], 0 addr64
1092; SI-NEXT:    s_mov_b64 s[6:7], s[10:11]
1093; SI-NEXT:    v_mov_b32_e32 v2, 0
1094; SI-NEXT:    s_waitcnt vmcnt(0)
1095; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64
1096; SI-NEXT:    s_endpgm
1097;
1098; VI-LABEL: v_shl_32_i64:
1099; VI:       ; %bb.0:
1100; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1101; VI-NEXT:    s_ashr_i32 s3, s2, 31
1102; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], 3
1103; VI-NEXT:    v_mov_b32_e32 v0, 0
1104; VI-NEXT:    s_waitcnt lgkmcnt(0)
1105; VI-NEXT:    s_add_u32 s2, s6, s0
1106; VI-NEXT:    s_addc_u32 s3, s7, s1
1107; VI-NEXT:    s_load_dword s2, s[2:3], 0x0
1108; VI-NEXT:    s_add_u32 s0, s4, s0
1109; VI-NEXT:    s_addc_u32 s1, s5, s1
1110; VI-NEXT:    v_mov_b32_e32 v3, s1
1111; VI-NEXT:    v_mov_b32_e32 v2, s0
1112; VI-NEXT:    s_waitcnt lgkmcnt(0)
1113; VI-NEXT:    v_mov_b32_e32 v1, s2
1114; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1115; VI-NEXT:    s_endpgm
1116;
1117; EG-LABEL: v_shl_32_i64:
1118; EG:       ; %bb.0:
1119; EG-NEXT:    ALU 2, @8, KC0[CB0:0-32], KC1[]
1120; EG-NEXT:    TEX 0 @6
1121; EG-NEXT:    ALU 4, @11, KC0[CB0:0-32], KC1[]
1122; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T1.XY, T2.X, 1
1123; EG-NEXT:    CF_END
1124; EG-NEXT:    PAD
1125; EG-NEXT:    Fetch clause starting at 6:
1126; EG-NEXT:     VTX_READ_32 T0.X, T0.X, 0, #1
1127; EG-NEXT:    ALU clause starting at 8:
1128; EG-NEXT:     LSHL * T0.W, T1.X, literal.x,
1129; EG-NEXT:    3(4.203895e-45), 0(0.000000e+00)
1130; EG-NEXT:     ADD_INT * T0.X, KC0[2].Z, PV.W,
1131; EG-NEXT:    ALU clause starting at 11:
1132; EG-NEXT:     MOV T1.X, 0.0,
1133; EG-NEXT:     ADD_INT * T0.W, KC0[2].Y, T0.W,
1134; EG-NEXT:     LSHR T2.X, PV.W, literal.x,
1135; EG-NEXT:     MOV * T1.Y, T0.X,
1136; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1137  %tid = call i32 @llvm.amdgcn.workgroup.id.x() #0
1138  %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
1139  %gep.out = getelementptr i64, i64 addrspace(1)* %out, i32 %tid
1140  %a = load i64, i64 addrspace(1)* %gep.in
1141  %result = shl i64 %a, 32
1142  store i64 %result, i64 addrspace(1)* %gep.out
1143  ret void
1144}
1145
1146define amdgpu_kernel void @s_shl_constant_i64(i64 addrspace(1)* %out, i64 %a) {
1147; SI-LABEL: s_shl_constant_i64:
1148; SI:       ; %bb.0:
1149; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1150; SI-NEXT:    s_mov_b32 s6, -1
1151; SI-NEXT:    s_mov_b32 s9, 0xffff
1152; SI-NEXT:    s_mov_b32 s8, s6
1153; SI-NEXT:    s_mov_b32 s7, 0xf000
1154; SI-NEXT:    s_waitcnt lgkmcnt(0)
1155; SI-NEXT:    s_mov_b32 s4, s0
1156; SI-NEXT:    s_mov_b32 s5, s1
1157; SI-NEXT:    s_lshl_b64 s[0:1], s[8:9], s2
1158; SI-NEXT:    v_mov_b32_e32 v0, s0
1159; SI-NEXT:    v_mov_b32_e32 v1, s1
1160; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1161; SI-NEXT:    s_endpgm
1162;
1163; VI-LABEL: s_shl_constant_i64:
1164; VI:       ; %bb.0:
1165; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1166; VI-NEXT:    s_mov_b32 s6, -1
1167; VI-NEXT:    s_mov_b32 s9, 0xffff
1168; VI-NEXT:    s_mov_b32 s8, s6
1169; VI-NEXT:    s_mov_b32 s7, 0xf000
1170; VI-NEXT:    s_waitcnt lgkmcnt(0)
1171; VI-NEXT:    s_mov_b32 s4, s0
1172; VI-NEXT:    s_mov_b32 s5, s1
1173; VI-NEXT:    s_lshl_b64 s[0:1], s[8:9], s2
1174; VI-NEXT:    v_mov_b32_e32 v0, s0
1175; VI-NEXT:    v_mov_b32_e32 v1, s1
1176; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1177; VI-NEXT:    s_endpgm
1178;
1179; EG-LABEL: s_shl_constant_i64:
1180; EG:       ; %bb.0:
1181; EG-NEXT:    ALU 12, @4, KC0[CB0:0-32], KC1[]
1182; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1183; EG-NEXT:    CF_END
1184; EG-NEXT:    PAD
1185; EG-NEXT:    ALU clause starting at 4:
1186; EG-NEXT:     AND_INT T0.Z, KC0[2].W, literal.x,
1187; EG-NEXT:     MOV T0.W, literal.y,
1188; EG-NEXT:     NOT_INT * T1.W, KC0[2].W,
1189; EG-NEXT:    31(4.344025e-44), -1(nan)
1190; EG-NEXT:     BIT_ALIGN_INT T1.Z, literal.x, PV.W, PS,
1191; EG-NEXT:     LSHL T0.W, literal.y, PV.Z,
1192; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.z,
1193; EG-NEXT:    32767(4.591635e-41), -1(nan)
1194; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
1195; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.Z, PV.W,
1196; EG-NEXT:     CNDE_INT T0.X, T1.W, T0.W, 0.0,
1197; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1198; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1199  %shl = shl i64 281474976710655, %a
1200  store i64 %shl, i64 addrspace(1)* %out, align 8
1201  ret void
1202}
1203
1204define amdgpu_kernel void @v_shl_constant_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) {
1205; SI-LABEL: v_shl_constant_i64:
1206; SI:       ; %bb.0:
1207; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1208; SI-NEXT:    s_mov_b32 s7, 0xf000
1209; SI-NEXT:    s_mov_b32 s6, -1
1210; SI-NEXT:    s_mov_b32 s10, s6
1211; SI-NEXT:    s_mov_b32 s11, s7
1212; SI-NEXT:    s_waitcnt lgkmcnt(0)
1213; SI-NEXT:    s_mov_b32 s8, s2
1214; SI-NEXT:    s_mov_b32 s9, s3
1215; SI-NEXT:    buffer_load_dword v0, off, s[8:11], 0
1216; SI-NEXT:    s_mov_b32 s2, 0xab19b207
1217; SI-NEXT:    s_movk_i32 s3, 0x11e
1218; SI-NEXT:    s_mov_b32 s4, s0
1219; SI-NEXT:    s_mov_b32 s5, s1
1220; SI-NEXT:    s_waitcnt vmcnt(0)
1221; SI-NEXT:    v_lshl_b64 v[0:1], s[2:3], v0
1222; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1223; SI-NEXT:    s_endpgm
1224;
1225; VI-LABEL: v_shl_constant_i64:
1226; VI:       ; %bb.0:
1227; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1228; VI-NEXT:    s_mov_b32 s7, 0xf000
1229; VI-NEXT:    s_mov_b32 s6, -1
1230; VI-NEXT:    s_waitcnt lgkmcnt(0)
1231; VI-NEXT:    s_load_dword s2, s[2:3], 0x0
1232; VI-NEXT:    s_mov_b32 s4, s0
1233; VI-NEXT:    s_mov_b32 s5, s1
1234; VI-NEXT:    s_mov_b32 s0, 0xab19b207
1235; VI-NEXT:    s_movk_i32 s1, 0x11e
1236; VI-NEXT:    s_waitcnt lgkmcnt(0)
1237; VI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
1238; VI-NEXT:    v_mov_b32_e32 v0, s0
1239; VI-NEXT:    v_mov_b32_e32 v1, s1
1240; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1241; VI-NEXT:    s_endpgm
1242;
1243; EG-LABEL: v_shl_constant_i64:
1244; EG:       ; %bb.0:
1245; EG-NEXT:    ALU 0, @8, KC0[CB0:0-32], KC1[]
1246; EG-NEXT:    TEX 0 @6
1247; EG-NEXT:    ALU 12, @9, KC0[CB0:0-32], KC1[]
1248; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1249; EG-NEXT:    CF_END
1250; EG-NEXT:    PAD
1251; EG-NEXT:    Fetch clause starting at 6:
1252; EG-NEXT:     VTX_READ_32 T0.X, T0.X, 0, #1
1253; EG-NEXT:    ALU clause starting at 8:
1254; EG-NEXT:     MOV * T0.X, KC0[2].Z,
1255; EG-NEXT:    ALU clause starting at 9:
1256; EG-NEXT:     NOT_INT T0.Z, T0.X,
1257; EG-NEXT:     MOV T0.W, literal.x,
1258; EG-NEXT:     AND_INT * T1.W, T0.X, literal.y,
1259; EG-NEXT:    1435293955(1.935796e+13), 31(4.344025e-44)
1260; EG-NEXT:     LSHL T1.Z, literal.x, PS,
1261; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.y, PV.W, PV.Z,
1262; EG-NEXT:     AND_INT * T1.W, T0.X, literal.z,
1263; EG-NEXT:    -1424379385(-5.460358e-13), 143(2.003857e-43)
1264; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
1265; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, PV.Z,
1266; EG-NEXT:     CNDE_INT T0.X, T1.W, T1.Z, 0.0,
1267; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1268; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1269  %a = load i64, i64 addrspace(1)* %aptr, align 8
1270  %shl = shl i64 1231231234567, %a
1271  store i64 %shl, i64 addrspace(1)* %out, align 8
1272  ret void
1273}
1274
1275define amdgpu_kernel void @v_shl_i64_32_bit_constant(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) {
1276; SI-LABEL: v_shl_i64_32_bit_constant:
1277; SI:       ; %bb.0:
1278; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1279; SI-NEXT:    s_mov_b32 s7, 0xf000
1280; SI-NEXT:    s_mov_b32 s6, -1
1281; SI-NEXT:    s_mov_b32 s10, s6
1282; SI-NEXT:    s_mov_b32 s11, s7
1283; SI-NEXT:    s_waitcnt lgkmcnt(0)
1284; SI-NEXT:    s_mov_b32 s8, s2
1285; SI-NEXT:    s_mov_b32 s9, s3
1286; SI-NEXT:    buffer_load_dword v0, off, s[8:11], 0
1287; SI-NEXT:    s_mov_b64 s[2:3], 0x12d687
1288; SI-NEXT:    s_mov_b32 s4, s0
1289; SI-NEXT:    s_mov_b32 s5, s1
1290; SI-NEXT:    s_waitcnt vmcnt(0)
1291; SI-NEXT:    v_lshl_b64 v[0:1], s[2:3], v0
1292; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1293; SI-NEXT:    s_endpgm
1294;
1295; VI-LABEL: v_shl_i64_32_bit_constant:
1296; VI:       ; %bb.0:
1297; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1298; VI-NEXT:    s_mov_b32 s7, 0xf000
1299; VI-NEXT:    s_mov_b32 s6, -1
1300; VI-NEXT:    s_waitcnt lgkmcnt(0)
1301; VI-NEXT:    s_load_dword s2, s[2:3], 0x0
1302; VI-NEXT:    s_mov_b32 s4, s0
1303; VI-NEXT:    s_mov_b32 s5, s1
1304; VI-NEXT:    s_mov_b64 s[0:1], 0x12d687
1305; VI-NEXT:    s_waitcnt lgkmcnt(0)
1306; VI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
1307; VI-NEXT:    v_mov_b32_e32 v0, s0
1308; VI-NEXT:    v_mov_b32_e32 v1, s1
1309; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1310; VI-NEXT:    s_endpgm
1311;
1312; EG-LABEL: v_shl_i64_32_bit_constant:
1313; EG:       ; %bb.0:
1314; EG-NEXT:    ALU 0, @8, KC0[CB0:0-32], KC1[]
1315; EG-NEXT:    TEX 0 @6
1316; EG-NEXT:    ALU 11, @9, KC0[CB0:0-32], KC1[]
1317; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1318; EG-NEXT:    CF_END
1319; EG-NEXT:    PAD
1320; EG-NEXT:    Fetch clause starting at 6:
1321; EG-NEXT:     VTX_READ_32 T0.X, T0.X, 0, #1
1322; EG-NEXT:    ALU clause starting at 8:
1323; EG-NEXT:     MOV * T0.X, KC0[2].Z,
1324; EG-NEXT:    ALU clause starting at 9:
1325; EG-NEXT:     AND_INT T0.W, T0.X, literal.x,
1326; EG-NEXT:     NOT_INT * T1.W, T0.X,
1327; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
1328; EG-NEXT:     BIT_ALIGN_INT T0.Z, 0.0, literal.x, PS,
1329; EG-NEXT:     LSHL T0.W, literal.y, PV.W,
1330; EG-NEXT:     AND_INT * T1.W, T0.X, literal.z,
1331; EG-NEXT:    617283(8.649977e-40), 1234567(1.729997e-39)
1332; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
1333; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.Z, PV.W,
1334; EG-NEXT:     CNDE_INT T0.X, T1.W, T0.W, 0.0,
1335; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1336; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1337  %a = load i64, i64 addrspace(1)* %aptr, align 8
1338  %shl = shl i64 1234567, %a
1339  store i64 %shl, i64 addrspace(1)* %out, align 8
1340  ret void
1341}
1342
1343define amdgpu_kernel void @v_shl_inline_imm_64_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) {
1344; SI-LABEL: v_shl_inline_imm_64_i64:
1345; SI:       ; %bb.0:
1346; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1347; SI-NEXT:    s_mov_b32 s7, 0xf000
1348; SI-NEXT:    s_mov_b32 s6, -1
1349; SI-NEXT:    s_mov_b32 s10, s6
1350; SI-NEXT:    s_mov_b32 s11, s7
1351; SI-NEXT:    s_waitcnt lgkmcnt(0)
1352; SI-NEXT:    s_mov_b32 s8, s2
1353; SI-NEXT:    s_mov_b32 s9, s3
1354; SI-NEXT:    buffer_load_dword v0, off, s[8:11], 0
1355; SI-NEXT:    s_mov_b32 s4, s0
1356; SI-NEXT:    s_mov_b32 s5, s1
1357; SI-NEXT:    s_waitcnt vmcnt(0)
1358; SI-NEXT:    v_lshl_b64 v[0:1], 64, v0
1359; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1360; SI-NEXT:    s_endpgm
1361;
1362; VI-LABEL: v_shl_inline_imm_64_i64:
1363; VI:       ; %bb.0:
1364; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1365; VI-NEXT:    s_waitcnt lgkmcnt(0)
1366; VI-NEXT:    s_load_dword s4, s[2:3], 0x0
1367; VI-NEXT:    s_mov_b32 s3, 0xf000
1368; VI-NEXT:    s_mov_b32 s2, -1
1369; VI-NEXT:    s_waitcnt lgkmcnt(0)
1370; VI-NEXT:    s_lshl_b64 s[4:5], 64, s4
1371; VI-NEXT:    v_mov_b32_e32 v0, s4
1372; VI-NEXT:    v_mov_b32_e32 v1, s5
1373; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1374; VI-NEXT:    s_endpgm
1375;
1376; EG-LABEL: v_shl_inline_imm_64_i64:
1377; EG:       ; %bb.0:
1378; EG-NEXT:    ALU 0, @8, KC0[CB0:0-32], KC1[]
1379; EG-NEXT:    TEX 0 @6
1380; EG-NEXT:    ALU 10, @9, KC0[CB0:0-32], KC1[]
1381; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1382; EG-NEXT:    CF_END
1383; EG-NEXT:    PAD
1384; EG-NEXT:    Fetch clause starting at 6:
1385; EG-NEXT:     VTX_READ_32 T0.X, T0.X, 0, #1
1386; EG-NEXT:    ALU clause starting at 8:
1387; EG-NEXT:     MOV * T0.X, KC0[2].Z,
1388; EG-NEXT:    ALU clause starting at 9:
1389; EG-NEXT:     AND_INT T0.W, T0.X, literal.x,
1390; EG-NEXT:     NOT_INT * T1.W, T0.X,
1391; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
1392; EG-NEXT:     BIT_ALIGN_INT T0.Z, 0.0, literal.x, PS,
1393; EG-NEXT:     LSHL T0.W, literal.y, PV.W,
1394; EG-NEXT:     AND_INT * T1.W, T0.X, literal.x,
1395; EG-NEXT:    32(4.484155e-44), 64(8.968310e-44)
1396; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.Z, PV.W,
1397; EG-NEXT:     CNDE_INT T0.X, T1.W, T0.W, 0.0,
1398; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1399; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1400  %a = load i64, i64 addrspace(1)* %aptr, align 8
1401  %shl = shl i64 64, %a
1402  store i64 %shl, i64 addrspace(1)* %out, align 8
1403  ret void
1404}
1405
1406define amdgpu_kernel void @s_shl_inline_imm_64_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1407; SI-LABEL: s_shl_inline_imm_64_i64:
1408; SI:       ; %bb.0:
1409; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1410; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1411; SI-NEXT:    s_mov_b32 s3, 0xf000
1412; SI-NEXT:    s_mov_b32 s2, -1
1413; SI-NEXT:    s_waitcnt lgkmcnt(0)
1414; SI-NEXT:    s_lshl_b64 s[4:5], 64, s4
1415; SI-NEXT:    v_mov_b32_e32 v0, s4
1416; SI-NEXT:    v_mov_b32_e32 v1, s5
1417; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1418; SI-NEXT:    s_endpgm
1419;
1420; VI-LABEL: s_shl_inline_imm_64_i64:
1421; VI:       ; %bb.0:
1422; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1423; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1424; VI-NEXT:    s_mov_b32 s3, 0xf000
1425; VI-NEXT:    s_mov_b32 s2, -1
1426; VI-NEXT:    s_waitcnt lgkmcnt(0)
1427; VI-NEXT:    s_lshl_b64 s[4:5], 64, s4
1428; VI-NEXT:    v_mov_b32_e32 v0, s4
1429; VI-NEXT:    v_mov_b32_e32 v1, s5
1430; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1431; VI-NEXT:    s_endpgm
1432;
1433; EG-LABEL: s_shl_inline_imm_64_i64:
1434; EG:       ; %bb.0:
1435; EG-NEXT:    ALU 10, @4, KC0[CB0:0-32], KC1[]
1436; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1437; EG-NEXT:    CF_END
1438; EG-NEXT:    PAD
1439; EG-NEXT:    ALU clause starting at 4:
1440; EG-NEXT:     NOT_INT T0.W, KC0[2].W,
1441; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.x,
1442; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
1443; EG-NEXT:     LSHL T0.Z, literal.x, PS,
1444; EG-NEXT:     BIT_ALIGN_INT T0.W, 0.0, literal.y, PV.W,
1445; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1446; EG-NEXT:    64(8.968310e-44), 32(4.484155e-44)
1447; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, PV.Z,
1448; EG-NEXT:     CNDE_INT T0.X, T1.W, T0.Z, 0.0,
1449; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1450; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1451  %shl = shl i64 64, %a
1452  store i64 %shl, i64 addrspace(1)* %out, align 8
1453  ret void
1454}
1455
1456define amdgpu_kernel void @s_shl_inline_imm_1_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1457; SI-LABEL: s_shl_inline_imm_1_i64:
1458; SI:       ; %bb.0:
1459; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1460; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1461; SI-NEXT:    s_mov_b32 s3, 0xf000
1462; SI-NEXT:    s_mov_b32 s2, -1
1463; SI-NEXT:    s_waitcnt lgkmcnt(0)
1464; SI-NEXT:    s_lshl_b64 s[4:5], 1, s4
1465; SI-NEXT:    v_mov_b32_e32 v0, s4
1466; SI-NEXT:    v_mov_b32_e32 v1, s5
1467; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1468; SI-NEXT:    s_endpgm
1469;
1470; VI-LABEL: s_shl_inline_imm_1_i64:
1471; VI:       ; %bb.0:
1472; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1473; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1474; VI-NEXT:    s_mov_b32 s3, 0xf000
1475; VI-NEXT:    s_mov_b32 s2, -1
1476; VI-NEXT:    s_waitcnt lgkmcnt(0)
1477; VI-NEXT:    s_lshl_b64 s[4:5], 1, s4
1478; VI-NEXT:    v_mov_b32_e32 v0, s4
1479; VI-NEXT:    v_mov_b32_e32 v1, s5
1480; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1481; VI-NEXT:    s_endpgm
1482;
1483; EG-LABEL: s_shl_inline_imm_1_i64:
1484; EG:       ; %bb.0:
1485; EG-NEXT:    ALU 11, @4, KC0[CB0:0-32], KC1[]
1486; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1487; EG-NEXT:    CF_END
1488; EG-NEXT:    PAD
1489; EG-NEXT:    ALU clause starting at 4:
1490; EG-NEXT:     AND_INT T0.W, KC0[2].W, literal.x,
1491; EG-NEXT:     LSHL * T1.W, KC0[2].W, literal.y,
1492; EG-NEXT:    31(4.344025e-44), 26(3.643376e-44)
1493; EG-NEXT:     ASHR T1.W, PS, literal.x,
1494; EG-NEXT:     LSHL * T0.W, 1, PV.W,
1495; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
1496; EG-NEXT:     AND_INT T0.Y, PV.W, PS,
1497; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.x,
1498; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
1499; EG-NEXT:     CNDE_INT T0.X, PV.W, T0.W, 0.0,
1500; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1501; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1502  %shl = shl i64 1, %a
1503  store i64 %shl, i64 addrspace(1)* %out, align 8
1504  ret void
1505}
1506
1507define amdgpu_kernel void @s_shl_inline_imm_1_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1508; SI-LABEL: s_shl_inline_imm_1_0_i64:
1509; SI:       ; %bb.0:
1510; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1511; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1512; SI-NEXT:    s_mov_b32 s3, 0xf000
1513; SI-NEXT:    s_mov_b32 s2, -1
1514; SI-NEXT:    s_waitcnt lgkmcnt(0)
1515; SI-NEXT:    s_lshl_b64 s[4:5], 1.0, s4
1516; SI-NEXT:    v_mov_b32_e32 v0, s4
1517; SI-NEXT:    v_mov_b32_e32 v1, s5
1518; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1519; SI-NEXT:    s_endpgm
1520;
1521; VI-LABEL: s_shl_inline_imm_1_0_i64:
1522; VI:       ; %bb.0:
1523; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1524; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1525; VI-NEXT:    s_mov_b32 s3, 0xf000
1526; VI-NEXT:    s_mov_b32 s2, -1
1527; VI-NEXT:    s_waitcnt lgkmcnt(0)
1528; VI-NEXT:    s_lshl_b64 s[4:5], 1.0, s4
1529; VI-NEXT:    v_mov_b32_e32 v0, s4
1530; VI-NEXT:    v_mov_b32_e32 v1, s5
1531; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1532; VI-NEXT:    s_endpgm
1533;
1534; EG-LABEL: s_shl_inline_imm_1_0_i64:
1535; EG:       ; %bb.0:
1536; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
1537; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1538; EG-NEXT:    CF_END
1539; EG-NEXT:    PAD
1540; EG-NEXT:    ALU clause starting at 4:
1541; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
1542; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
1543; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1544; EG-NEXT:    536346624(1.050321e-19), 32(4.484155e-44)
1545; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
1546; EG-NEXT:     MOV T0.X, 0.0,
1547; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1548; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1549  %shl = shl i64 4607182418800017408, %a
1550  store i64 %shl, i64 addrspace(1)* %out, align 8
1551  ret void
1552}
1553
1554define amdgpu_kernel void @s_shl_inline_imm_neg_1_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1555; SI-LABEL: s_shl_inline_imm_neg_1_0_i64:
1556; SI:       ; %bb.0:
1557; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1558; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1559; SI-NEXT:    s_mov_b32 s3, 0xf000
1560; SI-NEXT:    s_mov_b32 s2, -1
1561; SI-NEXT:    s_waitcnt lgkmcnt(0)
1562; SI-NEXT:    s_lshl_b64 s[4:5], -1.0, s4
1563; SI-NEXT:    v_mov_b32_e32 v0, s4
1564; SI-NEXT:    v_mov_b32_e32 v1, s5
1565; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1566; SI-NEXT:    s_endpgm
1567;
1568; VI-LABEL: s_shl_inline_imm_neg_1_0_i64:
1569; VI:       ; %bb.0:
1570; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1571; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1572; VI-NEXT:    s_mov_b32 s3, 0xf000
1573; VI-NEXT:    s_mov_b32 s2, -1
1574; VI-NEXT:    s_waitcnt lgkmcnt(0)
1575; VI-NEXT:    s_lshl_b64 s[4:5], -1.0, s4
1576; VI-NEXT:    v_mov_b32_e32 v0, s4
1577; VI-NEXT:    v_mov_b32_e32 v1, s5
1578; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1579; VI-NEXT:    s_endpgm
1580;
1581; EG-LABEL: s_shl_inline_imm_neg_1_0_i64:
1582; EG:       ; %bb.0:
1583; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
1584; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1585; EG-NEXT:    CF_END
1586; EG-NEXT:    PAD
1587; EG-NEXT:    ALU clause starting at 4:
1588; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
1589; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
1590; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1591; EG-NEXT:    1610088448(3.574057e+19), 32(4.484155e-44)
1592; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
1593; EG-NEXT:     MOV T0.X, 0.0,
1594; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1595; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1596  %shl = shl i64 13830554455654793216, %a
1597  store i64 %shl, i64 addrspace(1)* %out, align 8
1598  ret void
1599}
1600
1601define amdgpu_kernel void @s_shl_inline_imm_0_5_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1602; SI-LABEL: s_shl_inline_imm_0_5_i64:
1603; SI:       ; %bb.0:
1604; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1605; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1606; SI-NEXT:    s_mov_b32 s3, 0xf000
1607; SI-NEXT:    s_mov_b32 s2, -1
1608; SI-NEXT:    s_waitcnt lgkmcnt(0)
1609; SI-NEXT:    s_lshl_b64 s[4:5], 0.5, s4
1610; SI-NEXT:    v_mov_b32_e32 v0, s4
1611; SI-NEXT:    v_mov_b32_e32 v1, s5
1612; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1613; SI-NEXT:    s_endpgm
1614;
1615; VI-LABEL: s_shl_inline_imm_0_5_i64:
1616; VI:       ; %bb.0:
1617; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1618; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1619; VI-NEXT:    s_mov_b32 s3, 0xf000
1620; VI-NEXT:    s_mov_b32 s2, -1
1621; VI-NEXT:    s_waitcnt lgkmcnt(0)
1622; VI-NEXT:    s_lshl_b64 s[4:5], 0.5, s4
1623; VI-NEXT:    v_mov_b32_e32 v0, s4
1624; VI-NEXT:    v_mov_b32_e32 v1, s5
1625; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1626; VI-NEXT:    s_endpgm
1627;
1628; EG-LABEL: s_shl_inline_imm_0_5_i64:
1629; EG:       ; %bb.0:
1630; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
1631; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1632; EG-NEXT:    CF_END
1633; EG-NEXT:    PAD
1634; EG-NEXT:    ALU clause starting at 4:
1635; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
1636; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
1637; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1638; EG-NEXT:    535822336(1.016440e-19), 32(4.484155e-44)
1639; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
1640; EG-NEXT:     MOV T0.X, 0.0,
1641; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1642; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1643  %shl = shl i64 4602678819172646912, %a
1644  store i64 %shl, i64 addrspace(1)* %out, align 8
1645  ret void
1646}
1647
1648define amdgpu_kernel void @s_shl_inline_imm_neg_0_5_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1649; SI-LABEL: s_shl_inline_imm_neg_0_5_i64:
1650; SI:       ; %bb.0:
1651; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1652; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1653; SI-NEXT:    s_mov_b32 s3, 0xf000
1654; SI-NEXT:    s_mov_b32 s2, -1
1655; SI-NEXT:    s_waitcnt lgkmcnt(0)
1656; SI-NEXT:    s_lshl_b64 s[4:5], -0.5, s4
1657; SI-NEXT:    v_mov_b32_e32 v0, s4
1658; SI-NEXT:    v_mov_b32_e32 v1, s5
1659; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1660; SI-NEXT:    s_endpgm
1661;
1662; VI-LABEL: s_shl_inline_imm_neg_0_5_i64:
1663; VI:       ; %bb.0:
1664; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1665; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1666; VI-NEXT:    s_mov_b32 s3, 0xf000
1667; VI-NEXT:    s_mov_b32 s2, -1
1668; VI-NEXT:    s_waitcnt lgkmcnt(0)
1669; VI-NEXT:    s_lshl_b64 s[4:5], -0.5, s4
1670; VI-NEXT:    v_mov_b32_e32 v0, s4
1671; VI-NEXT:    v_mov_b32_e32 v1, s5
1672; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1673; VI-NEXT:    s_endpgm
1674;
1675; EG-LABEL: s_shl_inline_imm_neg_0_5_i64:
1676; EG:       ; %bb.0:
1677; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
1678; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1679; EG-NEXT:    CF_END
1680; EG-NEXT:    PAD
1681; EG-NEXT:    ALU clause starting at 4:
1682; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
1683; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
1684; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1685; EG-NEXT:    1609564160(3.458765e+19), 32(4.484155e-44)
1686; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
1687; EG-NEXT:     MOV T0.X, 0.0,
1688; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1689; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1690  %shl = shl i64 13826050856027422720, %a
1691  store i64 %shl, i64 addrspace(1)* %out, align 8
1692  ret void
1693}
1694
1695define amdgpu_kernel void @s_shl_inline_imm_2_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1696; SI-LABEL: s_shl_inline_imm_2_0_i64:
1697; SI:       ; %bb.0:
1698; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1699; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1700; SI-NEXT:    s_mov_b32 s3, 0xf000
1701; SI-NEXT:    s_mov_b32 s2, -1
1702; SI-NEXT:    s_waitcnt lgkmcnt(0)
1703; SI-NEXT:    s_lshl_b64 s[4:5], 2.0, s4
1704; SI-NEXT:    v_mov_b32_e32 v0, s4
1705; SI-NEXT:    v_mov_b32_e32 v1, s5
1706; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1707; SI-NEXT:    s_endpgm
1708;
1709; VI-LABEL: s_shl_inline_imm_2_0_i64:
1710; VI:       ; %bb.0:
1711; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1712; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1713; VI-NEXT:    s_mov_b32 s3, 0xf000
1714; VI-NEXT:    s_mov_b32 s2, -1
1715; VI-NEXT:    s_waitcnt lgkmcnt(0)
1716; VI-NEXT:    s_lshl_b64 s[4:5], 2.0, s4
1717; VI-NEXT:    v_mov_b32_e32 v0, s4
1718; VI-NEXT:    v_mov_b32_e32 v1, s5
1719; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1720; VI-NEXT:    s_endpgm
1721;
1722; EG-LABEL: s_shl_inline_imm_2_0_i64:
1723; EG:       ; %bb.0:
1724; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
1725; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1726; EG-NEXT:    CF_END
1727; EG-NEXT:    PAD
1728; EG-NEXT:    ALU clause starting at 4:
1729; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
1730; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
1731; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1732; EG-NEXT:    536870912(1.084202e-19), 32(4.484155e-44)
1733; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
1734; EG-NEXT:     MOV T0.X, 0.0,
1735; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1736; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1737  %shl = shl i64 4611686018427387904, %a
1738  store i64 %shl, i64 addrspace(1)* %out, align 8
1739  ret void
1740}
1741
1742define amdgpu_kernel void @s_shl_inline_imm_neg_2_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1743; SI-LABEL: s_shl_inline_imm_neg_2_0_i64:
1744; SI:       ; %bb.0:
1745; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1746; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1747; SI-NEXT:    s_mov_b32 s3, 0xf000
1748; SI-NEXT:    s_mov_b32 s2, -1
1749; SI-NEXT:    s_waitcnt lgkmcnt(0)
1750; SI-NEXT:    s_lshl_b64 s[4:5], -2.0, s4
1751; SI-NEXT:    v_mov_b32_e32 v0, s4
1752; SI-NEXT:    v_mov_b32_e32 v1, s5
1753; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1754; SI-NEXT:    s_endpgm
1755;
1756; VI-LABEL: s_shl_inline_imm_neg_2_0_i64:
1757; VI:       ; %bb.0:
1758; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1759; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1760; VI-NEXT:    s_mov_b32 s3, 0xf000
1761; VI-NEXT:    s_mov_b32 s2, -1
1762; VI-NEXT:    s_waitcnt lgkmcnt(0)
1763; VI-NEXT:    s_lshl_b64 s[4:5], -2.0, s4
1764; VI-NEXT:    v_mov_b32_e32 v0, s4
1765; VI-NEXT:    v_mov_b32_e32 v1, s5
1766; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1767; VI-NEXT:    s_endpgm
1768;
1769; EG-LABEL: s_shl_inline_imm_neg_2_0_i64:
1770; EG:       ; %bb.0:
1771; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
1772; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1773; EG-NEXT:    CF_END
1774; EG-NEXT:    PAD
1775; EG-NEXT:    ALU clause starting at 4:
1776; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
1777; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
1778; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1779; EG-NEXT:    1610612736(3.689349e+19), 32(4.484155e-44)
1780; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
1781; EG-NEXT:     MOV T0.X, 0.0,
1782; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1783; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1784  %shl = shl i64 13835058055282163712, %a
1785  store i64 %shl, i64 addrspace(1)* %out, align 8
1786  ret void
1787}
1788
1789define amdgpu_kernel void @s_shl_inline_imm_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1790; SI-LABEL: s_shl_inline_imm_4_0_i64:
1791; SI:       ; %bb.0:
1792; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1793; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1794; SI-NEXT:    s_mov_b32 s3, 0xf000
1795; SI-NEXT:    s_mov_b32 s2, -1
1796; SI-NEXT:    s_waitcnt lgkmcnt(0)
1797; SI-NEXT:    s_lshl_b64 s[4:5], 4.0, s4
1798; SI-NEXT:    v_mov_b32_e32 v0, s4
1799; SI-NEXT:    v_mov_b32_e32 v1, s5
1800; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1801; SI-NEXT:    s_endpgm
1802;
1803; VI-LABEL: s_shl_inline_imm_4_0_i64:
1804; VI:       ; %bb.0:
1805; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1806; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1807; VI-NEXT:    s_mov_b32 s3, 0xf000
1808; VI-NEXT:    s_mov_b32 s2, -1
1809; VI-NEXT:    s_waitcnt lgkmcnt(0)
1810; VI-NEXT:    s_lshl_b64 s[4:5], 4.0, s4
1811; VI-NEXT:    v_mov_b32_e32 v0, s4
1812; VI-NEXT:    v_mov_b32_e32 v1, s5
1813; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1814; VI-NEXT:    s_endpgm
1815;
1816; EG-LABEL: s_shl_inline_imm_4_0_i64:
1817; EG:       ; %bb.0:
1818; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
1819; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1820; EG-NEXT:    CF_END
1821; EG-NEXT:    PAD
1822; EG-NEXT:    ALU clause starting at 4:
1823; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
1824; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
1825; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1826; EG-NEXT:    537395200(1.151965e-19), 32(4.484155e-44)
1827; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
1828; EG-NEXT:     MOV T0.X, 0.0,
1829; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1830; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1831  %shl = shl i64 4616189618054758400, %a
1832  store i64 %shl, i64 addrspace(1)* %out, align 8
1833  ret void
1834}
1835
1836define amdgpu_kernel void @s_shl_inline_imm_neg_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1837; SI-LABEL: s_shl_inline_imm_neg_4_0_i64:
1838; SI:       ; %bb.0:
1839; SI-NEXT:    s_load_dword s4, s[0:1], 0xd
1840; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1841; SI-NEXT:    s_mov_b32 s3, 0xf000
1842; SI-NEXT:    s_mov_b32 s2, -1
1843; SI-NEXT:    s_waitcnt lgkmcnt(0)
1844; SI-NEXT:    s_lshl_b64 s[4:5], -4.0, s4
1845; SI-NEXT:    v_mov_b32_e32 v0, s4
1846; SI-NEXT:    v_mov_b32_e32 v1, s5
1847; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1848; SI-NEXT:    s_endpgm
1849;
1850; VI-LABEL: s_shl_inline_imm_neg_4_0_i64:
1851; VI:       ; %bb.0:
1852; VI-NEXT:    s_load_dword s4, s[0:1], 0x34
1853; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1854; VI-NEXT:    s_mov_b32 s3, 0xf000
1855; VI-NEXT:    s_mov_b32 s2, -1
1856; VI-NEXT:    s_waitcnt lgkmcnt(0)
1857; VI-NEXT:    s_lshl_b64 s[4:5], -4.0, s4
1858; VI-NEXT:    v_mov_b32_e32 v0, s4
1859; VI-NEXT:    v_mov_b32_e32 v1, s5
1860; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1861; VI-NEXT:    s_endpgm
1862;
1863; EG-LABEL: s_shl_inline_imm_neg_4_0_i64:
1864; EG:       ; %bb.0:
1865; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
1866; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1867; EG-NEXT:    CF_END
1868; EG-NEXT:    PAD
1869; EG-NEXT:    ALU clause starting at 4:
1870; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
1871; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
1872; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
1873; EG-NEXT:    1611137024(3.919933e+19), 32(4.484155e-44)
1874; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
1875; EG-NEXT:     MOV T0.X, 0.0,
1876; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1877; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1878  %shl = shl i64 13839561654909534208, %a
1879  store i64 %shl, i64 addrspace(1)* %out, align 8
1880  ret void
1881}
1882
1883
1884; Test with the 64-bit integer bitpattern for a 32-bit float in the
1885; low 32-bits, which is not a valid 64-bit inline immmediate.
1886define amdgpu_kernel void @s_shl_inline_imm_f32_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1887; SI-LABEL: s_shl_inline_imm_f32_4_0_i64:
1888; SI:       ; %bb.0:
1889; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
1890; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
1891; SI-NEXT:    s_mov_b64 s[0:1], 0x40800000
1892; SI-NEXT:    s_mov_b32 s7, 0xf000
1893; SI-NEXT:    s_mov_b32 s6, -1
1894; SI-NEXT:    s_waitcnt lgkmcnt(0)
1895; SI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
1896; SI-NEXT:    v_mov_b32_e32 v0, s0
1897; SI-NEXT:    v_mov_b32_e32 v1, s1
1898; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1899; SI-NEXT:    s_endpgm
1900;
1901; VI-LABEL: s_shl_inline_imm_f32_4_0_i64:
1902; VI:       ; %bb.0:
1903; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1904; VI-NEXT:    s_load_dword s2, s[0:1], 0x34
1905; VI-NEXT:    s_mov_b64 s[0:1], 0x40800000
1906; VI-NEXT:    s_mov_b32 s7, 0xf000
1907; VI-NEXT:    s_mov_b32 s6, -1
1908; VI-NEXT:    s_waitcnt lgkmcnt(0)
1909; VI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
1910; VI-NEXT:    v_mov_b32_e32 v0, s0
1911; VI-NEXT:    v_mov_b32_e32 v1, s1
1912; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1913; VI-NEXT:    s_endpgm
1914;
1915; EG-LABEL: s_shl_inline_imm_f32_4_0_i64:
1916; EG:       ; %bb.0:
1917; EG-NEXT:    ALU 11, @4, KC0[CB0:0-32], KC1[]
1918; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1919; EG-NEXT:    CF_END
1920; EG-NEXT:    PAD
1921; EG-NEXT:    ALU clause starting at 4:
1922; EG-NEXT:     NOT_INT T0.W, KC0[2].W,
1923; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.x,
1924; EG-NEXT:    31(4.344025e-44), 0(0.000000e+00)
1925; EG-NEXT:     LSHL T0.Z, literal.x, PS,
1926; EG-NEXT:     BIT_ALIGN_INT T0.W, 0.0, literal.y, PV.W,
1927; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.z,
1928; EG-NEXT:    1082130432(4.000000e+00), 541065216(1.626303e-19)
1929; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
1930; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, PV.Z,
1931; EG-NEXT:     CNDE_INT T0.X, T1.W, T0.Z, 0.0,
1932; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1933; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1934  %shl = shl i64 1082130432, %a
1935  store i64 %shl, i64 addrspace(1)* %out, align 8
1936  ret void
1937}
1938
1939; FIXME: Copy of -1 register
1940define amdgpu_kernel void @s_shl_inline_imm_f32_neg_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1941; SI-LABEL: s_shl_inline_imm_f32_neg_4_0_i64:
1942; SI:       ; %bb.0:
1943; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
1944; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
1945; SI-NEXT:    s_mov_b32 s6, -1
1946; SI-NEXT:    s_mov_b32 s0, -4.0
1947; SI-NEXT:    s_mov_b32 s1, s6
1948; SI-NEXT:    s_mov_b32 s7, 0xf000
1949; SI-NEXT:    s_waitcnt lgkmcnt(0)
1950; SI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
1951; SI-NEXT:    v_mov_b32_e32 v0, s0
1952; SI-NEXT:    v_mov_b32_e32 v1, s1
1953; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1954; SI-NEXT:    s_endpgm
1955;
1956; VI-LABEL: s_shl_inline_imm_f32_neg_4_0_i64:
1957; VI:       ; %bb.0:
1958; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1959; VI-NEXT:    s_load_dword s2, s[0:1], 0x34
1960; VI-NEXT:    s_mov_b32 s6, -1
1961; VI-NEXT:    s_mov_b32 s0, -4.0
1962; VI-NEXT:    s_mov_b32 s1, s6
1963; VI-NEXT:    s_mov_b32 s7, 0xf000
1964; VI-NEXT:    s_waitcnt lgkmcnt(0)
1965; VI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
1966; VI-NEXT:    v_mov_b32_e32 v0, s0
1967; VI-NEXT:    v_mov_b32_e32 v1, s1
1968; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1969; VI-NEXT:    s_endpgm
1970;
1971; EG-LABEL: s_shl_inline_imm_f32_neg_4_0_i64:
1972; EG:       ; %bb.0:
1973; EG-NEXT:    ALU 12, @4, KC0[CB0:0-32], KC1[]
1974; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
1975; EG-NEXT:    CF_END
1976; EG-NEXT:    PAD
1977; EG-NEXT:    ALU clause starting at 4:
1978; EG-NEXT:     AND_INT T0.Z, KC0[2].W, literal.x,
1979; EG-NEXT:     MOV T0.W, literal.y,
1980; EG-NEXT:     NOT_INT * T1.W, KC0[2].W,
1981; EG-NEXT:    31(4.344025e-44), -532676608(-5.534023e+19)
1982; EG-NEXT:     BIT_ALIGN_INT T1.Z, literal.x, PV.W, PS,
1983; EG-NEXT:     LSHL T0.W, literal.y, PV.Z,
1984; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.z,
1985; EG-NEXT:    2147483647(nan), -1065353216(-4.000000e+00)
1986; EG-NEXT:    32(4.484155e-44), 0(0.000000e+00)
1987; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.Z, PV.W,
1988; EG-NEXT:     CNDE_INT T0.X, T1.W, T0.W, 0.0,
1989; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
1990; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
1991  %shl = shl i64 -1065353216, %a
1992  store i64 %shl, i64 addrspace(1)* %out, align 8
1993  ret void
1994}
1995
1996define amdgpu_kernel void @s_shl_inline_high_imm_f32_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
1997; SI-LABEL: s_shl_inline_high_imm_f32_4_0_i64:
1998; SI:       ; %bb.0:
1999; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
2000; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
2001; SI-NEXT:    s_mov_b32 s0, 0
2002; SI-NEXT:    s_mov_b32 s1, 4.0
2003; SI-NEXT:    s_mov_b32 s7, 0xf000
2004; SI-NEXT:    s_mov_b32 s6, -1
2005; SI-NEXT:    s_waitcnt lgkmcnt(0)
2006; SI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
2007; SI-NEXT:    v_mov_b32_e32 v0, s0
2008; SI-NEXT:    v_mov_b32_e32 v1, s1
2009; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
2010; SI-NEXT:    s_endpgm
2011;
2012; VI-LABEL: s_shl_inline_high_imm_f32_4_0_i64:
2013; VI:       ; %bb.0:
2014; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2015; VI-NEXT:    s_load_dword s2, s[0:1], 0x34
2016; VI-NEXT:    s_mov_b32 s0, 0
2017; VI-NEXT:    s_mov_b32 s1, 4.0
2018; VI-NEXT:    s_mov_b32 s7, 0xf000
2019; VI-NEXT:    s_mov_b32 s6, -1
2020; VI-NEXT:    s_waitcnt lgkmcnt(0)
2021; VI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
2022; VI-NEXT:    v_mov_b32_e32 v0, s0
2023; VI-NEXT:    v_mov_b32_e32 v1, s1
2024; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
2025; VI-NEXT:    s_endpgm
2026;
2027; EG-LABEL: s_shl_inline_high_imm_f32_4_0_i64:
2028; EG:       ; %bb.0:
2029; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
2030; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
2031; EG-NEXT:    CF_END
2032; EG-NEXT:    PAD
2033; EG-NEXT:    ALU clause starting at 4:
2034; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
2035; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
2036; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
2037; EG-NEXT:    541065216(1.626303e-19), 32(4.484155e-44)
2038; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
2039; EG-NEXT:     MOV T0.X, 0.0,
2040; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
2041; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
2042  %shl = shl i64 4647714815446351872, %a
2043  store i64 %shl, i64 addrspace(1)* %out, align 8
2044  ret void
2045}
2046
2047define amdgpu_kernel void @s_shl_inline_high_imm_f32_neg_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
2048; SI-LABEL: s_shl_inline_high_imm_f32_neg_4_0_i64:
2049; SI:       ; %bb.0:
2050; SI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
2051; SI-NEXT:    s_load_dword s2, s[0:1], 0xd
2052; SI-NEXT:    s_mov_b32 s0, 0
2053; SI-NEXT:    s_mov_b32 s1, -4.0
2054; SI-NEXT:    s_mov_b32 s7, 0xf000
2055; SI-NEXT:    s_mov_b32 s6, -1
2056; SI-NEXT:    s_waitcnt lgkmcnt(0)
2057; SI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
2058; SI-NEXT:    v_mov_b32_e32 v0, s0
2059; SI-NEXT:    v_mov_b32_e32 v1, s1
2060; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
2061; SI-NEXT:    s_endpgm
2062;
2063; VI-LABEL: s_shl_inline_high_imm_f32_neg_4_0_i64:
2064; VI:       ; %bb.0:
2065; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
2066; VI-NEXT:    s_load_dword s2, s[0:1], 0x34
2067; VI-NEXT:    s_mov_b32 s0, 0
2068; VI-NEXT:    s_mov_b32 s1, -4.0
2069; VI-NEXT:    s_mov_b32 s7, 0xf000
2070; VI-NEXT:    s_mov_b32 s6, -1
2071; VI-NEXT:    s_waitcnt lgkmcnt(0)
2072; VI-NEXT:    s_lshl_b64 s[0:1], s[0:1], s2
2073; VI-NEXT:    v_mov_b32_e32 v0, s0
2074; VI-NEXT:    v_mov_b32_e32 v1, s1
2075; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
2076; VI-NEXT:    s_endpgm
2077;
2078; EG-LABEL: s_shl_inline_high_imm_f32_neg_4_0_i64:
2079; EG:       ; %bb.0:
2080; EG-NEXT:    ALU 7, @4, KC0[CB0:0-32], KC1[]
2081; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1
2082; EG-NEXT:    CF_END
2083; EG-NEXT:    PAD
2084; EG-NEXT:    ALU clause starting at 4:
2085; EG-NEXT:     NOT_INT * T0.W, KC0[2].W,
2086; EG-NEXT:     BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W,
2087; EG-NEXT:     AND_INT * T1.W, KC0[2].W, literal.y,
2088; EG-NEXT:    1614807040(5.534023e+19), 32(4.484155e-44)
2089; EG-NEXT:     CNDE_INT * T0.Y, PS, PV.W, 0.0,
2090; EG-NEXT:     MOV T0.X, 0.0,
2091; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.x,
2092; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
2093  %shl = shl i64 13871086852301127680, %a
2094  store i64 %shl, i64 addrspace(1)* %out, align 8
2095  ret void
2096}
2097
2098define amdgpu_kernel void @test_mul2(i32 %p) {
2099; SI-LABEL: test_mul2:
2100; SI:       ; %bb.0:
2101; SI-NEXT:    s_load_dword s0, s[0:1], 0x9
2102; SI-NEXT:    s_mov_b32 s3, 0xf000
2103; SI-NEXT:    s_mov_b32 s2, -1
2104; SI-NEXT:    s_waitcnt lgkmcnt(0)
2105; SI-NEXT:    s_lshl_b32 s0, s0, 1
2106; SI-NEXT:    v_mov_b32_e32 v0, s0
2107; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2108; SI-NEXT:    s_waitcnt vmcnt(0)
2109; SI-NEXT:    s_endpgm
2110;
2111; VI-LABEL: test_mul2:
2112; VI:       ; %bb.0:
2113; VI-NEXT:    s_load_dword s0, s[0:1], 0x24
2114; VI-NEXT:    s_mov_b32 s3, 0xf000
2115; VI-NEXT:    s_mov_b32 s2, -1
2116; VI-NEXT:    s_waitcnt lgkmcnt(0)
2117; VI-NEXT:    s_lshl_b32 s0, s0, 1
2118; VI-NEXT:    v_mov_b32_e32 v0, s0
2119; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2120; VI-NEXT:    s_waitcnt vmcnt(0)
2121; VI-NEXT:    s_endpgm
2122;
2123; EG-LABEL: test_mul2:
2124; EG:       ; %bb.0:
2125; EG-NEXT:    ALU 2, @4, KC0[CB0:0-32], KC1[]
2126; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T1.X, T0.X, 1
2127; EG-NEXT:    CF_END
2128; EG-NEXT:    PAD
2129; EG-NEXT:    ALU clause starting at 4:
2130; EG-NEXT:     MOV T0.X, literal.x,
2131; EG-NEXT:     LSHL * T1.X, KC0[2].Y, 1,
2132; EG-NEXT:    0(0.000000e+00), 0(0.000000e+00)
2133   %i = mul i32 %p, 2
2134   store volatile i32 %i, i32 addrspace(1)* undef
2135   ret void
2136}
2137
2138define void @shl_or_k(i32 addrspace(1)* %out, i32 %in) {
2139; SI-LABEL: shl_or_k:
2140; SI:       ; %bb.0:
2141; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2142; SI-NEXT:    s_mov_b32 s6, 0
2143; SI-NEXT:    v_lshlrev_b32_e32 v2, 2, v2
2144; SI-NEXT:    s_mov_b32 s7, 0xf000
2145; SI-NEXT:    s_mov_b32 s4, s6
2146; SI-NEXT:    s_mov_b32 s5, s6
2147; SI-NEXT:    v_or_b32_e32 v2, 4, v2
2148; SI-NEXT:    buffer_store_dword v2, v[0:1], s[4:7], 0 addr64
2149; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
2150; SI-NEXT:    s_setpc_b64 s[30:31]
2151;
2152; VI-LABEL: shl_or_k:
2153; VI:       ; %bb.0:
2154; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2155; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v2
2156; VI-NEXT:    v_or_b32_e32 v2, 4, v2
2157; VI-NEXT:    flat_store_dword v[0:1], v2
2158; VI-NEXT:    s_waitcnt vmcnt(0)
2159; VI-NEXT:    s_setpc_b64 s[30:31]
2160;
2161; EG-LABEL: shl_or_k:
2162; EG:       ; %bb.0:
2163; EG-NEXT:    ALU 4, @4, KC0[CB0:0-32], KC1[]
2164; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T0.X, T1.X, 1
2165; EG-NEXT:    CF_END
2166; EG-NEXT:    PAD
2167; EG-NEXT:    ALU clause starting at 4:
2168; EG-NEXT:     LSHL * T0.W, KC0[2].Z, literal.x,
2169; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
2170; EG-NEXT:     OR_INT T0.X, PV.W, literal.x,
2171; EG-NEXT:     LSHR * T1.X, KC0[2].Y, literal.y,
2172; EG-NEXT:    4(5.605194e-45), 2(2.802597e-45)
2173  %tmp0 = or i32 %in, 1
2174  %tmp2 = shl i32 %tmp0, 2
2175  store i32 %tmp2, i32 addrspace(1)* %out
2176  ret void
2177}
2178
2179define void @shl_or_k_two_uses(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 %in) {
2180; SI-LABEL: shl_or_k_two_uses:
2181; SI:       ; %bb.0:
2182; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2183; SI-NEXT:    s_mov_b32 s6, 0
2184; SI-NEXT:    v_or_b32_e32 v4, 1, v4
2185; SI-NEXT:    s_mov_b32 s7, 0xf000
2186; SI-NEXT:    s_mov_b32 s4, s6
2187; SI-NEXT:    s_mov_b32 s5, s6
2188; SI-NEXT:    v_lshlrev_b32_e32 v5, 2, v4
2189; SI-NEXT:    buffer_store_dword v5, v[0:1], s[4:7], 0 addr64
2190; SI-NEXT:    buffer_store_dword v4, v[2:3], s[4:7], 0 addr64
2191; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
2192; SI-NEXT:    s_setpc_b64 s[30:31]
2193;
2194; VI-LABEL: shl_or_k_two_uses:
2195; VI:       ; %bb.0:
2196; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2197; VI-NEXT:    v_or_b32_e32 v4, 1, v4
2198; VI-NEXT:    v_lshlrev_b32_e32 v5, 2, v4
2199; VI-NEXT:    flat_store_dword v[0:1], v5
2200; VI-NEXT:    flat_store_dword v[2:3], v4
2201; VI-NEXT:    s_waitcnt vmcnt(0)
2202; VI-NEXT:    s_setpc_b64 s[30:31]
2203;
2204; EG-LABEL: shl_or_k_two_uses:
2205; EG:       ; %bb.0:
2206; EG-NEXT:    ALU 5, @4, KC0[CB0:0-32], KC1[]
2207; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T2.X, T3.X, 0
2208; EG-NEXT:    MEM_RAT_CACHELESS STORE_RAW T1.X, T0.X, 1
2209; EG-NEXT:    CF_END
2210; EG-NEXT:    ALU clause starting at 4:
2211; EG-NEXT:     LSHR T0.X, KC0[2].Z, literal.x,
2212; EG-NEXT:     OR_INT * T1.X, KC0[2].W, 1,
2213; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
2214; EG-NEXT:     LSHL T2.X, PS, literal.x,
2215; EG-NEXT:     LSHR * T3.X, KC0[2].Y, literal.x,
2216; EG-NEXT:    2(2.802597e-45), 0(0.000000e+00)
2217  %tmp0 = or i32 %in, 1
2218  %tmp2 = shl i32 %tmp0, 2
2219  store i32 %tmp2, i32 addrspace(1)* %out0
2220  store i32 %tmp0, i32 addrspace(1)* %out1
2221  ret void
2222}
2223
2224attributes #0 = { nounwind readnone }
2225