1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s
3; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX8 %s
4; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=hawaii -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX7 %s
5; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10 %s
6
7define amdgpu_ps i8 @extractelement_sgpr_v4i8_sgpr_idx(<4 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
8; GCN-LABEL: extractelement_sgpr_v4i8_sgpr_idx:
9; GCN:       ; %bb.0:
10; GCN-NEXT:    s_load_dword s0, s[2:3], 0x0
11; GCN-NEXT:    s_waitcnt lgkmcnt(0)
12; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
13; GCN-NEXT:    s_lshr_b32 s1, s0, 24
14; GCN-NEXT:    s_and_b32 s2, s0, 0xff
15; GCN-NEXT:    s_lshl_b32 s3, s3, 8
16; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
17; GCN-NEXT:    s_or_b32 s2, s2, s3
18; GCN-NEXT:    s_lshl_b32 s0, s0, 16
19; GCN-NEXT:    s_or_b32 s0, s2, s0
20; GCN-NEXT:    s_lshl_b32 s1, s1, 24
21; GCN-NEXT:    s_or_b32 s0, s0, s1
22; GCN-NEXT:    s_and_b32 s1, s4, 3
23; GCN-NEXT:    s_lshl_b32 s1, s1, 3
24; GCN-NEXT:    s_lshr_b32 s0, s0, s1
25; GCN-NEXT:    ; return to shader part epilog
26;
27; GFX10-LABEL: extractelement_sgpr_v4i8_sgpr_idx:
28; GFX10:       ; %bb.0:
29; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
30; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
31; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80008
32; GFX10-NEXT:    s_lshr_b32 s1, s0, 24
33; GFX10-NEXT:    s_and_b32 s2, s0, 0xff
34; GFX10-NEXT:    s_bfe_u32 s0, s0, 0x80010
35; GFX10-NEXT:    s_lshl_b32 s3, s3, 8
36; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
37; GFX10-NEXT:    s_or_b32 s2, s2, s3
38; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
39; GFX10-NEXT:    s_or_b32 s0, s2, s0
40; GFX10-NEXT:    s_and_b32 s2, s4, 3
41; GFX10-NEXT:    s_or_b32 s0, s0, s1
42; GFX10-NEXT:    s_lshl_b32 s1, s2, 3
43; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
44; GFX10-NEXT:    ; return to shader part epilog
45  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
46  %element = extractelement <4 x i8> %vector, i32 %idx
47  ret i8 %element
48}
49
50define amdgpu_ps i8 @extractelement_vgpr_v4i8_sgpr_idx(<4 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
51; GFX9-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
52; GFX9:       ; %bb.0:
53; GFX9-NEXT:    global_load_dword v0, v[0:1], off
54; GFX9-NEXT:    v_mov_b32_e32 v2, 8
55; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
56; GFX9-NEXT:    v_mov_b32_e32 v3, 16
57; GFX9-NEXT:    s_and_b32 s0, s2, 3
58; GFX9-NEXT:    s_lshl_b32 s0, s0, 3
59; GFX9-NEXT:    s_waitcnt vmcnt(0)
60; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
61; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
62; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
63; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
64; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
65; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
66; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
67; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
68; GFX9-NEXT:    ; return to shader part epilog
69;
70; GFX8-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
71; GFX8:       ; %bb.0:
72; GFX8-NEXT:    flat_load_dword v0, v[0:1]
73; GFX8-NEXT:    v_mov_b32_e32 v1, 8
74; GFX8-NEXT:    v_mov_b32_e32 v2, 16
75; GFX8-NEXT:    s_and_b32 s0, s2, 3
76; GFX8-NEXT:    s_lshl_b32 s0, s0, 3
77; GFX8-NEXT:    s_waitcnt vmcnt(0)
78; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
79; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
80; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
81; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
82; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
83; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
84; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
85; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
86; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
87; GFX8-NEXT:    ; return to shader part epilog
88;
89; GFX7-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
90; GFX7:       ; %bb.0:
91; GFX7-NEXT:    s_mov_b32 s6, 0
92; GFX7-NEXT:    s_mov_b32 s7, 0xf000
93; GFX7-NEXT:    s_mov_b64 s[4:5], 0
94; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
95; GFX7-NEXT:    s_and_b32 s0, s2, 3
96; GFX7-NEXT:    s_lshl_b32 s0, s0, 3
97; GFX7-NEXT:    s_waitcnt vmcnt(0)
98; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
99; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
100; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
101; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
102; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
103; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
104; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
105; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
106; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
107; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
108; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
109; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
110; GFX7-NEXT:    ; return to shader part epilog
111;
112; GFX10-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
113; GFX10:       ; %bb.0:
114; GFX10-NEXT:    global_load_dword v0, v[0:1], off
115; GFX10-NEXT:    v_mov_b32_e32 v1, 8
116; GFX10-NEXT:    v_mov_b32_e32 v2, 16
117; GFX10-NEXT:    s_and_b32 s0, s2, 3
118; GFX10-NEXT:    s_lshl_b32 s0, s0, 3
119; GFX10-NEXT:    s_waitcnt vmcnt(0)
120; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
121; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
122; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
123; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
124; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
125; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
126; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
127; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
128; GFX10-NEXT:    ; return to shader part epilog
129  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
130  %element = extractelement <4 x i8> %vector, i32 %idx
131  ret i8 %element
132}
133
134define i8 @extractelement_vgpr_v4i8_vgpr_idx(<4 x i8> addrspace(1)* %ptr, i32 %idx) {
135; GFX9-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
136; GFX9:       ; %bb.0:
137; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
138; GFX9-NEXT:    global_load_dword v0, v[0:1], off
139; GFX9-NEXT:    v_mov_b32_e32 v3, 8
140; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
141; GFX9-NEXT:    v_mov_b32_e32 v4, 16
142; GFX9-NEXT:    v_and_b32_e32 v2, 3, v2
143; GFX9-NEXT:    s_waitcnt vmcnt(0)
144; GFX9-NEXT:    v_lshrrev_b32_e32 v5, 24, v0
145; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
146; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
147; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v3
148; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v5
149; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v1
150; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
151; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
152; GFX9-NEXT:    s_setpc_b64 s[30:31]
153;
154; GFX8-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
155; GFX8:       ; %bb.0:
156; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
157; GFX8-NEXT:    flat_load_dword v0, v[0:1]
158; GFX8-NEXT:    v_mov_b32_e32 v1, 8
159; GFX8-NEXT:    v_mov_b32_e32 v3, 16
160; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
161; GFX8-NEXT:    s_waitcnt vmcnt(0)
162; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
163; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
164; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
165; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
166; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
167; GFX8-NEXT:    v_or_b32_e32 v0, v0, v3
168; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
169; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
170; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
171; GFX8-NEXT:    s_setpc_b64 s[30:31]
172;
173; GFX7-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
174; GFX7:       ; %bb.0:
175; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
176; GFX7-NEXT:    s_mov_b32 s6, 0
177; GFX7-NEXT:    s_mov_b32 s7, 0xf000
178; GFX7-NEXT:    s_mov_b64 s[4:5], 0
179; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
180; GFX7-NEXT:    v_and_b32_e32 v1, 3, v2
181; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
182; GFX7-NEXT:    s_waitcnt vmcnt(0)
183; GFX7-NEXT:    v_bfe_u32 v4, v0, 8, 8
184; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
185; GFX7-NEXT:    v_and_b32_e32 v3, 0xff, v0
186; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
187; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 8, v4
188; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
189; GFX7-NEXT:    v_or_b32_e32 v3, v3, v4
190; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
191; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
192; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
193; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
194; GFX7-NEXT:    s_setpc_b64 s[30:31]
195;
196; GFX10-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
197; GFX10:       ; %bb.0:
198; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
199; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
200; GFX10-NEXT:    global_load_dword v0, v[0:1], off
201; GFX10-NEXT:    v_mov_b32_e32 v1, 8
202; GFX10-NEXT:    v_mov_b32_e32 v3, 16
203; GFX10-NEXT:    v_and_b32_e32 v2, 3, v2
204; GFX10-NEXT:    s_waitcnt vmcnt(0)
205; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
206; GFX10-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
207; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
208; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
209; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
210; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
211; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
212; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
213; GFX10-NEXT:    s_setpc_b64 s[30:31]
214  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
215  %element = extractelement <4 x i8> %vector, i32 %idx
216  ret i8 %element
217}
218
219define amdgpu_ps i8 @extractelement_sgpr_v4i8_vgpr_idx(<4 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
220; GFX9-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
221; GFX9:       ; %bb.0:
222; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
223; GFX9-NEXT:    v_and_b32_e32 v0, 3, v0
224; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
225; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
226; GFX9-NEXT:    s_bfe_u32 s3, s0, 0x80008
227; GFX9-NEXT:    s_lshr_b32 s1, s0, 24
228; GFX9-NEXT:    s_and_b32 s2, s0, 0xff
229; GFX9-NEXT:    s_lshl_b32 s3, s3, 8
230; GFX9-NEXT:    s_bfe_u32 s0, s0, 0x80010
231; GFX9-NEXT:    s_or_b32 s2, s2, s3
232; GFX9-NEXT:    s_lshl_b32 s0, s0, 16
233; GFX9-NEXT:    s_or_b32 s0, s2, s0
234; GFX9-NEXT:    s_lshl_b32 s1, s1, 24
235; GFX9-NEXT:    s_or_b32 s0, s0, s1
236; GFX9-NEXT:    v_lshrrev_b32_e64 v0, v0, s0
237; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
238; GFX9-NEXT:    ; return to shader part epilog
239;
240; GFX8-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
241; GFX8:       ; %bb.0:
242; GFX8-NEXT:    s_load_dword s0, s[2:3], 0x0
243; GFX8-NEXT:    v_and_b32_e32 v0, 3, v0
244; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
245; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
246; GFX8-NEXT:    s_bfe_u32 s3, s0, 0x80008
247; GFX8-NEXT:    s_lshr_b32 s1, s0, 24
248; GFX8-NEXT:    s_and_b32 s2, s0, 0xff
249; GFX8-NEXT:    s_lshl_b32 s3, s3, 8
250; GFX8-NEXT:    s_bfe_u32 s0, s0, 0x80010
251; GFX8-NEXT:    s_or_b32 s2, s2, s3
252; GFX8-NEXT:    s_lshl_b32 s0, s0, 16
253; GFX8-NEXT:    s_or_b32 s0, s2, s0
254; GFX8-NEXT:    s_lshl_b32 s1, s1, 24
255; GFX8-NEXT:    s_or_b32 s0, s0, s1
256; GFX8-NEXT:    v_lshrrev_b32_e64 v0, v0, s0
257; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
258; GFX8-NEXT:    ; return to shader part epilog
259;
260; GFX7-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
261; GFX7:       ; %bb.0:
262; GFX7-NEXT:    s_load_dword s0, s[2:3], 0x0
263; GFX7-NEXT:    v_and_b32_e32 v0, 3, v0
264; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
265; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
266; GFX7-NEXT:    s_bfe_u32 s3, s0, 0x80008
267; GFX7-NEXT:    s_lshr_b32 s1, s0, 24
268; GFX7-NEXT:    s_and_b32 s2, s0, 0xff
269; GFX7-NEXT:    s_lshl_b32 s3, s3, 8
270; GFX7-NEXT:    s_bfe_u32 s0, s0, 0x80010
271; GFX7-NEXT:    s_or_b32 s2, s2, s3
272; GFX7-NEXT:    s_lshl_b32 s0, s0, 16
273; GFX7-NEXT:    s_or_b32 s0, s2, s0
274; GFX7-NEXT:    s_lshl_b32 s1, s1, 24
275; GFX7-NEXT:    s_or_b32 s0, s0, s1
276; GFX7-NEXT:    v_lshr_b32_e32 v0, s0, v0
277; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
278; GFX7-NEXT:    ; return to shader part epilog
279;
280; GFX10-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
281; GFX10:       ; %bb.0:
282; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
283; GFX10-NEXT:    v_and_b32_e32 v0, 3, v0
284; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
285; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
286; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
287; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
288; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
289; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
290; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
291; GFX10-NEXT:    s_or_b32 s1, s1, s2
292; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
293; GFX10-NEXT:    s_or_b32 s1, s1, s3
294; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
295; GFX10-NEXT:    s_or_b32 s0, s1, s0
296; GFX10-NEXT:    v_lshrrev_b32_e64 v0, v0, s0
297; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
298; GFX10-NEXT:    ; return to shader part epilog
299  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
300  %element = extractelement <4 x i8> %vector, i32 %idx
301  ret i8 %element
302}
303
304define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx0(<4 x i8> addrspace(4)* inreg %ptr) {
305; GCN-LABEL: extractelement_sgpr_v4i8_idx0:
306; GCN:       ; %bb.0:
307; GCN-NEXT:    s_load_dword s0, s[2:3], 0x0
308; GCN-NEXT:    s_waitcnt lgkmcnt(0)
309; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
310; GCN-NEXT:    s_lshr_b32 s1, s0, 24
311; GCN-NEXT:    s_and_b32 s2, s0, 0xff
312; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
313; GCN-NEXT:    s_lshl_b32 s3, s3, 8
314; GCN-NEXT:    s_or_b32 s2, s2, s3
315; GCN-NEXT:    s_lshl_b32 s0, s0, 16
316; GCN-NEXT:    s_or_b32 s0, s2, s0
317; GCN-NEXT:    s_lshl_b32 s1, s1, 24
318; GCN-NEXT:    s_or_b32 s0, s0, s1
319; GCN-NEXT:    ; return to shader part epilog
320;
321; GFX10-LABEL: extractelement_sgpr_v4i8_idx0:
322; GFX10:       ; %bb.0:
323; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
324; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
325; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
326; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
327; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
328; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
329; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
330; GFX10-NEXT:    s_or_b32 s1, s1, s2
331; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
332; GFX10-NEXT:    s_or_b32 s1, s1, s3
333; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
334; GFX10-NEXT:    s_or_b32 s0, s1, s0
335; GFX10-NEXT:    ; return to shader part epilog
336  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
337  %element = extractelement <4 x i8> %vector, i32 0
338  ret i8 %element
339}
340
341define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx1(<4 x i8> addrspace(4)* inreg %ptr) {
342; GCN-LABEL: extractelement_sgpr_v4i8_idx1:
343; GCN:       ; %bb.0:
344; GCN-NEXT:    s_load_dword s0, s[2:3], 0x0
345; GCN-NEXT:    s_waitcnt lgkmcnt(0)
346; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
347; GCN-NEXT:    s_lshr_b32 s1, s0, 24
348; GCN-NEXT:    s_and_b32 s2, s0, 0xff
349; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
350; GCN-NEXT:    s_lshl_b32 s3, s3, 8
351; GCN-NEXT:    s_or_b32 s2, s2, s3
352; GCN-NEXT:    s_lshl_b32 s0, s0, 16
353; GCN-NEXT:    s_or_b32 s0, s2, s0
354; GCN-NEXT:    s_lshl_b32 s1, s1, 24
355; GCN-NEXT:    s_or_b32 s0, s0, s1
356; GCN-NEXT:    s_lshr_b32 s0, s0, 8
357; GCN-NEXT:    ; return to shader part epilog
358;
359; GFX10-LABEL: extractelement_sgpr_v4i8_idx1:
360; GFX10:       ; %bb.0:
361; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
362; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
363; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
364; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
365; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
366; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
367; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
368; GFX10-NEXT:    s_or_b32 s1, s1, s2
369; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
370; GFX10-NEXT:    s_or_b32 s1, s1, s3
371; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
372; GFX10-NEXT:    s_or_b32 s0, s1, s0
373; GFX10-NEXT:    s_lshr_b32 s0, s0, 8
374; GFX10-NEXT:    ; return to shader part epilog
375  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
376  %element = extractelement <4 x i8> %vector, i32 1
377  ret i8 %element
378}
379
380define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx2(<4 x i8> addrspace(4)* inreg %ptr) {
381; GCN-LABEL: extractelement_sgpr_v4i8_idx2:
382; GCN:       ; %bb.0:
383; GCN-NEXT:    s_load_dword s0, s[2:3], 0x0
384; GCN-NEXT:    s_waitcnt lgkmcnt(0)
385; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
386; GCN-NEXT:    s_lshr_b32 s1, s0, 24
387; GCN-NEXT:    s_and_b32 s2, s0, 0xff
388; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
389; GCN-NEXT:    s_lshl_b32 s3, s3, 8
390; GCN-NEXT:    s_or_b32 s2, s2, s3
391; GCN-NEXT:    s_lshl_b32 s0, s0, 16
392; GCN-NEXT:    s_or_b32 s0, s2, s0
393; GCN-NEXT:    s_lshl_b32 s1, s1, 24
394; GCN-NEXT:    s_or_b32 s0, s0, s1
395; GCN-NEXT:    s_lshr_b32 s0, s0, 16
396; GCN-NEXT:    ; return to shader part epilog
397;
398; GFX10-LABEL: extractelement_sgpr_v4i8_idx2:
399; GFX10:       ; %bb.0:
400; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
401; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
402; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
403; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
404; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
405; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
406; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
407; GFX10-NEXT:    s_or_b32 s1, s1, s2
408; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
409; GFX10-NEXT:    s_or_b32 s1, s1, s3
410; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
411; GFX10-NEXT:    s_or_b32 s0, s1, s0
412; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
413; GFX10-NEXT:    ; return to shader part epilog
414  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
415  %element = extractelement <4 x i8> %vector, i32 2
416  ret i8 %element
417}
418
419define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx3(<4 x i8> addrspace(4)* inreg %ptr) {
420; GCN-LABEL: extractelement_sgpr_v4i8_idx3:
421; GCN:       ; %bb.0:
422; GCN-NEXT:    s_load_dword s0, s[2:3], 0x0
423; GCN-NEXT:    s_waitcnt lgkmcnt(0)
424; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
425; GCN-NEXT:    s_lshr_b32 s1, s0, 24
426; GCN-NEXT:    s_and_b32 s2, s0, 0xff
427; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
428; GCN-NEXT:    s_lshl_b32 s3, s3, 8
429; GCN-NEXT:    s_or_b32 s2, s2, s3
430; GCN-NEXT:    s_lshl_b32 s0, s0, 16
431; GCN-NEXT:    s_or_b32 s0, s2, s0
432; GCN-NEXT:    s_lshl_b32 s1, s1, 24
433; GCN-NEXT:    s_or_b32 s0, s0, s1
434; GCN-NEXT:    s_lshr_b32 s0, s0, 24
435; GCN-NEXT:    ; return to shader part epilog
436;
437; GFX10-LABEL: extractelement_sgpr_v4i8_idx3:
438; GFX10:       ; %bb.0:
439; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
440; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
441; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
442; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
443; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
444; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
445; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
446; GFX10-NEXT:    s_or_b32 s1, s1, s2
447; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
448; GFX10-NEXT:    s_or_b32 s1, s1, s3
449; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
450; GFX10-NEXT:    s_or_b32 s0, s1, s0
451; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
452; GFX10-NEXT:    ; return to shader part epilog
453  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
454  %element = extractelement <4 x i8> %vector, i32 3
455  ret i8 %element
456}
457
458define i8 @extractelement_vgpr_v4i8_idx0(<4 x i8> addrspace(1)* %ptr) {
459; GFX9-LABEL: extractelement_vgpr_v4i8_idx0:
460; GFX9:       ; %bb.0:
461; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
462; GFX9-NEXT:    global_load_dword v0, v[0:1], off
463; GFX9-NEXT:    v_mov_b32_e32 v2, 8
464; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
465; GFX9-NEXT:    v_mov_b32_e32 v3, 16
466; GFX9-NEXT:    s_waitcnt vmcnt(0)
467; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
468; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
469; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
470; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
471; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
472; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
473; GFX9-NEXT:    s_setpc_b64 s[30:31]
474;
475; GFX8-LABEL: extractelement_vgpr_v4i8_idx0:
476; GFX8:       ; %bb.0:
477; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
478; GFX8-NEXT:    flat_load_dword v0, v[0:1]
479; GFX8-NEXT:    v_mov_b32_e32 v1, 8
480; GFX8-NEXT:    v_mov_b32_e32 v2, 16
481; GFX8-NEXT:    s_waitcnt vmcnt(0)
482; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
483; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
484; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
485; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
486; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
487; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
488; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
489; GFX8-NEXT:    s_setpc_b64 s[30:31]
490;
491; GFX7-LABEL: extractelement_vgpr_v4i8_idx0:
492; GFX7:       ; %bb.0:
493; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
494; GFX7-NEXT:    s_mov_b32 s6, 0
495; GFX7-NEXT:    s_mov_b32 s7, 0xf000
496; GFX7-NEXT:    s_mov_b64 s[4:5], 0
497; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
498; GFX7-NEXT:    s_waitcnt vmcnt(0)
499; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
500; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
501; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
502; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
503; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
504; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
505; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
506; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
507; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
508; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
509; GFX7-NEXT:    s_setpc_b64 s[30:31]
510;
511; GFX10-LABEL: extractelement_vgpr_v4i8_idx0:
512; GFX10:       ; %bb.0:
513; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
514; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
515; GFX10-NEXT:    global_load_dword v0, v[0:1], off
516; GFX10-NEXT:    v_mov_b32_e32 v1, 8
517; GFX10-NEXT:    v_mov_b32_e32 v2, 16
518; GFX10-NEXT:    s_waitcnt vmcnt(0)
519; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
520; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
521; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
522; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
523; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
524; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
525; GFX10-NEXT:    s_setpc_b64 s[30:31]
526  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
527  %element = extractelement <4 x i8> %vector, i32 0
528  ret i8 %element
529}
530
531define i8 @extractelement_vgpr_v4i8_idx1(<4 x i8> addrspace(1)* %ptr) {
532; GFX9-LABEL: extractelement_vgpr_v4i8_idx1:
533; GFX9:       ; %bb.0:
534; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
535; GFX9-NEXT:    global_load_dword v0, v[0:1], off
536; GFX9-NEXT:    s_mov_b32 s4, 8
537; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
538; GFX9-NEXT:    v_mov_b32_e32 v2, 16
539; GFX9-NEXT:    s_waitcnt vmcnt(0)
540; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
541; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
542; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
543; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v4
544; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
545; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
546; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
547; GFX9-NEXT:    s_setpc_b64 s[30:31]
548;
549; GFX8-LABEL: extractelement_vgpr_v4i8_idx1:
550; GFX8:       ; %bb.0:
551; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
552; GFX8-NEXT:    flat_load_dword v0, v[0:1]
553; GFX8-NEXT:    v_mov_b32_e32 v1, 8
554; GFX8-NEXT:    v_mov_b32_e32 v2, 16
555; GFX8-NEXT:    s_waitcnt vmcnt(0)
556; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
557; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
558; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
559; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
560; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
561; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
562; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
563; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
564; GFX8-NEXT:    s_setpc_b64 s[30:31]
565;
566; GFX7-LABEL: extractelement_vgpr_v4i8_idx1:
567; GFX7:       ; %bb.0:
568; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
569; GFX7-NEXT:    s_mov_b32 s6, 0
570; GFX7-NEXT:    s_mov_b32 s7, 0xf000
571; GFX7-NEXT:    s_mov_b64 s[4:5], 0
572; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
573; GFX7-NEXT:    s_waitcnt vmcnt(0)
574; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
575; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
576; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
577; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
578; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
579; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
580; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
581; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
582; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
583; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
584; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
585; GFX7-NEXT:    s_setpc_b64 s[30:31]
586;
587; GFX10-LABEL: extractelement_vgpr_v4i8_idx1:
588; GFX10:       ; %bb.0:
589; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
590; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
591; GFX10-NEXT:    global_load_dword v0, v[0:1], off
592; GFX10-NEXT:    s_mov_b32 s4, 8
593; GFX10-NEXT:    v_mov_b32_e32 v1, 16
594; GFX10-NEXT:    s_waitcnt vmcnt(0)
595; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
596; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
597; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
598; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v2
599; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
600; GFX10-NEXT:    v_or3_b32 v0, v0, v1, v2
601; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
602; GFX10-NEXT:    s_setpc_b64 s[30:31]
603  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
604  %element = extractelement <4 x i8> %vector, i32 1
605  ret i8 %element
606}
607
608define i8 @extractelement_vgpr_v4i8_idx2(<4 x i8> addrspace(1)* %ptr) {
609; GFX9-LABEL: extractelement_vgpr_v4i8_idx2:
610; GFX9:       ; %bb.0:
611; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
612; GFX9-NEXT:    global_load_dword v0, v[0:1], off
613; GFX9-NEXT:    v_mov_b32_e32 v2, 8
614; GFX9-NEXT:    s_mov_b32 s4, 16
615; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
616; GFX9-NEXT:    s_waitcnt vmcnt(0)
617; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
618; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
619; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
620; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
621; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
622; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v1
623; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
624; GFX9-NEXT:    s_setpc_b64 s[30:31]
625;
626; GFX8-LABEL: extractelement_vgpr_v4i8_idx2:
627; GFX8:       ; %bb.0:
628; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
629; GFX8-NEXT:    flat_load_dword v0, v[0:1]
630; GFX8-NEXT:    v_mov_b32_e32 v1, 8
631; GFX8-NEXT:    v_mov_b32_e32 v2, 16
632; GFX8-NEXT:    s_waitcnt vmcnt(0)
633; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
634; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
635; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
636; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
637; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
638; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
639; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
640; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
641; GFX8-NEXT:    s_setpc_b64 s[30:31]
642;
643; GFX7-LABEL: extractelement_vgpr_v4i8_idx2:
644; GFX7:       ; %bb.0:
645; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
646; GFX7-NEXT:    s_mov_b32 s6, 0
647; GFX7-NEXT:    s_mov_b32 s7, 0xf000
648; GFX7-NEXT:    s_mov_b64 s[4:5], 0
649; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
650; GFX7-NEXT:    s_waitcnt vmcnt(0)
651; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
652; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
653; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
654; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
655; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
656; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
657; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
658; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
659; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
660; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
661; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
662; GFX7-NEXT:    s_setpc_b64 s[30:31]
663;
664; GFX10-LABEL: extractelement_vgpr_v4i8_idx2:
665; GFX10:       ; %bb.0:
666; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
667; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
668; GFX10-NEXT:    global_load_dword v0, v[0:1], off
669; GFX10-NEXT:    v_mov_b32_e32 v1, 8
670; GFX10-NEXT:    s_mov_b32 s4, 16
671; GFX10-NEXT:    s_waitcnt vmcnt(0)
672; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
673; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
674; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
675; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
676; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
677; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
678; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
679; GFX10-NEXT:    s_setpc_b64 s[30:31]
680  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
681  %element = extractelement <4 x i8> %vector, i32 2
682  ret i8 %element
683}
684
685define i8 @extractelement_vgpr_v4i8_idx3(<4 x i8> addrspace(1)* %ptr) {
686; GFX9-LABEL: extractelement_vgpr_v4i8_idx3:
687; GFX9:       ; %bb.0:
688; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
689; GFX9-NEXT:    global_load_dword v0, v[0:1], off
690; GFX9-NEXT:    v_mov_b32_e32 v2, 8
691; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
692; GFX9-NEXT:    v_mov_b32_e32 v3, 16
693; GFX9-NEXT:    s_waitcnt vmcnt(0)
694; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
695; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
696; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
697; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
698; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
699; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
700; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
701; GFX9-NEXT:    s_setpc_b64 s[30:31]
702;
703; GFX8-LABEL: extractelement_vgpr_v4i8_idx3:
704; GFX8:       ; %bb.0:
705; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
706; GFX8-NEXT:    flat_load_dword v0, v[0:1]
707; GFX8-NEXT:    v_mov_b32_e32 v1, 8
708; GFX8-NEXT:    v_mov_b32_e32 v2, 16
709; GFX8-NEXT:    s_waitcnt vmcnt(0)
710; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
711; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
712; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
713; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
714; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
715; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
716; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
717; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
718; GFX8-NEXT:    s_setpc_b64 s[30:31]
719;
720; GFX7-LABEL: extractelement_vgpr_v4i8_idx3:
721; GFX7:       ; %bb.0:
722; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
723; GFX7-NEXT:    s_mov_b32 s6, 0
724; GFX7-NEXT:    s_mov_b32 s7, 0xf000
725; GFX7-NEXT:    s_mov_b64 s[4:5], 0
726; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
727; GFX7-NEXT:    s_waitcnt vmcnt(0)
728; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
729; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
730; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
731; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
732; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
733; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
734; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
735; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
736; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
737; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
738; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
739; GFX7-NEXT:    s_setpc_b64 s[30:31]
740;
741; GFX10-LABEL: extractelement_vgpr_v4i8_idx3:
742; GFX10:       ; %bb.0:
743; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
744; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
745; GFX10-NEXT:    global_load_dword v0, v[0:1], off
746; GFX10-NEXT:    v_mov_b32_e32 v1, 8
747; GFX10-NEXT:    v_mov_b32_e32 v2, 16
748; GFX10-NEXT:    s_waitcnt vmcnt(0)
749; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
750; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
751; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
752; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
753; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
754; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
755; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
756; GFX10-NEXT:    s_setpc_b64 s[30:31]
757  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
758  %element = extractelement <4 x i8> %vector, i32 3
759  ret i8 %element
760}
761
762define amdgpu_ps i8 @extractelement_sgpr_v8i8_sgpr_idx(<8 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
763; GCN-LABEL: extractelement_sgpr_v8i8_sgpr_idx:
764; GCN:       ; %bb.0:
765; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
766; GCN-NEXT:    s_waitcnt lgkmcnt(0)
767; GCN-NEXT:    s_bfe_u32 s6, s0, 0x80008
768; GCN-NEXT:    s_lshr_b32 s2, s0, 24
769; GCN-NEXT:    s_and_b32 s5, s0, 0xff
770; GCN-NEXT:    s_lshl_b32 s6, s6, 8
771; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
772; GCN-NEXT:    s_or_b32 s5, s5, s6
773; GCN-NEXT:    s_lshl_b32 s0, s0, 16
774; GCN-NEXT:    s_or_b32 s0, s5, s0
775; GCN-NEXT:    s_lshl_b32 s2, s2, 24
776; GCN-NEXT:    s_bfe_u32 s5, s1, 0x80008
777; GCN-NEXT:    s_lshr_b32 s3, s1, 24
778; GCN-NEXT:    s_or_b32 s0, s0, s2
779; GCN-NEXT:    s_and_b32 s2, s1, 0xff
780; GCN-NEXT:    s_lshl_b32 s5, s5, 8
781; GCN-NEXT:    s_bfe_u32 s1, s1, 0x80010
782; GCN-NEXT:    s_or_b32 s2, s2, s5
783; GCN-NEXT:    s_lshl_b32 s1, s1, 16
784; GCN-NEXT:    s_or_b32 s1, s2, s1
785; GCN-NEXT:    s_lshl_b32 s2, s3, 24
786; GCN-NEXT:    s_or_b32 s1, s1, s2
787; GCN-NEXT:    s_lshr_b32 s2, s4, 2
788; GCN-NEXT:    s_cmp_eq_u32 s2, 1
789; GCN-NEXT:    s_cselect_b32 s0, s1, s0
790; GCN-NEXT:    s_and_b32 s1, s4, 3
791; GCN-NEXT:    s_lshl_b32 s1, s1, 3
792; GCN-NEXT:    s_lshr_b32 s0, s0, s1
793; GCN-NEXT:    ; return to shader part epilog
794;
795; GFX10-LABEL: extractelement_sgpr_v8i8_sgpr_idx:
796; GFX10:       ; %bb.0:
797; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
798; GFX10-NEXT:    s_lshr_b32 s2, s4, 2
799; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
800; GFX10-NEXT:    s_bfe_u32 s7, s0, 0x80008
801; GFX10-NEXT:    s_bfe_u32 s9, s1, 0x80008
802; GFX10-NEXT:    s_lshr_b32 s3, s0, 24
803; GFX10-NEXT:    s_lshr_b32 s5, s1, 24
804; GFX10-NEXT:    s_and_b32 s6, s0, 0xff
805; GFX10-NEXT:    s_bfe_u32 s0, s0, 0x80010
806; GFX10-NEXT:    s_and_b32 s8, s1, 0xff
807; GFX10-NEXT:    s_bfe_u32 s1, s1, 0x80010
808; GFX10-NEXT:    s_lshl_b32 s7, s7, 8
809; GFX10-NEXT:    s_lshl_b32 s9, s9, 8
810; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
811; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
812; GFX10-NEXT:    s_or_b32 s6, s6, s7
813; GFX10-NEXT:    s_or_b32 s7, s8, s9
814; GFX10-NEXT:    s_lshl_b32 s3, s3, 24
815; GFX10-NEXT:    s_lshl_b32 s5, s5, 24
816; GFX10-NEXT:    s_or_b32 s0, s6, s0
817; GFX10-NEXT:    s_or_b32 s1, s7, s1
818; GFX10-NEXT:    s_or_b32 s0, s0, s3
819; GFX10-NEXT:    s_or_b32 s1, s1, s5
820; GFX10-NEXT:    s_cmp_eq_u32 s2, 1
821; GFX10-NEXT:    s_cselect_b32 s0, s1, s0
822; GFX10-NEXT:    s_and_b32 s1, s4, 3
823; GFX10-NEXT:    s_lshl_b32 s1, s1, 3
824; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
825; GFX10-NEXT:    ; return to shader part epilog
826  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
827  %element = extractelement <8 x i8> %vector, i32 %idx
828  ret i8 %element
829}
830
831define amdgpu_ps i8 @extractelement_vgpr_v8i8_sgpr_idx(<8 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
832; GFX9-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
833; GFX9:       ; %bb.0:
834; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
835; GFX9-NEXT:    s_mov_b32 s0, 8
836; GFX9-NEXT:    s_mov_b32 s1, 16
837; GFX9-NEXT:    s_movk_i32 s3, 0xff
838; GFX9-NEXT:    s_lshr_b32 s4, s2, 2
839; GFX9-NEXT:    s_and_b32 s2, s2, 3
840; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s4, 1
841; GFX9-NEXT:    s_waitcnt vmcnt(0)
842; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
843; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
844; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
845; GFX9-NEXT:    v_lshlrev_b32_sdwa v6, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
846; GFX9-NEXT:    v_lshlrev_b32_sdwa v5, s1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
847; GFX9-NEXT:    v_lshlrev_b32_sdwa v7, s1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
848; GFX9-NEXT:    v_and_or_b32 v0, v0, s3, v4
849; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
850; GFX9-NEXT:    v_and_or_b32 v1, v1, s3, v6
851; GFX9-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
852; GFX9-NEXT:    v_or3_b32 v0, v0, v5, v2
853; GFX9-NEXT:    v_or3_b32 v1, v1, v7, v3
854; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
855; GFX9-NEXT:    s_lshl_b32 s0, s2, 3
856; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
857; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
858; GFX9-NEXT:    ; return to shader part epilog
859;
860; GFX8-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
861; GFX8:       ; %bb.0:
862; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
863; GFX8-NEXT:    v_mov_b32_e32 v2, 8
864; GFX8-NEXT:    v_mov_b32_e32 v3, 16
865; GFX8-NEXT:    s_lshr_b32 s0, s2, 2
866; GFX8-NEXT:    s_and_b32 s1, s2, 3
867; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
868; GFX8-NEXT:    s_lshl_b32 s0, s1, 3
869; GFX8-NEXT:    s_waitcnt vmcnt(0)
870; GFX8-NEXT:    v_lshlrev_b32_sdwa v6, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
871; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
872; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
873; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 24, v1
874; GFX8-NEXT:    v_lshlrev_b32_sdwa v7, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
875; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
876; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
877; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
878; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
879; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 24, v5
880; GFX8-NEXT:    v_or_b32_e32 v0, v0, v7
881; GFX8-NEXT:    v_or_b32_e32 v1, v1, v3
882; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
883; GFX8-NEXT:    v_or_b32_e32 v1, v1, v2
884; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
885; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
886; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
887; GFX8-NEXT:    ; return to shader part epilog
888;
889; GFX7-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
890; GFX7:       ; %bb.0:
891; GFX7-NEXT:    s_mov_b32 s6, 0
892; GFX7-NEXT:    s_mov_b32 s7, 0xf000
893; GFX7-NEXT:    s_mov_b64 s[4:5], 0
894; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
895; GFX7-NEXT:    s_lshr_b32 s0, s2, 2
896; GFX7-NEXT:    s_and_b32 s1, s2, 3
897; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
898; GFX7-NEXT:    s_lshl_b32 s0, s1, 3
899; GFX7-NEXT:    s_waitcnt vmcnt(0)
900; GFX7-NEXT:    v_bfe_u32 v5, v0, 8, 8
901; GFX7-NEXT:    v_bfe_u32 v7, v1, 8, 8
902; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
903; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
904; GFX7-NEXT:    v_and_b32_e32 v4, 0xff, v0
905; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
906; GFX7-NEXT:    v_and_b32_e32 v6, 0xff, v1
907; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
908; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 8, v5
909; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 8, v7
910; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
911; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
912; GFX7-NEXT:    v_or_b32_e32 v4, v4, v5
913; GFX7-NEXT:    v_or_b32_e32 v5, v6, v7
914; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
915; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
916; GFX7-NEXT:    v_or_b32_e32 v0, v4, v0
917; GFX7-NEXT:    v_or_b32_e32 v1, v5, v1
918; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
919; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
920; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
921; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
922; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
923; GFX7-NEXT:    ; return to shader part epilog
924;
925; GFX10-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
926; GFX10:       ; %bb.0:
927; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
928; GFX10-NEXT:    s_mov_b32 s0, 8
929; GFX10-NEXT:    s_mov_b32 s1, 16
930; GFX10-NEXT:    s_waitcnt vmcnt(0)
931; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
932; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
933; GFX10-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
934; GFX10-NEXT:    v_lshlrev_b32_sdwa v5, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
935; GFX10-NEXT:    v_lshlrev_b32_sdwa v6, s1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
936; GFX10-NEXT:    v_lshlrev_b32_sdwa v7, s1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
937; GFX10-NEXT:    v_and_or_b32 v0, v0, 0xff, v3
938; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
939; GFX10-NEXT:    v_and_or_b32 v1, v1, 0xff, v5
940; GFX10-NEXT:    v_lshlrev_b32_e32 v3, 24, v4
941; GFX10-NEXT:    s_lshr_b32 s0, s2, 2
942; GFX10-NEXT:    v_or3_b32 v0, v0, v6, v2
943; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
944; GFX10-NEXT:    v_or3_b32 v1, v1, v7, v3
945; GFX10-NEXT:    s_and_b32 s0, s2, 3
946; GFX10-NEXT:    s_lshl_b32 s0, s0, 3
947; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
948; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
949; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
950; GFX10-NEXT:    ; return to shader part epilog
951  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
952  %element = extractelement <8 x i8> %vector, i32 %idx
953  ret i8 %element
954}
955
956define i8 @extractelement_vgpr_v8i8_vgpr_idx(<8 x i8> addrspace(1)* %ptr, i32 %idx) {
957; GFX9-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
958; GFX9:       ; %bb.0:
959; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
960; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
961; GFX9-NEXT:    s_mov_b32 s4, 8
962; GFX9-NEXT:    s_mov_b32 s5, 16
963; GFX9-NEXT:    s_movk_i32 s6, 0xff
964; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 2, v2
965; GFX9-NEXT:    v_and_b32_e32 v2, 3, v2
966; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
967; GFX9-NEXT:    s_waitcnt vmcnt(0)
968; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
969; GFX9-NEXT:    v_lshrrev_b32_e32 v5, 24, v1
970; GFX9-NEXT:    v_lshlrev_b32_sdwa v6, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
971; GFX9-NEXT:    v_lshlrev_b32_sdwa v8, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
972; GFX9-NEXT:    v_lshlrev_b32_sdwa v7, s5, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
973; GFX9-NEXT:    v_lshlrev_b32_sdwa v9, s5, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
974; GFX9-NEXT:    v_and_or_b32 v0, v0, s6, v6
975; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
976; GFX9-NEXT:    v_and_or_b32 v1, v1, s6, v8
977; GFX9-NEXT:    v_lshlrev_b32_e32 v5, 24, v5
978; GFX9-NEXT:    v_or3_b32 v0, v0, v7, v4
979; GFX9-NEXT:    v_or3_b32 v1, v1, v9, v5
980; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
981; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
982; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
983; GFX9-NEXT:    s_setpc_b64 s[30:31]
984;
985; GFX8-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
986; GFX8:       ; %bb.0:
987; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
988; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
989; GFX8-NEXT:    v_mov_b32_e32 v3, 8
990; GFX8-NEXT:    v_mov_b32_e32 v4, 16
991; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 2, v2
992; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
993; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v5
994; GFX8-NEXT:    s_waitcnt vmcnt(0)
995; GFX8-NEXT:    v_lshlrev_b32_sdwa v8, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
996; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
997; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 24, v0
998; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 24, v1
999; GFX8-NEXT:    v_lshlrev_b32_sdwa v9, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1000; GFX8-NEXT:    v_lshlrev_b32_sdwa v4, v4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1001; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1002; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1003; GFX8-NEXT:    v_lshlrev_b32_e32 v6, 24, v6
1004; GFX8-NEXT:    v_lshlrev_b32_e32 v3, 24, v7
1005; GFX8-NEXT:    v_or_b32_e32 v0, v0, v9
1006; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
1007; GFX8-NEXT:    v_or_b32_e32 v0, v0, v6
1008; GFX8-NEXT:    v_or_b32_e32 v1, v1, v3
1009; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1010; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1011; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1012; GFX8-NEXT:    s_setpc_b64 s[30:31]
1013;
1014; GFX7-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
1015; GFX7:       ; %bb.0:
1016; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1017; GFX7-NEXT:    s_mov_b32 s6, 0
1018; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1019; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1020; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1021; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 2, v2
1022; GFX7-NEXT:    v_and_b32_e32 v2, 3, v2
1023; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
1024; GFX7-NEXT:    s_waitcnt vmcnt(0)
1025; GFX7-NEXT:    v_bfe_u32 v7, v0, 8, 8
1026; GFX7-NEXT:    v_bfe_u32 v9, v1, 8, 8
1027; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1028; GFX7-NEXT:    v_lshrrev_b32_e32 v5, 24, v1
1029; GFX7-NEXT:    v_and_b32_e32 v6, 0xff, v0
1030; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
1031; GFX7-NEXT:    v_and_b32_e32 v8, 0xff, v1
1032; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
1033; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 8, v7
1034; GFX7-NEXT:    v_lshlrev_b32_e32 v9, 8, v9
1035; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1036; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1037; GFX7-NEXT:    v_or_b32_e32 v6, v6, v7
1038; GFX7-NEXT:    v_or_b32_e32 v7, v8, v9
1039; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
1040; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 24, v5
1041; GFX7-NEXT:    v_or_b32_e32 v0, v6, v0
1042; GFX7-NEXT:    v_or_b32_e32 v1, v7, v1
1043; GFX7-NEXT:    v_or_b32_e32 v0, v0, v4
1044; GFX7-NEXT:    v_or_b32_e32 v1, v1, v5
1045; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1046; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1047; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1048; GFX7-NEXT:    s_setpc_b64 s[30:31]
1049;
1050; GFX10-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
1051; GFX10:       ; %bb.0:
1052; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1053; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1054; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1055; GFX10-NEXT:    s_mov_b32 s4, 8
1056; GFX10-NEXT:    s_mov_b32 s5, 16
1057; GFX10-NEXT:    s_waitcnt vmcnt(0)
1058; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1059; GFX10-NEXT:    v_lshlrev_b32_sdwa v4, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1060; GFX10-NEXT:    v_lshrrev_b32_e32 v5, 24, v1
1061; GFX10-NEXT:    v_lshlrev_b32_sdwa v6, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1062; GFX10-NEXT:    v_lshlrev_b32_sdwa v7, s5, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1063; GFX10-NEXT:    v_lshlrev_b32_sdwa v8, s5, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1064; GFX10-NEXT:    v_and_or_b32 v0, v0, 0xff, v4
1065; GFX10-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
1066; GFX10-NEXT:    v_and_or_b32 v1, v1, 0xff, v6
1067; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 24, v5
1068; GFX10-NEXT:    v_lshrrev_b32_e32 v5, 2, v2
1069; GFX10-NEXT:    v_and_b32_e32 v2, 3, v2
1070; GFX10-NEXT:    v_or3_b32 v0, v0, v7, v3
1071; GFX10-NEXT:    v_or3_b32 v1, v1, v8, v4
1072; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v5
1073; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
1074; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1075; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1076; GFX10-NEXT:    s_setpc_b64 s[30:31]
1077  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1078  %element = extractelement <8 x i8> %vector, i32 %idx
1079  ret i8 %element
1080}
1081
1082define amdgpu_ps i8 @extractelement_sgpr_v8i8_vgpr_idx(<8 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
1083; GCN-LABEL: extractelement_sgpr_v8i8_vgpr_idx:
1084; GCN:       ; %bb.0:
1085; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1086; GCN-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
1087; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
1088; GCN-NEXT:    v_and_b32_e32 v0, 3, v0
1089; GCN-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1090; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1091; GCN-NEXT:    s_bfe_u32 s5, s0, 0x80008
1092; GCN-NEXT:    s_lshr_b32 s2, s0, 24
1093; GCN-NEXT:    s_and_b32 s4, s0, 0xff
1094; GCN-NEXT:    s_lshl_b32 s5, s5, 8
1095; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
1096; GCN-NEXT:    s_or_b32 s4, s4, s5
1097; GCN-NEXT:    s_lshl_b32 s0, s0, 16
1098; GCN-NEXT:    s_or_b32 s0, s4, s0
1099; GCN-NEXT:    s_lshl_b32 s2, s2, 24
1100; GCN-NEXT:    s_bfe_u32 s4, s1, 0x80008
1101; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1102; GCN-NEXT:    s_or_b32 s0, s0, s2
1103; GCN-NEXT:    s_and_b32 s2, s1, 0xff
1104; GCN-NEXT:    s_lshl_b32 s4, s4, 8
1105; GCN-NEXT:    s_bfe_u32 s1, s1, 0x80010
1106; GCN-NEXT:    s_or_b32 s2, s2, s4
1107; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1108; GCN-NEXT:    s_or_b32 s1, s2, s1
1109; GCN-NEXT:    s_lshl_b32 s2, s3, 24
1110; GCN-NEXT:    s_or_b32 s1, s1, s2
1111; GCN-NEXT:    v_mov_b32_e32 v2, s0
1112; GCN-NEXT:    v_mov_b32_e32 v3, s1
1113; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v3, vcc
1114; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
1115; GCN-NEXT:    v_readfirstlane_b32 s0, v0
1116; GCN-NEXT:    ; return to shader part epilog
1117;
1118; GFX10-LABEL: extractelement_sgpr_v8i8_vgpr_idx:
1119; GFX10:       ; %bb.0:
1120; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1121; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
1122; GFX10-NEXT:    v_and_b32_e32 v0, 3, v0
1123; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
1124; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1125; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1126; GFX10-NEXT:    s_bfe_u32 s7, s1, 0x80008
1127; GFX10-NEXT:    s_lshr_b32 s3, s1, 24
1128; GFX10-NEXT:    s_and_b32 s6, s1, 0xff
1129; GFX10-NEXT:    s_bfe_u32 s1, s1, 0x80010
1130; GFX10-NEXT:    s_lshl_b32 s7, s7, 8
1131; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
1132; GFX10-NEXT:    s_or_b32 s6, s6, s7
1133; GFX10-NEXT:    s_bfe_u32 s5, s0, 0x80008
1134; GFX10-NEXT:    s_lshl_b32 s3, s3, 24
1135; GFX10-NEXT:    s_or_b32 s1, s6, s1
1136; GFX10-NEXT:    s_lshr_b32 s2, s0, 24
1137; GFX10-NEXT:    s_and_b32 s4, s0, 0xff
1138; GFX10-NEXT:    s_bfe_u32 s0, s0, 0x80010
1139; GFX10-NEXT:    s_lshl_b32 s5, s5, 8
1140; GFX10-NEXT:    s_or_b32 s1, s1, s3
1141; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
1142; GFX10-NEXT:    s_or_b32 s3, s4, s5
1143; GFX10-NEXT:    v_mov_b32_e32 v2, s1
1144; GFX10-NEXT:    s_lshl_b32 s2, s2, 24
1145; GFX10-NEXT:    s_or_b32 s0, s3, s0
1146; GFX10-NEXT:    s_or_b32 s0, s0, s2
1147; GFX10-NEXT:    v_cndmask_b32_e32 v1, s0, v2, vcc_lo
1148; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
1149; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1150; GFX10-NEXT:    ; return to shader part epilog
1151  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1152  %element = extractelement <8 x i8> %vector, i32 %idx
1153  ret i8 %element
1154}
1155
1156define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx0(<8 x i8> addrspace(4)* inreg %ptr) {
1157; GCN-LABEL: extractelement_sgpr_v8i8_idx0:
1158; GCN:       ; %bb.0:
1159; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1160; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1161; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
1162; GCN-NEXT:    s_lshr_b32 s1, s0, 24
1163; GCN-NEXT:    s_and_b32 s2, s0, 0xff
1164; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
1165; GCN-NEXT:    s_lshl_b32 s3, s3, 8
1166; GCN-NEXT:    s_or_b32 s2, s2, s3
1167; GCN-NEXT:    s_lshl_b32 s0, s0, 16
1168; GCN-NEXT:    s_or_b32 s0, s2, s0
1169; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1170; GCN-NEXT:    s_or_b32 s0, s0, s1
1171; GCN-NEXT:    ; return to shader part epilog
1172;
1173; GFX10-LABEL: extractelement_sgpr_v8i8_idx0:
1174; GFX10:       ; %bb.0:
1175; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1176; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1177; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
1178; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
1179; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
1180; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1181; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
1182; GFX10-NEXT:    s_or_b32 s1, s1, s2
1183; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1184; GFX10-NEXT:    s_or_b32 s1, s1, s3
1185; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
1186; GFX10-NEXT:    s_or_b32 s0, s1, s0
1187; GFX10-NEXT:    ; return to shader part epilog
1188  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1189  %element = extractelement <8 x i8> %vector, i32 0
1190  ret i8 %element
1191}
1192
1193define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx1(<8 x i8> addrspace(4)* inreg %ptr) {
1194; GCN-LABEL: extractelement_sgpr_v8i8_idx1:
1195; GCN:       ; %bb.0:
1196; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1197; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1198; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
1199; GCN-NEXT:    s_lshr_b32 s1, s0, 24
1200; GCN-NEXT:    s_and_b32 s2, s0, 0xff
1201; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
1202; GCN-NEXT:    s_lshl_b32 s3, s3, 8
1203; GCN-NEXT:    s_or_b32 s2, s2, s3
1204; GCN-NEXT:    s_lshl_b32 s0, s0, 16
1205; GCN-NEXT:    s_or_b32 s0, s2, s0
1206; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1207; GCN-NEXT:    s_or_b32 s0, s0, s1
1208; GCN-NEXT:    s_lshr_b32 s0, s0, 8
1209; GCN-NEXT:    ; return to shader part epilog
1210;
1211; GFX10-LABEL: extractelement_sgpr_v8i8_idx1:
1212; GFX10:       ; %bb.0:
1213; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1214; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1215; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
1216; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
1217; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
1218; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1219; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
1220; GFX10-NEXT:    s_or_b32 s1, s1, s2
1221; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1222; GFX10-NEXT:    s_or_b32 s1, s1, s3
1223; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
1224; GFX10-NEXT:    s_or_b32 s0, s1, s0
1225; GFX10-NEXT:    s_lshr_b32 s0, s0, 8
1226; GFX10-NEXT:    ; return to shader part epilog
1227  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1228  %element = extractelement <8 x i8> %vector, i32 1
1229  ret i8 %element
1230}
1231
1232define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx2(<8 x i8> addrspace(4)* inreg %ptr) {
1233; GCN-LABEL: extractelement_sgpr_v8i8_idx2:
1234; GCN:       ; %bb.0:
1235; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1236; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1237; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
1238; GCN-NEXT:    s_lshr_b32 s1, s0, 24
1239; GCN-NEXT:    s_and_b32 s2, s0, 0xff
1240; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
1241; GCN-NEXT:    s_lshl_b32 s3, s3, 8
1242; GCN-NEXT:    s_or_b32 s2, s2, s3
1243; GCN-NEXT:    s_lshl_b32 s0, s0, 16
1244; GCN-NEXT:    s_or_b32 s0, s2, s0
1245; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1246; GCN-NEXT:    s_or_b32 s0, s0, s1
1247; GCN-NEXT:    s_lshr_b32 s0, s0, 16
1248; GCN-NEXT:    ; return to shader part epilog
1249;
1250; GFX10-LABEL: extractelement_sgpr_v8i8_idx2:
1251; GFX10:       ; %bb.0:
1252; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1253; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1254; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
1255; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
1256; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
1257; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1258; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
1259; GFX10-NEXT:    s_or_b32 s1, s1, s2
1260; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1261; GFX10-NEXT:    s_or_b32 s1, s1, s3
1262; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
1263; GFX10-NEXT:    s_or_b32 s0, s1, s0
1264; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
1265; GFX10-NEXT:    ; return to shader part epilog
1266  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1267  %element = extractelement <8 x i8> %vector, i32 2
1268  ret i8 %element
1269}
1270
1271define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx3(<8 x i8> addrspace(4)* inreg %ptr) {
1272; GCN-LABEL: extractelement_sgpr_v8i8_idx3:
1273; GCN:       ; %bb.0:
1274; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1275; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1276; GCN-NEXT:    s_bfe_u32 s3, s0, 0x80008
1277; GCN-NEXT:    s_lshr_b32 s1, s0, 24
1278; GCN-NEXT:    s_and_b32 s2, s0, 0xff
1279; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
1280; GCN-NEXT:    s_lshl_b32 s3, s3, 8
1281; GCN-NEXT:    s_or_b32 s2, s2, s3
1282; GCN-NEXT:    s_lshl_b32 s0, s0, 16
1283; GCN-NEXT:    s_or_b32 s0, s2, s0
1284; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1285; GCN-NEXT:    s_or_b32 s0, s0, s1
1286; GCN-NEXT:    s_lshr_b32 s0, s0, 24
1287; GCN-NEXT:    ; return to shader part epilog
1288;
1289; GFX10-LABEL: extractelement_sgpr_v8i8_idx3:
1290; GFX10:       ; %bb.0:
1291; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1292; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1293; GFX10-NEXT:    s_bfe_u32 s2, s0, 0x80008
1294; GFX10-NEXT:    s_and_b32 s1, s0, 0xff
1295; GFX10-NEXT:    s_bfe_u32 s3, s0, 0x80010
1296; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1297; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
1298; GFX10-NEXT:    s_or_b32 s1, s1, s2
1299; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1300; GFX10-NEXT:    s_or_b32 s1, s1, s3
1301; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
1302; GFX10-NEXT:    s_or_b32 s0, s1, s0
1303; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1304; GFX10-NEXT:    ; return to shader part epilog
1305  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1306  %element = extractelement <8 x i8> %vector, i32 3
1307  ret i8 %element
1308}
1309
1310define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx4(<8 x i8> addrspace(4)* inreg %ptr) {
1311; GCN-LABEL: extractelement_sgpr_v8i8_idx4:
1312; GCN:       ; %bb.0:
1313; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1314; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1315; GCN-NEXT:    s_bfe_u32 s3, s1, 0x80008
1316; GCN-NEXT:    s_lshr_b32 s0, s1, 24
1317; GCN-NEXT:    s_and_b32 s2, s1, 0xff
1318; GCN-NEXT:    s_bfe_u32 s1, s1, 0x80010
1319; GCN-NEXT:    s_lshl_b32 s3, s3, 8
1320; GCN-NEXT:    s_or_b32 s2, s2, s3
1321; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1322; GCN-NEXT:    s_or_b32 s1, s2, s1
1323; GCN-NEXT:    s_lshl_b32 s0, s0, 24
1324; GCN-NEXT:    s_or_b32 s0, s1, s0
1325; GCN-NEXT:    ; return to shader part epilog
1326;
1327; GFX10-LABEL: extractelement_sgpr_v8i8_idx4:
1328; GFX10:       ; %bb.0:
1329; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1330; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1331; GFX10-NEXT:    s_bfe_u32 s2, s1, 0x80008
1332; GFX10-NEXT:    s_and_b32 s0, s1, 0xff
1333; GFX10-NEXT:    s_bfe_u32 s3, s1, 0x80010
1334; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1335; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
1336; GFX10-NEXT:    s_or_b32 s0, s0, s2
1337; GFX10-NEXT:    s_lshr_b32 s1, s1, 24
1338; GFX10-NEXT:    s_or_b32 s0, s0, s3
1339; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
1340; GFX10-NEXT:    s_or_b32 s0, s0, s1
1341; GFX10-NEXT:    ; return to shader part epilog
1342  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1343  %element = extractelement <8 x i8> %vector, i32 4
1344  ret i8 %element
1345}
1346
1347define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx5(<8 x i8> addrspace(4)* inreg %ptr) {
1348; GCN-LABEL: extractelement_sgpr_v8i8_idx5:
1349; GCN:       ; %bb.0:
1350; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1351; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1352; GCN-NEXT:    s_bfe_u32 s3, s1, 0x80008
1353; GCN-NEXT:    s_lshr_b32 s0, s1, 24
1354; GCN-NEXT:    s_and_b32 s2, s1, 0xff
1355; GCN-NEXT:    s_bfe_u32 s1, s1, 0x80010
1356; GCN-NEXT:    s_lshl_b32 s3, s3, 8
1357; GCN-NEXT:    s_or_b32 s2, s2, s3
1358; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1359; GCN-NEXT:    s_or_b32 s1, s2, s1
1360; GCN-NEXT:    s_lshl_b32 s0, s0, 24
1361; GCN-NEXT:    s_or_b32 s0, s1, s0
1362; GCN-NEXT:    s_lshr_b32 s0, s0, 8
1363; GCN-NEXT:    ; return to shader part epilog
1364;
1365; GFX10-LABEL: extractelement_sgpr_v8i8_idx5:
1366; GFX10:       ; %bb.0:
1367; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1368; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1369; GFX10-NEXT:    s_bfe_u32 s2, s1, 0x80008
1370; GFX10-NEXT:    s_and_b32 s0, s1, 0xff
1371; GFX10-NEXT:    s_bfe_u32 s3, s1, 0x80010
1372; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1373; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
1374; GFX10-NEXT:    s_or_b32 s0, s0, s2
1375; GFX10-NEXT:    s_lshr_b32 s1, s1, 24
1376; GFX10-NEXT:    s_or_b32 s0, s0, s3
1377; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
1378; GFX10-NEXT:    s_or_b32 s0, s0, s1
1379; GFX10-NEXT:    s_lshr_b32 s0, s0, 8
1380; GFX10-NEXT:    ; return to shader part epilog
1381  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1382  %element = extractelement <8 x i8> %vector, i32 5
1383  ret i8 %element
1384}
1385
1386define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx6(<8 x i8> addrspace(4)* inreg %ptr) {
1387; GCN-LABEL: extractelement_sgpr_v8i8_idx6:
1388; GCN:       ; %bb.0:
1389; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1390; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1391; GCN-NEXT:    s_bfe_u32 s3, s1, 0x80008
1392; GCN-NEXT:    s_lshr_b32 s0, s1, 24
1393; GCN-NEXT:    s_and_b32 s2, s1, 0xff
1394; GCN-NEXT:    s_bfe_u32 s1, s1, 0x80010
1395; GCN-NEXT:    s_lshl_b32 s3, s3, 8
1396; GCN-NEXT:    s_or_b32 s2, s2, s3
1397; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1398; GCN-NEXT:    s_or_b32 s1, s2, s1
1399; GCN-NEXT:    s_lshl_b32 s0, s0, 24
1400; GCN-NEXT:    s_or_b32 s0, s1, s0
1401; GCN-NEXT:    s_lshr_b32 s0, s0, 16
1402; GCN-NEXT:    ; return to shader part epilog
1403;
1404; GFX10-LABEL: extractelement_sgpr_v8i8_idx6:
1405; GFX10:       ; %bb.0:
1406; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1407; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1408; GFX10-NEXT:    s_bfe_u32 s2, s1, 0x80008
1409; GFX10-NEXT:    s_and_b32 s0, s1, 0xff
1410; GFX10-NEXT:    s_bfe_u32 s3, s1, 0x80010
1411; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1412; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
1413; GFX10-NEXT:    s_or_b32 s0, s0, s2
1414; GFX10-NEXT:    s_lshr_b32 s1, s1, 24
1415; GFX10-NEXT:    s_or_b32 s0, s0, s3
1416; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
1417; GFX10-NEXT:    s_or_b32 s0, s0, s1
1418; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
1419; GFX10-NEXT:    ; return to shader part epilog
1420  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1421  %element = extractelement <8 x i8> %vector, i32 6
1422  ret i8 %element
1423}
1424
1425define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx7(<8 x i8> addrspace(4)* inreg %ptr) {
1426; GCN-LABEL: extractelement_sgpr_v8i8_idx7:
1427; GCN:       ; %bb.0:
1428; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1429; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1430; GCN-NEXT:    s_bfe_u32 s3, s1, 0x80008
1431; GCN-NEXT:    s_lshr_b32 s0, s1, 24
1432; GCN-NEXT:    s_and_b32 s2, s1, 0xff
1433; GCN-NEXT:    s_bfe_u32 s1, s1, 0x80010
1434; GCN-NEXT:    s_lshl_b32 s3, s3, 8
1435; GCN-NEXT:    s_or_b32 s2, s2, s3
1436; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1437; GCN-NEXT:    s_or_b32 s1, s2, s1
1438; GCN-NEXT:    s_lshl_b32 s0, s0, 24
1439; GCN-NEXT:    s_or_b32 s0, s1, s0
1440; GCN-NEXT:    s_lshr_b32 s0, s0, 24
1441; GCN-NEXT:    ; return to shader part epilog
1442;
1443; GFX10-LABEL: extractelement_sgpr_v8i8_idx7:
1444; GFX10:       ; %bb.0:
1445; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1446; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1447; GFX10-NEXT:    s_bfe_u32 s2, s1, 0x80008
1448; GFX10-NEXT:    s_and_b32 s0, s1, 0xff
1449; GFX10-NEXT:    s_bfe_u32 s3, s1, 0x80010
1450; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1451; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
1452; GFX10-NEXT:    s_or_b32 s0, s0, s2
1453; GFX10-NEXT:    s_lshr_b32 s1, s1, 24
1454; GFX10-NEXT:    s_or_b32 s0, s0, s3
1455; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
1456; GFX10-NEXT:    s_or_b32 s0, s0, s1
1457; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1458; GFX10-NEXT:    ; return to shader part epilog
1459  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1460  %element = extractelement <8 x i8> %vector, i32 7
1461  ret i8 %element
1462}
1463
1464define i8 @extractelement_vgpr_v8i8_idx0(<8 x i8> addrspace(1)* %ptr) {
1465; GFX9-LABEL: extractelement_vgpr_v8i8_idx0:
1466; GFX9:       ; %bb.0:
1467; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1468; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1469; GFX9-NEXT:    v_mov_b32_e32 v2, 8
1470; GFX9-NEXT:    s_waitcnt vmcnt(0)
1471; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
1472; GFX9-NEXT:    v_mov_b32_e32 v3, 16
1473; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1474; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1475; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1476; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
1477; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
1478; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
1479; GFX9-NEXT:    s_setpc_b64 s[30:31]
1480;
1481; GFX8-LABEL: extractelement_vgpr_v8i8_idx0:
1482; GFX8:       ; %bb.0:
1483; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1484; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1485; GFX8-NEXT:    s_waitcnt vmcnt(0)
1486; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1487; GFX8-NEXT:    v_mov_b32_e32 v2, 16
1488; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1489; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1490; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1491; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1492; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1493; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1494; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1495; GFX8-NEXT:    s_setpc_b64 s[30:31]
1496;
1497; GFX7-LABEL: extractelement_vgpr_v8i8_idx0:
1498; GFX7:       ; %bb.0:
1499; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1500; GFX7-NEXT:    s_mov_b32 s6, 0
1501; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1502; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1503; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1504; GFX7-NEXT:    s_waitcnt vmcnt(0)
1505; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
1506; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
1507; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
1508; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
1509; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
1510; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1511; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
1512; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
1513; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
1514; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1515; GFX7-NEXT:    s_setpc_b64 s[30:31]
1516;
1517; GFX10-LABEL: extractelement_vgpr_v8i8_idx0:
1518; GFX10:       ; %bb.0:
1519; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1520; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1521; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1522; GFX10-NEXT:    s_waitcnt vmcnt(0)
1523; GFX10-NEXT:    v_mov_b32_e32 v1, 8
1524; GFX10-NEXT:    v_mov_b32_e32 v2, 16
1525; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1526; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1527; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1528; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
1529; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1530; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
1531; GFX10-NEXT:    s_setpc_b64 s[30:31]
1532  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1533  %element = extractelement <8 x i8> %vector, i32 0
1534  ret i8 %element
1535}
1536
1537define i8 @extractelement_vgpr_v8i8_idx1(<8 x i8> addrspace(1)* %ptr) {
1538; GFX9-LABEL: extractelement_vgpr_v8i8_idx1:
1539; GFX9:       ; %bb.0:
1540; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1541; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1542; GFX9-NEXT:    s_mov_b32 s4, 8
1543; GFX9-NEXT:    s_waitcnt vmcnt(0)
1544; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
1545; GFX9-NEXT:    v_mov_b32_e32 v2, 16
1546; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1547; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1548; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1549; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v4
1550; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1551; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
1552; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1553; GFX9-NEXT:    s_setpc_b64 s[30:31]
1554;
1555; GFX8-LABEL: extractelement_vgpr_v8i8_idx1:
1556; GFX8:       ; %bb.0:
1557; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1558; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1559; GFX8-NEXT:    s_waitcnt vmcnt(0)
1560; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1561; GFX8-NEXT:    v_mov_b32_e32 v2, 16
1562; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1563; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1564; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1565; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1566; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1567; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1568; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1569; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1570; GFX8-NEXT:    s_setpc_b64 s[30:31]
1571;
1572; GFX7-LABEL: extractelement_vgpr_v8i8_idx1:
1573; GFX7:       ; %bb.0:
1574; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1575; GFX7-NEXT:    s_mov_b32 s6, 0
1576; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1577; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1578; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1579; GFX7-NEXT:    s_waitcnt vmcnt(0)
1580; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
1581; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
1582; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
1583; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
1584; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
1585; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1586; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
1587; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
1588; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
1589; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1590; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1591; GFX7-NEXT:    s_setpc_b64 s[30:31]
1592;
1593; GFX10-LABEL: extractelement_vgpr_v8i8_idx1:
1594; GFX10:       ; %bb.0:
1595; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1596; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1597; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1598; GFX10-NEXT:    s_mov_b32 s4, 8
1599; GFX10-NEXT:    s_waitcnt vmcnt(0)
1600; GFX10-NEXT:    v_mov_b32_e32 v1, 16
1601; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1602; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1603; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1604; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v2
1605; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
1606; GFX10-NEXT:    v_or3_b32 v0, v0, v1, v2
1607; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1608; GFX10-NEXT:    s_setpc_b64 s[30:31]
1609  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1610  %element = extractelement <8 x i8> %vector, i32 1
1611  ret i8 %element
1612}
1613
1614define i8 @extractelement_vgpr_v8i8_idx2(<8 x i8> addrspace(1)* %ptr) {
1615; GFX9-LABEL: extractelement_vgpr_v8i8_idx2:
1616; GFX9:       ; %bb.0:
1617; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1618; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1619; GFX9-NEXT:    v_mov_b32_e32 v2, 8
1620; GFX9-NEXT:    s_mov_b32 s4, 16
1621; GFX9-NEXT:    s_waitcnt vmcnt(0)
1622; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
1623; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1624; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1625; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1626; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
1627; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1628; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v1
1629; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1630; GFX9-NEXT:    s_setpc_b64 s[30:31]
1631;
1632; GFX8-LABEL: extractelement_vgpr_v8i8_idx2:
1633; GFX8:       ; %bb.0:
1634; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1635; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1636; GFX8-NEXT:    s_waitcnt vmcnt(0)
1637; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1638; GFX8-NEXT:    v_mov_b32_e32 v2, 16
1639; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1640; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1641; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1642; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1643; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1644; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1645; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1646; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1647; GFX8-NEXT:    s_setpc_b64 s[30:31]
1648;
1649; GFX7-LABEL: extractelement_vgpr_v8i8_idx2:
1650; GFX7:       ; %bb.0:
1651; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1652; GFX7-NEXT:    s_mov_b32 s6, 0
1653; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1654; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1655; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1656; GFX7-NEXT:    s_waitcnt vmcnt(0)
1657; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
1658; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
1659; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
1660; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
1661; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
1662; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1663; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
1664; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
1665; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
1666; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1667; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1668; GFX7-NEXT:    s_setpc_b64 s[30:31]
1669;
1670; GFX10-LABEL: extractelement_vgpr_v8i8_idx2:
1671; GFX10:       ; %bb.0:
1672; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1673; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1674; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1675; GFX10-NEXT:    s_waitcnt vmcnt(0)
1676; GFX10-NEXT:    v_mov_b32_e32 v1, 8
1677; GFX10-NEXT:    s_mov_b32 s4, 16
1678; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1679; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1680; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1681; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
1682; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1683; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
1684; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1685; GFX10-NEXT:    s_setpc_b64 s[30:31]
1686  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1687  %element = extractelement <8 x i8> %vector, i32 2
1688  ret i8 %element
1689}
1690
1691define i8 @extractelement_vgpr_v8i8_idx3(<8 x i8> addrspace(1)* %ptr) {
1692; GFX9-LABEL: extractelement_vgpr_v8i8_idx3:
1693; GFX9:       ; %bb.0:
1694; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1695; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1696; GFX9-NEXT:    v_mov_b32_e32 v2, 8
1697; GFX9-NEXT:    s_waitcnt vmcnt(0)
1698; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
1699; GFX9-NEXT:    v_mov_b32_e32 v3, 16
1700; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1701; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1702; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1703; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
1704; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
1705; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
1706; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1707; GFX9-NEXT:    s_setpc_b64 s[30:31]
1708;
1709; GFX8-LABEL: extractelement_vgpr_v8i8_idx3:
1710; GFX8:       ; %bb.0:
1711; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1712; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1713; GFX8-NEXT:    s_waitcnt vmcnt(0)
1714; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1715; GFX8-NEXT:    v_mov_b32_e32 v2, 16
1716; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1717; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1718; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1719; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1720; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1721; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1722; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1723; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1724; GFX8-NEXT:    s_setpc_b64 s[30:31]
1725;
1726; GFX7-LABEL: extractelement_vgpr_v8i8_idx3:
1727; GFX7:       ; %bb.0:
1728; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1729; GFX7-NEXT:    s_mov_b32 s6, 0
1730; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1731; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1732; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1733; GFX7-NEXT:    s_waitcnt vmcnt(0)
1734; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
1735; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
1736; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
1737; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
1738; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
1739; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1740; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
1741; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
1742; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
1743; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1744; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1745; GFX7-NEXT:    s_setpc_b64 s[30:31]
1746;
1747; GFX10-LABEL: extractelement_vgpr_v8i8_idx3:
1748; GFX10:       ; %bb.0:
1749; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1750; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1751; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1752; GFX10-NEXT:    s_waitcnt vmcnt(0)
1753; GFX10-NEXT:    v_mov_b32_e32 v1, 8
1754; GFX10-NEXT:    v_mov_b32_e32 v2, 16
1755; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1756; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1757; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1758; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
1759; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1760; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
1761; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1762; GFX10-NEXT:    s_setpc_b64 s[30:31]
1763  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1764  %element = extractelement <8 x i8> %vector, i32 3
1765  ret i8 %element
1766}
1767
1768define i8 @extractelement_vgpr_v8i8_idx4(<8 x i8> addrspace(1)* %ptr) {
1769; GFX9-LABEL: extractelement_vgpr_v8i8_idx4:
1770; GFX9:       ; %bb.0:
1771; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1772; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1773; GFX9-NEXT:    v_mov_b32_e32 v2, 8
1774; GFX9-NEXT:    s_waitcnt vmcnt(0)
1775; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
1776; GFX9-NEXT:    v_mov_b32_e32 v3, 16
1777; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
1778; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1779; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1780; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v2
1781; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
1782; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
1783; GFX9-NEXT:    s_setpc_b64 s[30:31]
1784;
1785; GFX8-LABEL: extractelement_vgpr_v8i8_idx4:
1786; GFX8:       ; %bb.0:
1787; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1788; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1789; GFX8-NEXT:    s_waitcnt vmcnt(0)
1790; GFX8-NEXT:    v_mov_b32_e32 v0, 8
1791; GFX8-NEXT:    v_mov_b32_e32 v2, 16
1792; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1793; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1794; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1795; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1796; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1797; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1798; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1799; GFX8-NEXT:    s_setpc_b64 s[30:31]
1800;
1801; GFX7-LABEL: extractelement_vgpr_v8i8_idx4:
1802; GFX7:       ; %bb.0:
1803; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1804; GFX7-NEXT:    s_mov_b32 s6, 0
1805; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1806; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1807; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1808; GFX7-NEXT:    s_waitcnt vmcnt(0)
1809; GFX7-NEXT:    v_bfe_u32 v3, v1, 8, 8
1810; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v1
1811; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v1
1812; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
1813; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
1814; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1815; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
1816; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
1817; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
1818; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
1819; GFX7-NEXT:    s_setpc_b64 s[30:31]
1820;
1821; GFX10-LABEL: extractelement_vgpr_v8i8_idx4:
1822; GFX10:       ; %bb.0:
1823; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1824; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1825; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1826; GFX10-NEXT:    s_waitcnt vmcnt(0)
1827; GFX10-NEXT:    v_mov_b32_e32 v0, 8
1828; GFX10-NEXT:    v_mov_b32_e32 v2, 16
1829; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1830; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1831; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1832; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v1, v0
1833; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1834; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
1835; GFX10-NEXT:    s_setpc_b64 s[30:31]
1836  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1837  %element = extractelement <8 x i8> %vector, i32 4
1838  ret i8 %element
1839}
1840
1841define i8 @extractelement_vgpr_v8i8_idx5(<8 x i8> addrspace(1)* %ptr) {
1842; GFX9-LABEL: extractelement_vgpr_v8i8_idx5:
1843; GFX9:       ; %bb.0:
1844; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1845; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1846; GFX9-NEXT:    s_mov_b32 s4, 8
1847; GFX9-NEXT:    s_waitcnt vmcnt(0)
1848; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
1849; GFX9-NEXT:    v_mov_b32_e32 v2, 16
1850; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1851; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1852; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1853; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v4
1854; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1855; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
1856; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1857; GFX9-NEXT:    s_setpc_b64 s[30:31]
1858;
1859; GFX8-LABEL: extractelement_vgpr_v8i8_idx5:
1860; GFX8:       ; %bb.0:
1861; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1862; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1863; GFX8-NEXT:    s_waitcnt vmcnt(0)
1864; GFX8-NEXT:    v_mov_b32_e32 v0, 8
1865; GFX8-NEXT:    v_mov_b32_e32 v2, 16
1866; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1867; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1868; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1869; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1870; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1871; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1872; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1873; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1874; GFX8-NEXT:    s_setpc_b64 s[30:31]
1875;
1876; GFX7-LABEL: extractelement_vgpr_v8i8_idx5:
1877; GFX7:       ; %bb.0:
1878; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1879; GFX7-NEXT:    s_mov_b32 s6, 0
1880; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1881; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1882; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1883; GFX7-NEXT:    s_waitcnt vmcnt(0)
1884; GFX7-NEXT:    v_bfe_u32 v3, v1, 8, 8
1885; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v1
1886; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v1
1887; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
1888; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
1889; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1890; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
1891; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
1892; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
1893; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
1894; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1895; GFX7-NEXT:    s_setpc_b64 s[30:31]
1896;
1897; GFX10-LABEL: extractelement_vgpr_v8i8_idx5:
1898; GFX10:       ; %bb.0:
1899; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1900; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1901; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1902; GFX10-NEXT:    s_mov_b32 s4, 8
1903; GFX10-NEXT:    s_waitcnt vmcnt(0)
1904; GFX10-NEXT:    v_mov_b32_e32 v0, 16
1905; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1906; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1907; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1908; GFX10-NEXT:    v_and_or_b32 v1, 0xff, v1, v2
1909; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
1910; GFX10-NEXT:    v_or3_b32 v0, v1, v0, v2
1911; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1912; GFX10-NEXT:    s_setpc_b64 s[30:31]
1913  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1914  %element = extractelement <8 x i8> %vector, i32 5
1915  ret i8 %element
1916}
1917
1918define i8 @extractelement_vgpr_v8i8_idx6(<8 x i8> addrspace(1)* %ptr) {
1919; GFX9-LABEL: extractelement_vgpr_v8i8_idx6:
1920; GFX9:       ; %bb.0:
1921; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1922; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1923; GFX9-NEXT:    v_mov_b32_e32 v2, 8
1924; GFX9-NEXT:    s_mov_b32 s4, 16
1925; GFX9-NEXT:    s_waitcnt vmcnt(0)
1926; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
1927; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1928; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1929; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1930; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v2
1931; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1932; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v1
1933; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1934; GFX9-NEXT:    s_setpc_b64 s[30:31]
1935;
1936; GFX8-LABEL: extractelement_vgpr_v8i8_idx6:
1937; GFX8:       ; %bb.0:
1938; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1939; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1940; GFX8-NEXT:    s_waitcnt vmcnt(0)
1941; GFX8-NEXT:    v_mov_b32_e32 v0, 8
1942; GFX8-NEXT:    v_mov_b32_e32 v2, 16
1943; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1944; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1945; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1946; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1947; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1948; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1949; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1950; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1951; GFX8-NEXT:    s_setpc_b64 s[30:31]
1952;
1953; GFX7-LABEL: extractelement_vgpr_v8i8_idx6:
1954; GFX7:       ; %bb.0:
1955; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1956; GFX7-NEXT:    s_mov_b32 s6, 0
1957; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1958; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1959; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1960; GFX7-NEXT:    s_waitcnt vmcnt(0)
1961; GFX7-NEXT:    v_bfe_u32 v3, v1, 8, 8
1962; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v1
1963; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v1
1964; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
1965; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
1966; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1967; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
1968; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
1969; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
1970; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
1971; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1972; GFX7-NEXT:    s_setpc_b64 s[30:31]
1973;
1974; GFX10-LABEL: extractelement_vgpr_v8i8_idx6:
1975; GFX10:       ; %bb.0:
1976; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1977; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1978; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1979; GFX10-NEXT:    s_waitcnt vmcnt(0)
1980; GFX10-NEXT:    v_mov_b32_e32 v0, 8
1981; GFX10-NEXT:    s_mov_b32 s4, 16
1982; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
1983; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
1984; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
1985; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v1, v0
1986; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1987; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
1988; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1989; GFX10-NEXT:    s_setpc_b64 s[30:31]
1990  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1991  %element = extractelement <8 x i8> %vector, i32 6
1992  ret i8 %element
1993}
1994
1995define i8 @extractelement_vgpr_v8i8_idx7(<8 x i8> addrspace(1)* %ptr) {
1996; GFX9-LABEL: extractelement_vgpr_v8i8_idx7:
1997; GFX9:       ; %bb.0:
1998; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1999; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2000; GFX9-NEXT:    v_mov_b32_e32 v2, 8
2001; GFX9-NEXT:    s_waitcnt vmcnt(0)
2002; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
2003; GFX9-NEXT:    v_mov_b32_e32 v3, 16
2004; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
2005; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2006; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2007; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v2
2008; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
2009; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
2010; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2011; GFX9-NEXT:    s_setpc_b64 s[30:31]
2012;
2013; GFX8-LABEL: extractelement_vgpr_v8i8_idx7:
2014; GFX8:       ; %bb.0:
2015; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2016; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
2017; GFX8-NEXT:    s_waitcnt vmcnt(0)
2018; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2019; GFX8-NEXT:    v_mov_b32_e32 v2, 16
2020; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2021; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2022; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2023; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2024; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
2025; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2026; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2027; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2028; GFX8-NEXT:    s_setpc_b64 s[30:31]
2029;
2030; GFX7-LABEL: extractelement_vgpr_v8i8_idx7:
2031; GFX7:       ; %bb.0:
2032; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2033; GFX7-NEXT:    s_mov_b32 s6, 0
2034; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2035; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2036; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
2037; GFX7-NEXT:    s_waitcnt vmcnt(0)
2038; GFX7-NEXT:    v_bfe_u32 v3, v1, 8, 8
2039; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v1
2040; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v1
2041; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
2042; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
2043; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2044; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
2045; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
2046; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
2047; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2048; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2049; GFX7-NEXT:    s_setpc_b64 s[30:31]
2050;
2051; GFX10-LABEL: extractelement_vgpr_v8i8_idx7:
2052; GFX10:       ; %bb.0:
2053; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2054; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2055; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2056; GFX10-NEXT:    s_waitcnt vmcnt(0)
2057; GFX10-NEXT:    v_mov_b32_e32 v0, 8
2058; GFX10-NEXT:    v_mov_b32_e32 v2, 16
2059; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2060; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2061; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2062; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v1, v0
2063; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2064; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
2065; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2066; GFX10-NEXT:    s_setpc_b64 s[30:31]
2067  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
2068  %element = extractelement <8 x i8> %vector, i32 7
2069  ret i8 %element
2070}
2071
2072define amdgpu_ps i8 @extractelement_sgpr_v16i8_sgpr_idx(<16 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
2073; GCN-LABEL: extractelement_sgpr_v16i8_sgpr_idx:
2074; GCN:       ; %bb.0:
2075; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2076; GCN-NEXT:    s_waitcnt lgkmcnt(0)
2077; GCN-NEXT:    s_bfe_u32 s10, s0, 0x80008
2078; GCN-NEXT:    s_lshr_b32 s5, s0, 24
2079; GCN-NEXT:    s_and_b32 s9, s0, 0xff
2080; GCN-NEXT:    s_lshl_b32 s10, s10, 8
2081; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
2082; GCN-NEXT:    s_or_b32 s9, s9, s10
2083; GCN-NEXT:    s_lshl_b32 s0, s0, 16
2084; GCN-NEXT:    s_or_b32 s0, s9, s0
2085; GCN-NEXT:    s_lshl_b32 s5, s5, 24
2086; GCN-NEXT:    s_bfe_u32 s9, s1, 0x80008
2087; GCN-NEXT:    s_lshr_b32 s6, s1, 24
2088; GCN-NEXT:    s_or_b32 s0, s0, s5
2089; GCN-NEXT:    s_and_b32 s5, s1, 0xff
2090; GCN-NEXT:    s_lshl_b32 s9, s9, 8
2091; GCN-NEXT:    s_bfe_u32 s1, s1, 0x80010
2092; GCN-NEXT:    s_or_b32 s5, s5, s9
2093; GCN-NEXT:    s_lshl_b32 s1, s1, 16
2094; GCN-NEXT:    s_or_b32 s1, s5, s1
2095; GCN-NEXT:    s_lshl_b32 s5, s6, 24
2096; GCN-NEXT:    s_bfe_u32 s6, s2, 0x80008
2097; GCN-NEXT:    s_lshr_b32 s7, s2, 24
2098; GCN-NEXT:    s_or_b32 s1, s1, s5
2099; GCN-NEXT:    s_and_b32 s5, s2, 0xff
2100; GCN-NEXT:    s_lshl_b32 s6, s6, 8
2101; GCN-NEXT:    s_bfe_u32 s2, s2, 0x80010
2102; GCN-NEXT:    s_or_b32 s5, s5, s6
2103; GCN-NEXT:    s_lshl_b32 s2, s2, 16
2104; GCN-NEXT:    s_or_b32 s2, s5, s2
2105; GCN-NEXT:    s_lshl_b32 s5, s7, 24
2106; GCN-NEXT:    s_bfe_u32 s6, s3, 0x80008
2107; GCN-NEXT:    s_lshr_b32 s8, s3, 24
2108; GCN-NEXT:    s_or_b32 s2, s2, s5
2109; GCN-NEXT:    s_and_b32 s5, s3, 0xff
2110; GCN-NEXT:    s_lshl_b32 s6, s6, 8
2111; GCN-NEXT:    s_bfe_u32 s3, s3, 0x80010
2112; GCN-NEXT:    s_or_b32 s5, s5, s6
2113; GCN-NEXT:    s_lshl_b32 s3, s3, 16
2114; GCN-NEXT:    s_or_b32 s3, s5, s3
2115; GCN-NEXT:    s_lshl_b32 s5, s8, 24
2116; GCN-NEXT:    s_or_b32 s3, s3, s5
2117; GCN-NEXT:    s_lshr_b32 s5, s4, 2
2118; GCN-NEXT:    s_cmp_eq_u32 s5, 1
2119; GCN-NEXT:    s_cselect_b32 s0, s1, s0
2120; GCN-NEXT:    s_cmp_eq_u32 s5, 2
2121; GCN-NEXT:    s_cselect_b32 s0, s2, s0
2122; GCN-NEXT:    s_cmp_eq_u32 s5, 3
2123; GCN-NEXT:    s_cselect_b32 s0, s3, s0
2124; GCN-NEXT:    s_and_b32 s1, s4, 3
2125; GCN-NEXT:    s_lshl_b32 s1, s1, 3
2126; GCN-NEXT:    s_lshr_b32 s0, s0, s1
2127; GCN-NEXT:    ; return to shader part epilog
2128;
2129; GFX10-LABEL: extractelement_sgpr_v16i8_sgpr_idx:
2130; GFX10:       ; %bb.0:
2131; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2132; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2133; GFX10-NEXT:    s_bfe_u32 s10, s0, 0x80008
2134; GFX10-NEXT:    s_bfe_u32 s12, s1, 0x80008
2135; GFX10-NEXT:    s_lshr_b32 s6, s1, 24
2136; GFX10-NEXT:    s_and_b32 s9, s0, 0xff
2137; GFX10-NEXT:    s_and_b32 s11, s1, 0xff
2138; GFX10-NEXT:    s_bfe_u32 s1, s1, 0x80010
2139; GFX10-NEXT:    s_lshl_b32 s10, s10, 8
2140; GFX10-NEXT:    s_lshl_b32 s12, s12, 8
2141; GFX10-NEXT:    s_lshr_b32 s5, s0, 24
2142; GFX10-NEXT:    s_bfe_u32 s0, s0, 0x80010
2143; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
2144; GFX10-NEXT:    s_or_b32 s9, s9, s10
2145; GFX10-NEXT:    s_or_b32 s10, s11, s12
2146; GFX10-NEXT:    s_bfe_u32 s14, s2, 0x80008
2147; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
2148; GFX10-NEXT:    s_lshl_b32 s6, s6, 24
2149; GFX10-NEXT:    s_or_b32 s1, s10, s1
2150; GFX10-NEXT:    s_lshr_b32 s7, s2, 24
2151; GFX10-NEXT:    s_and_b32 s13, s2, 0xff
2152; GFX10-NEXT:    s_bfe_u32 s2, s2, 0x80010
2153; GFX10-NEXT:    s_lshl_b32 s5, s5, 24
2154; GFX10-NEXT:    s_lshl_b32 s14, s14, 8
2155; GFX10-NEXT:    s_or_b32 s0, s9, s0
2156; GFX10-NEXT:    s_or_b32 s1, s1, s6
2157; GFX10-NEXT:    s_bfe_u32 s6, s3, 0x80008
2158; GFX10-NEXT:    s_lshr_b32 s8, s3, 24
2159; GFX10-NEXT:    s_lshl_b32 s2, s2, 16
2160; GFX10-NEXT:    s_or_b32 s11, s13, s14
2161; GFX10-NEXT:    s_or_b32 s0, s0, s5
2162; GFX10-NEXT:    s_lshl_b32 s5, s7, 24
2163; GFX10-NEXT:    s_and_b32 s7, s3, 0xff
2164; GFX10-NEXT:    s_lshl_b32 s6, s6, 8
2165; GFX10-NEXT:    s_bfe_u32 s3, s3, 0x80010
2166; GFX10-NEXT:    s_or_b32 s2, s11, s2
2167; GFX10-NEXT:    s_or_b32 s6, s7, s6
2168; GFX10-NEXT:    s_lshl_b32 s3, s3, 16
2169; GFX10-NEXT:    s_or_b32 s2, s2, s5
2170; GFX10-NEXT:    s_or_b32 s3, s6, s3
2171; GFX10-NEXT:    s_lshl_b32 s5, s8, 24
2172; GFX10-NEXT:    s_lshr_b32 s6, s4, 2
2173; GFX10-NEXT:    s_or_b32 s3, s3, s5
2174; GFX10-NEXT:    s_cmp_eq_u32 s6, 1
2175; GFX10-NEXT:    s_cselect_b32 s0, s1, s0
2176; GFX10-NEXT:    s_cmp_eq_u32 s6, 2
2177; GFX10-NEXT:    s_cselect_b32 s0, s2, s0
2178; GFX10-NEXT:    s_cmp_eq_u32 s6, 3
2179; GFX10-NEXT:    s_cselect_b32 s0, s3, s0
2180; GFX10-NEXT:    s_and_b32 s1, s4, 3
2181; GFX10-NEXT:    s_lshl_b32 s1, s1, 3
2182; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
2183; GFX10-NEXT:    ; return to shader part epilog
2184  %vector = load <16 x i8>, <16 x i8> addrspace(4)* %ptr
2185  %element = extractelement <16 x i8> %vector, i32 %idx
2186  ret i8 %element
2187}
2188
2189define amdgpu_ps i8 @extractelement_vgpr_v16i8_sgpr_idx(<16 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
2190; GFX9-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
2191; GFX9:       ; %bb.0:
2192; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2193; GFX9-NEXT:    s_mov_b32 s0, 8
2194; GFX9-NEXT:    s_mov_b32 s1, 16
2195; GFX9-NEXT:    s_movk_i32 s3, 0xff
2196; GFX9-NEXT:    v_mov_b32_e32 v5, 8
2197; GFX9-NEXT:    v_mov_b32_e32 v4, 0xff
2198; GFX9-NEXT:    v_mov_b32_e32 v6, 16
2199; GFX9-NEXT:    s_lshr_b32 s4, s2, 2
2200; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s4, 1
2201; GFX9-NEXT:    s_and_b32 s2, s2, 3
2202; GFX9-NEXT:    s_waitcnt vmcnt(0)
2203; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 24, v0
2204; GFX9-NEXT:    v_lshrrev_b32_e32 v8, 24, v1
2205; GFX9-NEXT:    v_lshlrev_b32_sdwa v11, s0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2206; GFX9-NEXT:    v_lshlrev_b32_sdwa v13, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2207; GFX9-NEXT:    v_lshrrev_b32_e32 v9, 24, v2
2208; GFX9-NEXT:    v_lshlrev_b32_sdwa v12, s1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2209; GFX9-NEXT:    v_lshlrev_b32_sdwa v14, s1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2210; GFX9-NEXT:    v_lshlrev_b32_sdwa v15, v5, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2211; GFX9-NEXT:    v_and_or_b32 v0, v0, s3, v11
2212; GFX9-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
2213; GFX9-NEXT:    v_and_or_b32 v1, v1, s3, v13
2214; GFX9-NEXT:    v_lshlrev_b32_e32 v8, 24, v8
2215; GFX9-NEXT:    v_lshrrev_b32_e32 v10, 24, v3
2216; GFX9-NEXT:    v_lshlrev_b32_sdwa v16, v6, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2217; GFX9-NEXT:    v_lshlrev_b32_sdwa v5, v5, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2218; GFX9-NEXT:    v_and_or_b32 v2, v2, v4, v15
2219; GFX9-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
2220; GFX9-NEXT:    v_or3_b32 v0, v0, v12, v7
2221; GFX9-NEXT:    v_or3_b32 v1, v1, v14, v8
2222; GFX9-NEXT:    v_lshlrev_b32_sdwa v6, v6, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2223; GFX9-NEXT:    v_and_or_b32 v3, v3, v4, v5
2224; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 24, v10
2225; GFX9-NEXT:    v_or3_b32 v2, v2, v16, v9
2226; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
2227; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s4, 2
2228; GFX9-NEXT:    v_or3_b32 v3, v3, v6, v4
2229; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
2230; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s4, 3
2231; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2232; GFX9-NEXT:    s_lshl_b32 s0, s2, 3
2233; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
2234; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
2235; GFX9-NEXT:    ; return to shader part epilog
2236;
2237; GFX8-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
2238; GFX8:       ; %bb.0:
2239; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2240; GFX8-NEXT:    v_mov_b32_e32 v4, 8
2241; GFX8-NEXT:    v_mov_b32_e32 v5, 16
2242; GFX8-NEXT:    v_mov_b32_e32 v6, 8
2243; GFX8-NEXT:    v_mov_b32_e32 v7, 16
2244; GFX8-NEXT:    s_lshr_b32 s0, s2, 2
2245; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
2246; GFX8-NEXT:    s_and_b32 s1, s2, 3
2247; GFX8-NEXT:    s_waitcnt vmcnt(0)
2248; GFX8-NEXT:    v_lshlrev_b32_sdwa v12, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2249; GFX8-NEXT:    v_lshlrev_b32_sdwa v4, v4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2250; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 24, v0
2251; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 24, v1
2252; GFX8-NEXT:    v_lshlrev_b32_sdwa v13, v5, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2253; GFX8-NEXT:    v_lshlrev_b32_sdwa v5, v5, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2254; GFX8-NEXT:    v_lshlrev_b32_sdwa v14, v6, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2255; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2256; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2257; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 24, v2
2258; GFX8-NEXT:    v_lshlrev_b32_sdwa v15, v7, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2259; GFX8-NEXT:    v_lshlrev_b32_sdwa v6, v6, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2260; GFX8-NEXT:    v_lshlrev_b32_e32 v8, 24, v8
2261; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 24, v9
2262; GFX8-NEXT:    v_or_b32_sdwa v2, v2, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2263; GFX8-NEXT:    v_or_b32_e32 v0, v0, v13
2264; GFX8-NEXT:    v_or_b32_e32 v1, v1, v5
2265; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 24, v3
2266; GFX8-NEXT:    v_lshlrev_b32_sdwa v7, v7, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2267; GFX8-NEXT:    v_lshlrev_b32_e32 v9, 24, v10
2268; GFX8-NEXT:    v_or_b32_sdwa v3, v3, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2269; GFX8-NEXT:    v_or_b32_e32 v2, v2, v15
2270; GFX8-NEXT:    v_or_b32_e32 v0, v0, v8
2271; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
2272; GFX8-NEXT:    v_lshlrev_b32_e32 v6, 24, v11
2273; GFX8-NEXT:    v_or_b32_e32 v3, v3, v7
2274; GFX8-NEXT:    v_or_b32_e32 v2, v2, v9
2275; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
2276; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
2277; GFX8-NEXT:    v_or_b32_e32 v3, v3, v6
2278; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
2279; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
2280; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2281; GFX8-NEXT:    s_lshl_b32 s0, s1, 3
2282; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
2283; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
2284; GFX8-NEXT:    ; return to shader part epilog
2285;
2286; GFX7-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
2287; GFX7:       ; %bb.0:
2288; GFX7-NEXT:    s_mov_b32 s6, 0
2289; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2290; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2291; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2292; GFX7-NEXT:    s_lshr_b32 s0, s2, 2
2293; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
2294; GFX7-NEXT:    s_and_b32 s1, s2, 3
2295; GFX7-NEXT:    s_waitcnt vmcnt(0)
2296; GFX7-NEXT:    v_bfe_u32 v9, v0, 8, 8
2297; GFX7-NEXT:    v_bfe_u32 v11, v1, 8, 8
2298; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
2299; GFX7-NEXT:    v_lshrrev_b32_e32 v5, 24, v1
2300; GFX7-NEXT:    v_and_b32_e32 v8, 0xff, v0
2301; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
2302; GFX7-NEXT:    v_and_b32_e32 v10, 0xff, v1
2303; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
2304; GFX7-NEXT:    v_bfe_u32 v13, v2, 8, 8
2305; GFX7-NEXT:    v_lshlrev_b32_e32 v9, 8, v9
2306; GFX7-NEXT:    v_lshlrev_b32_e32 v11, 8, v11
2307; GFX7-NEXT:    v_lshrrev_b32_e32 v6, 24, v2
2308; GFX7-NEXT:    v_and_b32_e32 v12, 0xff, v2
2309; GFX7-NEXT:    v_bfe_u32 v2, v2, 16, 8
2310; GFX7-NEXT:    v_bfe_u32 v15, v3, 8, 8
2311; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2312; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2313; GFX7-NEXT:    v_lshlrev_b32_e32 v13, 8, v13
2314; GFX7-NEXT:    v_or_b32_e32 v8, v8, v9
2315; GFX7-NEXT:    v_or_b32_e32 v9, v10, v11
2316; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 24, v3
2317; GFX7-NEXT:    v_and_b32_e32 v14, 0xff, v3
2318; GFX7-NEXT:    v_bfe_u32 v3, v3, 16, 8
2319; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
2320; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 24, v5
2321; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2322; GFX7-NEXT:    v_lshlrev_b32_e32 v15, 8, v15
2323; GFX7-NEXT:    v_or_b32_e32 v10, v12, v13
2324; GFX7-NEXT:    v_or_b32_e32 v0, v8, v0
2325; GFX7-NEXT:    v_or_b32_e32 v1, v9, v1
2326; GFX7-NEXT:    v_lshlrev_b32_e32 v6, 24, v6
2327; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2328; GFX7-NEXT:    v_or_b32_e32 v11, v14, v15
2329; GFX7-NEXT:    v_or_b32_e32 v2, v10, v2
2330; GFX7-NEXT:    v_or_b32_e32 v0, v0, v4
2331; GFX7-NEXT:    v_or_b32_e32 v1, v1, v5
2332; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
2333; GFX7-NEXT:    v_or_b32_e32 v3, v11, v3
2334; GFX7-NEXT:    v_or_b32_e32 v2, v2, v6
2335; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
2336; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
2337; GFX7-NEXT:    v_or_b32_e32 v3, v3, v7
2338; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
2339; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
2340; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2341; GFX7-NEXT:    s_lshl_b32 s0, s1, 3
2342; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
2343; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
2344; GFX7-NEXT:    ; return to shader part epilog
2345;
2346; GFX10-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
2347; GFX10:       ; %bb.0:
2348; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2349; GFX10-NEXT:    s_mov_b32 s0, 8
2350; GFX10-NEXT:    v_mov_b32_e32 v4, 8
2351; GFX10-NEXT:    s_mov_b32 s1, 16
2352; GFX10-NEXT:    v_mov_b32_e32 v5, 16
2353; GFX10-NEXT:    s_waitcnt vmcnt(0)
2354; GFX10-NEXT:    v_lshrrev_b32_e32 v6, 24, v0
2355; GFX10-NEXT:    v_lshrrev_b32_e32 v7, 24, v1
2356; GFX10-NEXT:    v_lshlrev_b32_sdwa v9, s0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2357; GFX10-NEXT:    v_lshlrev_b32_sdwa v11, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2358; GFX10-NEXT:    v_lshrrev_b32_e32 v8, 24, v2
2359; GFX10-NEXT:    v_lshlrev_b32_sdwa v10, s1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2360; GFX10-NEXT:    v_lshlrev_b32_sdwa v12, s1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2361; GFX10-NEXT:    v_lshlrev_b32_sdwa v13, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2362; GFX10-NEXT:    v_and_or_b32 v0, v0, 0xff, v9
2363; GFX10-NEXT:    v_lshlrev_b32_e32 v6, 24, v6
2364; GFX10-NEXT:    v_and_or_b32 v1, v1, 0xff, v11
2365; GFX10-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
2366; GFX10-NEXT:    s_lshr_b32 s0, s2, 2
2367; GFX10-NEXT:    v_lshlrev_b32_sdwa v14, v5, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2368; GFX10-NEXT:    v_and_or_b32 v2, 0xff, v2, v13
2369; GFX10-NEXT:    v_lshlrev_b32_e32 v8, 24, v8
2370; GFX10-NEXT:    v_lshlrev_b32_sdwa v4, v4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2371; GFX10-NEXT:    v_lshrrev_b32_e32 v9, 24, v3
2372; GFX10-NEXT:    v_or3_b32 v0, v0, v10, v6
2373; GFX10-NEXT:    v_or3_b32 v1, v1, v12, v7
2374; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
2375; GFX10-NEXT:    v_or3_b32 v2, v2, v14, v8
2376; GFX10-NEXT:    v_and_or_b32 v4, 0xff, v3, v4
2377; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, v5, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2378; GFX10-NEXT:    v_lshlrev_b32_e32 v5, 24, v9
2379; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
2380; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 2
2381; GFX10-NEXT:    v_or3_b32 v1, v4, v3, v5
2382; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
2383; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 3
2384; GFX10-NEXT:    s_and_b32 s0, s2, 3
2385; GFX10-NEXT:    s_lshl_b32 s0, s0, 3
2386; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
2387; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
2388; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
2389; GFX10-NEXT:    ; return to shader part epilog
2390  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2391  %element = extractelement <16 x i8> %vector, i32 %idx
2392  ret i8 %element
2393}
2394
2395define i8 @extractelement_vgpr_v16i8_vgpr_idx(<16 x i8> addrspace(1)* %ptr, i32 %idx) {
2396; GFX9-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
2397; GFX9:       ; %bb.0:
2398; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2399; GFX9-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
2400; GFX9-NEXT:    s_mov_b32 s4, 8
2401; GFX9-NEXT:    s_mov_b32 s5, 16
2402; GFX9-NEXT:    s_movk_i32 s6, 0xff
2403; GFX9-NEXT:    v_mov_b32_e32 v1, 8
2404; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
2405; GFX9-NEXT:    v_mov_b32_e32 v7, 16
2406; GFX9-NEXT:    v_lshrrev_b32_e32 v8, 2, v2
2407; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v8
2408; GFX9-NEXT:    v_and_b32_e32 v2, 3, v2
2409; GFX9-NEXT:    s_waitcnt vmcnt(0)
2410; GFX9-NEXT:    v_lshrrev_b32_e32 v9, 24, v3
2411; GFX9-NEXT:    v_lshrrev_b32_e32 v10, 24, v4
2412; GFX9-NEXT:    v_lshlrev_b32_sdwa v13, s4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2413; GFX9-NEXT:    v_lshlrev_b32_sdwa v15, s4, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2414; GFX9-NEXT:    v_lshrrev_b32_e32 v11, 24, v5
2415; GFX9-NEXT:    v_lshrrev_b32_e32 v12, 24, v6
2416; GFX9-NEXT:    v_lshlrev_b32_sdwa v14, s5, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2417; GFX9-NEXT:    v_lshlrev_b32_sdwa v16, s5, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2418; GFX9-NEXT:    v_lshlrev_b32_sdwa v17, v1, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2419; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2420; GFX9-NEXT:    v_and_or_b32 v3, v3, s6, v13
2421; GFX9-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
2422; GFX9-NEXT:    v_and_or_b32 v4, v4, s6, v15
2423; GFX9-NEXT:    v_lshlrev_b32_e32 v10, 24, v10
2424; GFX9-NEXT:    v_lshlrev_b32_sdwa v18, v7, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2425; GFX9-NEXT:    v_lshlrev_b32_sdwa v7, v7, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2426; GFX9-NEXT:    v_and_or_b32 v5, v5, v0, v17
2427; GFX9-NEXT:    v_lshlrev_b32_e32 v11, 24, v11
2428; GFX9-NEXT:    v_and_or_b32 v0, v6, v0, v1
2429; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v12
2430; GFX9-NEXT:    v_or3_b32 v3, v3, v14, v9
2431; GFX9-NEXT:    v_or3_b32 v4, v4, v16, v10
2432; GFX9-NEXT:    v_or3_b32 v5, v5, v18, v11
2433; GFX9-NEXT:    v_or3_b32 v0, v0, v7, v1
2434; GFX9-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc
2435; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v8
2436; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc
2437; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v8
2438; GFX9-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
2439; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2440; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2441; GFX9-NEXT:    s_setpc_b64 s[30:31]
2442;
2443; GFX8-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
2444; GFX8:       ; %bb.0:
2445; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2446; GFX8-NEXT:    flat_load_dwordx4 v[3:6], v[0:1]
2447; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2448; GFX8-NEXT:    v_mov_b32_e32 v1, 16
2449; GFX8-NEXT:    v_mov_b32_e32 v7, 8
2450; GFX8-NEXT:    v_mov_b32_e32 v8, 16
2451; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 2, v2
2452; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v9
2453; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
2454; GFX8-NEXT:    s_waitcnt vmcnt(0)
2455; GFX8-NEXT:    v_lshlrev_b32_sdwa v14, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2456; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2457; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 24, v3
2458; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 24, v4
2459; GFX8-NEXT:    v_lshlrev_b32_sdwa v15, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2460; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2461; GFX8-NEXT:    v_lshlrev_b32_sdwa v16, v7, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2462; GFX8-NEXT:    v_or_b32_sdwa v3, v3, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2463; GFX8-NEXT:    v_or_b32_sdwa v0, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2464; GFX8-NEXT:    v_lshrrev_b32_e32 v12, 24, v5
2465; GFX8-NEXT:    v_lshlrev_b32_sdwa v17, v8, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2466; GFX8-NEXT:    v_lshlrev_b32_sdwa v7, v7, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2467; GFX8-NEXT:    v_lshlrev_b32_e32 v10, 24, v10
2468; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 24, v11
2469; GFX8-NEXT:    v_or_b32_sdwa v5, v5, v16 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2470; GFX8-NEXT:    v_or_b32_e32 v3, v3, v15
2471; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2472; GFX8-NEXT:    v_lshrrev_b32_e32 v13, 24, v6
2473; GFX8-NEXT:    v_lshlrev_b32_sdwa v8, v8, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2474; GFX8-NEXT:    v_lshlrev_b32_e32 v11, 24, v12
2475; GFX8-NEXT:    v_or_b32_sdwa v6, v6, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2476; GFX8-NEXT:    v_or_b32_e32 v1, v5, v17
2477; GFX8-NEXT:    v_or_b32_e32 v3, v3, v10
2478; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2479; GFX8-NEXT:    v_lshlrev_b32_e32 v7, 24, v13
2480; GFX8-NEXT:    v_or_b32_e32 v5, v6, v8
2481; GFX8-NEXT:    v_or_b32_e32 v1, v1, v11
2482; GFX8-NEXT:    v_cndmask_b32_e32 v0, v3, v0, vcc
2483; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v9
2484; GFX8-NEXT:    v_or_b32_e32 v4, v5, v7
2485; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
2486; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v9
2487; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
2488; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2489; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2490; GFX8-NEXT:    s_setpc_b64 s[30:31]
2491;
2492; GFX7-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
2493; GFX7:       ; %bb.0:
2494; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2495; GFX7-NEXT:    s_mov_b32 s6, 0
2496; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2497; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2498; GFX7-NEXT:    buffer_load_dwordx4 v[3:6], v[0:1], s[4:7], 0 addr64
2499; GFX7-NEXT:    v_lshrrev_b32_e32 v17, 2, v2
2500; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v17
2501; GFX7-NEXT:    v_and_b32_e32 v2, 3, v2
2502; GFX7-NEXT:    s_waitcnt vmcnt(0)
2503; GFX7-NEXT:    v_bfe_u32 v10, v3, 8, 8
2504; GFX7-NEXT:    v_bfe_u32 v12, v4, 8, 8
2505; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v3
2506; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v4
2507; GFX7-NEXT:    v_and_b32_e32 v9, 0xff, v3
2508; GFX7-NEXT:    v_bfe_u32 v3, v3, 16, 8
2509; GFX7-NEXT:    v_and_b32_e32 v11, 0xff, v4
2510; GFX7-NEXT:    v_bfe_u32 v4, v4, 16, 8
2511; GFX7-NEXT:    v_bfe_u32 v14, v5, 8, 8
2512; GFX7-NEXT:    v_lshlrev_b32_e32 v10, 8, v10
2513; GFX7-NEXT:    v_lshlrev_b32_e32 v12, 8, v12
2514; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 24, v5
2515; GFX7-NEXT:    v_and_b32_e32 v13, 0xff, v5
2516; GFX7-NEXT:    v_bfe_u32 v5, v5, 16, 8
2517; GFX7-NEXT:    v_bfe_u32 v16, v6, 8, 8
2518; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2519; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
2520; GFX7-NEXT:    v_lshlrev_b32_e32 v14, 8, v14
2521; GFX7-NEXT:    v_or_b32_e32 v9, v9, v10
2522; GFX7-NEXT:    v_or_b32_e32 v10, v11, v12
2523; GFX7-NEXT:    v_lshrrev_b32_e32 v8, 24, v6
2524; GFX7-NEXT:    v_and_b32_e32 v15, 0xff, v6
2525; GFX7-NEXT:    v_bfe_u32 v6, v6, 16, 8
2526; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
2527; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
2528; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 16, v5
2529; GFX7-NEXT:    v_lshlrev_b32_e32 v16, 8, v16
2530; GFX7-NEXT:    v_or_b32_e32 v11, v13, v14
2531; GFX7-NEXT:    v_or_b32_e32 v3, v9, v3
2532; GFX7-NEXT:    v_or_b32_e32 v4, v10, v4
2533; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
2534; GFX7-NEXT:    v_lshlrev_b32_e32 v6, 16, v6
2535; GFX7-NEXT:    v_or_b32_e32 v12, v15, v16
2536; GFX7-NEXT:    v_or_b32_e32 v5, v11, v5
2537; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
2538; GFX7-NEXT:    v_or_b32_e32 v1, v4, v1
2539; GFX7-NEXT:    v_lshlrev_b32_e32 v8, 24, v8
2540; GFX7-NEXT:    v_or_b32_e32 v6, v12, v6
2541; GFX7-NEXT:    v_or_b32_e32 v3, v5, v7
2542; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
2543; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v17
2544; GFX7-NEXT:    v_or_b32_e32 v4, v6, v8
2545; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2546; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v17
2547; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc
2548; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2549; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2550; GFX7-NEXT:    s_setpc_b64 s[30:31]
2551;
2552; GFX10-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
2553; GFX10:       ; %bb.0:
2554; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2555; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2556; GFX10-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
2557; GFX10-NEXT:    s_mov_b32 s4, 8
2558; GFX10-NEXT:    v_mov_b32_e32 v0, 8
2559; GFX10-NEXT:    s_mov_b32 s5, 16
2560; GFX10-NEXT:    v_mov_b32_e32 v1, 16
2561; GFX10-NEXT:    v_lshrrev_b32_e32 v7, 2, v2
2562; GFX10-NEXT:    v_and_b32_e32 v2, 3, v2
2563; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v7
2564; GFX10-NEXT:    s_waitcnt vmcnt(0)
2565; GFX10-NEXT:    v_lshrrev_b32_e32 v8, 24, v3
2566; GFX10-NEXT:    v_lshrrev_b32_e32 v9, 24, v4
2567; GFX10-NEXT:    v_lshlrev_b32_sdwa v12, s4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2568; GFX10-NEXT:    v_lshlrev_b32_sdwa v14, s4, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2569; GFX10-NEXT:    v_lshrrev_b32_e32 v10, 24, v5
2570; GFX10-NEXT:    v_lshlrev_b32_sdwa v13, s5, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2571; GFX10-NEXT:    v_lshlrev_b32_sdwa v15, s5, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2572; GFX10-NEXT:    v_lshlrev_b32_sdwa v16, v0, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2573; GFX10-NEXT:    v_and_or_b32 v3, v3, 0xff, v12
2574; GFX10-NEXT:    v_lshlrev_b32_e32 v8, 24, v8
2575; GFX10-NEXT:    v_and_or_b32 v4, v4, 0xff, v14
2576; GFX10-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
2577; GFX10-NEXT:    v_lshrrev_b32_e32 v11, 24, v6
2578; GFX10-NEXT:    v_lshlrev_b32_sdwa v17, v1, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2579; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2580; GFX10-NEXT:    v_and_or_b32 v5, 0xff, v5, v16
2581; GFX10-NEXT:    v_lshlrev_b32_e32 v10, 24, v10
2582; GFX10-NEXT:    v_or3_b32 v3, v3, v13, v8
2583; GFX10-NEXT:    v_or3_b32 v4, v4, v15, v9
2584; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2585; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v6, v0
2586; GFX10-NEXT:    v_lshlrev_b32_e32 v6, 24, v11
2587; GFX10-NEXT:    v_or3_b32 v5, v5, v17, v10
2588; GFX10-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc_lo
2589; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v7
2590; GFX10-NEXT:    v_or3_b32 v0, v0, v1, v6
2591; GFX10-NEXT:    v_cndmask_b32_e32 v1, v3, v5, vcc_lo
2592; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v7
2593; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo
2594; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2595; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2596; GFX10-NEXT:    s_setpc_b64 s[30:31]
2597  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2598  %element = extractelement <16 x i8> %vector, i32 %idx
2599  ret i8 %element
2600}
2601
2602define amdgpu_ps i8 @extractelement_sgpr_v16i8_vgpr_idx(<16 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
2603; GCN-LABEL: extractelement_sgpr_v16i8_vgpr_idx:
2604; GCN:       ; %bb.0:
2605; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2606; GCN-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
2607; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
2608; GCN-NEXT:    v_and_b32_e32 v0, 3, v0
2609; GCN-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2610; GCN-NEXT:    s_waitcnt lgkmcnt(0)
2611; GCN-NEXT:    s_bfe_u32 s9, s0, 0x80008
2612; GCN-NEXT:    s_lshr_b32 s4, s0, 24
2613; GCN-NEXT:    s_and_b32 s8, s0, 0xff
2614; GCN-NEXT:    s_lshl_b32 s9, s9, 8
2615; GCN-NEXT:    s_bfe_u32 s0, s0, 0x80010
2616; GCN-NEXT:    s_or_b32 s8, s8, s9
2617; GCN-NEXT:    s_lshl_b32 s0, s0, 16
2618; GCN-NEXT:    s_or_b32 s0, s8, s0
2619; GCN-NEXT:    s_lshl_b32 s4, s4, 24
2620; GCN-NEXT:    s_bfe_u32 s8, s1, 0x80008
2621; GCN-NEXT:    s_lshr_b32 s5, s1, 24
2622; GCN-NEXT:    s_or_b32 s0, s0, s4
2623; GCN-NEXT:    s_and_b32 s4, s1, 0xff
2624; GCN-NEXT:    s_lshl_b32 s8, s8, 8
2625; GCN-NEXT:    s_bfe_u32 s1, s1, 0x80010
2626; GCN-NEXT:    s_or_b32 s4, s4, s8
2627; GCN-NEXT:    s_lshl_b32 s1, s1, 16
2628; GCN-NEXT:    s_or_b32 s1, s4, s1
2629; GCN-NEXT:    s_lshl_b32 s4, s5, 24
2630; GCN-NEXT:    s_bfe_u32 s5, s2, 0x80008
2631; GCN-NEXT:    s_lshr_b32 s6, s2, 24
2632; GCN-NEXT:    s_or_b32 s1, s1, s4
2633; GCN-NEXT:    s_and_b32 s4, s2, 0xff
2634; GCN-NEXT:    s_lshl_b32 s5, s5, 8
2635; GCN-NEXT:    s_bfe_u32 s2, s2, 0x80010
2636; GCN-NEXT:    s_or_b32 s4, s4, s5
2637; GCN-NEXT:    s_lshl_b32 s2, s2, 16
2638; GCN-NEXT:    s_or_b32 s2, s4, s2
2639; GCN-NEXT:    s_lshl_b32 s4, s6, 24
2640; GCN-NEXT:    s_bfe_u32 s5, s3, 0x80008
2641; GCN-NEXT:    s_lshr_b32 s7, s3, 24
2642; GCN-NEXT:    s_or_b32 s2, s2, s4
2643; GCN-NEXT:    s_and_b32 s4, s3, 0xff
2644; GCN-NEXT:    s_lshl_b32 s5, s5, 8
2645; GCN-NEXT:    s_bfe_u32 s3, s3, 0x80010
2646; GCN-NEXT:    s_or_b32 s4, s4, s5
2647; GCN-NEXT:    s_lshl_b32 s3, s3, 16
2648; GCN-NEXT:    s_or_b32 s3, s4, s3
2649; GCN-NEXT:    s_lshl_b32 s4, s7, 24
2650; GCN-NEXT:    v_mov_b32_e32 v2, s0
2651; GCN-NEXT:    v_mov_b32_e32 v3, s1
2652; GCN-NEXT:    s_or_b32 s3, s3, s4
2653; GCN-NEXT:    v_mov_b32_e32 v4, s2
2654; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
2655; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v1
2656; GCN-NEXT:    v_mov_b32_e32 v5, s3
2657; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2658; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v1
2659; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v5, vcc
2660; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
2661; GCN-NEXT:    v_readfirstlane_b32 s0, v0
2662; GCN-NEXT:    ; return to shader part epilog
2663;
2664; GFX10-LABEL: extractelement_sgpr_v16i8_vgpr_idx:
2665; GFX10:       ; %bb.0:
2666; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2667; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
2668; GFX10-NEXT:    v_and_b32_e32 v0, 3, v0
2669; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
2670; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2671; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2672; GFX10-NEXT:    s_bfe_u32 s9, s0, 0x80008
2673; GFX10-NEXT:    s_bfe_u32 s11, s1, 0x80008
2674; GFX10-NEXT:    s_lshr_b32 s5, s1, 24
2675; GFX10-NEXT:    s_and_b32 s8, s0, 0xff
2676; GFX10-NEXT:    s_and_b32 s10, s1, 0xff
2677; GFX10-NEXT:    s_bfe_u32 s1, s1, 0x80010
2678; GFX10-NEXT:    s_lshl_b32 s9, s9, 8
2679; GFX10-NEXT:    s_lshl_b32 s11, s11, 8
2680; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
2681; GFX10-NEXT:    s_or_b32 s8, s8, s9
2682; GFX10-NEXT:    s_or_b32 s9, s10, s11
2683; GFX10-NEXT:    s_lshl_b32 s5, s5, 24
2684; GFX10-NEXT:    s_or_b32 s1, s9, s1
2685; GFX10-NEXT:    s_lshr_b32 s4, s0, 24
2686; GFX10-NEXT:    s_bfe_u32 s0, s0, 0x80010
2687; GFX10-NEXT:    s_or_b32 s1, s1, s5
2688; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
2689; GFX10-NEXT:    s_bfe_u32 s13, s2, 0x80008
2690; GFX10-NEXT:    v_mov_b32_e32 v2, s1
2691; GFX10-NEXT:    s_lshl_b32 s4, s4, 24
2692; GFX10-NEXT:    s_or_b32 s0, s8, s0
2693; GFX10-NEXT:    s_lshr_b32 s6, s2, 24
2694; GFX10-NEXT:    s_and_b32 s12, s2, 0xff
2695; GFX10-NEXT:    s_bfe_u32 s2, s2, 0x80010
2696; GFX10-NEXT:    s_lshl_b32 s13, s13, 8
2697; GFX10-NEXT:    s_or_b32 s0, s0, s4
2698; GFX10-NEXT:    s_lshl_b32 s2, s2, 16
2699; GFX10-NEXT:    s_or_b32 s10, s12, s13
2700; GFX10-NEXT:    s_bfe_u32 s5, s3, 0x80008
2701; GFX10-NEXT:    v_cndmask_b32_e32 v2, s0, v2, vcc_lo
2702; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v1
2703; GFX10-NEXT:    s_or_b32 s2, s10, s2
2704; GFX10-NEXT:    s_lshl_b32 s4, s6, 24
2705; GFX10-NEXT:    s_and_b32 s6, s3, 0xff
2706; GFX10-NEXT:    s_lshl_b32 s5, s5, 8
2707; GFX10-NEXT:    s_bfe_u32 s1, s3, 0x80010
2708; GFX10-NEXT:    s_or_b32 s2, s2, s4
2709; GFX10-NEXT:    s_lshr_b32 s7, s3, 24
2710; GFX10-NEXT:    s_or_b32 s3, s6, s5
2711; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
2712; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s2, vcc_lo
2713; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v1
2714; GFX10-NEXT:    s_or_b32 s0, s3, s1
2715; GFX10-NEXT:    s_lshl_b32 s1, s7, 24
2716; GFX10-NEXT:    s_or_b32 s3, s0, s1
2717; GFX10-NEXT:    v_cndmask_b32_e64 v1, v2, s3, vcc_lo
2718; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
2719; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
2720; GFX10-NEXT:    ; return to shader part epilog
2721  %vector = load <16 x i8>, <16 x i8> addrspace(4)* %ptr
2722  %element = extractelement <16 x i8> %vector, i32 %idx
2723  ret i8 %element
2724}
2725
2726define i8 @extractelement_vgpr_v16i8_idx0(<16 x i8> addrspace(1)* %ptr) {
2727; GFX9-LABEL: extractelement_vgpr_v16i8_idx0:
2728; GFX9:       ; %bb.0:
2729; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2730; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2731; GFX9-NEXT:    s_waitcnt vmcnt(0)
2732; GFX9-NEXT:    v_mov_b32_e32 v2, 8
2733; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
2734; GFX9-NEXT:    v_mov_b32_e32 v3, 16
2735; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
2736; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2737; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2738; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
2739; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
2740; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
2741; GFX9-NEXT:    s_setpc_b64 s[30:31]
2742;
2743; GFX8-LABEL: extractelement_vgpr_v16i8_idx0:
2744; GFX8:       ; %bb.0:
2745; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2746; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2747; GFX8-NEXT:    s_waitcnt vmcnt(0)
2748; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2749; GFX8-NEXT:    v_mov_b32_e32 v2, 16
2750; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2751; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2752; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2753; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2754; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
2755; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2756; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2757; GFX8-NEXT:    s_setpc_b64 s[30:31]
2758;
2759; GFX7-LABEL: extractelement_vgpr_v16i8_idx0:
2760; GFX7:       ; %bb.0:
2761; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2762; GFX7-NEXT:    s_mov_b32 s6, 0
2763; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2764; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2765; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2766; GFX7-NEXT:    s_waitcnt vmcnt(0)
2767; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
2768; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
2769; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
2770; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
2771; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
2772; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2773; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
2774; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
2775; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
2776; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2777; GFX7-NEXT:    s_setpc_b64 s[30:31]
2778;
2779; GFX10-LABEL: extractelement_vgpr_v16i8_idx0:
2780; GFX10:       ; %bb.0:
2781; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2782; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2783; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2784; GFX10-NEXT:    s_waitcnt vmcnt(0)
2785; GFX10-NEXT:    v_mov_b32_e32 v1, 8
2786; GFX10-NEXT:    v_mov_b32_e32 v2, 16
2787; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2788; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2789; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2790; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
2791; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2792; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
2793; GFX10-NEXT:    s_setpc_b64 s[30:31]
2794  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2795  %element = extractelement <16 x i8> %vector, i32 0
2796  ret i8 %element
2797}
2798
2799define i8 @extractelement_vgpr_v16i8_idx1(<16 x i8> addrspace(1)* %ptr) {
2800; GFX9-LABEL: extractelement_vgpr_v16i8_idx1:
2801; GFX9:       ; %bb.0:
2802; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2803; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2804; GFX9-NEXT:    s_mov_b32 s4, 8
2805; GFX9-NEXT:    s_waitcnt vmcnt(0)
2806; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
2807; GFX9-NEXT:    v_mov_b32_e32 v2, 16
2808; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2809; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2810; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2811; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v4
2812; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2813; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
2814; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2815; GFX9-NEXT:    s_setpc_b64 s[30:31]
2816;
2817; GFX8-LABEL: extractelement_vgpr_v16i8_idx1:
2818; GFX8:       ; %bb.0:
2819; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2820; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2821; GFX8-NEXT:    s_waitcnt vmcnt(0)
2822; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2823; GFX8-NEXT:    v_mov_b32_e32 v2, 16
2824; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2825; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2826; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2827; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2828; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
2829; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2830; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2831; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2832; GFX8-NEXT:    s_setpc_b64 s[30:31]
2833;
2834; GFX7-LABEL: extractelement_vgpr_v16i8_idx1:
2835; GFX7:       ; %bb.0:
2836; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2837; GFX7-NEXT:    s_mov_b32 s6, 0
2838; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2839; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2840; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2841; GFX7-NEXT:    s_waitcnt vmcnt(0)
2842; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
2843; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
2844; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
2845; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
2846; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
2847; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2848; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
2849; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
2850; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
2851; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2852; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2853; GFX7-NEXT:    s_setpc_b64 s[30:31]
2854;
2855; GFX10-LABEL: extractelement_vgpr_v16i8_idx1:
2856; GFX10:       ; %bb.0:
2857; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2858; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2859; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2860; GFX10-NEXT:    s_mov_b32 s4, 8
2861; GFX10-NEXT:    s_waitcnt vmcnt(0)
2862; GFX10-NEXT:    v_mov_b32_e32 v1, 16
2863; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2864; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2865; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2866; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v2
2867; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
2868; GFX10-NEXT:    v_or3_b32 v0, v0, v1, v2
2869; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2870; GFX10-NEXT:    s_setpc_b64 s[30:31]
2871  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2872  %element = extractelement <16 x i8> %vector, i32 1
2873  ret i8 %element
2874}
2875
2876define i8 @extractelement_vgpr_v16i8_idx2(<16 x i8> addrspace(1)* %ptr) {
2877; GFX9-LABEL: extractelement_vgpr_v16i8_idx2:
2878; GFX9:       ; %bb.0:
2879; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2880; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2881; GFX9-NEXT:    s_waitcnt vmcnt(0)
2882; GFX9-NEXT:    v_mov_b32_e32 v2, 8
2883; GFX9-NEXT:    s_mov_b32 s4, 16
2884; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
2885; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2886; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2887; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2888; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
2889; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2890; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v1
2891; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2892; GFX9-NEXT:    s_setpc_b64 s[30:31]
2893;
2894; GFX8-LABEL: extractelement_vgpr_v16i8_idx2:
2895; GFX8:       ; %bb.0:
2896; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2897; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2898; GFX8-NEXT:    s_waitcnt vmcnt(0)
2899; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2900; GFX8-NEXT:    v_mov_b32_e32 v2, 16
2901; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2902; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2903; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2904; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2905; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
2906; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2907; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2908; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2909; GFX8-NEXT:    s_setpc_b64 s[30:31]
2910;
2911; GFX7-LABEL: extractelement_vgpr_v16i8_idx2:
2912; GFX7:       ; %bb.0:
2913; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2914; GFX7-NEXT:    s_mov_b32 s6, 0
2915; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2916; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2917; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2918; GFX7-NEXT:    s_waitcnt vmcnt(0)
2919; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
2920; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
2921; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
2922; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
2923; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
2924; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2925; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
2926; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
2927; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
2928; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2929; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2930; GFX7-NEXT:    s_setpc_b64 s[30:31]
2931;
2932; GFX10-LABEL: extractelement_vgpr_v16i8_idx2:
2933; GFX10:       ; %bb.0:
2934; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2935; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2936; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2937; GFX10-NEXT:    s_waitcnt vmcnt(0)
2938; GFX10-NEXT:    v_mov_b32_e32 v1, 8
2939; GFX10-NEXT:    s_mov_b32 s4, 16
2940; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2941; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
2942; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2943; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
2944; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2945; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
2946; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2947; GFX10-NEXT:    s_setpc_b64 s[30:31]
2948  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2949  %element = extractelement <16 x i8> %vector, i32 2
2950  ret i8 %element
2951}
2952
2953define i8 @extractelement_vgpr_v16i8_idx3(<16 x i8> addrspace(1)* %ptr) {
2954; GFX9-LABEL: extractelement_vgpr_v16i8_idx3:
2955; GFX9:       ; %bb.0:
2956; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2957; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2958; GFX9-NEXT:    s_waitcnt vmcnt(0)
2959; GFX9-NEXT:    v_mov_b32_e32 v2, 8
2960; GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
2961; GFX9-NEXT:    v_mov_b32_e32 v3, 16
2962; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
2963; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2964; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2965; GFX9-NEXT:    v_and_or_b32 v0, v0, v1, v2
2966; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
2967; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
2968; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2969; GFX9-NEXT:    s_setpc_b64 s[30:31]
2970;
2971; GFX8-LABEL: extractelement_vgpr_v16i8_idx3:
2972; GFX8:       ; %bb.0:
2973; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2974; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2975; GFX8-NEXT:    s_waitcnt vmcnt(0)
2976; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2977; GFX8-NEXT:    v_mov_b32_e32 v2, 16
2978; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
2979; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2980; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
2981; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2982; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
2983; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2984; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2985; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2986; GFX8-NEXT:    s_setpc_b64 s[30:31]
2987;
2988; GFX7-LABEL: extractelement_vgpr_v16i8_idx3:
2989; GFX7:       ; %bb.0:
2990; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2991; GFX7-NEXT:    s_mov_b32 s6, 0
2992; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2993; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2994; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2995; GFX7-NEXT:    s_waitcnt vmcnt(0)
2996; GFX7-NEXT:    v_bfe_u32 v3, v0, 8, 8
2997; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v0
2998; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v0
2999; GFX7-NEXT:    v_bfe_u32 v0, v0, 16, 8
3000; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3001; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
3002; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
3003; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
3004; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3005; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3006; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3007; GFX7-NEXT:    s_setpc_b64 s[30:31]
3008;
3009; GFX10-LABEL: extractelement_vgpr_v16i8_idx3:
3010; GFX10:       ; %bb.0:
3011; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3012; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3013; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3014; GFX10-NEXT:    s_waitcnt vmcnt(0)
3015; GFX10-NEXT:    v_mov_b32_e32 v1, 8
3016; GFX10-NEXT:    v_mov_b32_e32 v2, 16
3017; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3018; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
3019; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3020; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v0, v1
3021; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3022; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
3023; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3024; GFX10-NEXT:    s_setpc_b64 s[30:31]
3025  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3026  %element = extractelement <16 x i8> %vector, i32 3
3027  ret i8 %element
3028}
3029
3030define i8 @extractelement_vgpr_v16i8_idx4(<16 x i8> addrspace(1)* %ptr) {
3031; GFX9-LABEL: extractelement_vgpr_v16i8_idx4:
3032; GFX9:       ; %bb.0:
3033; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3034; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3035; GFX9-NEXT:    s_waitcnt vmcnt(0)
3036; GFX9-NEXT:    v_mov_b32_e32 v2, 8
3037; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3038; GFX9-NEXT:    v_mov_b32_e32 v3, 16
3039; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
3040; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3041; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3042; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v2
3043; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3044; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3045; GFX9-NEXT:    s_setpc_b64 s[30:31]
3046;
3047; GFX8-LABEL: extractelement_vgpr_v16i8_idx4:
3048; GFX8:       ; %bb.0:
3049; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3050; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3051; GFX8-NEXT:    s_waitcnt vmcnt(0)
3052; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3053; GFX8-NEXT:    v_mov_b32_e32 v2, 16
3054; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3055; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3056; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3057; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3058; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3059; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3060; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3061; GFX8-NEXT:    s_setpc_b64 s[30:31]
3062;
3063; GFX7-LABEL: extractelement_vgpr_v16i8_idx4:
3064; GFX7:       ; %bb.0:
3065; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3066; GFX7-NEXT:    s_mov_b32 s6, 0
3067; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3068; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3069; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3070; GFX7-NEXT:    s_waitcnt vmcnt(0)
3071; GFX7-NEXT:    v_bfe_u32 v3, v1, 8, 8
3072; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v1
3073; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v1
3074; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
3075; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3076; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3077; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
3078; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
3079; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3080; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3081; GFX7-NEXT:    s_setpc_b64 s[30:31]
3082;
3083; GFX10-LABEL: extractelement_vgpr_v16i8_idx4:
3084; GFX10:       ; %bb.0:
3085; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3086; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3087; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3088; GFX10-NEXT:    s_waitcnt vmcnt(0)
3089; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3090; GFX10-NEXT:    v_mov_b32_e32 v2, 16
3091; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3092; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3093; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3094; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v1, v0
3095; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3096; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
3097; GFX10-NEXT:    s_setpc_b64 s[30:31]
3098  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3099  %element = extractelement <16 x i8> %vector, i32 4
3100  ret i8 %element
3101}
3102
3103define i8 @extractelement_vgpr_v16i8_idx5(<16 x i8> addrspace(1)* %ptr) {
3104; GFX9-LABEL: extractelement_vgpr_v16i8_idx5:
3105; GFX9:       ; %bb.0:
3106; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3107; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3108; GFX9-NEXT:    s_mov_b32 s4, 8
3109; GFX9-NEXT:    s_waitcnt vmcnt(0)
3110; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3111; GFX9-NEXT:    v_mov_b32_e32 v2, 16
3112; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3113; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3114; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3115; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v4
3116; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3117; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
3118; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3119; GFX9-NEXT:    s_setpc_b64 s[30:31]
3120;
3121; GFX8-LABEL: extractelement_vgpr_v16i8_idx5:
3122; GFX8:       ; %bb.0:
3123; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3124; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3125; GFX8-NEXT:    s_waitcnt vmcnt(0)
3126; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3127; GFX8-NEXT:    v_mov_b32_e32 v2, 16
3128; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3129; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3130; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3131; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3132; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3133; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3134; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3135; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3136; GFX8-NEXT:    s_setpc_b64 s[30:31]
3137;
3138; GFX7-LABEL: extractelement_vgpr_v16i8_idx5:
3139; GFX7:       ; %bb.0:
3140; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3141; GFX7-NEXT:    s_mov_b32 s6, 0
3142; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3143; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3144; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3145; GFX7-NEXT:    s_waitcnt vmcnt(0)
3146; GFX7-NEXT:    v_bfe_u32 v3, v1, 8, 8
3147; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v1
3148; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v1
3149; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
3150; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3151; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3152; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
3153; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
3154; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3155; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3156; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3157; GFX7-NEXT:    s_setpc_b64 s[30:31]
3158;
3159; GFX10-LABEL: extractelement_vgpr_v16i8_idx5:
3160; GFX10:       ; %bb.0:
3161; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3162; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3163; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3164; GFX10-NEXT:    s_mov_b32 s4, 8
3165; GFX10-NEXT:    s_waitcnt vmcnt(0)
3166; GFX10-NEXT:    v_mov_b32_e32 v0, 16
3167; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3168; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3169; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3170; GFX10-NEXT:    v_and_or_b32 v1, 0xff, v1, v2
3171; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
3172; GFX10-NEXT:    v_or3_b32 v0, v1, v0, v2
3173; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3174; GFX10-NEXT:    s_setpc_b64 s[30:31]
3175  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3176  %element = extractelement <16 x i8> %vector, i32 5
3177  ret i8 %element
3178}
3179
3180define i8 @extractelement_vgpr_v16i8_idx6(<16 x i8> addrspace(1)* %ptr) {
3181; GFX9-LABEL: extractelement_vgpr_v16i8_idx6:
3182; GFX9:       ; %bb.0:
3183; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3184; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3185; GFX9-NEXT:    s_waitcnt vmcnt(0)
3186; GFX9-NEXT:    v_mov_b32_e32 v2, 8
3187; GFX9-NEXT:    s_mov_b32 s4, 16
3188; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3189; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3190; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3191; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3192; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v2
3193; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3194; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v1
3195; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3196; GFX9-NEXT:    s_setpc_b64 s[30:31]
3197;
3198; GFX8-LABEL: extractelement_vgpr_v16i8_idx6:
3199; GFX8:       ; %bb.0:
3200; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3201; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3202; GFX8-NEXT:    s_waitcnt vmcnt(0)
3203; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3204; GFX8-NEXT:    v_mov_b32_e32 v2, 16
3205; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3206; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3207; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3208; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3209; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3210; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3211; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3212; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3213; GFX8-NEXT:    s_setpc_b64 s[30:31]
3214;
3215; GFX7-LABEL: extractelement_vgpr_v16i8_idx6:
3216; GFX7:       ; %bb.0:
3217; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3218; GFX7-NEXT:    s_mov_b32 s6, 0
3219; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3220; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3221; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3222; GFX7-NEXT:    s_waitcnt vmcnt(0)
3223; GFX7-NEXT:    v_bfe_u32 v3, v1, 8, 8
3224; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v1
3225; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v1
3226; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
3227; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3228; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3229; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
3230; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
3231; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3232; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3233; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3234; GFX7-NEXT:    s_setpc_b64 s[30:31]
3235;
3236; GFX10-LABEL: extractelement_vgpr_v16i8_idx6:
3237; GFX10:       ; %bb.0:
3238; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3239; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3240; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3241; GFX10-NEXT:    s_waitcnt vmcnt(0)
3242; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3243; GFX10-NEXT:    s_mov_b32 s4, 16
3244; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3245; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3246; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3247; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v1, v0
3248; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3249; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3250; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3251; GFX10-NEXT:    s_setpc_b64 s[30:31]
3252  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3253  %element = extractelement <16 x i8> %vector, i32 6
3254  ret i8 %element
3255}
3256
3257define i8 @extractelement_vgpr_v16i8_idx7(<16 x i8> addrspace(1)* %ptr) {
3258; GFX9-LABEL: extractelement_vgpr_v16i8_idx7:
3259; GFX9:       ; %bb.0:
3260; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3261; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3262; GFX9-NEXT:    s_waitcnt vmcnt(0)
3263; GFX9-NEXT:    v_mov_b32_e32 v2, 8
3264; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3265; GFX9-NEXT:    v_mov_b32_e32 v3, 16
3266; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
3267; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3268; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3269; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v2
3270; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3271; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3272; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3273; GFX9-NEXT:    s_setpc_b64 s[30:31]
3274;
3275; GFX8-LABEL: extractelement_vgpr_v16i8_idx7:
3276; GFX8:       ; %bb.0:
3277; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3278; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3279; GFX8-NEXT:    s_waitcnt vmcnt(0)
3280; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3281; GFX8-NEXT:    v_mov_b32_e32 v2, 16
3282; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3283; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3284; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3285; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3286; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3287; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3288; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3289; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3290; GFX8-NEXT:    s_setpc_b64 s[30:31]
3291;
3292; GFX7-LABEL: extractelement_vgpr_v16i8_idx7:
3293; GFX7:       ; %bb.0:
3294; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3295; GFX7-NEXT:    s_mov_b32 s6, 0
3296; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3297; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3298; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3299; GFX7-NEXT:    s_waitcnt vmcnt(0)
3300; GFX7-NEXT:    v_bfe_u32 v3, v1, 8, 8
3301; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v1
3302; GFX7-NEXT:    v_and_b32_e32 v2, 0xff, v1
3303; GFX7-NEXT:    v_bfe_u32 v1, v1, 16, 8
3304; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3305; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3306; GFX7-NEXT:    v_or_b32_e32 v2, v2, v3
3307; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
3308; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3309; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3310; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3311; GFX7-NEXT:    s_setpc_b64 s[30:31]
3312;
3313; GFX10-LABEL: extractelement_vgpr_v16i8_idx7:
3314; GFX10:       ; %bb.0:
3315; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3316; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3317; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3318; GFX10-NEXT:    s_waitcnt vmcnt(0)
3319; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3320; GFX10-NEXT:    v_mov_b32_e32 v2, 16
3321; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3322; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3323; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3324; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v1, v0
3325; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3326; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
3327; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3328; GFX10-NEXT:    s_setpc_b64 s[30:31]
3329  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3330  %element = extractelement <16 x i8> %vector, i32 7
3331  ret i8 %element
3332}
3333
3334define i8 @extractelement_vgpr_v16i8_idx8(<16 x i8> addrspace(1)* %ptr) {
3335; GFX9-LABEL: extractelement_vgpr_v16i8_idx8:
3336; GFX9:       ; %bb.0:
3337; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3338; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3339; GFX9-NEXT:    s_waitcnt vmcnt(0)
3340; GFX9-NEXT:    v_mov_b32_e32 v1, 8
3341; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3342; GFX9-NEXT:    v_mov_b32_e32 v3, 16
3343; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v2
3344; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3345; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3346; GFX9-NEXT:    v_and_or_b32 v0, v2, v0, v1
3347; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3348; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3349; GFX9-NEXT:    s_setpc_b64 s[30:31]
3350;
3351; GFX8-LABEL: extractelement_vgpr_v16i8_idx8:
3352; GFX8:       ; %bb.0:
3353; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3354; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3355; GFX8-NEXT:    s_waitcnt vmcnt(0)
3356; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3357; GFX8-NEXT:    v_mov_b32_e32 v1, 16
3358; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3359; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3360; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3361; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3362; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3363; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3364; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3365; GFX8-NEXT:    s_setpc_b64 s[30:31]
3366;
3367; GFX7-LABEL: extractelement_vgpr_v16i8_idx8:
3368; GFX7:       ; %bb.0:
3369; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3370; GFX7-NEXT:    s_mov_b32 s6, 0
3371; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3372; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3373; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3374; GFX7-NEXT:    s_waitcnt vmcnt(0)
3375; GFX7-NEXT:    v_bfe_u32 v3, v2, 8, 8
3376; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v2
3377; GFX7-NEXT:    v_and_b32_e32 v1, 0xff, v2
3378; GFX7-NEXT:    v_bfe_u32 v2, v2, 16, 8
3379; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3380; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3381; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
3382; GFX7-NEXT:    v_or_b32_e32 v1, v1, v2
3383; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3384; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3385; GFX7-NEXT:    s_setpc_b64 s[30:31]
3386;
3387; GFX10-LABEL: extractelement_vgpr_v16i8_idx8:
3388; GFX10:       ; %bb.0:
3389; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3390; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3391; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3392; GFX10-NEXT:    s_waitcnt vmcnt(0)
3393; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3394; GFX10-NEXT:    v_mov_b32_e32 v1, 16
3395; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3396; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3397; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3398; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v2, v0
3399; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
3400; GFX10-NEXT:    v_or3_b32 v0, v0, v1, v2
3401; GFX10-NEXT:    s_setpc_b64 s[30:31]
3402  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3403  %element = extractelement <16 x i8> %vector, i32 8
3404  ret i8 %element
3405}
3406
3407define i8 @extractelement_vgpr_v16i8_idx9(<16 x i8> addrspace(1)* %ptr) {
3408; GFX9-LABEL: extractelement_vgpr_v16i8_idx9:
3409; GFX9:       ; %bb.0:
3410; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3411; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3412; GFX9-NEXT:    s_mov_b32 s4, 8
3413; GFX9-NEXT:    s_waitcnt vmcnt(0)
3414; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3415; GFX9-NEXT:    v_mov_b32_e32 v1, 16
3416; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3417; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3418; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3419; GFX9-NEXT:    v_and_or_b32 v0, v2, v0, v4
3420; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
3421; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
3422; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3423; GFX9-NEXT:    s_setpc_b64 s[30:31]
3424;
3425; GFX8-LABEL: extractelement_vgpr_v16i8_idx9:
3426; GFX8:       ; %bb.0:
3427; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3428; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3429; GFX8-NEXT:    s_waitcnt vmcnt(0)
3430; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3431; GFX8-NEXT:    v_mov_b32_e32 v1, 16
3432; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3433; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3434; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3435; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3436; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3437; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3438; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3439; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3440; GFX8-NEXT:    s_setpc_b64 s[30:31]
3441;
3442; GFX7-LABEL: extractelement_vgpr_v16i8_idx9:
3443; GFX7:       ; %bb.0:
3444; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3445; GFX7-NEXT:    s_mov_b32 s6, 0
3446; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3447; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3448; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3449; GFX7-NEXT:    s_waitcnt vmcnt(0)
3450; GFX7-NEXT:    v_bfe_u32 v3, v2, 8, 8
3451; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v2
3452; GFX7-NEXT:    v_and_b32_e32 v1, 0xff, v2
3453; GFX7-NEXT:    v_bfe_u32 v2, v2, 16, 8
3454; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3455; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3456; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
3457; GFX7-NEXT:    v_or_b32_e32 v1, v1, v2
3458; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3459; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3460; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3461; GFX7-NEXT:    s_setpc_b64 s[30:31]
3462;
3463; GFX10-LABEL: extractelement_vgpr_v16i8_idx9:
3464; GFX10:       ; %bb.0:
3465; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3466; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3467; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3468; GFX10-NEXT:    s_mov_b32 s4, 8
3469; GFX10-NEXT:    s_waitcnt vmcnt(0)
3470; GFX10-NEXT:    v_mov_b32_e32 v0, 16
3471; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3472; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3473; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3474; GFX10-NEXT:    v_and_or_b32 v1, 0xff, v2, v1
3475; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
3476; GFX10-NEXT:    v_or3_b32 v0, v1, v0, v2
3477; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3478; GFX10-NEXT:    s_setpc_b64 s[30:31]
3479  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3480  %element = extractelement <16 x i8> %vector, i32 9
3481  ret i8 %element
3482}
3483
3484define i8 @extractelement_vgpr_v16i8_idx10(<16 x i8> addrspace(1)* %ptr) {
3485; GFX9-LABEL: extractelement_vgpr_v16i8_idx10:
3486; GFX9:       ; %bb.0:
3487; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3488; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3489; GFX9-NEXT:    s_waitcnt vmcnt(0)
3490; GFX9-NEXT:    v_mov_b32_e32 v1, 8
3491; GFX9-NEXT:    s_mov_b32 s4, 16
3492; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3493; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3494; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3495; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3496; GFX9-NEXT:    v_and_or_b32 v0, v2, v0, v1
3497; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3498; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v1
3499; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3500; GFX9-NEXT:    s_setpc_b64 s[30:31]
3501;
3502; GFX8-LABEL: extractelement_vgpr_v16i8_idx10:
3503; GFX8:       ; %bb.0:
3504; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3505; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3506; GFX8-NEXT:    s_waitcnt vmcnt(0)
3507; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3508; GFX8-NEXT:    v_mov_b32_e32 v1, 16
3509; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3510; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3511; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3512; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3513; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3514; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3515; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3516; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3517; GFX8-NEXT:    s_setpc_b64 s[30:31]
3518;
3519; GFX7-LABEL: extractelement_vgpr_v16i8_idx10:
3520; GFX7:       ; %bb.0:
3521; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3522; GFX7-NEXT:    s_mov_b32 s6, 0
3523; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3524; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3525; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3526; GFX7-NEXT:    s_waitcnt vmcnt(0)
3527; GFX7-NEXT:    v_bfe_u32 v3, v2, 8, 8
3528; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v2
3529; GFX7-NEXT:    v_and_b32_e32 v1, 0xff, v2
3530; GFX7-NEXT:    v_bfe_u32 v2, v2, 16, 8
3531; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3532; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3533; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
3534; GFX7-NEXT:    v_or_b32_e32 v1, v1, v2
3535; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3536; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3537; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3538; GFX7-NEXT:    s_setpc_b64 s[30:31]
3539;
3540; GFX10-LABEL: extractelement_vgpr_v16i8_idx10:
3541; GFX10:       ; %bb.0:
3542; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3543; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3544; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3545; GFX10-NEXT:    s_waitcnt vmcnt(0)
3546; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3547; GFX10-NEXT:    s_mov_b32 s4, 16
3548; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3549; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3550; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3551; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v2, v0
3552; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3553; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3554; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3555; GFX10-NEXT:    s_setpc_b64 s[30:31]
3556  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3557  %element = extractelement <16 x i8> %vector, i32 10
3558  ret i8 %element
3559}
3560
3561define i8 @extractelement_vgpr_v16i8_idx11(<16 x i8> addrspace(1)* %ptr) {
3562; GFX9-LABEL: extractelement_vgpr_v16i8_idx11:
3563; GFX9:       ; %bb.0:
3564; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3565; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3566; GFX9-NEXT:    s_waitcnt vmcnt(0)
3567; GFX9-NEXT:    v_mov_b32_e32 v1, 8
3568; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3569; GFX9-NEXT:    v_mov_b32_e32 v3, 16
3570; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v2
3571; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3572; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3573; GFX9-NEXT:    v_and_or_b32 v0, v2, v0, v1
3574; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3575; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3576; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3577; GFX9-NEXT:    s_setpc_b64 s[30:31]
3578;
3579; GFX8-LABEL: extractelement_vgpr_v16i8_idx11:
3580; GFX8:       ; %bb.0:
3581; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3582; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3583; GFX8-NEXT:    s_waitcnt vmcnt(0)
3584; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3585; GFX8-NEXT:    v_mov_b32_e32 v1, 16
3586; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3587; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3588; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3589; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3590; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3591; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3592; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3593; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3594; GFX8-NEXT:    s_setpc_b64 s[30:31]
3595;
3596; GFX7-LABEL: extractelement_vgpr_v16i8_idx11:
3597; GFX7:       ; %bb.0:
3598; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3599; GFX7-NEXT:    s_mov_b32 s6, 0
3600; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3601; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3602; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3603; GFX7-NEXT:    s_waitcnt vmcnt(0)
3604; GFX7-NEXT:    v_bfe_u32 v3, v2, 8, 8
3605; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v2
3606; GFX7-NEXT:    v_and_b32_e32 v1, 0xff, v2
3607; GFX7-NEXT:    v_bfe_u32 v2, v2, 16, 8
3608; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
3609; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3610; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
3611; GFX7-NEXT:    v_or_b32_e32 v1, v1, v2
3612; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3613; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3614; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3615; GFX7-NEXT:    s_setpc_b64 s[30:31]
3616;
3617; GFX10-LABEL: extractelement_vgpr_v16i8_idx11:
3618; GFX10:       ; %bb.0:
3619; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3620; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3621; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3622; GFX10-NEXT:    s_waitcnt vmcnt(0)
3623; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3624; GFX10-NEXT:    v_mov_b32_e32 v1, 16
3625; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3626; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3627; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3628; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v2, v0
3629; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
3630; GFX10-NEXT:    v_or3_b32 v0, v0, v1, v2
3631; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3632; GFX10-NEXT:    s_setpc_b64 s[30:31]
3633  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3634  %element = extractelement <16 x i8> %vector, i32 11
3635  ret i8 %element
3636}
3637
3638define i8 @extractelement_vgpr_v16i8_idx12(<16 x i8> addrspace(1)* %ptr) {
3639; GFX9-LABEL: extractelement_vgpr_v16i8_idx12:
3640; GFX9:       ; %bb.0:
3641; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3642; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3643; GFX9-NEXT:    s_waitcnt vmcnt(0)
3644; GFX9-NEXT:    v_mov_b32_e32 v1, 8
3645; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3646; GFX9-NEXT:    v_mov_b32_e32 v2, 16
3647; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v3
3648; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3649; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3650; GFX9-NEXT:    v_and_or_b32 v0, v3, v0, v1
3651; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3652; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
3653; GFX9-NEXT:    s_setpc_b64 s[30:31]
3654;
3655; GFX8-LABEL: extractelement_vgpr_v16i8_idx12:
3656; GFX8:       ; %bb.0:
3657; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3658; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3659; GFX8-NEXT:    s_waitcnt vmcnt(0)
3660; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3661; GFX8-NEXT:    v_mov_b32_e32 v1, 16
3662; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3663; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3664; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3665; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3666; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3667; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3668; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3669; GFX8-NEXT:    s_setpc_b64 s[30:31]
3670;
3671; GFX7-LABEL: extractelement_vgpr_v16i8_idx12:
3672; GFX7:       ; %bb.0:
3673; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3674; GFX7-NEXT:    s_mov_b32 s6, 0
3675; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3676; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3677; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3678; GFX7-NEXT:    s_waitcnt vmcnt(0)
3679; GFX7-NEXT:    v_bfe_u32 v2, v3, 8, 8
3680; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v3
3681; GFX7-NEXT:    v_and_b32_e32 v1, 0xff, v3
3682; GFX7-NEXT:    v_bfe_u32 v3, v3, 16, 8
3683; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
3684; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3685; GFX7-NEXT:    v_or_b32_e32 v1, v1, v2
3686; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
3687; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3688; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3689; GFX7-NEXT:    s_setpc_b64 s[30:31]
3690;
3691; GFX10-LABEL: extractelement_vgpr_v16i8_idx12:
3692; GFX10:       ; %bb.0:
3693; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3694; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3695; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3696; GFX10-NEXT:    s_waitcnt vmcnt(0)
3697; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3698; GFX10-NEXT:    v_mov_b32_e32 v1, 16
3699; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3700; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3701; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3702; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v3, v0
3703; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
3704; GFX10-NEXT:    v_or3_b32 v0, v0, v1, v2
3705; GFX10-NEXT:    s_setpc_b64 s[30:31]
3706  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3707  %element = extractelement <16 x i8> %vector, i32 12
3708  ret i8 %element
3709}
3710
3711define i8 @extractelement_vgpr_v16i8_idx13(<16 x i8> addrspace(1)* %ptr) {
3712; GFX9-LABEL: extractelement_vgpr_v16i8_idx13:
3713; GFX9:       ; %bb.0:
3714; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3715; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3716; GFX9-NEXT:    s_mov_b32 s4, 8
3717; GFX9-NEXT:    s_waitcnt vmcnt(0)
3718; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3719; GFX9-NEXT:    v_mov_b32_e32 v1, 16
3720; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3721; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3722; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3723; GFX9-NEXT:    v_and_or_b32 v0, v3, v0, v4
3724; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
3725; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
3726; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3727; GFX9-NEXT:    s_setpc_b64 s[30:31]
3728;
3729; GFX8-LABEL: extractelement_vgpr_v16i8_idx13:
3730; GFX8:       ; %bb.0:
3731; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3732; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3733; GFX8-NEXT:    s_waitcnt vmcnt(0)
3734; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3735; GFX8-NEXT:    v_mov_b32_e32 v1, 16
3736; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3737; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3738; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3739; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3740; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3741; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3742; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3743; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3744; GFX8-NEXT:    s_setpc_b64 s[30:31]
3745;
3746; GFX7-LABEL: extractelement_vgpr_v16i8_idx13:
3747; GFX7:       ; %bb.0:
3748; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3749; GFX7-NEXT:    s_mov_b32 s6, 0
3750; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3751; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3752; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3753; GFX7-NEXT:    s_waitcnt vmcnt(0)
3754; GFX7-NEXT:    v_bfe_u32 v2, v3, 8, 8
3755; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v3
3756; GFX7-NEXT:    v_and_b32_e32 v1, 0xff, v3
3757; GFX7-NEXT:    v_bfe_u32 v3, v3, 16, 8
3758; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
3759; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3760; GFX7-NEXT:    v_or_b32_e32 v1, v1, v2
3761; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
3762; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3763; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3764; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3765; GFX7-NEXT:    s_setpc_b64 s[30:31]
3766;
3767; GFX10-LABEL: extractelement_vgpr_v16i8_idx13:
3768; GFX10:       ; %bb.0:
3769; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3770; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3771; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3772; GFX10-NEXT:    s_mov_b32 s4, 8
3773; GFX10-NEXT:    s_waitcnt vmcnt(0)
3774; GFX10-NEXT:    v_mov_b32_e32 v0, 16
3775; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3776; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3777; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3778; GFX10-NEXT:    v_and_or_b32 v1, 0xff, v3, v1
3779; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
3780; GFX10-NEXT:    v_or3_b32 v0, v1, v0, v2
3781; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3782; GFX10-NEXT:    s_setpc_b64 s[30:31]
3783  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3784  %element = extractelement <16 x i8> %vector, i32 13
3785  ret i8 %element
3786}
3787
3788define i8 @extractelement_vgpr_v16i8_idx14(<16 x i8> addrspace(1)* %ptr) {
3789; GFX9-LABEL: extractelement_vgpr_v16i8_idx14:
3790; GFX9:       ; %bb.0:
3791; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3792; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3793; GFX9-NEXT:    s_waitcnt vmcnt(0)
3794; GFX9-NEXT:    v_mov_b32_e32 v1, 8
3795; GFX9-NEXT:    s_mov_b32 s4, 16
3796; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3797; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3798; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3799; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3800; GFX9-NEXT:    v_and_or_b32 v0, v3, v0, v1
3801; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3802; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v1
3803; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3804; GFX9-NEXT:    s_setpc_b64 s[30:31]
3805;
3806; GFX8-LABEL: extractelement_vgpr_v16i8_idx14:
3807; GFX8:       ; %bb.0:
3808; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3809; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3810; GFX8-NEXT:    s_waitcnt vmcnt(0)
3811; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3812; GFX8-NEXT:    v_mov_b32_e32 v1, 16
3813; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3814; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3815; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3816; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3817; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3818; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3819; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3820; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3821; GFX8-NEXT:    s_setpc_b64 s[30:31]
3822;
3823; GFX7-LABEL: extractelement_vgpr_v16i8_idx14:
3824; GFX7:       ; %bb.0:
3825; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3826; GFX7-NEXT:    s_mov_b32 s6, 0
3827; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3828; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3829; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3830; GFX7-NEXT:    s_waitcnt vmcnt(0)
3831; GFX7-NEXT:    v_bfe_u32 v2, v3, 8, 8
3832; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v3
3833; GFX7-NEXT:    v_and_b32_e32 v1, 0xff, v3
3834; GFX7-NEXT:    v_bfe_u32 v3, v3, 16, 8
3835; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
3836; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3837; GFX7-NEXT:    v_or_b32_e32 v1, v1, v2
3838; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
3839; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3840; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3841; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3842; GFX7-NEXT:    s_setpc_b64 s[30:31]
3843;
3844; GFX10-LABEL: extractelement_vgpr_v16i8_idx14:
3845; GFX10:       ; %bb.0:
3846; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3847; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3848; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3849; GFX10-NEXT:    s_waitcnt vmcnt(0)
3850; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3851; GFX10-NEXT:    s_mov_b32 s4, 16
3852; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3853; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
3854; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, s4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3855; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v3, v0
3856; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3857; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
3858; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3859; GFX10-NEXT:    s_setpc_b64 s[30:31]
3860  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3861  %element = extractelement <16 x i8> %vector, i32 14
3862  ret i8 %element
3863}
3864
3865define i8 @extractelement_vgpr_v16i8_idx15(<16 x i8> addrspace(1)* %ptr) {
3866; GFX9-LABEL: extractelement_vgpr_v16i8_idx15:
3867; GFX9:       ; %bb.0:
3868; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3869; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3870; GFX9-NEXT:    s_waitcnt vmcnt(0)
3871; GFX9-NEXT:    v_mov_b32_e32 v1, 8
3872; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
3873; GFX9-NEXT:    v_mov_b32_e32 v2, 16
3874; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v3
3875; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3876; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3877; GFX9-NEXT:    v_and_or_b32 v0, v3, v0, v1
3878; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3879; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
3880; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3881; GFX9-NEXT:    s_setpc_b64 s[30:31]
3882;
3883; GFX8-LABEL: extractelement_vgpr_v16i8_idx15:
3884; GFX8:       ; %bb.0:
3885; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3886; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3887; GFX8-NEXT:    s_waitcnt vmcnt(0)
3888; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3889; GFX8-NEXT:    v_mov_b32_e32 v1, 16
3890; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3891; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3892; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3893; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3894; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3895; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3896; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3897; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3898; GFX8-NEXT:    s_setpc_b64 s[30:31]
3899;
3900; GFX7-LABEL: extractelement_vgpr_v16i8_idx15:
3901; GFX7:       ; %bb.0:
3902; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3903; GFX7-NEXT:    s_mov_b32 s6, 0
3904; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3905; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3906; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3907; GFX7-NEXT:    s_waitcnt vmcnt(0)
3908; GFX7-NEXT:    v_bfe_u32 v2, v3, 8, 8
3909; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v3
3910; GFX7-NEXT:    v_and_b32_e32 v1, 0xff, v3
3911; GFX7-NEXT:    v_bfe_u32 v3, v3, 16, 8
3912; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
3913; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3914; GFX7-NEXT:    v_or_b32_e32 v1, v1, v2
3915; GFX7-NEXT:    v_or_b32_e32 v1, v1, v3
3916; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
3917; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3918; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3919; GFX7-NEXT:    s_setpc_b64 s[30:31]
3920;
3921; GFX10-LABEL: extractelement_vgpr_v16i8_idx15:
3922; GFX10:       ; %bb.0:
3923; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3924; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3925; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3926; GFX10-NEXT:    s_waitcnt vmcnt(0)
3927; GFX10-NEXT:    v_mov_b32_e32 v0, 8
3928; GFX10-NEXT:    v_mov_b32_e32 v1, 16
3929; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_1
3930; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3931; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
3932; GFX10-NEXT:    v_and_or_b32 v0, 0xff, v3, v0
3933; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
3934; GFX10-NEXT:    v_or3_b32 v0, v0, v1, v2
3935; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3936; GFX10-NEXT:    s_setpc_b64 s[30:31]
3937  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3938  %element = extractelement <16 x i8> %vector, i32 15
3939  ret i8 %element
3940}
3941