[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / AArch64 / arm64-vmovn.ll
blob8e8642f90f1333288888cea914be6a03a20eef5e
1 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s
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
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
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
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
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
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
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.aarch64.neon.sqxtn.v8i8(<8 x i16> %A)
66         ret <8 x i8> %tmp3
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.aarch64.neon.sqxtn.v4i16(<4 x i32> %A)
75         ret <4 x i16> %tmp3
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.aarch64.neon.sqxtn.v2i32(<2 x i64> %A)
84         ret <2 x i32> %tmp3
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.aarch64.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
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.aarch64.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
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.aarch64.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
117 declare <8 x i8>  @llvm.aarch64.neon.sqxtn.v8i8(<8 x i16>) nounwind readnone
118 declare <4 x i16> @llvm.aarch64.neon.sqxtn.v4i16(<4 x i32>) nounwind readnone
119 declare <2 x i32> @llvm.aarch64.neon.sqxtn.v2i32(<2 x i64>) nounwind readnone
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.aarch64.neon.uqxtn.v8i8(<8 x i16> %A)
127         ret <8 x i8> %tmp3
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.aarch64.neon.uqxtn.v4i16(<4 x i32> %A)
136         ret <4 x i16> %tmp3
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.aarch64.neon.uqxtn.v2i32(<2 x i64> %A)
145         ret <2 x i32> %tmp3
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.aarch64.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
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.aarch64.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
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.aarch64.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
178 declare <8 x i8>  @llvm.aarch64.neon.uqxtn.v8i8(<8 x i16>) nounwind readnone
179 declare <4 x i16> @llvm.aarch64.neon.uqxtn.v4i16(<4 x i32>) nounwind readnone
180 declare <2 x i32> @llvm.aarch64.neon.uqxtn.v2i32(<2 x i64>) nounwind readnone
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.aarch64.neon.sqxtun.v8i8(<8 x i16> %A)
188         ret <8 x i8> %tmp3
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.aarch64.neon.sqxtun.v4i16(<4 x i32> %A)
197         ret <4 x i16> %tmp3
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.aarch64.neon.sqxtun.v2i32(<2 x i64> %A)
206         ret <2 x i32> %tmp3
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.aarch64.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
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.aarch64.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
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.aarch64.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
239 declare <8 x i8>  @llvm.aarch64.neon.sqxtun.v8i8(<8 x i16>) nounwind readnone
240 declare <4 x i16> @llvm.aarch64.neon.sqxtun.v4i16(<4 x i32>) nounwind readnone
241 declare <2 x i32> @llvm.aarch64.neon.sqxtun.v2i32(<2 x i64>) nounwind readnone