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; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s
7
8define amdgpu_ps i128 @extractelement_sgpr_v4i128_sgpr_idx(<4 x i128> addrspace(4)* inreg %ptr, i32 inreg %idx) {
9; GCN-LABEL: extractelement_sgpr_v4i128_sgpr_idx:
10; GCN:       ; %bb.0:
11; GCN-NEXT:    s_load_dwordx16 s[8:23], s[2:3], 0x0
12; GCN-NEXT:    s_lshl_b32 m0, s4, 1
13; GCN-NEXT:    s_waitcnt lgkmcnt(0)
14; GCN-NEXT:    s_movrels_b64 s[0:1], s[8:9]
15; GCN-NEXT:    s_movrels_b64 s[2:3], s[10:11]
16; GCN-NEXT:    ; return to shader part epilog
17;
18; GFX10-LABEL: extractelement_sgpr_v4i128_sgpr_idx:
19; GFX10:       ; %bb.0:
20; GFX10-NEXT:    s_load_dwordx16 s[8:23], s[2:3], 0x0
21; GFX10-NEXT:    s_lshl_b32 m0, s4, 1
22; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
23; GFX10-NEXT:    s_movrels_b64 s[0:1], s[8:9]
24; GFX10-NEXT:    s_movrels_b64 s[2:3], s[10:11]
25; GFX10-NEXT:    ; return to shader part epilog
26;
27; GFX11-LABEL: extractelement_sgpr_v4i128_sgpr_idx:
28; GFX11:       ; %bb.0:
29; GFX11-NEXT:    s_load_b512 s[8:23], s[2:3], 0x0
30; GFX11-NEXT:    s_lshl_b32 m0, s4, 1
31; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
32; GFX11-NEXT:    s_movrels_b64 s[0:1], s[8:9]
33; GFX11-NEXT:    s_movrels_b64 s[2:3], s[10:11]
34; GFX11-NEXT:    ; return to shader part epilog
35  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
36  %element = extractelement <4 x i128> %vector, i32 %idx
37  ret i128 %element
38}
39
40define amdgpu_ps i128 @extractelement_vgpr_v4i128_sgpr_idx(<4 x i128> addrspace(1)* %ptr, i32 inreg %idx) {
41; GFX9-LABEL: extractelement_vgpr_v4i128_sgpr_idx:
42; GFX9:       ; %bb.0:
43; GFX9-NEXT:    global_load_dwordx4 v[2:5], v[0:1], off
44; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[0:1], off offset:16
45; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off offset:32
46; GFX9-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off offset:48
47; GFX9-NEXT:    s_lshl_b32 s0, s2, 1
48; GFX9-NEXT:    s_lshl_b32 s2, s0, 1
49; GFX9-NEXT:    s_waitcnt vmcnt(0)
50; GFX9-NEXT:    s_set_gpr_idx_on s2, gpr_idx(SRC0)
51; GFX9-NEXT:    v_mov_b32_e32 v0, v2
52; GFX9-NEXT:    v_mov_b32_e32 v1, v3
53; GFX9-NEXT:    v_mov_b32_e32 v18, v2
54; GFX9-NEXT:    s_set_gpr_idx_off
55; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
56; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
57; GFX9-NEXT:    s_set_gpr_idx_on s2, gpr_idx(SRC0)
58; GFX9-NEXT:    v_mov_b32_e32 v3, v3
59; GFX9-NEXT:    s_set_gpr_idx_off
60; GFX9-NEXT:    v_readfirstlane_b32 s2, v18
61; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
62; GFX9-NEXT:    ; return to shader part epilog
63;
64; GFX8-LABEL: extractelement_vgpr_v4i128_sgpr_idx:
65; GFX8:       ; %bb.0:
66; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 16, v0
67; GFX8-NEXT:    v_addc_u32_e32 v7, vcc, 0, v1, vcc
68; GFX8-NEXT:    v_add_u32_e32 v10, vcc, 32, v0
69; GFX8-NEXT:    v_addc_u32_e32 v11, vcc, 0, v1, vcc
70; GFX8-NEXT:    flat_load_dwordx4 v[2:5], v[0:1]
71; GFX8-NEXT:    flat_load_dwordx4 v[6:9], v[6:7]
72; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 48, v0
73; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
74; GFX8-NEXT:    flat_load_dwordx4 v[10:13], v[10:11]
75; GFX8-NEXT:    flat_load_dwordx4 v[14:17], v[0:1]
76; GFX8-NEXT:    s_lshl_b32 s0, s2, 1
77; GFX8-NEXT:    s_lshl_b32 m0, s0, 1
78; GFX8-NEXT:    s_waitcnt vmcnt(0)
79; GFX8-NEXT:    v_movrels_b32_e32 v1, v3
80; GFX8-NEXT:    v_movrels_b32_e32 v0, v2
81; GFX8-NEXT:    v_mov_b32_e32 v3, v1
82; GFX8-NEXT:    v_mov_b32_e32 v2, v0
83; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
84; GFX8-NEXT:    v_readfirstlane_b32 s1, v1
85; GFX8-NEXT:    v_readfirstlane_b32 s2, v2
86; GFX8-NEXT:    v_readfirstlane_b32 s3, v3
87; GFX8-NEXT:    ; return to shader part epilog
88;
89; GFX7-LABEL: extractelement_vgpr_v4i128_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_dwordx4 v[2:5], v[0:1], s[4:7], 0 addr64
95; GFX7-NEXT:    buffer_load_dwordx4 v[6:9], v[0:1], s[4:7], 0 addr64 offset:16
96; GFX7-NEXT:    buffer_load_dwordx4 v[10:13], v[0:1], s[4:7], 0 addr64 offset:32
97; GFX7-NEXT:    buffer_load_dwordx4 v[14:17], v[0:1], s[4:7], 0 addr64 offset:48
98; GFX7-NEXT:    s_lshl_b32 s0, s2, 1
99; GFX7-NEXT:    s_lshl_b32 m0, s0, 1
100; GFX7-NEXT:    s_waitcnt vmcnt(0)
101; GFX7-NEXT:    v_movrels_b32_e32 v1, v3
102; GFX7-NEXT:    v_movrels_b32_e32 v0, v2
103; GFX7-NEXT:    v_mov_b32_e32 v3, v1
104; GFX7-NEXT:    v_mov_b32_e32 v2, v0
105; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
106; GFX7-NEXT:    v_readfirstlane_b32 s1, v1
107; GFX7-NEXT:    v_readfirstlane_b32 s2, v2
108; GFX7-NEXT:    v_readfirstlane_b32 s3, v3
109; GFX7-NEXT:    ; return to shader part epilog
110;
111; GFX10-LABEL: extractelement_vgpr_v4i128_sgpr_idx:
112; GFX10:       ; %bb.0:
113; GFX10-NEXT:    s_clause 0x3
114; GFX10-NEXT:    global_load_dwordx4 v[2:5], v[0:1], off
115; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[0:1], off offset:16
116; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off offset:32
117; GFX10-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off offset:48
118; GFX10-NEXT:    s_lshl_b32 s0, s2, 1
119; GFX10-NEXT:    s_lshl_b32 m0, s0, 1
120; GFX10-NEXT:    s_waitcnt vmcnt(0)
121; GFX10-NEXT:    v_movrels_b32_e32 v1, v3
122; GFX10-NEXT:    v_movrels_b32_e32 v0, v2
123; GFX10-NEXT:    v_mov_b32_e32 v3, v1
124; GFX10-NEXT:    v_mov_b32_e32 v2, v0
125; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
126; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
127; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
128; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
129; GFX10-NEXT:    ; return to shader part epilog
130;
131; GFX11-LABEL: extractelement_vgpr_v4i128_sgpr_idx:
132; GFX11:       ; %bb.0:
133; GFX11-NEXT:    s_clause 0x3
134; GFX11-NEXT:    global_load_b128 v[2:5], v[0:1], off
135; GFX11-NEXT:    global_load_b128 v[6:9], v[0:1], off offset:16
136; GFX11-NEXT:    global_load_b128 v[10:13], v[0:1], off offset:32
137; GFX11-NEXT:    global_load_b128 v[14:17], v[0:1], off offset:48
138; GFX11-NEXT:    s_lshl_b32 s0, s2, 1
139; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_3) | instid1(VALU_DEP_2)
140; GFX11-NEXT:    s_lshl_b32 m0, s0, 1
141; GFX11-NEXT:    s_waitcnt vmcnt(0)
142; GFX11-NEXT:    v_movrels_b32_e32 v0, v2
143; GFX11-NEXT:    v_movrels_b32_e32 v1, v3
144; GFX11-NEXT:    v_readfirstlane_b32 s0, v0
145; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
146; GFX11-NEXT:    v_dual_mov_b32 v3, v1 :: v_dual_mov_b32 v2, v0
147; GFX11-NEXT:    v_readfirstlane_b32 s1, v1
148; GFX11-NEXT:    v_readfirstlane_b32 s3, v3
149; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3)
150; GFX11-NEXT:    v_readfirstlane_b32 s2, v2
151; GFX11-NEXT:    ; return to shader part epilog
152  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
153  %element = extractelement <4 x i128> %vector, i32 %idx
154  ret i128 %element
155}
156
157define i128 @extractelement_vgpr_v4i128_vgpr_idx(<4 x i128> addrspace(1)* %ptr, i32 %idx) {
158; GFX9-LABEL: extractelement_vgpr_v4i128_vgpr_idx:
159; GFX9:       ; %bb.0:
160; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
161; GFX9-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
162; GFX9-NEXT:    global_load_dwordx4 v[7:10], v[0:1], off offset:16
163; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 1, v2
164; GFX9-NEXT:    v_add_u32_e32 v16, 1, v2
165; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v16
166; GFX9-NEXT:    v_cmp_eq_u32_e64 s[4:5], 1, v2
167; GFX9-NEXT:    v_cmp_eq_u32_e64 s[6:7], 6, v2
168; GFX9-NEXT:    v_cmp_eq_u32_e64 s[8:9], 7, v2
169; GFX9-NEXT:    s_waitcnt vmcnt(1)
170; GFX9-NEXT:    v_cndmask_b32_e64 v11, v3, v5, s[4:5]
171; GFX9-NEXT:    v_cndmask_b32_e64 v12, v4, v6, s[4:5]
172; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v5, vcc
173; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v6, vcc
174; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v2
175; GFX9-NEXT:    s_waitcnt vmcnt(0)
176; GFX9-NEXT:    v_cndmask_b32_e32 v5, v11, v7, vcc
177; GFX9-NEXT:    v_cndmask_b32_e32 v6, v12, v8, vcc
178; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v16
179; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc
180; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v8, vcc
181; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v2
182; GFX9-NEXT:    v_cndmask_b32_e32 v5, v5, v9, vcc
183; GFX9-NEXT:    v_cndmask_b32_e32 v6, v6, v10, vcc
184; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v16
185; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
186; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v10, vcc
187; GFX9-NEXT:    global_load_dwordx4 v[8:11], v[0:1], off offset:32
188; GFX9-NEXT:    global_load_dwordx4 v[12:15], v[0:1], off offset:48
189; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v2
190; GFX9-NEXT:    v_cmp_eq_u32_e64 s[4:5], 7, v16
191; GFX9-NEXT:    s_waitcnt vmcnt(1)
192; GFX9-NEXT:    v_cndmask_b32_e32 v0, v5, v8, vcc
193; GFX9-NEXT:    v_cndmask_b32_e32 v1, v6, v9, vcc
194; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v16
195; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v8, vcc
196; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v9, vcc
197; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v2
198; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v10, vcc
199; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v11, vcc
200; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v16
201; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v10, vcc
202; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v11, vcc
203; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v16
204; GFX9-NEXT:    s_waitcnt vmcnt(0)
205; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v12, vcc
206; GFX9-NEXT:    v_cndmask_b32_e64 v0, v0, v12, s[6:7]
207; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v13, s[6:7]
208; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v13, vcc
209; GFX9-NEXT:    v_cndmask_b32_e64 v0, v0, v14, s[8:9]
210; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v15, s[8:9]
211; GFX9-NEXT:    v_cndmask_b32_e64 v2, v3, v14, s[4:5]
212; GFX9-NEXT:    v_cndmask_b32_e64 v3, v4, v15, s[4:5]
213; GFX9-NEXT:    s_setpc_b64 s[30:31]
214;
215; GFX8-LABEL: extractelement_vgpr_v4i128_vgpr_idx:
216; GFX8:       ; %bb.0:
217; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
218; GFX8-NEXT:    v_add_u32_e32 v3, vcc, 16, v0
219; GFX8-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
220; GFX8-NEXT:    flat_load_dwordx4 v[4:7], v[3:4]
221; GFX8-NEXT:    flat_load_dwordx4 v[8:11], v[0:1]
222; GFX8-NEXT:    v_lshlrev_b32_e32 v16, 1, v2
223; GFX8-NEXT:    v_add_u32_e32 v17, vcc, 1, v16
224; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v17
225; GFX8-NEXT:    v_cmp_eq_u32_e64 s[4:5], 1, v16
226; GFX8-NEXT:    v_cmp_eq_u32_e64 s[6:7], 6, v16
227; GFX8-NEXT:    v_cmp_eq_u32_e64 s[8:9], 7, v16
228; GFX8-NEXT:    s_waitcnt vmcnt(0)
229; GFX8-NEXT:    v_cndmask_b32_e64 v2, v8, v10, s[4:5]
230; GFX8-NEXT:    v_cndmask_b32_e64 v3, v9, v11, s[4:5]
231; GFX8-NEXT:    v_cndmask_b32_e32 v8, v8, v10, vcc
232; GFX8-NEXT:    v_cndmask_b32_e32 v9, v9, v11, vcc
233; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v16
234; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
235; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v5, vcc
236; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v17
237; GFX8-NEXT:    v_cndmask_b32_e32 v4, v8, v4, vcc
238; GFX8-NEXT:    v_cndmask_b32_e32 v5, v9, v5, vcc
239; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v16
240; GFX8-NEXT:    v_cndmask_b32_e32 v18, v2, v6, vcc
241; GFX8-NEXT:    v_cndmask_b32_e32 v19, v3, v7, vcc
242; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v17
243; GFX8-NEXT:    v_cndmask_b32_e32 v4, v4, v6, vcc
244; GFX8-NEXT:    v_cndmask_b32_e32 v5, v5, v7, vcc
245; GFX8-NEXT:    v_add_u32_e32 v2, vcc, 32, v0
246; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
247; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 48, v0
248; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
249; GFX8-NEXT:    flat_load_dwordx4 v[8:11], v[2:3]
250; GFX8-NEXT:    flat_load_dwordx4 v[12:15], v[0:1]
251; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v16
252; GFX8-NEXT:    v_cmp_eq_u32_e64 s[4:5], 7, v17
253; GFX8-NEXT:    s_waitcnt vmcnt(1)
254; GFX8-NEXT:    v_cndmask_b32_e32 v0, v18, v8, vcc
255; GFX8-NEXT:    v_cndmask_b32_e32 v1, v19, v9, vcc
256; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v17
257; GFX8-NEXT:    v_cndmask_b32_e32 v2, v4, v8, vcc
258; GFX8-NEXT:    v_cndmask_b32_e32 v3, v5, v9, vcc
259; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v16
260; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v10, vcc
261; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v11, vcc
262; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v17
263; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
264; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
265; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v17
266; GFX8-NEXT:    s_waitcnt vmcnt(0)
267; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
268; GFX8-NEXT:    v_cndmask_b32_e64 v0, v0, v12, s[6:7]
269; GFX8-NEXT:    v_cndmask_b32_e64 v1, v1, v13, s[6:7]
270; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
271; GFX8-NEXT:    v_cndmask_b32_e64 v0, v0, v14, s[8:9]
272; GFX8-NEXT:    v_cndmask_b32_e64 v1, v1, v15, s[8:9]
273; GFX8-NEXT:    v_cndmask_b32_e64 v2, v2, v14, s[4:5]
274; GFX8-NEXT:    v_cndmask_b32_e64 v3, v3, v15, s[4:5]
275; GFX8-NEXT:    s_setpc_b64 s[30:31]
276;
277; GFX7-LABEL: extractelement_vgpr_v4i128_vgpr_idx:
278; GFX7:       ; %bb.0:
279; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
280; GFX7-NEXT:    s_mov_b32 s10, 0
281; GFX7-NEXT:    s_mov_b32 s11, 0xf000
282; GFX7-NEXT:    s_mov_b64 s[8:9], 0
283; GFX7-NEXT:    buffer_load_dwordx4 v[3:6], v[0:1], s[8:11], 0 addr64
284; GFX7-NEXT:    buffer_load_dwordx4 v[7:10], v[0:1], s[8:11], 0 addr64 offset:16
285; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 1, v2
286; GFX7-NEXT:    v_add_i32_e32 v16, vcc, 1, v2
287; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v16
288; GFX7-NEXT:    v_cmp_eq_u32_e64 s[4:5], 1, v2
289; GFX7-NEXT:    v_cmp_eq_u32_e64 s[6:7], 6, v2
290; GFX7-NEXT:    s_waitcnt vmcnt(1)
291; GFX7-NEXT:    v_cndmask_b32_e64 v11, v3, v5, s[4:5]
292; GFX7-NEXT:    v_cndmask_b32_e64 v12, v4, v6, s[4:5]
293; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v5, vcc
294; GFX7-NEXT:    v_cndmask_b32_e32 v4, v4, v6, vcc
295; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v2
296; GFX7-NEXT:    s_waitcnt vmcnt(0)
297; GFX7-NEXT:    v_cndmask_b32_e32 v5, v11, v7, vcc
298; GFX7-NEXT:    v_cndmask_b32_e32 v6, v12, v8, vcc
299; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v16
300; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v7, vcc
301; GFX7-NEXT:    v_cndmask_b32_e32 v4, v4, v8, vcc
302; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v2
303; GFX7-NEXT:    v_cndmask_b32_e32 v5, v5, v9, vcc
304; GFX7-NEXT:    v_cndmask_b32_e32 v6, v6, v10, vcc
305; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v16
306; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
307; GFX7-NEXT:    v_cndmask_b32_e32 v4, v4, v10, vcc
308; GFX7-NEXT:    buffer_load_dwordx4 v[8:11], v[0:1], s[8:11], 0 addr64 offset:32
309; GFX7-NEXT:    buffer_load_dwordx4 v[12:15], v[0:1], s[8:11], 0 addr64 offset:48
310; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v2
311; GFX7-NEXT:    v_cmp_eq_u32_e64 s[4:5], 7, v16
312; GFX7-NEXT:    v_cmp_eq_u32_e64 s[8:9], 7, v2
313; GFX7-NEXT:    s_waitcnt vmcnt(1)
314; GFX7-NEXT:    v_cndmask_b32_e32 v0, v5, v8, vcc
315; GFX7-NEXT:    v_cndmask_b32_e32 v1, v6, v9, vcc
316; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v16
317; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v8, vcc
318; GFX7-NEXT:    v_cndmask_b32_e32 v4, v4, v9, vcc
319; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v2
320; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v10, vcc
321; GFX7-NEXT:    v_cndmask_b32_e32 v1, v1, v11, vcc
322; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v16
323; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v10, vcc
324; GFX7-NEXT:    v_cndmask_b32_e32 v4, v4, v11, vcc
325; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v16
326; GFX7-NEXT:    s_waitcnt vmcnt(0)
327; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v12, vcc
328; GFX7-NEXT:    v_cndmask_b32_e64 v0, v0, v12, s[6:7]
329; GFX7-NEXT:    v_cndmask_b32_e64 v1, v1, v13, s[6:7]
330; GFX7-NEXT:    v_cndmask_b32_e32 v4, v4, v13, vcc
331; GFX7-NEXT:    v_cndmask_b32_e64 v0, v0, v14, s[8:9]
332; GFX7-NEXT:    v_cndmask_b32_e64 v1, v1, v15, s[8:9]
333; GFX7-NEXT:    v_cndmask_b32_e64 v2, v3, v14, s[4:5]
334; GFX7-NEXT:    v_cndmask_b32_e64 v3, v4, v15, s[4:5]
335; GFX7-NEXT:    s_setpc_b64 s[30:31]
336;
337; GFX10-LABEL: extractelement_vgpr_v4i128_vgpr_idx:
338; GFX10:       ; %bb.0:
339; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
340; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
341; GFX10-NEXT:    s_clause 0x1
342; GFX10-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
343; GFX10-NEXT:    global_load_dwordx4 v[7:10], v[0:1], off offset:16
344; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 1, v2
345; GFX10-NEXT:    global_load_dwordx4 v[11:14], v[0:1], off offset:32
346; GFX10-NEXT:    v_add_nc_u32_e32 v19, 1, v2
347; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v2
348; GFX10-NEXT:    v_cmp_eq_u32_e64 s4, 1, v19
349; GFX10-NEXT:    s_waitcnt vmcnt(2)
350; GFX10-NEXT:    v_cndmask_b32_e32 v15, v3, v5, vcc_lo
351; GFX10-NEXT:    v_cndmask_b32_e32 v16, v4, v6, vcc_lo
352; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v2
353; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v5, s4
354; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, v6, s4
355; GFX10-NEXT:    v_cmp_eq_u32_e64 s4, 2, v19
356; GFX10-NEXT:    s_waitcnt vmcnt(1)
357; GFX10-NEXT:    v_cndmask_b32_e32 v5, v15, v7, vcc_lo
358; GFX10-NEXT:    v_cndmask_b32_e32 v6, v16, v8, vcc_lo
359; GFX10-NEXT:    global_load_dwordx4 v[15:18], v[0:1], off offset:48
360; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v7, s4
361; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v2
362; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, v8, s4
363; GFX10-NEXT:    v_cmp_eq_u32_e64 s4, 3, v19
364; GFX10-NEXT:    v_cndmask_b32_e32 v5, v5, v9, vcc_lo
365; GFX10-NEXT:    v_cndmask_b32_e32 v6, v6, v10, vcc_lo
366; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v9, s4
367; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, v10, s4
368; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 4, v2
369; GFX10-NEXT:    v_cmp_eq_u32_e64 s4, 4, v19
370; GFX10-NEXT:    s_waitcnt vmcnt(1)
371; GFX10-NEXT:    v_cndmask_b32_e32 v0, v5, v11, vcc_lo
372; GFX10-NEXT:    v_cndmask_b32_e32 v1, v6, v12, vcc_lo
373; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 5, v2
374; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v11, s4
375; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, v12, s4
376; GFX10-NEXT:    v_cmp_eq_u32_e64 s4, 5, v19
377; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v13, vcc_lo
378; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v14, vcc_lo
379; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 6, v2
380; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v13, s4
381; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, v14, s4
382; GFX10-NEXT:    v_cmp_eq_u32_e64 s4, 6, v19
383; GFX10-NEXT:    s_waitcnt vmcnt(0)
384; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v15, vcc_lo
385; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v16, vcc_lo
386; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, v15, s4
387; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 7, v2
388; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, v16, s4
389; GFX10-NEXT:    v_cmp_eq_u32_e64 s4, 7, v19
390; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v17, vcc_lo
391; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v18, vcc_lo
392; GFX10-NEXT:    v_cndmask_b32_e64 v2, v3, v17, s4
393; GFX10-NEXT:    v_cndmask_b32_e64 v3, v4, v18, s4
394; GFX10-NEXT:    s_setpc_b64 s[30:31]
395;
396; GFX11-LABEL: extractelement_vgpr_v4i128_vgpr_idx:
397; GFX11:       ; %bb.0:
398; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
399; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
400; GFX11-NEXT:    s_clause 0x3
401; GFX11-NEXT:    global_load_b128 v[3:6], v[0:1], off
402; GFX11-NEXT:    global_load_b128 v[7:10], v[0:1], off offset:16
403; GFX11-NEXT:    global_load_b128 v[11:14], v[0:1], off offset:32
404; GFX11-NEXT:    global_load_b128 v[15:18], v[0:1], off offset:48
405; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 1, v2
406; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_2)
407; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v2
408; GFX11-NEXT:    s_waitcnt vmcnt(3)
409; GFX11-NEXT:    v_dual_cndmask_b32 v20, v3, v5 :: v_dual_cndmask_b32 v21, v4, v6
410; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v2
411; GFX11-NEXT:    s_waitcnt vmcnt(2)
412; GFX11-NEXT:    v_cndmask_b32_e32 v1, v21, v8, vcc_lo
413; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_2)
414; GFX11-NEXT:    v_dual_cndmask_b32 v0, v20, v7 :: v_dual_add_nc_u32 v19, 1, v2
415; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v2
416; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 1, v19
417; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3)
418; GFX11-NEXT:    v_dual_cndmask_b32 v0, v0, v9 :: v_dual_cndmask_b32 v1, v1, v10
419; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 4, v2
420; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, v5, s0
421; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, v6, s0
422; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 2, v19
423; GFX11-NEXT:    s_waitcnt vmcnt(1)
424; GFX11-NEXT:    v_dual_cndmask_b32 v0, v0, v11 :: v_dual_cndmask_b32 v1, v1, v12
425; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 5, v2
426; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_4) | instid1(VALU_DEP_3)
427; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, v7, s0
428; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, v8, s0
429; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 3, v19
430; GFX11-NEXT:    v_dual_cndmask_b32 v0, v0, v13 :: v_dual_cndmask_b32 v1, v1, v14
431; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 6, v2
432; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, v9, s0
433; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, v10, s0
434; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 4, v19
435; GFX11-NEXT:    s_waitcnt vmcnt(0)
436; GFX11-NEXT:    v_dual_cndmask_b32 v0, v0, v15 :: v_dual_cndmask_b32 v1, v1, v16
437; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 7, v2
438; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_2)
439; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, v11, s0
440; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, v12, s0
441; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 5, v19
442; GFX11-NEXT:    v_dual_cndmask_b32 v0, v0, v17 :: v_dual_cndmask_b32 v1, v1, v18
443; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, v13, s0
444; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_1)
445; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, v14, s0
446; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 6, v19
447; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, v15, s0
448; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_1)
449; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, v16, s0
450; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 7, v19
451; GFX11-NEXT:    v_cndmask_b32_e64 v2, v3, v17, s0
452; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3)
453; GFX11-NEXT:    v_cndmask_b32_e64 v3, v4, v18, s0
454; GFX11-NEXT:    s_setpc_b64 s[30:31]
455  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
456  %element = extractelement <4 x i128> %vector, i32 %idx
457  ret i128 %element
458}
459
460define amdgpu_ps i128 @extractelement_sgpr_v4i128_vgpr_idx(<4 x i128> addrspace(4)* inreg %ptr, i32 %idx) {
461; GFX9-LABEL: extractelement_sgpr_v4i128_vgpr_idx:
462; GFX9:       ; %bb.0:
463; GFX9-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
464; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
465; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
466; GFX9-NEXT:    v_add_u32_e32 v19, 1, v0
467; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
468; GFX9-NEXT:    v_mov_b32_e32 v1, s0
469; GFX9-NEXT:    v_mov_b32_e32 v2, s1
470; GFX9-NEXT:    v_mov_b32_e32 v3, s2
471; GFX9-NEXT:    v_mov_b32_e32 v4, s3
472; GFX9-NEXT:    v_mov_b32_e32 v5, s4
473; GFX9-NEXT:    v_mov_b32_e32 v6, s5
474; GFX9-NEXT:    v_cndmask_b32_e32 v17, v1, v3, vcc
475; GFX9-NEXT:    v_cndmask_b32_e32 v18, v2, v4, vcc
476; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
477; GFX9-NEXT:    v_mov_b32_e32 v7, s6
478; GFX9-NEXT:    v_mov_b32_e32 v8, s7
479; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v5, vcc
480; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v6, vcc
481; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
482; GFX9-NEXT:    v_mov_b32_e32 v9, s8
483; GFX9-NEXT:    v_mov_b32_e32 v10, s9
484; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v7, vcc
485; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v8, vcc
486; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v0
487; GFX9-NEXT:    v_mov_b32_e32 v11, s10
488; GFX9-NEXT:    v_mov_b32_e32 v12, s11
489; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v9, vcc
490; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v10, vcc
491; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v0
492; GFX9-NEXT:    v_mov_b32_e32 v13, s12
493; GFX9-NEXT:    v_mov_b32_e32 v14, s13
494; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v11, vcc
495; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v12, vcc
496; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v0
497; GFX9-NEXT:    v_cndmask_b32_e32 v17, v17, v13, vcc
498; GFX9-NEXT:    v_cndmask_b32_e32 v18, v18, v14, vcc
499; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v19
500; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
501; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
502; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], 2, v19
503; GFX9-NEXT:    v_mov_b32_e32 v15, s14
504; GFX9-NEXT:    v_mov_b32_e32 v16, s15
505; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v0
506; GFX9-NEXT:    v_cndmask_b32_e64 v1, v1, v5, s[0:1]
507; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v6, s[0:1]
508; GFX9-NEXT:    v_cmp_eq_u32_e64 s[0:1], 3, v19
509; GFX9-NEXT:    v_cndmask_b32_e32 v0, v17, v15, vcc
510; GFX9-NEXT:    v_cndmask_b32_e64 v3, v1, v7, s[0:1]
511; GFX9-NEXT:    v_cndmask_b32_e32 v1, v18, v16, vcc
512; GFX9-NEXT:    v_cndmask_b32_e64 v2, v2, v8, s[0:1]
513; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v19
514; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
515; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
516; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v19
517; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
518; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
519; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v19
520; GFX9-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
521; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v14, vcc
522; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v19
523; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v15, vcc
524; GFX9-NEXT:    v_cndmask_b32_e32 v3, v4, v16, vcc
525; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
526; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
527; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
528; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
529; GFX9-NEXT:    ; return to shader part epilog
530;
531; GFX8-LABEL: extractelement_sgpr_v4i128_vgpr_idx:
532; GFX8:       ; %bb.0:
533; GFX8-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
534; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
535; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
536; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
537; GFX8-NEXT:    v_mov_b32_e32 v1, s0
538; GFX8-NEXT:    v_mov_b32_e32 v2, s1
539; GFX8-NEXT:    v_mov_b32_e32 v3, s2
540; GFX8-NEXT:    v_mov_b32_e32 v4, s3
541; GFX8-NEXT:    v_mov_b32_e32 v5, s4
542; GFX8-NEXT:    v_mov_b32_e32 v6, s5
543; GFX8-NEXT:    v_cndmask_b32_e32 v17, v1, v3, vcc
544; GFX8-NEXT:    v_cndmask_b32_e32 v18, v2, v4, vcc
545; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
546; GFX8-NEXT:    v_mov_b32_e32 v7, s6
547; GFX8-NEXT:    v_mov_b32_e32 v8, s7
548; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v5, vcc
549; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v6, vcc
550; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
551; GFX8-NEXT:    v_mov_b32_e32 v9, s8
552; GFX8-NEXT:    v_mov_b32_e32 v10, s9
553; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v7, vcc
554; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v8, vcc
555; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v0
556; GFX8-NEXT:    v_mov_b32_e32 v11, s10
557; GFX8-NEXT:    v_mov_b32_e32 v12, s11
558; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v9, vcc
559; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v10, vcc
560; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v0
561; GFX8-NEXT:    v_mov_b32_e32 v13, s12
562; GFX8-NEXT:    v_mov_b32_e32 v14, s13
563; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v11, vcc
564; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v12, vcc
565; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v0
566; GFX8-NEXT:    v_cndmask_b32_e32 v17, v17, v13, vcc
567; GFX8-NEXT:    v_cndmask_b32_e32 v18, v18, v14, vcc
568; GFX8-NEXT:    v_add_u32_e32 v19, vcc, 1, v0
569; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v19
570; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
571; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
572; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], 2, v19
573; GFX8-NEXT:    v_mov_b32_e32 v15, s14
574; GFX8-NEXT:    v_mov_b32_e32 v16, s15
575; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v0
576; GFX8-NEXT:    v_cndmask_b32_e64 v1, v1, v5, s[0:1]
577; GFX8-NEXT:    v_cndmask_b32_e64 v2, v2, v6, s[0:1]
578; GFX8-NEXT:    v_cmp_eq_u32_e64 s[0:1], 3, v19
579; GFX8-NEXT:    v_cndmask_b32_e32 v0, v17, v15, vcc
580; GFX8-NEXT:    v_cndmask_b32_e64 v3, v1, v7, s[0:1]
581; GFX8-NEXT:    v_cndmask_b32_e32 v1, v18, v16, vcc
582; GFX8-NEXT:    v_cndmask_b32_e64 v2, v2, v8, s[0:1]
583; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v19
584; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
585; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
586; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v19
587; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
588; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
589; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v19
590; GFX8-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
591; GFX8-NEXT:    v_cndmask_b32_e32 v4, v2, v14, vcc
592; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v19
593; GFX8-NEXT:    v_cndmask_b32_e32 v2, v3, v15, vcc
594; GFX8-NEXT:    v_cndmask_b32_e32 v3, v4, v16, vcc
595; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
596; GFX8-NEXT:    v_readfirstlane_b32 s1, v1
597; GFX8-NEXT:    v_readfirstlane_b32 s2, v2
598; GFX8-NEXT:    v_readfirstlane_b32 s3, v3
599; GFX8-NEXT:    ; return to shader part epilog
600;
601; GFX7-LABEL: extractelement_sgpr_v4i128_vgpr_idx:
602; GFX7:       ; %bb.0:
603; GFX7-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
604; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
605; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
606; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
607; GFX7-NEXT:    v_mov_b32_e32 v1, s0
608; GFX7-NEXT:    v_mov_b32_e32 v2, s1
609; GFX7-NEXT:    v_mov_b32_e32 v3, s2
610; GFX7-NEXT:    v_mov_b32_e32 v4, s3
611; GFX7-NEXT:    v_mov_b32_e32 v5, s4
612; GFX7-NEXT:    v_mov_b32_e32 v6, s5
613; GFX7-NEXT:    v_cndmask_b32_e32 v17, v1, v3, vcc
614; GFX7-NEXT:    v_cndmask_b32_e32 v18, v2, v4, vcc
615; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
616; GFX7-NEXT:    v_mov_b32_e32 v7, s6
617; GFX7-NEXT:    v_mov_b32_e32 v8, s7
618; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v5, vcc
619; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v6, vcc
620; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
621; GFX7-NEXT:    v_mov_b32_e32 v9, s8
622; GFX7-NEXT:    v_mov_b32_e32 v10, s9
623; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v7, vcc
624; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v8, vcc
625; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v0
626; GFX7-NEXT:    v_mov_b32_e32 v11, s10
627; GFX7-NEXT:    v_mov_b32_e32 v12, s11
628; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v9, vcc
629; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v10, vcc
630; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v0
631; GFX7-NEXT:    v_mov_b32_e32 v13, s12
632; GFX7-NEXT:    v_mov_b32_e32 v14, s13
633; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v11, vcc
634; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v12, vcc
635; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v0
636; GFX7-NEXT:    v_cndmask_b32_e32 v17, v17, v13, vcc
637; GFX7-NEXT:    v_cndmask_b32_e32 v18, v18, v14, vcc
638; GFX7-NEXT:    v_add_i32_e32 v19, vcc, 1, v0
639; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v19
640; GFX7-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
641; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
642; GFX7-NEXT:    v_cmp_eq_u32_e64 s[0:1], 2, v19
643; GFX7-NEXT:    v_mov_b32_e32 v15, s14
644; GFX7-NEXT:    v_mov_b32_e32 v16, s15
645; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v0
646; GFX7-NEXT:    v_cndmask_b32_e64 v1, v1, v5, s[0:1]
647; GFX7-NEXT:    v_cndmask_b32_e64 v2, v2, v6, s[0:1]
648; GFX7-NEXT:    v_cmp_eq_u32_e64 s[0:1], 3, v19
649; GFX7-NEXT:    v_cndmask_b32_e32 v0, v17, v15, vcc
650; GFX7-NEXT:    v_cndmask_b32_e64 v3, v1, v7, s[0:1]
651; GFX7-NEXT:    v_cndmask_b32_e32 v1, v18, v16, vcc
652; GFX7-NEXT:    v_cndmask_b32_e64 v2, v2, v8, s[0:1]
653; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 4, v19
654; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v9, vcc
655; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v10, vcc
656; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 5, v19
657; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v11, vcc
658; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v12, vcc
659; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 6, v19
660; GFX7-NEXT:    v_cndmask_b32_e32 v3, v3, v13, vcc
661; GFX7-NEXT:    v_cndmask_b32_e32 v4, v2, v14, vcc
662; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 7, v19
663; GFX7-NEXT:    v_cndmask_b32_e32 v2, v3, v15, vcc
664; GFX7-NEXT:    v_cndmask_b32_e32 v3, v4, v16, vcc
665; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
666; GFX7-NEXT:    v_readfirstlane_b32 s1, v1
667; GFX7-NEXT:    v_readfirstlane_b32 s2, v2
668; GFX7-NEXT:    v_readfirstlane_b32 s3, v3
669; GFX7-NEXT:    ; return to shader part epilog
670;
671; GFX10-LABEL: extractelement_sgpr_v4i128_vgpr_idx:
672; GFX10:       ; %bb.0:
673; GFX10-NEXT:    s_load_dwordx16 s[4:19], s[2:3], 0x0
674; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
675; GFX10-NEXT:    v_add_nc_u32_e32 v1, 1, v0
676; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v0
677; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, 1, v1
678; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
679; GFX10-NEXT:    v_mov_b32_e32 v2, s6
680; GFX10-NEXT:    v_mov_b32_e32 v3, s7
681; GFX10-NEXT:    v_cndmask_b32_e32 v4, s4, v2, vcc_lo
682; GFX10-NEXT:    v_cndmask_b32_e32 v5, s5, v3, vcc_lo
683; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v0
684; GFX10-NEXT:    v_cndmask_b32_e64 v2, s4, v2, s0
685; GFX10-NEXT:    v_cndmask_b32_e64 v3, s5, v3, s0
686; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, 2, v1
687; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, s8, vcc_lo
688; GFX10-NEXT:    v_cndmask_b32_e64 v5, v5, s9, vcc_lo
689; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v0
690; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s8, s0
691; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, s9, s0
692; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, 3, v1
693; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, s10, vcc_lo
694; GFX10-NEXT:    v_cndmask_b32_e64 v5, v5, s11, vcc_lo
695; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 4, v0
696; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s10, s0
697; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, s11, s0
698; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, 4, v1
699; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, s12, vcc_lo
700; GFX10-NEXT:    v_cndmask_b32_e64 v5, v5, s13, vcc_lo
701; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 5, v0
702; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s12, s0
703; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, s13, s0
704; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, 5, v1
705; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, s14, vcc_lo
706; GFX10-NEXT:    v_cndmask_b32_e64 v5, v5, s15, vcc_lo
707; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 6, v0
708; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s14, s0
709; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, s15, s0
710; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, 6, v1
711; GFX10-NEXT:    v_cndmask_b32_e64 v4, v4, s16, vcc_lo
712; GFX10-NEXT:    v_cndmask_b32_e64 v5, v5, s17, vcc_lo
713; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 7, v0
714; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s16, s0
715; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, s17, s0
716; GFX10-NEXT:    v_cmp_eq_u32_e64 s0, 7, v1
717; GFX10-NEXT:    v_cndmask_b32_e64 v0, v4, s18, vcc_lo
718; GFX10-NEXT:    v_cndmask_b32_e64 v1, v5, s19, vcc_lo
719; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s18, s0
720; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, s19, s0
721; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
722; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
723; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
724; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
725; GFX10-NEXT:    ; return to shader part epilog
726;
727; GFX11-LABEL: extractelement_sgpr_v4i128_vgpr_idx:
728; GFX11:       ; %bb.0:
729; GFX11-NEXT:    s_load_b512 s[4:19], s[2:3], 0x0
730; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
731; GFX11-NEXT:    v_dual_mov_b32 v3, s7 :: v_dual_lshlrev_b32 v0, 1, v0
732; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
733; GFX11-NEXT:    v_dual_mov_b32 v2, s6 :: v_dual_add_nc_u32 v1, 1, v0
734; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v0
735; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 1, v1
736; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_4)
737; GFX11-NEXT:    v_cndmask_b32_e32 v4, s4, v2, vcc_lo
738; GFX11-NEXT:    v_cndmask_b32_e32 v5, s5, v3, vcc_lo
739; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v0
740; GFX11-NEXT:    v_cndmask_b32_e64 v2, s4, v2, s0
741; GFX11-NEXT:    v_cndmask_b32_e64 v3, s5, v3, s0
742; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 2, v1
743; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, s8, vcc_lo
744; GFX11-NEXT:    v_cndmask_b32_e64 v5, v5, s9, vcc_lo
745; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v0
746; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4)
747; GFX11-NEXT:    v_cndmask_b32_e64 v2, v2, s8, s0
748; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, s9, s0
749; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 3, v1
750; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, s10, vcc_lo
751; GFX11-NEXT:    v_cndmask_b32_e64 v5, v5, s11, vcc_lo
752; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 4, v0
753; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4)
754; GFX11-NEXT:    v_cndmask_b32_e64 v2, v2, s10, s0
755; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, s11, s0
756; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 4, v1
757; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, s12, vcc_lo
758; GFX11-NEXT:    v_cndmask_b32_e64 v5, v5, s13, vcc_lo
759; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 5, v0
760; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4)
761; GFX11-NEXT:    v_cndmask_b32_e64 v2, v2, s12, s0
762; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, s13, s0
763; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 5, v1
764; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, s14, vcc_lo
765; GFX11-NEXT:    v_cndmask_b32_e64 v5, v5, s15, vcc_lo
766; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 6, v0
767; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4)
768; GFX11-NEXT:    v_cndmask_b32_e64 v2, v2, s14, s0
769; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, s15, s0
770; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 6, v1
771; GFX11-NEXT:    v_cndmask_b32_e64 v4, v4, s16, vcc_lo
772; GFX11-NEXT:    v_cndmask_b32_e64 v5, v5, s17, vcc_lo
773; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 7, v0
774; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_4) | instid1(VALU_DEP_3)
775; GFX11-NEXT:    v_cndmask_b32_e64 v2, v2, s16, s0
776; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, s17, s0
777; GFX11-NEXT:    v_cmp_eq_u32_e64 s0, 7, v1
778; GFX11-NEXT:    v_cndmask_b32_e64 v0, v4, s18, vcc_lo
779; GFX11-NEXT:    v_cndmask_b32_e64 v1, v5, s19, vcc_lo
780; GFX11-NEXT:    v_cndmask_b32_e64 v2, v2, s18, s0
781; GFX11-NEXT:    v_cndmask_b32_e64 v3, v3, s19, s0
782; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
783; GFX11-NEXT:    v_readfirstlane_b32 s0, v0
784; GFX11-NEXT:    v_readfirstlane_b32 s1, v1
785; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
786; GFX11-NEXT:    v_readfirstlane_b32 s2, v2
787; GFX11-NEXT:    v_readfirstlane_b32 s3, v3
788; GFX11-NEXT:    ; return to shader part epilog
789  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
790  %element = extractelement <4 x i128> %vector, i32 %idx
791  ret i128 %element
792}
793
794define amdgpu_ps i128 @extractelement_sgpr_v4i128_idx0(<4 x i128> addrspace(4)* inreg %ptr) {
795; GCN-LABEL: extractelement_sgpr_v4i128_idx0:
796; GCN:       ; %bb.0:
797; GCN-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
798; GCN-NEXT:    s_waitcnt lgkmcnt(0)
799; GCN-NEXT:    ; return to shader part epilog
800;
801; GFX10-LABEL: extractelement_sgpr_v4i128_idx0:
802; GFX10:       ; %bb.0:
803; GFX10-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
804; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
805; GFX10-NEXT:    ; return to shader part epilog
806;
807; GFX11-LABEL: extractelement_sgpr_v4i128_idx0:
808; GFX11:       ; %bb.0:
809; GFX11-NEXT:    s_load_b512 s[0:15], s[2:3], 0x0
810; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
811; GFX11-NEXT:    ; return to shader part epilog
812  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
813  %element = extractelement <4 x i128> %vector, i32 0
814  ret i128 %element
815}
816
817define amdgpu_ps i128 @extractelement_sgpr_v4i128_idx1(<4 x i128> addrspace(4)* inreg %ptr) {
818; GCN-LABEL: extractelement_sgpr_v4i128_idx1:
819; GCN:       ; %bb.0:
820; GCN-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
821; GCN-NEXT:    s_waitcnt lgkmcnt(0)
822; GCN-NEXT:    s_mov_b32 s0, s4
823; GCN-NEXT:    s_mov_b32 s1, s5
824; GCN-NEXT:    s_mov_b32 s2, s6
825; GCN-NEXT:    s_mov_b32 s3, s7
826; GCN-NEXT:    ; return to shader part epilog
827;
828; GFX10-LABEL: extractelement_sgpr_v4i128_idx1:
829; GFX10:       ; %bb.0:
830; GFX10-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
831; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
832; GFX10-NEXT:    s_mov_b32 s0, s4
833; GFX10-NEXT:    s_mov_b32 s1, s5
834; GFX10-NEXT:    s_mov_b32 s2, s6
835; GFX10-NEXT:    s_mov_b32 s3, s7
836; GFX10-NEXT:    ; return to shader part epilog
837;
838; GFX11-LABEL: extractelement_sgpr_v4i128_idx1:
839; GFX11:       ; %bb.0:
840; GFX11-NEXT:    s_load_b512 s[0:15], s[2:3], 0x0
841; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
842; GFX11-NEXT:    s_mov_b32 s0, s4
843; GFX11-NEXT:    s_mov_b32 s1, s5
844; GFX11-NEXT:    s_mov_b32 s2, s6
845; GFX11-NEXT:    s_mov_b32 s3, s7
846; GFX11-NEXT:    ; return to shader part epilog
847  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
848  %element = extractelement <4 x i128> %vector, i32 1
849  ret i128 %element
850}
851
852define amdgpu_ps i128 @extractelement_sgpr_v4i128_idx2(<4 x i128> addrspace(4)* inreg %ptr) {
853; GCN-LABEL: extractelement_sgpr_v4i128_idx2:
854; GCN:       ; %bb.0:
855; GCN-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
856; GCN-NEXT:    s_waitcnt lgkmcnt(0)
857; GCN-NEXT:    s_mov_b32 s0, s8
858; GCN-NEXT:    s_mov_b32 s1, s9
859; GCN-NEXT:    s_mov_b32 s2, s10
860; GCN-NEXT:    s_mov_b32 s3, s11
861; GCN-NEXT:    ; return to shader part epilog
862;
863; GFX10-LABEL: extractelement_sgpr_v4i128_idx2:
864; GFX10:       ; %bb.0:
865; GFX10-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
866; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
867; GFX10-NEXT:    s_mov_b32 s0, s8
868; GFX10-NEXT:    s_mov_b32 s1, s9
869; GFX10-NEXT:    s_mov_b32 s2, s10
870; GFX10-NEXT:    s_mov_b32 s3, s11
871; GFX10-NEXT:    ; return to shader part epilog
872;
873; GFX11-LABEL: extractelement_sgpr_v4i128_idx2:
874; GFX11:       ; %bb.0:
875; GFX11-NEXT:    s_load_b512 s[0:15], s[2:3], 0x0
876; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
877; GFX11-NEXT:    s_mov_b32 s0, s8
878; GFX11-NEXT:    s_mov_b32 s1, s9
879; GFX11-NEXT:    s_mov_b32 s2, s10
880; GFX11-NEXT:    s_mov_b32 s3, s11
881; GFX11-NEXT:    ; return to shader part epilog
882  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
883  %element = extractelement <4 x i128> %vector, i32 2
884  ret i128 %element
885}
886
887define amdgpu_ps i128 @extractelement_sgpr_v4i128_idx3(<4 x i128> addrspace(4)* inreg %ptr) {
888; GCN-LABEL: extractelement_sgpr_v4i128_idx3:
889; GCN:       ; %bb.0:
890; GCN-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
891; GCN-NEXT:    s_waitcnt lgkmcnt(0)
892; GCN-NEXT:    s_mov_b32 s0, s12
893; GCN-NEXT:    s_mov_b32 s1, s13
894; GCN-NEXT:    s_mov_b32 s2, s14
895; GCN-NEXT:    s_mov_b32 s3, s15
896; GCN-NEXT:    ; return to shader part epilog
897;
898; GFX10-LABEL: extractelement_sgpr_v4i128_idx3:
899; GFX10:       ; %bb.0:
900; GFX10-NEXT:    s_load_dwordx16 s[0:15], s[2:3], 0x0
901; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
902; GFX10-NEXT:    s_mov_b32 s0, s12
903; GFX10-NEXT:    s_mov_b32 s1, s13
904; GFX10-NEXT:    s_mov_b32 s2, s14
905; GFX10-NEXT:    s_mov_b32 s3, s15
906; GFX10-NEXT:    ; return to shader part epilog
907;
908; GFX11-LABEL: extractelement_sgpr_v4i128_idx3:
909; GFX11:       ; %bb.0:
910; GFX11-NEXT:    s_load_b512 s[0:15], s[2:3], 0x0
911; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
912; GFX11-NEXT:    s_mov_b32 s0, s12
913; GFX11-NEXT:    s_mov_b32 s1, s13
914; GFX11-NEXT:    s_mov_b32 s2, s14
915; GFX11-NEXT:    s_mov_b32 s3, s15
916; GFX11-NEXT:    ; return to shader part epilog
917  %vector = load <4 x i128>, <4 x i128> addrspace(4)* %ptr
918  %element = extractelement <4 x i128> %vector, i32 3
919  ret i128 %element
920}
921
922define i128 @extractelement_vgpr_v4i128_idx0(<4 x i128> addrspace(1)* %ptr) {
923; GFX9-LABEL: extractelement_vgpr_v4i128_idx0:
924; GFX9:       ; %bb.0:
925; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
926; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
927; GFX9-NEXT:    s_waitcnt vmcnt(0)
928; GFX9-NEXT:    s_setpc_b64 s[30:31]
929;
930; GFX8-LABEL: extractelement_vgpr_v4i128_idx0:
931; GFX8:       ; %bb.0:
932; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
933; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
934; GFX8-NEXT:    s_waitcnt vmcnt(0)
935; GFX8-NEXT:    s_setpc_b64 s[30:31]
936;
937; GFX7-LABEL: extractelement_vgpr_v4i128_idx0:
938; GFX7:       ; %bb.0:
939; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
940; GFX7-NEXT:    s_mov_b32 s6, 0
941; GFX7-NEXT:    s_mov_b32 s7, 0xf000
942; GFX7-NEXT:    s_mov_b64 s[4:5], 0
943; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
944; GFX7-NEXT:    s_waitcnt vmcnt(0)
945; GFX7-NEXT:    s_setpc_b64 s[30:31]
946;
947; GFX10-LABEL: extractelement_vgpr_v4i128_idx0:
948; GFX10:       ; %bb.0:
949; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
950; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
951; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
952; GFX10-NEXT:    s_waitcnt vmcnt(0)
953; GFX10-NEXT:    s_setpc_b64 s[30:31]
954;
955; GFX11-LABEL: extractelement_vgpr_v4i128_idx0:
956; GFX11:       ; %bb.0:
957; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
958; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
959; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
960; GFX11-NEXT:    s_waitcnt vmcnt(0)
961; GFX11-NEXT:    s_setpc_b64 s[30:31]
962  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
963  %element = extractelement <4 x i128> %vector, i32 0
964  ret i128 %element
965}
966
967define i128 @extractelement_vgpr_v4i128_idx1(<4 x i128> addrspace(1)* %ptr) {
968; GFX9-LABEL: extractelement_vgpr_v4i128_idx1:
969; GFX9:       ; %bb.0:
970; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
971; GFX9-NEXT:    global_load_dwordx4 v[4:7], v[0:1], off offset:16
972; GFX9-NEXT:    s_waitcnt vmcnt(0)
973; GFX9-NEXT:    v_mov_b32_e32 v0, v4
974; GFX9-NEXT:    v_mov_b32_e32 v1, v5
975; GFX9-NEXT:    v_mov_b32_e32 v2, v6
976; GFX9-NEXT:    v_mov_b32_e32 v3, v7
977; GFX9-NEXT:    s_setpc_b64 s[30:31]
978;
979; GFX8-LABEL: extractelement_vgpr_v4i128_idx1:
980; GFX8:       ; %bb.0:
981; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
982; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
983; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
984; GFX8-NEXT:    flat_load_dwordx4 v[4:7], v[0:1]
985; GFX8-NEXT:    s_waitcnt vmcnt(0)
986; GFX8-NEXT:    v_mov_b32_e32 v0, v4
987; GFX8-NEXT:    v_mov_b32_e32 v1, v5
988; GFX8-NEXT:    v_mov_b32_e32 v2, v6
989; GFX8-NEXT:    v_mov_b32_e32 v3, v7
990; GFX8-NEXT:    s_setpc_b64 s[30:31]
991;
992; GFX7-LABEL: extractelement_vgpr_v4i128_idx1:
993; GFX7:       ; %bb.0:
994; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
995; GFX7-NEXT:    s_mov_b32 s6, 0
996; GFX7-NEXT:    s_mov_b32 s7, 0xf000
997; GFX7-NEXT:    s_mov_b64 s[4:5], 0
998; GFX7-NEXT:    buffer_load_dwordx4 v[4:7], v[0:1], s[4:7], 0 addr64 offset:16
999; GFX7-NEXT:    s_waitcnt vmcnt(0)
1000; GFX7-NEXT:    v_mov_b32_e32 v0, v4
1001; GFX7-NEXT:    v_mov_b32_e32 v1, v5
1002; GFX7-NEXT:    v_mov_b32_e32 v2, v6
1003; GFX7-NEXT:    v_mov_b32_e32 v3, v7
1004; GFX7-NEXT:    s_setpc_b64 s[30:31]
1005;
1006; GFX10-LABEL: extractelement_vgpr_v4i128_idx1:
1007; GFX10:       ; %bb.0:
1008; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1009; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1010; GFX10-NEXT:    global_load_dwordx4 v[4:7], v[0:1], off offset:16
1011; GFX10-NEXT:    s_waitcnt vmcnt(0)
1012; GFX10-NEXT:    v_mov_b32_e32 v0, v4
1013; GFX10-NEXT:    v_mov_b32_e32 v1, v5
1014; GFX10-NEXT:    v_mov_b32_e32 v2, v6
1015; GFX10-NEXT:    v_mov_b32_e32 v3, v7
1016; GFX10-NEXT:    s_setpc_b64 s[30:31]
1017;
1018; GFX11-LABEL: extractelement_vgpr_v4i128_idx1:
1019; GFX11:       ; %bb.0:
1020; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1021; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1022; GFX11-NEXT:    global_load_b128 v[4:7], v[0:1], off offset:16
1023; GFX11-NEXT:    s_waitcnt vmcnt(0)
1024; GFX11-NEXT:    v_dual_mov_b32 v0, v4 :: v_dual_mov_b32 v1, v5
1025; GFX11-NEXT:    v_dual_mov_b32 v2, v6 :: v_dual_mov_b32 v3, v7
1026; GFX11-NEXT:    s_setpc_b64 s[30:31]
1027  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
1028  %element = extractelement <4 x i128> %vector, i32 1
1029  ret i128 %element
1030}
1031
1032define i128 @extractelement_vgpr_v4i128_idx2(<4 x i128> addrspace(1)* %ptr) {
1033; GFX9-LABEL: extractelement_vgpr_v4i128_idx2:
1034; GFX9:       ; %bb.0:
1035; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1036; GFX9-NEXT:    global_load_dwordx4 v[8:11], v[0:1], off offset:32
1037; GFX9-NEXT:    s_waitcnt vmcnt(0)
1038; GFX9-NEXT:    v_mov_b32_e32 v0, v8
1039; GFX9-NEXT:    v_mov_b32_e32 v1, v9
1040; GFX9-NEXT:    v_mov_b32_e32 v2, v10
1041; GFX9-NEXT:    v_mov_b32_e32 v3, v11
1042; GFX9-NEXT:    s_setpc_b64 s[30:31]
1043;
1044; GFX8-LABEL: extractelement_vgpr_v4i128_idx2:
1045; GFX8:       ; %bb.0:
1046; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1047; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 32, v0
1048; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1049; GFX8-NEXT:    flat_load_dwordx4 v[8:11], v[0:1]
1050; GFX8-NEXT:    s_waitcnt vmcnt(0)
1051; GFX8-NEXT:    v_mov_b32_e32 v0, v8
1052; GFX8-NEXT:    v_mov_b32_e32 v1, v9
1053; GFX8-NEXT:    v_mov_b32_e32 v2, v10
1054; GFX8-NEXT:    v_mov_b32_e32 v3, v11
1055; GFX8-NEXT:    s_setpc_b64 s[30:31]
1056;
1057; GFX7-LABEL: extractelement_vgpr_v4i128_idx2:
1058; GFX7:       ; %bb.0:
1059; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1060; GFX7-NEXT:    s_mov_b32 s6, 0
1061; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1062; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1063; GFX7-NEXT:    buffer_load_dwordx4 v[8:11], v[0:1], s[4:7], 0 addr64 offset:32
1064; GFX7-NEXT:    s_waitcnt vmcnt(0)
1065; GFX7-NEXT:    v_mov_b32_e32 v0, v8
1066; GFX7-NEXT:    v_mov_b32_e32 v1, v9
1067; GFX7-NEXT:    v_mov_b32_e32 v2, v10
1068; GFX7-NEXT:    v_mov_b32_e32 v3, v11
1069; GFX7-NEXT:    s_setpc_b64 s[30:31]
1070;
1071; GFX10-LABEL: extractelement_vgpr_v4i128_idx2:
1072; GFX10:       ; %bb.0:
1073; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1074; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1075; GFX10-NEXT:    global_load_dwordx4 v[8:11], v[0:1], off offset:32
1076; GFX10-NEXT:    s_waitcnt vmcnt(0)
1077; GFX10-NEXT:    v_mov_b32_e32 v0, v8
1078; GFX10-NEXT:    v_mov_b32_e32 v1, v9
1079; GFX10-NEXT:    v_mov_b32_e32 v2, v10
1080; GFX10-NEXT:    v_mov_b32_e32 v3, v11
1081; GFX10-NEXT:    s_setpc_b64 s[30:31]
1082;
1083; GFX11-LABEL: extractelement_vgpr_v4i128_idx2:
1084; GFX11:       ; %bb.0:
1085; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1086; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1087; GFX11-NEXT:    global_load_b128 v[8:11], v[0:1], off offset:32
1088; GFX11-NEXT:    s_waitcnt vmcnt(0)
1089; GFX11-NEXT:    v_dual_mov_b32 v0, v8 :: v_dual_mov_b32 v1, v9
1090; GFX11-NEXT:    v_dual_mov_b32 v2, v10 :: v_dual_mov_b32 v3, v11
1091; GFX11-NEXT:    s_setpc_b64 s[30:31]
1092  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
1093  %element = extractelement <4 x i128> %vector, i32 2
1094  ret i128 %element
1095}
1096
1097define i128 @extractelement_vgpr_v4i128_idx3(<4 x i128> addrspace(1)* %ptr) {
1098; GFX9-LABEL: extractelement_vgpr_v4i128_idx3:
1099; GFX9:       ; %bb.0:
1100; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1101; GFX9-NEXT:    global_load_dwordx4 v[12:15], v[0:1], off offset:48
1102; GFX9-NEXT:    s_waitcnt vmcnt(0)
1103; GFX9-NEXT:    v_mov_b32_e32 v0, v12
1104; GFX9-NEXT:    v_mov_b32_e32 v1, v13
1105; GFX9-NEXT:    v_mov_b32_e32 v2, v14
1106; GFX9-NEXT:    v_mov_b32_e32 v3, v15
1107; GFX9-NEXT:    s_setpc_b64 s[30:31]
1108;
1109; GFX8-LABEL: extractelement_vgpr_v4i128_idx3:
1110; GFX8:       ; %bb.0:
1111; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1112; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 48, v0
1113; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1114; GFX8-NEXT:    flat_load_dwordx4 v[12:15], v[0:1]
1115; GFX8-NEXT:    s_waitcnt vmcnt(0)
1116; GFX8-NEXT:    v_mov_b32_e32 v0, v12
1117; GFX8-NEXT:    v_mov_b32_e32 v1, v13
1118; GFX8-NEXT:    v_mov_b32_e32 v2, v14
1119; GFX8-NEXT:    v_mov_b32_e32 v3, v15
1120; GFX8-NEXT:    s_setpc_b64 s[30:31]
1121;
1122; GFX7-LABEL: extractelement_vgpr_v4i128_idx3:
1123; GFX7:       ; %bb.0:
1124; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1125; GFX7-NEXT:    s_mov_b32 s6, 0
1126; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1127; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1128; GFX7-NEXT:    buffer_load_dwordx4 v[12:15], v[0:1], s[4:7], 0 addr64 offset:48
1129; GFX7-NEXT:    s_waitcnt vmcnt(0)
1130; GFX7-NEXT:    v_mov_b32_e32 v0, v12
1131; GFX7-NEXT:    v_mov_b32_e32 v1, v13
1132; GFX7-NEXT:    v_mov_b32_e32 v2, v14
1133; GFX7-NEXT:    v_mov_b32_e32 v3, v15
1134; GFX7-NEXT:    s_setpc_b64 s[30:31]
1135;
1136; GFX10-LABEL: extractelement_vgpr_v4i128_idx3:
1137; GFX10:       ; %bb.0:
1138; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1139; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1140; GFX10-NEXT:    global_load_dwordx4 v[12:15], v[0:1], off offset:48
1141; GFX10-NEXT:    s_waitcnt vmcnt(0)
1142; GFX10-NEXT:    v_mov_b32_e32 v0, v12
1143; GFX10-NEXT:    v_mov_b32_e32 v1, v13
1144; GFX10-NEXT:    v_mov_b32_e32 v2, v14
1145; GFX10-NEXT:    v_mov_b32_e32 v3, v15
1146; GFX10-NEXT:    s_setpc_b64 s[30:31]
1147;
1148; GFX11-LABEL: extractelement_vgpr_v4i128_idx3:
1149; GFX11:       ; %bb.0:
1150; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1151; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1152; GFX11-NEXT:    global_load_b128 v[12:15], v[0:1], off offset:48
1153; GFX11-NEXT:    s_waitcnt vmcnt(0)
1154; GFX11-NEXT:    v_dual_mov_b32 v0, v12 :: v_dual_mov_b32 v1, v13
1155; GFX11-NEXT:    v_dual_mov_b32 v2, v14 :: v_dual_mov_b32 v3, v15
1156; GFX11-NEXT:    s_setpc_b64 s[30:31]
1157  %vector = load <4 x i128>, <4 x i128> addrspace(1)* %ptr
1158  %element = extractelement <4 x i128> %vector, i32 3
1159  ret i128 %element
1160}
1161