Don't depend on basic block numbering.
[oota-llvm.git] / test / CodeGen / ARM / vstlane.ll
1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
2
3 define void @vst2lanei8(i8* %A, <8 x i8>* %B) nounwind {
4 ;CHECK: vst2lanei8:
5 ;CHECK: vst2.8
6         %tmp1 = load <8 x i8>* %B
7         call void @llvm.arm.neon.vst2lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 1)
8         ret void
9 }
10
11 define void @vst2lanei16(i16* %A, <4 x i16>* %B) nounwind {
12 ;CHECK: vst2lanei16:
13 ;CHECK: vst2.16
14         %tmp0 = bitcast i16* %A to i8*
15         %tmp1 = load <4 x i16>* %B
16         call void @llvm.arm.neon.vst2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 1)
17         ret void
18 }
19
20 define void @vst2lanei32(i32* %A, <2 x i32>* %B) nounwind {
21 ;CHECK: vst2lanei32:
22 ;CHECK: vst2.32
23         %tmp0 = bitcast i32* %A to i8*
24         %tmp1 = load <2 x i32>* %B
25         call void @llvm.arm.neon.vst2lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 1)
26         ret void
27 }
28
29 define void @vst2lanef(float* %A, <2 x float>* %B) nounwind {
30 ;CHECK: vst2lanef:
31 ;CHECK: vst2.32
32         %tmp0 = bitcast float* %A to i8*
33         %tmp1 = load <2 x float>* %B
34         call void @llvm.arm.neon.vst2lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1)
35         ret void
36 }
37
38 define void @vst2laneQi16(i16* %A, <8 x i16>* %B) nounwind {
39 ;CHECK: vst2laneQi16:
40 ;CHECK: vst2.16
41         %tmp0 = bitcast i16* %A to i8*
42         %tmp1 = load <8 x i16>* %B
43         call void @llvm.arm.neon.vst2lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1, i32 1)
44         ret void
45 }
46
47 define void @vst2laneQi32(i32* %A, <4 x i32>* %B) nounwind {
48 ;CHECK: vst2laneQi32:
49 ;CHECK: vst2.32
50         %tmp0 = bitcast i32* %A to i8*
51         %tmp1 = load <4 x i32>* %B
52         call void @llvm.arm.neon.vst2lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 1)
53         ret void
54 }
55
56 define void @vst2laneQf(float* %A, <4 x float>* %B) nounwind {
57 ;CHECK: vst2laneQf:
58 ;CHECK: vst2.32
59         %tmp0 = bitcast float* %A to i8*
60         %tmp1 = load <4 x float>* %B
61         call void @llvm.arm.neon.vst2lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, i32 3, i32 1)
62         ret void
63 }
64
65 declare void @llvm.arm.neon.vst2lane.v8i8(i8*, <8 x i8>, <8 x i8>, i32, i32) nounwind
66 declare void @llvm.arm.neon.vst2lane.v4i16(i8*, <4 x i16>, <4 x i16>, i32, i32) nounwind
67 declare void @llvm.arm.neon.vst2lane.v2i32(i8*, <2 x i32>, <2 x i32>, i32, i32) nounwind
68 declare void @llvm.arm.neon.vst2lane.v2f32(i8*, <2 x float>, <2 x float>, i32, i32) nounwind
69
70 declare void @llvm.arm.neon.vst2lane.v8i16(i8*, <8 x i16>, <8 x i16>, i32, i32) nounwind
71 declare void @llvm.arm.neon.vst2lane.v4i32(i8*, <4 x i32>, <4 x i32>, i32, i32) nounwind
72 declare void @llvm.arm.neon.vst2lane.v4f32(i8*, <4 x float>, <4 x float>, i32, i32) nounwind
73
74 define void @vst3lanei8(i8* %A, <8 x i8>* %B) nounwind {
75 ;CHECK: vst3lanei8:
76 ;CHECK: vst3.8
77         %tmp1 = load <8 x i8>* %B
78         call void @llvm.arm.neon.vst3lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 1)
79         ret void
80 }
81
82 define void @vst3lanei16(i16* %A, <4 x i16>* %B) nounwind {
83 ;CHECK: vst3lanei16:
84 ;CHECK: vst3.16
85         %tmp0 = bitcast i16* %A to i8*
86         %tmp1 = load <4 x i16>* %B
87         call void @llvm.arm.neon.vst3lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 1)
88         ret void
89 }
90
91 define void @vst3lanei32(i32* %A, <2 x i32>* %B) nounwind {
92 ;CHECK: vst3lanei32:
93 ;CHECK: vst3.32
94         %tmp0 = bitcast i32* %A to i8*
95         %tmp1 = load <2 x i32>* %B
96         call void @llvm.arm.neon.vst3lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 1)
97         ret void
98 }
99
100 define void @vst3lanef(float* %A, <2 x float>* %B) nounwind {
101 ;CHECK: vst3lanef:
102 ;CHECK: vst3.32
103         %tmp0 = bitcast float* %A to i8*
104         %tmp1 = load <2 x float>* %B
105         call void @llvm.arm.neon.vst3lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1)
106         ret void
107 }
108
109 define void @vst3laneQi16(i16* %A, <8 x i16>* %B) nounwind {
110 ;CHECK: vst3laneQi16:
111 ;CHECK: vst3.16
112         %tmp0 = bitcast i16* %A to i8*
113         %tmp1 = load <8 x i16>* %B
114         call void @llvm.arm.neon.vst3lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 6, i32 1)
115         ret void
116 }
117
118 define void @vst3laneQi32(i32* %A, <4 x i32>* %B) nounwind {
119 ;CHECK: vst3laneQi32:
120 ;CHECK: vst3.32
121         %tmp0 = bitcast i32* %A to i8*
122         %tmp1 = load <4 x i32>* %B
123         call void @llvm.arm.neon.vst3lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 0, i32 1)
124         ret void
125 }
126
127 define void @vst3laneQf(float* %A, <4 x float>* %B) nounwind {
128 ;CHECK: vst3laneQf:
129 ;CHECK: vst3.32
130         %tmp0 = bitcast float* %A to i8*
131         %tmp1 = load <4 x float>* %B
132         call void @llvm.arm.neon.vst3lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1, i32 1)
133         ret void
134 }
135
136 declare void @llvm.arm.neon.vst3lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind
137 declare void @llvm.arm.neon.vst3lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind
138 declare void @llvm.arm.neon.vst3lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind
139 declare void @llvm.arm.neon.vst3lane.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, i32, i32) nounwind
140
141 declare void @llvm.arm.neon.vst3lane.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind
142 declare void @llvm.arm.neon.vst3lane.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind
143 declare void @llvm.arm.neon.vst3lane.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind
144
145
146 define void @vst4lanei8(i8* %A, <8 x i8>* %B) nounwind {
147 ;CHECK: vst4lanei8:
148 ;CHECK: vst4.8
149         %tmp1 = load <8 x i8>* %B
150         call void @llvm.arm.neon.vst4lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 1)
151         ret void
152 }
153
154 define void @vst4lanei16(i16* %A, <4 x i16>* %B) nounwind {
155 ;CHECK: vst4lanei16:
156 ;CHECK: vst4.16
157         %tmp0 = bitcast i16* %A to i8*
158         %tmp1 = load <4 x i16>* %B
159         call void @llvm.arm.neon.vst4lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 1)
160         ret void
161 }
162
163 define void @vst4lanei32(i32* %A, <2 x i32>* %B) nounwind {
164 ;CHECK: vst4lanei32:
165 ;CHECK: vst4.32
166         %tmp0 = bitcast i32* %A to i8*
167         %tmp1 = load <2 x i32>* %B
168         call void @llvm.arm.neon.vst4lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 1)
169         ret void
170 }
171
172 define void @vst4lanef(float* %A, <2 x float>* %B) nounwind {
173 ;CHECK: vst4lanef:
174 ;CHECK: vst4.32
175         %tmp0 = bitcast float* %A to i8*
176         %tmp1 = load <2 x float>* %B
177         call void @llvm.arm.neon.vst4lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1)
178         ret void
179 }
180
181 define void @vst4laneQi16(i16* %A, <8 x i16>* %B) nounwind {
182 ;CHECK: vst4laneQi16:
183 ;CHECK: vst4.16
184         %tmp0 = bitcast i16* %A to i8*
185         %tmp1 = load <8 x i16>* %B
186         call void @llvm.arm.neon.vst4lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 7, i32 1)
187         ret void
188 }
189
190 define void @vst4laneQi32(i32* %A, <4 x i32>* %B) nounwind {
191 ;CHECK: vst4laneQi32:
192 ;CHECK: vst4.32
193         %tmp0 = bitcast i32* %A to i8*
194         %tmp1 = load <4 x i32>* %B
195         call void @llvm.arm.neon.vst4lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 1)
196         ret void
197 }
198
199 define void @vst4laneQf(float* %A, <4 x float>* %B) nounwind {
200 ;CHECK: vst4laneQf:
201 ;CHECK: vst4.32
202         %tmp0 = bitcast float* %A to i8*
203         %tmp1 = load <4 x float>* %B
204         call void @llvm.arm.neon.vst4lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1, i32 1)
205         ret void
206 }
207
208 declare void @llvm.arm.neon.vst4lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind
209 declare void @llvm.arm.neon.vst4lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind
210 declare void @llvm.arm.neon.vst4lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind
211 declare void @llvm.arm.neon.vst4lane.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, <2 x float>, i32, i32) nounwind
212
213 declare void @llvm.arm.neon.vst4lane.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind
214 declare void @llvm.arm.neon.vst4lane.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind
215 declare void @llvm.arm.neon.vst4lane.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind