[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / load-hi16.ll
blobba025a2202313fb7f05779ed373d6f7a5401d716
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=-promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX900 %s
3 ; RUN: llc -march=amdgcn -mcpu=gfx906 -mattr=-promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX906 %s
4 ; RUN: llc -march=amdgcn -mcpu=fiji -mattr=-promote-alloca -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX803 %s
5 ; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=-promote-alloca -mattr=+enable-flat-scratch -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX900-FLATSCR %s
7 define <2 x i16> @load_local_lo_hi_v2i16_multi_use_lo(ptr addrspace(3) noalias %in) #0 {
8 ; GFX900-LABEL: load_local_lo_hi_v2i16_multi_use_lo:
9 ; GFX900:       ; %bb.0: ; %entry
10 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
11 ; GFX900-NEXT:    ds_read_u16 v2, v0
12 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
13 ; GFX900-NEXT:    v_mov_b32_e32 v1, v2
14 ; GFX900-NEXT:    ds_read_u16_d16_hi v1, v0 offset:16
15 ; GFX900-NEXT:    v_mov_b32_e32 v0, 0
16 ; GFX900-NEXT:    ds_write_b16 v0, v2
17 ; GFX900-NEXT:    s_waitcnt lgkmcnt(1)
18 ; GFX900-NEXT:    v_mov_b32_e32 v0, v1
19 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
20 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
22 ; GFX906-LABEL: load_local_lo_hi_v2i16_multi_use_lo:
23 ; GFX906:       ; %bb.0: ; %entry
24 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
25 ; GFX906-NEXT:    ds_read_u16 v1, v0
26 ; GFX906-NEXT:    ds_read_u16 v0, v0 offset:16
27 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
28 ; GFX906-NEXT:    v_mov_b32_e32 v2, 0
29 ; GFX906-NEXT:    s_waitcnt lgkmcnt(1)
30 ; GFX906-NEXT:    ds_write_b16 v2, v1
31 ; GFX906-NEXT:    s_waitcnt lgkmcnt(1)
32 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
33 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
34 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
36 ; GFX803-LABEL: load_local_lo_hi_v2i16_multi_use_lo:
37 ; GFX803:       ; %bb.0: ; %entry
38 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
39 ; GFX803-NEXT:    s_mov_b32 m0, -1
40 ; GFX803-NEXT:    ds_read_u16 v1, v0
41 ; GFX803-NEXT:    ds_read_u16 v0, v0 offset:16
42 ; GFX803-NEXT:    v_mov_b32_e32 v2, 0
43 ; GFX803-NEXT:    s_waitcnt lgkmcnt(1)
44 ; GFX803-NEXT:    ds_write_b16 v2, v1
45 ; GFX803-NEXT:    s_waitcnt lgkmcnt(1)
46 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
47 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
48 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
49 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
51 ; GFX900-FLATSCR-LABEL: load_local_lo_hi_v2i16_multi_use_lo:
52 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
53 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
54 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v2, v0
55 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
56 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v1, v2
57 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v1, v0 offset:16
58 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, 0
59 ; GFX900-FLATSCR-NEXT:    ds_write_b16 v0, v2
60 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(1)
61 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v1
62 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
63 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
64 entry:
65   %gep = getelementptr inbounds i16, ptr addrspace(3) %in, i32 8
66   %load.lo = load i16, ptr addrspace(3) %in
67   %load.hi = load i16, ptr addrspace(3) %gep
68   store i16 %load.lo, ptr addrspace(3) null
69   %build0 = insertelement <2 x i16> undef, i16 %load.lo, i32 0
70   %build1 = insertelement <2 x i16> %build0, i16 %load.hi, i32 1
71   ret <2 x i16> %build1
74 define <2 x i16> @load_local_lo_hi_v2i16_multi_use_hi(ptr addrspace(3) noalias %in) #0 {
75 ; GFX900-LABEL: load_local_lo_hi_v2i16_multi_use_hi:
76 ; GFX900:       ; %bb.0: ; %entry
77 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
78 ; GFX900-NEXT:    ds_read_u16 v1, v0 offset:16
79 ; GFX900-NEXT:    ds_read_u16 v0, v0
80 ; GFX900-NEXT:    s_mov_b32 s4, 0x5040100
81 ; GFX900-NEXT:    v_mov_b32_e32 v2, 0
82 ; GFX900-NEXT:    s_waitcnt lgkmcnt(1)
83 ; GFX900-NEXT:    ds_write_b16 v2, v1
84 ; GFX900-NEXT:    s_waitcnt lgkmcnt(1)
85 ; GFX900-NEXT:    v_perm_b32 v0, v1, v0, s4
86 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
87 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
89 ; GFX906-LABEL: load_local_lo_hi_v2i16_multi_use_hi:
90 ; GFX906:       ; %bb.0: ; %entry
91 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
92 ; GFX906-NEXT:    ds_read_u16 v1, v0 offset:16
93 ; GFX906-NEXT:    ds_read_u16 v0, v0
94 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
95 ; GFX906-NEXT:    v_mov_b32_e32 v2, 0
96 ; GFX906-NEXT:    s_waitcnt lgkmcnt(1)
97 ; GFX906-NEXT:    ds_write_b16 v2, v1
98 ; GFX906-NEXT:    s_waitcnt lgkmcnt(1)
99 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
100 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
101 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
103 ; GFX803-LABEL: load_local_lo_hi_v2i16_multi_use_hi:
104 ; GFX803:       ; %bb.0: ; %entry
105 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
106 ; GFX803-NEXT:    s_mov_b32 m0, -1
107 ; GFX803-NEXT:    ds_read_u16 v1, v0 offset:16
108 ; GFX803-NEXT:    ds_read_u16 v0, v0
109 ; GFX803-NEXT:    v_mov_b32_e32 v2, 0
110 ; GFX803-NEXT:    s_waitcnt lgkmcnt(1)
111 ; GFX803-NEXT:    ds_write_b16 v2, v1
112 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
113 ; GFX803-NEXT:    s_waitcnt lgkmcnt(1)
114 ; GFX803-NEXT:    v_or_b32_e32 v0, v0, v1
115 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
116 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
118 ; GFX900-FLATSCR-LABEL: load_local_lo_hi_v2i16_multi_use_hi:
119 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
120 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
121 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v1, v0 offset:16
122 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v0, v0
123 ; GFX900-FLATSCR-NEXT:    s_mov_b32 s0, 0x5040100
124 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v2, 0
125 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(1)
126 ; GFX900-FLATSCR-NEXT:    ds_write_b16 v2, v1
127 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(1)
128 ; GFX900-FLATSCR-NEXT:    v_perm_b32 v0, v1, v0, s0
129 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
130 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
131 entry:
132   %gep = getelementptr inbounds i16, ptr addrspace(3) %in, i32 8
133   %load.lo = load i16, ptr addrspace(3) %in
134   %load.hi = load i16, ptr addrspace(3) %gep
135   store i16 %load.hi, ptr addrspace(3) null
136   %build0 = insertelement <2 x i16> undef, i16 %load.lo, i32 0
137   %build1 = insertelement <2 x i16> %build0, i16 %load.hi, i32 1
138   ret <2 x i16> %build1
141 define <2 x i16> @load_local_lo_hi_v2i16_multi_use_lohi(ptr addrspace(3) noalias %in, ptr addrspace(3) noalias %out0, ptr addrspace(3) noalias %out1) #0 {
142 ; GFX900-LABEL: load_local_lo_hi_v2i16_multi_use_lohi:
143 ; GFX900:       ; %bb.0: ; %entry
144 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
145 ; GFX900-NEXT:    ds_read_u16 v3, v0
146 ; GFX900-NEXT:    ds_read_u16 v0, v0 offset:16
147 ; GFX900-NEXT:    s_mov_b32 s4, 0x5040100
148 ; GFX900-NEXT:    s_waitcnt lgkmcnt(1)
149 ; GFX900-NEXT:    ds_write_b16 v1, v3
150 ; GFX900-NEXT:    s_waitcnt lgkmcnt(1)
151 ; GFX900-NEXT:    ds_write_b16 v2, v0
152 ; GFX900-NEXT:    v_perm_b32 v0, v0, v3, s4
153 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
154 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
156 ; GFX906-LABEL: load_local_lo_hi_v2i16_multi_use_lohi:
157 ; GFX906:       ; %bb.0: ; %entry
158 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
159 ; GFX906-NEXT:    ds_read_u16 v3, v0
160 ; GFX906-NEXT:    ds_read_u16 v0, v0 offset:16
161 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
162 ; GFX906-NEXT:    s_waitcnt lgkmcnt(1)
163 ; GFX906-NEXT:    ds_write_b16 v1, v3
164 ; GFX906-NEXT:    s_waitcnt lgkmcnt(1)
165 ; GFX906-NEXT:    ds_write_b16 v2, v0
166 ; GFX906-NEXT:    v_perm_b32 v0, v0, v3, s4
167 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
168 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
170 ; GFX803-LABEL: load_local_lo_hi_v2i16_multi_use_lohi:
171 ; GFX803:       ; %bb.0: ; %entry
172 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
173 ; GFX803-NEXT:    s_mov_b32 m0, -1
174 ; GFX803-NEXT:    ds_read_u16 v3, v0
175 ; GFX803-NEXT:    ds_read_u16 v0, v0 offset:16
176 ; GFX803-NEXT:    s_waitcnt lgkmcnt(1)
177 ; GFX803-NEXT:    ds_write_b16 v1, v3
178 ; GFX803-NEXT:    s_waitcnt lgkmcnt(1)
179 ; GFX803-NEXT:    ds_write_b16 v2, v0
180 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
181 ; GFX803-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
182 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
183 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
185 ; GFX900-FLATSCR-LABEL: load_local_lo_hi_v2i16_multi_use_lohi:
186 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
187 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
188 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v3, v0
189 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v0, v0 offset:16
190 ; GFX900-FLATSCR-NEXT:    s_mov_b32 s0, 0x5040100
191 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(1)
192 ; GFX900-FLATSCR-NEXT:    ds_write_b16 v1, v3
193 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(1)
194 ; GFX900-FLATSCR-NEXT:    ds_write_b16 v2, v0
195 ; GFX900-FLATSCR-NEXT:    v_perm_b32 v0, v0, v3, s0
196 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
197 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
198 entry:
199   %gep = getelementptr inbounds i16, ptr addrspace(3) %in, i32 8
200   %load.lo = load i16, ptr addrspace(3) %in
201   %load.hi = load i16, ptr addrspace(3) %gep
202   store i16 %load.lo, ptr addrspace(3) %out0
203   store i16 %load.hi, ptr addrspace(3) %out1
204   %build0 = insertelement <2 x i16> undef, i16 %load.lo, i32 0
205   %build1 = insertelement <2 x i16> %build0, i16 %load.hi, i32 1
206   ret <2 x i16> %build1
209 define <2 x i16> @load_local_hi_v2i16_undeflo(ptr addrspace(3) %in) #0 {
210 ; GFX900-LABEL: load_local_hi_v2i16_undeflo:
211 ; GFX900:       ; %bb.0: ; %entry
212 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
213 ; GFX900-NEXT:    ds_read_u16_d16_hi v0, v0
214 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
215 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
217 ; GFX906-LABEL: load_local_hi_v2i16_undeflo:
218 ; GFX906:       ; %bb.0: ; %entry
219 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
220 ; GFX906-NEXT:    ds_read_u16 v0, v0
221 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
222 ; GFX906-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
223 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
225 ; GFX803-LABEL: load_local_hi_v2i16_undeflo:
226 ; GFX803:       ; %bb.0: ; %entry
227 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
228 ; GFX803-NEXT:    s_mov_b32 m0, -1
229 ; GFX803-NEXT:    ds_read_u16 v0, v0
230 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
231 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
232 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
234 ; GFX900-FLATSCR-LABEL: load_local_hi_v2i16_undeflo:
235 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
236 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
237 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v0, v0
238 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
239 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
240 entry:
241   %load = load i16, ptr addrspace(3) %in
242   %build = insertelement <2 x i16> undef, i16 %load, i32 1
243   ret <2 x i16> %build
246 define <2 x i16> @load_local_hi_v2i16_reglo(ptr addrspace(3) %in, i16 %reg) #0 {
247 ; GFX900-LABEL: load_local_hi_v2i16_reglo:
248 ; GFX900:       ; %bb.0: ; %entry
249 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
250 ; GFX900-NEXT:    ds_read_u16_d16_hi v1, v0
251 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
252 ; GFX900-NEXT:    v_mov_b32_e32 v0, v1
253 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
255 ; GFX906-LABEL: load_local_hi_v2i16_reglo:
256 ; GFX906:       ; %bb.0: ; %entry
257 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
258 ; GFX906-NEXT:    ds_read_u16 v0, v0
259 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
260 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
261 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
262 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
264 ; GFX803-LABEL: load_local_hi_v2i16_reglo:
265 ; GFX803:       ; %bb.0: ; %entry
266 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
267 ; GFX803-NEXT:    s_mov_b32 m0, -1
268 ; GFX803-NEXT:    ds_read_u16 v0, v0
269 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
270 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
271 ; GFX803-NEXT:    v_perm_b32 v0, v1, v0, s4
272 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
274 ; GFX900-FLATSCR-LABEL: load_local_hi_v2i16_reglo:
275 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
276 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
277 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v1, v0
278 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
279 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v1
280 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
281 entry:
282   %load = load i16, ptr addrspace(3) %in
283   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
284   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
285   ret <2 x i16> %build1
288 define void @load_local_hi_v2i16_reglo_vreg(ptr addrspace(3) %in, i16 %reg) #0 {
289 ; GFX900-LABEL: load_local_hi_v2i16_reglo_vreg:
290 ; GFX900:       ; %bb.0: ; %entry
291 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
292 ; GFX900-NEXT:    ds_read_u16_d16_hi v1, v0
293 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
294 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
295 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
296 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
298 ; GFX906-LABEL: load_local_hi_v2i16_reglo_vreg:
299 ; GFX906:       ; %bb.0: ; %entry
300 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
301 ; GFX906-NEXT:    ds_read_u16 v0, v0
302 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
303 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
304 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
305 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
306 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
307 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
309 ; GFX803-LABEL: load_local_hi_v2i16_reglo_vreg:
310 ; GFX803:       ; %bb.0: ; %entry
311 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
312 ; GFX803-NEXT:    s_mov_b32 m0, -1
313 ; GFX803-NEXT:    ds_read_u16 v0, v0
314 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
315 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
316 ; GFX803-NEXT:    v_perm_b32 v0, v1, v0, s4
317 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
318 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
319 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
321 ; GFX900-FLATSCR-LABEL: load_local_hi_v2i16_reglo_vreg:
322 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
323 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
324 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v1, v0
325 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
326 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
327 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
328 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
329 entry:
330   %load = load i16, ptr addrspace(3) %in
331   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
332   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
333   store <2 x i16> %build1, ptr addrspace(1) undef
334   ret void
337 define <2 x i16> @load_local_hi_v2i16_zerolo(ptr addrspace(3) %in) #0 {
338 ; GFX900-LABEL: load_local_hi_v2i16_zerolo:
339 ; GFX900:       ; %bb.0: ; %entry
340 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
341 ; GFX900-NEXT:    v_mov_b32_e32 v1, 0
342 ; GFX900-NEXT:    ds_read_u16_d16_hi v1, v0
343 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
344 ; GFX900-NEXT:    v_mov_b32_e32 v0, v1
345 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
347 ; GFX906-LABEL: load_local_hi_v2i16_zerolo:
348 ; GFX906:       ; %bb.0: ; %entry
349 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
350 ; GFX906-NEXT:    ds_read_u16 v0, v0
351 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
352 ; GFX906-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
353 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
355 ; GFX803-LABEL: load_local_hi_v2i16_zerolo:
356 ; GFX803:       ; %bb.0: ; %entry
357 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
358 ; GFX803-NEXT:    s_mov_b32 m0, -1
359 ; GFX803-NEXT:    ds_read_u16 v0, v0
360 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
361 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
362 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
364 ; GFX900-FLATSCR-LABEL: load_local_hi_v2i16_zerolo:
365 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
366 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
367 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v1, 0
368 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v1, v0
369 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
370 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v1
371 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
372 entry:
373   %load = load i16, ptr addrspace(3) %in
374   %build = insertelement <2 x i16> zeroinitializer, i16 %load, i32 1
375   ret <2 x i16> %build
378 ; FIXME: Remove m0 initialization
379 define i32 @load_local_hi_v2i16_zerolo_shift(ptr addrspace(3) %in) #0 {
380 ; GFX900-LABEL: load_local_hi_v2i16_zerolo_shift:
381 ; GFX900:       ; %bb.0: ; %entry
382 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
383 ; GFX900-NEXT:    ds_read_u16 v0, v0
384 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
385 ; GFX900-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
386 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
388 ; GFX906-LABEL: load_local_hi_v2i16_zerolo_shift:
389 ; GFX906:       ; %bb.0: ; %entry
390 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
391 ; GFX906-NEXT:    ds_read_u16 v0, v0
392 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
393 ; GFX906-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
394 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
396 ; GFX803-LABEL: load_local_hi_v2i16_zerolo_shift:
397 ; GFX803:       ; %bb.0: ; %entry
398 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
399 ; GFX803-NEXT:    s_mov_b32 m0, -1
400 ; GFX803-NEXT:    ds_read_u16 v0, v0
401 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
402 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
403 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
405 ; GFX900-FLATSCR-LABEL: load_local_hi_v2i16_zerolo_shift:
406 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
407 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
408 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v0, v0
409 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
410 ; GFX900-FLATSCR-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
411 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
412 entry:
413   %load = load i16, ptr addrspace(3) %in
414   %zext = zext i16 %load to i32
415   %shift = shl i32 %zext, 16
416   ret i32 %shift
419 define void @load_local_hi_v2f16_reglo_vreg(ptr addrspace(3) %in, half %reg) #0 {
420 ; GFX900-LABEL: load_local_hi_v2f16_reglo_vreg:
421 ; GFX900:       ; %bb.0: ; %entry
422 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
423 ; GFX900-NEXT:    ds_read_u16_d16_hi v1, v0
424 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
425 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
426 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
427 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
429 ; GFX906-LABEL: load_local_hi_v2f16_reglo_vreg:
430 ; GFX906:       ; %bb.0: ; %entry
431 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
432 ; GFX906-NEXT:    ds_read_u16 v0, v0
433 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
434 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
435 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
436 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
437 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
438 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
440 ; GFX803-LABEL: load_local_hi_v2f16_reglo_vreg:
441 ; GFX803:       ; %bb.0: ; %entry
442 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
443 ; GFX803-NEXT:    s_mov_b32 m0, -1
444 ; GFX803-NEXT:    ds_read_u16 v0, v0
445 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
446 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
447 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
448 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
449 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
450 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
452 ; GFX900-FLATSCR-LABEL: load_local_hi_v2f16_reglo_vreg:
453 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
454 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
455 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v1, v0
456 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
457 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
458 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
459 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
460 entry:
461   %load = load half, ptr addrspace(3) %in
462   %build0 = insertelement <2 x half> undef, half %reg, i32 0
463   %build1 = insertelement <2 x half> %build0, half %load, i32 1
464   store <2 x half> %build1, ptr addrspace(1) undef
465   ret void
468 define void @load_local_hi_v2i16_reglo_vreg_zexti8(ptr addrspace(3) %in, i16 %reg) #0 {
469 ; GFX900-LABEL: load_local_hi_v2i16_reglo_vreg_zexti8:
470 ; GFX900:       ; %bb.0: ; %entry
471 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
472 ; GFX900-NEXT:    ds_read_u8_d16_hi v1, v0
473 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
474 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
475 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
476 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
478 ; GFX906-LABEL: load_local_hi_v2i16_reglo_vreg_zexti8:
479 ; GFX906:       ; %bb.0: ; %entry
480 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
481 ; GFX906-NEXT:    ds_read_u8 v0, v0
482 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
483 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
484 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
485 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
486 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
487 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
489 ; GFX803-LABEL: load_local_hi_v2i16_reglo_vreg_zexti8:
490 ; GFX803:       ; %bb.0: ; %entry
491 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
492 ; GFX803-NEXT:    s_mov_b32 m0, -1
493 ; GFX803-NEXT:    ds_read_u8 v0, v0
494 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
495 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
496 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
497 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
498 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
499 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
501 ; GFX900-FLATSCR-LABEL: load_local_hi_v2i16_reglo_vreg_zexti8:
502 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
503 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
504 ; GFX900-FLATSCR-NEXT:    ds_read_u8_d16_hi v1, v0
505 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
506 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
507 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
508 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
509 entry:
510   %load = load i8, ptr addrspace(3) %in
511   %ext = zext i8 %load to i16
512   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
513   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
514   store <2 x i16> %build1, ptr addrspace(1) undef
515   ret void
518 define void @load_local_hi_v2i16_reglo_vreg_sexti8(ptr addrspace(3) %in, i16 %reg) #0 {
519 ; GFX900-LABEL: load_local_hi_v2i16_reglo_vreg_sexti8:
520 ; GFX900:       ; %bb.0: ; %entry
521 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
522 ; GFX900-NEXT:    ds_read_i8_d16_hi v1, v0
523 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
524 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
525 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
526 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
528 ; GFX906-LABEL: load_local_hi_v2i16_reglo_vreg_sexti8:
529 ; GFX906:       ; %bb.0: ; %entry
530 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
531 ; GFX906-NEXT:    ds_read_i8 v0, v0
532 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
533 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
534 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
535 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
536 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
537 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
539 ; GFX803-LABEL: load_local_hi_v2i16_reglo_vreg_sexti8:
540 ; GFX803:       ; %bb.0: ; %entry
541 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
542 ; GFX803-NEXT:    s_mov_b32 m0, -1
543 ; GFX803-NEXT:    ds_read_i8 v0, v0
544 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
545 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
546 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
547 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
548 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
549 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
551 ; GFX900-FLATSCR-LABEL: load_local_hi_v2i16_reglo_vreg_sexti8:
552 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
553 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
554 ; GFX900-FLATSCR-NEXT:    ds_read_i8_d16_hi v1, v0
555 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
556 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
557 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
558 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
559 entry:
560   %load = load i8, ptr addrspace(3) %in
561   %ext = sext i8 %load to i16
562   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
563   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
564   store <2 x i16> %build1, ptr addrspace(1) undef
565   ret void
568 define void @load_local_hi_v2f16_reglo_vreg_zexti8(ptr addrspace(3) %in, half %reg) #0 {
569 ; GFX900-LABEL: load_local_hi_v2f16_reglo_vreg_zexti8:
570 ; GFX900:       ; %bb.0: ; %entry
571 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
572 ; GFX900-NEXT:    ds_read_u8_d16_hi v1, v0
573 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
574 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
575 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
576 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
578 ; GFX906-LABEL: load_local_hi_v2f16_reglo_vreg_zexti8:
579 ; GFX906:       ; %bb.0: ; %entry
580 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
581 ; GFX906-NEXT:    ds_read_u8 v0, v0
582 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
583 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
584 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
585 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
586 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
587 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
589 ; GFX803-LABEL: load_local_hi_v2f16_reglo_vreg_zexti8:
590 ; GFX803:       ; %bb.0: ; %entry
591 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
592 ; GFX803-NEXT:    s_mov_b32 m0, -1
593 ; GFX803-NEXT:    ds_read_u8 v0, v0
594 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
595 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
596 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
597 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
598 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
599 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
601 ; GFX900-FLATSCR-LABEL: load_local_hi_v2f16_reglo_vreg_zexti8:
602 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
603 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
604 ; GFX900-FLATSCR-NEXT:    ds_read_u8_d16_hi v1, v0
605 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
606 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
607 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
608 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
609 entry:
610   %load = load i8, ptr addrspace(3) %in
611   %ext = zext i8 %load to i16
612   %bitcast = bitcast i16 %ext to half
614   %build0 = insertelement <2 x half> undef, half %reg, i32 0
615   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
616   store <2 x half> %build1, ptr addrspace(1) undef
617   ret void
620 define void @load_local_hi_v2f16_reglo_vreg_sexti8(ptr addrspace(3) %in, half %reg) #0 {
621 ; GFX900-LABEL: load_local_hi_v2f16_reglo_vreg_sexti8:
622 ; GFX900:       ; %bb.0: ; %entry
623 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
624 ; GFX900-NEXT:    ds_read_i8_d16_hi v1, v0
625 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
626 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
627 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
628 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
630 ; GFX906-LABEL: load_local_hi_v2f16_reglo_vreg_sexti8:
631 ; GFX906:       ; %bb.0: ; %entry
632 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
633 ; GFX906-NEXT:    ds_read_i8 v0, v0
634 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
635 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
636 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
637 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
638 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
639 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
641 ; GFX803-LABEL: load_local_hi_v2f16_reglo_vreg_sexti8:
642 ; GFX803:       ; %bb.0: ; %entry
643 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
644 ; GFX803-NEXT:    s_mov_b32 m0, -1
645 ; GFX803-NEXT:    ds_read_i8 v0, v0
646 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
647 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
648 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
649 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
650 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
651 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
653 ; GFX900-FLATSCR-LABEL: load_local_hi_v2f16_reglo_vreg_sexti8:
654 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
655 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
656 ; GFX900-FLATSCR-NEXT:    ds_read_i8_d16_hi v1, v0
657 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
658 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
659 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
660 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
661 entry:
662   %load = load i8, ptr addrspace(3) %in
663   %ext = sext i8 %load to i16
664   %bitcast = bitcast i16 %ext to half
666   %build0 = insertelement <2 x half> undef, half %reg, i32 0
667   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
668   store <2 x half> %build1, ptr addrspace(1) undef
669   ret void
672 define void @load_global_hi_v2i16_reglo_vreg(ptr addrspace(1) %in, i16 %reg) #0 {
673 ; GFX900-LABEL: load_global_hi_v2i16_reglo_vreg:
674 ; GFX900:       ; %bb.0: ; %entry
675 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
676 ; GFX900-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:-4094
677 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
678 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
679 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
680 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
682 ; GFX906-LABEL: load_global_hi_v2i16_reglo_vreg:
683 ; GFX906:       ; %bb.0: ; %entry
684 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
685 ; GFX906-NEXT:    global_load_ushort v0, v[0:1], off offset:-4094
686 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
687 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
688 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
689 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
690 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
691 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
693 ; GFX803-LABEL: load_global_hi_v2i16_reglo_vreg:
694 ; GFX803:       ; %bb.0: ; %entry
695 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
696 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff002, v0
697 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
698 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1]
699 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
700 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
701 ; GFX803-NEXT:    v_perm_b32 v0, v2, v0, s4
702 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
703 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
704 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
706 ; GFX900-FLATSCR-LABEL: load_global_hi_v2i16_reglo_vreg:
707 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
708 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
709 ; GFX900-FLATSCR-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:-4094
710 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
711 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
712 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
713 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
714 entry:
715   %gep = getelementptr inbounds i16, ptr addrspace(1) %in, i64 -2047
716   %load = load i16, ptr addrspace(1) %gep
717   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
718   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
719   store <2 x i16> %build1, ptr addrspace(1) undef
720   ret void
723 define void @load_global_hi_v2f16_reglo_vreg(ptr addrspace(1) %in, half %reg) #0 {
724 ; GFX900-LABEL: load_global_hi_v2f16_reglo_vreg:
725 ; GFX900:       ; %bb.0: ; %entry
726 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
727 ; GFX900-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:-4094
728 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
729 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
730 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
731 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
733 ; GFX906-LABEL: load_global_hi_v2f16_reglo_vreg:
734 ; GFX906:       ; %bb.0: ; %entry
735 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
736 ; GFX906-NEXT:    global_load_ushort v0, v[0:1], off offset:-4094
737 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
738 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
739 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
740 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
741 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
742 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
744 ; GFX803-LABEL: load_global_hi_v2f16_reglo_vreg:
745 ; GFX803:       ; %bb.0: ; %entry
746 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
747 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff002, v0
748 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
749 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1]
750 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
751 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
752 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
753 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
754 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
755 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
757 ; GFX900-FLATSCR-LABEL: load_global_hi_v2f16_reglo_vreg:
758 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
759 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
760 ; GFX900-FLATSCR-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:-4094
761 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
762 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
763 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
764 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
765 entry:
766   %gep = getelementptr inbounds half, ptr addrspace(1) %in, i64 -2047
767   %load = load half, ptr addrspace(1) %gep
768   %build0 = insertelement <2 x half> undef, half %reg, i32 0
769   %build1 = insertelement <2 x half> %build0, half %load, i32 1
770   store <2 x half> %build1, ptr addrspace(1) undef
771   ret void
774 define void @load_global_hi_v2i16_reglo_vreg_zexti8(ptr addrspace(1) %in, i16 %reg) #0 {
775 ; GFX900-LABEL: load_global_hi_v2i16_reglo_vreg_zexti8:
776 ; GFX900:       ; %bb.0: ; %entry
777 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
778 ; GFX900-NEXT:    global_load_ubyte_d16_hi v2, v[0:1], off offset:-4095
779 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
780 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
781 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
782 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
784 ; GFX906-LABEL: load_global_hi_v2i16_reglo_vreg_zexti8:
785 ; GFX906:       ; %bb.0: ; %entry
786 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
787 ; GFX906-NEXT:    global_load_ubyte v0, v[0:1], off offset:-4095
788 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
789 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
790 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
791 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
792 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
793 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
795 ; GFX803-LABEL: load_global_hi_v2i16_reglo_vreg_zexti8:
796 ; GFX803:       ; %bb.0: ; %entry
797 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
798 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff001, v0
799 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
800 ; GFX803-NEXT:    flat_load_ubyte v0, v[0:1]
801 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
802 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
803 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
804 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
805 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
806 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
808 ; GFX900-FLATSCR-LABEL: load_global_hi_v2i16_reglo_vreg_zexti8:
809 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
810 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
811 ; GFX900-FLATSCR-NEXT:    global_load_ubyte_d16_hi v2, v[0:1], off offset:-4095
812 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
813 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
814 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
815 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
816 entry:
817   %gep = getelementptr inbounds i8, ptr addrspace(1) %in, i64 -4095
818   %load = load i8, ptr addrspace(1) %gep
819   %ext = zext i8 %load to i16
820   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
821   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
822   store <2 x i16> %build1, ptr addrspace(1) undef
823   ret void
826 define void @load_global_hi_v2i16_reglo_vreg_sexti8(ptr addrspace(1) %in, i16 %reg) #0 {
827 ; GFX900-LABEL: load_global_hi_v2i16_reglo_vreg_sexti8:
828 ; GFX900:       ; %bb.0: ; %entry
829 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
830 ; GFX900-NEXT:    global_load_sbyte_d16_hi v2, v[0:1], off offset:-4095
831 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
832 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
833 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
834 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
836 ; GFX906-LABEL: load_global_hi_v2i16_reglo_vreg_sexti8:
837 ; GFX906:       ; %bb.0: ; %entry
838 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
839 ; GFX906-NEXT:    global_load_sbyte v0, v[0:1], off offset:-4095
840 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
841 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
842 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
843 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
844 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
845 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
847 ; GFX803-LABEL: load_global_hi_v2i16_reglo_vreg_sexti8:
848 ; GFX803:       ; %bb.0: ; %entry
849 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
850 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff001, v0
851 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
852 ; GFX803-NEXT:    flat_load_sbyte v0, v[0:1]
853 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
854 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
855 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
856 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
857 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
858 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
860 ; GFX900-FLATSCR-LABEL: load_global_hi_v2i16_reglo_vreg_sexti8:
861 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
862 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
863 ; GFX900-FLATSCR-NEXT:    global_load_sbyte_d16_hi v2, v[0:1], off offset:-4095
864 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
865 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
866 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
867 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
868 entry:
869   %gep = getelementptr inbounds i8, ptr addrspace(1) %in, i64 -4095
870   %load = load i8, ptr addrspace(1) %gep
871   %ext = sext i8 %load to i16
872   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
873   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
874   store <2 x i16> %build1, ptr addrspace(1) undef
875   ret void
878 define void @load_global_hi_v2f16_reglo_vreg_sexti8(ptr addrspace(1) %in, half %reg) #0 {
879 ; GFX900-LABEL: load_global_hi_v2f16_reglo_vreg_sexti8:
880 ; GFX900:       ; %bb.0: ; %entry
881 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
882 ; GFX900-NEXT:    global_load_sbyte_d16_hi v2, v[0:1], off offset:-4095
883 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
884 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
885 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
886 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
888 ; GFX906-LABEL: load_global_hi_v2f16_reglo_vreg_sexti8:
889 ; GFX906:       ; %bb.0: ; %entry
890 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
891 ; GFX906-NEXT:    global_load_sbyte v0, v[0:1], off offset:-4095
892 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
893 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
894 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
895 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
896 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
897 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
899 ; GFX803-LABEL: load_global_hi_v2f16_reglo_vreg_sexti8:
900 ; GFX803:       ; %bb.0: ; %entry
901 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
902 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff001, v0
903 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
904 ; GFX803-NEXT:    flat_load_sbyte v0, v[0:1]
905 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
906 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
907 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
908 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
909 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
910 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
912 ; GFX900-FLATSCR-LABEL: load_global_hi_v2f16_reglo_vreg_sexti8:
913 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
914 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
915 ; GFX900-FLATSCR-NEXT:    global_load_sbyte_d16_hi v2, v[0:1], off offset:-4095
916 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
917 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
918 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
919 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
920 entry:
921   %gep = getelementptr inbounds i8, ptr addrspace(1) %in, i64 -4095
922   %load = load i8, ptr addrspace(1) %gep
923   %ext = sext i8 %load to i16
924   %bitcast = bitcast i16 %ext to half
925   %build0 = insertelement <2 x half> undef, half %reg, i32 0
926   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
927   store <2 x half> %build1, ptr addrspace(1) undef
928   ret void
931 define void @load_global_hi_v2f16_reglo_vreg_zexti8(ptr addrspace(1) %in, half %reg) #0 {
932 ; GFX900-LABEL: load_global_hi_v2f16_reglo_vreg_zexti8:
933 ; GFX900:       ; %bb.0: ; %entry
934 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
935 ; GFX900-NEXT:    global_load_ubyte_d16_hi v2, v[0:1], off offset:-4095
936 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
937 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
938 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
939 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
941 ; GFX906-LABEL: load_global_hi_v2f16_reglo_vreg_zexti8:
942 ; GFX906:       ; %bb.0: ; %entry
943 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
944 ; GFX906-NEXT:    global_load_ubyte v0, v[0:1], off offset:-4095
945 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
946 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
947 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
948 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
949 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
950 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
952 ; GFX803-LABEL: load_global_hi_v2f16_reglo_vreg_zexti8:
953 ; GFX803:       ; %bb.0: ; %entry
954 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
955 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff001, v0
956 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
957 ; GFX803-NEXT:    flat_load_ubyte v0, v[0:1]
958 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
959 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
960 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
961 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
962 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
963 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
965 ; GFX900-FLATSCR-LABEL: load_global_hi_v2f16_reglo_vreg_zexti8:
966 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
967 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
968 ; GFX900-FLATSCR-NEXT:    global_load_ubyte_d16_hi v2, v[0:1], off offset:-4095
969 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
970 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
971 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
972 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
973 entry:
974   %gep = getelementptr inbounds i8, ptr addrspace(1) %in, i64 -4095
975   %load = load i8, ptr addrspace(1) %gep
976   %ext = zext i8 %load to i16
977   %bitcast = bitcast i16 %ext to half
978   %build0 = insertelement <2 x half> undef, half %reg, i32 0
979   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
980   store <2 x half> %build1, ptr addrspace(1) undef
981   ret void
984 define void @load_flat_hi_v2i16_reglo_vreg(ptr %in, i16 %reg) #0 {
985 ; GFX900-LABEL: load_flat_hi_v2i16_reglo_vreg:
986 ; GFX900:       ; %bb.0: ; %entry
987 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
988 ; GFX900-NEXT:    flat_load_short_d16_hi v2, v[0:1]
989 ; GFX900-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
990 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
991 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
992 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
994 ; GFX906-LABEL: load_flat_hi_v2i16_reglo_vreg:
995 ; GFX906:       ; %bb.0: ; %entry
996 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
997 ; GFX906-NEXT:    flat_load_ushort v0, v[0:1]
998 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
999 ; GFX906-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1000 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1001 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1002 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1003 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1005 ; GFX803-LABEL: load_flat_hi_v2i16_reglo_vreg:
1006 ; GFX803:       ; %bb.0: ; %entry
1007 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1008 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1]
1009 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
1010 ; GFX803-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1011 ; GFX803-NEXT:    v_perm_b32 v0, v2, v0, s4
1012 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1013 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1014 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1016 ; GFX900-FLATSCR-LABEL: load_flat_hi_v2i16_reglo_vreg:
1017 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1018 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1019 ; GFX900-FLATSCR-NEXT:    flat_load_short_d16_hi v2, v[0:1]
1020 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1021 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1022 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1023 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1024 entry:
1025   %load = load i16, ptr %in
1026   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1027   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
1028   store <2 x i16> %build1, ptr addrspace(1) undef
1029   ret void
1032 define void @load_flat_hi_v2f16_reglo_vreg(ptr %in, half %reg) #0 {
1033 ; GFX900-LABEL: load_flat_hi_v2f16_reglo_vreg:
1034 ; GFX900:       ; %bb.0: ; %entry
1035 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1036 ; GFX900-NEXT:    flat_load_short_d16_hi v2, v[0:1]
1037 ; GFX900-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1038 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1039 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1040 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1042 ; GFX906-LABEL: load_flat_hi_v2f16_reglo_vreg:
1043 ; GFX906:       ; %bb.0: ; %entry
1044 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1045 ; GFX906-NEXT:    flat_load_ushort v0, v[0:1]
1046 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1047 ; GFX906-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1048 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1049 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1050 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1051 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1053 ; GFX803-LABEL: load_flat_hi_v2f16_reglo_vreg:
1054 ; GFX803:       ; %bb.0: ; %entry
1055 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1056 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1]
1057 ; GFX803-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1058 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1059 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1060 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1061 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1062 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1064 ; GFX900-FLATSCR-LABEL: load_flat_hi_v2f16_reglo_vreg:
1065 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1066 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1067 ; GFX900-FLATSCR-NEXT:    flat_load_short_d16_hi v2, v[0:1]
1068 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1069 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1070 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1071 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1072 entry:
1073   %load = load half, ptr %in
1074   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1075   %build1 = insertelement <2 x half> %build0, half %load, i32 1
1076   store <2 x half> %build1, ptr addrspace(1) undef
1077   ret void
1080 define void @load_flat_hi_v2i16_reglo_vreg_zexti8(ptr %in, i16 %reg) #0 {
1081 ; GFX900-LABEL: load_flat_hi_v2i16_reglo_vreg_zexti8:
1082 ; GFX900:       ; %bb.0: ; %entry
1083 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1084 ; GFX900-NEXT:    flat_load_ubyte_d16_hi v2, v[0:1]
1085 ; GFX900-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1086 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1087 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1088 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1090 ; GFX906-LABEL: load_flat_hi_v2i16_reglo_vreg_zexti8:
1091 ; GFX906:       ; %bb.0: ; %entry
1092 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1093 ; GFX906-NEXT:    flat_load_ubyte v0, v[0:1]
1094 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1095 ; GFX906-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1096 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1097 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1098 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1099 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1101 ; GFX803-LABEL: load_flat_hi_v2i16_reglo_vreg_zexti8:
1102 ; GFX803:       ; %bb.0: ; %entry
1103 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1104 ; GFX803-NEXT:    flat_load_ubyte v0, v[0:1]
1105 ; GFX803-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1106 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1107 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1108 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1109 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1110 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1112 ; GFX900-FLATSCR-LABEL: load_flat_hi_v2i16_reglo_vreg_zexti8:
1113 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1114 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1115 ; GFX900-FLATSCR-NEXT:    flat_load_ubyte_d16_hi v2, v[0:1]
1116 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1117 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1118 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1119 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1120 entry:
1121   %load = load i8, ptr %in
1122   %ext = zext i8 %load to i16
1123   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1124   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
1125   store <2 x i16> %build1, ptr addrspace(1) undef
1126   ret void
1129 define void @load_flat_hi_v2i16_reglo_vreg_sexti8(ptr %in, i16 %reg) #0 {
1130 ; GFX900-LABEL: load_flat_hi_v2i16_reglo_vreg_sexti8:
1131 ; GFX900:       ; %bb.0: ; %entry
1132 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1133 ; GFX900-NEXT:    flat_load_sbyte_d16_hi v2, v[0:1]
1134 ; GFX900-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1135 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1136 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1137 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1139 ; GFX906-LABEL: load_flat_hi_v2i16_reglo_vreg_sexti8:
1140 ; GFX906:       ; %bb.0: ; %entry
1141 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1142 ; GFX906-NEXT:    flat_load_sbyte v0, v[0:1]
1143 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1144 ; GFX906-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1145 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1146 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1147 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1148 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1150 ; GFX803-LABEL: load_flat_hi_v2i16_reglo_vreg_sexti8:
1151 ; GFX803:       ; %bb.0: ; %entry
1152 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1153 ; GFX803-NEXT:    flat_load_sbyte v0, v[0:1]
1154 ; GFX803-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1155 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1156 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1157 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1158 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1159 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1161 ; GFX900-FLATSCR-LABEL: load_flat_hi_v2i16_reglo_vreg_sexti8:
1162 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1163 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1164 ; GFX900-FLATSCR-NEXT:    flat_load_sbyte_d16_hi v2, v[0:1]
1165 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1166 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1167 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1168 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1169 entry:
1170   %load = load i8, ptr %in
1171   %ext = sext i8 %load to i16
1172   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1173   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
1174   store <2 x i16> %build1, ptr addrspace(1) undef
1175   ret void
1178 define void @load_flat_hi_v2f16_reglo_vreg_zexti8(ptr %in, half %reg) #0 {
1179 ; GFX900-LABEL: load_flat_hi_v2f16_reglo_vreg_zexti8:
1180 ; GFX900:       ; %bb.0: ; %entry
1181 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1182 ; GFX900-NEXT:    flat_load_ubyte_d16_hi v2, v[0:1]
1183 ; GFX900-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1184 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1185 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1186 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1188 ; GFX906-LABEL: load_flat_hi_v2f16_reglo_vreg_zexti8:
1189 ; GFX906:       ; %bb.0: ; %entry
1190 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1191 ; GFX906-NEXT:    flat_load_ubyte v0, v[0:1]
1192 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1193 ; GFX906-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1194 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1195 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1196 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1197 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1199 ; GFX803-LABEL: load_flat_hi_v2f16_reglo_vreg_zexti8:
1200 ; GFX803:       ; %bb.0: ; %entry
1201 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1202 ; GFX803-NEXT:    flat_load_ubyte v0, v[0:1]
1203 ; GFX803-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1204 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1205 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1206 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1207 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1208 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1210 ; GFX900-FLATSCR-LABEL: load_flat_hi_v2f16_reglo_vreg_zexti8:
1211 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1212 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1213 ; GFX900-FLATSCR-NEXT:    flat_load_ubyte_d16_hi v2, v[0:1]
1214 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1215 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1216 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1217 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1218 entry:
1219   %load = load i8, ptr %in
1220   %ext = zext i8 %load to i16
1221   %bitcast = bitcast i16 %ext to half
1222   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1223   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
1224   store <2 x half> %build1, ptr addrspace(1) undef
1225   ret void
1228 define void @load_flat_hi_v2f16_reglo_vreg_sexti8(ptr %in, half %reg) #0 {
1229 ; GFX900-LABEL: load_flat_hi_v2f16_reglo_vreg_sexti8:
1230 ; GFX900:       ; %bb.0: ; %entry
1231 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1232 ; GFX900-NEXT:    flat_load_sbyte_d16_hi v2, v[0:1]
1233 ; GFX900-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1234 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1235 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1236 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1238 ; GFX906-LABEL: load_flat_hi_v2f16_reglo_vreg_sexti8:
1239 ; GFX906:       ; %bb.0: ; %entry
1240 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1241 ; GFX906-NEXT:    flat_load_sbyte v0, v[0:1]
1242 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1243 ; GFX906-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1244 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1245 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1246 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1247 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1249 ; GFX803-LABEL: load_flat_hi_v2f16_reglo_vreg_sexti8:
1250 ; GFX803:       ; %bb.0: ; %entry
1251 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1252 ; GFX803-NEXT:    flat_load_sbyte v0, v[0:1]
1253 ; GFX803-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1254 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1255 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1256 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1257 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1258 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1260 ; GFX900-FLATSCR-LABEL: load_flat_hi_v2f16_reglo_vreg_sexti8:
1261 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1262 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1263 ; GFX900-FLATSCR-NEXT:    flat_load_sbyte_d16_hi v2, v[0:1]
1264 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1265 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1266 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1267 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1268 entry:
1269   %load = load i8, ptr %in
1270   %ext = sext i8 %load to i16
1271   %bitcast = bitcast i16 %ext to half
1272   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1273   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
1274   store <2 x half> %build1, ptr addrspace(1) undef
1275   ret void
1278 define void @load_private_hi_v2i16_reglo_vreg(ptr addrspace(5) byval(i16) %in, i16 %reg) #0 {
1279 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg:
1280 ; GFX900:       ; %bb.0: ; %entry
1281 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1282 ; GFX900-NEXT:    buffer_load_short_d16_hi v0, off, s[0:3], s32 offset:4094
1283 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1284 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
1285 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1286 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1288 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg:
1289 ; GFX906:       ; %bb.0: ; %entry
1290 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1291 ; GFX906-NEXT:    buffer_load_ushort v1, off, s[0:3], s32 offset:4094
1292 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1293 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1294 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
1295 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1296 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1297 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1299 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg:
1300 ; GFX803:       ; %bb.0: ; %entry
1301 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1302 ; GFX803-NEXT:    buffer_load_ushort v1, off, s[0:3], s32 offset:4094
1303 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
1304 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1305 ; GFX803-NEXT:    v_perm_b32 v0, v0, v1, s4
1306 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1307 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1308 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1310 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg:
1311 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1312 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1313 ; GFX900-FLATSCR-NEXT:    scratch_load_short_d16_hi v0, off, s32 offset:4094
1314 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1315 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
1316 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1317 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1318 entry:
1319   %gep = getelementptr inbounds i16, ptr addrspace(5) %in, i64 2047
1320   %load = load i16, ptr addrspace(5) %gep
1321   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1322   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
1323   store <2 x i16> %build1, ptr addrspace(1) undef
1324   ret void
1327 define void @load_private_hi_v2f16_reglo_vreg(ptr addrspace(5) byval(half) %in, half %reg) #0 {
1328 ; GFX900-LABEL: load_private_hi_v2f16_reglo_vreg:
1329 ; GFX900:       ; %bb.0: ; %entry
1330 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1331 ; GFX900-NEXT:    buffer_load_short_d16_hi v0, off, s[0:3], s32 offset:4094
1332 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1333 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
1334 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1335 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1337 ; GFX906-LABEL: load_private_hi_v2f16_reglo_vreg:
1338 ; GFX906:       ; %bb.0: ; %entry
1339 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1340 ; GFX906-NEXT:    buffer_load_ushort v1, off, s[0:3], s32 offset:4094
1341 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1342 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1343 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
1344 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1345 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1346 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1348 ; GFX803-LABEL: load_private_hi_v2f16_reglo_vreg:
1349 ; GFX803:       ; %bb.0: ; %entry
1350 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1351 ; GFX803-NEXT:    buffer_load_ushort v1, off, s[0:3], s32 offset:4094
1352 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1353 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1354 ; GFX803-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1355 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1356 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1357 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1359 ; GFX900-FLATSCR-LABEL: load_private_hi_v2f16_reglo_vreg:
1360 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1361 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1362 ; GFX900-FLATSCR-NEXT:    scratch_load_short_d16_hi v0, off, s32 offset:4094
1363 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1364 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
1365 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1366 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1367 entry:
1368   %gep = getelementptr inbounds half, ptr addrspace(5) %in, i64 2047
1369   %load = load half, ptr addrspace(5) %gep
1370   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1371   %build1 = insertelement <2 x half> %build0, half %load, i32 1
1372   store <2 x half> %build1, ptr addrspace(1) undef
1373   ret void
1376 define void @load_private_hi_v2i16_reglo_vreg_nooff(ptr addrspace(5) byval(i16) %in, i16 %reg) #0 {
1377 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg_nooff:
1378 ; GFX900:       ; %bb.0: ; %entry
1379 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1380 ; GFX900-NEXT:    buffer_load_short_d16_hi v0, off, s[0:3], 0 offset:4094 glc
1381 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1382 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
1383 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1384 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1386 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg_nooff:
1387 ; GFX906:       ; %bb.0: ; %entry
1388 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1389 ; GFX906-NEXT:    buffer_load_ushort v1, off, s[0:3], 0 offset:4094 glc
1390 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1391 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1392 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
1393 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1394 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1395 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1397 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg_nooff:
1398 ; GFX803:       ; %bb.0: ; %entry
1399 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1400 ; GFX803-NEXT:    buffer_load_ushort v1, off, s[0:3], 0 offset:4094 glc
1401 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1402 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
1403 ; GFX803-NEXT:    v_perm_b32 v0, v0, v1, s4
1404 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1405 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1406 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1408 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg_nooff:
1409 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1410 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1411 ; GFX900-FLATSCR-NEXT:    s_movk_i32 s0, 0xffe
1412 ; GFX900-FLATSCR-NEXT:    scratch_load_short_d16_hi v0, off, s0 glc
1413 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1414 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
1415 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1416 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1417 entry:
1418   %load = load volatile i16, ptr addrspace(5) inttoptr (i32 4094 to ptr addrspace(5))
1419   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1420   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
1421   store <2 x i16> %build1, ptr addrspace(1) undef
1422   ret void
1425 define void @load_private_hi_v2f16_reglo_vreg_nooff(ptr addrspace(5) %in, half %reg) #0 {
1426 ; GFX900-LABEL: load_private_hi_v2f16_reglo_vreg_nooff:
1427 ; GFX900:       ; %bb.0: ; %entry
1428 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1429 ; GFX900-NEXT:    buffer_load_short_d16_hi v1, off, s[0:3], 0 offset:4094 glc
1430 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1431 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
1432 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1433 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1435 ; GFX906-LABEL: load_private_hi_v2f16_reglo_vreg_nooff:
1436 ; GFX906:       ; %bb.0: ; %entry
1437 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1438 ; GFX906-NEXT:    buffer_load_ushort v0, off, s[0:3], 0 offset:4094 glc
1439 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1440 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1441 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
1442 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1443 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1444 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1446 ; GFX803-LABEL: load_private_hi_v2f16_reglo_vreg_nooff:
1447 ; GFX803:       ; %bb.0: ; %entry
1448 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1449 ; GFX803-NEXT:    buffer_load_ushort v0, off, s[0:3], 0 offset:4094 glc
1450 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1451 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1452 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1453 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1454 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1455 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1457 ; GFX900-FLATSCR-LABEL: load_private_hi_v2f16_reglo_vreg_nooff:
1458 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1459 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1460 ; GFX900-FLATSCR-NEXT:    s_movk_i32 s0, 0xffe
1461 ; GFX900-FLATSCR-NEXT:    scratch_load_short_d16_hi v1, off, s0 glc
1462 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1463 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
1464 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1465 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1466 entry:
1467   %load = load volatile half, ptr addrspace(5) inttoptr (i32 4094 to ptr addrspace(5))
1468   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1469   %build1 = insertelement <2 x half> %build0, half %load, i32 1
1470   store <2 x half> %build1, ptr addrspace(1) undef
1471   ret void
1474 define void @load_private_hi_v2i16_reglo_vreg_zexti8(ptr addrspace(5) byval(i8) %in, i16 %reg) #0 {
1475 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg_zexti8:
1476 ; GFX900:       ; %bb.0: ; %entry
1477 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1478 ; GFX900-NEXT:    buffer_load_ubyte_d16_hi v0, off, s[0:3], s32 offset:4095
1479 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1480 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
1481 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1482 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1484 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg_zexti8:
1485 ; GFX906:       ; %bb.0: ; %entry
1486 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1487 ; GFX906-NEXT:    buffer_load_ubyte v1, off, s[0:3], s32 offset:4095
1488 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1489 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1490 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
1491 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1492 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1493 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1495 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg_zexti8:
1496 ; GFX803:       ; %bb.0: ; %entry
1497 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1498 ; GFX803-NEXT:    buffer_load_ubyte v1, off, s[0:3], s32 offset:4095
1499 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1500 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1501 ; GFX803-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1502 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1503 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1504 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1506 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg_zexti8:
1507 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1508 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1509 ; GFX900-FLATSCR-NEXT:    scratch_load_ubyte_d16_hi v0, off, s32 offset:4095
1510 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1511 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
1512 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1513 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1514 entry:
1515   %gep = getelementptr inbounds i8, ptr addrspace(5) %in, i64 4095
1516   %load = load i8, ptr addrspace(5) %gep
1517   %ext = zext i8 %load to i16
1518   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1519   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
1520   store <2 x i16> %build1, ptr addrspace(1) undef
1521   ret void
1524 define void @load_private_hi_v2f16_reglo_vreg_zexti8(ptr addrspace(5) byval(i8) %in, half %reg) #0 {
1525 ; GFX900-LABEL: load_private_hi_v2f16_reglo_vreg_zexti8:
1526 ; GFX900:       ; %bb.0: ; %entry
1527 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1528 ; GFX900-NEXT:    buffer_load_ubyte_d16_hi v0, off, s[0:3], s32 offset:4095
1529 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1530 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
1531 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1532 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1534 ; GFX906-LABEL: load_private_hi_v2f16_reglo_vreg_zexti8:
1535 ; GFX906:       ; %bb.0: ; %entry
1536 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1537 ; GFX906-NEXT:    buffer_load_ubyte v1, off, s[0:3], s32 offset:4095
1538 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1539 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1540 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
1541 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1542 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1543 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1545 ; GFX803-LABEL: load_private_hi_v2f16_reglo_vreg_zexti8:
1546 ; GFX803:       ; %bb.0: ; %entry
1547 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1548 ; GFX803-NEXT:    buffer_load_ubyte v1, off, s[0:3], s32 offset:4095
1549 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1550 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1551 ; GFX803-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1552 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1553 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1554 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1556 ; GFX900-FLATSCR-LABEL: load_private_hi_v2f16_reglo_vreg_zexti8:
1557 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1558 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1559 ; GFX900-FLATSCR-NEXT:    scratch_load_ubyte_d16_hi v0, off, s32 offset:4095
1560 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1561 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
1562 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1563 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1564 entry:
1565   %gep = getelementptr inbounds i8, ptr addrspace(5) %in, i64 4095
1566   %load = load i8, ptr addrspace(5) %gep
1567   %ext = zext i8 %load to i16
1568   %bitcast = bitcast i16 %ext to half
1569   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1570   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
1571   store <2 x half> %build1, ptr addrspace(1) undef
1572   ret void
1575 define void @load_private_hi_v2f16_reglo_vreg_sexti8(ptr addrspace(5) byval(i8) %in, half %reg) #0 {
1576 ; GFX900-LABEL: load_private_hi_v2f16_reglo_vreg_sexti8:
1577 ; GFX900:       ; %bb.0: ; %entry
1578 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1579 ; GFX900-NEXT:    buffer_load_sbyte_d16_hi v0, off, s[0:3], s32 offset:4095
1580 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1581 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
1582 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1583 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1585 ; GFX906-LABEL: load_private_hi_v2f16_reglo_vreg_sexti8:
1586 ; GFX906:       ; %bb.0: ; %entry
1587 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1588 ; GFX906-NEXT:    buffer_load_sbyte v1, off, s[0:3], s32 offset:4095
1589 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1590 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1591 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
1592 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1593 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1594 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1596 ; GFX803-LABEL: load_private_hi_v2f16_reglo_vreg_sexti8:
1597 ; GFX803:       ; %bb.0: ; %entry
1598 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1599 ; GFX803-NEXT:    buffer_load_sbyte v1, off, s[0:3], s32 offset:4095
1600 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1601 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1602 ; GFX803-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1603 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1604 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1605 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1607 ; GFX900-FLATSCR-LABEL: load_private_hi_v2f16_reglo_vreg_sexti8:
1608 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1609 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1610 ; GFX900-FLATSCR-NEXT:    scratch_load_sbyte_d16_hi v0, off, s32 offset:4095
1611 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1612 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
1613 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1614 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1615 entry:
1616   %gep = getelementptr inbounds i8, ptr addrspace(5) %in, i64 4095
1617   %load = load i8, ptr addrspace(5) %gep
1618   %ext = sext i8 %load to i16
1619   %bitcast = bitcast i16 %ext to half
1620   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1621   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
1622   store <2 x half> %build1, ptr addrspace(1) undef
1623   ret void
1626 define void @load_private_hi_v2i16_reglo_vreg_sexti8(ptr addrspace(5) byval(i8) %in, i16 %reg) #0 {
1627 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg_sexti8:
1628 ; GFX900:       ; %bb.0: ; %entry
1629 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1630 ; GFX900-NEXT:    buffer_load_sbyte_d16_hi v0, off, s[0:3], s32 offset:4095
1631 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1632 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
1633 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1634 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1636 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg_sexti8:
1637 ; GFX906:       ; %bb.0: ; %entry
1638 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1639 ; GFX906-NEXT:    buffer_load_sbyte v1, off, s[0:3], s32 offset:4095
1640 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1641 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1642 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
1643 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1644 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1645 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1647 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg_sexti8:
1648 ; GFX803:       ; %bb.0: ; %entry
1649 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1650 ; GFX803-NEXT:    buffer_load_sbyte v1, off, s[0:3], s32 offset:4095
1651 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1652 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1653 ; GFX803-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1654 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1655 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1656 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1658 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg_sexti8:
1659 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1660 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1661 ; GFX900-FLATSCR-NEXT:    scratch_load_sbyte_d16_hi v0, off, s32 offset:4095
1662 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1663 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
1664 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1665 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1666 entry:
1667   %gep = getelementptr inbounds i8, ptr addrspace(5) %in, i64 4095
1668   %load = load i8, ptr addrspace(5) %gep
1669   %ext = sext i8 %load to i16
1670   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1671   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
1672   store <2 x i16> %build1, ptr addrspace(1) undef
1673   ret void
1676 define void @load_private_hi_v2i16_reglo_vreg_nooff_zexti8(ptr addrspace(5) %in, i16 %reg) #0 {
1677 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg_nooff_zexti8:
1678 ; GFX900:       ; %bb.0: ; %entry
1679 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1680 ; GFX900-NEXT:    buffer_load_ubyte_d16_hi v1, off, s[0:3], 0 offset:4094 glc
1681 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1682 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
1683 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1684 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1686 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg_nooff_zexti8:
1687 ; GFX906:       ; %bb.0: ; %entry
1688 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1689 ; GFX906-NEXT:    buffer_load_ubyte v0, off, s[0:3], 0 offset:4094 glc
1690 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1691 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1692 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
1693 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1694 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1695 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1697 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg_nooff_zexti8:
1698 ; GFX803:       ; %bb.0: ; %entry
1699 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1700 ; GFX803-NEXT:    buffer_load_ubyte v0, off, s[0:3], 0 offset:4094 glc
1701 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1702 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1703 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1704 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1705 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1706 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1708 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg_nooff_zexti8:
1709 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1710 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1711 ; GFX900-FLATSCR-NEXT:    s_movk_i32 s0, 0xffe
1712 ; GFX900-FLATSCR-NEXT:    scratch_load_ubyte_d16_hi v1, off, s0 glc
1713 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1714 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
1715 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1716 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1717 entry:
1718   %load = load volatile i8, ptr addrspace(5) inttoptr (i32 4094 to ptr addrspace(5))
1719   %ext = zext i8 %load to i16
1720   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1721   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
1722   store <2 x i16> %build1, ptr addrspace(1) undef
1723   ret void
1726 define void @load_private_hi_v2i16_reglo_vreg_nooff_sexti8(ptr addrspace(5) %in, i16 %reg) #0 {
1727 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg_nooff_sexti8:
1728 ; GFX900:       ; %bb.0: ; %entry
1729 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1730 ; GFX900-NEXT:    buffer_load_sbyte_d16_hi v1, off, s[0:3], 0 offset:4094 glc
1731 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1732 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
1733 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1734 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1736 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg_nooff_sexti8:
1737 ; GFX906:       ; %bb.0: ; %entry
1738 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1739 ; GFX906-NEXT:    buffer_load_sbyte v0, off, s[0:3], 0 offset:4094 glc
1740 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1741 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1742 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
1743 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1744 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1745 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1747 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg_nooff_sexti8:
1748 ; GFX803:       ; %bb.0: ; %entry
1749 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1750 ; GFX803-NEXT:    buffer_load_sbyte v0, off, s[0:3], 0 offset:4094 glc
1751 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1752 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1753 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1754 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1755 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1756 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1758 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg_nooff_sexti8:
1759 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1760 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1761 ; GFX900-FLATSCR-NEXT:    s_movk_i32 s0, 0xffe
1762 ; GFX900-FLATSCR-NEXT:    scratch_load_sbyte_d16_hi v1, off, s0 glc
1763 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1764 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
1765 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1766 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1767 entry:
1768   %load = load volatile i8, ptr addrspace(5) inttoptr (i32 4094 to ptr addrspace(5))
1769   %ext = sext i8 %load to i16
1770   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1771   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
1772   store <2 x i16> %build1, ptr addrspace(1) undef
1773   ret void
1776 define void @load_private_hi_v2f16_reglo_vreg_nooff_zexti8(ptr addrspace(5) %in, half %reg) #0 {
1777 ; GFX900-LABEL: load_private_hi_v2f16_reglo_vreg_nooff_zexti8:
1778 ; GFX900:       ; %bb.0: ; %entry
1779 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1780 ; GFX900-NEXT:    buffer_load_ubyte_d16_hi v1, off, s[0:3], 0 offset:4094 glc
1781 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1782 ; GFX900-NEXT:    global_store_dword v[0:1], v1, off
1783 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1784 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1786 ; GFX906-LABEL: load_private_hi_v2f16_reglo_vreg_nooff_zexti8:
1787 ; GFX906:       ; %bb.0: ; %entry
1788 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1789 ; GFX906-NEXT:    buffer_load_ubyte v0, off, s[0:3], 0 offset:4094 glc
1790 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1791 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1792 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
1793 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1794 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1795 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1797 ; GFX803-LABEL: load_private_hi_v2f16_reglo_vreg_nooff_zexti8:
1798 ; GFX803:       ; %bb.0: ; %entry
1799 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1800 ; GFX803-NEXT:    buffer_load_ubyte v0, off, s[0:3], 0 offset:4094 glc
1801 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1802 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1803 ; GFX803-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1804 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1805 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1806 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1808 ; GFX900-FLATSCR-LABEL: load_private_hi_v2f16_reglo_vreg_nooff_zexti8:
1809 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1810 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1811 ; GFX900-FLATSCR-NEXT:    s_movk_i32 s0, 0xffe
1812 ; GFX900-FLATSCR-NEXT:    scratch_load_ubyte_d16_hi v1, off, s0 glc
1813 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1814 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v1, off
1815 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1816 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1817 entry:
1818   %load = load volatile i8, ptr addrspace(5) inttoptr (i32 4094 to ptr addrspace(5))
1819   %ext = zext i8 %load to i16
1820   %bc.ext = bitcast i16 %ext to half
1821   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1822   %build1 = insertelement <2 x half> %build0, half %bc.ext, i32 1
1823   store <2 x half> %build1, ptr addrspace(1) undef
1824   ret void
1827 define void @load_constant_hi_v2i16_reglo_vreg(ptr addrspace(4) %in, i16 %reg) #0 {
1828 ; GFX900-LABEL: load_constant_hi_v2i16_reglo_vreg:
1829 ; GFX900:       ; %bb.0: ; %entry
1830 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1831 ; GFX900-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:-4094
1832 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1833 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1834 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1835 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1837 ; GFX906-LABEL: load_constant_hi_v2i16_reglo_vreg:
1838 ; GFX906:       ; %bb.0: ; %entry
1839 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1840 ; GFX906-NEXT:    global_load_ushort v0, v[0:1], off offset:-4094
1841 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1842 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1843 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1844 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1845 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1846 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1848 ; GFX803-LABEL: load_constant_hi_v2i16_reglo_vreg:
1849 ; GFX803:       ; %bb.0: ; %entry
1850 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1851 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff002, v0
1852 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
1853 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1]
1854 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
1855 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1856 ; GFX803-NEXT:    v_perm_b32 v0, v2, v0, s4
1857 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1858 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1859 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1861 ; GFX900-FLATSCR-LABEL: load_constant_hi_v2i16_reglo_vreg:
1862 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1863 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1864 ; GFX900-FLATSCR-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:-4094
1865 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1866 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1867 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1868 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1869 entry:
1870   %gep = getelementptr inbounds i16, ptr addrspace(4) %in, i64 -2047
1871   %load = load i16, ptr addrspace(4) %gep
1872   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
1873   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
1874   store <2 x i16> %build1, ptr addrspace(1) undef
1875   ret void
1878 define void @load_constant_hi_v2f16_reglo_vreg(ptr addrspace(4) %in, half %reg) #0 {
1879 ; GFX900-LABEL: load_constant_hi_v2f16_reglo_vreg:
1880 ; GFX900:       ; %bb.0: ; %entry
1881 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1882 ; GFX900-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:-4094
1883 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1884 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1885 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1886 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1888 ; GFX906-LABEL: load_constant_hi_v2f16_reglo_vreg:
1889 ; GFX906:       ; %bb.0: ; %entry
1890 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1891 ; GFX906-NEXT:    global_load_ushort v0, v[0:1], off offset:-4094
1892 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1893 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1894 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1895 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1896 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1897 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1899 ; GFX803-LABEL: load_constant_hi_v2f16_reglo_vreg:
1900 ; GFX803:       ; %bb.0: ; %entry
1901 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1902 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff002, v0
1903 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
1904 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1]
1905 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1906 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1907 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1908 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1909 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1910 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1912 ; GFX900-FLATSCR-LABEL: load_constant_hi_v2f16_reglo_vreg:
1913 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1914 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1915 ; GFX900-FLATSCR-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:-4094
1916 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1917 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1918 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1919 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1920 entry:
1921   %gep = getelementptr inbounds half, ptr addrspace(4) %in, i64 -2047
1922   %load = load half, ptr addrspace(4) %gep
1923   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1924   %build1 = insertelement <2 x half> %build0, half %load, i32 1
1925   store <2 x half> %build1, ptr addrspace(1) undef
1926   ret void
1929 define void @load_constant_hi_v2f16_reglo_vreg_sexti8(ptr addrspace(4) %in, half %reg) #0 {
1930 ; GFX900-LABEL: load_constant_hi_v2f16_reglo_vreg_sexti8:
1931 ; GFX900:       ; %bb.0: ; %entry
1932 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1933 ; GFX900-NEXT:    global_load_sbyte_d16_hi v2, v[0:1], off offset:-4095
1934 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1935 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1936 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1937 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1939 ; GFX906-LABEL: load_constant_hi_v2f16_reglo_vreg_sexti8:
1940 ; GFX906:       ; %bb.0: ; %entry
1941 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1942 ; GFX906-NEXT:    global_load_sbyte v0, v[0:1], off offset:-4095
1943 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1944 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1945 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1946 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
1947 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1948 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
1950 ; GFX803-LABEL: load_constant_hi_v2f16_reglo_vreg_sexti8:
1951 ; GFX803:       ; %bb.0: ; %entry
1952 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1953 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff001, v0
1954 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
1955 ; GFX803-NEXT:    flat_load_sbyte v0, v[0:1]
1956 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1957 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
1958 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
1959 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
1960 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
1961 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
1963 ; GFX900-FLATSCR-LABEL: load_constant_hi_v2f16_reglo_vreg_sexti8:
1964 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
1965 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1966 ; GFX900-FLATSCR-NEXT:    global_load_sbyte_d16_hi v2, v[0:1], off offset:-4095
1967 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1968 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
1969 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
1970 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
1971 entry:
1972   %gep = getelementptr inbounds i8, ptr addrspace(4) %in, i64 -4095
1973   %load = load i8, ptr addrspace(4) %gep
1974   %ext = sext i8 %load to i16
1975   %bitcast = bitcast i16 %ext to half
1976   %build0 = insertelement <2 x half> undef, half %reg, i32 0
1977   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
1978   store <2 x half> %build1, ptr addrspace(1) undef
1979   ret void
1982 define void @load_constant_hi_v2f16_reglo_vreg_zexti8(ptr addrspace(4) %in, half %reg) #0 {
1983 ; GFX900-LABEL: load_constant_hi_v2f16_reglo_vreg_zexti8:
1984 ; GFX900:       ; %bb.0: ; %entry
1985 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1986 ; GFX900-NEXT:    global_load_ubyte_d16_hi v2, v[0:1], off offset:-4095
1987 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1988 ; GFX900-NEXT:    global_store_dword v[0:1], v2, off
1989 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
1990 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
1992 ; GFX906-LABEL: load_constant_hi_v2f16_reglo_vreg_zexti8:
1993 ; GFX906:       ; %bb.0: ; %entry
1994 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1995 ; GFX906-NEXT:    global_load_ubyte v0, v[0:1], off offset:-4095
1996 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
1997 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
1998 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
1999 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
2000 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2001 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2003 ; GFX803-LABEL: load_constant_hi_v2f16_reglo_vreg_zexti8:
2004 ; GFX803:       ; %bb.0: ; %entry
2005 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2006 ; GFX803-NEXT:    v_add_u32_e32 v0, vcc, 0xfffff001, v0
2007 ; GFX803-NEXT:    v_addc_u32_e32 v1, vcc, -1, v1, vcc
2008 ; GFX803-NEXT:    flat_load_ubyte v0, v[0:1]
2009 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2010 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2011 ; GFX803-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2012 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
2013 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2014 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2016 ; GFX900-FLATSCR-LABEL: load_constant_hi_v2f16_reglo_vreg_zexti8:
2017 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2018 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2019 ; GFX900-FLATSCR-NEXT:    global_load_ubyte_d16_hi v2, v[0:1], off offset:-4095
2020 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2021 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v2, off
2022 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2023 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2024 entry:
2025   %gep = getelementptr inbounds i8, ptr addrspace(4) %in, i64 -4095
2026   %load = load i8, ptr addrspace(4) %gep
2027   %ext = zext i8 %load to i16
2028   %bitcast = bitcast i16 %ext to half
2029   %build0 = insertelement <2 x half> undef, half %reg, i32 0
2030   %build1 = insertelement <2 x half> %build0, half %bitcast, i32 1
2031   store <2 x half> %build1, ptr addrspace(1) undef
2032   ret void
2035 ; Local object gives known offset, so requires converting from offen
2036 ; to offset variant.
2038 define void @load_private_hi_v2i16_reglo_vreg_to_offset(i16 %reg, ptr addrspace(5) %obj0) #0 {
2039 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg_to_offset:
2040 ; GFX900:       ; %bb.0: ; %entry
2041 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2042 ; GFX900-NEXT:    v_mov_b32_e32 v2, 0x7b
2043 ; GFX900-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2044 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2045 ; GFX900-NEXT:    buffer_load_short_d16_hi v0, off, s[0:3], s32 offset:4058
2046 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2047 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
2048 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2049 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2051 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg_to_offset:
2052 ; GFX906:       ; %bb.0: ; %entry
2053 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2054 ; GFX906-NEXT:    v_mov_b32_e32 v2, 0x7b
2055 ; GFX906-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2056 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2057 ; GFX906-NEXT:    buffer_load_ushort v1, off, s[0:3], s32 offset:4058
2058 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2059 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2060 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
2061 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
2062 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2063 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2065 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg_to_offset:
2066 ; GFX803:       ; %bb.0: ; %entry
2067 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2068 ; GFX803-NEXT:    v_mov_b32_e32 v2, 0x7b
2069 ; GFX803-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2070 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2071 ; GFX803-NEXT:    buffer_load_ushort v1, off, s[0:3], s32 offset:4058
2072 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
2073 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2074 ; GFX803-NEXT:    v_perm_b32 v0, v0, v1, s4
2075 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
2076 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2077 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2079 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg_to_offset:
2080 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2081 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2082 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v2, 0x7b
2083 ; GFX900-FLATSCR-NEXT:    scratch_store_dword v1, v2, off
2084 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2085 ; GFX900-FLATSCR-NEXT:    scratch_load_short_d16_hi v0, off, s32 offset:4058
2086 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2087 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
2088 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2089 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2090 entry:
2091   %obj1 = alloca [4096 x i16], align 2, addrspace(5)
2092   store volatile i32 123, ptr addrspace(5) %obj0
2093   %gep = getelementptr inbounds [4096 x i16], ptr addrspace(5) %obj1, i32 0, i32 2027
2094   %load = load i16, ptr addrspace(5) %gep
2095   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
2096   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
2097   store <2 x i16> %build1, ptr addrspace(1) undef
2098   ret void
2101 define void @load_private_hi_v2i16_reglo_vreg_sexti8_to_offset(i16 %reg, ptr addrspace(5) %obj0) #0 {
2102 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg_sexti8_to_offset:
2103 ; GFX900:       ; %bb.0: ; %entry
2104 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2105 ; GFX900-NEXT:    v_mov_b32_e32 v2, 0x7b
2106 ; GFX900-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2107 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2108 ; GFX900-NEXT:    buffer_load_sbyte_d16_hi v0, off, s[0:3], s32 offset:4059
2109 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2110 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
2111 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2112 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2114 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg_sexti8_to_offset:
2115 ; GFX906:       ; %bb.0: ; %entry
2116 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2117 ; GFX906-NEXT:    v_mov_b32_e32 v2, 0x7b
2118 ; GFX906-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2119 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2120 ; GFX906-NEXT:    buffer_load_sbyte v1, off, s[0:3], s32 offset:4059
2121 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2122 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2123 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
2124 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
2125 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2126 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2128 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg_sexti8_to_offset:
2129 ; GFX803:       ; %bb.0: ; %entry
2130 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2131 ; GFX803-NEXT:    v_mov_b32_e32 v2, 0x7b
2132 ; GFX803-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2133 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2134 ; GFX803-NEXT:    buffer_load_sbyte v1, off, s[0:3], s32 offset:4059
2135 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2136 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2137 ; GFX803-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2138 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
2139 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2140 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2142 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg_sexti8_to_offset:
2143 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2144 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2145 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v2, 0x7b
2146 ; GFX900-FLATSCR-NEXT:    scratch_store_dword v1, v2, off
2147 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2148 ; GFX900-FLATSCR-NEXT:    scratch_load_sbyte_d16_hi v0, off, s32 offset:4059
2149 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2150 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
2151 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2152 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2153 entry:
2154   %obj1 = alloca [4096 x i8], align 2, addrspace(5)
2155   store volatile i32 123, ptr addrspace(5) %obj0
2156   %gep = getelementptr inbounds [4096 x i8], ptr addrspace(5) %obj1, i32 0, i32 4055
2157   %load = load i8, ptr addrspace(5) %gep
2158   %ext = sext i8 %load to i16
2159   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
2160   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
2161   store <2 x i16> %build1, ptr addrspace(1) undef
2162   ret void
2165 define void @load_private_hi_v2i16_reglo_vreg_zexti8_to_offset(i16 %reg, ptr addrspace(5) %obj0) #0 {
2166 ; GFX900-LABEL: load_private_hi_v2i16_reglo_vreg_zexti8_to_offset:
2167 ; GFX900:       ; %bb.0: ; %entry
2168 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2169 ; GFX900-NEXT:    v_mov_b32_e32 v2, 0x7b
2170 ; GFX900-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2171 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2172 ; GFX900-NEXT:    buffer_load_ubyte_d16_hi v0, off, s[0:3], s32 offset:4059
2173 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2174 ; GFX900-NEXT:    global_store_dword v[0:1], v0, off
2175 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2176 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2178 ; GFX906-LABEL: load_private_hi_v2i16_reglo_vreg_zexti8_to_offset:
2179 ; GFX906:       ; %bb.0: ; %entry
2180 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2181 ; GFX906-NEXT:    v_mov_b32_e32 v2, 0x7b
2182 ; GFX906-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2183 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2184 ; GFX906-NEXT:    buffer_load_ubyte v1, off, s[0:3], s32 offset:4059
2185 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2186 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2187 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
2188 ; GFX906-NEXT:    global_store_dword v[0:1], v0, off
2189 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2190 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2192 ; GFX803-LABEL: load_private_hi_v2i16_reglo_vreg_zexti8_to_offset:
2193 ; GFX803:       ; %bb.0: ; %entry
2194 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2195 ; GFX803-NEXT:    v_mov_b32_e32 v2, 0x7b
2196 ; GFX803-NEXT:    buffer_store_dword v2, v1, s[0:3], 0 offen
2197 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2198 ; GFX803-NEXT:    buffer_load_ubyte v1, off, s[0:3], s32 offset:4059
2199 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2200 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2201 ; GFX803-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2202 ; GFX803-NEXT:    flat_store_dword v[0:1], v0
2203 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2204 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2206 ; GFX900-FLATSCR-LABEL: load_private_hi_v2i16_reglo_vreg_zexti8_to_offset:
2207 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2208 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2209 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v2, 0x7b
2210 ; GFX900-FLATSCR-NEXT:    scratch_store_dword v1, v2, off
2211 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2212 ; GFX900-FLATSCR-NEXT:    scratch_load_ubyte_d16_hi v0, off, s32 offset:4059
2213 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2214 ; GFX900-FLATSCR-NEXT:    global_store_dword v[0:1], v0, off
2215 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2216 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2217 entry:
2218   %obj1 = alloca [4096 x i8], align 2, addrspace(5)
2219   store volatile i32 123, ptr addrspace(5) %obj0
2220   %gep = getelementptr inbounds [4096 x i8], ptr addrspace(5) %obj1, i32 0, i32 4055
2221   %load = load i8, ptr addrspace(5) %gep
2222   %ext = zext i8 %load to i16
2223   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
2224   %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1
2225   store <2 x i16> %build1, ptr addrspace(1) undef
2226   ret void
2229 ; FIXME: Remove m0 init and waitcnt between reads
2230 ; FIXME: Is there a cost to using the extload over not?
2231 define <2 x i16> @load_local_v2i16_split_multi_chain(ptr addrspace(3) %in) #0 {
2232 ; GFX900-LABEL: load_local_v2i16_split_multi_chain:
2233 ; GFX900:       ; %bb.0: ; %entry
2234 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2235 ; GFX900-NEXT:    ds_read_u16 v1, v0
2236 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
2237 ; GFX900-NEXT:    ds_read_u16_d16_hi v1, v0 offset:2
2238 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
2239 ; GFX900-NEXT:    v_mov_b32_e32 v0, v1
2240 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2242 ; GFX906-LABEL: load_local_v2i16_split_multi_chain:
2243 ; GFX906:       ; %bb.0: ; %entry
2244 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2245 ; GFX906-NEXT:    ds_read_u16 v1, v0
2246 ; GFX906-NEXT:    ds_read_u16 v0, v0 offset:2
2247 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2248 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
2249 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
2250 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2252 ; GFX803-LABEL: load_local_v2i16_split_multi_chain:
2253 ; GFX803:       ; %bb.0: ; %entry
2254 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2255 ; GFX803-NEXT:    s_mov_b32 m0, -1
2256 ; GFX803-NEXT:    ds_read_u16 v1, v0
2257 ; GFX803-NEXT:    ds_read_u16 v0, v0 offset:2
2258 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
2259 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2260 ; GFX803-NEXT:    v_or_b32_e32 v0, v1, v0
2261 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2263 ; GFX900-FLATSCR-LABEL: load_local_v2i16_split_multi_chain:
2264 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2265 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2266 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v1, v0
2267 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
2268 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v1, v0 offset:2
2269 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
2270 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v1
2271 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2272 entry:
2273   %gep = getelementptr inbounds i16, ptr addrspace(3) %in, i32 1
2274   %load0 = load volatile i16, ptr addrspace(3) %in
2275   %load1 = load volatile i16, ptr addrspace(3) %gep
2276   %build0 = insertelement <2 x i16> undef, i16 %load0, i32 0
2277   %build1 = insertelement <2 x i16> %build0, i16 %load1, i32 1
2278   ret <2 x i16> %build1
2281 define <2 x i16> @load_local_lo_hi_v2i16_samechain(ptr addrspace(3) %in) #0 {
2282 ; GFX900-LABEL: load_local_lo_hi_v2i16_samechain:
2283 ; GFX900:       ; %bb.0: ; %entry
2284 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2285 ; GFX900-NEXT:    ds_read_u16 v1, v0
2286 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
2287 ; GFX900-NEXT:    ds_read_u16_d16_hi v1, v0 offset:16
2288 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
2289 ; GFX900-NEXT:    v_mov_b32_e32 v0, v1
2290 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2292 ; GFX906-LABEL: load_local_lo_hi_v2i16_samechain:
2293 ; GFX906:       ; %bb.0: ; %entry
2294 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2295 ; GFX906-NEXT:    ds_read_u16 v1, v0
2296 ; GFX906-NEXT:    ds_read_u16 v0, v0 offset:16
2297 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2298 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
2299 ; GFX906-NEXT:    v_perm_b32 v0, v0, v1, s4
2300 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2302 ; GFX803-LABEL: load_local_lo_hi_v2i16_samechain:
2303 ; GFX803:       ; %bb.0: ; %entry
2304 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2305 ; GFX803-NEXT:    s_mov_b32 m0, -1
2306 ; GFX803-NEXT:    ds_read_u16 v1, v0 offset:16
2307 ; GFX803-NEXT:    ds_read_u16 v0, v0
2308 ; GFX803-NEXT:    s_waitcnt lgkmcnt(1)
2309 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2310 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
2311 ; GFX803-NEXT:    v_or_b32_e32 v0, v0, v1
2312 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2314 ; GFX900-FLATSCR-LABEL: load_local_lo_hi_v2i16_samechain:
2315 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2316 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2317 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v1, v0
2318 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
2319 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v1, v0 offset:16
2320 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
2321 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v1
2322 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2323 entry:
2324   %gep = getelementptr inbounds i16, ptr addrspace(3) %in, i32 8
2325   %load.lo = load i16, ptr addrspace(3) %in
2326   %load.hi = load i16, ptr addrspace(3) %gep
2327   %build0 = insertelement <2 x i16> undef, i16 %load.lo, i32 0
2328   %build1 = insertelement <2 x i16> %build0, i16 %load.hi, i32 1
2329   ret <2 x i16> %build1
2332 ; FIXME: Remove and
2333 define <2 x i16> @load_local_v2i16_broadcast(ptr addrspace(3) %in) #0 {
2334 ; GFX900-LABEL: load_local_v2i16_broadcast:
2335 ; GFX900:       ; %bb.0: ; %entry
2336 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2337 ; GFX900-NEXT:    ds_read_u16 v0, v0
2338 ; GFX900-NEXT:    s_mov_b32 s4, 0x5040100
2339 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
2340 ; GFX900-NEXT:    v_perm_b32 v0, v0, v0, s4
2341 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2343 ; GFX906-LABEL: load_local_v2i16_broadcast:
2344 ; GFX906:       ; %bb.0: ; %entry
2345 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2346 ; GFX906-NEXT:    ds_read_u16 v0, v0
2347 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2348 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
2349 ; GFX906-NEXT:    v_perm_b32 v0, v0, v0, s4
2350 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2352 ; GFX803-LABEL: load_local_v2i16_broadcast:
2353 ; GFX803:       ; %bb.0: ; %entry
2354 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2355 ; GFX803-NEXT:    s_mov_b32 m0, -1
2356 ; GFX803-NEXT:    ds_read_u16 v0, v0
2357 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
2358 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v0
2359 ; GFX803-NEXT:    v_or_b32_e32 v0, v0, v1
2360 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2362 ; GFX900-FLATSCR-LABEL: load_local_v2i16_broadcast:
2363 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2364 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2365 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v0, v0
2366 ; GFX900-FLATSCR-NEXT:    s_mov_b32 s0, 0x5040100
2367 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
2368 ; GFX900-FLATSCR-NEXT:    v_perm_b32 v0, v0, v0, s0
2369 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2370 entry:
2371   %gep = getelementptr inbounds i16, ptr addrspace(3) %in, i32 1
2372   %load0 = load i16, ptr addrspace(3) %in
2373   %build0 = insertelement <2 x i16> undef, i16 %load0, i32 0
2374   %build1 = insertelement <2 x i16> %build0, i16 %load0, i32 1
2375   ret <2 x i16> %build1
2378 define <2 x i16> @load_local_lo_hi_v2i16_side_effect(ptr addrspace(3) %in, ptr addrspace(3) %may.alias) #0 {
2379 ; GFX900-LABEL: load_local_lo_hi_v2i16_side_effect:
2380 ; GFX900:       ; %bb.0: ; %entry
2381 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2382 ; GFX900-NEXT:    ds_read_u16 v2, v0
2383 ; GFX900-NEXT:    v_mov_b32_e32 v3, 0x7b
2384 ; GFX900-NEXT:    ds_write_b16 v1, v3
2385 ; GFX900-NEXT:    s_waitcnt lgkmcnt(1)
2386 ; GFX900-NEXT:    ds_read_u16_d16_hi v2, v0 offset:16
2387 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
2388 ; GFX900-NEXT:    v_mov_b32_e32 v0, v2
2389 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2391 ; GFX906-LABEL: load_local_lo_hi_v2i16_side_effect:
2392 ; GFX906:       ; %bb.0: ; %entry
2393 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2394 ; GFX906-NEXT:    v_mov_b32_e32 v3, 0x7b
2395 ; GFX906-NEXT:    ds_read_u16 v2, v0
2396 ; GFX906-NEXT:    ds_write_b16 v1, v3
2397 ; GFX906-NEXT:    ds_read_u16 v0, v0 offset:16
2398 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2399 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
2400 ; GFX906-NEXT:    v_perm_b32 v0, v0, v2, s4
2401 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2403 ; GFX803-LABEL: load_local_lo_hi_v2i16_side_effect:
2404 ; GFX803:       ; %bb.0: ; %entry
2405 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2406 ; GFX803-NEXT:    s_mov_b32 m0, -1
2407 ; GFX803-NEXT:    v_mov_b32_e32 v3, 0x7b
2408 ; GFX803-NEXT:    ds_read_u16 v2, v0
2409 ; GFX803-NEXT:    ds_write_b16 v1, v3
2410 ; GFX803-NEXT:    ds_read_u16 v0, v0 offset:16
2411 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
2412 ; GFX803-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2413 ; GFX803-NEXT:    v_or_b32_e32 v0, v2, v0
2414 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2416 ; GFX900-FLATSCR-LABEL: load_local_lo_hi_v2i16_side_effect:
2417 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2418 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2419 ; GFX900-FLATSCR-NEXT:    ds_read_u16 v2, v0
2420 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v3, 0x7b
2421 ; GFX900-FLATSCR-NEXT:    ds_write_b16 v1, v3
2422 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(1)
2423 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v2, v0 offset:16
2424 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
2425 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v2
2426 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2427 entry:
2428   %gep = getelementptr inbounds i16, ptr addrspace(3) %in, i32 8
2429   %load.lo = load i16, ptr addrspace(3) %in
2430   store i16 123, ptr addrspace(3) %may.alias
2431   %load.hi = load i16, ptr addrspace(3) %gep
2432   %build0 = insertelement <2 x i16> undef, i16 %load.lo, i32 0
2433   %build1 = insertelement <2 x i16> %build0, i16 %load.hi, i32 1
2434   ret <2 x i16> %build1
2437 ; FIXME: Remove waitcnt between reads
2438 define <2 x i16> @load_global_v2i16_split(ptr addrspace(1) %in) #0 {
2439 ; GFX900-LABEL: load_global_v2i16_split:
2440 ; GFX900:       ; %bb.0: ; %entry
2441 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2442 ; GFX900-NEXT:    global_load_ushort v2, v[0:1], off glc
2443 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2444 ; GFX900-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:2 glc
2445 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2446 ; GFX900-NEXT:    v_mov_b32_e32 v0, v2
2447 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2449 ; GFX906-LABEL: load_global_v2i16_split:
2450 ; GFX906:       ; %bb.0: ; %entry
2451 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2452 ; GFX906-NEXT:    global_load_ushort v2, v[0:1], off glc
2453 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2454 ; GFX906-NEXT:    global_load_ushort v3, v[0:1], off offset:2 glc
2455 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2456 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2457 ; GFX906-NEXT:    v_perm_b32 v0, v3, v2, s4
2458 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2460 ; GFX803-LABEL: load_global_v2i16_split:
2461 ; GFX803:       ; %bb.0: ; %entry
2462 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2463 ; GFX803-NEXT:    v_add_u32_e32 v2, vcc, 2, v0
2464 ; GFX803-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
2465 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1] glc
2466 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2467 ; GFX803-NEXT:    flat_load_ushort v1, v[2:3] glc
2468 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2469 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2470 ; GFX803-NEXT:    v_or_b32_e32 v0, v0, v1
2471 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2473 ; GFX900-FLATSCR-LABEL: load_global_v2i16_split:
2474 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2475 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2476 ; GFX900-FLATSCR-NEXT:    global_load_ushort v2, v[0:1], off glc
2477 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2478 ; GFX900-FLATSCR-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:2 glc
2479 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2480 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v2
2481 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2482 entry:
2483   %gep = getelementptr inbounds i16, ptr addrspace(1) %in, i64 1
2484   %load0 = load volatile i16, ptr addrspace(1) %in
2485   %load1 = load volatile i16, ptr addrspace(1) %gep
2486   %build0 = insertelement <2 x i16> undef, i16 %load0, i32 0
2487   %build1 = insertelement <2 x i16> %build0, i16 %load1, i32 1
2488   ret <2 x i16> %build1
2491 ; FIXME: Remove waitcnt between reads
2492 define <2 x i16> @load_flat_v2i16_split(ptr %in) #0 {
2493 ; GFX900-LABEL: load_flat_v2i16_split:
2494 ; GFX900:       ; %bb.0: ; %entry
2495 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2496 ; GFX900-NEXT:    flat_load_ushort v2, v[0:1] glc
2497 ; GFX900-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2498 ; GFX900-NEXT:    flat_load_short_d16_hi v2, v[0:1] offset:2 glc
2499 ; GFX900-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2500 ; GFX900-NEXT:    v_mov_b32_e32 v0, v2
2501 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2503 ; GFX906-LABEL: load_flat_v2i16_split:
2504 ; GFX906:       ; %bb.0: ; %entry
2505 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2506 ; GFX906-NEXT:    flat_load_ushort v2, v[0:1] glc
2507 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2508 ; GFX906-NEXT:    flat_load_ushort v3, v[0:1] offset:2 glc
2509 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2510 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2511 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
2512 ; GFX906-NEXT:    v_perm_b32 v0, v3, v2, s4
2513 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2515 ; GFX803-LABEL: load_flat_v2i16_split:
2516 ; GFX803:       ; %bb.0: ; %entry
2517 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2518 ; GFX803-NEXT:    v_add_u32_e32 v2, vcc, 2, v0
2519 ; GFX803-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
2520 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1] glc
2521 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2522 ; GFX803-NEXT:    flat_load_ushort v1, v[2:3] glc
2523 ; GFX803-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2524 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2525 ; GFX803-NEXT:    v_or_b32_e32 v0, v0, v1
2526 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2528 ; GFX900-FLATSCR-LABEL: load_flat_v2i16_split:
2529 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2530 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2531 ; GFX900-FLATSCR-NEXT:    flat_load_ushort v2, v[0:1] glc
2532 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2533 ; GFX900-FLATSCR-NEXT:    flat_load_short_d16_hi v2, v[0:1] offset:2 glc
2534 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2535 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v2
2536 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2537 entry:
2538   %gep = getelementptr inbounds i16, ptr %in, i64 1
2539   %load0 = load volatile i16, ptr %in
2540   %load1 = load volatile i16, ptr %gep
2541   %build0 = insertelement <2 x i16> undef, i16 %load0, i32 0
2542   %build1 = insertelement <2 x i16> %build0, i16 %load1, i32 1
2543   ret <2 x i16> %build1
2546 ; FIXME: Remove waitcnt between reads
2547 define <2 x i16> @load_constant_v2i16_split(ptr addrspace(4) %in) #0 {
2548 ; GFX900-LABEL: load_constant_v2i16_split:
2549 ; GFX900:       ; %bb.0: ; %entry
2550 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2551 ; GFX900-NEXT:    global_load_ushort v2, v[0:1], off glc
2552 ; GFX900-NEXT:    s_nop 0
2553 ; GFX900-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:2 glc
2554 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2555 ; GFX900-NEXT:    v_mov_b32_e32 v0, v2
2556 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2558 ; GFX906-LABEL: load_constant_v2i16_split:
2559 ; GFX906:       ; %bb.0: ; %entry
2560 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2561 ; GFX906-NEXT:    global_load_ushort v2, v[0:1], off glc
2562 ; GFX906-NEXT:    global_load_ushort v3, v[0:1], off offset:2 glc
2563 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2564 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2565 ; GFX906-NEXT:    v_perm_b32 v0, v3, v2, s4
2566 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2568 ; GFX803-LABEL: load_constant_v2i16_split:
2569 ; GFX803:       ; %bb.0: ; %entry
2570 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2571 ; GFX803-NEXT:    v_add_u32_e32 v2, vcc, 2, v0
2572 ; GFX803-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
2573 ; GFX803-NEXT:    flat_load_ushort v0, v[0:1] glc
2574 ; GFX803-NEXT:    flat_load_ushort v1, v[2:3] glc
2575 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2576 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2577 ; GFX803-NEXT:    v_or_b32_e32 v0, v0, v1
2578 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2580 ; GFX900-FLATSCR-LABEL: load_constant_v2i16_split:
2581 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2582 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2583 ; GFX900-FLATSCR-NEXT:    global_load_ushort v2, v[0:1], off glc
2584 ; GFX900-FLATSCR-NEXT:    s_nop 0
2585 ; GFX900-FLATSCR-NEXT:    global_load_short_d16_hi v2, v[0:1], off offset:2 glc
2586 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2587 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v2
2588 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2589 entry:
2590   %gep = getelementptr inbounds i16, ptr addrspace(4) %in, i64 1
2591   %load0 = load volatile i16, ptr addrspace(4) %in
2592   %load1 = load volatile i16, ptr addrspace(4) %gep
2593   %build0 = insertelement <2 x i16> undef, i16 %load0, i32 0
2594   %build1 = insertelement <2 x i16> %build0, i16 %load1, i32 1
2595   ret <2 x i16> %build1
2598 ; FIXME: Remove m0 init and waitcnt between reads
2599 ; FIXME: Is there a cost to using the extload over not?
2600 define <2 x i16> @load_private_v2i16_split(ptr addrspace(5) byval(i16) %in) #0 {
2601 ; GFX900-LABEL: load_private_v2i16_split:
2602 ; GFX900:       ; %bb.0: ; %entry
2603 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2604 ; GFX900-NEXT:    buffer_load_ushort v0, off, s[0:3], s32 glc
2605 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2606 ; GFX900-NEXT:    buffer_load_short_d16_hi v0, off, s[0:3], s32 offset:2 glc
2607 ; GFX900-NEXT:    s_waitcnt vmcnt(0)
2608 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2610 ; GFX906-LABEL: load_private_v2i16_split:
2611 ; GFX906:       ; %bb.0: ; %entry
2612 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2613 ; GFX906-NEXT:    buffer_load_ushort v0, off, s[0:3], s32 glc
2614 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2615 ; GFX906-NEXT:    buffer_load_ushort v1, off, s[0:3], s32 offset:2 glc
2616 ; GFX906-NEXT:    s_waitcnt vmcnt(0)
2617 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2618 ; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4
2619 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2621 ; GFX803-LABEL: load_private_v2i16_split:
2622 ; GFX803:       ; %bb.0: ; %entry
2623 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2624 ; GFX803-NEXT:    buffer_load_ushort v0, off, s[0:3], s32 glc
2625 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2626 ; GFX803-NEXT:    buffer_load_ushort v1, off, s[0:3], s32 offset:2 glc
2627 ; GFX803-NEXT:    s_waitcnt vmcnt(0)
2628 ; GFX803-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2629 ; GFX803-NEXT:    v_or_b32_e32 v0, v0, v1
2630 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2632 ; GFX900-FLATSCR-LABEL: load_private_v2i16_split:
2633 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2634 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2635 ; GFX900-FLATSCR-NEXT:    scratch_load_ushort v0, off, s32 glc
2636 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2637 ; GFX900-FLATSCR-NEXT:    scratch_load_short_d16_hi v0, off, s32 offset:2 glc
2638 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0)
2639 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2640 entry:
2641   %gep = getelementptr inbounds i16, ptr addrspace(5) %in, i32 1
2642   %load0 = load volatile i16, ptr addrspace(5) %in
2643   %load1 = load volatile i16, ptr addrspace(5) %gep
2644   %build0 = insertelement <2 x i16> undef, i16 %load0, i32 0
2645   %build1 = insertelement <2 x i16> %build0, i16 %load1, i32 1
2646   ret <2 x i16> %build1
2649 ; FIXME: This test should work without copying of v0.
2650 ;        ds_read_u16_d16_hi preserves low 16 bits of the destination
2651 ;        and ds_write_b16 only reads low 16 bits.
2652 define <2 x i16> @load_local_hi_v2i16_store_local_lo(i16 %reg, ptr addrspace(3) %in) #0 {
2653 ; GFX900-LABEL: load_local_hi_v2i16_store_local_lo:
2654 ; GFX900:       ; %bb.0: ; %entry
2655 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2656 ; GFX900-NEXT:    v_mov_b32_e32 v2, v0
2657 ; GFX900-NEXT:    ds_read_u16_d16_hi v2, v1
2658 ; GFX900-NEXT:    ds_write_b16 v1, v0
2659 ; GFX900-NEXT:    s_waitcnt lgkmcnt(1)
2660 ; GFX900-NEXT:    v_mov_b32_e32 v0, v2
2661 ; GFX900-NEXT:    s_waitcnt lgkmcnt(0)
2662 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
2664 ; GFX906-LABEL: load_local_hi_v2i16_store_local_lo:
2665 ; GFX906:       ; %bb.0: ; %entry
2666 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2667 ; GFX906-NEXT:    ds_read_u16 v2, v1
2668 ; GFX906-NEXT:    s_mov_b32 s4, 0x5040100
2669 ; GFX906-NEXT:    ds_write_b16 v1, v0
2670 ; GFX906-NEXT:    s_waitcnt lgkmcnt(1)
2671 ; GFX906-NEXT:    v_perm_b32 v2, v2, v0, s4
2672 ; GFX906-NEXT:    v_mov_b32_e32 v0, v2
2673 ; GFX906-NEXT:    s_waitcnt lgkmcnt(0)
2674 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
2676 ; GFX803-LABEL: load_local_hi_v2i16_store_local_lo:
2677 ; GFX803:       ; %bb.0: ; %entry
2678 ; GFX803-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2679 ; GFX803-NEXT:    s_mov_b32 m0, -1
2680 ; GFX803-NEXT:    ds_read_u16 v2, v1
2681 ; GFX803-NEXT:    s_mov_b32 s4, 0x1000504
2682 ; GFX803-NEXT:    ds_write_b16 v1, v0
2683 ; GFX803-NEXT:    s_waitcnt lgkmcnt(1)
2684 ; GFX803-NEXT:    v_perm_b32 v2, v0, v2, s4
2685 ; GFX803-NEXT:    v_mov_b32_e32 v0, v2
2686 ; GFX803-NEXT:    s_waitcnt lgkmcnt(0)
2687 ; GFX803-NEXT:    s_setpc_b64 s[30:31]
2689 ; GFX900-FLATSCR-LABEL: load_local_hi_v2i16_store_local_lo:
2690 ; GFX900-FLATSCR:       ; %bb.0: ; %entry
2691 ; GFX900-FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2692 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v2, v0
2693 ; GFX900-FLATSCR-NEXT:    ds_read_u16_d16_hi v2, v1
2694 ; GFX900-FLATSCR-NEXT:    ds_write_b16 v1, v0
2695 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(1)
2696 ; GFX900-FLATSCR-NEXT:    v_mov_b32_e32 v0, v2
2697 ; GFX900-FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
2698 ; GFX900-FLATSCR-NEXT:    s_setpc_b64 s[30:31]
2699 entry:
2700   %load = load i16, ptr addrspace(3) %in
2701   %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0
2702   %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1
2703   store volatile i16 %reg, ptr addrspace(3) %in
2704   ret <2 x i16> %build1
2707 attributes #0 = { nounwind }