R600: Call EmitFunctionHeader() in the AsmPrinter to populate the ELF symbol table
[oota-llvm.git] / test / CodeGen / R600 / concat_vectors.ll
1 ; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2
3 ; FUNC-LABEL: {{^}}test_concat_v1i32:
4 ; 0x80f000 is the high 32 bits of the resource descriptor used by MUBUF
5 ; instructions that access scratch memory.  Bit 23, which is the add_tid_enable
6 ; bit, is only set for scratch access, so we can check for the absence of this
7 ; value if we want to ensure scratch memory is not being used.
8 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
9 ; SI-NOT: MOVREL
10 define void @test_concat_v1i32(<2 x i32> addrspace(1)* %out, <1 x i32> %a, <1 x i32> %b) nounwind {
11   %concat = shufflevector <1 x i32> %a, <1 x i32> %b, <2 x i32> <i32 0, i32 1>
12   store <2 x i32> %concat, <2 x i32> addrspace(1)* %out, align 8
13   ret void
14 }
15
16 ; FUNC-LABEL: {{^}}test_concat_v2i32:
17 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
18 ; SI-NOT: MOVREL
19 define void @test_concat_v2i32(<4 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) nounwind {
20   %concat = shufflevector <2 x i32> %a, <2 x i32> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
21   store <4 x i32> %concat, <4 x i32> addrspace(1)* %out, align 16
22   ret void
23 }
24
25 ; FUNC-LABEL: {{^}}test_concat_v4i32:
26 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
27 ; SI-NOT: MOVREL
28 define void @test_concat_v4i32(<8 x i32> addrspace(1)* %out, <4 x i32> %a, <4 x i32> %b) nounwind {
29   %concat = shufflevector <4 x i32> %a, <4 x i32> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
30   store <8 x i32> %concat, <8 x i32> addrspace(1)* %out, align 32
31   ret void
32 }
33
34 ; FUNC-LABEL: {{^}}test_concat_v8i32:
35 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
36 ; SI-NOT: MOVREL
37 define void @test_concat_v8i32(<16 x i32> addrspace(1)* %out, <8 x i32> %a, <8 x i32> %b) nounwind {
38   %concat = shufflevector <8 x i32> %a, <8 x i32> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
39   store <16 x i32> %concat, <16 x i32> addrspace(1)* %out, align 64
40   ret void
41 }
42
43 ; FUNC-LABEL: {{^}}test_concat_v16i32:
44 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
45 ; SI-NOT: MOVREL
46 define void @test_concat_v16i32(<32 x i32> addrspace(1)* %out, <16 x i32> %a, <16 x i32> %b) nounwind {
47   %concat = shufflevector <16 x i32> %a, <16 x i32> %b, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
48   store <32 x i32> %concat, <32 x i32> addrspace(1)* %out, align 128
49   ret void
50 }
51
52 ; FUNC-LABEL: {{^}}test_concat_v1f32:
53 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
54 ; SI-NOT: MOVREL
55 define void @test_concat_v1f32(<2 x float> addrspace(1)* %out, <1 x float> %a, <1 x float> %b) nounwind {
56   %concat = shufflevector <1 x float> %a, <1 x float> %b, <2 x i32> <i32 0, i32 1>
57   store <2 x float> %concat, <2 x float> addrspace(1)* %out, align 8
58   ret void
59 }
60
61 ; FUNC-LABEL: {{^}}test_concat_v2f32:
62 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
63 ; SI-NOT: MOVREL
64 define void @test_concat_v2f32(<4 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) nounwind {
65   %concat = shufflevector <2 x float> %a, <2 x float> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
66   store <4 x float> %concat, <4 x float> addrspace(1)* %out, align 16
67   ret void
68 }
69
70 ; FUNC-LABEL: {{^}}test_concat_v4f32:
71 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
72 ; SI-NOT: MOVREL
73 define void @test_concat_v4f32(<8 x float> addrspace(1)* %out, <4 x float> %a, <4 x float> %b) nounwind {
74   %concat = shufflevector <4 x float> %a, <4 x float> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
75   store <8 x float> %concat, <8 x float> addrspace(1)* %out, align 32
76   ret void
77 }
78
79 ; FUNC-LABEL: {{^}}test_concat_v8f32:
80 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
81 ; SI-NOT: MOVREL
82 define void @test_concat_v8f32(<16 x float> addrspace(1)* %out, <8 x float> %a, <8 x float> %b) nounwind {
83   %concat = shufflevector <8 x float> %a, <8 x float> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
84   store <16 x float> %concat, <16 x float> addrspace(1)* %out, align 64
85   ret void
86 }
87
88 ; FUNC-LABEL: {{^}}test_concat_v16f32:
89 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
90 ; SI-NOT: MOVREL
91 define void @test_concat_v16f32(<32 x float> addrspace(1)* %out, <16 x float> %a, <16 x float> %b) nounwind {
92   %concat = shufflevector <16 x float> %a, <16 x float> %b, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
93   store <32 x float> %concat, <32 x float> addrspace(1)* %out, align 128
94   ret void
95 }
96
97 ; FUNC-LABEL: {{^}}test_concat_v1i64:
98 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
99 ; SI-NOT: MOVREL
100 define void @test_concat_v1i64(<2 x double> addrspace(1)* %out, <1 x double> %a, <1 x double> %b) nounwind {
101   %concat = shufflevector <1 x double> %a, <1 x double> %b, <2 x i32> <i32 0, i32 1>
102   store <2 x double> %concat, <2 x double> addrspace(1)* %out, align 16
103   ret void
104 }
105
106 ; FUNC-LABEL: {{^}}test_concat_v2i64:
107 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
108 ; SI-NOT: MOVREL
109 define void @test_concat_v2i64(<4 x double> addrspace(1)* %out, <2 x double> %a, <2 x double> %b) nounwind {
110   %concat = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
111   store <4 x double> %concat, <4 x double> addrspace(1)* %out, align 32
112   ret void
113 }
114
115 ; FUNC-LABEL: {{^}}test_concat_v4i64:
116 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
117 ; SI-NOT: MOVREL
118 define void @test_concat_v4i64(<8 x double> addrspace(1)* %out, <4 x double> %a, <4 x double> %b) nounwind {
119   %concat = shufflevector <4 x double> %a, <4 x double> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
120   store <8 x double> %concat, <8 x double> addrspace(1)* %out, align 64
121   ret void
122 }
123
124 ; FUNC-LABEL: {{^}}test_concat_v8i64:
125 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
126 ; SI-NOT: MOVREL
127 define void @test_concat_v8i64(<16 x double> addrspace(1)* %out, <8 x double> %a, <8 x double> %b) nounwind {
128   %concat = shufflevector <8 x double> %a, <8 x double> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
129   store <16 x double> %concat, <16 x double> addrspace(1)* %out, align 128
130   ret void
131 }
132
133 ; FUNC-LABEL: {{^}}test_concat_v16i64:
134 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
135 ; SI-NOT: MOVREL
136 define void @test_concat_v16i64(<32 x double> addrspace(1)* %out, <16 x double> %a, <16 x double> %b) nounwind {
137   %concat = shufflevector <16 x double> %a, <16 x double> %b, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
138   store <32 x double> %concat, <32 x double> addrspace(1)* %out, align 256
139   ret void
140 }
141
142 ; FUNC-LABEL: {{^}}test_concat_v1f64:
143 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
144 ; SI-NOT: MOVREL
145 define void @test_concat_v1f64(<2 x double> addrspace(1)* %out, <1 x double> %a, <1 x double> %b) nounwind {
146   %concat = shufflevector <1 x double> %a, <1 x double> %b, <2 x i32> <i32 0, i32 1>
147   store <2 x double> %concat, <2 x double> addrspace(1)* %out, align 16
148   ret void
149 }
150
151 ; FUNC-LABEL: {{^}}test_concat_v2f64:
152 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
153 ; SI-NOT: MOVREL
154 define void @test_concat_v2f64(<4 x double> addrspace(1)* %out, <2 x double> %a, <2 x double> %b) nounwind {
155   %concat = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
156   store <4 x double> %concat, <4 x double> addrspace(1)* %out, align 32
157   ret void
158 }
159
160 ; FUNC-LABEL: {{^}}test_concat_v4f64:
161 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
162 ; SI-NOT: MOVREL
163 define void @test_concat_v4f64(<8 x double> addrspace(1)* %out, <4 x double> %a, <4 x double> %b) nounwind {
164   %concat = shufflevector <4 x double> %a, <4 x double> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
165   store <8 x double> %concat, <8 x double> addrspace(1)* %out, align 64
166   ret void
167 }
168
169 ; FUNC-LABEL: {{^}}test_concat_v8f64:
170 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
171 ; SI-NOT: MOVREL
172 define void @test_concat_v8f64(<16 x double> addrspace(1)* %out, <8 x double> %a, <8 x double> %b) nounwind {
173   %concat = shufflevector <8 x double> %a, <8 x double> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
174   store <16 x double> %concat, <16 x double> addrspace(1)* %out, align 128
175   ret void
176 }
177
178 ; FUNC-LABEL: {{^}}test_concat_v16f64:
179 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
180 ; SI-NOT: MOVREL
181 define void @test_concat_v16f64(<32 x double> addrspace(1)* %out, <16 x double> %a, <16 x double> %b) nounwind {
182   %concat = shufflevector <16 x double> %a, <16 x double> %b, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
183   store <32 x double> %concat, <32 x double> addrspace(1)* %out, align 256
184   ret void
185 }
186
187 ; FUNC-LABEL: {{^}}test_concat_v1i1:
188 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
189 ; SI-NOT: MOVREL
190 define void @test_concat_v1i1(<2 x i1> addrspace(1)* %out, <1 x i1> %a, <1 x i1> %b) nounwind {
191   %concat = shufflevector <1 x i1> %a, <1 x i1> %b, <2 x i32> <i32 0, i32 1>
192   store <2 x i1> %concat, <2 x i1> addrspace(1)* %out
193   ret void
194 }
195
196 ; FUNC-LABEL: {{^}}test_concat_v2i1:
197 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
198 ; SI-NOT: MOVREL
199 define void @test_concat_v2i1(<4 x i1> addrspace(1)* %out, <2 x i1> %a, <2 x i1> %b) nounwind {
200   %concat = shufflevector <2 x i1> %a, <2 x i1> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
201   store <4 x i1> %concat, <4 x i1> addrspace(1)* %out
202   ret void
203 }
204
205 ; FUNC-LABEL: {{^}}test_concat_v4i1:
206 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
207 ; SI-NOT: MOVREL
208 define void @test_concat_v4i1(<8 x i1> addrspace(1)* %out, <4 x i1> %a, <4 x i1> %b) nounwind {
209   %concat = shufflevector <4 x i1> %a, <4 x i1> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
210   store <8 x i1> %concat, <8 x i1> addrspace(1)* %out
211   ret void
212 }
213
214 ; FUNC-LABEL: {{^}}test_concat_v8i1:
215 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
216 ; SI-NOT: MOVREL
217 define void @test_concat_v8i1(<16 x i1> addrspace(1)* %out, <8 x i1> %a, <8 x i1> %b) nounwind {
218   %concat = shufflevector <8 x i1> %a, <8 x i1> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
219   store <16 x i1> %concat, <16 x i1> addrspace(1)* %out
220   ret void
221 }
222
223 ; FUNC-LABEL: {{^}}test_concat_v16i1:
224 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
225 ; SI-NOT: MOVREL
226 define void @test_concat_v16i1(<32 x i1> addrspace(1)* %out, <16 x i1> %a, <16 x i1> %b) nounwind {
227   %concat = shufflevector <16 x i1> %a, <16 x i1> %b, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
228   store <32 x i1> %concat, <32 x i1> addrspace(1)* %out
229   ret void
230 }
231
232 ; FUNC-LABEL: {{^}}test_concat_v32i1:
233 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
234 ; SI-NOT: MOVREL
235 define void @test_concat_v32i1(<64 x i1> addrspace(1)* %out, <32 x i1> %a, <32 x i1> %b) nounwind {
236   %concat = shufflevector <32 x i1> %a, <32 x i1> %b, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>
237   store <64 x i1> %concat, <64 x i1> addrspace(1)* %out
238   ret void
239 }
240
241 ; FUNC-LABEL: {{^}}test_concat_v1i16:
242 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
243 ; SI-NOT: MOVREL
244 define void @test_concat_v1i16(<2 x i16> addrspace(1)* %out, <1 x i16> %a, <1 x i16> %b) nounwind {
245   %concat = shufflevector <1 x i16> %a, <1 x i16> %b, <2 x i32> <i32 0, i32 1>
246   store <2 x i16> %concat, <2 x i16> addrspace(1)* %out, align 4
247   ret void
248 }
249
250 ; FUNC-LABEL: {{^}}test_concat_v2i16:
251 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
252 ; SI-NOT: MOVREL
253 define void @test_concat_v2i16(<4 x i16> addrspace(1)* %out, <2 x i16> %a, <2 x i16> %b) nounwind {
254   %concat = shufflevector <2 x i16> %a, <2 x i16> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
255   store <4 x i16> %concat, <4 x i16> addrspace(1)* %out, align 8
256   ret void
257 }
258
259 ; FUNC-LABEL: {{^}}test_concat_v4i16:
260 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
261 ; SI-NOT: MOVREL
262 define void @test_concat_v4i16(<8 x i16> addrspace(1)* %out, <4 x i16> %a, <4 x i16> %b) nounwind {
263   %concat = shufflevector <4 x i16> %a, <4 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
264   store <8 x i16> %concat, <8 x i16> addrspace(1)* %out, align 16
265   ret void
266 }
267
268 ; FUNC-LABEL: {{^}}test_concat_v8i16:
269 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
270 ; SI-NOT: MOVREL
271 define void @test_concat_v8i16(<16 x i16> addrspace(1)* %out, <8 x i16> %a, <8 x i16> %b) nounwind {
272   %concat = shufflevector <8 x i16> %a, <8 x i16> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
273   store <16 x i16> %concat, <16 x i16> addrspace(1)* %out, align 32
274   ret void
275 }
276
277 ; FUNC-LABEL: {{^}}test_concat_v16i16:
278 ; SI-NOT: S_MOV_B32 s{{[0-9]}}, 0x80f000
279 ; SI-NOT: MOVREL
280 define void @test_concat_v16i16(<32 x i16> addrspace(1)* %out, <16 x i16> %a, <16 x i16> %b) nounwind {
281   %concat = shufflevector <16 x i16> %a, <16 x i16> %b, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
282   store <32 x i16> %concat, <32 x i16> addrspace(1)* %out, align 64
283   ret void
284 }