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