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
6define amdgpu_ps i128 @extractelement_sgpr_v4i128_sgpr_idx(<4 x i128> addrspace(4)* inreg %ptr, i32 inreg %idx) {
7; GCN-LABEL: extractelement_sgpr_v4i128_sgpr_idx:
8; GCN:       ; %bb.0:
9; GCN-NEXT:    s_load_dwordx16 s[8:23], s[2:3], 0x0
10; GCN-NEXT:    s_lshl_b32 m0, s4, 1
11; GCN-NEXT:    s_waitcnt lgkmcnt(0)
12; GCN-NEXT:    s_movrels_b64 s[0:1], s[8:9]
13; GCN-NEXT:    s_movrels_b64 s[2:3], s[10:11]
14; GCN-NEXT:    ; return to shader part epilog
15  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
16  %element = extractelement <4 x i128> %vector, i32 %idx
17  ret i128 %element
18}
19
20define amdgpu_ps i128 @extractelement_vgpr_v4i128_sgpr_idx(<4 x i128> addrspace(1)* %ptr, i32 inreg %idx) {
21; GFX9-LABEL: extractelement_vgpr_v4i128_sgpr_idx:
22; GFX9:       ; %bb.0:
23; GFX9-NEXT:    global_load_dwordx4 v[2:5], v[0:1], off
24; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[0:1], off offset:16
25; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off offset:32
26; GFX9-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off offset:48
27; GFX9-NEXT:    s_lshl_b32 s0, s2, 1
28; GFX9-NEXT:    s_lshl_b32 s2, s0, 1
29; GFX9-NEXT:    s_waitcnt vmcnt(0)
30; GFX9-NEXT:    s_set_gpr_idx_on s2, gpr_idx(SRC0)
31; GFX9-NEXT:    v_mov_b32_e32 v0, v2
32; GFX9-NEXT:    v_mov_b32_e32 v1, v3
33; GFX9-NEXT:    v_mov_b32_e32 v18, v2
34; GFX9-NEXT:    v_mov_b32_e32 v3, v3
35; GFX9-NEXT:    s_set_gpr_idx_off
36; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
37; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
38; GFX9-NEXT:    v_readfirstlane_b32 s2, v18
39; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
40; GFX9-NEXT:    ; return to shader part epilog
41;
42; GFX8-LABEL: extractelement_vgpr_v4i128_sgpr_idx:
43; GFX8:       ; %bb.0:
44; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 16, v0
45; GFX8-NEXT:    v_addc_u32_e32 v7, vcc, 0, v1, vcc
46; GFX8-NEXT:    v_add_u32_e32 v10, vcc, 32, v0
47; GFX8-NEXT:    v_addc_u32_e32 v11, vcc, 0, v1, vcc
48; GFX8-NEXT:    flat_load_dwordx4 v[2:5], v[0:1]
49; GFX8-NEXT:    flat_load_dwordx4 v[6:9], v[6:7]
50; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 48, v0
51; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
52; GFX8-NEXT:    flat_load_dwordx4 v[10:13], v[10:11]
53; GFX8-NEXT:    flat_load_dwordx4 v[14:17], v[0:1]
54; GFX8-NEXT:    s_lshl_b32 s0, s2, 1
55; GFX8-NEXT:    s_lshl_b32 m0, s0, 1
56; GFX8-NEXT:    s_waitcnt vmcnt(0)
57; GFX8-NEXT:    v_movrels_b32_e32 v1, v3
58; GFX8-NEXT:    v_movrels_b32_e32 v0, v2
59; GFX8-NEXT:    v_mov_b32_e32 v3, v1
60; GFX8-NEXT:    v_mov_b32_e32 v2, v0
61; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
62; GFX8-NEXT:    v_readfirstlane_b32 s1, v1
63; GFX8-NEXT:    v_readfirstlane_b32 s2, v2
64; GFX8-NEXT:    v_readfirstlane_b32 s3, v3
65; GFX8-NEXT:    ; return to shader part epilog
66;
67; GFX7-LABEL: extractelement_vgpr_v4i128_sgpr_idx:
68; GFX7:       ; %bb.0:
69; GFX7-NEXT:    s_mov_b32 s6, 0
70; GFX7-NEXT:    s_mov_b32 s7, 0xf000
71; GFX7-NEXT:    s_mov_b64 s[4:5], 0
72; GFX7-NEXT:    buffer_load_dwordx4 v[2:5], v[0:1], s[4:7], 0 addr64
73; GFX7-NEXT:    buffer_load_dwordx4 v[6:9], v[0:1], s[4:7], 0 addr64 offset:16
74; GFX7-NEXT:    buffer_load_dwordx4 v[10:13], v[0:1], s[4:7], 0 addr64 offset:32
75; GFX7-NEXT:    buffer_load_dwordx4 v[14:17], v[0:1], s[4:7], 0 addr64 offset:48
76; GFX7-NEXT:    s_lshl_b32 s0, s2, 1
77; GFX7-NEXT:    s_lshl_b32 m0, s0, 1
78; GFX7-NEXT:    s_waitcnt vmcnt(0)
79; GFX7-NEXT:    v_movrels_b32_e32 v1, v3
80; GFX7-NEXT:    v_movrels_b32_e32 v0, v2
81; GFX7-NEXT:    v_mov_b32_e32 v3, v1
82; GFX7-NEXT:    v_mov_b32_e32 v2, v0
83; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
84; GFX7-NEXT:    v_readfirstlane_b32 s1, v1
85; GFX7-NEXT:    v_readfirstlane_b32 s2, v2
86; GFX7-NEXT:    v_readfirstlane_b32 s3, v3
87; GFX7-NEXT:    ; return to shader part epilog
88  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
89  %element = extractelement <4 x i128> %vector, i32 %idx
90  ret i128 %element
91}
92
93define i128 @extractelement_vgpr_v4i128_vgpr_idx(<4 x i128> addrspace(1)* %ptr, i32 %idx) {
94; GFX9-LABEL: extractelement_vgpr_v4i128_vgpr_idx:
95; GFX9:       ; %bb.0:
96; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
97; GFX9-NEXT:    v_lshlrev_b32_e32 v16, 1, v2
98; GFX9-NEXT:    global_load_dwordx4 v[2:5], v[0:1], off
99; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[0:1], off offset:16
100; GFX9-NEXT:    v_add_u32_e32 v17, 1, v16
101; GFX9-NEXT:    v_cmp_eq_u32_e64 s[4:5], 1, v16
102; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v17
103; GFX9-NEXT:    v_cmp_eq_u32_e64 s[6:7], 6, v16
104; GFX9-NEXT:    v_cmp_eq_u32_e64 s[8:9], 7, v16
105; GFX9-NEXT:    s_waitcnt vmcnt(1)
106; GFX9-NEXT:    v_cndmask_b32_e64 v10, v2, v4, s[4:5]
107; GFX9-NEXT:    v_cndmask_b32_e64 v11, v3, v5, s[4:5]
108; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
109; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v5, vcc
110; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v16
111; GFX9-NEXT:    s_waitcnt vmcnt(0)
112; GFX9-NEXT:    v_cndmask_b32_e32 v4, v10, v6, vcc
113; GFX9-NEXT:    v_cndmask_b32_e32 v5, v11, v7, vcc
114; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v17
115; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v6, vcc
116; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc
117; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v16
118; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v8, vcc
119; GFX9-NEXT:    v_cndmask_b32_e32 v5, v5, v9, vcc
120; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v17
121; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v8, vcc
122; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
123; GFX9-NEXT:    global_load_dwordx4 v[8:11], v[0:1], off offset:32
124; GFX9-NEXT:    global_load_dwordx4 v[12:15], v[0:1], off offset:48
125; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v16
126; GFX9-NEXT:    v_cmp_eq_u32_e64 s[4:5], 7, v17
127; GFX9-NEXT:    s_waitcnt vmcnt(1)
128; GFX9-NEXT:    v_cndmask_b32_e32 v0, v4, v8, vcc
129; GFX9-NEXT:    v_cndmask_b32_e32 v1, v5, v9, vcc
130; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v17
131; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v8, vcc
132; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
133; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v16
134; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v10, vcc
135; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v11, vcc
136; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v17
137; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
138; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
139; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v17
140; GFX9-NEXT:    s_waitcnt vmcnt(0)
141; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
142; GFX9-NEXT:    v_cndmask_b32_e64 v0, v0, v12, s[6:7]
143; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v13, s[6:7]
144; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
145; GFX9-NEXT:    v_cndmask_b32_e64 v0, v0, v14, s[8:9]
146; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v15, s[8:9]
147; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v14, s[4:5]
148; GFX9-NEXT:    v_cndmask_b32_e64 v3, v3, v15, s[4:5]
149; GFX9-NEXT:    s_setpc_b64 s[30:31]
150;
151; GFX8-LABEL: extractelement_vgpr_v4i128_vgpr_idx:
152; GFX8:       ; %bb.0:
153; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
154; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 16, v0
155; GFX8-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
156; GFX8-NEXT:    flat_load_dwordx4 v[8:11], v[0:1]
157; GFX8-NEXT:    flat_load_dwordx4 v[4:7], v[3:4]
158; GFX8-NEXT:    v_lshlrev_b32_e32 v16, 1, v2
159; GFX8-NEXT:    v_add_u32_e32 v17, vcc, 1, v16
160; GFX8-NEXT:    v_cmp_eq_u32_e64 s[4:5], 1, v16
161; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v17
162; GFX8-NEXT:    v_cmp_eq_u32_e64 s[6:7], 6, v16
163; GFX8-NEXT:    v_cmp_eq_u32_e64 s[8:9], 7, v16
164; GFX8-NEXT:    s_waitcnt vmcnt(1)
165; GFX8-NEXT:    v_cndmask_b32_e64 v2, v8, v10, s[4:5]
166; GFX8-NEXT:    v_cndmask_b32_e64 v3, v9, v11, s[4:5]
167; GFX8-NEXT:    v_cndmask_b32_e32 v8, v8, v10, vcc
168; GFX8-NEXT:    v_cndmask_b32_e32 v9, v9, v11, vcc
169; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v16
170; GFX8-NEXT:    s_waitcnt vmcnt(0)
171; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
172; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v5, vcc
173; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v17
174; GFX8-NEXT:    v_cndmask_b32_e32 v4, v8, v4, vcc
175; GFX8-NEXT:    v_cndmask_b32_e32 v5, v9, v5, vcc
176; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v16
177; GFX8-NEXT:    v_cndmask_b32_e32 v18, v2, v6, vcc
178; GFX8-NEXT:    v_cndmask_b32_e32 v19, v3, v7, vcc
179; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v17
180; GFX8-NEXT:    v_cndmask_b32_e32 v4, v4, v6, vcc
181; GFX8-NEXT:    v_cndmask_b32_e32 v5, v5, v7, vcc
182; GFX8-NEXT:    v_add_u32_e32 v2, vcc, 32, v0
183; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
184; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 48, v0
185; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
186; GFX8-NEXT:    flat_load_dwordx4 v[8:11], v[2:3]
187; GFX8-NEXT:    flat_load_dwordx4 v[12:15], v[0:1]
188; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v16
189; GFX8-NEXT:    v_cmp_eq_u32_e64 s[4:5], 7, v17
190; GFX8-NEXT:    s_waitcnt vmcnt(1)
191; GFX8-NEXT:    v_cndmask_b32_e32 v0, v18, v8, vcc
192; GFX8-NEXT:    v_cndmask_b32_e32 v1, v19, v9, vcc
193; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v17
194; GFX8-NEXT:    v_cndmask_b32_e32 v2, v4, v8, vcc
195; GFX8-NEXT:    v_cndmask_b32_e32 v3, v5, v9, vcc
196; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v16
197; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v10, vcc
198; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v11, vcc
199; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v17
200; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
201; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
202; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v17
203; GFX8-NEXT:    s_waitcnt vmcnt(0)
204; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
205; GFX8-NEXT:    v_cndmask_b32_e64 v0, v0, v12, s[6:7]
206; GFX8-NEXT:    v_cndmask_b32_e64 v1, v1, v13, s[6:7]
207; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
208; GFX8-NEXT:    v_cndmask_b32_e64 v0, v0, v14, s[8:9]
209; GFX8-NEXT:    v_cndmask_b32_e64 v1, v1, v15, s[8:9]
210; GFX8-NEXT:    v_cndmask_b32_e64 v2, v2, v14, s[4:5]
211; GFX8-NEXT:    v_cndmask_b32_e64 v3, v3, v15, s[4:5]
212; GFX8-NEXT:    s_setpc_b64 s[30:31]
213;
214; GFX7-LABEL: extractelement_vgpr_v4i128_vgpr_idx:
215; GFX7:       ; %bb.0:
216; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
217; GFX7-NEXT:    s_mov_b32 s10, 0
218; GFX7-NEXT:    s_mov_b32 s11, 0xf000
219; GFX7-NEXT:    s_mov_b64 s[8:9], 0
220; GFX7-NEXT:    v_lshlrev_b32_e32 v16, 1, v2
221; GFX7-NEXT:    buffer_load_dwordx4 v[2:5], v[0:1], s[8:11], 0 addr64
222; GFX7-NEXT:    buffer_load_dwordx4 v[6:9], v[0:1], s[8:11], 0 addr64 offset:16
223; GFX7-NEXT:    v_add_i32_e32 v17, vcc, 1, v16
224; GFX7-NEXT:    v_cmp_eq_u32_e64 s[4:5], 1, v16
225; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v17
226; GFX7-NEXT:    v_cmp_eq_u32_e64 s[6:7], 6, v16
227; GFX7-NEXT:    s_waitcnt vmcnt(1)
228; GFX7-NEXT:    v_cndmask_b32_e64 v10, v2, v4, s[4:5]
229; GFX7-NEXT:    v_cndmask_b32_e64 v11, v3, v5, s[4:5]
230; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
231; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v5, vcc
232; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v16
233; GFX7-NEXT:    s_waitcnt vmcnt(0)
234; GFX7-NEXT:    v_cndmask_b32_e32 v4, v10, v6, vcc
235; GFX7-NEXT:    v_cndmask_b32_e32 v5, v11, v7, vcc
236; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v17
237; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v6, vcc
238; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc
239; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v16
240; GFX7-NEXT:    v_cndmask_b32_e32 v4, v4, v8, vcc
241; GFX7-NEXT:    v_cndmask_b32_e32 v5, v5, v9, vcc
242; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v17
243; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v8, vcc
244; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
245; GFX7-NEXT:    buffer_load_dwordx4 v[8:11], v[0:1], s[8:11], 0 addr64 offset:32
246; GFX7-NEXT:    buffer_load_dwordx4 v[12:15], v[0:1], s[8:11], 0 addr64 offset:48
247; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v16
248; GFX7-NEXT:    v_cmp_eq_u32_e64 s[4:5], 7, v17
249; GFX7-NEXT:    v_cmp_eq_u32_e64 s[8:9], 7, v16
250; GFX7-NEXT:    s_waitcnt vmcnt(1)
251; GFX7-NEXT:    v_cndmask_b32_e32 v0, v4, v8, vcc
252; GFX7-NEXT:    v_cndmask_b32_e32 v1, v5, v9, vcc
253; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v17
254; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v8, vcc
255; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
256; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v16
257; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v10, vcc
258; GFX7-NEXT:    v_cndmask_b32_e32 v1, v1, v11, vcc
259; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v17
260; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
261; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
262; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v17
263; GFX7-NEXT:    s_waitcnt vmcnt(0)
264; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
265; GFX7-NEXT:    v_cndmask_b32_e64 v0, v0, v12, s[6:7]
266; GFX7-NEXT:    v_cndmask_b32_e64 v1, v1, v13, s[6:7]
267; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
268; GFX7-NEXT:    v_cndmask_b32_e64 v0, v0, v14, s[8:9]
269; GFX7-NEXT:    v_cndmask_b32_e64 v1, v1, v15, s[8:9]
270; GFX7-NEXT:    v_cndmask_b32_e64 v2, v2, v14, s[4:5]
271; GFX7-NEXT:    v_cndmask_b32_e64 v3, v3, v15, s[4:5]
272; GFX7-NEXT:    s_setpc_b64 s[30:31]
273  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
274  %element = extractelement <4 x i128> %vector, i32 %idx
275  ret i128 %element
276}
277
278define amdgpu_ps i128 @extractelement_sgpr_v4i128_vgpr_idx(<4 x i128> addrspace(4)* inreg %ptr, i32 %idx) {
279; GFX9-LABEL: extractelement_sgpr_v4i128_vgpr_idx:
280; GFX9:       ; %bb.0:
281; GFX9-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
282; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
283; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
284; GFX9-NEXT:    v_add_u32_e32 v19, 1, v0
285; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
286; GFX9-NEXT:    v_mov_b32_e32 v1, s0
287; GFX9-NEXT:    v_mov_b32_e32 v2, s1
288; GFX9-NEXT:    v_mov_b32_e32 v3, s2
289; GFX9-NEXT:    v_mov_b32_e32 v4, s3
290; GFX9-NEXT:    v_mov_b32_e32 v5, s4
291; GFX9-NEXT:    v_mov_b32_e32 v6, s5
292; GFX9-NEXT:    v_cndmask_b32_e32 v17, v1, v3, vcc
293; GFX9-NEXT:    v_cndmask_b32_e32 v18, v2, v4, vcc
294; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
295; GFX9-NEXT:    v_mov_b32_e32 v7, s6
296; GFX9-NEXT:    v_mov_b32_e32 v8, s7
297; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v5, vcc
298; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v6, vcc
299; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
300; GFX9-NEXT:    v_mov_b32_e32 v9, s8
301; GFX9-NEXT:    v_mov_b32_e32 v10, s9
302; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v7, vcc
303; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v8, vcc
304; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v0
305; GFX9-NEXT:    v_mov_b32_e32 v11, s10
306; GFX9-NEXT:    v_mov_b32_e32 v12, s11
307; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v9, vcc
308; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v10, vcc
309; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v0
310; GFX9-NEXT:    v_mov_b32_e32 v13, s12
311; GFX9-NEXT:    v_mov_b32_e32 v14, s13
312; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v11, vcc
313; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v12, vcc
314; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v0
315; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v13, vcc
316; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v14, vcc
317; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v19
318; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
319; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
320; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], 2, v19
321; GFX9-NEXT:    v_mov_b32_e32 v15, s14
322; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v0
323; GFX9-NEXT:    v_mov_b32_e32 v16, s15
324; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v5, s[0:1]
325; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v6, s[0:1]
326; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], 3, v19
327; GFX9-NEXT:    v_cndmask_b32_e64 v3, v1, v7, s[0:1]
328; GFX9-NEXT:    v_cndmask_b32_e32 v0, v17, v15, vcc
329; GFX9-NEXT:    v_cndmask_b32_e32 v1, v18, v16, vcc
330; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v8, s[0:1]
331; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v19
332; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
333; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
334; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v19
335; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
336; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
337; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v19
338; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
339; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v14, vcc
340; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v19
341; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v15, vcc
342; GFX9-NEXT:    v_cndmask_b32_e32 v3, v4, v16, vcc
343; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
344; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
345; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
346; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
347; GFX9-NEXT:    ; return to shader part epilog
348;
349; GFX8-LABEL: extractelement_sgpr_v4i128_vgpr_idx:
350; GFX8:       ; %bb.0:
351; GFX8-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
352; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
353; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
354; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
355; GFX8-NEXT:    v_mov_b32_e32 v1, s0
356; GFX8-NEXT:    v_mov_b32_e32 v3, s2
357; GFX8-NEXT:    v_mov_b32_e32 v2, s1
358; GFX8-NEXT:    v_mov_b32_e32 v4, s3
359; GFX8-NEXT:    v_mov_b32_e32 v5, s4
360; GFX8-NEXT:    v_mov_b32_e32 v6, s5
361; GFX8-NEXT:    v_cndmask_b32_e32 v17, v1, v3, vcc
362; GFX8-NEXT:    v_cndmask_b32_e32 v18, v2, v4, vcc
363; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
364; GFX8-NEXT:    v_mov_b32_e32 v7, s6
365; GFX8-NEXT:    v_mov_b32_e32 v8, s7
366; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v5, vcc
367; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v6, vcc
368; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
369; GFX8-NEXT:    v_mov_b32_e32 v9, s8
370; GFX8-NEXT:    v_mov_b32_e32 v10, s9
371; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v7, vcc
372; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v8, vcc
373; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v0
374; GFX8-NEXT:    v_mov_b32_e32 v11, s10
375; GFX8-NEXT:    v_mov_b32_e32 v12, s11
376; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v9, vcc
377; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v10, vcc
378; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v0
379; GFX8-NEXT:    v_mov_b32_e32 v13, s12
380; GFX8-NEXT:    v_mov_b32_e32 v14, s13
381; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v11, vcc
382; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v12, vcc
383; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v0
384; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v13, vcc
385; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v14, vcc
386; GFX8-NEXT:    v_add_u32_e32 v19, vcc, 1, v0
387; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v19
388; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
389; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
390; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], 2, v19
391; GFX8-NEXT:    v_mov_b32_e32 v15, s14
392; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v0
393; GFX8-NEXT:    v_mov_b32_e32 v16, s15
394; GFX8-NEXT:    v_cndmask_b32_e64 v1, v1, v5, s[0:1]
395; GFX8-NEXT:    v_cndmask_b32_e64 v2, v2, v6, s[0:1]
396; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], 3, v19
397; GFX8-NEXT:    v_cndmask_b32_e64 v3, v1, v7, s[0:1]
398; GFX8-NEXT:    v_cndmask_b32_e32 v0, v17, v15, vcc
399; GFX8-NEXT:    v_cndmask_b32_e32 v1, v18, v16, vcc
400; GFX8-NEXT:    v_cndmask_b32_e64 v2, v2, v8, s[0:1]
401; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v19
402; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
403; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
404; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v19
405; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
406; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
407; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v19
408; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
409; GFX8-NEXT:    v_cndmask_b32_e32 v4, v2, v14, vcc
410; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v19
411; GFX8-NEXT:    v_cndmask_b32_e32 v2, v3, v15, vcc
412; GFX8-NEXT:    v_cndmask_b32_e32 v3, v4, v16, vcc
413; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
414; GFX8-NEXT:    v_readfirstlane_b32 s1, v1
415; GFX8-NEXT:    v_readfirstlane_b32 s2, v2
416; GFX8-NEXT:    v_readfirstlane_b32 s3, v3
417; GFX8-NEXT:    ; return to shader part epilog
418;
419; GFX7-LABEL: extractelement_sgpr_v4i128_vgpr_idx:
420; GFX7:       ; %bb.0:
421; GFX7-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
422; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
423; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
424; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
425; GFX7-NEXT:    v_mov_b32_e32 v1, s0
426; GFX7-NEXT:    v_mov_b32_e32 v3, s2
427; GFX7-NEXT:    v_mov_b32_e32 v2, s1
428; GFX7-NEXT:    v_mov_b32_e32 v4, s3
429; GFX7-NEXT:    v_mov_b32_e32 v5, s4
430; GFX7-NEXT:    v_mov_b32_e32 v6, s5
431; GFX7-NEXT:    v_cndmask_b32_e32 v17, v1, v3, vcc
432; GFX7-NEXT:    v_cndmask_b32_e32 v18, v2, v4, vcc
433; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
434; GFX7-NEXT:    v_mov_b32_e32 v7, s6
435; GFX7-NEXT:    v_mov_b32_e32 v8, s7
436; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v5, vcc
437; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v6, vcc
438; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
439; GFX7-NEXT:    v_mov_b32_e32 v9, s8
440; GFX7-NEXT:    v_mov_b32_e32 v10, s9
441; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v7, vcc
442; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v8, vcc
443; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v0
444; GFX7-NEXT:    v_mov_b32_e32 v11, s10
445; GFX7-NEXT:    v_mov_b32_e32 v12, s11
446; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v9, vcc
447; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v10, vcc
448; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v0
449; GFX7-NEXT:    v_mov_b32_e32 v13, s12
450; GFX7-NEXT:    v_mov_b32_e32 v14, s13
451; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v11, vcc
452; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v12, vcc
453; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v0
454; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v13, vcc
455; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v14, vcc
456; GFX7-NEXT:    v_add_i32_e32 v19, vcc, 1, v0
457; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v19
458; GFX7-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
459; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
460; GFX7-NEXT:    v_cmp_eq_u32_e64 s[0:1], 2, v19
461; GFX7-NEXT:    v_mov_b32_e32 v15, s14
462; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v0
463; GFX7-NEXT:    v_mov_b32_e32 v16, s15
464; GFX7-NEXT:    v_cndmask_b32_e64 v1, v1, v5, s[0:1]
465; GFX7-NEXT:    v_cndmask_b32_e64 v2, v2, v6, s[0:1]
466; GFX7-NEXT:    v_cmp_eq_u32_e64 s[0:1], 3, v19
467; GFX7-NEXT:    v_cndmask_b32_e64 v3, v1, v7, s[0:1]
468; GFX7-NEXT:    v_cndmask_b32_e32 v0, v17, v15, vcc
469; GFX7-NEXT:    v_cndmask_b32_e32 v1, v18, v16, vcc
470; GFX7-NEXT:    v_cndmask_b32_e64 v2, v2, v8, s[0:1]
471; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v19
472; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
473; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
474; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v19
475; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
476; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
477; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v19
478; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
479; GFX7-NEXT:    v_cndmask_b32_e32 v4, v2, v14, vcc
480; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v19
481; GFX7-NEXT:    v_cndmask_b32_e32 v2, v3, v15, vcc
482; GFX7-NEXT:    v_cndmask_b32_e32 v3, v4, v16, vcc
483; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
484; GFX7-NEXT:    v_readfirstlane_b32 s1, v1
485; GFX7-NEXT:    v_readfirstlane_b32 s2, v2
486; GFX7-NEXT:    v_readfirstlane_b32 s3, v3
487; GFX7-NEXT:    ; return to shader part epilog
488  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
489  %element = extractelement <4 x i128> %vector, i32 %idx
490  ret i128 %element
491}
492
493define amdgpu_ps i128 @extractelement_sgpr_v4i128_idx0(<4 x i128> addrspace(4)* inreg %ptr) {
494; GCN-LABEL: extractelement_sgpr_v4i128_idx0:
495; GCN:       ; %bb.0:
496; GCN-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
497; GCN-NEXT:    s_waitcnt lgkmcnt(0)
498; GCN-NEXT:    ; return to shader part epilog
499  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
500  %element = extractelement <4 x i128> %vector, i32 0
501  ret i128 %element
502}
503
504define amdgpu_ps i128 @extractelement_sgpr_v4i128_idx1(<4 x i128> addrspace(4)* inreg %ptr) {
505; GCN-LABEL: extractelement_sgpr_v4i128_idx1:
506; GCN:       ; %bb.0:
507; GCN-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
508; GCN-NEXT:    s_waitcnt lgkmcnt(0)
509; GCN-NEXT:    s_mov_b32 s0, s4
510; GCN-NEXT:    s_mov_b32 s1, s5
511; GCN-NEXT:    s_mov_b32 s2, s6
512; GCN-NEXT:    s_mov_b32 s3, s7
513; GCN-NEXT:    ; return to shader part epilog
514  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
515  %element = extractelement <4 x i128> %vector, i32 1
516  ret i128 %element
517}
518
519define amdgpu_ps i128 @extractelement_sgpr_v4i128_idx2(<4 x i128> addrspace(4)* inreg %ptr) {
520; GCN-LABEL: extractelement_sgpr_v4i128_idx2:
521; GCN:       ; %bb.0:
522; GCN-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
523; GCN-NEXT:    s_waitcnt lgkmcnt(0)
524; GCN-NEXT:    s_mov_b32 s0, s8
525; GCN-NEXT:    s_mov_b32 s1, s9
526; GCN-NEXT:    s_mov_b32 s2, s10
527; GCN-NEXT:    s_mov_b32 s3, s11
528; GCN-NEXT:    ; return to shader part epilog
529  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
530  %element = extractelement <4 x i128> %vector, i32 2
531  ret i128 %element
532}
533
534define amdgpu_ps i128 @extractelement_sgpr_v4i128_idx3(<4 x i128> addrspace(4)* inreg %ptr) {
535; GCN-LABEL: extractelement_sgpr_v4i128_idx3:
536; GCN:       ; %bb.0:
537; GCN-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
538; GCN-NEXT:    s_waitcnt lgkmcnt(0)
539; GCN-NEXT:    s_mov_b32 s0, s12
540; GCN-NEXT:    s_mov_b32 s1, s13
541; GCN-NEXT:    s_mov_b32 s2, s14
542; GCN-NEXT:    s_mov_b32 s3, s15
543; GCN-NEXT:    ; return to shader part epilog
544  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
545  %element = extractelement <4 x i128> %vector, i32 3
546  ret i128 %element
547}
548
549define i128 @extractelement_vgpr_v4i128_idx0(<4 x i128> addrspace(1)* %ptr) {
550; GFX9-LABEL: extractelement_vgpr_v4i128_idx0:
551; GFX9:       ; %bb.0:
552; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
553; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
554; GFX9-NEXT:    s_waitcnt vmcnt(0)
555; GFX9-NEXT:    s_setpc_b64 s[30:31]
556;
557; GFX8-LABEL: extractelement_vgpr_v4i128_idx0:
558; GFX8:       ; %bb.0:
559; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
560; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
561; GFX8-NEXT:    s_waitcnt vmcnt(0)
562; GFX8-NEXT:    s_setpc_b64 s[30:31]
563;
564; GFX7-LABEL: extractelement_vgpr_v4i128_idx0:
565; GFX7:       ; %bb.0:
566; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
567; GFX7-NEXT:    s_mov_b32 s6, 0
568; GFX7-NEXT:    s_mov_b32 s7, 0xf000
569; GFX7-NEXT:    s_mov_b64 s[4:5], 0
570; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
571; GFX7-NEXT:    s_waitcnt vmcnt(0)
572; GFX7-NEXT:    s_setpc_b64 s[30:31]
573  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
574  %element = extractelement <4 x i128> %vector, i32 0
575  ret i128 %element
576}
577
578define i128 @extractelement_vgpr_v4i128_idx1(<4 x i128> addrspace(1)* %ptr) {
579; GFX9-LABEL: extractelement_vgpr_v4i128_idx1:
580; GFX9:       ; %bb.0:
581; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
582; GFX9-NEXT:    global_load_dwordx4 v[4:7], v[0:1], off offset:16
583; GFX9-NEXT:    s_waitcnt vmcnt(0)
584; GFX9-NEXT:    v_mov_b32_e32 v0, v4
585; GFX9-NEXT:    v_mov_b32_e32 v1, v5
586; GFX9-NEXT:    v_mov_b32_e32 v2, v6
587; GFX9-NEXT:    v_mov_b32_e32 v3, v7
588; GFX9-NEXT:    s_setpc_b64 s[30:31]
589;
590; GFX8-LABEL: extractelement_vgpr_v4i128_idx1:
591; GFX8:       ; %bb.0:
592; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
593; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
594; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
595; GFX8-NEXT:    flat_load_dwordx4 v[4:7], v[0:1]
596; GFX8-NEXT:    s_waitcnt vmcnt(0)
597; GFX8-NEXT:    v_mov_b32_e32 v0, v4
598; GFX8-NEXT:    v_mov_b32_e32 v1, v5
599; GFX8-NEXT:    v_mov_b32_e32 v2, v6
600; GFX8-NEXT:    v_mov_b32_e32 v3, v7
601; GFX8-NEXT:    s_setpc_b64 s[30:31]
602;
603; GFX7-LABEL: extractelement_vgpr_v4i128_idx1:
604; GFX7:       ; %bb.0:
605; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
606; GFX7-NEXT:    s_mov_b32 s6, 0
607; GFX7-NEXT:    s_mov_b32 s7, 0xf000
608; GFX7-NEXT:    s_mov_b64 s[4:5], 0
609; GFX7-NEXT:    buffer_load_dwordx4 v[4:7], v[0:1], s[4:7], 0 addr64 offset:16
610; GFX7-NEXT:    s_waitcnt vmcnt(0)
611; GFX7-NEXT:    v_mov_b32_e32 v0, v4
612; GFX7-NEXT:    v_mov_b32_e32 v1, v5
613; GFX7-NEXT:    v_mov_b32_e32 v2, v6
614; GFX7-NEXT:    v_mov_b32_e32 v3, v7
615; GFX7-NEXT:    s_setpc_b64 s[30:31]
616  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
617  %element = extractelement <4 x i128> %vector, i32 1
618  ret i128 %element
619}
620
621define i128 @extractelement_vgpr_v4i128_idx2(<4 x i128> addrspace(1)* %ptr) {
622; GFX9-LABEL: extractelement_vgpr_v4i128_idx2:
623; GFX9:       ; %bb.0:
624; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
625; GFX9-NEXT:    global_load_dwordx4 v[8:11], v[0:1], off offset:32
626; GFX9-NEXT:    s_waitcnt vmcnt(0)
627; GFX9-NEXT:    v_mov_b32_e32 v0, v8
628; GFX9-NEXT:    v_mov_b32_e32 v1, v9
629; GFX9-NEXT:    v_mov_b32_e32 v2, v10
630; GFX9-NEXT:    v_mov_b32_e32 v3, v11
631; GFX9-NEXT:    s_setpc_b64 s[30:31]
632;
633; GFX8-LABEL: extractelement_vgpr_v4i128_idx2:
634; GFX8:       ; %bb.0:
635; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
636; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 32, v0
637; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
638; GFX8-NEXT:    flat_load_dwordx4 v[8:11], v[0:1]
639; GFX8-NEXT:    s_waitcnt vmcnt(0)
640; GFX8-NEXT:    v_mov_b32_e32 v0, v8
641; GFX8-NEXT:    v_mov_b32_e32 v1, v9
642; GFX8-NEXT:    v_mov_b32_e32 v2, v10
643; GFX8-NEXT:    v_mov_b32_e32 v3, v11
644; GFX8-NEXT:    s_setpc_b64 s[30:31]
645;
646; GFX7-LABEL: extractelement_vgpr_v4i128_idx2:
647; GFX7:       ; %bb.0:
648; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
649; GFX7-NEXT:    s_mov_b32 s6, 0
650; GFX7-NEXT:    s_mov_b32 s7, 0xf000
651; GFX7-NEXT:    s_mov_b64 s[4:5], 0
652; GFX7-NEXT:    buffer_load_dwordx4 v[8:11], v[0:1], s[4:7], 0 addr64 offset:32
653; GFX7-NEXT:    s_waitcnt vmcnt(0)
654; GFX7-NEXT:    v_mov_b32_e32 v0, v8
655; GFX7-NEXT:    v_mov_b32_e32 v1, v9
656; GFX7-NEXT:    v_mov_b32_e32 v2, v10
657; GFX7-NEXT:    v_mov_b32_e32 v3, v11
658; GFX7-NEXT:    s_setpc_b64 s[30:31]
659  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
660  %element = extractelement <4 x i128> %vector, i32 2
661  ret i128 %element
662}
663
664define i128 @extractelement_vgpr_v4i128_idx3(<4 x i128> addrspace(1)* %ptr) {
665; GFX9-LABEL: extractelement_vgpr_v4i128_idx3:
666; GFX9:       ; %bb.0:
667; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
668; GFX9-NEXT:    global_load_dwordx4 v[12:15], v[0:1], off offset:48
669; GFX9-NEXT:    s_waitcnt vmcnt(0)
670; GFX9-NEXT:    v_mov_b32_e32 v0, v12
671; GFX9-NEXT:    v_mov_b32_e32 v1, v13
672; GFX9-NEXT:    v_mov_b32_e32 v2, v14
673; GFX9-NEXT:    v_mov_b32_e32 v3, v15
674; GFX9-NEXT:    s_setpc_b64 s[30:31]
675;
676; GFX8-LABEL: extractelement_vgpr_v4i128_idx3:
677; GFX8:       ; %bb.0:
678; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
679; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 48, v0
680; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
681; GFX8-NEXT:    flat_load_dwordx4 v[12:15], v[0:1]
682; GFX8-NEXT:    s_waitcnt vmcnt(0)
683; GFX8-NEXT:    v_mov_b32_e32 v0, v12
684; GFX8-NEXT:    v_mov_b32_e32 v1, v13
685; GFX8-NEXT:    v_mov_b32_e32 v2, v14
686; GFX8-NEXT:    v_mov_b32_e32 v3, v15
687; GFX8-NEXT:    s_setpc_b64 s[30:31]
688;
689; GFX7-LABEL: extractelement_vgpr_v4i128_idx3:
690; GFX7:       ; %bb.0:
691; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
692; GFX7-NEXT:    s_mov_b32 s6, 0
693; GFX7-NEXT:    s_mov_b32 s7, 0xf000
694; GFX7-NEXT:    s_mov_b64 s[4:5], 0
695; GFX7-NEXT:    buffer_load_dwordx4 v[12:15], v[0:1], s[4:7], 0 addr64 offset:48
696; GFX7-NEXT:    s_waitcnt vmcnt(0)
697; GFX7-NEXT:    v_mov_b32_e32 v0, v12
698; GFX7-NEXT:    v_mov_b32_e32 v1, v13
699; GFX7-NEXT:    v_mov_b32_e32 v2, v14
700; GFX7-NEXT:    v_mov_b32_e32 v3, v15
701; GFX7-NEXT:    s_setpc_b64 s[30:31]
702  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
703  %element = extractelement <4 x i128> %vector, i32 3
704  ret i128 %element
705}
706