[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / GlobalISel / add-vec.ll
blob6bebf09b26b8763e2289cf779272186ed3f974e1
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-linux-gnu -mcpu=skx        -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=SKX
3 ; RUN: llc -mtriple=x86_64-linux-gnu -mcpu=core-avx2  -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX2
4 ; RUN: llc -mtriple=x86_64-linux-gnu -mcpu=corei7-avx -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX1
7 define <16 x i8> @test_add_v16i8(<16 x i8> %arg1, <16 x i8> %arg2) {
8 ; ALL-LABEL: test_add_v16i8:
9 ; ALL:       # %bb.0:
10 ; ALL-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
11 ; ALL-NEXT:    retq
12   %ret = add <16 x i8> %arg1, %arg2
13   ret <16 x i8> %ret
16 define <8 x i16> @test_add_v8i16(<8 x i16> %arg1, <8 x i16> %arg2) {
17 ; ALL-LABEL: test_add_v8i16:
18 ; ALL:       # %bb.0:
19 ; ALL-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
20 ; ALL-NEXT:    retq
21   %ret = add <8 x i16> %arg1, %arg2
22   ret <8 x i16> %ret
25 define <4 x i32> @test_add_v4i32(<4 x i32> %arg1, <4 x i32> %arg2) {
26 ; ALL-LABEL: test_add_v4i32:
27 ; ALL:       # %bb.0:
28 ; ALL-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
29 ; ALL-NEXT:    retq
30   %ret = add <4 x i32> %arg1, %arg2
31   ret <4 x i32> %ret
34 define <2 x i64> @test_add_v2i64(<2 x i64> %arg1, <2 x i64> %arg2) {
35 ; ALL-LABEL: test_add_v2i64:
36 ; ALL:       # %bb.0:
37 ; ALL-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
38 ; ALL-NEXT:    retq
39   %ret = add <2 x i64> %arg1, %arg2
40   ret <2 x i64> %ret
43 define <32 x i8> @test_add_v32i8(<32 x i8> %arg1, <32 x i8> %arg2) {
44 ; SKX-LABEL: test_add_v32i8:
45 ; SKX:       # %bb.0:
46 ; SKX-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
47 ; SKX-NEXT:    retq
49 ; AVX2-LABEL: test_add_v32i8:
50 ; AVX2:       # %bb.0:
51 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
52 ; AVX2-NEXT:    retq
54 ; AVX1-LABEL: test_add_v32i8:
55 ; AVX1:       # %bb.0:
56 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
57 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
58 ; AVX1-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
59 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
60 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
61 ; AVX1-NEXT:    retq
62   %ret = add <32 x i8> %arg1, %arg2
63   ret <32 x i8> %ret
66 define <16 x i16> @test_add_v16i16(<16 x i16> %arg1, <16 x i16> %arg2) {
67 ; SKX-LABEL: test_add_v16i16:
68 ; SKX:       # %bb.0:
69 ; SKX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
70 ; SKX-NEXT:    retq
72 ; AVX2-LABEL: test_add_v16i16:
73 ; AVX2:       # %bb.0:
74 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
75 ; AVX2-NEXT:    retq
77 ; AVX1-LABEL: test_add_v16i16:
78 ; AVX1:       # %bb.0:
79 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
80 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
81 ; AVX1-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
82 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
83 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
84 ; AVX1-NEXT:    retq
85   %ret = add <16 x i16> %arg1, %arg2
86   ret <16 x i16> %ret
89 define <8 x i32> @test_add_v8i32(<8 x i32> %arg1, <8 x i32> %arg2) {
90 ; SKX-LABEL: test_add_v8i32:
91 ; SKX:       # %bb.0:
92 ; SKX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
93 ; SKX-NEXT:    retq
95 ; AVX2-LABEL: test_add_v8i32:
96 ; AVX2:       # %bb.0:
97 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
98 ; AVX2-NEXT:    retq
100 ; AVX1-LABEL: test_add_v8i32:
101 ; AVX1:       # %bb.0:
102 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
103 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
104 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
105 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
106 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
107 ; AVX1-NEXT:    retq
108   %ret = add <8 x i32> %arg1, %arg2
109   ret <8 x i32> %ret
112 define <4 x i64> @test_add_v4i64(<4 x i64> %arg1, <4 x i64> %arg2) {
113 ; SKX-LABEL: test_add_v4i64:
114 ; SKX:       # %bb.0:
115 ; SKX-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
116 ; SKX-NEXT:    retq
118 ; AVX2-LABEL: test_add_v4i64:
119 ; AVX2:       # %bb.0:
120 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
121 ; AVX2-NEXT:    retq
123 ; AVX1-LABEL: test_add_v4i64:
124 ; AVX1:       # %bb.0:
125 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
126 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
127 ; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
128 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
129 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
130 ; AVX1-NEXT:    retq
131   %ret = add <4 x i64> %arg1, %arg2
132   ret <4 x i64> %ret
135 define <64 x i8> @test_add_v64i8(<64 x i8> %arg1, <64 x i8> %arg2) {
136 ; SKX-LABEL: test_add_v64i8:
137 ; SKX:       # %bb.0:
138 ; SKX-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
139 ; SKX-NEXT:    retq
141 ; AVX2-LABEL: test_add_v64i8:
142 ; AVX2:       # %bb.0:
143 ; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
144 ; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
145 ; AVX2-NEXT:    retq
147 ; AVX1-LABEL: test_add_v64i8:
148 ; AVX1:       # %bb.0:
149 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
150 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
151 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
152 ; AVX1-NEXT:    vpaddb %xmm6, %xmm4, %xmm4
153 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
154 ; AVX1-NEXT:    vpaddb %xmm6, %xmm5, %xmm5
155 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
156 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
157 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
158 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
159 ; AVX1-NEXT:    retq
160   %ret = add <64 x i8> %arg1, %arg2
161   ret <64 x i8> %ret
164 define <32 x i16> @test_add_v32i16(<32 x i16> %arg1, <32 x i16> %arg2) {
165 ; SKX-LABEL: test_add_v32i16:
166 ; SKX:       # %bb.0:
167 ; SKX-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
168 ; SKX-NEXT:    retq
170 ; AVX2-LABEL: test_add_v32i16:
171 ; AVX2:       # %bb.0:
172 ; AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
173 ; AVX2-NEXT:    vpaddw %ymm3, %ymm1, %ymm1
174 ; AVX2-NEXT:    retq
176 ; AVX1-LABEL: test_add_v32i16:
177 ; AVX1:       # %bb.0:
178 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
179 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
180 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
181 ; AVX1-NEXT:    vpaddw %xmm6, %xmm4, %xmm4
182 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
183 ; AVX1-NEXT:    vpaddw %xmm6, %xmm5, %xmm5
184 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
185 ; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
186 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
187 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
188 ; AVX1-NEXT:    retq
189   %ret = add <32 x i16> %arg1, %arg2
190   ret <32 x i16> %ret
193 define <16 x i32> @test_add_v16i32(<16 x i32> %arg1, <16 x i32> %arg2) {
194 ; SKX-LABEL: test_add_v16i32:
195 ; SKX:       # %bb.0:
196 ; SKX-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
197 ; SKX-NEXT:    retq
199 ; AVX2-LABEL: test_add_v16i32:
200 ; AVX2:       # %bb.0:
201 ; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
202 ; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
203 ; AVX2-NEXT:    retq
205 ; AVX1-LABEL: test_add_v16i32:
206 ; AVX1:       # %bb.0:
207 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
208 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
209 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
210 ; AVX1-NEXT:    vpaddd %xmm6, %xmm4, %xmm4
211 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
212 ; AVX1-NEXT:    vpaddd %xmm6, %xmm5, %xmm5
213 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
214 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
215 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
216 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
217 ; AVX1-NEXT:    retq
218   %ret = add <16 x i32> %arg1, %arg2
219   ret <16 x i32> %ret
222 define <8 x i64> @test_add_v8i64(<8 x i64> %arg1, <8 x i64> %arg2) {
223 ; SKX-LABEL: test_add_v8i64:
224 ; SKX:       # %bb.0:
225 ; SKX-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
226 ; SKX-NEXT:    retq
228 ; AVX2-LABEL: test_add_v8i64:
229 ; AVX2:       # %bb.0:
230 ; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
231 ; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
232 ; AVX2-NEXT:    retq
234 ; AVX1-LABEL: test_add_v8i64:
235 ; AVX1:       # %bb.0:
236 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
237 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
238 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
239 ; AVX1-NEXT:    vpaddq %xmm6, %xmm4, %xmm4
240 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
241 ; AVX1-NEXT:    vpaddq %xmm6, %xmm5, %xmm5
242 ; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
243 ; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1
244 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
245 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
246 ; AVX1-NEXT:    retq
247   %ret = add <8 x i64> %arg1, %arg2
248   ret <8 x i64> %ret