1*5df1ac78Salex-t; RUN: llc -march=amdgcn -mcpu=tahiti -stop-after=instruction-select -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX6 %s
2*5df1ac78Salex-t; RUN: llc -march=amdgcn -mcpu=fiji -stop-after=instruction-select -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX8-10 %s
3*5df1ac78Salex-t; RUN: llc -march=amdgcn -mcpu=gfx1010 -stop-after=instruction-select -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX8-10 %s
4*5df1ac78Salex-t
5*5df1ac78Salex-t; GCN-LABEL: name:            s_shl_i32
6*5df1ac78Salex-t; GCN: S_LSHL_B32
7*5df1ac78Salex-tdefine amdgpu_kernel void @s_shl_i32(i32 addrspace(1)* %out, i32 %lhs, i32 %rhs) {
8*5df1ac78Salex-t  %result = shl i32 %lhs, %rhs
9*5df1ac78Salex-t  store i32 %result, i32 addrspace(1)* %out
10*5df1ac78Salex-t  ret void
11*5df1ac78Salex-t}
12*5df1ac78Salex-t
13*5df1ac78Salex-t; GCN-LABEL: name:            v_shl_i32
14*5df1ac78Salex-t; GFX6: V_LSHL_B32_e32
15*5df1ac78Salex-t; GFX8-10: V_LSHLREV_B32_e32
16*5df1ac78Salex-tdefine amdgpu_kernel void @v_shl_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
17*5df1ac78Salex-t  %tid = call i32 @llvm.amdgcn.workitem.id.x()
18*5df1ac78Salex-t  %b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
19*5df1ac78Salex-t  %a = load i32, i32 addrspace(1)* %in
20*5df1ac78Salex-t  %b = load i32, i32 addrspace(1)* %b_ptr
21*5df1ac78Salex-t  %result = shl i32 %a, %b
22*5df1ac78Salex-t  store i32 %result, i32 addrspace(1)* %out
23*5df1ac78Salex-t  ret void
24*5df1ac78Salex-t}
25*5df1ac78Salex-t
26*5df1ac78Salex-t; GCN-LABEL: name:            s_lshr_i32
27*5df1ac78Salex-t; GCN: S_LSHR_B32
28*5df1ac78Salex-tdefine amdgpu_kernel void @s_lshr_i32(i32 addrspace(1)* %out, i32 %lhs, i32 %rhs) {
29*5df1ac78Salex-t  %result = lshr i32 %lhs, %rhs
30*5df1ac78Salex-t  store i32 %result, i32 addrspace(1)* %out
31*5df1ac78Salex-t  ret void
32*5df1ac78Salex-t}
33*5df1ac78Salex-t
34*5df1ac78Salex-t; GCN-LABEL: name:            v_lshr_i32
35*5df1ac78Salex-t; GFX6: V_LSHR_B32_e32
36*5df1ac78Salex-t; GFX8-10: V_LSHRREV_B32_e64
37*5df1ac78Salex-tdefine amdgpu_kernel void @v_lshr_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
38*5df1ac78Salex-t  %tid = call i32 @llvm.amdgcn.workitem.id.x()
39*5df1ac78Salex-t  %b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
40*5df1ac78Salex-t  %a = load i32, i32 addrspace(1)* %in
41*5df1ac78Salex-t  %b = load i32, i32 addrspace(1)* %b_ptr
42*5df1ac78Salex-t  %result = lshr i32 %a, %b
43*5df1ac78Salex-t  store i32 %result, i32 addrspace(1)* %out
44*5df1ac78Salex-t  ret void
45*5df1ac78Salex-t}
46*5df1ac78Salex-t
47*5df1ac78Salex-t; GCN-LABEL: name:            s_ashr_i32
48*5df1ac78Salex-t; GCN: S_ASHR_I32
49*5df1ac78Salex-tdefine amdgpu_kernel void @s_ashr_i32(i32 addrspace(1)* %out, i32 %lhs, i32 %rhs) #0 {
50*5df1ac78Salex-t  %result = ashr i32 %lhs, %rhs
51*5df1ac78Salex-t  store i32 %result, i32 addrspace(1)* %out
52*5df1ac78Salex-t  ret void
53*5df1ac78Salex-t}
54*5df1ac78Salex-t
55*5df1ac78Salex-t; GCN-LABEL: name:            v_ashr_i32
56*5df1ac78Salex-t; GFX6: V_ASHR_I32_e32
57*5df1ac78Salex-t; GFX8-10: V_ASHRREV_I32_e64
58*5df1ac78Salex-tdefine amdgpu_kernel void @v_ashr_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
59*5df1ac78Salex-t  %tid = call i32 @llvm.amdgcn.workitem.id.x()
60*5df1ac78Salex-t  %b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
61*5df1ac78Salex-t  %a = load i32, i32 addrspace(1)* %in
62*5df1ac78Salex-t  %b = load i32, i32 addrspace(1)* %b_ptr
63*5df1ac78Salex-t  %result = ashr i32 %a, %b
64*5df1ac78Salex-t  store i32 %result, i32 addrspace(1)* %out
65*5df1ac78Salex-t  ret void
66*5df1ac78Salex-t}
67*5df1ac78Salex-t
68*5df1ac78Salex-t; GCN-LABEL: name:            s_shl_i64
69*5df1ac78Salex-t; GCN: S_LSHL_B64
70*5df1ac78Salex-tdefine amdgpu_kernel void @s_shl_i64(i64 addrspace(1)* %out, i64 %lhs, i64 %rhs) {
71*5df1ac78Salex-t  %result = shl i64 %lhs, %rhs
72*5df1ac78Salex-t  store i64 %result, i64 addrspace(1)* %out
73*5df1ac78Salex-t  ret void
74*5df1ac78Salex-t}
75*5df1ac78Salex-t
76*5df1ac78Salex-t; GCN-LABEL: name:            v_shl_i64
77*5df1ac78Salex-t; GFX6: V_LSHL_B64
78*5df1ac78Salex-t; GFX8: V_LSHLREV_B64
79*5df1ac78Salex-tdefine amdgpu_kernel void @v_shl_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) {
80*5df1ac78Salex-t  %tid = call i32 @llvm.amdgcn.workitem.id.x()
81*5df1ac78Salex-t  %idx = zext i32 %tid to i64
82*5df1ac78Salex-t  %b_ptr = getelementptr i64, i64 addrspace(1)* %in, i64 %idx
83*5df1ac78Salex-t  %a = load i64, i64 addrspace(1)* %in
84*5df1ac78Salex-t  %b = load i64, i64 addrspace(1)* %b_ptr
85*5df1ac78Salex-t  %result = shl i64 %a, %b
86*5df1ac78Salex-t  store i64 %result, i64 addrspace(1)* %out
87*5df1ac78Salex-t  ret void
88*5df1ac78Salex-t}
89*5df1ac78Salex-t
90*5df1ac78Salex-t; GCN-LABEL: name:            s_lshr_i64
91*5df1ac78Salex-t; GCN: S_LSHR_B64
92*5df1ac78Salex-tdefine amdgpu_kernel void @s_lshr_i64(i64 addrspace(1)* %out, i64 %lhs, i64 %rhs) {
93*5df1ac78Salex-t  %result = lshr i64 %lhs, %rhs
94*5df1ac78Salex-t  store i64 %result, i64 addrspace(1)* %out
95*5df1ac78Salex-t  ret void
96*5df1ac78Salex-t}
97*5df1ac78Salex-t
98*5df1ac78Salex-t; GCN-LABEL: name:            v_lshr_i64
99*5df1ac78Salex-t; GFX6: V_LSHR_B64
100*5df1ac78Salex-t; GFX8: V_LSHRREV_B64
101*5df1ac78Salex-tdefine amdgpu_kernel void @v_lshr_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) {
102*5df1ac78Salex-t  %tid = call i32 @llvm.amdgcn.workitem.id.x()
103*5df1ac78Salex-t  %idx = zext i32 %tid to i64
104*5df1ac78Salex-t  %b_ptr = getelementptr i64, i64 addrspace(1)* %in, i64 %idx
105*5df1ac78Salex-t  %a = load i64, i64 addrspace(1)* %in
106*5df1ac78Salex-t  %b = load i64, i64 addrspace(1)* %b_ptr
107*5df1ac78Salex-t  %result = lshr i64 %a, %b
108*5df1ac78Salex-t  store i64 %result, i64 addrspace(1)* %out
109*5df1ac78Salex-t  ret void
110*5df1ac78Salex-t}
111*5df1ac78Salex-t
112*5df1ac78Salex-t; GCN-LABEL: name:            s_ashr_i64
113*5df1ac78Salex-t; GCN: S_ASHR_I64
114*5df1ac78Salex-tdefine amdgpu_kernel void @s_ashr_i64(i64 addrspace(1)* %out, i64 %lhs, i64 %rhs) {
115*5df1ac78Salex-t  %result = ashr i64 %lhs, %rhs
116*5df1ac78Salex-t  store i64 %result, i64 addrspace(1)* %out
117*5df1ac78Salex-t  ret void
118*5df1ac78Salex-t}
119*5df1ac78Salex-t
120*5df1ac78Salex-t; GCN-LABEL: name:            v_ashr_i64
121*5df1ac78Salex-t; GFX6: V_ASHR_I64
122*5df1ac78Salex-t; GFX8: V_ASHRREV_I64
123*5df1ac78Salex-tdefine amdgpu_kernel void @v_ashr_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) {
124*5df1ac78Salex-t  %tid = call i32 @llvm.amdgcn.workitem.id.x()
125*5df1ac78Salex-t  %idx = zext i32 %tid to i64
126*5df1ac78Salex-t  %b_ptr = getelementptr i64, i64 addrspace(1)* %in, i64 %idx
127*5df1ac78Salex-t  %a = load i64, i64 addrspace(1)* %in
128*5df1ac78Salex-t  %b = load i64, i64 addrspace(1)* %b_ptr
129*5df1ac78Salex-t  %result = ashr i64 %a, %b
130*5df1ac78Salex-t  store i64 %result, i64 addrspace(1)* %out
131*5df1ac78Salex-t  ret void
132*5df1ac78Salex-t}
133*5df1ac78Salex-t
134*5df1ac78Salex-tdeclare i32 @llvm.amdgcn.workitem.id.x()
135