blob: 1b6d8dc533af72b90c5c0095ee287aeb2097f824 [file] [log] [blame]
Tom Stellard9daed222016-10-26 14:21:09 +00001; RUN: llc -O0 -mtriple=amdgcn-mesa-mesa3d -mcpu=bonaire < %s | FileCheck %s
2; RUN: llc -O0 -mtriple=amdgcn-mesa-mesa3d -mcpu=tonga < %s | FileCheck %s
Matt Arsenault3f981402014-09-15 15:41:53 +00003
4; Disable optimizations in case there are optimizations added that
5; specialize away generic pointer accesses.
6
7
Matt Arsenault3f981402014-09-15 15:41:53 +00008; These testcases might become useless when there are optimizations to
9; remove generic pointers.
10
Tom Stellard79243d92014-10-01 17:15:17 +000011; CHECK-LABEL: {{^}}store_flat_i32:
Nicolai Haehnledd587052015-12-19 01:16:06 +000012; CHECK-DAG: s_load_dwordx2 s{{\[}}[[LO_SREG:[0-9]+]]:[[HI_SREG:[0-9]+]]],
13; CHECK-DAG: s_load_dword s[[SDATA:[0-9]+]],
14; CHECK: s_waitcnt lgkmcnt(0)
15; CHECK-DAG: v_mov_b32_e32 v[[DATA:[0-9]+]], s[[SDATA]]
16; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], s[[LO_SREG]]
17; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], s[[HI_SREG]]
Tom Stellard46937ca2016-02-12 17:57:54 +000018; CHECK: flat_store_dword v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}, v[[DATA]]
Matt Arsenault3f981402014-09-15 15:41:53 +000019define void @store_flat_i32(i32 addrspace(1)* %gptr, i32 %x) #0 {
20 %fptr = addrspacecast i32 addrspace(1)* %gptr to i32 addrspace(4)*
21 store i32 %x, i32 addrspace(4)* %fptr, align 4
22 ret void
23}
24
Tom Stellard79243d92014-10-01 17:15:17 +000025; CHECK-LABEL: {{^}}store_flat_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000026; CHECK: flat_store_dwordx2
Matt Arsenault3f981402014-09-15 15:41:53 +000027define void @store_flat_i64(i64 addrspace(1)* %gptr, i64 %x) #0 {
28 %fptr = addrspacecast i64 addrspace(1)* %gptr to i64 addrspace(4)*
29 store i64 %x, i64 addrspace(4)* %fptr, align 8
30 ret void
31}
32
Tom Stellard79243d92014-10-01 17:15:17 +000033; CHECK-LABEL: {{^}}store_flat_v4i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +000034; CHECK: flat_store_dwordx4
Matt Arsenault3f981402014-09-15 15:41:53 +000035define void @store_flat_v4i32(<4 x i32> addrspace(1)* %gptr, <4 x i32> %x) #0 {
36 %fptr = addrspacecast <4 x i32> addrspace(1)* %gptr to <4 x i32> addrspace(4)*
37 store <4 x i32> %x, <4 x i32> addrspace(4)* %fptr, align 16
38 ret void
39}
40
Tom Stellard79243d92014-10-01 17:15:17 +000041; CHECK-LABEL: {{^}}store_flat_trunc_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +000042; CHECK: flat_store_short
Matt Arsenault3f981402014-09-15 15:41:53 +000043define void @store_flat_trunc_i16(i16 addrspace(1)* %gptr, i32 %x) #0 {
44 %fptr = addrspacecast i16 addrspace(1)* %gptr to i16 addrspace(4)*
45 %y = trunc i32 %x to i16
46 store i16 %y, i16 addrspace(4)* %fptr, align 2
47 ret void
48}
49
Tom Stellard79243d92014-10-01 17:15:17 +000050; CHECK-LABEL: {{^}}store_flat_trunc_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +000051; CHECK: flat_store_byte
Matt Arsenault3f981402014-09-15 15:41:53 +000052define void @store_flat_trunc_i8(i8 addrspace(1)* %gptr, i32 %x) #0 {
53 %fptr = addrspacecast i8 addrspace(1)* %gptr to i8 addrspace(4)*
54 %y = trunc i32 %x to i8
55 store i8 %y, i8 addrspace(4)* %fptr, align 2
56 ret void
57}
58
59
60
Hans Wennborg4a613702015-08-31 21:10:35 +000061; CHECK-LABEL: load_flat_i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +000062; CHECK: flat_load_dword
Matt Arsenault3f981402014-09-15 15:41:53 +000063define void @load_flat_i32(i32 addrspace(1)* noalias %out, i32 addrspace(1)* noalias %gptr) #0 {
64 %fptr = addrspacecast i32 addrspace(1)* %gptr to i32 addrspace(4)*
David Blaikiea79ac142015-02-27 21:17:42 +000065 %fload = load i32, i32 addrspace(4)* %fptr, align 4
Matt Arsenault3f981402014-09-15 15:41:53 +000066 store i32 %fload, i32 addrspace(1)* %out, align 4
67 ret void
68}
69
Hans Wennborg4a613702015-08-31 21:10:35 +000070; CHECK-LABEL: load_flat_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000071; CHECK: flat_load_dwordx2
Matt Arsenault3f981402014-09-15 15:41:53 +000072define void @load_flat_i64(i64 addrspace(1)* noalias %out, i64 addrspace(1)* noalias %gptr) #0 {
73 %fptr = addrspacecast i64 addrspace(1)* %gptr to i64 addrspace(4)*
Tom Stellard64a9d082016-10-14 18:10:39 +000074 %fload = load i64, i64 addrspace(4)* %fptr, align 8
Matt Arsenault3f981402014-09-15 15:41:53 +000075 store i64 %fload, i64 addrspace(1)* %out, align 8
76 ret void
77}
78
Hans Wennborg4a613702015-08-31 21:10:35 +000079; CHECK-LABEL: load_flat_v4i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +000080; CHECK: flat_load_dwordx4
Matt Arsenault3f981402014-09-15 15:41:53 +000081define void @load_flat_v4i32(<4 x i32> addrspace(1)* noalias %out, <4 x i32> addrspace(1)* noalias %gptr) #0 {
82 %fptr = addrspacecast <4 x i32> addrspace(1)* %gptr to <4 x i32> addrspace(4)*
Tom Stellard64a9d082016-10-14 18:10:39 +000083 %fload = load <4 x i32>, <4 x i32> addrspace(4)* %fptr, align 32
Matt Arsenault3f981402014-09-15 15:41:53 +000084 store <4 x i32> %fload, <4 x i32> addrspace(1)* %out, align 8
85 ret void
86}
87
Hans Wennborg4a613702015-08-31 21:10:35 +000088; CHECK-LABEL: sextload_flat_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +000089; CHECK: flat_load_sbyte
Matt Arsenault3f981402014-09-15 15:41:53 +000090define void @sextload_flat_i8(i32 addrspace(1)* noalias %out, i8 addrspace(1)* noalias %gptr) #0 {
91 %fptr = addrspacecast i8 addrspace(1)* %gptr to i8 addrspace(4)*
David Blaikiea79ac142015-02-27 21:17:42 +000092 %fload = load i8, i8 addrspace(4)* %fptr, align 4
Matt Arsenault3f981402014-09-15 15:41:53 +000093 %ext = sext i8 %fload to i32
94 store i32 %ext, i32 addrspace(1)* %out, align 4
95 ret void
96}
97
Hans Wennborg4a613702015-08-31 21:10:35 +000098; CHECK-LABEL: zextload_flat_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +000099; CHECK: flat_load_ubyte
Matt Arsenault3f981402014-09-15 15:41:53 +0000100define void @zextload_flat_i8(i32 addrspace(1)* noalias %out, i8 addrspace(1)* noalias %gptr) #0 {
101 %fptr = addrspacecast i8 addrspace(1)* %gptr to i8 addrspace(4)*
David Blaikiea79ac142015-02-27 21:17:42 +0000102 %fload = load i8, i8 addrspace(4)* %fptr, align 4
Matt Arsenault3f981402014-09-15 15:41:53 +0000103 %ext = zext i8 %fload to i32
104 store i32 %ext, i32 addrspace(1)* %out, align 4
105 ret void
106}
107
Hans Wennborg4a613702015-08-31 21:10:35 +0000108; CHECK-LABEL: sextload_flat_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000109; CHECK: flat_load_sshort
Matt Arsenault3f981402014-09-15 15:41:53 +0000110define void @sextload_flat_i16(i32 addrspace(1)* noalias %out, i16 addrspace(1)* noalias %gptr) #0 {
111 %fptr = addrspacecast i16 addrspace(1)* %gptr to i16 addrspace(4)*
David Blaikiea79ac142015-02-27 21:17:42 +0000112 %fload = load i16, i16 addrspace(4)* %fptr, align 4
Matt Arsenault3f981402014-09-15 15:41:53 +0000113 %ext = sext i16 %fload to i32
114 store i32 %ext, i32 addrspace(1)* %out, align 4
115 ret void
116}
117
Hans Wennborg4a613702015-08-31 21:10:35 +0000118; CHECK-LABEL: zextload_flat_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000119; CHECK: flat_load_ushort
Matt Arsenault3f981402014-09-15 15:41:53 +0000120define void @zextload_flat_i16(i32 addrspace(1)* noalias %out, i16 addrspace(1)* noalias %gptr) #0 {
121 %fptr = addrspacecast i16 addrspace(1)* %gptr to i16 addrspace(4)*
David Blaikiea79ac142015-02-27 21:17:42 +0000122 %fload = load i16, i16 addrspace(4)* %fptr, align 4
Matt Arsenault3f981402014-09-15 15:41:53 +0000123 %ext = zext i16 %fload to i32
124 store i32 %ext, i32 addrspace(1)* %out, align 4
125 ret void
126}
127
Tom Stellard64a9d082016-10-14 18:10:39 +0000128; CHECK-LABEL: flat_scratch_unaligned_load:
129; CHECK: flat_load_ubyte
130; CHECK: flat_load_ubyte
131; CHECK: flat_load_ubyte
132; CHECK: flat_load_ubyte
133define void @flat_scratch_unaligned_load() {
134 %scratch = alloca i32
135 %fptr = addrspacecast i32* %scratch to i32 addrspace(4)*
136 %ld = load volatile i32, i32 addrspace(4)* %fptr, align 1
137 ret void
138}
139
140; CHECK-LABEL: flat_scratch_unaligned_store:
141; CHECK: flat_store_byte
142; CHECK: flat_store_byte
143; CHECK: flat_store_byte
144; CHECK: flat_store_byte
145define void @flat_scratch_unaligned_store() {
146 %scratch = alloca i32
147 %fptr = addrspacecast i32* %scratch to i32 addrspace(4)*
148 store volatile i32 0, i32 addrspace(4)* %fptr, align 1
149 ret void
150}
151
Matt Arsenault3f981402014-09-15 15:41:53 +0000152attributes #0 = { nounwind }
Matt Arsenault2aed6ca2015-12-19 01:46:41 +0000153attributes #1 = { nounwind convergent }
Matt Arsenault3f981402014-09-15 15:41:53 +0000154attributes #3 = { nounwind readnone }