Add codegen support for NEON vld2lane intrinsics with 128-bit vectors.
[oota-llvm.git] / test / CodeGen / ARM / vldlane.ll
1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
2
3 %struct.__neon_int8x8x2_t = type { <8 x i8>,  <8 x i8> }
4 %struct.__neon_int16x4x2_t = type { <4 x i16>, <4 x i16> }
5 %struct.__neon_int32x2x2_t = type { <2 x i32>, <2 x i32> }
6 %struct.__neon_float32x2x2_t = type { <2 x float>, <2 x float> }
7
8 %struct.__neon_int16x8x2_t = type { <8 x i16>, <8 x i16> }
9 %struct.__neon_int32x4x2_t = type { <4 x i32>, <4 x i32> }
10 %struct.__neon_float32x4x2_t = type { <4 x float>, <4 x float> }
11
12 define <8 x i8> @vld2lanei8(i8* %A, <8 x i8>* %B) nounwind {
13 ;CHECK: vld2lanei8:
14 ;CHECK: vld2.8
15         %tmp1 = load <8 x i8>* %B
16         %tmp2 = call %struct.__neon_int8x8x2_t @llvm.arm.neon.vld2lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1)
17         %tmp3 = extractvalue %struct.__neon_int8x8x2_t %tmp2, 0
18         %tmp4 = extractvalue %struct.__neon_int8x8x2_t %tmp2, 1
19         %tmp5 = add <8 x i8> %tmp3, %tmp4
20         ret <8 x i8> %tmp5
21 }
22
23 define <4 x i16> @vld2lanei16(i16* %A, <4 x i16>* %B) nounwind {
24 ;CHECK: vld2lanei16:
25 ;CHECK: vld2.16
26         %tmp1 = load <4 x i16>* %B
27         %tmp2 = call %struct.__neon_int16x4x2_t @llvm.arm.neon.vld2lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1)
28         %tmp3 = extractvalue %struct.__neon_int16x4x2_t %tmp2, 0
29         %tmp4 = extractvalue %struct.__neon_int16x4x2_t %tmp2, 1
30         %tmp5 = add <4 x i16> %tmp3, %tmp4
31         ret <4 x i16> %tmp5
32 }
33
34 define <2 x i32> @vld2lanei32(i32* %A, <2 x i32>* %B) nounwind {
35 ;CHECK: vld2lanei32:
36 ;CHECK: vld2.32
37         %tmp1 = load <2 x i32>* %B
38         %tmp2 = call %struct.__neon_int32x2x2_t @llvm.arm.neon.vld2lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1)
39         %tmp3 = extractvalue %struct.__neon_int32x2x2_t %tmp2, 0
40         %tmp4 = extractvalue %struct.__neon_int32x2x2_t %tmp2, 1
41         %tmp5 = add <2 x i32> %tmp3, %tmp4
42         ret <2 x i32> %tmp5
43 }
44
45 define <2 x float> @vld2lanef(float* %A, <2 x float>* %B) nounwind {
46 ;CHECK: vld2lanef:
47 ;CHECK: vld2.32
48         %tmp1 = load <2 x float>* %B
49         %tmp2 = call %struct.__neon_float32x2x2_t @llvm.arm.neon.vld2lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, i32 1)
50         %tmp3 = extractvalue %struct.__neon_float32x2x2_t %tmp2, 0
51         %tmp4 = extractvalue %struct.__neon_float32x2x2_t %tmp2, 1
52         %tmp5 = add <2 x float> %tmp3, %tmp4
53         ret <2 x float> %tmp5
54 }
55
56 define <8 x i16> @vld2laneQi16(i16* %A, <8 x i16>* %B) nounwind {
57 ;CHECK: vld2laneQi16:
58 ;CHECK: vld2.16
59         %tmp1 = load <8 x i16>* %B
60         %tmp2 = call %struct.__neon_int16x8x2_t @llvm.arm.neon.vld2lane.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1)
61         %tmp3 = extractvalue %struct.__neon_int16x8x2_t %tmp2, 0
62         %tmp4 = extractvalue %struct.__neon_int16x8x2_t %tmp2, 1
63         %tmp5 = add <8 x i16> %tmp3, %tmp4
64         ret <8 x i16> %tmp5
65 }
66
67 define <4 x i32> @vld2laneQi32(i32* %A, <4 x i32>* %B) nounwind {
68 ;CHECK: vld2laneQi32:
69 ;CHECK: vld2.32
70         %tmp1 = load <4 x i32>* %B
71         %tmp2 = call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2lane.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2)
72         %tmp3 = extractvalue %struct.__neon_int32x4x2_t %tmp2, 0
73         %tmp4 = extractvalue %struct.__neon_int32x4x2_t %tmp2, 1
74         %tmp5 = add <4 x i32> %tmp3, %tmp4
75         ret <4 x i32> %tmp5
76 }
77
78 define <4 x float> @vld2laneQf(float* %A, <4 x float>* %B) nounwind {
79 ;CHECK: vld2laneQf:
80 ;CHECK: vld2.32
81         %tmp1 = load <4 x float>* %B
82         %tmp2 = call %struct.__neon_float32x4x2_t @llvm.arm.neon.vld2lane.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, i32 1)
83         %tmp3 = extractvalue %struct.__neon_float32x4x2_t %tmp2, 0
84         %tmp4 = extractvalue %struct.__neon_float32x4x2_t %tmp2, 1
85         %tmp5 = add <4 x float> %tmp3, %tmp4
86         ret <4 x float> %tmp5
87 }
88
89 declare %struct.__neon_int8x8x2_t @llvm.arm.neon.vld2lane.v8i8(i8*, <8 x i8>, <8 x i8>, i32) nounwind readonly
90 declare %struct.__neon_int16x4x2_t @llvm.arm.neon.vld2lane.v4i16(i8*, <4 x i16>, <4 x i16>, i32) nounwind readonly
91 declare %struct.__neon_int32x2x2_t @llvm.arm.neon.vld2lane.v2i32(i8*, <2 x i32>, <2 x i32>, i32) nounwind readonly
92 declare %struct.__neon_float32x2x2_t @llvm.arm.neon.vld2lane.v2f32(i8*, <2 x float>, <2 x float>, i32) nounwind readonly
93
94 declare %struct.__neon_int16x8x2_t @llvm.arm.neon.vld2lane.v8i16(i8*, <8 x i16>, <8 x i16>, i32) nounwind readonly
95 declare %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2lane.v4i32(i8*, <4 x i32>, <4 x i32>, i32) nounwind readonly
96 declare %struct.__neon_float32x4x2_t @llvm.arm.neon.vld2lane.v4f32(i8*, <4 x float>, <4 x float>, i32) nounwind readonly
97
98 %struct.__neon_int8x8x3_t = type { <8 x i8>,  <8 x i8>,  <8 x i8> }
99 %struct.__neon_int16x4x3_t = type { <4 x i16>, <4 x i16>, <4 x i16> }
100 %struct.__neon_int32x2x3_t = type { <2 x i32>, <2 x i32>, <2 x i32> }
101 %struct.__neon_float32x2x3_t = type { <2 x float>, <2 x float>, <2 x float> }
102
103 define <8 x i8> @vld3lanei8(i8* %A, <8 x i8>* %B) nounwind {
104 ;CHECK: vld3lanei8:
105 ;CHECK: vld3.8
106         %tmp1 = load <8 x i8>* %B
107         %tmp2 = call %struct.__neon_int8x8x3_t @llvm.arm.neon.vld3lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1)
108         %tmp3 = extractvalue %struct.__neon_int8x8x3_t %tmp2, 0
109         %tmp4 = extractvalue %struct.__neon_int8x8x3_t %tmp2, 1
110         %tmp5 = extractvalue %struct.__neon_int8x8x3_t %tmp2, 2
111         %tmp6 = add <8 x i8> %tmp3, %tmp4
112         %tmp7 = add <8 x i8> %tmp5, %tmp6
113         ret <8 x i8> %tmp7
114 }
115
116 define <4 x i16> @vld3lanei16(i16* %A, <4 x i16>* %B) nounwind {
117 ;CHECK: vld3lanei16:
118 ;CHECK: vld3.16
119         %tmp1 = load <4 x i16>* %B
120         %tmp2 = call %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1)
121         %tmp3 = extractvalue %struct.__neon_int16x4x3_t %tmp2, 0
122         %tmp4 = extractvalue %struct.__neon_int16x4x3_t %tmp2, 1
123         %tmp5 = extractvalue %struct.__neon_int16x4x3_t %tmp2, 2
124         %tmp6 = add <4 x i16> %tmp3, %tmp4
125         %tmp7 = add <4 x i16> %tmp5, %tmp6
126         ret <4 x i16> %tmp7
127 }
128
129 define <2 x i32> @vld3lanei32(i32* %A, <2 x i32>* %B) nounwind {
130 ;CHECK: vld3lanei32:
131 ;CHECK: vld3.32
132         %tmp1 = load <2 x i32>* %B
133         %tmp2 = call %struct.__neon_int32x2x3_t @llvm.arm.neon.vld3lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1)
134         %tmp3 = extractvalue %struct.__neon_int32x2x3_t %tmp2, 0
135         %tmp4 = extractvalue %struct.__neon_int32x2x3_t %tmp2, 1
136         %tmp5 = extractvalue %struct.__neon_int32x2x3_t %tmp2, 2
137         %tmp6 = add <2 x i32> %tmp3, %tmp4
138         %tmp7 = add <2 x i32> %tmp5, %tmp6
139         ret <2 x i32> %tmp7
140 }
141
142 define <2 x float> @vld3lanef(float* %A, <2 x float>* %B) nounwind {
143 ;CHECK: vld3lanef:
144 ;CHECK: vld3.32
145         %tmp1 = load <2 x float>* %B
146         %tmp2 = call %struct.__neon_float32x2x3_t @llvm.arm.neon.vld3lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1)
147         %tmp3 = extractvalue %struct.__neon_float32x2x3_t %tmp2, 0
148         %tmp4 = extractvalue %struct.__neon_float32x2x3_t %tmp2, 1
149         %tmp5 = extractvalue %struct.__neon_float32x2x3_t %tmp2, 2
150         %tmp6 = add <2 x float> %tmp3, %tmp4
151         %tmp7 = add <2 x float> %tmp5, %tmp6
152         ret <2 x float> %tmp7
153 }
154
155 declare %struct.__neon_int8x8x3_t @llvm.arm.neon.vld3lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, i32) nounwind readonly
156 declare %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, i32) nounwind readonly
157 declare %struct.__neon_int32x2x3_t @llvm.arm.neon.vld3lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, i32) nounwind readonly
158 declare %struct.__neon_float32x2x3_t @llvm.arm.neon.vld3lane.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, i32) nounwind readonly
159
160 %struct.__neon_int8x8x4_t = type { <8 x i8>,  <8 x i8>,  <8 x i8>,  <8 x i8> }
161 %struct.__neon_int16x4x4_t = type { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }
162 %struct.__neon_int32x2x4_t = type { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> }
163 %struct.__neon_float32x2x4_t = type { <2 x float>, <2 x float>, <2 x float>, <2 x float> }
164
165 define <8 x i8> @vld4lanei8(i8* %A, <8 x i8>* %B) nounwind {
166 ;CHECK: vld4lanei8:
167 ;CHECK: vld4.8
168         %tmp1 = load <8 x i8>* %B
169         %tmp2 = call %struct.__neon_int8x8x4_t @llvm.arm.neon.vld4lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1)
170         %tmp3 = extractvalue %struct.__neon_int8x8x4_t %tmp2, 0
171         %tmp4 = extractvalue %struct.__neon_int8x8x4_t %tmp2, 1
172         %tmp5 = extractvalue %struct.__neon_int8x8x4_t %tmp2, 2
173         %tmp6 = extractvalue %struct.__neon_int8x8x4_t %tmp2, 3
174         %tmp7 = add <8 x i8> %tmp3, %tmp4
175         %tmp8 = add <8 x i8> %tmp5, %tmp6
176         %tmp9 = add <8 x i8> %tmp7, %tmp8
177         ret <8 x i8> %tmp9
178 }
179
180 define <4 x i16> @vld4lanei16(i16* %A, <4 x i16>* %B) nounwind {
181 ;CHECK: vld4lanei16:
182 ;CHECK: vld4.16
183         %tmp1 = load <4 x i16>* %B
184         %tmp2 = call %struct.__neon_int16x4x4_t @llvm.arm.neon.vld4lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1)
185         %tmp3 = extractvalue %struct.__neon_int16x4x4_t %tmp2, 0
186         %tmp4 = extractvalue %struct.__neon_int16x4x4_t %tmp2, 1
187         %tmp5 = extractvalue %struct.__neon_int16x4x4_t %tmp2, 2
188         %tmp6 = extractvalue %struct.__neon_int16x4x4_t %tmp2, 3
189         %tmp7 = add <4 x i16> %tmp3, %tmp4
190         %tmp8 = add <4 x i16> %tmp5, %tmp6
191         %tmp9 = add <4 x i16> %tmp7, %tmp8
192         ret <4 x i16> %tmp9
193 }
194
195 define <2 x i32> @vld4lanei32(i32* %A, <2 x i32>* %B) nounwind {
196 ;CHECK: vld4lanei32:
197 ;CHECK: vld4.32
198         %tmp1 = load <2 x i32>* %B
199         %tmp2 = call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1)
200         %tmp3 = extractvalue %struct.__neon_int32x2x4_t %tmp2, 0
201         %tmp4 = extractvalue %struct.__neon_int32x2x4_t %tmp2, 1
202         %tmp5 = extractvalue %struct.__neon_int32x2x4_t %tmp2, 2
203         %tmp6 = extractvalue %struct.__neon_int32x2x4_t %tmp2, 3
204         %tmp7 = add <2 x i32> %tmp3, %tmp4
205         %tmp8 = add <2 x i32> %tmp5, %tmp6
206         %tmp9 = add <2 x i32> %tmp7, %tmp8
207         ret <2 x i32> %tmp9
208 }
209
210 define <2 x float> @vld4lanef(float* %A, <2 x float>* %B) nounwind {
211 ;CHECK: vld4lanef:
212 ;CHECK: vld4.32
213         %tmp1 = load <2 x float>* %B
214         %tmp2 = call %struct.__neon_float32x2x4_t @llvm.arm.neon.vld4lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1)
215         %tmp3 = extractvalue %struct.__neon_float32x2x4_t %tmp2, 0
216         %tmp4 = extractvalue %struct.__neon_float32x2x4_t %tmp2, 1
217         %tmp5 = extractvalue %struct.__neon_float32x2x4_t %tmp2, 2
218         %tmp6 = extractvalue %struct.__neon_float32x2x4_t %tmp2, 3
219         %tmp7 = add <2 x float> %tmp3, %tmp4
220         %tmp8 = add <2 x float> %tmp5, %tmp6
221         %tmp9 = add <2 x float> %tmp7, %tmp8
222         ret <2 x float> %tmp9
223 }
224
225 declare %struct.__neon_int8x8x4_t @llvm.arm.neon.vld4lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i32) nounwind readonly
226 declare %struct.__neon_int16x4x4_t @llvm.arm.neon.vld4lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i32) nounwind readonly
227 declare %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i32) nounwind readonly
228 declare %struct.__neon_float32x2x4_t @llvm.arm.neon.vld4lane.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, <2 x float>, i32) nounwind readonly