llvm/test/Object/ar-error.test: Don't check the message "No such file or directory".
[oota-llvm.git] / test / CodeGen / AArch64 / sext_inreg.ll
1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
2
3 ; arm64: This test contains much that is unique and valuable. Unfortunately the
4 ; bits that are unique aren't valuable and the bits that are valuable aren't
5 ; unique. (weird ABI types vs bog-standard shifting & extensions).
6
7 ; For formal arguments, we have the following vector type promotion,
8 ; v2i8 is promoted to v2i32(f64)
9 ; v2i16 is promoted to v2i32(f64)
10 ; v4i8 is promoted to v4i16(f64)
11 ; v8i1 is promoted to v8i16(f128)
12
13 define <2 x i8> @test_sext_inreg_v2i8i16(<2 x i8> %v1, <2 x i8> %v2) nounwind readnone {
14 ; CHECK-LABEL: test_sext_inreg_v2i8i16
15 ; CHECK: sshll   v0.8h, v0.8b, #0
16 ; CHECK-NEXT: uzp1    v0.8h, v0.8h, v0.8h
17 ; CHECK-NEXT: sshll   v1.8h, v1.8b, #0
18 ; CHECK-NEXT: uzp1    v1.8h, v1.8h, v1.8h
19   %1 = sext <2 x i8> %v1 to <2 x i16>
20   %2 = sext <2 x i8> %v2 to <2 x i16>
21   %3 = shufflevector <2 x i16> %1, <2 x i16> %2, <2 x i32> <i32 0, i32 2>
22   %4 = trunc <2 x i16> %3 to <2 x i8>
23   ret <2 x i8> %4
24 }
25
26 define <2 x i8> @test_sext_inreg_v2i8i16_2(<2 x i32> %v1, <2 x i32> %v2) nounwind readnone {
27 ; CHECK-LABEL: test_sext_inreg_v2i8i16_2
28 ; CHECK: sshll   v0.8h, v0.8b, #0
29 ; CHECK-NEXT: uzp1    v0.8h, v0.8h, v0.8h
30 ; CHECK-NEXT: sshll   v1.8h, v1.8b, #0
31 ; CHECK-NEXT: uzp1    v1.8h, v1.8h, v1.8h
32   %a1 = shl <2 x i32> %v1, <i32 24, i32 24>
33   %a2 = ashr <2 x i32> %a1, <i32 24, i32 24>
34   %b1 = shl <2 x i32> %v2, <i32 24, i32 24>
35   %b2 = ashr <2 x i32> %b1, <i32 24, i32 24>
36   %c = shufflevector <2 x i32> %a2, <2 x i32> %b2, <2 x i32> <i32 0, i32 2>
37   %d = trunc <2 x i32> %c to <2 x i8>
38   ret <2 x i8> %d
39 }
40
41 define <2 x i8> @test_sext_inreg_v2i8i32(<2 x i8> %v1, <2 x i8> %v2) nounwind readnone {
42 ; CHECK-LABEL: test_sext_inreg_v2i8i32
43 ; CHECK: sshll   v0.8h, v0.8b, #0
44 ; CHECK-NEXT: uzp1    v0.8h, v0.8h, v0.8h
45 ; CHECK-NEXT: sshll      v1.8h, v1.8b, #0
46 ; CHECK-NEXT: uzp1    v1.8h, v1.8h, v1.8h
47   %1 = sext <2 x i8> %v1 to <2 x i32>
48   %2 = sext <2 x i8> %v2 to <2 x i32>
49   %3 = shufflevector <2 x i32> %1, <2 x i32> %2, <2 x i32> <i32 0, i32 2>
50   %4 = trunc <2 x i32> %3 to <2 x i8>
51   ret <2 x i8> %4
52 }
53
54 define <2 x i8> @test_sext_inreg_v2i8i64(<2 x i8> %v1, <2 x i8> %v2) nounwind readnone {
55 ; CHECK-LABEL: test_sext_inreg_v2i8i64
56 ; CHECK: ushll   v1.2d, v1.2s, #0
57 ; CHECK: ushll   v0.2d, v0.2s, #0
58 ; CHECK: shl     v0.2d, v0.2d, #56
59 ; CHECK: sshr    v0.2d, v0.2d, #56
60 ; CHECK: shl     v1.2d, v1.2d, #56
61 ; CHECK: sshr    v1.2d, v1.2d, #56
62   %1 = sext <2 x i8> %v1 to <2 x i64>
63   %2 = sext <2 x i8> %v2 to <2 x i64>
64   %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 2>
65   %4 = trunc <2 x i64> %3 to <2 x i8>
66   ret <2 x i8> %4
67 }
68
69 define <4 x i8> @test_sext_inreg_v4i8i16(<4 x i8> %v1, <4 x i8> %v2) nounwind readnone {
70 ; CHECK-LABEL: test_sext_inreg_v4i8i16
71 ; CHECK: sshll   v0.8h, v0.8b, #0
72 ; CHECK-NEXT: uzp1    v0.8h, v0.8h, v0.8h
73 ; CHECK-NEXT: sshll   v1.8h, v1.8b, #0
74 ; CHECK-NEXT: uzp1    v1.8h, v1.8h, v1.8h
75   %1 = sext <4 x i8> %v1 to <4 x i16>
76   %2 = sext <4 x i8> %v2 to <4 x i16>
77   %3 = shufflevector <4 x i16> %1, <4 x i16> %2, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
78   %4 = trunc <4 x i16> %3 to <4 x i8>
79   ret <4 x i8> %4
80 }
81
82 define <4 x i8> @test_sext_inreg_v4i8i16_2(<4 x i16> %v1, <4 x i16> %v2) nounwind readnone {
83 ; CHECK-LABEL: test_sext_inreg_v4i8i16_2
84 ; CHECK: sshll   v0.8h, v0.8b, #0
85 ; CHECK-NEXT: uzp1    v0.8h, v0.8h, v0.8h
86 ; CHECK-NEXT: sshll   v1.8h, v1.8b, #0
87 ; CHECK-NEXT: uzp1    v1.8h, v1.8h, v1.8h
88   %a1 = shl <4 x i16> %v1, <i16 8, i16 8, i16 8, i16 8>
89   %a2 = ashr <4 x i16> %a1, <i16 8, i16 8, i16 8, i16 8>
90   %b1 = shl <4 x i16> %v2, <i16 8, i16 8, i16 8, i16 8>
91   %b2 = ashr <4 x i16> %b1, <i16 8, i16 8, i16 8, i16 8>
92   %c = shufflevector <4 x i16> %a2, <4 x i16> %b2, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
93   %d = trunc <4 x i16> %c to <4 x i8>
94   ret <4 x i8> %d
95 }
96
97 define <4 x i8> @test_sext_inreg_v4i8i32(<4 x i8> %v1, <4 x i8> %v2) nounwind readnone {
98 ; CHECK-LABEL: test_sext_inreg_v4i8i32
99 ; CHECK: ushll   v1.4s, v1.4h, #0
100 ; CHECK: ushll   v0.4s, v0.4h, #0
101 ; CHECK: shl     v0.4s, v0.4s, #24
102 ; CHECK: sshr    v0.4s, v0.4s, #24
103 ; CHECK: shl     v1.4s, v1.4s, #24
104 ; CHECK: sshr    v1.4s, v1.4s, #24
105   %1 = sext <4 x i8> %v1 to <4 x i32>
106   %2 = sext <4 x i8> %v2 to <4 x i32>
107   %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
108   %4 = trunc <4 x i32> %3 to <4 x i8>
109   ret <4 x i8> %4
110 }
111
112 define <8 x i8> @test_sext_inreg_v8i8i16(<8 x i8> %v1, <8 x i8> %v2) nounwind readnone {
113 ; CHECK-LABEL: test_sext_inreg_v8i8i16
114 ; CHECK: sshll   v0.8h, v0.8b, #0
115 ; CHECK: sshll   v1.8h, v1.8b, #0
116   %1 = sext <8 x i8> %v1 to <8 x i16>
117   %2 = sext <8 x i8> %v2 to <8 x i16>
118   %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
119   %4 = trunc <8 x i16> %3 to <8 x i8>
120   ret <8 x i8> %4
121 }
122
123 define <8 x i1> @test_sext_inreg_v8i1i16(<8 x i1> %v1, <8 x i1> %v2) nounwind readnone {
124 ; CHECK-LABEL: test_sext_inreg_v8i1i16
125 ; CHECK: ushll   v1.8h, v1.8b, #0
126 ; CHECK: ushll   v0.8h, v0.8b, #0
127 ; CHECK: shl     v0.8h, v0.8h, #15
128 ; CHECK: sshr    v0.8h, v0.8h, #15
129 ; CHECK: shl     v1.8h, v1.8h, #15
130 ; CHECK: sshr    v1.8h, v1.8h, #15
131   %1 = sext <8 x i1> %v1 to <8 x i16>
132   %2 = sext <8 x i1> %v2 to <8 x i16>
133   %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
134   %4 = trunc <8 x i16> %3 to <8 x i1>
135   ret <8 x i1> %4
136 }
137
138 define <2 x i16> @test_sext_inreg_v2i16i32(<2 x i16> %v1, <2 x i16> %v2) nounwind readnone {
139 ; CHECK-LABEL: test_sext_inreg_v2i16i32
140 ; CHECK: sshll   v0.4s, v0.4h, #0
141 ; CHECK-NEXT: uzp1    v0.4s, v0.4s, v0.4s
142 ; CHECK-NEXT: sshll   v1.4s, v1.4h, #0
143 ; CHECK-NEXT: uzp1    v1.4s, v1.4s, v1.4s
144   %1 = sext <2 x i16> %v1 to <2 x i32>
145   %2 = sext <2 x i16> %v2 to <2 x i32>
146   %3 = shufflevector <2 x i32> %1, <2 x i32> %2, <2 x i32> <i32 0, i32 2>
147   %4 = trunc <2 x i32> %3 to <2 x i16>
148   ret <2 x i16> %4
149 }
150
151 define <2 x i16> @test_sext_inreg_v2i16i32_2(<2 x i32> %v1, <2 x i32> %v2) nounwind readnone {
152 ; CHECK-LABEL: test_sext_inreg_v2i16i32_2
153 ; CHECK: sshll   v0.4s, v0.4h, #0
154 ; CHECK-NEXT: uzp1    v0.4s, v0.4s, v0.4s
155 ; CHECK-NEXT: sshll   v1.4s, v1.4h, #0
156 ; CHECK-NEXT: uzp1    v1.4s, v1.4s, v1.4s
157   %a1 = shl <2 x i32> %v1, <i32 16, i32 16>
158   %a2 = ashr <2 x i32> %a1, <i32 16, i32 16>
159   %b1 = shl <2 x i32> %v2, <i32 16, i32 16>
160   %b2 = ashr <2 x i32> %b1, <i32 16, i32 16>
161   %c = shufflevector <2 x i32> %a2, <2 x i32> %b2, <2 x i32> <i32 0, i32 2>
162   %d = trunc <2 x i32> %c to <2 x i16>
163   ret <2 x i16> %d
164 }
165
166 define <2 x i16> @test_sext_inreg_v2i16i64(<2 x i16> %v1, <2 x i16> %v2) nounwind readnone {
167 ; CHECK-LABEL: test_sext_inreg_v2i16i64
168 ; CHECK: ushll   v1.2d, v1.2s, #0
169 ; CHECK: ushll   v0.2d, v0.2s, #0
170 ; CHECK: shl     v0.2d, v0.2d, #48
171 ; CHECK: sshr    v0.2d, v0.2d, #48
172 ; CHECK: shl     v1.2d, v1.2d, #48
173 ; CHECK: sshr    v1.2d, v1.2d, #48
174   %1 = sext <2 x i16> %v1 to <2 x i64>
175   %2 = sext <2 x i16> %v2 to <2 x i64>
176   %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 2>
177   %4 = trunc <2 x i64> %3 to <2 x i16>
178   ret <2 x i16> %4
179 }
180
181 define <4 x i16> @test_sext_inreg_v4i16i32(<4 x i16> %v1, <4 x i16> %v2) nounwind readnone {
182 ; CHECK-LABEL: test_sext_inreg_v4i16i32
183 ; CHECK: sshll v0.4s, v0.4h, #0
184 ; CHECK: sshll v1.4s, v1.4h, #0
185   %1 = sext <4 x i16> %v1 to <4 x i32>
186   %2 = sext <4 x i16> %v2 to <4 x i32>
187   %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
188   %4 = trunc <4 x i32> %3 to <4 x i16>
189   ret <4 x i16> %4
190 }
191
192 define <2 x i32> @test_sext_inreg_v2i32i64(<2 x i32> %v1, <2 x i32> %v2) nounwind readnone {
193 ; CHECK-LABEL: test_sext_inreg_v2i32i64
194 ; CHECK: sshll v0.2d, v0.2s, #0
195 ; CHECK: sshll v1.2d, v1.2s, #0
196   %1 = sext <2 x i32> %v1 to <2 x i64>
197   %2 = sext <2 x i32> %v2 to <2 x i64>
198   %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 2>
199   %4 = trunc <2 x i64> %3 to <2 x i32>
200   ret <2 x i32> %4
201 }
202