blob: b082dd804354fc9c4cb5012bc950378d685d9c14 [file] [log] [blame]
Matt Arsenault810cb622014-12-12 00:00:24 +00001; RUN: llc -march=r600 -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI-CHECK -check-prefix=FUNC %s
2; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG-CHECK -check-prefix=FUNC %s
3; RUN: llc -march=r600 -mcpu=cayman < %s | FileCheck -check-prefix=CM-CHECK -check-prefix=FUNC %s
Tom Stellard754f80f2013-04-05 23:31:51 +00004
Tom Stellardd3ee8c12013-08-16 01:12:06 +00005;===------------------------------------------------------------------------===;
6; Global Address Space
7;===------------------------------------------------------------------------===;
Tom Stellard79243d92014-10-01 17:15:17 +00008; FUNC-LABEL: {{^}}store_i1:
Tom Stellard1c8788e2014-03-07 20:12:33 +00009; EG-CHECK: MEM_RAT MSKOR
Tom Stellard326d6ec2014-11-05 14:50:53 +000010; SI-CHECK: buffer_store_byte
Tom Stellard1c8788e2014-03-07 20:12:33 +000011define void @store_i1(i1 addrspace(1)* %out) {
12entry:
13 store i1 true, i1 addrspace(1)* %out
14 ret void
15}
Tom Stellardd3ee8c12013-08-16 01:12:06 +000016
17; i8 store
Tom Stellard79243d92014-10-01 17:15:17 +000018; EG-CHECK-LABEL: {{^}}store_i8:
Tom Stellardd3ee8c12013-08-16 01:12:06 +000019; EG-CHECK: MEM_RAT MSKOR T[[RW_GPR:[0-9]]].XW, T{{[0-9]}}.X
Matt Arsenault810cb622014-12-12 00:00:24 +000020
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000021; IG 0: Get the byte index and truncate the value
Matt Arsenault810cb622014-12-12 00:00:24 +000022; EG-CHECK: AND_INT * T{{[0-9]}}.[[BI_CHAN:[XYZW]]], KC0[2].Y, literal.x
23; EG-CHECK: LSHL T{{[0-9]}}.[[SHIFT_CHAN:[XYZW]]], PV.[[BI_CHAN]], literal.x
24; EG-CHECK: AND_INT * T{{[0-9]}}.[[TRUNC_CHAN:[XYZW]]], KC0[2].Z, literal.y
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000025; EG-CHECK-NEXT: 3(4.203895e-45), 255(3.573311e-43)
Matt Arsenault810cb622014-12-12 00:00:24 +000026
27
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000028; IG 1: Truncate the calculated the shift amount for the mask
Matt Arsenault810cb622014-12-12 00:00:24 +000029
Tom Stellardd3ee8c12013-08-16 01:12:06 +000030; IG 2: Shift the value and the mask
Matt Arsenault810cb622014-12-12 00:00:24 +000031; EG-CHECK: LSHL T[[RW_GPR]].X, PS, PV.[[SHIFT_CHAN]]
Tom Stellardd3ee8c12013-08-16 01:12:06 +000032; EG-CHECK: LSHL * T[[RW_GPR]].W, literal.x, PV.[[SHIFT_CHAN]]
33; EG-CHECK-NEXT: 255
34; IG 3: Initialize the Y and Z channels to zero
35; XXX: An optimal scheduler should merge this into one of the prevous IGs.
36; EG-CHECK: MOV T[[RW_GPR]].Y, 0.0
37; EG-CHECK: MOV * T[[RW_GPR]].Z, 0.0
38
Tom Stellard79243d92014-10-01 17:15:17 +000039; SI-CHECK-LABEL: {{^}}store_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +000040; SI-CHECK: 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
Tom Stellard79243d92014-10-01 17:15:17 +000049; EG-CHECK-LABEL: {{^}}store_i16:
Tom Stellardd3ee8c12013-08-16 01:12:06 +000050; EG-CHECK: 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
55; EG-CHECK: AND_INT * T{{[0-9]}}.[[BI_CHAN:[XYZW]]], KC0[2].Y, literal.x
56; EG-CHECK-NEXT: 3(4.203895e-45),
57
58; EG-CHECK: LSHL T{{[0-9]}}.[[SHIFT_CHAN:[XYZW]]], PV.[[BI_CHAN]], literal.x
59; EG-CHECK: AND_INT * T{{[0-9]}}.[[TRUNC_CHAN:[XYZW]]], KC0[2].Z, literal.y
60
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000061; EG-CHECK-NEXT: 3(4.203895e-45), 65535(9.183409e-41)
62; 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
Matt Arsenault810cb622014-12-12 00:00:24 +000065; EG-CHECK: LSHL T[[RW_GPR]].X, PS, PV.[[SHIFT_CHAN]]
Tom Stellardd3ee8c12013-08-16 01:12:06 +000066; EG-CHECK: LSHL * T[[RW_GPR]].W, literal.x, PV.[[SHIFT_CHAN]]
67; EG-CHECK-NEXT: 65535
68; IG 3: Initialize the Y and Z channels to zero
69; XXX: An optimal scheduler should merge this into one of the prevous IGs.
70; EG-CHECK: MOV T[[RW_GPR]].Y, 0.0
71; EG-CHECK: MOV * T[[RW_GPR]].Z, 0.0
72
Tom Stellard79243d92014-10-01 17:15:17 +000073; SI-CHECK-LABEL: {{^}}store_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +000074; SI-CHECK: buffer_store_short
Tom Stellardd3ee8c12013-08-16 01:12:06 +000075define void @store_i16(i16 addrspace(1)* %out, i16 %in) {
76entry:
77 store i16 %in, i16 addrspace(1)* %out
78 ret void
79}
80
Tom Stellard79243d92014-10-01 17:15:17 +000081; EG-CHECK-LABEL: {{^}}store_v2i8:
Tom Stellardfbab8272013-08-16 01:12:11 +000082; EG-CHECK: MEM_RAT MSKOR
83; EG-CHECK-NOT: MEM_RAT MSKOR
Tom Stellard79243d92014-10-01 17:15:17 +000084; SI-CHECK-LABEL: {{^}}store_v2i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +000085; SI-CHECK: buffer_store_byte
86; SI-CHECK: buffer_store_byte
Tom Stellardfbab8272013-08-16 01:12:11 +000087define void @store_v2i8(<2 x i8> addrspace(1)* %out, <2 x i32> %in) {
88entry:
89 %0 = trunc <2 x i32> %in to <2 x i8>
90 store <2 x i8> %0, <2 x i8> addrspace(1)* %out
91 ret void
92}
93
94
Tom Stellard79243d92014-10-01 17:15:17 +000095; EG-CHECK-LABEL: {{^}}store_v2i16:
Tom Stellardfbab8272013-08-16 01:12:11 +000096; EG-CHECK: MEM_RAT_CACHELESS STORE_RAW
Tom Stellard79243d92014-10-01 17:15:17 +000097; CM-CHECK-LABEL: {{^}}store_v2i16:
Tom Stellardfbab8272013-08-16 01:12:11 +000098; CM-CHECK: MEM_RAT_CACHELESS STORE_DWORD
Tom Stellard79243d92014-10-01 17:15:17 +000099; SI-CHECK-LABEL: {{^}}store_v2i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000100; SI-CHECK: buffer_store_short
101; SI-CHECK: buffer_store_short
Tom Stellardfbab8272013-08-16 01:12:11 +0000102define void @store_v2i16(<2 x i16> addrspace(1)* %out, <2 x i32> %in) {
103entry:
104 %0 = trunc <2 x i32> %in to <2 x i16>
105 store <2 x i16> %0, <2 x i16> addrspace(1)* %out
106 ret void
107}
108
Tom Stellard79243d92014-10-01 17:15:17 +0000109; EG-CHECK-LABEL: {{^}}store_v4i8:
Tom Stellardfbab8272013-08-16 01:12:11 +0000110; EG-CHECK: MEM_RAT_CACHELESS STORE_RAW
Tom Stellard79243d92014-10-01 17:15:17 +0000111; CM-CHECK-LABEL: {{^}}store_v4i8:
Tom Stellardfbab8272013-08-16 01:12:11 +0000112; CM-CHECK: MEM_RAT_CACHELESS STORE_DWORD
Tom Stellard79243d92014-10-01 17:15:17 +0000113; SI-CHECK-LABEL: {{^}}store_v4i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000114; SI-CHECK: buffer_store_byte
115; SI-CHECK: buffer_store_byte
116; SI-CHECK: buffer_store_byte
117; SI-CHECK: buffer_store_byte
Tom Stellardfbab8272013-08-16 01:12:11 +0000118define void @store_v4i8(<4 x i8> addrspace(1)* %out, <4 x i32> %in) {
119entry:
120 %0 = trunc <4 x i32> %in to <4 x i8>
121 store <4 x i8> %0, <4 x i8> addrspace(1)* %out
122 ret void
123}
124
Tom Stellard5a6b0d82013-04-19 02:10:53 +0000125; floating-point store
Tom Stellard79243d92014-10-01 17:15:17 +0000126; EG-CHECK-LABEL: {{^}}store_f32:
Tom Stellardac00f9d2013-08-16 01:11:46 +0000127; EG-CHECK: MEM_RAT_CACHELESS STORE_RAW T{{[0-9]+\.X, T[0-9]+\.X}}, 1
Tom Stellard79243d92014-10-01 17:15:17 +0000128; CM-CHECK-LABEL: {{^}}store_f32:
Tom Stellardac00f9d2013-08-16 01:11:46 +0000129; CM-CHECK: MEM_RAT_CACHELESS STORE_DWORD T{{[0-9]+\.X, T[0-9]+\.X}}
Tom Stellard79243d92014-10-01 17:15:17 +0000130; SI-CHECK-LABEL: {{^}}store_f32:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000131; SI-CHECK: buffer_store_dword
Tom Stellard754f80f2013-04-05 23:31:51 +0000132
Tom Stellard5a6b0d82013-04-19 02:10:53 +0000133define void @store_f32(float addrspace(1)* %out, float %in) {
Tom Stellard754f80f2013-04-05 23:31:51 +0000134 store float %in, float addrspace(1)* %out
135 ret void
136}
Tom Stellard0125f2a2013-06-25 02:39:35 +0000137
Tom Stellard79243d92014-10-01 17:15:17 +0000138; EG-CHECK-LABEL: {{^}}store_v4i16:
Tom Stellardfbab8272013-08-16 01:12:11 +0000139; EG-CHECK: MEM_RAT MSKOR
140; EG-CHECK: MEM_RAT MSKOR
141; EG-CHECK: MEM_RAT MSKOR
142; EG-CHECK: MEM_RAT MSKOR
143; EG-CHECK-NOT: MEM_RAT MSKOR
Tom Stellard79243d92014-10-01 17:15:17 +0000144; SI-CHECK-LABEL: {{^}}store_v4i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000145; SI-CHECK: buffer_store_short
146; SI-CHECK: buffer_store_short
147; SI-CHECK: buffer_store_short
148; SI-CHECK: buffer_store_short
149; SI-CHECK-NOT: buffer_store_byte
Tom Stellardfbab8272013-08-16 01:12:11 +0000150define void @store_v4i16(<4 x i16> addrspace(1)* %out, <4 x i32> %in) {
151entry:
152 %0 = trunc <4 x i32> %in to <4 x i16>
153 store <4 x i16> %0, <4 x i16> addrspace(1)* %out
154 ret void
155}
156
Tom Stellarded2f6142013-07-18 21:43:42 +0000157; vec2 floating-point stores
Tom Stellard79243d92014-10-01 17:15:17 +0000158; EG-CHECK-LABEL: {{^}}store_v2f32:
Tom Stellardac00f9d2013-08-16 01:11:46 +0000159; EG-CHECK: MEM_RAT_CACHELESS STORE_RAW
Tom Stellard79243d92014-10-01 17:15:17 +0000160; CM-CHECK-LABEL: {{^}}store_v2f32:
Tom Stellardac00f9d2013-08-16 01:11:46 +0000161; CM-CHECK: MEM_RAT_CACHELESS STORE_DWORD
Tom Stellard79243d92014-10-01 17:15:17 +0000162; SI-CHECK-LABEL: {{^}}store_v2f32:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000163; SI-CHECK: buffer_store_dwordx2
Tom Stellarded2f6142013-07-18 21:43:42 +0000164
165define void @store_v2f32(<2 x float> addrspace(1)* %out, float %a, float %b) {
166entry:
167 %0 = insertelement <2 x float> <float 0.0, float 0.0>, float %a, i32 0
Tom Stellard8e5da412013-08-14 23:24:32 +0000168 %1 = insertelement <2 x float> %0, float %b, i32 1
Tom Stellarded2f6142013-07-18 21:43:42 +0000169 store <2 x float> %1, <2 x float> addrspace(1)* %out
170 ret void
171}
172
Tom Stellard79243d92014-10-01 17:15:17 +0000173; EG-CHECK-LABEL: {{^}}store_v4i32:
Tom Stellard6d1379e2013-08-16 01:12:00 +0000174; EG-CHECK: MEM_RAT_CACHELESS STORE_RAW
175; EG-CHECK-NOT: MEM_RAT_CACHELESS STORE_RAW
Tom Stellard79243d92014-10-01 17:15:17 +0000176; CM-CHECK-LABEL: {{^}}store_v4i32:
Tom Stellard6d1379e2013-08-16 01:12:00 +0000177; CM-CHECK: MEM_RAT_CACHELESS STORE_DWORD
178; CM-CHECK-NOT: MEM_RAT_CACHELESS STORE_DWORD
Tom Stellard79243d92014-10-01 17:15:17 +0000179; SI-CHECK-LABEL: {{^}}store_v4i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000180; SI-CHECK: buffer_store_dwordx4
Tom Stellard6d1379e2013-08-16 01:12:00 +0000181define void @store_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> %in) {
182entry:
183 store <4 x i32> %in, <4 x i32> addrspace(1)* %out
184 ret void
185}
186
Tom Stellard79243d92014-10-01 17:15:17 +0000187; FUNC-LABEL: {{^}}store_i64_i8:
Tom Stellard605e1162014-05-02 15:41:46 +0000188; EG-CHECK: MEM_RAT MSKOR
Tom Stellard326d6ec2014-11-05 14:50:53 +0000189; SI-CHECK: buffer_store_byte
Tom Stellard605e1162014-05-02 15:41:46 +0000190define void @store_i64_i8(i8 addrspace(1)* %out, i64 %in) {
191entry:
192 %0 = trunc i64 %in to i8
193 store i8 %0, i8 addrspace(1)* %out
194 ret void
195}
196
Tom Stellard79243d92014-10-01 17:15:17 +0000197; FUNC-LABEL: {{^}}store_i64_i16:
Tom Stellard605e1162014-05-02 15:41:46 +0000198; EG-CHECK: MEM_RAT MSKOR
Tom Stellard326d6ec2014-11-05 14:50:53 +0000199; SI-CHECK: buffer_store_short
Tom Stellard605e1162014-05-02 15:41:46 +0000200define void @store_i64_i16(i16 addrspace(1)* %out, i64 %in) {
201entry:
202 %0 = trunc i64 %in to i16
203 store i16 %0, i16 addrspace(1)* %out
204 ret void
205}
206
Tom Stellard2ffc3302013-08-26 15:05:44 +0000207;===------------------------------------------------------------------------===;
208; Local Address Space
209;===------------------------------------------------------------------------===;
210
Tom Stellard79243d92014-10-01 17:15:17 +0000211; FUNC-LABEL: {{^}}store_local_i1:
Tom Stellard1c8788e2014-03-07 20:12:33 +0000212; EG-CHECK: LDS_BYTE_WRITE
Tom Stellard326d6ec2014-11-05 14:50:53 +0000213; SI-CHECK: ds_write_b8
Tom Stellard1c8788e2014-03-07 20:12:33 +0000214define void @store_local_i1(i1 addrspace(3)* %out) {
215entry:
216 store i1 true, i1 addrspace(3)* %out
217 ret void
218}
219
Tom Stellard79243d92014-10-01 17:15:17 +0000220; EG-CHECK-LABEL: {{^}}store_local_i8:
Tom Stellardf3d166a2013-08-26 15:05:49 +0000221; EG-CHECK: LDS_BYTE_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000222; SI-CHECK-LABEL: {{^}}store_local_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000223; SI-CHECK: ds_write_b8
Tom Stellardf3d166a2013-08-26 15:05:49 +0000224define void @store_local_i8(i8 addrspace(3)* %out, i8 %in) {
225 store i8 %in, i8 addrspace(3)* %out
226 ret void
227}
228
Tom Stellard79243d92014-10-01 17:15:17 +0000229; EG-CHECK-LABEL: {{^}}store_local_i16:
Tom Stellardf3d166a2013-08-26 15:05:49 +0000230; EG-CHECK: LDS_SHORT_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000231; SI-CHECK-LABEL: {{^}}store_local_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000232; SI-CHECK: ds_write_b16
Tom Stellardf3d166a2013-08-26 15:05:49 +0000233define void @store_local_i16(i16 addrspace(3)* %out, i16 %in) {
234 store i16 %in, i16 addrspace(3)* %out
235 ret void
236}
237
Tom Stellard79243d92014-10-01 17:15:17 +0000238; EG-CHECK-LABEL: {{^}}store_local_v2i16:
Tom Stellard2ffc3302013-08-26 15:05:44 +0000239; EG-CHECK: LDS_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000240; CM-CHECK-LABEL: {{^}}store_local_v2i16:
Tom Stellard2ffc3302013-08-26 15:05:44 +0000241; CM-CHECK: LDS_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000242; SI-CHECK-LABEL: {{^}}store_local_v2i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000243; SI-CHECK: ds_write_b16
244; SI-CHECK: ds_write_b16
Tom Stellard2ffc3302013-08-26 15:05:44 +0000245define void @store_local_v2i16(<2 x i16> addrspace(3)* %out, <2 x i16> %in) {
246entry:
247 store <2 x i16> %in, <2 x i16> addrspace(3)* %out
248 ret void
249}
250
Tom Stellard79243d92014-10-01 17:15:17 +0000251; EG-CHECK-LABEL: {{^}}store_local_v4i8:
Tom Stellard7da047c2013-08-26 15:05:55 +0000252; EG-CHECK: LDS_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000253; CM-CHECK-LABEL: {{^}}store_local_v4i8:
Tom Stellard7da047c2013-08-26 15:05:55 +0000254; CM-CHECK: LDS_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000255; SI-CHECK-LABEL: {{^}}store_local_v4i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000256; SI-CHECK: ds_write_b8
257; SI-CHECK: ds_write_b8
258; SI-CHECK: ds_write_b8
259; SI-CHECK: ds_write_b8
Tom Stellard7da047c2013-08-26 15:05:55 +0000260define void @store_local_v4i8(<4 x i8> addrspace(3)* %out, <4 x i8> %in) {
261entry:
262 store <4 x i8> %in, <4 x i8> addrspace(3)* %out
263 ret void
264}
265
Tom Stellard79243d92014-10-01 17:15:17 +0000266; EG-CHECK-LABEL: {{^}}store_local_v2i32:
Tom Stellard2ffc3302013-08-26 15:05:44 +0000267; EG-CHECK: LDS_WRITE
268; EG-CHECK: LDS_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000269; CM-CHECK-LABEL: {{^}}store_local_v2i32:
Tom Stellard2ffc3302013-08-26 15:05:44 +0000270; CM-CHECK: LDS_WRITE
271; CM-CHECK: LDS_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000272; SI-CHECK-LABEL: {{^}}store_local_v2i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000273; SI-CHECK: ds_write_b64
Tom Stellard2ffc3302013-08-26 15:05:44 +0000274define void @store_local_v2i32(<2 x i32> addrspace(3)* %out, <2 x i32> %in) {
275entry:
276 store <2 x i32> %in, <2 x i32> addrspace(3)* %out
277 ret void
278}
279
Tom Stellard79243d92014-10-01 17:15:17 +0000280; EG-CHECK-LABEL: {{^}}store_local_v4i32:
Tom Stellard2ffc3302013-08-26 15:05:44 +0000281; EG-CHECK: LDS_WRITE
282; EG-CHECK: LDS_WRITE
283; EG-CHECK: LDS_WRITE
284; EG-CHECK: LDS_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000285; CM-CHECK-LABEL: {{^}}store_local_v4i32:
Tom Stellard2ffc3302013-08-26 15:05:44 +0000286; CM-CHECK: LDS_WRITE
287; CM-CHECK: LDS_WRITE
288; CM-CHECK: LDS_WRITE
289; CM-CHECK: LDS_WRITE
Tom Stellard79243d92014-10-01 17:15:17 +0000290; SI-CHECK-LABEL: {{^}}store_local_v4i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000291; SI-CHECK: ds_write_b32
292; SI-CHECK: ds_write_b32
293; SI-CHECK: ds_write_b32
294; SI-CHECK: ds_write_b32
Tom Stellard2ffc3302013-08-26 15:05:44 +0000295define void @store_local_v4i32(<4 x i32> addrspace(3)* %out, <4 x i32> %in) {
296entry:
297 store <4 x i32> %in, <4 x i32> addrspace(3)* %out
298 ret void
299}
300
Tom Stellard79243d92014-10-01 17:15:17 +0000301; FUNC-LABEL: {{^}}store_local_i64_i8:
Tom Stellard605e1162014-05-02 15:41:46 +0000302; EG-CHECK: LDS_BYTE_WRITE
Tom Stellard326d6ec2014-11-05 14:50:53 +0000303; SI-CHECK: ds_write_b8
Tom Stellard605e1162014-05-02 15:41:46 +0000304define void @store_local_i64_i8(i8 addrspace(3)* %out, i64 %in) {
305entry:
306 %0 = trunc i64 %in to i8
307 store i8 %0, i8 addrspace(3)* %out
308 ret void
309}
310
Tom Stellard79243d92014-10-01 17:15:17 +0000311; FUNC-LABEL: {{^}}store_local_i64_i16:
Tom Stellard605e1162014-05-02 15:41:46 +0000312; EG-CHECK: LDS_SHORT_WRITE
Tom Stellard326d6ec2014-11-05 14:50:53 +0000313; SI-CHECK: ds_write_b16
Tom Stellard605e1162014-05-02 15:41:46 +0000314define void @store_local_i64_i16(i16 addrspace(3)* %out, i64 %in) {
315entry:
316 %0 = trunc i64 %in to i16
317 store i16 %0, i16 addrspace(3)* %out
318 ret void
319}
320
Tom Stellard0125f2a2013-06-25 02:39:35 +0000321; The stores in this function are combined by the optimizer to create a
322; 64-bit store with 32-bit alignment. This is legal for SI and the legalizer
323; should not try to split the 64-bit store back into 2 32-bit stores.
324;
325; Evergreen / Northern Islands don't support 64-bit stores yet, so there should
326; be two 32-bit stores.
327
Tom Stellard79243d92014-10-01 17:15:17 +0000328; EG-CHECK-LABEL: {{^}}vecload2:
Tom Stellardac00f9d2013-08-16 01:11:46 +0000329; EG-CHECK: MEM_RAT_CACHELESS STORE_RAW
Tom Stellard79243d92014-10-01 17:15:17 +0000330; CM-CHECK-LABEL: {{^}}vecload2:
Tom Stellardac00f9d2013-08-16 01:11:46 +0000331; CM-CHECK: MEM_RAT_CACHELESS STORE_DWORD
Tom Stellard79243d92014-10-01 17:15:17 +0000332; SI-CHECK-LABEL: {{^}}vecload2:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000333; SI-CHECK: buffer_store_dwordx2
Tom Stellard0125f2a2013-06-25 02:39:35 +0000334define void @vecload2(i32 addrspace(1)* nocapture %out, i32 addrspace(2)* nocapture %mem) #0 {
335entry:
Manman Ren1047fe42013-09-30 18:17:35 +0000336 %0 = load i32 addrspace(2)* %mem, align 4
Tom Stellard0125f2a2013-06-25 02:39:35 +0000337 %arrayidx1.i = getelementptr inbounds i32 addrspace(2)* %mem, i64 1
Manman Ren1047fe42013-09-30 18:17:35 +0000338 %1 = load i32 addrspace(2)* %arrayidx1.i, align 4
339 store i32 %0, i32 addrspace(1)* %out, align 4
Tom Stellard0125f2a2013-06-25 02:39:35 +0000340 %arrayidx1 = getelementptr inbounds i32 addrspace(1)* %out, i64 1
Manman Ren1047fe42013-09-30 18:17:35 +0000341 store i32 %1, i32 addrspace(1)* %arrayidx1, align 4
Tom Stellard0125f2a2013-06-25 02:39:35 +0000342 ret void
343}
344
Bill Wendling187d3dd2013-08-22 21:28:54 +0000345attributes #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" }
Tom Stellard868fd922014-04-17 21:00:11 +0000346
347; When i128 was a legal type this program generated cannot select errors:
348
Tom Stellard79243d92014-10-01 17:15:17 +0000349; FUNC-LABEL: {{^}}"i128-const-store":
Tom Stellard868fd922014-04-17 21:00:11 +0000350; FIXME: We should be able to to this with one store instruction
351; EG-CHECK: STORE_RAW
352; EG-CHECK: STORE_RAW
353; EG-CHECK: STORE_RAW
354; EG-CHECK: STORE_RAW
355; CM-CHECK: STORE_DWORD
356; CM-CHECK: STORE_DWORD
357; CM-CHECK: STORE_DWORD
358; CM-CHECK: STORE_DWORD
Tom Stellard326d6ec2014-11-05 14:50:53 +0000359; SI: buffer_store_dwordx2
360; SI: buffer_store_dwordx2
Tom Stellard868fd922014-04-17 21:00:11 +0000361define void @i128-const-store(i32 addrspace(1)* %out) {
362entry:
363 store i32 1, i32 addrspace(1)* %out, align 4
364 %arrayidx2 = getelementptr inbounds i32 addrspace(1)* %out, i64 1
365 store i32 1, i32 addrspace(1)* %arrayidx2, align 4
366 %arrayidx4 = getelementptr inbounds i32 addrspace(1)* %out, i64 2
367 store i32 2, i32 addrspace(1)* %arrayidx4, align 4
368 %arrayidx6 = getelementptr inbounds i32 addrspace(1)* %out, i64 3
369 store i32 2, i32 addrspace(1)* %arrayidx6, align 4
370 ret void
371}