ARM64: initial backend import
[oota-llvm.git] / test / CodeGen / ARM64 / vmovn.ll
1 ; RUN: llc < %s -march=arm64 -arm64-neon-syntax=apple | FileCheck %s
2
3 define <8 x i8> @xtn8b(<8 x i16> %A) nounwind {
4 ;CHECK-LABEL: xtn8b:
5 ;CHECK-NOT: ld1
6 ;CHECK: xtn.8b v0, v0
7 ;CHECK-NEXT: ret
8   %tmp3 = trunc <8 x i16> %A to <8 x i8>
9         ret <8 x i8> %tmp3
10 }
11
12 define <4 x i16> @xtn4h(<4 x i32> %A) nounwind {
13 ;CHECK-LABEL: xtn4h:
14 ;CHECK-NOT: ld1
15 ;CHECK: xtn.4h v0, v0
16 ;CHECK-NEXT: ret
17   %tmp3 = trunc <4 x i32> %A to <4 x i16>
18         ret <4 x i16> %tmp3
19 }
20
21 define <2 x i32> @xtn2s(<2 x i64> %A) nounwind {
22 ;CHECK-LABEL: xtn2s:
23 ;CHECK-NOT: ld1
24 ;CHECK: xtn.2s v0, v0
25 ;CHECK-NEXT: ret
26   %tmp3 = trunc <2 x i64> %A to <2 x i32>
27         ret <2 x i32> %tmp3
28 }
29
30 define <16 x i8> @xtn2_16b(<8 x i8> %ret, <8 x i16> %A) nounwind {
31 ;CHECK-LABEL: xtn2_16b:
32 ;CHECK-NOT: ld1
33 ;CHECK: xtn2.16b v0, v1
34 ;CHECK-NEXT: ret
35         %tmp3 = trunc <8 x i16> %A to <8 x i8>
36         %res = shufflevector <8 x i8> %ret, <8 x i8> %tmp3, <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>
37         ret <16 x i8> %res
38 }
39
40 define <8 x i16> @xtn2_8h(<4 x i16> %ret, <4 x i32> %A) nounwind {
41 ;CHECK-LABEL: xtn2_8h:
42 ;CHECK-NOT: ld1
43 ;CHECK: xtn2.8h v0, v1
44 ;CHECK-NEXT: ret
45         %tmp3 = trunc <4 x i32> %A to <4 x i16>
46         %res = shufflevector <4 x i16> %ret, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
47         ret <8 x i16> %res
48 }
49
50 define <4 x i32> @xtn2_4s(<2 x i32> %ret, <2 x i64> %A) nounwind {
51 ;CHECK-LABEL: xtn2_4s:
52 ;CHECK-NOT: ld1
53 ;CHECK: xtn2.4s v0, v1
54 ;CHECK-NEXT: ret
55         %tmp3 = trunc <2 x i64> %A to <2 x i32>
56         %res = shufflevector <2 x i32> %ret, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
57         ret <4 x i32> %res
58 }
59
60 define <8 x i8> @sqxtn8b(<8 x i16> %A) nounwind {
61 ;CHECK-LABEL: sqxtn8b:
62 ;CHECK-NOT: ld1
63 ;CHECK: sqxtn.8b v0, v0
64 ;CHECK-NEXT: ret
65         %tmp3 = call <8 x i8> @llvm.arm64.neon.sqxtn.v8i8(<8 x i16> %A)
66         ret <8 x i8> %tmp3
67 }
68
69 define <4 x i16> @sqxtn4h(<4 x i32> %A) nounwind {
70 ;CHECK-LABEL: sqxtn4h:
71 ;CHECK-NOT: ld1
72 ;CHECK: sqxtn.4h v0, v0
73 ;CHECK-NEXT: ret
74         %tmp3 = call <4 x i16> @llvm.arm64.neon.sqxtn.v4i16(<4 x i32> %A)
75         ret <4 x i16> %tmp3
76 }
77
78 define <2 x i32> @sqxtn2s(<2 x i64> %A) nounwind {
79 ;CHECK-LABEL: sqxtn2s:
80 ;CHECK-NOT: ld1
81 ;CHECK: sqxtn.2s v0, v0
82 ;CHECK-NEXT: ret
83         %tmp3 = call <2 x i32> @llvm.arm64.neon.sqxtn.v2i32(<2 x i64> %A)
84         ret <2 x i32> %tmp3
85 }
86
87 define <16 x i8> @sqxtn2_16b(<8 x i8> %ret, <8 x i16> %A) nounwind {
88 ;CHECK-LABEL: sqxtn2_16b:
89 ;CHECK-NOT: ld1
90 ;CHECK: sqxtn2.16b v0, v1
91 ;CHECK-NEXT: ret
92         %tmp3 = call <8 x i8> @llvm.arm64.neon.sqxtn.v8i8(<8 x i16> %A)
93         %res = shufflevector <8 x i8> %ret, <8 x i8> %tmp3, <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>
94         ret <16 x i8> %res
95 }
96
97 define <8 x i16> @sqxtn2_8h(<4 x i16> %ret, <4 x i32> %A) nounwind {
98 ;CHECK-LABEL: sqxtn2_8h:
99 ;CHECK-NOT: ld1
100 ;CHECK: sqxtn2.8h v0, v1
101 ;CHECK-NEXT: ret
102         %tmp3 = call <4 x i16> @llvm.arm64.neon.sqxtn.v4i16(<4 x i32> %A)
103         %res = shufflevector <4 x i16> %ret, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
104         ret <8 x i16> %res
105 }
106
107 define <4 x i32> @sqxtn2_4s(<2 x i32> %ret, <2 x i64> %A) nounwind {
108 ;CHECK-LABEL: sqxtn2_4s:
109 ;CHECK-NOT: ld1
110 ;CHECK: sqxtn2.4s v0, v1
111 ;CHECK-NEXT: ret
112         %tmp3 = call <2 x i32> @llvm.arm64.neon.sqxtn.v2i32(<2 x i64> %A)
113         %res = shufflevector <2 x i32> %ret, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
114         ret <4 x i32> %res
115 }
116
117 declare <8 x i8>  @llvm.arm64.neon.sqxtn.v8i8(<8 x i16>) nounwind readnone
118 declare <4 x i16> @llvm.arm64.neon.sqxtn.v4i16(<4 x i32>) nounwind readnone
119 declare <2 x i32> @llvm.arm64.neon.sqxtn.v2i32(<2 x i64>) nounwind readnone
120
121 define <8 x i8> @uqxtn8b(<8 x i16> %A) nounwind {
122 ;CHECK-LABEL: uqxtn8b:
123 ;CHECK-NOT: ld1
124 ;CHECK: uqxtn.8b v0, v0
125 ;CHECK-NEXT: ret
126         %tmp3 = call <8 x i8> @llvm.arm64.neon.uqxtn.v8i8(<8 x i16> %A)
127         ret <8 x i8> %tmp3
128 }
129
130 define <4 x i16> @uqxtn4h(<4 x i32> %A) nounwind {
131 ;CHECK-LABEL: uqxtn4h:
132 ;CHECK-NOT: ld1
133 ;CHECK: uqxtn.4h v0, v0
134 ;CHECK-NEXT: ret
135         %tmp3 = call <4 x i16> @llvm.arm64.neon.uqxtn.v4i16(<4 x i32> %A)
136         ret <4 x i16> %tmp3
137 }
138
139 define <2 x i32> @uqxtn2s(<2 x i64> %A) nounwind {
140 ;CHECK-LABEL: uqxtn2s:
141 ;CHECK-NOT: ld1
142 ;CHECK: uqxtn.2s v0, v0
143 ;CHECK-NEXT: ret
144         %tmp3 = call <2 x i32> @llvm.arm64.neon.uqxtn.v2i32(<2 x i64> %A)
145         ret <2 x i32> %tmp3
146 }
147
148 define <16 x i8> @uqxtn2_16b(<8 x i8> %ret, <8 x i16> %A) nounwind {
149 ;CHECK-LABEL: uqxtn2_16b:
150 ;CHECK-NOT: ld1
151 ;CHECK: uqxtn2.16b v0, v1
152 ;CHECK-NEXT: ret
153         %tmp3 = call <8 x i8> @llvm.arm64.neon.uqxtn.v8i8(<8 x i16> %A)
154         %res = shufflevector <8 x i8> %ret, <8 x i8> %tmp3, <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>
155         ret <16 x i8> %res
156 }
157
158 define <8 x i16> @uqxtn2_8h(<4 x i16> %ret, <4 x i32> %A) nounwind {
159 ;CHECK-LABEL: uqxtn2_8h:
160 ;CHECK-NOT: ld1
161 ;CHECK: uqxtn2.8h v0, v1
162 ;CHECK-NEXT: ret
163         %tmp3 = call <4 x i16> @llvm.arm64.neon.uqxtn.v4i16(<4 x i32> %A)
164         %res = shufflevector <4 x i16> %ret, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
165         ret <8 x i16> %res
166 }
167
168 define <4 x i32> @uqxtn2_4s(<2 x i32> %ret, <2 x i64> %A) nounwind {
169 ;CHECK-LABEL: uqxtn2_4s:
170 ;CHECK-NOT: ld1
171 ;CHECK: uqxtn2.4s v0, v1
172 ;CHECK-NEXT: ret
173         %tmp3 = call <2 x i32> @llvm.arm64.neon.uqxtn.v2i32(<2 x i64> %A)
174         %res = shufflevector <2 x i32> %ret, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
175         ret <4 x i32> %res
176 }
177
178 declare <8 x i8>  @llvm.arm64.neon.uqxtn.v8i8(<8 x i16>) nounwind readnone
179 declare <4 x i16> @llvm.arm64.neon.uqxtn.v4i16(<4 x i32>) nounwind readnone
180 declare <2 x i32> @llvm.arm64.neon.uqxtn.v2i32(<2 x i64>) nounwind readnone
181
182 define <8 x i8> @sqxtun8b(<8 x i16> %A) nounwind {
183 ;CHECK-LABEL: sqxtun8b:
184 ;CHECK-NOT: ld1
185 ;CHECK: sqxtun.8b v0, v0
186 ;CHECK-NEXT: ret
187         %tmp3 = call <8 x i8> @llvm.arm64.neon.sqxtun.v8i8(<8 x i16> %A)
188         ret <8 x i8> %tmp3
189 }
190
191 define <4 x i16> @sqxtun4h(<4 x i32> %A) nounwind {
192 ;CHECK-LABEL: sqxtun4h:
193 ;CHECK-NOT: ld1
194 ;CHECK: sqxtun.4h v0, v0
195 ;CHECK-NEXT: ret
196         %tmp3 = call <4 x i16> @llvm.arm64.neon.sqxtun.v4i16(<4 x i32> %A)
197         ret <4 x i16> %tmp3
198 }
199
200 define <2 x i32> @sqxtun2s(<2 x i64> %A) nounwind {
201 ;CHECK-LABEL: sqxtun2s:
202 ;CHECK-NOT: ld1
203 ;CHECK: sqxtun.2s v0, v0
204 ;CHECK-NEXT: ret
205         %tmp3 = call <2 x i32> @llvm.arm64.neon.sqxtun.v2i32(<2 x i64> %A)
206         ret <2 x i32> %tmp3
207 }
208
209 define <16 x i8> @sqxtun2_16b(<8 x i8> %ret, <8 x i16> %A) nounwind {
210 ;CHECK-LABEL: sqxtun2_16b:
211 ;CHECK-NOT: ld1
212 ;CHECK: sqxtun2.16b v0, v1
213 ;CHECK-NEXT: ret
214         %tmp3 = call <8 x i8> @llvm.arm64.neon.sqxtun.v8i8(<8 x i16> %A)
215         %res = shufflevector <8 x i8> %ret, <8 x i8> %tmp3, <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>
216         ret <16 x i8> %res
217 }
218
219 define <8 x i16> @sqxtun2_8h(<4 x i16> %ret, <4 x i32> %A) nounwind {
220 ;CHECK-LABEL: sqxtun2_8h:
221 ;CHECK-NOT: ld1
222 ;CHECK: sqxtun2.8h v0, v1
223 ;CHECK-NEXT: ret
224         %tmp3 = call <4 x i16> @llvm.arm64.neon.sqxtun.v4i16(<4 x i32> %A)
225         %res = shufflevector <4 x i16> %ret, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
226         ret <8 x i16> %res
227 }
228
229 define <4 x i32> @sqxtun2_4s(<2 x i32> %ret, <2 x i64> %A) nounwind {
230 ;CHECK-LABEL: sqxtun2_4s:
231 ;CHECK-NOT: ld1
232 ;CHECK: sqxtun2.4s v0, v1
233 ;CHECK-NEXT: ret
234         %tmp3 = call <2 x i32> @llvm.arm64.neon.sqxtun.v2i32(<2 x i64> %A)
235         %res = shufflevector <2 x i32> %ret, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
236         ret <4 x i32> %res
237 }
238
239 declare <8 x i8>  @llvm.arm64.neon.sqxtun.v8i8(<8 x i16>) nounwind readnone
240 declare <4 x i16> @llvm.arm64.neon.sqxtun.v4i16(<4 x i32>) nounwind readnone
241 declare <2 x i32> @llvm.arm64.neon.sqxtun.v2i32(<2 x i64>) nounwind readnone
242