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:
10 ; ALL-NEXT: vpaddb %xmm1, %xmm0, %xmm0
12 %ret = add <16 x i8> %arg1, %arg2
16 define <8 x i16> @test_add_v8i16(<8 x i16> %arg1, <8 x i16> %arg2) {
17 ; ALL-LABEL: test_add_v8i16:
19 ; ALL-NEXT: vpaddw %xmm1, %xmm0, %xmm0
21 %ret = add <8 x i16> %arg1, %arg2
25 define <4 x i32> @test_add_v4i32(<4 x i32> %arg1, <4 x i32> %arg2) {
26 ; ALL-LABEL: test_add_v4i32:
28 ; ALL-NEXT: vpaddd %xmm1, %xmm0, %xmm0
30 %ret = add <4 x i32> %arg1, %arg2
34 define <2 x i64> @test_add_v2i64(<2 x i64> %arg1, <2 x i64> %arg2) {
35 ; ALL-LABEL: test_add_v2i64:
37 ; ALL-NEXT: vpaddq %xmm1, %xmm0, %xmm0
39 %ret = add <2 x i64> %arg1, %arg2
43 define <32 x i8> @test_add_v32i8(<32 x i8> %arg1, <32 x i8> %arg2) {
44 ; SKX-LABEL: test_add_v32i8:
46 ; SKX-NEXT: vpaddb %ymm1, %ymm0, %ymm0
49 ; AVX2-LABEL: test_add_v32i8:
51 ; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0
54 ; AVX1-LABEL: test_add_v32i8:
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
62 %ret = add <32 x i8> %arg1, %arg2
66 define <16 x i16> @test_add_v16i16(<16 x i16> %arg1, <16 x i16> %arg2) {
67 ; SKX-LABEL: test_add_v16i16:
69 ; SKX-NEXT: vpaddw %ymm1, %ymm0, %ymm0
72 ; AVX2-LABEL: test_add_v16i16:
74 ; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0
77 ; AVX1-LABEL: test_add_v16i16:
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
85 %ret = add <16 x i16> %arg1, %arg2
89 define <8 x i32> @test_add_v8i32(<8 x i32> %arg1, <8 x i32> %arg2) {
90 ; SKX-LABEL: test_add_v8i32:
92 ; SKX-NEXT: vpaddd %ymm1, %ymm0, %ymm0
95 ; AVX2-LABEL: test_add_v8i32:
97 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
100 ; AVX1-LABEL: test_add_v8i32:
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
108 %ret = add <8 x i32> %arg1, %arg2
112 define <4 x i64> @test_add_v4i64(<4 x i64> %arg1, <4 x i64> %arg2) {
113 ; SKX-LABEL: test_add_v4i64:
115 ; SKX-NEXT: vpaddq %ymm1, %ymm0, %ymm0
118 ; AVX2-LABEL: test_add_v4i64:
120 ; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
123 ; AVX1-LABEL: test_add_v4i64:
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
131 %ret = add <4 x i64> %arg1, %arg2
135 define <64 x i8> @test_add_v64i8(<64 x i8> %arg1, <64 x i8> %arg2) {
136 ; SKX-LABEL: test_add_v64i8:
138 ; SKX-NEXT: vpaddb %zmm1, %zmm0, %zmm0
141 ; AVX2-LABEL: test_add_v64i8:
143 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
144 ; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1
147 ; AVX1-LABEL: test_add_v64i8:
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
160 %ret = add <64 x i8> %arg1, %arg2
164 define <32 x i16> @test_add_v32i16(<32 x i16> %arg1, <32 x i16> %arg2) {
165 ; SKX-LABEL: test_add_v32i16:
167 ; SKX-NEXT: vpaddw %zmm1, %zmm0, %zmm0
170 ; AVX2-LABEL: test_add_v32i16:
172 ; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0
173 ; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm1
176 ; AVX1-LABEL: test_add_v32i16:
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
189 %ret = add <32 x i16> %arg1, %arg2
193 define <16 x i32> @test_add_v16i32(<16 x i32> %arg1, <16 x i32> %arg2) {
194 ; SKX-LABEL: test_add_v16i32:
196 ; SKX-NEXT: vpaddd %zmm1, %zmm0, %zmm0
199 ; AVX2-LABEL: test_add_v16i32:
201 ; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0
202 ; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1
205 ; AVX1-LABEL: test_add_v16i32:
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
218 %ret = add <16 x i32> %arg1, %arg2
222 define <8 x i64> @test_add_v8i64(<8 x i64> %arg1, <8 x i64> %arg2) {
223 ; SKX-LABEL: test_add_v8i64:
225 ; SKX-NEXT: vpaddq %zmm1, %zmm0, %zmm0
228 ; AVX2-LABEL: test_add_v8i64:
230 ; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0
231 ; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1
234 ; AVX1-LABEL: test_add_v8i64:
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
247 %ret = add <8 x i64> %arg1, %arg2