1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW 7 8 define <16 x i8> @mul_v16i8c(<16 x i8> %i) nounwind { 9 ; SSE2-LABEL: mul_v16i8c: 10 ; SSE2: # %bb.0: # %entry 11 ; SSE2-NEXT: movdqa %xmm0, %xmm1 12 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 13 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 14 ; SSE2-NEXT: pmullw %xmm2, %xmm1 15 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 16 ; SSE2-NEXT: pand %xmm3, %xmm1 17 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 18 ; SSE2-NEXT: pmullw %xmm2, %xmm0 19 ; SSE2-NEXT: pand %xmm3, %xmm0 20 ; SSE2-NEXT: packuswb %xmm1, %xmm0 21 ; SSE2-NEXT: retq 22 ; 23 ; SSE41-LABEL: mul_v16i8c: 24 ; SSE41: # %bb.0: # %entry 25 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 26 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 27 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 28 ; SSE41-NEXT: pmullw %xmm2, %xmm0 29 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 30 ; SSE41-NEXT: pand %xmm3, %xmm0 31 ; SSE41-NEXT: pmullw %xmm2, %xmm1 32 ; SSE41-NEXT: pand %xmm3, %xmm1 33 ; SSE41-NEXT: packuswb %xmm0, %xmm1 34 ; SSE41-NEXT: movdqa %xmm1, %xmm0 35 ; SSE41-NEXT: retq 36 ; 37 ; AVX2-LABEL: mul_v16i8c: 38 ; AVX2: # %bb.0: # %entry 39 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0 40 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 41 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 42 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 43 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1 44 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0 45 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 46 ; AVX2-NEXT: vzeroupper 47 ; AVX2-NEXT: retq 48 ; 49 ; AVX512F-LABEL: mul_v16i8c: 50 ; AVX512F: # %bb.0: # %entry 51 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 52 ; AVX512F-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 53 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 54 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 55 ; AVX512F-NEXT: vzeroupper 56 ; AVX512F-NEXT: retq 57 ; 58 ; AVX512BW-LABEL: mul_v16i8c: 59 ; AVX512BW: # %bb.0: # %entry 60 ; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm0 61 ; AVX512BW-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 62 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 63 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 64 ; AVX512BW-NEXT: vzeroupper 65 ; AVX512BW-NEXT: retq 66 entry: 67 %A = mul <16 x i8> %i, < i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117 > 68 ret <16 x i8> %A 69 } 70 71 define <8 x i16> @mul_v8i16c(<8 x i16> %i) nounwind { 72 ; SSE-LABEL: mul_v8i16c: 73 ; SSE: # %bb.0: # %entry 74 ; SSE-NEXT: pmullw {{.*}}(%rip), %xmm0 75 ; SSE-NEXT: retq 76 ; 77 ; AVX-LABEL: mul_v8i16c: 78 ; AVX: # %bb.0: # %entry 79 ; AVX-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 80 ; AVX-NEXT: retq 81 entry: 82 %A = mul <8 x i16> %i, < i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117 > 83 ret <8 x i16> %A 84 } 85 86 define <4 x i32> @mul_v4i32c(<4 x i32> %i) nounwind { 87 ; SSE2-LABEL: mul_v4i32c: 88 ; SSE2: # %bb.0: # %entry 89 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [117,117,117,117] 90 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 91 ; SSE2-NEXT: pmuludq %xmm1, %xmm0 92 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 93 ; SSE2-NEXT: pmuludq %xmm1, %xmm2 94 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 95 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 96 ; SSE2-NEXT: retq 97 ; 98 ; SSE41-LABEL: mul_v4i32c: 99 ; SSE41: # %bb.0: # %entry 100 ; SSE41-NEXT: pmulld {{.*}}(%rip), %xmm0 101 ; SSE41-NEXT: retq 102 ; 103 ; AVX-LABEL: mul_v4i32c: 104 ; AVX: # %bb.0: # %entry 105 ; AVX-NEXT: vpbroadcastd {{.*#+}} xmm1 = [117,117,117,117] 106 ; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 107 ; AVX-NEXT: retq 108 entry: 109 %A = mul <4 x i32> %i, < i32 117, i32 117, i32 117, i32 117 > 110 ret <4 x i32> %A 111 } 112 113 define <2 x i64> @mul_v2i64c(<2 x i64> %i) nounwind { 114 ; SSE-LABEL: mul_v2i64c: 115 ; SSE: # %bb.0: # %entry 116 ; SSE-NEXT: movdqa {{.*#+}} xmm1 = [117,117] 117 ; SSE-NEXT: movdqa %xmm0, %xmm2 118 ; SSE-NEXT: pmuludq %xmm1, %xmm2 119 ; SSE-NEXT: psrlq $32, %xmm0 120 ; SSE-NEXT: pmuludq %xmm1, %xmm0 121 ; SSE-NEXT: psllq $32, %xmm0 122 ; SSE-NEXT: paddq %xmm2, %xmm0 123 ; SSE-NEXT: retq 124 ; 125 ; AVX-LABEL: mul_v2i64c: 126 ; AVX: # %bb.0: # %entry 127 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [117,117] 128 ; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm2 129 ; AVX-NEXT: vpsrlq $32, %xmm0, %xmm0 130 ; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 131 ; AVX-NEXT: vpsllq $32, %xmm0, %xmm0 132 ; AVX-NEXT: vpaddq %xmm0, %xmm2, %xmm0 133 ; AVX-NEXT: retq 134 entry: 135 %A = mul <2 x i64> %i, < i64 117, i64 117 > 136 ret <2 x i64> %A 137 } 138 139 define <16 x i8> @mul_v16i8(<16 x i8> %i, <16 x i8> %j) nounwind { 140 ; SSE2-LABEL: mul_v16i8: 141 ; SSE2: # %bb.0: # %entry 142 ; SSE2-NEXT: movdqa %xmm1, %xmm2 143 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 144 ; SSE2-NEXT: movdqa %xmm0, %xmm3 145 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 146 ; SSE2-NEXT: pmullw %xmm2, %xmm3 147 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 148 ; SSE2-NEXT: pand %xmm2, %xmm3 149 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 150 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 151 ; SSE2-NEXT: pmullw %xmm1, %xmm0 152 ; SSE2-NEXT: pand %xmm2, %xmm0 153 ; SSE2-NEXT: packuswb %xmm3, %xmm0 154 ; SSE2-NEXT: retq 155 ; 156 ; SSE41-LABEL: mul_v16i8: 157 ; SSE41: # %bb.0: # %entry 158 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 159 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 160 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 161 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 162 ; SSE41-NEXT: pmullw %xmm1, %xmm0 163 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 164 ; SSE41-NEXT: pand %xmm1, %xmm0 165 ; SSE41-NEXT: pmullw %xmm3, %xmm2 166 ; SSE41-NEXT: pand %xmm1, %xmm2 167 ; SSE41-NEXT: packuswb %xmm0, %xmm2 168 ; SSE41-NEXT: movdqa %xmm2, %xmm0 169 ; SSE41-NEXT: retq 170 ; 171 ; AVX2-LABEL: mul_v16i8: 172 ; AVX2: # %bb.0: # %entry 173 ; AVX2-NEXT: vpmovsxbw %xmm1, %ymm1 174 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0 175 ; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 176 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 177 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 178 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1 179 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0 180 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 181 ; AVX2-NEXT: vzeroupper 182 ; AVX2-NEXT: retq 183 ; 184 ; AVX512F-LABEL: mul_v16i8: 185 ; AVX512F: # %bb.0: # %entry 186 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1 187 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 188 ; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm0 189 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 190 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 191 ; AVX512F-NEXT: vzeroupper 192 ; AVX512F-NEXT: retq 193 ; 194 ; AVX512BW-LABEL: mul_v16i8: 195 ; AVX512BW: # %bb.0: # %entry 196 ; AVX512BW-NEXT: vpmovsxbw %xmm1, %ymm1 197 ; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm0 198 ; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 199 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 200 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 201 ; AVX512BW-NEXT: vzeroupper 202 ; AVX512BW-NEXT: retq 203 entry: 204 %A = mul <16 x i8> %i, %j 205 ret <16 x i8> %A 206 } 207 208 define <8 x i16> @mul_v8i16(<8 x i16> %i, <8 x i16> %j) nounwind { 209 ; SSE-LABEL: mul_v8i16: 210 ; SSE: # %bb.0: # %entry 211 ; SSE-NEXT: pmullw %xmm1, %xmm0 212 ; SSE-NEXT: retq 213 ; 214 ; AVX-LABEL: mul_v8i16: 215 ; AVX: # %bb.0: # %entry 216 ; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 217 ; AVX-NEXT: retq 218 entry: 219 %A = mul <8 x i16> %i, %j 220 ret <8 x i16> %A 221 } 222 223 define <4 x i32> @mul_v4i32(<4 x i32> %i, <4 x i32> %j) nounwind { 224 ; SSE2-LABEL: mul_v4i32: 225 ; SSE2: # %bb.0: # %entry 226 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 227 ; SSE2-NEXT: pmuludq %xmm1, %xmm0 228 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 229 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 230 ; SSE2-NEXT: pmuludq %xmm2, %xmm1 231 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 232 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 233 ; SSE2-NEXT: retq 234 ; 235 ; SSE41-LABEL: mul_v4i32: 236 ; SSE41: # %bb.0: # %entry 237 ; SSE41-NEXT: pmulld %xmm1, %xmm0 238 ; SSE41-NEXT: retq 239 ; 240 ; AVX-LABEL: mul_v4i32: 241 ; AVX: # %bb.0: # %entry 242 ; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 243 ; AVX-NEXT: retq 244 entry: 245 %A = mul <4 x i32> %i, %j 246 ret <4 x i32> %A 247 } 248 249 define <2 x i64> @mul_v2i64(<2 x i64> %i, <2 x i64> %j) nounwind { 250 ; SSE-LABEL: mul_v2i64: 251 ; SSE: # %bb.0: # %entry 252 ; SSE-NEXT: movdqa %xmm0, %xmm2 253 ; SSE-NEXT: psrlq $32, %xmm2 254 ; SSE-NEXT: pmuludq %xmm1, %xmm2 255 ; SSE-NEXT: movdqa %xmm1, %xmm3 256 ; SSE-NEXT: psrlq $32, %xmm3 257 ; SSE-NEXT: pmuludq %xmm0, %xmm3 258 ; SSE-NEXT: paddq %xmm2, %xmm3 259 ; SSE-NEXT: psllq $32, %xmm3 260 ; SSE-NEXT: pmuludq %xmm1, %xmm0 261 ; SSE-NEXT: paddq %xmm3, %xmm0 262 ; SSE-NEXT: retq 263 ; 264 ; AVX-LABEL: mul_v2i64: 265 ; AVX: # %bb.0: # %entry 266 ; AVX-NEXT: vpsrlq $32, %xmm0, %xmm2 267 ; AVX-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 268 ; AVX-NEXT: vpsrlq $32, %xmm1, %xmm3 269 ; AVX-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 270 ; AVX-NEXT: vpaddq %xmm2, %xmm3, %xmm2 271 ; AVX-NEXT: vpsllq $32, %xmm2, %xmm2 272 ; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 273 ; AVX-NEXT: vpaddq %xmm2, %xmm0, %xmm0 274 ; AVX-NEXT: retq 275 entry: 276 %A = mul <2 x i64> %i, %j 277 ret <2 x i64> %A 278 } 279 280 declare void @foo() 281 282 define <4 x i32> @mul_v4i32spill(<4 x i32> %i, <4 x i32> %j) nounwind { 283 ; SSE2-LABEL: mul_v4i32spill: 284 ; SSE2: # %bb.0: # %entry 285 ; SSE2-NEXT: subq $40, %rsp 286 ; SSE2-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill 287 ; SSE2-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill 288 ; SSE2-NEXT: callq foo 289 ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload 290 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 291 ; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm2 # 16-byte Reload 292 ; SSE2-NEXT: pmuludq %xmm2, %xmm0 293 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 294 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 295 ; SSE2-NEXT: pmuludq %xmm1, %xmm2 296 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 297 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 298 ; SSE2-NEXT: addq $40, %rsp 299 ; SSE2-NEXT: retq 300 ; 301 ; SSE41-LABEL: mul_v4i32spill: 302 ; SSE41: # %bb.0: # %entry 303 ; SSE41-NEXT: subq $40, %rsp 304 ; SSE41-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill 305 ; SSE41-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill 306 ; SSE41-NEXT: callq foo 307 ; SSE41-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload 308 ; SSE41-NEXT: pmulld {{[0-9]+}}(%rsp), %xmm0 # 16-byte Folded Reload 309 ; SSE41-NEXT: addq $40, %rsp 310 ; SSE41-NEXT: retq 311 ; 312 ; AVX-LABEL: mul_v4i32spill: 313 ; AVX: # %bb.0: # %entry 314 ; AVX-NEXT: subq $40, %rsp 315 ; AVX-NEXT: vmovaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill 316 ; AVX-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill 317 ; AVX-NEXT: callq foo 318 ; AVX-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload 319 ; AVX-NEXT: vpmulld {{[0-9]+}}(%rsp), %xmm0, %xmm0 # 16-byte Folded Reload 320 ; AVX-NEXT: addq $40, %rsp 321 ; AVX-NEXT: retq 322 entry: 323 ; Use a call to force spills. 324 call void @foo() 325 %A = mul <4 x i32> %i, %j 326 ret <4 x i32> %A 327 } 328 329 define <2 x i64> @mul_v2i64spill(<2 x i64> %i, <2 x i64> %j) nounwind { 330 ; SSE-LABEL: mul_v2i64spill: 331 ; SSE: # %bb.0: # %entry 332 ; SSE-NEXT: subq $40, %rsp 333 ; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill 334 ; SSE-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill 335 ; SSE-NEXT: callq foo 336 ; SSE-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload 337 ; SSE-NEXT: movdqa %xmm0, %xmm2 338 ; SSE-NEXT: psrlq $32, %xmm2 339 ; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm3 # 16-byte Reload 340 ; SSE-NEXT: pmuludq %xmm3, %xmm2 341 ; SSE-NEXT: movdqa %xmm3, %xmm1 342 ; SSE-NEXT: psrlq $32, %xmm1 343 ; SSE-NEXT: pmuludq %xmm0, %xmm1 344 ; SSE-NEXT: paddq %xmm2, %xmm1 345 ; SSE-NEXT: psllq $32, %xmm1 346 ; SSE-NEXT: pmuludq %xmm3, %xmm0 347 ; SSE-NEXT: paddq %xmm1, %xmm0 348 ; SSE-NEXT: addq $40, %rsp 349 ; SSE-NEXT: retq 350 ; 351 ; AVX-LABEL: mul_v2i64spill: 352 ; AVX: # %bb.0: # %entry 353 ; AVX-NEXT: subq $40, %rsp 354 ; AVX-NEXT: vmovaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill 355 ; AVX-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill 356 ; AVX-NEXT: callq foo 357 ; AVX-NEXT: vmovdqa (%rsp), %xmm3 # 16-byte Reload 358 ; AVX-NEXT: vpsrlq $32, %xmm3, %xmm0 359 ; AVX-NEXT: vmovdqa {{[0-9]+}}(%rsp), %xmm2 # 16-byte Reload 360 ; AVX-NEXT: vpmuludq %xmm2, %xmm0, %xmm0 361 ; AVX-NEXT: vpsrlq $32, %xmm2, %xmm1 362 ; AVX-NEXT: vpmuludq %xmm1, %xmm3, %xmm1 363 ; AVX-NEXT: vpaddq %xmm0, %xmm1, %xmm0 364 ; AVX-NEXT: vpsllq $32, %xmm0, %xmm0 365 ; AVX-NEXT: vpmuludq %xmm2, %xmm3, %xmm1 366 ; AVX-NEXT: vpaddq %xmm0, %xmm1, %xmm0 367 ; AVX-NEXT: addq $40, %rsp 368 ; AVX-NEXT: retq 369 entry: 370 ; Use a call to force spills. 371 call void @foo() 372 %A = mul <2 x i64> %i, %j 373 ret <2 x i64> %A 374 } 375 376 define <32 x i8> @mul_v32i8c(<32 x i8> %i) nounwind { 377 ; SSE2-LABEL: mul_v32i8c: 378 ; SSE2: # %bb.0: # %entry 379 ; SSE2-NEXT: movdqa %xmm0, %xmm2 380 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 381 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 382 ; SSE2-NEXT: pmullw %xmm3, %xmm2 383 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 384 ; SSE2-NEXT: pand %xmm4, %xmm2 385 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 386 ; SSE2-NEXT: pmullw %xmm3, %xmm0 387 ; SSE2-NEXT: pand %xmm4, %xmm0 388 ; SSE2-NEXT: packuswb %xmm2, %xmm0 389 ; SSE2-NEXT: movdqa %xmm1, %xmm2 390 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 391 ; SSE2-NEXT: pmullw %xmm3, %xmm2 392 ; SSE2-NEXT: pand %xmm4, %xmm2 393 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 394 ; SSE2-NEXT: pmullw %xmm3, %xmm1 395 ; SSE2-NEXT: pand %xmm4, %xmm1 396 ; SSE2-NEXT: packuswb %xmm2, %xmm1 397 ; SSE2-NEXT: retq 398 ; 399 ; SSE41-LABEL: mul_v32i8c: 400 ; SSE41: # %bb.0: # %entry 401 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 402 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 403 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 404 ; SSE41-NEXT: pmullw %xmm4, %xmm0 405 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 406 ; SSE41-NEXT: pand %xmm5, %xmm0 407 ; SSE41-NEXT: pmullw %xmm4, %xmm2 408 ; SSE41-NEXT: pand %xmm5, %xmm2 409 ; SSE41-NEXT: packuswb %xmm0, %xmm2 410 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 411 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 412 ; SSE41-NEXT: pmullw %xmm4, %xmm1 413 ; SSE41-NEXT: pand %xmm5, %xmm1 414 ; SSE41-NEXT: pmullw %xmm4, %xmm3 415 ; SSE41-NEXT: pand %xmm5, %xmm3 416 ; SSE41-NEXT: packuswb %xmm1, %xmm3 417 ; SSE41-NEXT: movdqa %xmm2, %xmm0 418 ; SSE41-NEXT: movdqa %xmm3, %xmm1 419 ; SSE41-NEXT: retq 420 ; 421 ; AVX2-LABEL: mul_v32i8c: 422 ; AVX2: # %bb.0: # %entry 423 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 424 ; AVX2-NEXT: vpmovsxbw %xmm1, %ymm1 425 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 426 ; AVX2-NEXT: vpmullw %ymm2, %ymm1, %ymm1 427 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 428 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 429 ; AVX2-NEXT: vpshufb %xmm4, %xmm3, %xmm3 430 ; AVX2-NEXT: vpshufb %xmm4, %xmm1, %xmm1 431 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 432 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0 433 ; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 434 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 435 ; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm2 436 ; AVX2-NEXT: vpshufb %xmm4, %xmm0, %xmm0 437 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 438 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 439 ; AVX2-NEXT: retq 440 ; 441 ; AVX512F-LABEL: mul_v32i8c: 442 ; AVX512F: # %bb.0: # %entry 443 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm1 444 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 445 ; AVX512F-NEXT: vpmullw %ymm2, %ymm1, %ymm1 446 ; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1 447 ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 448 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 449 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 450 ; AVX512F-NEXT: vpmullw %ymm2, %ymm0, %ymm0 451 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 452 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 453 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 454 ; AVX512F-NEXT: retq 455 ; 456 ; AVX512BW-LABEL: mul_v32i8c: 457 ; AVX512BW: # %bb.0: # %entry 458 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 459 ; AVX512BW-NEXT: vpmullw {{.*}}(%rip), %zmm0, %zmm0 460 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 461 ; AVX512BW-NEXT: retq 462 entry: 463 %A = mul <32 x i8> %i, < i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117 > 464 ret <32 x i8> %A 465 } 466 467 define <16 x i16> @mul_v16i16c(<16 x i16> %i) nounwind { 468 ; SSE-LABEL: mul_v16i16c: 469 ; SSE: # %bb.0: # %entry 470 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [117,117,117,117,117,117,117,117] 471 ; SSE-NEXT: pmullw %xmm2, %xmm0 472 ; SSE-NEXT: pmullw %xmm2, %xmm1 473 ; SSE-NEXT: retq 474 ; 475 ; AVX-LABEL: mul_v16i16c: 476 ; AVX: # %bb.0: # %entry 477 ; AVX-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 478 ; AVX-NEXT: retq 479 entry: 480 %A = mul <16 x i16> %i, < i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117 > 481 ret <16 x i16> %A 482 } 483 484 define <8 x i32> @mul_v8i32c(<8 x i32> %i) nounwind { 485 ; SSE2-LABEL: mul_v8i32c: 486 ; SSE2: # %bb.0: # %entry 487 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [117,117,117,117] 488 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 489 ; SSE2-NEXT: pmuludq %xmm2, %xmm0 490 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 491 ; SSE2-NEXT: pmuludq %xmm2, %xmm3 492 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3] 493 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] 494 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 495 ; SSE2-NEXT: pmuludq %xmm2, %xmm1 496 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 497 ; SSE2-NEXT: pmuludq %xmm2, %xmm3 498 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 499 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 500 ; SSE2-NEXT: retq 501 ; 502 ; SSE41-LABEL: mul_v8i32c: 503 ; SSE41: # %bb.0: # %entry 504 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [117,117,117,117] 505 ; SSE41-NEXT: pmulld %xmm2, %xmm0 506 ; SSE41-NEXT: pmulld %xmm2, %xmm1 507 ; SSE41-NEXT: retq 508 ; 509 ; AVX-LABEL: mul_v8i32c: 510 ; AVX: # %bb.0: # %entry 511 ; AVX-NEXT: vpbroadcastd {{.*#+}} ymm1 = [117,117,117,117,117,117,117,117] 512 ; AVX-NEXT: vpmulld %ymm1, %ymm0, %ymm0 513 ; AVX-NEXT: retq 514 entry: 515 %A = mul <8 x i32> %i, < i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117 > 516 ret <8 x i32> %A 517 } 518 519 define <4 x i64> @mul_v4i64c(<4 x i64> %i) nounwind { 520 ; SSE-LABEL: mul_v4i64c: 521 ; SSE: # %bb.0: # %entry 522 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [117,117] 523 ; SSE-NEXT: movdqa %xmm0, %xmm3 524 ; SSE-NEXT: pmuludq %xmm2, %xmm3 525 ; SSE-NEXT: psrlq $32, %xmm0 526 ; SSE-NEXT: pmuludq %xmm2, %xmm0 527 ; SSE-NEXT: psllq $32, %xmm0 528 ; SSE-NEXT: paddq %xmm3, %xmm0 529 ; SSE-NEXT: movdqa %xmm1, %xmm3 530 ; SSE-NEXT: pmuludq %xmm2, %xmm3 531 ; SSE-NEXT: psrlq $32, %xmm1 532 ; SSE-NEXT: pmuludq %xmm2, %xmm1 533 ; SSE-NEXT: psllq $32, %xmm1 534 ; SSE-NEXT: paddq %xmm3, %xmm1 535 ; SSE-NEXT: retq 536 ; 537 ; AVX-LABEL: mul_v4i64c: 538 ; AVX: # %bb.0: # %entry 539 ; AVX-NEXT: vpbroadcastq {{.*#+}} ymm1 = [117,117,117,117] 540 ; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm2 541 ; AVX-NEXT: vpsrlq $32, %ymm0, %ymm0 542 ; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 543 ; AVX-NEXT: vpsllq $32, %ymm0, %ymm0 544 ; AVX-NEXT: vpaddq %ymm0, %ymm2, %ymm0 545 ; AVX-NEXT: retq 546 entry: 547 %A = mul <4 x i64> %i, < i64 117, i64 117, i64 117, i64 117 > 548 ret <4 x i64> %A 549 } 550 551 define <32 x i8> @mul_v32i8(<32 x i8> %i, <32 x i8> %j) nounwind { 552 ; SSE2-LABEL: mul_v32i8: 553 ; SSE2: # %bb.0: # %entry 554 ; SSE2-NEXT: movdqa %xmm2, %xmm4 555 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 556 ; SSE2-NEXT: movdqa %xmm0, %xmm5 557 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 558 ; SSE2-NEXT: pmullw %xmm4, %xmm5 559 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 560 ; SSE2-NEXT: pand %xmm4, %xmm5 561 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 562 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 563 ; SSE2-NEXT: pmullw %xmm2, %xmm0 564 ; SSE2-NEXT: pand %xmm4, %xmm0 565 ; SSE2-NEXT: packuswb %xmm5, %xmm0 566 ; SSE2-NEXT: movdqa %xmm3, %xmm2 567 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 568 ; SSE2-NEXT: movdqa %xmm1, %xmm5 569 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 570 ; SSE2-NEXT: pmullw %xmm2, %xmm5 571 ; SSE2-NEXT: pand %xmm4, %xmm5 572 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 573 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 574 ; SSE2-NEXT: pmullw %xmm3, %xmm1 575 ; SSE2-NEXT: pand %xmm4, %xmm1 576 ; SSE2-NEXT: packuswb %xmm5, %xmm1 577 ; SSE2-NEXT: retq 578 ; 579 ; SSE41-LABEL: mul_v32i8: 580 ; SSE41: # %bb.0: # %entry 581 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 582 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 583 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 584 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 585 ; SSE41-NEXT: pmullw %xmm2, %xmm0 586 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255] 587 ; SSE41-NEXT: pand %xmm6, %xmm0 588 ; SSE41-NEXT: pmullw %xmm5, %xmm4 589 ; SSE41-NEXT: pand %xmm6, %xmm4 590 ; SSE41-NEXT: packuswb %xmm0, %xmm4 591 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 592 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 593 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 594 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 595 ; SSE41-NEXT: pmullw %xmm3, %xmm1 596 ; SSE41-NEXT: pand %xmm6, %xmm1 597 ; SSE41-NEXT: pmullw %xmm0, %xmm2 598 ; SSE41-NEXT: pand %xmm6, %xmm2 599 ; SSE41-NEXT: packuswb %xmm1, %xmm2 600 ; SSE41-NEXT: movdqa %xmm4, %xmm0 601 ; SSE41-NEXT: movdqa %xmm2, %xmm1 602 ; SSE41-NEXT: retq 603 ; 604 ; AVX2-LABEL: mul_v32i8: 605 ; AVX2: # %bb.0: # %entry 606 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 607 ; AVX2-NEXT: vpmovsxbw %xmm2, %ymm2 608 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 609 ; AVX2-NEXT: vpmovsxbw %xmm3, %ymm3 610 ; AVX2-NEXT: vpmullw %ymm2, %ymm3, %ymm2 611 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3 612 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 613 ; AVX2-NEXT: vpshufb %xmm4, %xmm3, %xmm3 614 ; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm2 615 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 616 ; AVX2-NEXT: vpmovsxbw %xmm1, %ymm1 617 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0 618 ; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 619 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 620 ; AVX2-NEXT: vpshufb %xmm4, %xmm1, %xmm1 621 ; AVX2-NEXT: vpshufb %xmm4, %xmm0, %xmm0 622 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 623 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 624 ; AVX2-NEXT: retq 625 ; 626 ; AVX512F-LABEL: mul_v32i8: 627 ; AVX512F: # %bb.0: # %entry 628 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm2 629 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm3 630 ; AVX512F-NEXT: vpmullw %ymm2, %ymm3, %ymm2 631 ; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2 632 ; AVX512F-NEXT: vpmovdb %zmm2, %xmm2 633 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 634 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1 635 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 636 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 637 ; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm0 638 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 639 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 640 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm2, %ymm0 641 ; AVX512F-NEXT: retq 642 ; 643 ; AVX512BW-LABEL: mul_v32i8: 644 ; AVX512BW: # %bb.0: # %entry 645 ; AVX512BW-NEXT: vpmovsxbw %ymm1, %zmm1 646 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 647 ; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 648 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 649 ; AVX512BW-NEXT: retq 650 entry: 651 %A = mul <32 x i8> %i, %j 652 ret <32 x i8> %A 653 } 654 655 define <16 x i16> @mul_v16i16(<16 x i16> %i, <16 x i16> %j) nounwind { 656 ; SSE-LABEL: mul_v16i16: 657 ; SSE: # %bb.0: # %entry 658 ; SSE-NEXT: pmullw %xmm2, %xmm0 659 ; SSE-NEXT: pmullw %xmm3, %xmm1 660 ; SSE-NEXT: retq 661 ; 662 ; AVX-LABEL: mul_v16i16: 663 ; AVX: # %bb.0: # %entry 664 ; AVX-NEXT: vpmullw %ymm1, %ymm0, %ymm0 665 ; AVX-NEXT: retq 666 entry: 667 %A = mul <16 x i16> %i, %j 668 ret <16 x i16> %A 669 } 670 671 define <8 x i32> @mul_v8i32(<8 x i32> %i, <8 x i32> %j) nounwind { 672 ; SSE2-LABEL: mul_v8i32: 673 ; SSE2: # %bb.0: # %entry 674 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 675 ; SSE2-NEXT: pmuludq %xmm2, %xmm0 676 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 677 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 678 ; SSE2-NEXT: pmuludq %xmm4, %xmm2 679 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 680 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 681 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 682 ; SSE2-NEXT: pmuludq %xmm3, %xmm1 683 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 684 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 685 ; SSE2-NEXT: pmuludq %xmm2, %xmm3 686 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 687 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 688 ; SSE2-NEXT: retq 689 ; 690 ; SSE41-LABEL: mul_v8i32: 691 ; SSE41: # %bb.0: # %entry 692 ; SSE41-NEXT: pmulld %xmm2, %xmm0 693 ; SSE41-NEXT: pmulld %xmm3, %xmm1 694 ; SSE41-NEXT: retq 695 ; 696 ; AVX-LABEL: mul_v8i32: 697 ; AVX: # %bb.0: # %entry 698 ; AVX-NEXT: vpmulld %ymm1, %ymm0, %ymm0 699 ; AVX-NEXT: retq 700 entry: 701 %A = mul <8 x i32> %i, %j 702 ret <8 x i32> %A 703 } 704 705 define <4 x i64> @mul_v4i64(<4 x i64> %i, <4 x i64> %j) nounwind { 706 ; SSE-LABEL: mul_v4i64: 707 ; SSE: # %bb.0: # %entry 708 ; SSE-NEXT: movdqa %xmm0, %xmm4 709 ; SSE-NEXT: psrlq $32, %xmm4 710 ; SSE-NEXT: pmuludq %xmm2, %xmm4 711 ; SSE-NEXT: movdqa %xmm2, %xmm5 712 ; SSE-NEXT: psrlq $32, %xmm5 713 ; SSE-NEXT: pmuludq %xmm0, %xmm5 714 ; SSE-NEXT: paddq %xmm4, %xmm5 715 ; SSE-NEXT: psllq $32, %xmm5 716 ; SSE-NEXT: pmuludq %xmm2, %xmm0 717 ; SSE-NEXT: paddq %xmm5, %xmm0 718 ; SSE-NEXT: movdqa %xmm1, %xmm2 719 ; SSE-NEXT: psrlq $32, %xmm2 720 ; SSE-NEXT: pmuludq %xmm3, %xmm2 721 ; SSE-NEXT: movdqa %xmm3, %xmm4 722 ; SSE-NEXT: psrlq $32, %xmm4 723 ; SSE-NEXT: pmuludq %xmm1, %xmm4 724 ; SSE-NEXT: paddq %xmm2, %xmm4 725 ; SSE-NEXT: psllq $32, %xmm4 726 ; SSE-NEXT: pmuludq %xmm3, %xmm1 727 ; SSE-NEXT: paddq %xmm4, %xmm1 728 ; SSE-NEXT: retq 729 ; 730 ; AVX-LABEL: mul_v4i64: 731 ; AVX: # %bb.0: # %entry 732 ; AVX-NEXT: vpsrlq $32, %ymm0, %ymm2 733 ; AVX-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 734 ; AVX-NEXT: vpsrlq $32, %ymm1, %ymm3 735 ; AVX-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 736 ; AVX-NEXT: vpaddq %ymm2, %ymm3, %ymm2 737 ; AVX-NEXT: vpsllq $32, %ymm2, %ymm2 738 ; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 739 ; AVX-NEXT: vpaddq %ymm2, %ymm0, %ymm0 740 ; AVX-NEXT: retq 741 entry: 742 %A = mul <4 x i64> %i, %j 743 ret <4 x i64> %A 744 } 745 746 define <64 x i8> @mul_v64i8c(<64 x i8> %i) nounwind { 747 ; SSE2-LABEL: mul_v64i8c: 748 ; SSE2: # %bb.0: # %entry 749 ; SSE2-NEXT: movdqa %xmm0, %xmm6 750 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 751 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 752 ; SSE2-NEXT: pmullw %xmm4, %xmm6 753 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 754 ; SSE2-NEXT: pand %xmm5, %xmm6 755 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 756 ; SSE2-NEXT: pmullw %xmm4, %xmm0 757 ; SSE2-NEXT: pand %xmm5, %xmm0 758 ; SSE2-NEXT: packuswb %xmm6, %xmm0 759 ; SSE2-NEXT: movdqa %xmm1, %xmm6 760 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 761 ; SSE2-NEXT: pmullw %xmm4, %xmm6 762 ; SSE2-NEXT: pand %xmm5, %xmm6 763 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 764 ; SSE2-NEXT: pmullw %xmm4, %xmm1 765 ; SSE2-NEXT: pand %xmm5, %xmm1 766 ; SSE2-NEXT: packuswb %xmm6, %xmm1 767 ; SSE2-NEXT: movdqa %xmm2, %xmm6 768 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 769 ; SSE2-NEXT: pmullw %xmm4, %xmm6 770 ; SSE2-NEXT: pand %xmm5, %xmm6 771 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 772 ; SSE2-NEXT: pmullw %xmm4, %xmm2 773 ; SSE2-NEXT: pand %xmm5, %xmm2 774 ; SSE2-NEXT: packuswb %xmm6, %xmm2 775 ; SSE2-NEXT: movdqa %xmm3, %xmm6 776 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 777 ; SSE2-NEXT: pmullw %xmm4, %xmm6 778 ; SSE2-NEXT: pand %xmm5, %xmm6 779 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 780 ; SSE2-NEXT: pmullw %xmm4, %xmm3 781 ; SSE2-NEXT: pand %xmm5, %xmm3 782 ; SSE2-NEXT: packuswb %xmm6, %xmm3 783 ; SSE2-NEXT: retq 784 ; 785 ; SSE41-LABEL: mul_v64i8c: 786 ; SSE41: # %bb.0: # %entry 787 ; SSE41-NEXT: movdqa %xmm1, %xmm4 788 ; SSE41-NEXT: movdqa %xmm0, %xmm1 789 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 790 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 791 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 792 ; SSE41-NEXT: pmullw %xmm6, %xmm1 793 ; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255] 794 ; SSE41-NEXT: pand %xmm7, %xmm1 795 ; SSE41-NEXT: pmullw %xmm6, %xmm0 796 ; SSE41-NEXT: pand %xmm7, %xmm0 797 ; SSE41-NEXT: packuswb %xmm1, %xmm0 798 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero 799 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 800 ; SSE41-NEXT: pmullw %xmm6, %xmm4 801 ; SSE41-NEXT: pand %xmm7, %xmm4 802 ; SSE41-NEXT: pmullw %xmm6, %xmm1 803 ; SSE41-NEXT: pand %xmm7, %xmm1 804 ; SSE41-NEXT: packuswb %xmm4, %xmm1 805 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 806 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 807 ; SSE41-NEXT: pmullw %xmm6, %xmm2 808 ; SSE41-NEXT: pand %xmm7, %xmm2 809 ; SSE41-NEXT: pmullw %xmm6, %xmm4 810 ; SSE41-NEXT: pand %xmm7, %xmm4 811 ; SSE41-NEXT: packuswb %xmm2, %xmm4 812 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 813 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 814 ; SSE41-NEXT: pmullw %xmm6, %xmm3 815 ; SSE41-NEXT: pand %xmm7, %xmm3 816 ; SSE41-NEXT: pmullw %xmm6, %xmm5 817 ; SSE41-NEXT: pand %xmm7, %xmm5 818 ; SSE41-NEXT: packuswb %xmm3, %xmm5 819 ; SSE41-NEXT: movdqa %xmm4, %xmm2 820 ; SSE41-NEXT: movdqa %xmm5, %xmm3 821 ; SSE41-NEXT: retq 822 ; 823 ; AVX2-LABEL: mul_v64i8c: 824 ; AVX2: # %bb.0: # %entry 825 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 826 ; AVX2-NEXT: vpmovsxbw %xmm2, %ymm2 827 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 828 ; AVX2-NEXT: vpmullw %ymm3, %ymm2, %ymm2 829 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm4 830 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 831 ; AVX2-NEXT: vpshufb %xmm5, %xmm4, %xmm4 832 ; AVX2-NEXT: vpshufb %xmm5, %xmm2, %xmm2 833 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0] 834 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0 835 ; AVX2-NEXT: vpmullw %ymm3, %ymm0, %ymm0 836 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 837 ; AVX2-NEXT: vpshufb %xmm5, %xmm4, %xmm4 838 ; AVX2-NEXT: vpshufb %xmm5, %xmm0, %xmm0 839 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0] 840 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 841 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 842 ; AVX2-NEXT: vpmovsxbw %xmm2, %ymm2 843 ; AVX2-NEXT: vpmullw %ymm3, %ymm2, %ymm2 844 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm4 845 ; AVX2-NEXT: vpshufb %xmm5, %xmm4, %xmm4 846 ; AVX2-NEXT: vpshufb %xmm5, %xmm2, %xmm2 847 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0] 848 ; AVX2-NEXT: vpmovsxbw %xmm1, %ymm1 849 ; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm1 850 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 851 ; AVX2-NEXT: vpshufb %xmm5, %xmm3, %xmm3 852 ; AVX2-NEXT: vpshufb %xmm5, %xmm1, %xmm1 853 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 854 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 855 ; AVX2-NEXT: retq 856 ; 857 ; AVX512F-LABEL: mul_v64i8c: 858 ; AVX512F: # %bb.0: # %entry 859 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm2 860 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm3 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 861 ; AVX512F-NEXT: vpmullw %ymm3, %ymm2, %ymm2 862 ; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2 863 ; AVX512F-NEXT: vpmovdb %zmm2, %xmm2 864 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 865 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 866 ; AVX512F-NEXT: vpmullw %ymm3, %ymm0, %ymm0 867 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 868 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 869 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm2, %ymm0 870 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm2 871 ; AVX512F-NEXT: vpmullw %ymm3, %ymm2, %ymm2 872 ; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2 873 ; AVX512F-NEXT: vpmovdb %zmm2, %xmm2 874 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 875 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1 876 ; AVX512F-NEXT: vpmullw %ymm3, %ymm1, %ymm1 877 ; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1 878 ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 879 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm2, %ymm1 880 ; AVX512F-NEXT: retq 881 ; 882 ; AVX512BW-LABEL: mul_v64i8c: 883 ; AVX512BW: # %bb.0: # %entry 884 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm1 885 ; AVX512BW-NEXT: vmovdqa64 {{.*#+}} zmm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117] 886 ; AVX512BW-NEXT: vpmullw %zmm2, %zmm1, %zmm1 887 ; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1 888 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm0 889 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 890 ; AVX512BW-NEXT: vpmullw %zmm2, %zmm0, %zmm0 891 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 892 ; AVX512BW-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0 893 ; AVX512BW-NEXT: retq 894 entry: 895 %A = mul <64 x i8> %i, < i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117 > 896 ret <64 x i8> %A 897 } 898 899 define <64 x i8> @mul_v64i8(<64 x i8> %i, <64 x i8> %j) nounwind { 900 ; SSE2-LABEL: mul_v64i8: 901 ; SSE2: # %bb.0: # %entry 902 ; SSE2-NEXT: movdqa %xmm4, %xmm8 903 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15] 904 ; SSE2-NEXT: movdqa %xmm0, %xmm9 905 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm0[8],xmm9[9],xmm0[9],xmm9[10],xmm0[10],xmm9[11],xmm0[11],xmm9[12],xmm0[12],xmm9[13],xmm0[13],xmm9[14],xmm0[14],xmm9[15],xmm0[15] 906 ; SSE2-NEXT: pmullw %xmm8, %xmm9 907 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255] 908 ; SSE2-NEXT: pand %xmm8, %xmm9 909 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7] 910 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 911 ; SSE2-NEXT: pmullw %xmm4, %xmm0 912 ; SSE2-NEXT: pand %xmm8, %xmm0 913 ; SSE2-NEXT: packuswb %xmm9, %xmm0 914 ; SSE2-NEXT: movdqa %xmm5, %xmm9 915 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm0[8],xmm9[9],xmm0[9],xmm9[10],xmm0[10],xmm9[11],xmm0[11],xmm9[12],xmm0[12],xmm9[13],xmm0[13],xmm9[14],xmm0[14],xmm9[15],xmm0[15] 916 ; SSE2-NEXT: movdqa %xmm1, %xmm4 917 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 918 ; SSE2-NEXT: pmullw %xmm9, %xmm4 919 ; SSE2-NEXT: pand %xmm8, %xmm4 920 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7] 921 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 922 ; SSE2-NEXT: pmullw %xmm5, %xmm1 923 ; SSE2-NEXT: pand %xmm8, %xmm1 924 ; SSE2-NEXT: packuswb %xmm4, %xmm1 925 ; SSE2-NEXT: movdqa %xmm6, %xmm4 926 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 927 ; SSE2-NEXT: movdqa %xmm2, %xmm5 928 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 929 ; SSE2-NEXT: pmullw %xmm4, %xmm5 930 ; SSE2-NEXT: pand %xmm8, %xmm5 931 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1],xmm6[2],xmm0[2],xmm6[3],xmm0[3],xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7] 932 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 933 ; SSE2-NEXT: pmullw %xmm6, %xmm2 934 ; SSE2-NEXT: pand %xmm8, %xmm2 935 ; SSE2-NEXT: packuswb %xmm5, %xmm2 936 ; SSE2-NEXT: movdqa %xmm7, %xmm4 937 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 938 ; SSE2-NEXT: movdqa %xmm3, %xmm5 939 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 940 ; SSE2-NEXT: pmullw %xmm4, %xmm5 941 ; SSE2-NEXT: pand %xmm8, %xmm5 942 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm0[0],xmm7[1],xmm0[1],xmm7[2],xmm0[2],xmm7[3],xmm0[3],xmm7[4],xmm0[4],xmm7[5],xmm0[5],xmm7[6],xmm0[6],xmm7[7],xmm0[7] 943 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 944 ; SSE2-NEXT: pmullw %xmm7, %xmm3 945 ; SSE2-NEXT: pand %xmm8, %xmm3 946 ; SSE2-NEXT: packuswb %xmm5, %xmm3 947 ; SSE2-NEXT: retq 948 ; 949 ; SSE41-LABEL: mul_v64i8: 950 ; SSE41: # %bb.0: # %entry 951 ; SSE41-NEXT: movdqa %xmm1, %xmm8 952 ; SSE41-NEXT: movdqa %xmm0, %xmm1 953 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm10 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero 954 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 955 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 956 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 957 ; SSE41-NEXT: pmullw %xmm4, %xmm1 958 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255] 959 ; SSE41-NEXT: pand %xmm9, %xmm1 960 ; SSE41-NEXT: pmullw %xmm10, %xmm0 961 ; SSE41-NEXT: pand %xmm9, %xmm0 962 ; SSE41-NEXT: packuswb %xmm1, %xmm0 963 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 964 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 965 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm8[0],zero,xmm8[1],zero,xmm8[2],zero,xmm8[3],zero,xmm8[4],zero,xmm8[5],zero,xmm8[6],zero,xmm8[7],zero 966 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 967 ; SSE41-NEXT: pmullw %xmm5, %xmm8 968 ; SSE41-NEXT: pand %xmm9, %xmm8 969 ; SSE41-NEXT: pmullw %xmm4, %xmm1 970 ; SSE41-NEXT: pand %xmm9, %xmm1 971 ; SSE41-NEXT: packuswb %xmm8, %xmm1 972 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero 973 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 974 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 975 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 976 ; SSE41-NEXT: pmullw %xmm6, %xmm2 977 ; SSE41-NEXT: pand %xmm9, %xmm2 978 ; SSE41-NEXT: pmullw %xmm5, %xmm4 979 ; SSE41-NEXT: pand %xmm9, %xmm4 980 ; SSE41-NEXT: packuswb %xmm2, %xmm4 981 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero 982 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 983 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 984 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 985 ; SSE41-NEXT: pmullw %xmm7, %xmm3 986 ; SSE41-NEXT: pand %xmm9, %xmm3 987 ; SSE41-NEXT: pmullw %xmm2, %xmm5 988 ; SSE41-NEXT: pand %xmm9, %xmm5 989 ; SSE41-NEXT: packuswb %xmm3, %xmm5 990 ; SSE41-NEXT: movdqa %xmm4, %xmm2 991 ; SSE41-NEXT: movdqa %xmm5, %xmm3 992 ; SSE41-NEXT: retq 993 ; 994 ; AVX2-LABEL: mul_v64i8: 995 ; AVX2: # %bb.0: # %entry 996 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm4 997 ; AVX2-NEXT: vpmovsxbw %xmm4, %ymm4 998 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm5 999 ; AVX2-NEXT: vpmovsxbw %xmm5, %ymm5 1000 ; AVX2-NEXT: vpmullw %ymm4, %ymm5, %ymm5 1001 ; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm6 1002 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 1003 ; AVX2-NEXT: vpshufb %xmm4, %xmm6, %xmm6 1004 ; AVX2-NEXT: vpshufb %xmm4, %xmm5, %xmm5 1005 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0] 1006 ; AVX2-NEXT: vpmovsxbw %xmm2, %ymm2 1007 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0 1008 ; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 1009 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1010 ; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm2 1011 ; AVX2-NEXT: vpshufb %xmm4, %xmm0, %xmm0 1012 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 1013 ; AVX2-NEXT: vinserti128 $1, %xmm5, %ymm0, %ymm0 1014 ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm2 1015 ; AVX2-NEXT: vpmovsxbw %xmm2, %ymm2 1016 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5 1017 ; AVX2-NEXT: vpmovsxbw %xmm5, %ymm5 1018 ; AVX2-NEXT: vpmullw %ymm2, %ymm5, %ymm2 1019 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm5 1020 ; AVX2-NEXT: vpshufb %xmm4, %xmm5, %xmm5 1021 ; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm2 1022 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm5[0] 1023 ; AVX2-NEXT: vpmovsxbw %xmm3, %ymm3 1024 ; AVX2-NEXT: vpmovsxbw %xmm1, %ymm1 1025 ; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm1 1026 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 1027 ; AVX2-NEXT: vpshufb %xmm4, %xmm3, %xmm3 1028 ; AVX2-NEXT: vpshufb %xmm4, %xmm1, %xmm1 1029 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1030 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 1031 ; AVX2-NEXT: retq 1032 ; 1033 ; AVX512F-LABEL: mul_v64i8: 1034 ; AVX512F: # %bb.0: # %entry 1035 ; AVX512F-NEXT: vpmovsxbw %xmm2, %ymm4 1036 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm5 1037 ; AVX512F-NEXT: vpmullw %ymm4, %ymm5, %ymm4 1038 ; AVX512F-NEXT: vpmovsxwd %ymm4, %zmm4 1039 ; AVX512F-NEXT: vpmovdb %zmm4, %xmm4 1040 ; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 1041 ; AVX512F-NEXT: vpmovsxbw %xmm2, %ymm2 1042 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 1043 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 1044 ; AVX512F-NEXT: vpmullw %ymm2, %ymm0, %ymm0 1045 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 1046 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 1047 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm4, %ymm0 1048 ; AVX512F-NEXT: vpmovsxbw %xmm3, %ymm2 1049 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm4 1050 ; AVX512F-NEXT: vpmullw %ymm2, %ymm4, %ymm2 1051 ; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2 1052 ; AVX512F-NEXT: vpmovdb %zmm2, %xmm2 1053 ; AVX512F-NEXT: vextracti128 $1, %ymm3, %xmm3 1054 ; AVX512F-NEXT: vpmovsxbw %xmm3, %ymm3 1055 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 1056 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1 1057 ; AVX512F-NEXT: vpmullw %ymm3, %ymm1, %ymm1 1058 ; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1 1059 ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 1060 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm2, %ymm1 1061 ; AVX512F-NEXT: retq 1062 ; 1063 ; AVX512BW-LABEL: mul_v64i8: 1064 ; AVX512BW: # %bb.0: # %entry 1065 ; AVX512BW-NEXT: vpmovsxbw %ymm1, %zmm2 1066 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm3 1067 ; AVX512BW-NEXT: vpmullw %zmm2, %zmm3, %zmm2 1068 ; AVX512BW-NEXT: vpmovwb %zmm2, %ymm2 1069 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm1, %ymm1 1070 ; AVX512BW-NEXT: vpmovsxbw %ymm1, %zmm1 1071 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm0 1072 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 1073 ; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1074 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 1075 ; AVX512BW-NEXT: vinserti64x4 $1, %ymm0, %zmm2, %zmm0 1076 ; AVX512BW-NEXT: retq 1077 entry: 1078 %A = mul <64 x i8> %i, %j 1079 ret <64 x i8> %A 1080 } 1081 1082 ; PR30845 1083 define <4 x i32> @mul_v4i64_zero_upper(<4 x i32> %val1, <4 x i32> %val2) { 1084 ; SSE2-LABEL: mul_v4i64_zero_upper: 1085 ; SSE2: # %bb.0: # %entry 1086 ; SSE2-NEXT: pxor %xmm3, %xmm3 1087 ; SSE2-NEXT: movdqa %xmm0, %xmm2 1088 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1] 1089 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm3[2],xmm0[3],xmm3[3] 1090 ; SSE2-NEXT: movdqa %xmm1, %xmm4 1091 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 1092 ; SSE2-NEXT: pmuludq %xmm4, %xmm2 1093 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3] 1094 ; SSE2-NEXT: pmuludq %xmm0, %xmm1 1095 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3] 1096 ; SSE2-NEXT: movaps %xmm2, %xmm0 1097 ; SSE2-NEXT: retq 1098 ; 1099 ; SSE41-LABEL: mul_v4i64_zero_upper: 1100 ; SSE41: # %bb.0: # %entry 1101 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 1102 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero 1103 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero 1104 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 1105 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero 1106 ; SSE41-NEXT: pmuludq %xmm2, %xmm4 1107 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero 1108 ; SSE41-NEXT: pmuludq %xmm3, %xmm0 1109 ; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm4[1,3] 1110 ; SSE41-NEXT: retq 1111 ; 1112 ; AVX-LABEL: mul_v4i64_zero_upper: 1113 ; AVX: # %bb.0: # %entry 1114 ; AVX-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1115 ; AVX-NEXT: vpmovzxdq {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero 1116 ; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 1117 ; AVX-NEXT: vextracti128 $1, %ymm0, %xmm1 1118 ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3] 1119 ; AVX-NEXT: vzeroupper 1120 ; AVX-NEXT: retq 1121 entry: 1122 %val1a = zext <4 x i32> %val1 to <4 x i64> 1123 %val2a = zext <4 x i32> %val2 to <4 x i64> 1124 %res64 = mul <4 x i64> %val1a, %val2a 1125 %rescast = bitcast <4 x i64> %res64 to <8 x i32> 1126 %res = shufflevector <8 x i32> %rescast, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7> 1127 ret <4 x i32> %res 1128 } 1129 1130 define <4 x i32> @mul_v4i64_zero_upper_left(<4 x i32> %val1, <4 x i64> %val2) { 1131 ; SSE2-LABEL: mul_v4i64_zero_upper_left: 1132 ; SSE2: # %bb.0: # %entry 1133 ; SSE2-NEXT: pxor %xmm3, %xmm3 1134 ; SSE2-NEXT: movdqa %xmm0, %xmm4 1135 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 1136 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm3[2],xmm0[3],xmm3[3] 1137 ; SSE2-NEXT: movdqa %xmm0, %xmm3 1138 ; SSE2-NEXT: pmuludq %xmm2, %xmm3 1139 ; SSE2-NEXT: psrlq $32, %xmm2 1140 ; SSE2-NEXT: pmuludq %xmm0, %xmm2 1141 ; SSE2-NEXT: psllq $32, %xmm2 1142 ; SSE2-NEXT: paddq %xmm3, %xmm2 1143 ; SSE2-NEXT: movdqa %xmm4, %xmm0 1144 ; SSE2-NEXT: pmuludq %xmm1, %xmm0 1145 ; SSE2-NEXT: psrlq $32, %xmm1 1146 ; SSE2-NEXT: pmuludq %xmm4, %xmm1 1147 ; SSE2-NEXT: psllq $32, %xmm1 1148 ; SSE2-NEXT: paddq %xmm1, %xmm0 1149 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3] 1150 ; SSE2-NEXT: retq 1151 ; 1152 ; SSE41-LABEL: mul_v4i64_zero_upper_left: 1153 ; SSE41: # %bb.0: # %entry 1154 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1] 1155 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero 1156 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero 1157 ; SSE41-NEXT: movdqa %xmm4, %xmm0 1158 ; SSE41-NEXT: pmuludq %xmm1, %xmm0 1159 ; SSE41-NEXT: psrlq $32, %xmm1 1160 ; SSE41-NEXT: pmuludq %xmm4, %xmm1 1161 ; SSE41-NEXT: psllq $32, %xmm1 1162 ; SSE41-NEXT: paddq %xmm1, %xmm0 1163 ; SSE41-NEXT: movdqa %xmm3, %xmm1 1164 ; SSE41-NEXT: pmuludq %xmm2, %xmm1 1165 ; SSE41-NEXT: psrlq $32, %xmm2 1166 ; SSE41-NEXT: pmuludq %xmm3, %xmm2 1167 ; SSE41-NEXT: psllq $32, %xmm2 1168 ; SSE41-NEXT: paddq %xmm1, %xmm2 1169 ; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3] 1170 ; SSE41-NEXT: retq 1171 ; 1172 ; AVX-LABEL: mul_v4i64_zero_upper_left: 1173 ; AVX: # %bb.0: # %entry 1174 ; AVX-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1175 ; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm2 1176 ; AVX-NEXT: vpsrlq $32, %ymm1, %ymm1 1177 ; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 1178 ; AVX-NEXT: vpsllq $32, %ymm0, %ymm0 1179 ; AVX-NEXT: vpaddq %ymm0, %ymm2, %ymm0 1180 ; AVX-NEXT: vextracti128 $1, %ymm0, %xmm1 1181 ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3] 1182 ; AVX-NEXT: vzeroupper 1183 ; AVX-NEXT: retq 1184 entry: 1185 %val1a = zext <4 x i32> %val1 to <4 x i64> 1186 %res64 = mul <4 x i64> %val1a, %val2 1187 %rescast = bitcast <4 x i64> %res64 to <8 x i32> 1188 %res = shufflevector <8 x i32> %rescast, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7> 1189 ret <4 x i32> %res 1190 } 1191 1192 define <4 x i32> @mul_v4i64_zero_lower(<4 x i32> %val1, <4 x i64> %val2) { 1193 ; SSE2-LABEL: mul_v4i64_zero_lower: 1194 ; SSE2: # %bb.0: # %entry 1195 ; SSE2-NEXT: pxor %xmm4, %xmm4 1196 ; SSE2-NEXT: movdqa %xmm0, %xmm3 1197 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1] 1198 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm4[2],xmm0[3],xmm4[3] 1199 ; SSE2-NEXT: psrlq $32, %xmm2 1200 ; SSE2-NEXT: pmuludq %xmm0, %xmm2 1201 ; SSE2-NEXT: psrlq $32, %xmm1 1202 ; SSE2-NEXT: pmuludq %xmm1, %xmm3 1203 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm2[0,2] 1204 ; SSE2-NEXT: movaps %xmm3, %xmm0 1205 ; SSE2-NEXT: retq 1206 ; 1207 ; SSE41-LABEL: mul_v4i64_zero_lower: 1208 ; SSE41: # %bb.0: # %entry 1209 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1] 1210 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero 1211 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1212 ; SSE41-NEXT: psrlq $32, %xmm1 1213 ; SSE41-NEXT: pmuludq %xmm1, %xmm0 1214 ; SSE41-NEXT: psrlq $32, %xmm2 1215 ; SSE41-NEXT: pmuludq %xmm3, %xmm2 1216 ; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 1217 ; SSE41-NEXT: retq 1218 ; 1219 ; AVX-LABEL: mul_v4i64_zero_lower: 1220 ; AVX: # %bb.0: # %entry 1221 ; AVX-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1222 ; AVX-NEXT: vpsrlq $32, %ymm1, %ymm1 1223 ; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 1224 ; AVX-NEXT: vpsllq $32, %ymm0, %ymm0 1225 ; AVX-NEXT: vextracti128 $1, %ymm0, %xmm1 1226 ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3] 1227 ; AVX-NEXT: vzeroupper 1228 ; AVX-NEXT: retq 1229 entry: 1230 %val1a = zext <4 x i32> %val1 to <4 x i64> 1231 %val2a = and <4 x i64> %val2, <i64 -4294967296, i64 -4294967296, i64 -4294967296, i64 -4294967296> 1232 %res64 = mul <4 x i64> %val1a, %val2a 1233 %rescast = bitcast <4 x i64> %res64 to <8 x i32> 1234 %res = shufflevector <8 x i32> %rescast, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7> 1235 ret <4 x i32> %res 1236 } 1237 1238 define <8 x i32> @mul_v8i64_zero_upper(<8 x i32> %val1, <8 x i32> %val2) { 1239 ; SSE2-LABEL: mul_v8i64_zero_upper: 1240 ; SSE2: # %bb.0: # %entry 1241 ; SSE2-NEXT: pxor %xmm6, %xmm6 1242 ; SSE2-NEXT: movdqa %xmm0, %xmm4 1243 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1] 1244 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm6[2],xmm0[3],xmm6[3] 1245 ; SSE2-NEXT: movdqa %xmm1, %xmm5 1246 ; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1] 1247 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm6[2],xmm1[3],xmm6[3] 1248 ; SSE2-NEXT: movdqa %xmm2, %xmm7 1249 ; SSE2-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1] 1250 ; SSE2-NEXT: pmuludq %xmm7, %xmm4 1251 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm6[2],xmm2[3],xmm6[3] 1252 ; SSE2-NEXT: pmuludq %xmm0, %xmm2 1253 ; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm2[1,3] 1254 ; SSE2-NEXT: movdqa %xmm3, %xmm0 1255 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1] 1256 ; SSE2-NEXT: pmuludq %xmm0, %xmm5 1257 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm6[2],xmm3[3],xmm6[3] 1258 ; SSE2-NEXT: pmuludq %xmm1, %xmm3 1259 ; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[1,3],xmm3[1,3] 1260 ; SSE2-NEXT: movaps %xmm4, %xmm0 1261 ; SSE2-NEXT: movaps %xmm5, %xmm1 1262 ; SSE2-NEXT: retq 1263 ; 1264 ; SSE41-LABEL: mul_v8i64_zero_upper: 1265 ; SSE41: # %bb.0: # %entry 1266 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1] 1267 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero 1268 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero 1269 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 1270 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = xmm0[0],zero,xmm0[1],zero 1271 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm7 = xmm1[0],zero,xmm1[1],zero 1272 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1] 1273 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero 1274 ; SSE41-NEXT: pmuludq %xmm4, %xmm1 1275 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero 1276 ; SSE41-NEXT: pmuludq %xmm5, %xmm0 1277 ; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3] 1278 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1] 1279 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero 1280 ; SSE41-NEXT: pmuludq %xmm6, %xmm2 1281 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm3[0],zero,xmm3[1],zero 1282 ; SSE41-NEXT: pmuludq %xmm7, %xmm1 1283 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3] 1284 ; SSE41-NEXT: retq 1285 ; 1286 ; AVX2-LABEL: mul_v8i64_zero_upper: 1287 ; AVX2: # %bb.0: # %entry 1288 ; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1289 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 1290 ; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1291 ; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero 1292 ; AVX2-NEXT: vpmuludq %ymm3, %ymm2, %ymm2 1293 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 1294 ; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero 1295 ; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 1296 ; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm2[1,3],ymm0[1,3],ymm2[5,7],ymm0[5,7] 1297 ; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3] 1298 ; AVX2-NEXT: retq 1299 ; 1300 ; AVX512-LABEL: mul_v8i64_zero_upper: 1301 ; AVX512: # %bb.0: # %entry 1302 ; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero 1303 ; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero 1304 ; AVX512-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 1305 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1306 ; AVX512-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7] 1307 ; AVX512-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3] 1308 ; AVX512-NEXT: retq 1309 entry: 1310 %val1a = zext <8 x i32> %val1 to <8 x i64> 1311 %val2a = zext <8 x i32> %val2 to <8 x i64> 1312 %res64 = mul <8 x i64> %val1a, %val2a 1313 %rescast = bitcast <8 x i64> %res64 to <16 x i32> 1314 %res = shufflevector <16 x i32> %rescast, <16 x i32> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7,i32 9, i32 11, i32 13, i32 15 > 1315 ret <8 x i32> %res 1316 } 1317 1318 define <8 x i64> @mul_v8i64_sext(<8 x i16> %val1, <8 x i32> %val2) { 1319 ; SSE2-LABEL: mul_v8i64_sext: 1320 ; SSE2: # %bb.0: 1321 ; SSE2-NEXT: movdqa %xmm1, %xmm4 1322 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1323 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4],xmm0[4],xmm9[5],xmm0[5],xmm9[6],xmm0[6],xmm9[7],xmm0[7] 1324 ; SSE2-NEXT: movdqa %xmm9, %xmm0 1325 ; SSE2-NEXT: psrad $31, %xmm0 1326 ; SSE2-NEXT: psrad $16, %xmm9 1327 ; SSE2-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm0[0],xmm9[1],xmm0[1] 1328 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1329 ; SSE2-NEXT: movdqa %xmm0, %xmm3 1330 ; SSE2-NEXT: psrad $31, %xmm3 1331 ; SSE2-NEXT: psrad $16, %xmm0 1332 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] 1333 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1] 1334 ; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm3[0,2,2,3,4,5,6,7] 1335 ; SSE2-NEXT: movdqa %xmm8, %xmm3 1336 ; SSE2-NEXT: psrad $31, %xmm3 1337 ; SSE2-NEXT: psrad $16, %xmm8 1338 ; SSE2-NEXT: punpckldq {{.*#+}} xmm8 = xmm8[0],xmm3[0],xmm8[1],xmm3[1] 1339 ; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm1[0,2,2,3,4,5,6,7] 1340 ; SSE2-NEXT: movdqa %xmm7, %xmm1 1341 ; SSE2-NEXT: psrad $31, %xmm1 1342 ; SSE2-NEXT: psrad $16, %xmm7 1343 ; SSE2-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm1[0],xmm7[1],xmm1[1] 1344 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1] 1345 ; SSE2-NEXT: movdqa %xmm3, %xmm1 1346 ; SSE2-NEXT: psrad $31, %xmm1 1347 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1] 1348 ; SSE2-NEXT: movdqa %xmm2, %xmm1 1349 ; SSE2-NEXT: psrad $31, %xmm1 1350 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 1351 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[2,3,0,1] 1352 ; SSE2-NEXT: movdqa %xmm1, %xmm5 1353 ; SSE2-NEXT: psrad $31, %xmm5 1354 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1] 1355 ; SSE2-NEXT: movdqa %xmm4, %xmm5 1356 ; SSE2-NEXT: psrad $31, %xmm5 1357 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 1358 ; SSE2-NEXT: movdqa %xmm4, %xmm5 1359 ; SSE2-NEXT: psrlq $32, %xmm5 1360 ; SSE2-NEXT: pmuludq %xmm0, %xmm5 1361 ; SSE2-NEXT: movdqa %xmm0, %xmm6 1362 ; SSE2-NEXT: psrlq $32, %xmm6 1363 ; SSE2-NEXT: pmuludq %xmm4, %xmm6 1364 ; SSE2-NEXT: paddq %xmm5, %xmm6 1365 ; SSE2-NEXT: psllq $32, %xmm6 1366 ; SSE2-NEXT: pmuludq %xmm4, %xmm0 1367 ; SSE2-NEXT: paddq %xmm6, %xmm0 1368 ; SSE2-NEXT: movdqa %xmm7, %xmm4 1369 ; SSE2-NEXT: psrlq $32, %xmm4 1370 ; SSE2-NEXT: pmuludq %xmm1, %xmm4 1371 ; SSE2-NEXT: movdqa %xmm1, %xmm5 1372 ; SSE2-NEXT: psrlq $32, %xmm5 1373 ; SSE2-NEXT: pmuludq %xmm7, %xmm5 1374 ; SSE2-NEXT: paddq %xmm4, %xmm5 1375 ; SSE2-NEXT: psllq $32, %xmm5 1376 ; SSE2-NEXT: pmuludq %xmm7, %xmm1 1377 ; SSE2-NEXT: paddq %xmm5, %xmm1 1378 ; SSE2-NEXT: movdqa %xmm2, %xmm4 1379 ; SSE2-NEXT: psrlq $32, %xmm4 1380 ; SSE2-NEXT: pmuludq %xmm9, %xmm4 1381 ; SSE2-NEXT: movdqa %xmm9, %xmm5 1382 ; SSE2-NEXT: psrlq $32, %xmm5 1383 ; SSE2-NEXT: pmuludq %xmm2, %xmm5 1384 ; SSE2-NEXT: paddq %xmm4, %xmm5 1385 ; SSE2-NEXT: psllq $32, %xmm5 1386 ; SSE2-NEXT: pmuludq %xmm9, %xmm2 1387 ; SSE2-NEXT: paddq %xmm5, %xmm2 1388 ; SSE2-NEXT: movdqa %xmm3, %xmm4 1389 ; SSE2-NEXT: psrlq $32, %xmm4 1390 ; SSE2-NEXT: pmuludq %xmm8, %xmm4 1391 ; SSE2-NEXT: movdqa %xmm8, %xmm5 1392 ; SSE2-NEXT: psrlq $32, %xmm5 1393 ; SSE2-NEXT: pmuludq %xmm3, %xmm5 1394 ; SSE2-NEXT: paddq %xmm4, %xmm5 1395 ; SSE2-NEXT: psllq $32, %xmm5 1396 ; SSE2-NEXT: pmuludq %xmm8, %xmm3 1397 ; SSE2-NEXT: paddq %xmm5, %xmm3 1398 ; SSE2-NEXT: retq 1399 ; 1400 ; SSE41-LABEL: mul_v8i64_sext: 1401 ; SSE41: # %bb.0: 1402 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[3,1,2,3] 1403 ; SSE41-NEXT: pmovsxwq %xmm3, %xmm4 1404 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1] 1405 ; SSE41-NEXT: pmovsxwq %xmm3, %xmm5 1406 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3] 1407 ; SSE41-NEXT: pmovsxwq %xmm3, %xmm6 1408 ; SSE41-NEXT: pmovsxwq %xmm0, %xmm7 1409 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1] 1410 ; SSE41-NEXT: pmovsxdq %xmm0, %xmm3 1411 ; SSE41-NEXT: pmuldq %xmm4, %xmm3 1412 ; SSE41-NEXT: pmovsxdq %xmm2, %xmm2 1413 ; SSE41-NEXT: pmuldq %xmm5, %xmm2 1414 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 1415 ; SSE41-NEXT: pmovsxdq %xmm0, %xmm4 1416 ; SSE41-NEXT: pmuldq %xmm6, %xmm4 1417 ; SSE41-NEXT: pmovsxdq %xmm1, %xmm0 1418 ; SSE41-NEXT: pmuldq %xmm7, %xmm0 1419 ; SSE41-NEXT: movdqa %xmm4, %xmm1 1420 ; SSE41-NEXT: retq 1421 ; 1422 ; AVX2-LABEL: mul_v8i64_sext: 1423 ; AVX2: # %bb.0: 1424 ; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 1425 ; AVX2-NEXT: vpmovsxwq %xmm2, %ymm2 1426 ; AVX2-NEXT: vpmovsxwq %xmm0, %ymm0 1427 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 1428 ; AVX2-NEXT: vpmovsxdq %xmm3, %ymm3 1429 ; AVX2-NEXT: vpmuldq %ymm3, %ymm2, %ymm2 1430 ; AVX2-NEXT: vpmovsxdq %xmm1, %ymm1 1431 ; AVX2-NEXT: vpmuldq %ymm1, %ymm0, %ymm0 1432 ; AVX2-NEXT: vmovdqa %ymm2, %ymm1 1433 ; AVX2-NEXT: retq 1434 ; 1435 ; AVX512-LABEL: mul_v8i64_sext: 1436 ; AVX512: # %bb.0: 1437 ; AVX512-NEXT: vpmovsxwq %xmm0, %zmm0 1438 ; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero 1439 ; AVX512-NEXT: vpmuldq %zmm1, %zmm0, %zmm0 1440 ; AVX512-NEXT: retq 1441 %1 = sext <8 x i16> %val1 to <8 x i64> 1442 %2 = sext <8 x i32> %val2 to <8 x i64> 1443 %3 = mul <8 x i64> %1, %2 1444 ret <8 x i64> %3 1445 } 1446