xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/shl.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=amdgcn -mcpu=verde -verify-machineinstrs | FileCheck -check-prefix=GCN -check-prefix=SI %s
2*9880d681SAndroid Build Coastguard Worker; XUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck -check-prefix=GCN -check-prefix=VI %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=EG %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.r600.read.tidig.x() #0
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker;EG: {{^}}shl_v2i32:
9*9880d681SAndroid Build Coastguard Worker;EG: LSHL {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
10*9880d681SAndroid Build Coastguard Worker;EG: LSHL {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker;SI: {{^}}shl_v2i32:
13*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
14*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker;VI: {{^}}shl_v2i32:
17*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
18*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine void @shl_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) {
21*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1
22*9880d681SAndroid Build Coastguard Worker  %a = load <2 x i32>, <2 x i32> addrspace(1) * %in
23*9880d681SAndroid Build Coastguard Worker  %b = load <2 x i32>, <2 x i32> addrspace(1) * %b_ptr
24*9880d681SAndroid Build Coastguard Worker  %result = shl <2 x i32> %a, %b
25*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %result, <2 x i32> addrspace(1)* %out
26*9880d681SAndroid Build Coastguard Worker  ret void
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker;EG: {{^}}shl_v4i32:
30*9880d681SAndroid Build Coastguard Worker;EG: LSHL {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
31*9880d681SAndroid Build Coastguard Worker;EG: LSHL {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
32*9880d681SAndroid Build Coastguard Worker;EG: LSHL {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
33*9880d681SAndroid Build Coastguard Worker;EG: LSHL {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker;SI: {{^}}shl_v4i32:
36*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
37*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
38*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
39*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker;VI: {{^}}shl_v4i32:
42*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
43*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
44*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
45*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine void @shl_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
48*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1
49*9880d681SAndroid Build Coastguard Worker  %a = load <4 x i32>, <4 x i32> addrspace(1) * %in
50*9880d681SAndroid Build Coastguard Worker  %b = load <4 x i32>, <4 x i32> addrspace(1) * %b_ptr
51*9880d681SAndroid Build Coastguard Worker  %result = shl <4 x i32> %a, %b
52*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %result, <4 x i32> addrspace(1)* %out
53*9880d681SAndroid Build Coastguard Worker  ret void
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker;EG-LABEL: {{^}}shl_i64:
57*9880d681SAndroid Build Coastguard Worker;EG: SUB_INT {{\*? *}}[[COMPSH:T[0-9]+\.[XYZW]]], {{literal.[xy]}}, [[SHIFT:T[0-9]+\.[XYZW]]]
58*9880d681SAndroid Build Coastguard Worker;EG: LSHR {{\* *}}[[TEMP:T[0-9]+\.[XYZW]]], [[OPLO:T[0-9]+\.[XYZW]]], {{[[COMPSH]]|PV.[XYZW]}}
59*9880d681SAndroid Build Coastguard Worker;EG-DAG: ADD_INT {{\*? *}}[[BIGSH:T[0-9]+\.[XYZW]]], [[SHIFT]], literal
60*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{\*? *}}[[OVERF:T[0-9]+\.[XYZW]]], {{[[TEMP]]|PV.[XYZW]}}, 1
61*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{\*? *}}[[HISMTMP:T[0-9]+\.[XYZW]]], [[OPHI:T[0-9]+\.[XYZW]]], [[SHIFT]]
62*9880d681SAndroid Build Coastguard Worker;EG-DAG: OR_INT {{\*? *}}[[HISM:T[0-9]+\.[XYZW]]], {{[[HISMTMP]]|PV.[XYZW]|PS}}, {{[[OVERF]]|PV.[XYZW]}}
63*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{\*? *}}[[LOSM:T[0-9]+\.[XYZW]]], [[OPLO]], {{PS|[[SHIFT]]|PV.[XYZW]}}
64*9880d681SAndroid Build Coastguard Worker;EG-DAG: SETGT_UINT {{\*? *}}[[RESC:T[0-9]+\.[XYZW]]], [[SHIFT]], literal
65*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT {{\*? *}}[[RESLO:T[0-9]+\.[XYZW]]], {{T[0-9]+\.[XYZW]}}
66*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT {{\*? *}}[[RESHI:T[0-9]+\.[XYZW]]], {{T[0-9]+\.[XYZW], .*}}, 0.0
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker;SI: {{^}}shl_i64:
69*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\], v\[[0-9]+:[0-9]+\], v[0-9]+}}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker;VI: {{^}}shl_i64:
72*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b64 {{v\[[0-9]+:[0-9]+\], v[0-9]+, v\[[0-9]+:[0-9]+\]}}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine void @shl_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) {
75*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr i64, i64 addrspace(1)* %in, i64 1
76*9880d681SAndroid Build Coastguard Worker  %a = load i64, i64 addrspace(1) * %in
77*9880d681SAndroid Build Coastguard Worker  %b = load i64, i64 addrspace(1) * %b_ptr
78*9880d681SAndroid Build Coastguard Worker  %result = shl i64 %a, %b
79*9880d681SAndroid Build Coastguard Worker  store i64 %result, i64 addrspace(1)* %out
80*9880d681SAndroid Build Coastguard Worker  ret void
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker;EG-LABEL: {{^}}shl_v2i64:
84*9880d681SAndroid Build Coastguard Worker;EG-DAG: SUB_INT {{\*? *}}[[COMPSHA:T[0-9]+\.[XYZW]]], {{literal.[xy]}}, [[SHA:T[0-9]+\.[XYZW]]]
85*9880d681SAndroid Build Coastguard Worker;EG-DAG: SUB_INT {{\*? *}}[[COMPSHB:T[0-9]+\.[XYZW]]], {{literal.[xy]}}, [[SHB:T[0-9]+\.[XYZW]]]
86*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{\*? *}}[[COMPSHA]]
87*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{\*? *}}[[COMPSHB]]
88*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{.*}}, 1
89*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{.*}}, 1
90*9880d681SAndroid Build Coastguard Worker;EG-DAG: ADD_INT  {{\*? *}}[[BIGSHA:T[0-9]+\.[XYZW]]]{{.*}}, literal
91*9880d681SAndroid Build Coastguard Worker;EG-DAG: ADD_INT  {{\*? *}}[[BIGSHB:T[0-9]+\.[XYZW]]]{{.*}}, literal
92*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHA]]
93*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHB]]
94*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHA]]
95*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHB]]
96*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL
97*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL
98*9880d681SAndroid Build Coastguard Worker;EG-DAG: SETGT_UINT {{\*? *T[0-9]\.[XYZW]}}, [[SHA]], literal
99*9880d681SAndroid Build Coastguard Worker;EG-DAG: SETGT_UINT {{\*? *T[0-9]\.[XYZW]}}, [[SHB]], literal
100*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT {{.*}}, 0.0
101*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT {{.*}}, 0.0
102*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT
103*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker;SI: {{^}}shl_v2i64:
106*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\], v\[[0-9]+:[0-9]+\], v[0-9]+}}
107*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\], v\[[0-9]+:[0-9]+\], v[0-9]+}}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker;VI: {{^}}shl_v2i64:
110*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b64 {{v\[[0-9]+:[0-9]+\], v[0-9]+, v\[[0-9]+:[0-9]+\]}}
111*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b64 {{v\[[0-9]+:[0-9]+\], v[0-9]+, v\[[0-9]+:[0-9]+\]}}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine void @shl_v2i64(<2 x i64> addrspace(1)* %out, <2 x i64> addrspace(1)* %in) {
114*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr <2 x i64>, <2 x i64> addrspace(1)* %in, i64 1
115*9880d681SAndroid Build Coastguard Worker  %a = load <2 x i64>, <2 x i64> addrspace(1) * %in
116*9880d681SAndroid Build Coastguard Worker  %b = load <2 x i64>, <2 x i64> addrspace(1) * %b_ptr
117*9880d681SAndroid Build Coastguard Worker  %result = shl <2 x i64> %a, %b
118*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %result, <2 x i64> addrspace(1)* %out
119*9880d681SAndroid Build Coastguard Worker  ret void
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker;EG: {{^}}shl_v4i64:
123*9880d681SAndroid Build Coastguard Worker;EG-DAG: SUB_INT {{\*? *}}[[COMPSHA:T[0-9]+\.[XYZW]]], {{literal.[xy]}}, [[SHA:T[0-9]+\.[XYZW]]]
124*9880d681SAndroid Build Coastguard Worker;EG-DAG: SUB_INT {{\*? *}}[[COMPSHB:T[0-9]+\.[XYZW]]], {{literal.[xy]}}, [[SHB:T[0-9]+\.[XYZW]]]
125*9880d681SAndroid Build Coastguard Worker;EG-DAG: SUB_INT {{\*? *}}[[COMPSHC:T[0-9]+\.[XYZW]]], {{literal.[xy]}}, [[SHC:T[0-9]+\.[XYZW]]]
126*9880d681SAndroid Build Coastguard Worker;EG-DAG: SUB_INT {{\*? *}}[[COMPSHD:T[0-9]+\.[XYZW]]], {{literal.[xy]}}, [[SHD:T[0-9]+\.[XYZW]]]
127*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{\*? *}}[[COMPSHA]]
128*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{\*? *}}[[COMPSHB]]
129*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{\*? *}}[[COMPSHC]]
130*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{\*? *}}[[COMPSHD]]
131*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{.*}}, 1
132*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{.*}}, 1
133*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{.*}}, 1
134*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHR {{.*}}, 1
135*9880d681SAndroid Build Coastguard Worker;EG-DAG: ADD_INT  {{\*? *}}[[BIGSHA:T[0-9]+\.[XYZW]]]{{.*}}, literal
136*9880d681SAndroid Build Coastguard Worker;EG-DAG: ADD_INT  {{\*? *}}[[BIGSHB:T[0-9]+\.[XYZW]]]{{.*}}, literal
137*9880d681SAndroid Build Coastguard Worker;EG-DAG: ADD_INT  {{\*? *}}[[BIGSHC:T[0-9]+\.[XYZW]]]{{.*}}, literal
138*9880d681SAndroid Build Coastguard Worker;EG-DAG: ADD_INT  {{\*? *}}[[BIGSHD:T[0-9]+\.[XYZW]]]{{.*}}, literal
139*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHA]]
140*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHB]]
141*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHC]]
142*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHD]]
143*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHA]]
144*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHB]]
145*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHC]]
146*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL {{.*}}, [[SHD]]
147*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL
148*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL
149*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL
150*9880d681SAndroid Build Coastguard Worker;EG-DAG: LSHL
151*9880d681SAndroid Build Coastguard Worker;EG-DAG: SETGT_UINT {{\*? *T[0-9]\.[XYZW]}}, [[SHA]], literal
152*9880d681SAndroid Build Coastguard Worker;EG-DAG: SETGT_UINT {{\*? *T[0-9]\.[XYZW]}}, [[SHB]], literal
153*9880d681SAndroid Build Coastguard Worker;EG-DAG: SETGT_UINT {{\*? *T[0-9]\.[XYZW]}}, [[SHC]], literal
154*9880d681SAndroid Build Coastguard Worker;EG-DAG: SETGT_UINT {{\*? *T[0-9]\.[XYZW]}}, [[SHD]], literal
155*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT {{.*}}, 0.0
156*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT {{.*}}, 0.0
157*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT {{.*}}, 0.0
158*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT {{.*}}, 0.0
159*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT
160*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT
161*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT
162*9880d681SAndroid Build Coastguard Worker;EG-DAG: CNDE_INT
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker;SI: {{^}}shl_v4i64:
165*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\], v\[[0-9]+:[0-9]+\], v[0-9]+}}
166*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\], v\[[0-9]+:[0-9]+\], v[0-9]+}}
167*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\], v\[[0-9]+:[0-9]+\], v[0-9]+}}
168*9880d681SAndroid Build Coastguard Worker;SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\], v\[[0-9]+:[0-9]+\], v[0-9]+}}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker;VI: {{^}}shl_v4i64:
171*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b64 {{v\[[0-9]+:[0-9]+\], v[0-9]+, v\[[0-9]+:[0-9]+\]}}
172*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b64 {{v\[[0-9]+:[0-9]+\], v[0-9]+, v\[[0-9]+:[0-9]+\]}}
173*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b64 {{v\[[0-9]+:[0-9]+\], v[0-9]+, v\[[0-9]+:[0-9]+\]}}
174*9880d681SAndroid Build Coastguard Worker;VI: v_lshlrev_b64 {{v\[[0-9]+:[0-9]+\], v[0-9]+, v\[[0-9]+:[0-9]+\]}}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerdefine void @shl_v4i64(<4 x i64> addrspace(1)* %out, <4 x i64> addrspace(1)* %in) {
177*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr <4 x i64>, <4 x i64> addrspace(1)* %in, i64 1
178*9880d681SAndroid Build Coastguard Worker  %a = load <4 x i64>, <4 x i64> addrspace(1) * %in
179*9880d681SAndroid Build Coastguard Worker  %b = load <4 x i64>, <4 x i64> addrspace(1) * %b_ptr
180*9880d681SAndroid Build Coastguard Worker  %result = shl <4 x i64> %a, %b
181*9880d681SAndroid Build Coastguard Worker  store <4 x i64> %result, <4 x i64> addrspace(1)* %out
182*9880d681SAndroid Build Coastguard Worker  ret void
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker; Make sure load width gets reduced to i32 load.
186*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_shl_32_i64:
187*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_load_dword [[LO_A:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb{{$}}
188*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[VLO:[0-9]+]], 0{{$}}
189*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[VHI:[0-9]+]], [[LO_A]]
190*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[VLO]]:[[VHI]]{{\]}}
191*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_32_i64(i64 addrspace(1)* %out, i64 %a) {
192*9880d681SAndroid Build Coastguard Worker  %result = shl i64 %a, 32
193*9880d681SAndroid Build Coastguard Worker  store i64 %result, i64 addrspace(1)* %out
194*9880d681SAndroid Build Coastguard Worker  ret void
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_shl_32_i64:
198*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_dword v[[LO_A:[0-9]+]],
199*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[VLO:[0-9]+]], 0{{$}}
200*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[VLO]]:[[LO_A]]{{\]}}
201*9880d681SAndroid Build Coastguard Workerdefine void @v_shl_32_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) {
202*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.r600.read.tidig.x() #0
203*9880d681SAndroid Build Coastguard Worker  %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
204*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr i64, i64 addrspace(1)* %out, i32 %tid
205*9880d681SAndroid Build Coastguard Worker  %a = load i64, i64 addrspace(1)* %gep.in
206*9880d681SAndroid Build Coastguard Worker  %result = shl i64 %a, 32
207*9880d681SAndroid Build Coastguard Worker  store i64 %result, i64 addrspace(1)* %gep.out
208*9880d681SAndroid Build Coastguard Worker  ret void
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_constant_i64
212*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, s{{[0-9]+}}
213*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_constant_i64(i64 addrspace(1)* %out, i64 %a) {
214*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 281474976710655, %a
215*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
216*9880d681SAndroid Build Coastguard Worker  ret void
217*9880d681SAndroid Build Coastguard Worker}
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_shl_constant_i64:
220*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[VAL:v[0-9]+]]
221*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[KLO:[0-9]+]], 0xab19b207
222*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_movk_i32 s[[KHI:[0-9]+]], 0x11e{{$}}
223*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\]}}, s{{\[}}[[KLO]]:[[KHI]]{{\]}}, [[VAL]]
224*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2
225*9880d681SAndroid Build Coastguard Workerdefine void @v_shl_constant_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) {
226*9880d681SAndroid Build Coastguard Worker  %a = load i64, i64 addrspace(1)* %aptr, align 8
227*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 1231231234567, %a
228*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
229*9880d681SAndroid Build Coastguard Worker  ret void
230*9880d681SAndroid Build Coastguard Worker}
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_shl_i64_32_bit_constant:
233*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[VAL:v[0-9]+]]
234*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[KLO:[0-9]+]], 0x12d687{{$}}
235*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[KHI:[0-9]+]], 0{{$}}
236*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\]}}, s{{\[}}[[KLO]]:[[KHI]]{{\]}}, [[VAL]]
237*9880d681SAndroid Build Coastguard Workerdefine void @v_shl_i64_32_bit_constant(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) {
238*9880d681SAndroid Build Coastguard Worker  %a = load i64, i64 addrspace(1)* %aptr, align 8
239*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 1234567, %a
240*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
241*9880d681SAndroid Build Coastguard Worker  ret void
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_shl_inline_imm_64_i64:
245*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 {{v\[[0-9]+:[0-9]+\]}}, 64, {{v[0-9]+}}
246*9880d681SAndroid Build Coastguard Workerdefine void @v_shl_inline_imm_64_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) {
247*9880d681SAndroid Build Coastguard Worker  %a = load i64, i64 addrspace(1)* %aptr, align 8
248*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 64, %a
249*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
250*9880d681SAndroid Build Coastguard Worker  ret void
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_64_i64:
254*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, 64, s{{[0-9]+}}
255*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_64_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
256*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 64, %a
257*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
258*9880d681SAndroid Build Coastguard Worker  ret void
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_1_i64:
262*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, 1, s{{[0-9]+}}
263*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_1_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
264*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 1, %a
265*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
266*9880d681SAndroid Build Coastguard Worker  ret void
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_1.0_i64:
270*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, 1.0, s{{[0-9]+}}
271*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_1.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
272*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 4607182418800017408, %a
273*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
274*9880d681SAndroid Build Coastguard Worker  ret void
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_neg_1.0_i64:
278*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, -1.0, s{{[0-9]+}}
279*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_neg_1.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
280*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 13830554455654793216, %a
281*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
282*9880d681SAndroid Build Coastguard Worker  ret void
283*9880d681SAndroid Build Coastguard Worker}
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_0.5_i64:
286*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, 0.5, s{{[0-9]+}}
287*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_0.5_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
288*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 4602678819172646912, %a
289*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
290*9880d681SAndroid Build Coastguard Worker  ret void
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_neg_0.5_i64:
294*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, -0.5, s{{[0-9]+}}
295*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_neg_0.5_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
296*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 13826050856027422720, %a
297*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
298*9880d681SAndroid Build Coastguard Worker  ret void
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_2.0_i64:
302*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, 2.0, s{{[0-9]+}}
303*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_2.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
304*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 4611686018427387904, %a
305*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
306*9880d681SAndroid Build Coastguard Worker  ret void
307*9880d681SAndroid Build Coastguard Worker}
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_neg_2.0_i64:
310*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, -2.0, s{{[0-9]+}}
311*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_neg_2.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
312*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 13835058055282163712, %a
313*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
314*9880d681SAndroid Build Coastguard Worker  ret void
315*9880d681SAndroid Build Coastguard Worker}
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_4.0_i64:
318*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, 4.0, s{{[0-9]+}}
319*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_4.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
320*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 4616189618054758400, %a
321*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
322*9880d681SAndroid Build Coastguard Worker  ret void
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_neg_4.0_i64:
326*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, -4.0, s{{[0-9]+}}
327*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_neg_4.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
328*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 13839561654909534208, %a
329*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
330*9880d681SAndroid Build Coastguard Worker  ret void
331*9880d681SAndroid Build Coastguard Worker}
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker; Test with the 64-bit integer bitpattern for a 32-bit float in the
335*9880d681SAndroid Build Coastguard Worker; low 32-bits, which is not a valid 64-bit inline immmediate.
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_f32_4.0_i64:
338*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_LO:[0-9]+]], 4.0
339*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_HI:[0-9]+]], 0{{$}}
340*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, s{{\[}}[[K_LO]]:[[K_HI]]{{\]}}, s{{[0-9]+}}
341*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_f32_4.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
342*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 1082130432, %a
343*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
344*9880d681SAndroid Build Coastguard Worker  ret void
345*9880d681SAndroid Build Coastguard Worker}
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Worker; FIXME: Copy of -1 register
348*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_imm_f32_neg_4.0_i64:
349*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_LO:[0-9]+]], -4.0
350*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_HI:[0-9]+]], -1{{$}}
351*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_HI_COPY:[0-9]+]], s[[K_HI]]
352*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, s{{\[}}[[K_LO]]:[[K_HI_COPY]]{{\]}}, s{{[0-9]+}}
353*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_imm_f32_neg_4.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
354*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 -1065353216, %a
355*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
356*9880d681SAndroid Build Coastguard Worker  ret void
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Worker; Shift into upper 32-bits
360*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_high_imm_f32_4.0_i64:
361*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_HI:[0-9]+]], 4.0
362*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_LO:[0-9]+]], 0{{$}}
363*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, s{{\[}}[[K_LO]]:[[K_HI]]{{\]}}, s{{[0-9]+}}
364*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_high_imm_f32_4.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
365*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 4647714815446351872, %a
366*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
367*9880d681SAndroid Build Coastguard Worker  ret void
368*9880d681SAndroid Build Coastguard Worker}
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_shl_inline_high_imm_f32_neg_4.0_i64:
371*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_HI:[0-9]+]], -4.0
372*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 s[[K_LO:[0-9]+]], 0{{$}}
373*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 s{{\[[0-9]+:[0-9]+\]}}, s{{\[}}[[K_LO]]:[[K_HI]]{{\]}}, s{{[0-9]+}}
374*9880d681SAndroid Build Coastguard Workerdefine void @s_shl_inline_high_imm_f32_neg_4.0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) {
375*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 13871086852301127680, %a
376*9880d681SAndroid Build Coastguard Worker  store i64 %shl, i64 addrspace(1)* %out, align 8
377*9880d681SAndroid Build Coastguard Worker  ret void
378*9880d681SAndroid Build Coastguard Worker}
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone }
381