1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512vnni,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=CHECK
4 define <4 x i32> @test_pmaddwd_v8i16_add_v4i32(<4 x i32> %a0, <8 x i16> %a1, <8 x i16> %a2) {
5 ; CHECK-LABEL: test_pmaddwd_v8i16_add_v4i32:
7 ; CHECK-NEXT: vpdpwssd %xmm2, %xmm1, %xmm0
9 %1 = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a1, <8 x i16> %a2)
10 %2 = add <4 x i32> %1, %a0
14 define <4 x i32> @test_pmaddwd_v8i16_add_v4i32_commute(<4 x i32> %a0, <8 x i16> %a1, <8 x i16> %a2) {
15 ; CHECK-LABEL: test_pmaddwd_v8i16_add_v4i32_commute:
17 ; CHECK-NEXT: vpdpwssd %xmm2, %xmm1, %xmm0
19 %1 = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a1, <8 x i16> %a2)
20 %2 = add <4 x i32> %a0, %1
24 define <4 x i32> @test_pmaddwd_v8i16_add_v4i32_load1(<4 x i32> %a0, <8 x i16>* %p1, <8 x i16> %a2) {
25 ; CHECK-LABEL: test_pmaddwd_v8i16_add_v4i32_load1:
27 ; CHECK-NEXT: vpdpwssd (%rdi), %xmm1, %xmm0
29 %a1 = load <8 x i16>, <8 x i16>* %p1
30 %1 = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a1, <8 x i16> %a2)
31 %2 = add <4 x i32> %1, %a0
35 define <4 x i32> @test_pmaddwd_v8i16_add_v4i32_load2(<4 x i32> %a0, <8 x i16> %a1, <8 x i16>* %p2) {
36 ; CHECK-LABEL: test_pmaddwd_v8i16_add_v4i32_load2:
38 ; CHECK-NEXT: vpdpwssd (%rdi), %xmm1, %xmm0
40 %a2 = load <8 x i16>, <8 x i16>* %p2
41 %1 = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a1, <8 x i16> %a2)
42 %2 = add <4 x i32> %1, %a0
46 define <4 x i32> @test_pmaddwd_v8i16_add_v4i32_commute_load1(<4 x i32> %a0, <8 x i16>* %p1, <8 x i16> %a2) {
47 ; CHECK-LABEL: test_pmaddwd_v8i16_add_v4i32_commute_load1:
49 ; CHECK-NEXT: vpdpwssd (%rdi), %xmm1, %xmm0
51 %a1 = load <8 x i16>, <8 x i16>* %p1
52 %1 = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a1, <8 x i16> %a2)
53 %2 = add <4 x i32> %a0, %1
57 define <4 x i32> @test_pmaddwd_v8i16_add_v4i32_commute_load2(<4 x i32> %a0, <8 x i16> %a1, <8 x i16>* %p2) {
58 ; CHECK-LABEL: test_pmaddwd_v8i16_add_v4i32_commute_load2:
60 ; CHECK-NEXT: vpdpwssd (%rdi), %xmm1, %xmm0
62 %a2 = load <8 x i16>, <8 x i16>* %p2
63 %1 = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a1, <8 x i16> %a2)
64 %2 = add <4 x i32> %a0, %1
68 define <8 x i32> @test_pmaddwd_v16i16_add_v8i32(<8 x i32> %a0, <16 x i16> %a1, <16 x i16> %a2) {
69 ; CHECK-LABEL: test_pmaddwd_v16i16_add_v8i32:
71 ; CHECK-NEXT: vpdpwssd %ymm2, %ymm1, %ymm0
73 %1 = call <8 x i32> @llvm.x86.avx2.pmadd.wd(<16 x i16> %a1, <16 x i16> %a2)
74 %2 = add <8 x i32> %1, %a0
78 define <8 x i32> @test_pmaddwd_v16i16_add_v8i32_commute(<8 x i32> %a0, <16 x i16> %a1, <16 x i16> %a2) {
79 ; CHECK-LABEL: test_pmaddwd_v16i16_add_v8i32_commute:
81 ; CHECK-NEXT: vpdpwssd %ymm2, %ymm1, %ymm0
83 %1 = call <8 x i32> @llvm.x86.avx2.pmadd.wd(<16 x i16> %a1, <16 x i16> %a2)
84 %2 = add <8 x i32> %a0, %1
88 define <8 x i32> @test_pmaddwd_v16i16_add_v8i32_load1(<8 x i32> %a0, <16 x i16>* %p1, <16 x i16> %a2) {
89 ; CHECK-LABEL: test_pmaddwd_v16i16_add_v8i32_load1:
91 ; CHECK-NEXT: vpdpwssd (%rdi), %ymm1, %ymm0
93 %a1 = load <16 x i16>, <16 x i16>* %p1
94 %1 = call <8 x i32> @llvm.x86.avx2.pmadd.wd(<16 x i16> %a1, <16 x i16> %a2)
95 %2 = add <8 x i32> %1, %a0
99 define <8 x i32> @test_pmaddwd_v16i16_add_v8i32_load2(<8 x i32> %a0, <16 x i16> %a1, <16 x i16>* %p2) {
100 ; CHECK-LABEL: test_pmaddwd_v16i16_add_v8i32_load2:
102 ; CHECK-NEXT: vpdpwssd (%rdi), %ymm1, %ymm0
104 %a2 = load <16 x i16>, <16 x i16>* %p2
105 %1 = call <8 x i32> @llvm.x86.avx2.pmadd.wd(<16 x i16> %a1, <16 x i16> %a2)
106 %2 = add <8 x i32> %1, %a0
110 define <8 x i32> @test_pmaddwd_v16i16_add_v8i32_commute_load1(<8 x i32> %a0, <16 x i16>* %p1, <16 x i16> %a2) {
111 ; CHECK-LABEL: test_pmaddwd_v16i16_add_v8i32_commute_load1:
113 ; CHECK-NEXT: vpdpwssd (%rdi), %ymm1, %ymm0
115 %a1 = load <16 x i16>, <16 x i16>* %p1
116 %1 = call <8 x i32> @llvm.x86.avx2.pmadd.wd(<16 x i16> %a1, <16 x i16> %a2)
117 %2 = add <8 x i32> %a0, %1
121 define <8 x i32> @test_pmaddwd_v16i16_add_v8i32_commute_load2(<8 x i32> %a0, <16 x i16> %a1, <16 x i16>* %p2) {
122 ; CHECK-LABEL: test_pmaddwd_v16i16_add_v8i32_commute_load2:
124 ; CHECK-NEXT: vpdpwssd (%rdi), %ymm1, %ymm0
126 %a2 = load <16 x i16>, <16 x i16>* %p2
127 %1 = call <8 x i32> @llvm.x86.avx2.pmadd.wd(<16 x i16> %a1, <16 x i16> %a2)
128 %2 = add <8 x i32> %a0, %1
132 define <16 x i32> @test_pmaddwd_v32i16_add_v16i32(<16 x i32> %a0, <32 x i16> %a1, <32 x i16> %a2) {
133 ; CHECK-LABEL: test_pmaddwd_v32i16_add_v16i32:
135 ; CHECK-NEXT: vpdpwssd %zmm2, %zmm1, %zmm0
137 %1 = call <16 x i32> @llvm.x86.avx512.pmaddw.d.512(<32 x i16> %a1, <32 x i16> %a2)
138 %2 = add <16 x i32> %1, %a0
142 define <16 x i32> @test_pmaddwd_v32i16_add_v16i32_commute(<16 x i32> %a0, <32 x i16> %a1, <32 x i16> %a2) {
143 ; CHECK-LABEL: test_pmaddwd_v32i16_add_v16i32_commute:
145 ; CHECK-NEXT: vpdpwssd %zmm2, %zmm1, %zmm0
147 %1 = call <16 x i32> @llvm.x86.avx512.pmaddw.d.512(<32 x i16> %a1, <32 x i16> %a2)
148 %2 = add <16 x i32> %a0, %1
152 define <16 x i32> @test_pmaddwd_v32i16_add_v16i32_load1(<16 x i32> %a0, <32 x i16>* %p1, <32 x i16> %a2) {
153 ; CHECK-LABEL: test_pmaddwd_v32i16_add_v16i32_load1:
155 ; CHECK-NEXT: vpdpwssd (%rdi), %zmm1, %zmm0
157 %a1 = load <32 x i16>, <32 x i16>* %p1
158 %1 = call <16 x i32> @llvm.x86.avx512.pmaddw.d.512(<32 x i16> %a1, <32 x i16> %a2)
159 %2 = add <16 x i32> %1, %a0
163 define <16 x i32> @test_pmaddwd_v32i16_add_v16i32_load2(<16 x i32> %a0, <32 x i16> %a1, <32 x i16>* %p2) {
164 ; CHECK-LABEL: test_pmaddwd_v32i16_add_v16i32_load2:
166 ; CHECK-NEXT: vpdpwssd (%rdi), %zmm1, %zmm0
168 %a2 = load <32 x i16>, <32 x i16>* %p2
169 %1 = call <16 x i32> @llvm.x86.avx512.pmaddw.d.512(<32 x i16> %a1, <32 x i16> %a2)
170 %2 = add <16 x i32> %1, %a0
174 define <16 x i32> @test_pmaddwd_v32i16_add_v16i32_commute_load1(<16 x i32> %a0, <32 x i16>* %p1, <32 x i16> %a2) {
175 ; CHECK-LABEL: test_pmaddwd_v32i16_add_v16i32_commute_load1:
177 ; CHECK-NEXT: vpdpwssd (%rdi), %zmm1, %zmm0
179 %a1 = load <32 x i16>, <32 x i16>* %p1
180 %1 = call <16 x i32> @llvm.x86.avx512.pmaddw.d.512(<32 x i16> %a1, <32 x i16> %a2)
181 %2 = add <16 x i32> %a0, %1
185 define <16 x i32> @test_pmaddwd_v32i16_add_v16i32_commute_load2(<16 x i32> %a0, <32 x i16> %a1, <32 x i16>* %p2) {
186 ; CHECK-LABEL: test_pmaddwd_v32i16_add_v16i32_commute_load2:
188 ; CHECK-NEXT: vpdpwssd (%rdi), %zmm1, %zmm0
190 %a2 = load <32 x i16>, <32 x i16>* %p2
191 %1 = call <16 x i32> @llvm.x86.avx512.pmaddw.d.512(<32 x i16> %a1, <32 x i16> %a2)
192 %2 = add <16 x i32> %a0, %1
196 declare <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16>, <8 x i16>)
197 declare <8 x i32> @llvm.x86.avx2.pmadd.wd(<16 x i16>, <16 x i16>)
198 declare <16 x i32> @llvm.x86.avx512.pmaddw.d.512(<32 x i16>, <32 x i16>)