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