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