blob: e4034093f89869dab3e902e19b1df076121ba010 [file] [log] [blame]
Marek Olsak37cd4d02015-02-03 21:53:27 +00001; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4; RUN: llc -march=r600 -mcpu=cayman < %s | FileCheck -check-prefix=CM -check-prefix=FUNC %s
Tom Stellard754f80f2013-04-05 23:31:51 +00005
Tom Stellardd3ee8c12013-08-16 01:12:06 +00006;===------------------------------------------------------------------------===;
7; Global Address Space
8;===------------------------------------------------------------------------===;
Tom Stellard79243d92014-10-01 17:15:17 +00009; FUNC-LABEL: {{^}}store_i1:
Marek Olsak37cd4d02015-02-03 21:53:27 +000010; EG: MEM_RAT MSKOR
11; SI: buffer_store_byte
Tom Stellard1c8788e2014-03-07 20:12:33 +000012define void @store_i1(i1 addrspace(1)* %out) {
13entry:
14 store i1 true, i1 addrspace(1)* %out
15 ret void
16}
Tom Stellardd3ee8c12013-08-16 01:12:06 +000017
18; i8 store
Matt Arsenaultda5ece82015-03-21 19:15:46 +000019; FUNC-LABEL: {{^}}store_i8:
Marek Olsak37cd4d02015-02-03 21:53:27 +000020; EG: MEM_RAT MSKOR T[[RW_GPR:[0-9]]].XW, T{{[0-9]}}.X
Matt Arsenault810cb622014-12-12 00:00:24 +000021
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000022; IG 0: Get the byte index and truncate the value
Marek Olsak37cd4d02015-02-03 21:53:27 +000023; EG: AND_INT * T{{[0-9]}}.[[BI_CHAN:[XYZW]]], KC0[2].Y, literal.x
24; EG: LSHL T{{[0-9]}}.[[SHIFT_CHAN:[XYZW]]], PV.[[BI_CHAN]], literal.x
25; EG: AND_INT * T{{[0-9]}}.[[TRUNC_CHAN:[XYZW]]], KC0[2].Z, literal.y
26; EG-NEXT: 3(4.203895e-45), 255(3.573311e-43)
Matt Arsenault810cb622014-12-12 00:00:24 +000027
28
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000029; IG 1: Truncate the calculated the shift amount for the mask
Matt Arsenault810cb622014-12-12 00:00:24 +000030
Tom Stellardd3ee8c12013-08-16 01:12:06 +000031; IG 2: Shift the value and the mask
Marek Olsak37cd4d02015-02-03 21:53:27 +000032; EG: LSHL T[[RW_GPR]].X, PS, PV.[[SHIFT_CHAN]]
33; EG: LSHL * T[[RW_GPR]].W, literal.x, PV.[[SHIFT_CHAN]]
34; EG-NEXT: 255
Tom Stellardd3ee8c12013-08-16 01:12:06 +000035; IG 3: Initialize the Y and Z channels to zero
36; XXX: An optimal scheduler should merge this into one of the prevous IGs.
Marek Olsak37cd4d02015-02-03 21:53:27 +000037; EG: MOV T[[RW_GPR]].Y, 0.0
38; EG: MOV * T[[RW_GPR]].Z, 0.0
Tom Stellardd3ee8c12013-08-16 01:12:06 +000039
Marek Olsak37cd4d02015-02-03 21:53:27 +000040; SI: buffer_store_byte
Tom Stellardd3ee8c12013-08-16 01:12:06 +000041
42define void @store_i8(i8 addrspace(1)* %out, i8 %in) {
43entry:
44 store i8 %in, i8 addrspace(1)* %out
45 ret void
46}
47
48; i16 store
Matt Arsenaultda5ece82015-03-21 19:15:46 +000049; FUNC-LABEL: {{^}}store_i16:
Marek Olsak37cd4d02015-02-03 21:53:27 +000050; EG: MEM_RAT MSKOR T[[RW_GPR:[0-9]]].XW, T{{[0-9]}}.X
Matt Arsenault810cb622014-12-12 00:00:24 +000051
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000052; IG 0: Get the byte index and truncate the value
Matt Arsenault810cb622014-12-12 00:00:24 +000053
54
Marek Olsak37cd4d02015-02-03 21:53:27 +000055; EG: AND_INT * T{{[0-9]}}.[[BI_CHAN:[XYZW]]], KC0[2].Y, literal.x
56; EG-NEXT: 3(4.203895e-45),
Matt Arsenault810cb622014-12-12 00:00:24 +000057
Marek Olsak37cd4d02015-02-03 21:53:27 +000058; EG: LSHL T{{[0-9]}}.[[SHIFT_CHAN:[XYZW]]], PV.[[BI_CHAN]], literal.x
59; EG: AND_INT * T{{[0-9]}}.[[TRUNC_CHAN:[XYZW]]], KC0[2].Z, literal.y
Matt Arsenault810cb622014-12-12 00:00:24 +000060
Marek Olsak37cd4d02015-02-03 21:53:27 +000061; EG-NEXT: 3(4.203895e-45), 65535(9.183409e-41)
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000062; IG 1: Truncate the calculated the shift amount for the mask
Matt Arsenault810cb622014-12-12 00:00:24 +000063
Tom Stellardd3ee8c12013-08-16 01:12:06 +000064; IG 2: Shift the value and the mask
Marek Olsak37cd4d02015-02-03 21:53:27 +000065; EG: LSHL T[[RW_GPR]].X, PS, PV.[[SHIFT_CHAN]]
66; EG: LSHL * T[[RW_GPR]].W, literal.x, PV.[[SHIFT_CHAN]]
67; EG-NEXT: 65535
Tom Stellardd3ee8c12013-08-16 01:12:06 +000068; IG 3: Initialize the Y and Z channels to zero
69; XXX: An optimal scheduler should merge this into one of the prevous IGs.
Marek Olsak37cd4d02015-02-03 21:53:27 +000070; EG: MOV T[[RW_GPR]].Y, 0.0
71; EG: MOV * T[[RW_GPR]].Z, 0.0
Tom Stellardd3ee8c12013-08-16 01:12:06 +000072
Marek Olsak37cd4d02015-02-03 21:53:27 +000073; SI: buffer_store_short
Tom Stellardd3ee8c12013-08-16 01:12:06 +000074define void @store_i16(i16 addrspace(1)* %out, i16 %in) {
75entry:
76 store i16 %in, i16 addrspace(1)* %out
77 ret void
78}
79
Matt Arsenaultda5ece82015-03-21 19:15:46 +000080; FUNC-LABEL: {{^}}store_v2i8:
Marek Olsak37cd4d02015-02-03 21:53:27 +000081; EG: MEM_RAT MSKOR
82; EG-NOT: MEM_RAT MSKOR
Matt Arsenaultda5ece82015-03-21 19:15:46 +000083
Marek Olsak37cd4d02015-02-03 21:53:27 +000084; SI: buffer_store_byte
85; SI: buffer_store_byte
Tom Stellardfbab8272013-08-16 01:12:11 +000086define void @store_v2i8(<2 x i8> addrspace(1)* %out, <2 x i32> %in) {
87entry:
88 %0 = trunc <2 x i32> %in to <2 x i8>
89 store <2 x i8> %0, <2 x i8> addrspace(1)* %out
90 ret void
91}
92
93
Matt Arsenaultda5ece82015-03-21 19:15:46 +000094; FUNC-LABEL: {{^}}store_v2i16:
Marek Olsak37cd4d02015-02-03 21:53:27 +000095; EG: MEM_RAT_CACHELESS STORE_RAW
Matt Arsenaultda5ece82015-03-21 19:15:46 +000096
Marek Olsak37cd4d02015-02-03 21:53:27 +000097; CM: MEM_RAT_CACHELESS STORE_DWORD
Matt Arsenaultda5ece82015-03-21 19:15:46 +000098
Marek Olsak37cd4d02015-02-03 21:53:27 +000099; SI: buffer_store_short
100; SI: buffer_store_short
Tom Stellardfbab8272013-08-16 01:12:11 +0000101define void @store_v2i16(<2 x i16> addrspace(1)* %out, <2 x i32> %in) {
102entry:
103 %0 = trunc <2 x i32> %in to <2 x i16>
104 store <2 x i16> %0, <2 x i16> addrspace(1)* %out
105 ret void
106}
107
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000108; FUNC-LABEL: {{^}}store_v4i8:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000109; EG: MEM_RAT_CACHELESS STORE_RAW
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000110
Marek Olsak37cd4d02015-02-03 21:53:27 +0000111; CM: MEM_RAT_CACHELESS STORE_DWORD
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000112
Marek Olsak37cd4d02015-02-03 21:53:27 +0000113; SI: buffer_store_byte
114; SI: buffer_store_byte
115; SI: buffer_store_byte
116; SI: buffer_store_byte
Tom Stellardfbab8272013-08-16 01:12:11 +0000117define void @store_v4i8(<4 x i8> addrspace(1)* %out, <4 x i32> %in) {
118entry:
119 %0 = trunc <4 x i32> %in to <4 x i8>
120 store <4 x i8> %0, <4 x i8> addrspace(1)* %out
121 ret void
122}
123
Tom Stellard5a6b0d82013-04-19 02:10:53 +0000124; floating-point store
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000125; FUNC-LABEL: {{^}}store_f32:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000126; EG: MEM_RAT_CACHELESS STORE_RAW T{{[0-9]+\.X, T[0-9]+\.X}}, 1
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000127
Marek Olsak37cd4d02015-02-03 21:53:27 +0000128; CM: MEM_RAT_CACHELESS STORE_DWORD T{{[0-9]+\.X, T[0-9]+\.X}}
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000129
Marek Olsak37cd4d02015-02-03 21:53:27 +0000130; SI: buffer_store_dword
Tom Stellard754f80f2013-04-05 23:31:51 +0000131
Tom Stellard5a6b0d82013-04-19 02:10:53 +0000132define void @store_f32(float addrspace(1)* %out, float %in) {
Tom Stellard754f80f2013-04-05 23:31:51 +0000133 store float %in, float addrspace(1)* %out
134 ret void
135}
Tom Stellard0125f2a2013-06-25 02:39:35 +0000136
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000137; FUNC-LABEL: {{^}}store_v4i16:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000138; EG: MEM_RAT MSKOR
139; EG: MEM_RAT MSKOR
140; EG: MEM_RAT MSKOR
141; EG: MEM_RAT MSKOR
142; EG-NOT: MEM_RAT MSKOR
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000143
Marek Olsak37cd4d02015-02-03 21:53:27 +0000144; SI: buffer_store_short
145; SI: buffer_store_short
146; SI: buffer_store_short
147; SI: buffer_store_short
148; SI-NOT: buffer_store_byte
Tom Stellardfbab8272013-08-16 01:12:11 +0000149define void @store_v4i16(<4 x i16> addrspace(1)* %out, <4 x i32> %in) {
150entry:
151 %0 = trunc <4 x i32> %in to <4 x i16>
152 store <4 x i16> %0, <4 x i16> addrspace(1)* %out
153 ret void
154}
155
Tom Stellarded2f6142013-07-18 21:43:42 +0000156; vec2 floating-point stores
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000157; FUNC-LABEL: {{^}}store_v2f32:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000158; EG: MEM_RAT_CACHELESS STORE_RAW
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000159
Marek Olsak37cd4d02015-02-03 21:53:27 +0000160; CM: MEM_RAT_CACHELESS STORE_DWORD
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000161
Marek Olsak37cd4d02015-02-03 21:53:27 +0000162; SI: buffer_store_dwordx2
Tom Stellarded2f6142013-07-18 21:43:42 +0000163
164define void @store_v2f32(<2 x float> addrspace(1)* %out, float %a, float %b) {
165entry:
166 %0 = insertelement <2 x float> <float 0.0, float 0.0>, float %a, i32 0
Tom Stellard8e5da412013-08-14 23:24:32 +0000167 %1 = insertelement <2 x float> %0, float %b, i32 1
Tom Stellarded2f6142013-07-18 21:43:42 +0000168 store <2 x float> %1, <2 x float> addrspace(1)* %out
169 ret void
170}
171
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000172; FUNC-LABEL: {{^}}store_v4i32:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000173; EG: MEM_RAT_CACHELESS STORE_RAW
174; EG-NOT: MEM_RAT_CACHELESS STORE_RAW
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000175
Marek Olsak37cd4d02015-02-03 21:53:27 +0000176; CM: MEM_RAT_CACHELESS STORE_DWORD
177; CM-NOT: MEM_RAT_CACHELESS STORE_DWORD
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000178
Marek Olsak37cd4d02015-02-03 21:53:27 +0000179; SI: buffer_store_dwordx4
Tom Stellard6d1379e2013-08-16 01:12:00 +0000180define void @store_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> %in) {
181entry:
182 store <4 x i32> %in, <4 x i32> addrspace(1)* %out
183 ret void
184}
185
Tom Stellard79243d92014-10-01 17:15:17 +0000186; FUNC-LABEL: {{^}}store_i64_i8:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000187; EG: MEM_RAT MSKOR
188; SI: buffer_store_byte
Tom Stellard605e1162014-05-02 15:41:46 +0000189define void @store_i64_i8(i8 addrspace(1)* %out, i64 %in) {
190entry:
191 %0 = trunc i64 %in to i8
192 store i8 %0, i8 addrspace(1)* %out
193 ret void
194}
195
Tom Stellard79243d92014-10-01 17:15:17 +0000196; FUNC-LABEL: {{^}}store_i64_i16:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000197; EG: MEM_RAT MSKOR
198; SI: buffer_store_short
Tom Stellard605e1162014-05-02 15:41:46 +0000199define void @store_i64_i16(i16 addrspace(1)* %out, i64 %in) {
200entry:
201 %0 = trunc i64 %in to i16
202 store i16 %0, i16 addrspace(1)* %out
203 ret void
204}
205
Tom Stellard2ffc3302013-08-26 15:05:44 +0000206;===------------------------------------------------------------------------===;
207; Local Address Space
208;===------------------------------------------------------------------------===;
209
Tom Stellard79243d92014-10-01 17:15:17 +0000210; FUNC-LABEL: {{^}}store_local_i1:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000211; EG: LDS_BYTE_WRITE
212; SI: ds_write_b8
Tom Stellard1c8788e2014-03-07 20:12:33 +0000213define void @store_local_i1(i1 addrspace(3)* %out) {
214entry:
215 store i1 true, i1 addrspace(3)* %out
216 ret void
217}
218
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000219; FUNC-LABEL: {{^}}store_local_i8:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000220; EG: LDS_BYTE_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000221
Marek Olsak37cd4d02015-02-03 21:53:27 +0000222; SI: ds_write_b8
Tom Stellardf3d166a2013-08-26 15:05:49 +0000223define void @store_local_i8(i8 addrspace(3)* %out, i8 %in) {
224 store i8 %in, i8 addrspace(3)* %out
225 ret void
226}
227
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000228; FUNC-LABEL: {{^}}store_local_i16:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000229; EG: LDS_SHORT_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000230
Marek Olsak37cd4d02015-02-03 21:53:27 +0000231; SI: ds_write_b16
Tom Stellardf3d166a2013-08-26 15:05:49 +0000232define void @store_local_i16(i16 addrspace(3)* %out, i16 %in) {
233 store i16 %in, i16 addrspace(3)* %out
234 ret void
235}
236
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000237; FUNC-LABEL: {{^}}store_local_v2i16:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000238; EG: LDS_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000239
Marek Olsak37cd4d02015-02-03 21:53:27 +0000240; CM: LDS_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000241
Marek Olsak37cd4d02015-02-03 21:53:27 +0000242; SI: ds_write_b16
243; SI: ds_write_b16
Tom Stellard2ffc3302013-08-26 15:05:44 +0000244define void @store_local_v2i16(<2 x i16> addrspace(3)* %out, <2 x i16> %in) {
245entry:
246 store <2 x i16> %in, <2 x i16> addrspace(3)* %out
247 ret void
248}
249
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000250; FUNC-LABEL: {{^}}store_local_v4i8:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000251; EG: LDS_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000252
Marek Olsak37cd4d02015-02-03 21:53:27 +0000253; CM: LDS_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000254
Marek Olsak37cd4d02015-02-03 21:53:27 +0000255; SI: ds_write_b8
256; SI: ds_write_b8
257; SI: ds_write_b8
258; SI: ds_write_b8
Tom Stellard7da047c2013-08-26 15:05:55 +0000259define void @store_local_v4i8(<4 x i8> addrspace(3)* %out, <4 x i8> %in) {
260entry:
261 store <4 x i8> %in, <4 x i8> addrspace(3)* %out
262 ret void
263}
264
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000265; FUNC-LABEL: {{^}}store_local_v2i32:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000266; EG: LDS_WRITE
267; EG: LDS_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000268
Marek Olsak37cd4d02015-02-03 21:53:27 +0000269; CM: LDS_WRITE
270; CM: LDS_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000271
Marek Olsak37cd4d02015-02-03 21:53:27 +0000272; SI: ds_write_b64
Tom Stellard2ffc3302013-08-26 15:05:44 +0000273define void @store_local_v2i32(<2 x i32> addrspace(3)* %out, <2 x i32> %in) {
274entry:
275 store <2 x i32> %in, <2 x i32> addrspace(3)* %out
276 ret void
277}
278
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000279; FUNC-LABEL: {{^}}store_local_v4i32:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000280; EG: LDS_WRITE
281; EG: LDS_WRITE
282; EG: LDS_WRITE
283; EG: LDS_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000284
Marek Olsak37cd4d02015-02-03 21:53:27 +0000285; CM: LDS_WRITE
286; CM: LDS_WRITE
287; CM: LDS_WRITE
288; CM: LDS_WRITE
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000289
Matt Arsenaultff05da82015-11-24 12:18:54 +0000290; SI: ds_write_b64
291; SI: ds_write_b64
Tom Stellard2ffc3302013-08-26 15:05:44 +0000292define void @store_local_v4i32(<4 x i32> addrspace(3)* %out, <4 x i32> %in) {
293entry:
294 store <4 x i32> %in, <4 x i32> addrspace(3)* %out
295 ret void
296}
297
Matt Arsenaultff05da82015-11-24 12:18:54 +0000298; FUNC-LABEL: {{^}}store_local_v4i32_align4:
299; EG: LDS_WRITE
300; EG: LDS_WRITE
301; EG: LDS_WRITE
302; EG: LDS_WRITE
303
304; CM: LDS_WRITE
305; CM: LDS_WRITE
306; CM: LDS_WRITE
307; CM: LDS_WRITE
308
309; SI: ds_write2_b32
310; SI: ds_write2_b32
311define void @store_local_v4i32_align4(<4 x i32> addrspace(3)* %out, <4 x i32> %in) {
312entry:
313 store <4 x i32> %in, <4 x i32> addrspace(3)* %out, align 4
314 ret void
315}
316
Tom Stellard79243d92014-10-01 17:15:17 +0000317; FUNC-LABEL: {{^}}store_local_i64_i8:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000318; EG: LDS_BYTE_WRITE
319; SI: ds_write_b8
Tom Stellard605e1162014-05-02 15:41:46 +0000320define void @store_local_i64_i8(i8 addrspace(3)* %out, i64 %in) {
321entry:
322 %0 = trunc i64 %in to i8
323 store i8 %0, i8 addrspace(3)* %out
324 ret void
325}
326
Tom Stellard79243d92014-10-01 17:15:17 +0000327; FUNC-LABEL: {{^}}store_local_i64_i16:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000328; EG: LDS_SHORT_WRITE
329; SI: ds_write_b16
Tom Stellard605e1162014-05-02 15:41:46 +0000330define void @store_local_i64_i16(i16 addrspace(3)* %out, i64 %in) {
331entry:
332 %0 = trunc i64 %in to i16
333 store i16 %0, i16 addrspace(3)* %out
334 ret void
335}
336
Tom Stellard0125f2a2013-06-25 02:39:35 +0000337; The stores in this function are combined by the optimizer to create a
338; 64-bit store with 32-bit alignment. This is legal for SI and the legalizer
339; should not try to split the 64-bit store back into 2 32-bit stores.
340;
341; Evergreen / Northern Islands don't support 64-bit stores yet, so there should
342; be two 32-bit stores.
343
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000344; FUNC-LABEL: {{^}}vecload2:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000345; EG: MEM_RAT_CACHELESS STORE_RAW
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000346
Marek Olsak37cd4d02015-02-03 21:53:27 +0000347; CM: MEM_RAT_CACHELESS STORE_DWORD
Matt Arsenaultda5ece82015-03-21 19:15:46 +0000348
Marek Olsak37cd4d02015-02-03 21:53:27 +0000349; SI: buffer_store_dwordx2
Tom Stellard0125f2a2013-06-25 02:39:35 +0000350define void @vecload2(i32 addrspace(1)* nocapture %out, i32 addrspace(2)* nocapture %mem) #0 {
351entry:
David Blaikiea79ac142015-02-27 21:17:42 +0000352 %0 = load i32, i32 addrspace(2)* %mem, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000353 %arrayidx1.i = getelementptr inbounds i32, i32 addrspace(2)* %mem, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +0000354 %1 = load i32, i32 addrspace(2)* %arrayidx1.i, align 4
Manman Ren1047fe42013-09-30 18:17:35 +0000355 store i32 %0, i32 addrspace(1)* %out, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000356 %arrayidx1 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 1
Manman Ren1047fe42013-09-30 18:17:35 +0000357 store i32 %1, i32 addrspace(1)* %arrayidx1, align 4
Tom Stellard0125f2a2013-06-25 02:39:35 +0000358 ret void
359}
360
Tom Stellard868fd922014-04-17 21:00:11 +0000361; When i128 was a legal type this program generated cannot select errors:
362
Tom Stellard79243d92014-10-01 17:15:17 +0000363; FUNC-LABEL: {{^}}"i128-const-store":
Matt Arsenaultfa67bdb2016-02-22 21:04:16 +0000364; EG: MEM_RAT_CACHELESS STORE_RAW T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 1
365
366; CM: MEM_RAT_CACHELESS STORE_DWORD T{{[0-9]+}}, T{{[0-9]+}}.X
367
Matt Arsenault65ad1602015-05-24 00:51:27 +0000368; SI: buffer_store_dwordx4
Tom Stellard868fd922014-04-17 21:00:11 +0000369define void @i128-const-store(i32 addrspace(1)* %out) {
370entry:
371 store i32 1, i32 addrspace(1)* %out, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000372 %arrayidx2 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 1
Tom Stellard868fd922014-04-17 21:00:11 +0000373 store i32 1, i32 addrspace(1)* %arrayidx2, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000374 %arrayidx4 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 2
Tom Stellard868fd922014-04-17 21:00:11 +0000375 store i32 2, i32 addrspace(1)* %arrayidx4, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000376 %arrayidx6 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 3
Tom Stellard868fd922014-04-17 21:00:11 +0000377 store i32 2, i32 addrspace(1)* %arrayidx6, align 4
378 ret void
379}
Matt Arsenaultfa67bdb2016-02-22 21:04:16 +0000380
381attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }