2382 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86-SSE3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X86-AVX,X86-AVX14; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=X86-AVX,X86-AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64-SSE6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X64-AVX,X64-AVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=X64-AVX,X64-AVX28 9@c = external dso_local global ptr, align 810 11; %val1 = load <2 x i8>12; %op1 = zext<2 x i32> %val113; %val2 = load <2 x i8>14; %op2 = zext<2 x i32> %val215; %rst = mul <2 x i32> %op1, %op216;17define void @mul_2xi8(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {18; X86-SSE-LABEL: mul_2xi8:19; X86-SSE: # %bb.0: # %entry20; X86-SSE-NEXT: pushl %esi21; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx22; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax23; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx24; X86-SSE-NEXT: movl c, %esi25; X86-SSE-NEXT: movzwl (%edx,%eax), %edx26; X86-SSE-NEXT: movd %edx, %xmm027; X86-SSE-NEXT: movzwl (%ecx,%eax), %ecx28; X86-SSE-NEXT: movd %ecx, %xmm129; X86-SSE-NEXT: pxor %xmm2, %xmm230; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]31; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]32; X86-SSE-NEXT: pmullw %xmm0, %xmm133; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]34; X86-SSE-NEXT: movq %xmm1, (%esi,%eax,4)35; X86-SSE-NEXT: popl %esi36; X86-SSE-NEXT: retl37;38; X86-AVX-LABEL: mul_2xi8:39; X86-AVX: # %bb.0: # %entry40; X86-AVX-NEXT: pushl %esi41; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax42; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx43; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx44; X86-AVX-NEXT: movl c, %esi45; X86-AVX-NEXT: movzwl (%edx,%ecx), %edx46; X86-AVX-NEXT: vmovd %edx, %xmm047; X86-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero48; X86-AVX-NEXT: movzwl (%eax,%ecx), %eax49; X86-AVX-NEXT: vmovd %eax, %xmm150; X86-AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero51; X86-AVX-NEXT: vpmaddwd %xmm0, %xmm1, %xmm052; X86-AVX-NEXT: vmovq %xmm0, (%esi,%ecx,4)53; X86-AVX-NEXT: popl %esi54; X86-AVX-NEXT: retl55;56; X64-SSE-LABEL: mul_2xi8:57; X64-SSE: # %bb.0: # %entry58; X64-SSE-NEXT: movq c(%rip), %rax59; X64-SSE-NEXT: movzwl (%rdi,%rdx), %ecx60; X64-SSE-NEXT: movd %ecx, %xmm061; X64-SSE-NEXT: movzwl (%rsi,%rdx), %ecx62; X64-SSE-NEXT: movd %ecx, %xmm163; X64-SSE-NEXT: pxor %xmm2, %xmm264; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]65; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]66; X64-SSE-NEXT: pmullw %xmm0, %xmm167; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]68; X64-SSE-NEXT: movq %xmm1, (%rax,%rdx,4)69; X64-SSE-NEXT: retq70;71; X64-AVX-LABEL: mul_2xi8:72; X64-AVX: # %bb.0: # %entry73; X64-AVX-NEXT: movq c(%rip), %rax74; X64-AVX-NEXT: movzwl (%rdi,%rdx), %ecx75; X64-AVX-NEXT: vmovd %ecx, %xmm076; X64-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero77; X64-AVX-NEXT: movzwl (%rsi,%rdx), %ecx78; X64-AVX-NEXT: vmovd %ecx, %xmm179; X64-AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero80; X64-AVX-NEXT: vpmaddwd %xmm0, %xmm1, %xmm081; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rdx,4)82; X64-AVX-NEXT: retq83entry:84 %pre = load ptr, ptr @c85 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index86 %wide.load = load <2 x i8>, ptr %tmp6, align 187 %tmp8 = zext <2 x i8> %wide.load to <2 x i32>88 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index89 %wide.load17 = load <2 x i8>, ptr %tmp10, align 190 %tmp12 = zext <2 x i8> %wide.load17 to <2 x i32>91 %tmp13 = mul nuw nsw <2 x i32> %tmp12, %tmp892 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index93 store <2 x i32> %tmp13, ptr %tmp14, align 494 ret void95}96 97; %val1 = load <4 x i8>98; %op1 = zext<4 x i32> %val199; %val2 = load <4 x i8>100; %op2 = zext<4 x i32> %val2101; %rst = mul <4 x i32> %op1, %op2102;103define void @mul_4xi8(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {104; X86-SSE-LABEL: mul_4xi8:105; X86-SSE: # %bb.0: # %entry106; X86-SSE-NEXT: pushl %esi107; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax108; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx109; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx110; X86-SSE-NEXT: movl c, %esi111; X86-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero112; X86-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero113; X86-SSE-NEXT: pxor %xmm2, %xmm2114; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]115; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]116; X86-SSE-NEXT: pmullw %xmm0, %xmm1117; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]118; X86-SSE-NEXT: movdqu %xmm1, (%esi,%ecx,4)119; X86-SSE-NEXT: popl %esi120; X86-SSE-NEXT: retl121;122; X86-AVX-LABEL: mul_4xi8:123; X86-AVX: # %bb.0: # %entry124; X86-AVX-NEXT: pushl %esi125; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax126; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx127; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx128; X86-AVX-NEXT: movl c, %esi129; X86-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero130; X86-AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero131; X86-AVX-NEXT: vpmaddwd %xmm0, %xmm1, %xmm0132; X86-AVX-NEXT: vmovdqu %xmm0, (%esi,%ecx,4)133; X86-AVX-NEXT: popl %esi134; X86-AVX-NEXT: retl135;136; X64-SSE-LABEL: mul_4xi8:137; X64-SSE: # %bb.0: # %entry138; X64-SSE-NEXT: movq c(%rip), %rax139; X64-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero140; X64-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero141; X64-SSE-NEXT: pxor %xmm2, %xmm2142; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]143; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]144; X64-SSE-NEXT: pmullw %xmm0, %xmm1145; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]146; X64-SSE-NEXT: movdqu %xmm1, (%rax,%rdx,4)147; X64-SSE-NEXT: retq148;149; X64-AVX-LABEL: mul_4xi8:150; X64-AVX: # %bb.0: # %entry151; X64-AVX-NEXT: movq c(%rip), %rax152; X64-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero153; X64-AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero154; X64-AVX-NEXT: vpmaddwd %xmm0, %xmm1, %xmm0155; X64-AVX-NEXT: vmovdqu %xmm0, (%rax,%rdx,4)156; X64-AVX-NEXT: retq157entry:158 %pre = load ptr, ptr @c159 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index160 %wide.load = load <4 x i8>, ptr %tmp6, align 1161 %tmp8 = zext <4 x i8> %wide.load to <4 x i32>162 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index163 %wide.load17 = load <4 x i8>, ptr %tmp10, align 1164 %tmp12 = zext <4 x i8> %wide.load17 to <4 x i32>165 %tmp13 = mul nuw nsw <4 x i32> %tmp12, %tmp8166 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index167 store <4 x i32> %tmp13, ptr %tmp14, align 4168 ret void169}170 171; %val1 = load <8 x i8>172; %op1 = zext<8 x i32> %val1173; %val2 = load <8 x i8>174; %op2 = zext<8 x i32> %val2175; %rst = mul <8 x i32> %op1, %op2176;177define void @mul_8xi8(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {178; X86-SSE-LABEL: mul_8xi8:179; X86-SSE: # %bb.0: # %entry180; X86-SSE-NEXT: pushl %esi181; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx182; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax183; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi184; X86-SSE-NEXT: movl c, %ecx185; X86-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero186; X86-SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero187; X86-SSE-NEXT: pxor %xmm2, %xmm2188; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]189; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]190; X86-SSE-NEXT: pmullw %xmm0, %xmm1191; X86-SSE-NEXT: movdqa %xmm1, %xmm0192; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]193; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]194; X86-SSE-NEXT: movdqu %xmm1, 16(%ecx,%eax,4)195; X86-SSE-NEXT: movdqu %xmm0, (%ecx,%eax,4)196; X86-SSE-NEXT: popl %esi197; X86-SSE-NEXT: retl198;199; X86-AVX1-LABEL: mul_8xi8:200; X86-AVX1: # %bb.0: # %entry201; X86-AVX1-NEXT: pushl %esi202; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax203; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx204; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %edx205; X86-AVX1-NEXT: movl c, %esi206; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero207; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero208; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero209; X86-AVX1-NEXT: vpmaddwd %xmm0, %xmm2, %xmm0210; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero211; X86-AVX1-NEXT: vpmaddwd %xmm1, %xmm2, %xmm1212; X86-AVX1-NEXT: vmovdqu %xmm0, 16(%esi,%ecx,4)213; X86-AVX1-NEXT: vmovdqu %xmm1, (%esi,%ecx,4)214; X86-AVX1-NEXT: popl %esi215; X86-AVX1-NEXT: retl216;217; X86-AVX2-LABEL: mul_8xi8:218; X86-AVX2: # %bb.0: # %entry219; X86-AVX2-NEXT: pushl %esi220; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax221; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx222; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %edx223; X86-AVX2-NEXT: movl c, %esi224; X86-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero225; X86-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero226; X86-AVX2-NEXT: vpmaddwd %ymm0, %ymm1, %ymm0227; X86-AVX2-NEXT: vmovdqu %ymm0, (%esi,%ecx,4)228; X86-AVX2-NEXT: popl %esi229; X86-AVX2-NEXT: vzeroupper230; X86-AVX2-NEXT: retl231;232; X64-SSE-LABEL: mul_8xi8:233; X64-SSE: # %bb.0: # %entry234; X64-SSE-NEXT: movq c(%rip), %rax235; X64-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero236; X64-SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero237; X64-SSE-NEXT: pxor %xmm2, %xmm2238; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]239; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]240; X64-SSE-NEXT: pmullw %xmm0, %xmm1241; X64-SSE-NEXT: movdqa %xmm1, %xmm0242; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]243; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]244; X64-SSE-NEXT: movdqu %xmm1, 16(%rax,%rdx,4)245; X64-SSE-NEXT: movdqu %xmm0, (%rax,%rdx,4)246; X64-SSE-NEXT: retq247;248; X64-AVX1-LABEL: mul_8xi8:249; X64-AVX1: # %bb.0: # %entry250; X64-AVX1-NEXT: movq c(%rip), %rax251; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero252; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero253; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero254; X64-AVX1-NEXT: vpmaddwd %xmm0, %xmm2, %xmm0255; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero256; X64-AVX1-NEXT: vpmaddwd %xmm1, %xmm2, %xmm1257; X64-AVX1-NEXT: vmovdqu %xmm0, 16(%rax,%rdx,4)258; X64-AVX1-NEXT: vmovdqu %xmm1, (%rax,%rdx,4)259; X64-AVX1-NEXT: retq260;261; X64-AVX2-LABEL: mul_8xi8:262; X64-AVX2: # %bb.0: # %entry263; X64-AVX2-NEXT: movq c(%rip), %rax264; X64-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero265; X64-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero266; X64-AVX2-NEXT: vpmaddwd %ymm0, %ymm1, %ymm0267; X64-AVX2-NEXT: vmovdqu %ymm0, (%rax,%rdx,4)268; X64-AVX2-NEXT: vzeroupper269; X64-AVX2-NEXT: retq270entry:271 %pre = load ptr, ptr @c272 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index273 %wide.load = load <8 x i8>, ptr %tmp6, align 1274 %tmp8 = zext <8 x i8> %wide.load to <8 x i32>275 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index276 %wide.load17 = load <8 x i8>, ptr %tmp10, align 1277 %tmp12 = zext <8 x i8> %wide.load17 to <8 x i32>278 %tmp13 = mul nuw nsw <8 x i32> %tmp12, %tmp8279 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index280 store <8 x i32> %tmp13, ptr %tmp14, align 4281 ret void282}283 284; %val1 = load <16 x i8>285; %op1 = zext<16 x i32> %val1286; %val2 = load <16 x i8>287; %op2 = zext<16 x i32> %val2288; %rst = mul <16 x i32> %op1, %op2289;290define void @mul_16xi8(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {291; X86-SSE-LABEL: mul_16xi8:292; X86-SSE: # %bb.0: # %entry293; X86-SSE-NEXT: pushl %esi294; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx295; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax296; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi297; X86-SSE-NEXT: movl c, %ecx298; X86-SSE-NEXT: movdqu (%esi,%eax), %xmm3299; X86-SSE-NEXT: movdqu (%edx,%eax), %xmm0300; X86-SSE-NEXT: pxor %xmm1, %xmm1301; X86-SSE-NEXT: movdqa %xmm3, %xmm4302; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]303; X86-SSE-NEXT: movdqa %xmm0, %xmm2304; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]305; X86-SSE-NEXT: pmullw %xmm4, %xmm2306; X86-SSE-NEXT: movdqa %xmm2, %xmm4307; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]308; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]309; X86-SSE-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]310; X86-SSE-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]311; X86-SSE-NEXT: pmullw %xmm3, %xmm0312; X86-SSE-NEXT: movdqa %xmm0, %xmm3313; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]314; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]315; X86-SSE-NEXT: movdqu %xmm0, 48(%ecx,%eax,4)316; X86-SSE-NEXT: movdqu %xmm3, 32(%ecx,%eax,4)317; X86-SSE-NEXT: movdqu %xmm2, 16(%ecx,%eax,4)318; X86-SSE-NEXT: movdqu %xmm4, (%ecx,%eax,4)319; X86-SSE-NEXT: popl %esi320; X86-SSE-NEXT: retl321;322; X86-AVX1-LABEL: mul_16xi8:323; X86-AVX1: # %bb.0: # %entry324; X86-AVX1-NEXT: pushl %esi325; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %edx326; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax327; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %esi328; X86-AVX1-NEXT: movl c, %ecx329; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero330; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero331; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero332; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm3 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero333; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero334; X86-AVX1-NEXT: vpmaddwd %xmm0, %xmm4, %xmm0335; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero336; X86-AVX1-NEXT: vpmaddwd %xmm1, %xmm4, %xmm1337; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero338; X86-AVX1-NEXT: vpmaddwd %xmm2, %xmm4, %xmm2339; X86-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero340; X86-AVX1-NEXT: vpmaddwd %xmm3, %xmm4, %xmm3341; X86-AVX1-NEXT: vmovdqu %xmm0, 48(%ecx,%eax,4)342; X86-AVX1-NEXT: vmovdqu %xmm1, 32(%ecx,%eax,4)343; X86-AVX1-NEXT: vmovdqu %xmm2, 16(%ecx,%eax,4)344; X86-AVX1-NEXT: vmovdqu %xmm3, (%ecx,%eax,4)345; X86-AVX1-NEXT: popl %esi346; X86-AVX1-NEXT: retl347;348; X86-AVX2-LABEL: mul_16xi8:349; X86-AVX2: # %bb.0: # %entry350; X86-AVX2-NEXT: pushl %esi351; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax352; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx353; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %edx354; X86-AVX2-NEXT: movl c, %esi355; X86-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero356; X86-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero357; X86-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero358; X86-AVX2-NEXT: vpmaddwd %ymm0, %ymm2, %ymm0359; X86-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero360; X86-AVX2-NEXT: vpmaddwd %ymm1, %ymm2, %ymm1361; X86-AVX2-NEXT: vmovdqu %ymm0, 32(%esi,%ecx,4)362; X86-AVX2-NEXT: vmovdqu %ymm1, (%esi,%ecx,4)363; X86-AVX2-NEXT: popl %esi364; X86-AVX2-NEXT: vzeroupper365; X86-AVX2-NEXT: retl366;367; X64-SSE-LABEL: mul_16xi8:368; X64-SSE: # %bb.0: # %entry369; X64-SSE-NEXT: movq c(%rip), %rax370; X64-SSE-NEXT: movdqu (%rdi,%rdx), %xmm0371; X64-SSE-NEXT: movdqu (%rsi,%rdx), %xmm1372; X64-SSE-NEXT: pxor %xmm2, %xmm2373; X64-SSE-NEXT: movdqa %xmm0, %xmm3374; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]375; X64-SSE-NEXT: movdqa %xmm1, %xmm4376; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]377; X64-SSE-NEXT: pmullw %xmm3, %xmm4378; X64-SSE-NEXT: movdqa %xmm4, %xmm3379; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]380; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]381; X64-SSE-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]382; X64-SSE-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]383; X64-SSE-NEXT: pmullw %xmm0, %xmm1384; X64-SSE-NEXT: movdqa %xmm1, %xmm0385; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]386; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]387; X64-SSE-NEXT: movdqu %xmm1, 48(%rax,%rdx,4)388; X64-SSE-NEXT: movdqu %xmm0, 32(%rax,%rdx,4)389; X64-SSE-NEXT: movdqu %xmm4, 16(%rax,%rdx,4)390; X64-SSE-NEXT: movdqu %xmm3, (%rax,%rdx,4)391; X64-SSE-NEXT: retq392;393; X64-AVX1-LABEL: mul_16xi8:394; X64-AVX1: # %bb.0: # %entry395; X64-AVX1-NEXT: movq c(%rip), %rax396; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero397; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero398; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero399; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm3 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero400; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero401; X64-AVX1-NEXT: vpmaddwd %xmm0, %xmm4, %xmm0402; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero403; X64-AVX1-NEXT: vpmaddwd %xmm1, %xmm4, %xmm1404; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero405; X64-AVX1-NEXT: vpmaddwd %xmm2, %xmm4, %xmm2406; X64-AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero407; X64-AVX1-NEXT: vpmaddwd %xmm3, %xmm4, %xmm3408; X64-AVX1-NEXT: vmovdqu %xmm0, 48(%rax,%rdx,4)409; X64-AVX1-NEXT: vmovdqu %xmm1, 32(%rax,%rdx,4)410; X64-AVX1-NEXT: vmovdqu %xmm2, 16(%rax,%rdx,4)411; X64-AVX1-NEXT: vmovdqu %xmm3, (%rax,%rdx,4)412; X64-AVX1-NEXT: retq413;414; X64-AVX2-LABEL: mul_16xi8:415; X64-AVX2: # %bb.0: # %entry416; X64-AVX2-NEXT: movq c(%rip), %rax417; X64-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero418; X64-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero419; X64-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero420; X64-AVX2-NEXT: vpmaddwd %ymm0, %ymm2, %ymm0421; X64-AVX2-NEXT: vpmovzxbd {{.*#+}} ymm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero422; X64-AVX2-NEXT: vpmaddwd %ymm1, %ymm2, %ymm1423; X64-AVX2-NEXT: vmovdqu %ymm0, 32(%rax,%rdx,4)424; X64-AVX2-NEXT: vmovdqu %ymm1, (%rax,%rdx,4)425; X64-AVX2-NEXT: vzeroupper426; X64-AVX2-NEXT: retq427entry:428 %pre = load ptr, ptr @c429 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index430 %wide.load = load <16 x i8>, ptr %tmp6, align 1431 %tmp8 = zext <16 x i8> %wide.load to <16 x i32>432 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index433 %wide.load17 = load <16 x i8>, ptr %tmp10, align 1434 %tmp12 = zext <16 x i8> %wide.load17 to <16 x i32>435 %tmp13 = mul nuw nsw <16 x i32> %tmp12, %tmp8436 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index437 store <16 x i32> %tmp13, ptr %tmp14, align 4438 ret void439}440 441; %val1 = load <2 x i16>442; %op1 = zext<2 x i32> %val1443; %val2 = load <2 x i16>444; %op2 = zext<2 x i32> %val2445; %rst = mul <2 x i32> %op1, %op2446;447define void @mul_2xi16(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {448; X86-SSE-LABEL: mul_2xi16:449; X86-SSE: # %bb.0: # %entry450; X86-SSE-NEXT: pushl %esi451; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax452; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx453; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx454; X86-SSE-NEXT: movl c, %esi455; X86-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero456; X86-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero457; X86-SSE-NEXT: movdqa %xmm1, %xmm2458; X86-SSE-NEXT: pmulhuw %xmm0, %xmm2459; X86-SSE-NEXT: pmullw %xmm0, %xmm1460; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]461; X86-SSE-NEXT: movq %xmm1, (%esi,%ecx,4)462; X86-SSE-NEXT: popl %esi463; X86-SSE-NEXT: retl464;465; X86-AVX-LABEL: mul_2xi16:466; X86-AVX: # %bb.0: # %entry467; X86-AVX-NEXT: pushl %esi468; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax469; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx470; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx471; X86-AVX-NEXT: movl c, %esi472; X86-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero473; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero474; X86-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero475; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero476; X86-AVX-NEXT: vpmulld %xmm0, %xmm1, %xmm0477; X86-AVX-NEXT: vmovq %xmm0, (%esi,%ecx,4)478; X86-AVX-NEXT: popl %esi479; X86-AVX-NEXT: retl480;481; X64-SSE-LABEL: mul_2xi16:482; X64-SSE: # %bb.0: # %entry483; X64-SSE-NEXT: movq c(%rip), %rax484; X64-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero485; X64-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero486; X64-SSE-NEXT: movdqa %xmm1, %xmm2487; X64-SSE-NEXT: pmulhuw %xmm0, %xmm2488; X64-SSE-NEXT: pmullw %xmm0, %xmm1489; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]490; X64-SSE-NEXT: movq %xmm1, (%rax,%rdx,4)491; X64-SSE-NEXT: retq492;493; X64-AVX-LABEL: mul_2xi16:494; X64-AVX: # %bb.0: # %entry495; X64-AVX-NEXT: movq c(%rip), %rax496; X64-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero497; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero498; X64-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero499; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero500; X64-AVX-NEXT: vpmulld %xmm0, %xmm1, %xmm0501; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rdx,4)502; X64-AVX-NEXT: retq503entry:504 %pre = load ptr, ptr @c505 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index506 %wide.load = load <2 x i16>, ptr %tmp6, align 1507 %tmp8 = zext <2 x i16> %wide.load to <2 x i32>508 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index509 %wide.load17 = load <2 x i16>, ptr %tmp10, align 1510 %tmp12 = zext <2 x i16> %wide.load17 to <2 x i32>511 %tmp13 = mul nuw nsw <2 x i32> %tmp12, %tmp8512 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index513 store <2 x i32> %tmp13, ptr %tmp14, align 4514 ret void515}516 517; %val1 = load <4 x i16>518; %op1 = zext<4 x i32> %val1519; %val2 = load <4 x i16>520; %op2 = zext<4 x i32> %val2521; %rst = mul <4 x i32> %op1, %op2522;523define void @mul_4xi16(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {524; X86-SSE-LABEL: mul_4xi16:525; X86-SSE: # %bb.0: # %entry526; X86-SSE-NEXT: pushl %esi527; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax528; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx529; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx530; X86-SSE-NEXT: movl c, %esi531; X86-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero532; X86-SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero533; X86-SSE-NEXT: movdqa %xmm1, %xmm2534; X86-SSE-NEXT: pmulhuw %xmm0, %xmm2535; X86-SSE-NEXT: pmullw %xmm0, %xmm1536; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]537; X86-SSE-NEXT: movdqu %xmm1, (%esi,%ecx,4)538; X86-SSE-NEXT: popl %esi539; X86-SSE-NEXT: retl540;541; X86-AVX-LABEL: mul_4xi16:542; X86-AVX: # %bb.0: # %entry543; X86-AVX-NEXT: pushl %esi544; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax545; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx546; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx547; X86-AVX-NEXT: movl c, %esi548; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero549; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero550; X86-AVX-NEXT: vpmulld %xmm0, %xmm1, %xmm0551; X86-AVX-NEXT: vmovdqu %xmm0, (%esi,%ecx,4)552; X86-AVX-NEXT: popl %esi553; X86-AVX-NEXT: retl554;555; X64-SSE-LABEL: mul_4xi16:556; X64-SSE: # %bb.0: # %entry557; X64-SSE-NEXT: movq c(%rip), %rax558; X64-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero559; X64-SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero560; X64-SSE-NEXT: movdqa %xmm1, %xmm2561; X64-SSE-NEXT: pmulhuw %xmm0, %xmm2562; X64-SSE-NEXT: pmullw %xmm0, %xmm1563; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]564; X64-SSE-NEXT: movdqu %xmm1, (%rax,%rdx,4)565; X64-SSE-NEXT: retq566;567; X64-AVX-LABEL: mul_4xi16:568; X64-AVX: # %bb.0: # %entry569; X64-AVX-NEXT: movq c(%rip), %rax570; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero571; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero572; X64-AVX-NEXT: vpmulld %xmm0, %xmm1, %xmm0573; X64-AVX-NEXT: vmovdqu %xmm0, (%rax,%rdx,4)574; X64-AVX-NEXT: retq575entry:576 %pre = load ptr, ptr @c577 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index578 %wide.load = load <4 x i16>, ptr %tmp6, align 1579 %tmp8 = zext <4 x i16> %wide.load to <4 x i32>580 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index581 %wide.load17 = load <4 x i16>, ptr %tmp10, align 1582 %tmp12 = zext <4 x i16> %wide.load17 to <4 x i32>583 %tmp13 = mul nuw nsw <4 x i32> %tmp12, %tmp8584 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index585 store <4 x i32> %tmp13, ptr %tmp14, align 4586 ret void587}588 589; %val1 = load <8 x i16>590; %op1 = zext<8 x i32> %val1591; %val2 = load <8 x i16>592; %op2 = zext<8 x i32> %val2593; %rst = mul <8 x i32> %op1, %op2594;595define void @mul_8xi16(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {596; X86-SSE-LABEL: mul_8xi16:597; X86-SSE: # %bb.0: # %entry598; X86-SSE-NEXT: pushl %esi599; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax600; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx601; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx602; X86-SSE-NEXT: movl c, %esi603; X86-SSE-NEXT: movdqu (%edx,%ecx), %xmm0604; X86-SSE-NEXT: movdqu (%eax,%ecx), %xmm1605; X86-SSE-NEXT: movdqa %xmm1, %xmm2606; X86-SSE-NEXT: pmulhuw %xmm0, %xmm2607; X86-SSE-NEXT: pmullw %xmm0, %xmm1608; X86-SSE-NEXT: movdqa %xmm1, %xmm0609; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]610; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]611; X86-SSE-NEXT: movdqu %xmm1, 16(%esi,%ecx,4)612; X86-SSE-NEXT: movdqu %xmm0, (%esi,%ecx,4)613; X86-SSE-NEXT: popl %esi614; X86-SSE-NEXT: retl615;616; X86-AVX1-LABEL: mul_8xi16:617; X86-AVX1: # %bb.0: # %entry618; X86-AVX1-NEXT: pushl %esi619; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax620; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx621; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %edx622; X86-AVX1-NEXT: movl c, %esi623; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero624; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero625; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero626; X86-AVX1-NEXT: vpmulld %xmm0, %xmm2, %xmm0627; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero628; X86-AVX1-NEXT: vpmulld %xmm1, %xmm2, %xmm1629; X86-AVX1-NEXT: vmovdqu %xmm0, 16(%esi,%ecx,4)630; X86-AVX1-NEXT: vmovdqu %xmm1, (%esi,%ecx,4)631; X86-AVX1-NEXT: popl %esi632; X86-AVX1-NEXT: retl633;634; X86-AVX2-LABEL: mul_8xi16:635; X86-AVX2: # %bb.0: # %entry636; X86-AVX2-NEXT: pushl %esi637; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax638; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx639; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %edx640; X86-AVX2-NEXT: movl c, %esi641; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero642; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero643; X86-AVX2-NEXT: vpmulld %ymm0, %ymm1, %ymm0644; X86-AVX2-NEXT: vmovdqu %ymm0, (%esi,%ecx,4)645; X86-AVX2-NEXT: popl %esi646; X86-AVX2-NEXT: vzeroupper647; X86-AVX2-NEXT: retl648;649; X64-SSE-LABEL: mul_8xi16:650; X64-SSE: # %bb.0: # %entry651; X64-SSE-NEXT: movq c(%rip), %rax652; X64-SSE-NEXT: movdqu (%rdi,%rdx), %xmm0653; X64-SSE-NEXT: movdqu (%rsi,%rdx), %xmm1654; X64-SSE-NEXT: movdqa %xmm1, %xmm2655; X64-SSE-NEXT: pmulhuw %xmm0, %xmm2656; X64-SSE-NEXT: pmullw %xmm0, %xmm1657; X64-SSE-NEXT: movdqa %xmm1, %xmm0658; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]659; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]660; X64-SSE-NEXT: movdqu %xmm1, 16(%rax,%rdx,4)661; X64-SSE-NEXT: movdqu %xmm0, (%rax,%rdx,4)662; X64-SSE-NEXT: retq663;664; X64-AVX1-LABEL: mul_8xi16:665; X64-AVX1: # %bb.0: # %entry666; X64-AVX1-NEXT: movq c(%rip), %rax667; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero668; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero669; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero670; X64-AVX1-NEXT: vpmulld %xmm0, %xmm2, %xmm0671; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero672; X64-AVX1-NEXT: vpmulld %xmm1, %xmm2, %xmm1673; X64-AVX1-NEXT: vmovdqu %xmm0, 16(%rax,%rdx,4)674; X64-AVX1-NEXT: vmovdqu %xmm1, (%rax,%rdx,4)675; X64-AVX1-NEXT: retq676;677; X64-AVX2-LABEL: mul_8xi16:678; X64-AVX2: # %bb.0: # %entry679; X64-AVX2-NEXT: movq c(%rip), %rax680; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero681; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero682; X64-AVX2-NEXT: vpmulld %ymm0, %ymm1, %ymm0683; X64-AVX2-NEXT: vmovdqu %ymm0, (%rax,%rdx,4)684; X64-AVX2-NEXT: vzeroupper685; X64-AVX2-NEXT: retq686entry:687 %pre = load ptr, ptr @c688 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index689 %wide.load = load <8 x i16>, ptr %tmp6, align 1690 %tmp8 = zext <8 x i16> %wide.load to <8 x i32>691 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index692 %wide.load17 = load <8 x i16>, ptr %tmp10, align 1693 %tmp12 = zext <8 x i16> %wide.load17 to <8 x i32>694 %tmp13 = mul nuw nsw <8 x i32> %tmp12, %tmp8695 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index696 store <8 x i32> %tmp13, ptr %tmp14, align 4697 ret void698}699 700; %val1 = load <16 x i16>701; %op1 = zext<16 x i32> %val1702; %val2 = load <16 x i16>703; %op2 = zext<16 x i32> %val2704; %rst = mul <16 x i32> %op1, %op2705;706define void @mul_16xi16(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {707; X86-SSE-LABEL: mul_16xi16:708; X86-SSE: # %bb.0: # %entry709; X86-SSE-NEXT: pushl %esi710; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx711; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax712; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi713; X86-SSE-NEXT: movl c, %ecx714; X86-SSE-NEXT: movdqu (%esi,%eax), %xmm2715; X86-SSE-NEXT: movdqu 16(%esi,%eax), %xmm3716; X86-SSE-NEXT: movdqu (%edx,%eax), %xmm0717; X86-SSE-NEXT: movdqu 16(%edx,%eax), %xmm1718; X86-SSE-NEXT: movdqa %xmm0, %xmm4719; X86-SSE-NEXT: pmulhuw %xmm2, %xmm4720; X86-SSE-NEXT: pmullw %xmm2, %xmm0721; X86-SSE-NEXT: movdqa %xmm0, %xmm2722; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]723; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]724; X86-SSE-NEXT: movdqa %xmm1, %xmm4725; X86-SSE-NEXT: pmulhuw %xmm3, %xmm4726; X86-SSE-NEXT: pmullw %xmm3, %xmm1727; X86-SSE-NEXT: movdqa %xmm1, %xmm3728; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]729; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]730; X86-SSE-NEXT: movdqu %xmm1, 32(%ecx,%eax,4)731; X86-SSE-NEXT: movdqu %xmm3, 48(%ecx,%eax,4)732; X86-SSE-NEXT: movdqu %xmm0, (%ecx,%eax,4)733; X86-SSE-NEXT: movdqu %xmm2, 16(%ecx,%eax,4)734; X86-SSE-NEXT: popl %esi735; X86-SSE-NEXT: retl736;737; X86-AVX1-LABEL: mul_16xi16:738; X86-AVX1: # %bb.0: # %entry739; X86-AVX1-NEXT: pushl %esi740; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %edx741; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax742; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %esi743; X86-AVX1-NEXT: movl c, %ecx744; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero745; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero746; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero747; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero748; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero749; X86-AVX1-NEXT: vpmulld %xmm0, %xmm4, %xmm0750; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero751; X86-AVX1-NEXT: vpmulld %xmm1, %xmm4, %xmm1752; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero753; X86-AVX1-NEXT: vpmulld %xmm2, %xmm4, %xmm2754; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero755; X86-AVX1-NEXT: vpmulld %xmm3, %xmm4, %xmm3756; X86-AVX1-NEXT: vmovdqu %xmm0, 48(%ecx,%eax,4)757; X86-AVX1-NEXT: vmovdqu %xmm1, 32(%ecx,%eax,4)758; X86-AVX1-NEXT: vmovdqu %xmm2, 16(%ecx,%eax,4)759; X86-AVX1-NEXT: vmovdqu %xmm3, (%ecx,%eax,4)760; X86-AVX1-NEXT: popl %esi761; X86-AVX1-NEXT: retl762;763; X86-AVX2-LABEL: mul_16xi16:764; X86-AVX2: # %bb.0: # %entry765; X86-AVX2-NEXT: pushl %esi766; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax767; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx768; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %edx769; X86-AVX2-NEXT: movl c, %esi770; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero771; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero772; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero773; X86-AVX2-NEXT: vpmulld %ymm0, %ymm2, %ymm0774; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero775; X86-AVX2-NEXT: vpmulld %ymm1, %ymm2, %ymm1776; X86-AVX2-NEXT: vmovdqu %ymm0, 32(%esi,%ecx,4)777; X86-AVX2-NEXT: vmovdqu %ymm1, (%esi,%ecx,4)778; X86-AVX2-NEXT: popl %esi779; X86-AVX2-NEXT: vzeroupper780; X86-AVX2-NEXT: retl781;782; X64-SSE-LABEL: mul_16xi16:783; X64-SSE: # %bb.0: # %entry784; X64-SSE-NEXT: movq c(%rip), %rax785; X64-SSE-NEXT: movdqu (%rdi,%rdx), %xmm0786; X64-SSE-NEXT: movdqu 16(%rdi,%rdx), %xmm1787; X64-SSE-NEXT: movdqu (%rsi,%rdx), %xmm2788; X64-SSE-NEXT: movdqu 16(%rsi,%rdx), %xmm3789; X64-SSE-NEXT: movdqa %xmm2, %xmm4790; X64-SSE-NEXT: pmulhuw %xmm0, %xmm4791; X64-SSE-NEXT: pmullw %xmm0, %xmm2792; X64-SSE-NEXT: movdqa %xmm2, %xmm0793; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]794; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]795; X64-SSE-NEXT: movdqa %xmm3, %xmm4796; X64-SSE-NEXT: pmulhuw %xmm1, %xmm4797; X64-SSE-NEXT: pmullw %xmm1, %xmm3798; X64-SSE-NEXT: movdqa %xmm3, %xmm1799; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]800; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]801; X64-SSE-NEXT: movdqu %xmm3, 32(%rax,%rdx,4)802; X64-SSE-NEXT: movdqu %xmm1, 48(%rax,%rdx,4)803; X64-SSE-NEXT: movdqu %xmm2, (%rax,%rdx,4)804; X64-SSE-NEXT: movdqu %xmm0, 16(%rax,%rdx,4)805; X64-SSE-NEXT: retq806;807; X64-AVX1-LABEL: mul_16xi16:808; X64-AVX1: # %bb.0: # %entry809; X64-AVX1-NEXT: movq c(%rip), %rax810; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero811; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero812; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero813; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero814; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero815; X64-AVX1-NEXT: vpmulld %xmm0, %xmm4, %xmm0816; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero817; X64-AVX1-NEXT: vpmulld %xmm1, %xmm4, %xmm1818; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero819; X64-AVX1-NEXT: vpmulld %xmm2, %xmm4, %xmm2820; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero821; X64-AVX1-NEXT: vpmulld %xmm3, %xmm4, %xmm3822; X64-AVX1-NEXT: vmovdqu %xmm0, 48(%rax,%rdx,4)823; X64-AVX1-NEXT: vmovdqu %xmm1, 32(%rax,%rdx,4)824; X64-AVX1-NEXT: vmovdqu %xmm2, 16(%rax,%rdx,4)825; X64-AVX1-NEXT: vmovdqu %xmm3, (%rax,%rdx,4)826; X64-AVX1-NEXT: retq827;828; X64-AVX2-LABEL: mul_16xi16:829; X64-AVX2: # %bb.0: # %entry830; X64-AVX2-NEXT: movq c(%rip), %rax831; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero832; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero833; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero834; X64-AVX2-NEXT: vpmulld %ymm0, %ymm2, %ymm0835; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero836; X64-AVX2-NEXT: vpmulld %ymm1, %ymm2, %ymm1837; X64-AVX2-NEXT: vmovdqu %ymm0, 32(%rax,%rdx,4)838; X64-AVX2-NEXT: vmovdqu %ymm1, (%rax,%rdx,4)839; X64-AVX2-NEXT: vzeroupper840; X64-AVX2-NEXT: retq841entry:842 %pre = load ptr, ptr @c843 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index844 %wide.load = load <16 x i16>, ptr %tmp6, align 1845 %tmp8 = zext <16 x i16> %wide.load to <16 x i32>846 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index847 %wide.load17 = load <16 x i16>, ptr %tmp10, align 1848 %tmp12 = zext <16 x i16> %wide.load17 to <16 x i32>849 %tmp13 = mul nuw nsw <16 x i32> %tmp12, %tmp8850 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index851 store <16 x i32> %tmp13, ptr %tmp14, align 4852 ret void853}854 855; %val1 = load <2 x i8>856; %op1 = sext<2 x i32> %val1857; %val2 = load <2 x i8>858; %op2 = sext<2 x i32> %val2859; %rst = mul <2 x i32> %op1, %op2860;861define void @mul_2xi8_sext(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {862; X86-SSE-LABEL: mul_2xi8_sext:863; X86-SSE: # %bb.0: # %entry864; X86-SSE-NEXT: pushl %esi865; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx866; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax867; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi868; X86-SSE-NEXT: movl c, %ecx869; X86-SSE-NEXT: movzwl (%esi,%eax), %esi870; X86-SSE-NEXT: movd %esi, %xmm0871; X86-SSE-NEXT: movzwl (%edx,%eax), %edx872; X86-SSE-NEXT: movd %edx, %xmm1873; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]874; X86-SSE-NEXT: psraw $8, %xmm0875; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]876; X86-SSE-NEXT: psraw $8, %xmm1877; X86-SSE-NEXT: pmullw %xmm0, %xmm1878; X86-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,2,1,4,5,6,7]879; X86-SSE-NEXT: psrad $16, %xmm0880; X86-SSE-NEXT: movq %xmm0, (%ecx,%eax,4)881; X86-SSE-NEXT: popl %esi882; X86-SSE-NEXT: retl883;884; X86-AVX-LABEL: mul_2xi8_sext:885; X86-AVX: # %bb.0: # %entry886; X86-AVX-NEXT: pushl %esi887; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax888; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx889; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx890; X86-AVX-NEXT: movl c, %esi891; X86-AVX-NEXT: movzwl (%edx,%ecx), %edx892; X86-AVX-NEXT: vmovd %edx, %xmm0893; X86-AVX-NEXT: vpmovsxbd %xmm0, %xmm0894; X86-AVX-NEXT: movzwl (%eax,%ecx), %eax895; X86-AVX-NEXT: vmovd %eax, %xmm1896; X86-AVX-NEXT: vpmovsxbd %xmm1, %xmm1897; X86-AVX-NEXT: vpmulld %xmm0, %xmm1, %xmm0898; X86-AVX-NEXT: vmovq %xmm0, (%esi,%ecx,4)899; X86-AVX-NEXT: popl %esi900; X86-AVX-NEXT: retl901;902; X64-SSE-LABEL: mul_2xi8_sext:903; X64-SSE: # %bb.0: # %entry904; X64-SSE-NEXT: movq c(%rip), %rax905; X64-SSE-NEXT: movzwl (%rdi,%rdx), %ecx906; X64-SSE-NEXT: movd %ecx, %xmm0907; X64-SSE-NEXT: movzwl (%rsi,%rdx), %ecx908; X64-SSE-NEXT: movd %ecx, %xmm1909; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]910; X64-SSE-NEXT: psraw $8, %xmm0911; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]912; X64-SSE-NEXT: psraw $8, %xmm1913; X64-SSE-NEXT: pmullw %xmm0, %xmm1914; X64-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,2,1,4,5,6,7]915; X64-SSE-NEXT: psrad $16, %xmm0916; X64-SSE-NEXT: movq %xmm0, (%rax,%rdx,4)917; X64-SSE-NEXT: retq918;919; X64-AVX-LABEL: mul_2xi8_sext:920; X64-AVX: # %bb.0: # %entry921; X64-AVX-NEXT: movq c(%rip), %rax922; X64-AVX-NEXT: movzwl (%rdi,%rdx), %ecx923; X64-AVX-NEXT: vmovd %ecx, %xmm0924; X64-AVX-NEXT: vpmovsxbd %xmm0, %xmm0925; X64-AVX-NEXT: movzwl (%rsi,%rdx), %ecx926; X64-AVX-NEXT: vmovd %ecx, %xmm1927; X64-AVX-NEXT: vpmovsxbd %xmm1, %xmm1928; X64-AVX-NEXT: vpmulld %xmm0, %xmm1, %xmm0929; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rdx,4)930; X64-AVX-NEXT: retq931entry:932 %pre = load ptr, ptr @c933 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index934 %wide.load = load <2 x i8>, ptr %tmp6, align 1935 %tmp8 = sext <2 x i8> %wide.load to <2 x i32>936 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index937 %wide.load17 = load <2 x i8>, ptr %tmp10, align 1938 %tmp12 = sext <2 x i8> %wide.load17 to <2 x i32>939 %tmp13 = mul nuw nsw <2 x i32> %tmp12, %tmp8940 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index941 store <2 x i32> %tmp13, ptr %tmp14, align 4942 ret void943}944 945; %val1 = load <2 x i8>946; %op1 = sext<2 x i32> %val1947; %val2 = load <2 x i8>948; %op2 = zext<2 x i32> %val2949; %rst = mul <2 x i32> %op1, %op2950;951define void @mul_2xi8_sext_zext(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {952; X86-SSE-LABEL: mul_2xi8_sext_zext:953; X86-SSE: # %bb.0: # %entry954; X86-SSE-NEXT: pushl %esi955; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx956; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax957; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi958; X86-SSE-NEXT: movl c, %ecx959; X86-SSE-NEXT: movzwl (%esi,%eax), %esi960; X86-SSE-NEXT: movd %esi, %xmm0961; X86-SSE-NEXT: movzwl (%edx,%eax), %edx962; X86-SSE-NEXT: movd %edx, %xmm1963; X86-SSE-NEXT: pxor %xmm2, %xmm2964; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]965; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,3,4,5,6,7]966; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]967; X86-SSE-NEXT: psraw $8, %xmm0968; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]969; X86-SSE-NEXT: pmaddwd %xmm1, %xmm0970; X86-SSE-NEXT: movq %xmm0, (%ecx,%eax,4)971; X86-SSE-NEXT: popl %esi972; X86-SSE-NEXT: retl973;974; X86-AVX-LABEL: mul_2xi8_sext_zext:975; X86-AVX: # %bb.0: # %entry976; X86-AVX-NEXT: pushl %esi977; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax978; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx979; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx980; X86-AVX-NEXT: movl c, %esi981; X86-AVX-NEXT: movzwl (%edx,%ecx), %edx982; X86-AVX-NEXT: vmovd %edx, %xmm0983; X86-AVX-NEXT: vpmovsxbd %xmm0, %xmm0984; X86-AVX-NEXT: movzwl (%eax,%ecx), %eax985; X86-AVX-NEXT: vmovd %eax, %xmm1986; X86-AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero987; X86-AVX-NEXT: vpmaddwd %xmm0, %xmm1, %xmm0988; X86-AVX-NEXT: vmovq %xmm0, (%esi,%ecx,4)989; X86-AVX-NEXT: popl %esi990; X86-AVX-NEXT: retl991;992; X64-SSE-LABEL: mul_2xi8_sext_zext:993; X64-SSE: # %bb.0: # %entry994; X64-SSE-NEXT: movq c(%rip), %rax995; X64-SSE-NEXT: movzwl (%rdi,%rdx), %ecx996; X64-SSE-NEXT: movd %ecx, %xmm0997; X64-SSE-NEXT: movzwl (%rsi,%rdx), %ecx998; X64-SSE-NEXT: movd %ecx, %xmm1999; X64-SSE-NEXT: pxor %xmm2, %xmm21000; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]1001; X64-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,3,4,5,6,7]1002; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1003; X64-SSE-NEXT: psraw $8, %xmm01004; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]1005; X64-SSE-NEXT: pmaddwd %xmm1, %xmm01006; X64-SSE-NEXT: movq %xmm0, (%rax,%rdx,4)1007; X64-SSE-NEXT: retq1008;1009; X64-AVX-LABEL: mul_2xi8_sext_zext:1010; X64-AVX: # %bb.0: # %entry1011; X64-AVX-NEXT: movq c(%rip), %rax1012; X64-AVX-NEXT: movzwl (%rdi,%rdx), %ecx1013; X64-AVX-NEXT: vmovd %ecx, %xmm01014; X64-AVX-NEXT: vpmovsxbd %xmm0, %xmm01015; X64-AVX-NEXT: movzwl (%rsi,%rdx), %ecx1016; X64-AVX-NEXT: vmovd %ecx, %xmm11017; X64-AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero1018; X64-AVX-NEXT: vpmaddwd %xmm0, %xmm1, %xmm01019; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rdx,4)1020; X64-AVX-NEXT: retq1021entry:1022 %pre = load ptr, ptr @c1023 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1024 %wide.load = load <2 x i8>, ptr %tmp6, align 11025 %tmp8 = sext <2 x i8> %wide.load to <2 x i32>1026 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index1027 %wide.load17 = load <2 x i8>, ptr %tmp10, align 11028 %tmp12 = zext <2 x i8> %wide.load17 to <2 x i32>1029 %tmp13 = mul nuw nsw <2 x i32> %tmp12, %tmp81030 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1031 store <2 x i32> %tmp13, ptr %tmp14, align 41032 ret void1033}1034 1035; %val1 = load <2 x i16>1036; %op1 = sext<2 x i32> %val11037; %val2 = load <2 x i16>1038; %op2 = sext<2 x i32> %val21039; %rst = mul <2 x i32> %op1, %op21040;1041define void @mul_2xi16_sext(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {1042; X86-SSE-LABEL: mul_2xi16_sext:1043; X86-SSE: # %bb.0: # %entry1044; X86-SSE-NEXT: pushl %esi1045; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1046; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1047; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx1048; X86-SSE-NEXT: movl c, %esi1049; X86-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1050; X86-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero1051; X86-SSE-NEXT: pxor %xmm2, %xmm21052; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]1053; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,3,4,5,6,7]1054; X86-SSE-NEXT: pmaddwd %xmm0, %xmm11055; X86-SSE-NEXT: movq %xmm1, (%esi,%ecx,4)1056; X86-SSE-NEXT: popl %esi1057; X86-SSE-NEXT: retl1058;1059; X86-AVX-LABEL: mul_2xi16_sext:1060; X86-AVX: # %bb.0: # %entry1061; X86-AVX-NEXT: pushl %esi1062; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1063; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1064; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx1065; X86-AVX-NEXT: movl c, %esi1066; X86-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1067; X86-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1068; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1069; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero1070; X86-AVX-NEXT: vpmaddwd %xmm0, %xmm1, %xmm01071; X86-AVX-NEXT: vmovq %xmm0, (%esi,%ecx,4)1072; X86-AVX-NEXT: popl %esi1073; X86-AVX-NEXT: retl1074;1075; X64-SSE-LABEL: mul_2xi16_sext:1076; X64-SSE: # %bb.0: # %entry1077; X64-SSE-NEXT: movq c(%rip), %rax1078; X64-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1079; X64-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero1080; X64-SSE-NEXT: pxor %xmm2, %xmm21081; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]1082; X64-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,3,4,5,6,7]1083; X64-SSE-NEXT: pmaddwd %xmm0, %xmm11084; X64-SSE-NEXT: movq %xmm1, (%rax,%rdx,4)1085; X64-SSE-NEXT: retq1086;1087; X64-AVX-LABEL: mul_2xi16_sext:1088; X64-AVX: # %bb.0: # %entry1089; X64-AVX-NEXT: movq c(%rip), %rax1090; X64-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1091; X64-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1092; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1093; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero1094; X64-AVX-NEXT: vpmaddwd %xmm0, %xmm1, %xmm01095; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rdx,4)1096; X64-AVX-NEXT: retq1097entry:1098 %pre = load ptr, ptr @c1099 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1100 %wide.load = load <2 x i16>, ptr %tmp6, align 11101 %tmp8 = sext <2 x i16> %wide.load to <2 x i32>1102 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index1103 %wide.load17 = load <2 x i16>, ptr %tmp10, align 11104 %tmp12 = sext <2 x i16> %wide.load17 to <2 x i32>1105 %tmp13 = mul nuw nsw <2 x i32> %tmp12, %tmp81106 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1107 store <2 x i32> %tmp13, ptr %tmp14, align 41108 ret void1109}1110 1111; %val1 = load <2 x i16>1112; %op1 = sext<2 x i32> %val11113; %val2 = load <2 x i16>1114; %op2 = zext<2 x i32> %val21115; %rst = mul <2 x i32> %op1, %op21116;1117define void @mul_2xi16_sext_zext(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {1118; X86-SSE-LABEL: mul_2xi16_sext_zext:1119; X86-SSE: # %bb.0: # %entry1120; X86-SSE-NEXT: pushl %esi1121; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx1122; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1123; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi1124; X86-SSE-NEXT: movl c, %ecx1125; X86-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1126; X86-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]1127; X86-SSE-NEXT: psrad $16, %xmm01128; X86-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero1129; X86-SSE-NEXT: pxor %xmm2, %xmm21130; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]1131; X86-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]1132; X86-SSE-NEXT: pmuludq %xmm0, %xmm11133; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1134; X86-SSE-NEXT: pmuludq %xmm2, %xmm01135; X86-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1136; X86-SSE-NEXT: movq %xmm1, (%ecx,%eax,4)1137; X86-SSE-NEXT: popl %esi1138; X86-SSE-NEXT: retl1139;1140; X86-AVX-LABEL: mul_2xi16_sext_zext:1141; X86-AVX: # %bb.0: # %entry1142; X86-AVX-NEXT: pushl %esi1143; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1144; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1145; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx1146; X86-AVX-NEXT: movl c, %esi1147; X86-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1148; X86-AVX-NEXT: vpmovsxwd %xmm0, %xmm01149; X86-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1150; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero1151; X86-AVX-NEXT: vpmulld %xmm0, %xmm1, %xmm01152; X86-AVX-NEXT: vmovq %xmm0, (%esi,%ecx,4)1153; X86-AVX-NEXT: popl %esi1154; X86-AVX-NEXT: retl1155;1156; X64-SSE-LABEL: mul_2xi16_sext_zext:1157; X64-SSE: # %bb.0: # %entry1158; X64-SSE-NEXT: movq c(%rip), %rax1159; X64-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1160; X64-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]1161; X64-SSE-NEXT: psrad $16, %xmm01162; X64-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero1163; X64-SSE-NEXT: pxor %xmm2, %xmm21164; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]1165; X64-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]1166; X64-SSE-NEXT: pmuludq %xmm0, %xmm11167; X64-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1168; X64-SSE-NEXT: pmuludq %xmm2, %xmm01169; X64-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1170; X64-SSE-NEXT: movq %xmm1, (%rax,%rdx,4)1171; X64-SSE-NEXT: retq1172;1173; X64-AVX-LABEL: mul_2xi16_sext_zext:1174; X64-AVX: # %bb.0: # %entry1175; X64-AVX-NEXT: movq c(%rip), %rax1176; X64-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1177; X64-AVX-NEXT: vpmovsxwd %xmm0, %xmm01178; X64-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1179; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero1180; X64-AVX-NEXT: vpmulld %xmm0, %xmm1, %xmm01181; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rdx,4)1182; X64-AVX-NEXT: retq1183entry:1184 %pre = load ptr, ptr @c1185 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1186 %wide.load = load <2 x i16>, ptr %tmp6, align 11187 %tmp8 = sext <2 x i16> %wide.load to <2 x i32>1188 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index1189 %wide.load17 = load <2 x i16>, ptr %tmp10, align 11190 %tmp12 = zext <2 x i16> %wide.load17 to <2 x i32>1191 %tmp13 = mul nuw nsw <2 x i32> %tmp12, %tmp81192 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1193 store <2 x i32> %tmp13, ptr %tmp14, align 41194 ret void1195}1196 1197; %val1 = load <16 x i16>1198; %op1 = sext<16 x i32> %val11199; %val2 = load <16 x i16>1200; %op2 = sext<16 x i32> %val21201; %rst = mul <16 x i32> %op1, %op21202;1203define void @mul_16xi16_sext(ptr nocapture readonly %a, ptr nocapture readonly %b, i64 %index) nounwind {1204; X86-SSE-LABEL: mul_16xi16_sext:1205; X86-SSE: # %bb.0: # %entry1206; X86-SSE-NEXT: pushl %esi1207; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx1208; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1209; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi1210; X86-SSE-NEXT: movl c, %ecx1211; X86-SSE-NEXT: movdqu (%esi,%eax), %xmm21212; X86-SSE-NEXT: movdqu 16(%esi,%eax), %xmm31213; X86-SSE-NEXT: movdqu (%edx,%eax), %xmm01214; X86-SSE-NEXT: movdqu 16(%edx,%eax), %xmm11215; X86-SSE-NEXT: movdqa %xmm0, %xmm41216; X86-SSE-NEXT: pmulhw %xmm2, %xmm41217; X86-SSE-NEXT: pmullw %xmm2, %xmm01218; X86-SSE-NEXT: movdqa %xmm0, %xmm21219; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]1220; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]1221; X86-SSE-NEXT: movdqa %xmm1, %xmm41222; X86-SSE-NEXT: pmulhw %xmm3, %xmm41223; X86-SSE-NEXT: pmullw %xmm3, %xmm11224; X86-SSE-NEXT: movdqa %xmm1, %xmm31225; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]1226; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]1227; X86-SSE-NEXT: movdqu %xmm1, 32(%ecx,%eax,4)1228; X86-SSE-NEXT: movdqu %xmm3, 48(%ecx,%eax,4)1229; X86-SSE-NEXT: movdqu %xmm0, (%ecx,%eax,4)1230; X86-SSE-NEXT: movdqu %xmm2, 16(%ecx,%eax,4)1231; X86-SSE-NEXT: popl %esi1232; X86-SSE-NEXT: retl1233;1234; X86-AVX1-LABEL: mul_16xi16_sext:1235; X86-AVX1: # %bb.0: # %entry1236; X86-AVX1-NEXT: pushl %esi1237; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %edx1238; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax1239; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %esi1240; X86-AVX1-NEXT: movl c, %ecx1241; X86-AVX1-NEXT: vpmovsxwd 24(%esi,%eax), %xmm01242; X86-AVX1-NEXT: vpmovsxwd 16(%esi,%eax), %xmm11243; X86-AVX1-NEXT: vpmovsxwd 8(%esi,%eax), %xmm21244; X86-AVX1-NEXT: vpmovsxwd (%esi,%eax), %xmm31245; X86-AVX1-NEXT: vpmovsxwd 24(%edx,%eax), %xmm41246; X86-AVX1-NEXT: vpmulld %xmm0, %xmm4, %xmm01247; X86-AVX1-NEXT: vpmovsxwd 16(%edx,%eax), %xmm41248; X86-AVX1-NEXT: vpmulld %xmm1, %xmm4, %xmm11249; X86-AVX1-NEXT: vpmovsxwd 8(%edx,%eax), %xmm41250; X86-AVX1-NEXT: vpmulld %xmm2, %xmm4, %xmm21251; X86-AVX1-NEXT: vpmovsxwd (%edx,%eax), %xmm41252; X86-AVX1-NEXT: vpmulld %xmm3, %xmm4, %xmm31253; X86-AVX1-NEXT: vmovdqu %xmm0, 48(%ecx,%eax,4)1254; X86-AVX1-NEXT: vmovdqu %xmm1, 32(%ecx,%eax,4)1255; X86-AVX1-NEXT: vmovdqu %xmm2, 16(%ecx,%eax,4)1256; X86-AVX1-NEXT: vmovdqu %xmm3, (%ecx,%eax,4)1257; X86-AVX1-NEXT: popl %esi1258; X86-AVX1-NEXT: retl1259;1260; X86-AVX2-LABEL: mul_16xi16_sext:1261; X86-AVX2: # %bb.0: # %entry1262; X86-AVX2-NEXT: pushl %esi1263; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax1264; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx1265; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %edx1266; X86-AVX2-NEXT: movl c, %esi1267; X86-AVX2-NEXT: vpmovsxwd 16(%edx,%ecx), %ymm01268; X86-AVX2-NEXT: vpmovsxwd (%edx,%ecx), %ymm11269; X86-AVX2-NEXT: vpmovsxwd 16(%eax,%ecx), %ymm21270; X86-AVX2-NEXT: vpmulld %ymm0, %ymm2, %ymm01271; X86-AVX2-NEXT: vpmovsxwd (%eax,%ecx), %ymm21272; X86-AVX2-NEXT: vpmulld %ymm1, %ymm2, %ymm11273; X86-AVX2-NEXT: vmovdqu %ymm0, 32(%esi,%ecx,4)1274; X86-AVX2-NEXT: vmovdqu %ymm1, (%esi,%ecx,4)1275; X86-AVX2-NEXT: popl %esi1276; X86-AVX2-NEXT: vzeroupper1277; X86-AVX2-NEXT: retl1278;1279; X64-SSE-LABEL: mul_16xi16_sext:1280; X64-SSE: # %bb.0: # %entry1281; X64-SSE-NEXT: movq c(%rip), %rax1282; X64-SSE-NEXT: movdqu (%rdi,%rdx), %xmm01283; X64-SSE-NEXT: movdqu 16(%rdi,%rdx), %xmm11284; X64-SSE-NEXT: movdqu (%rsi,%rdx), %xmm21285; X64-SSE-NEXT: movdqu 16(%rsi,%rdx), %xmm31286; X64-SSE-NEXT: movdqa %xmm2, %xmm41287; X64-SSE-NEXT: pmulhw %xmm0, %xmm41288; X64-SSE-NEXT: pmullw %xmm0, %xmm21289; X64-SSE-NEXT: movdqa %xmm2, %xmm01290; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]1291; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]1292; X64-SSE-NEXT: movdqa %xmm3, %xmm41293; X64-SSE-NEXT: pmulhw %xmm1, %xmm41294; X64-SSE-NEXT: pmullw %xmm1, %xmm31295; X64-SSE-NEXT: movdqa %xmm3, %xmm11296; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]1297; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]1298; X64-SSE-NEXT: movdqu %xmm3, 32(%rax,%rdx,4)1299; X64-SSE-NEXT: movdqu %xmm1, 48(%rax,%rdx,4)1300; X64-SSE-NEXT: movdqu %xmm2, (%rax,%rdx,4)1301; X64-SSE-NEXT: movdqu %xmm0, 16(%rax,%rdx,4)1302; X64-SSE-NEXT: retq1303;1304; X64-AVX1-LABEL: mul_16xi16_sext:1305; X64-AVX1: # %bb.0: # %entry1306; X64-AVX1-NEXT: movq c(%rip), %rax1307; X64-AVX1-NEXT: vpmovsxwd 24(%rdi,%rdx), %xmm01308; X64-AVX1-NEXT: vpmovsxwd 16(%rdi,%rdx), %xmm11309; X64-AVX1-NEXT: vpmovsxwd 8(%rdi,%rdx), %xmm21310; X64-AVX1-NEXT: vpmovsxwd (%rdi,%rdx), %xmm31311; X64-AVX1-NEXT: vpmovsxwd 24(%rsi,%rdx), %xmm41312; X64-AVX1-NEXT: vpmulld %xmm0, %xmm4, %xmm01313; X64-AVX1-NEXT: vpmovsxwd 16(%rsi,%rdx), %xmm41314; X64-AVX1-NEXT: vpmulld %xmm1, %xmm4, %xmm11315; X64-AVX1-NEXT: vpmovsxwd 8(%rsi,%rdx), %xmm41316; X64-AVX1-NEXT: vpmulld %xmm2, %xmm4, %xmm21317; X64-AVX1-NEXT: vpmovsxwd (%rsi,%rdx), %xmm41318; X64-AVX1-NEXT: vpmulld %xmm3, %xmm4, %xmm31319; X64-AVX1-NEXT: vmovdqu %xmm0, 48(%rax,%rdx,4)1320; X64-AVX1-NEXT: vmovdqu %xmm1, 32(%rax,%rdx,4)1321; X64-AVX1-NEXT: vmovdqu %xmm2, 16(%rax,%rdx,4)1322; X64-AVX1-NEXT: vmovdqu %xmm3, (%rax,%rdx,4)1323; X64-AVX1-NEXT: retq1324;1325; X64-AVX2-LABEL: mul_16xi16_sext:1326; X64-AVX2: # %bb.0: # %entry1327; X64-AVX2-NEXT: movq c(%rip), %rax1328; X64-AVX2-NEXT: vpmovsxwd 16(%rdi,%rdx), %ymm01329; X64-AVX2-NEXT: vpmovsxwd (%rdi,%rdx), %ymm11330; X64-AVX2-NEXT: vpmovsxwd 16(%rsi,%rdx), %ymm21331; X64-AVX2-NEXT: vpmulld %ymm0, %ymm2, %ymm01332; X64-AVX2-NEXT: vpmovsxwd (%rsi,%rdx), %ymm21333; X64-AVX2-NEXT: vpmulld %ymm1, %ymm2, %ymm11334; X64-AVX2-NEXT: vmovdqu %ymm0, 32(%rax,%rdx,4)1335; X64-AVX2-NEXT: vmovdqu %ymm1, (%rax,%rdx,4)1336; X64-AVX2-NEXT: vzeroupper1337; X64-AVX2-NEXT: retq1338entry:1339 %pre = load ptr, ptr @c1340 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1341 %wide.load = load <16 x i16>, ptr %tmp6, align 11342 %tmp8 = sext <16 x i16> %wide.load to <16 x i32>1343 %tmp10 = getelementptr inbounds i8, ptr %b, i64 %index1344 %wide.load17 = load <16 x i16>, ptr %tmp10, align 11345 %tmp12 = sext <16 x i16> %wide.load17 to <16 x i32>1346 %tmp13 = mul nuw nsw <16 x i32> %tmp12, %tmp81347 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1348 store <16 x i32> %tmp13, ptr %tmp14, align 41349 ret void1350}1351 1352; %val = load <2 x i8>1353; %op1 = zext<2 x i32> %val1354; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (0 ~ 255)1355; %rst = mul <2 x i32> %op1, %op21356;1357define void @mul_2xi8_varconst1(ptr nocapture readonly %a, i64 %index) {1358; X86-SSE-LABEL: mul_2xi8_varconst1:1359; X86-SSE: # %bb.0: # %entry1360; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1361; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1362; X86-SSE-NEXT: movl c, %edx1363; X86-SSE-NEXT: movzwl (%ecx,%eax), %ecx1364; X86-SSE-NEXT: movd %ecx, %xmm01365; X86-SSE-NEXT: pxor %xmm1, %xmm11366; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1367; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1368; X86-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [0,0,255,0,u,u,u,u]1369; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1370; X86-SSE-NEXT: retl1371;1372; X86-AVX-LABEL: mul_2xi8_varconst1:1373; X86-AVX: # %bb.0: # %entry1374; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1375; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1376; X86-AVX-NEXT: movl c, %edx1377; X86-AVX-NEXT: movzwl (%ecx,%eax), %ecx1378; X86-AVX-NEXT: vmovd %ecx, %xmm01379; X86-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1380; X86-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [0,0,255,0,u,u,u,u]1381; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1382; X86-AVX-NEXT: retl1383;1384; X64-SSE-LABEL: mul_2xi8_varconst1:1385; X64-SSE: # %bb.0: # %entry1386; X64-SSE-NEXT: movq c(%rip), %rax1387; X64-SSE-NEXT: movzwl (%rdi,%rsi), %ecx1388; X64-SSE-NEXT: movd %ecx, %xmm01389; X64-SSE-NEXT: pxor %xmm1, %xmm11390; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1391; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1392; X64-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,0,255,0,u,u,u,u]1393; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1394; X64-SSE-NEXT: retq1395;1396; X64-AVX-LABEL: mul_2xi8_varconst1:1397; X64-AVX: # %bb.0: # %entry1398; X64-AVX-NEXT: movq c(%rip), %rax1399; X64-AVX-NEXT: movzwl (%rdi,%rsi), %ecx1400; X64-AVX-NEXT: vmovd %ecx, %xmm01401; X64-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1402; X64-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,0,255,0,u,u,u,u]1403; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1404; X64-AVX-NEXT: retq1405entry:1406 %pre = load ptr, ptr @c1407 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1408 %wide.load = load <2 x i8>, ptr %tmp6, align 11409 %tmp8 = zext <2 x i8> %wide.load to <2 x i32>1410 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 0, i32 255>1411 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1412 store <2 x i32> %tmp13, ptr %tmp14, align 41413 ret void1414}1415 1416; %val = load <2 x i8>1417; %op1 = sext<2 x i32> %val1418; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (-128 ~ 127)1419; %rst = mul <2 x i32> %op1, %op21420;1421define void @mul_2xi8_varconst2(ptr nocapture readonly %a, i64 %index) {1422; X86-SSE-LABEL: mul_2xi8_varconst2:1423; X86-SSE: # %bb.0: # %entry1424; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1425; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1426; X86-SSE-NEXT: movl c, %edx1427; X86-SSE-NEXT: movzwl (%ecx,%eax), %ecx1428; X86-SSE-NEXT: movd %ecx, %xmm01429; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1430; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1431; X86-SSE-NEXT: psrad $24, %xmm01432; X86-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [65408,0,127,0,u,u,u,u]1433; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1434; X86-SSE-NEXT: retl1435;1436; X86-AVX-LABEL: mul_2xi8_varconst2:1437; X86-AVX: # %bb.0: # %entry1438; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1439; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1440; X86-AVX-NEXT: movl c, %edx1441; X86-AVX-NEXT: movzwl (%ecx,%eax), %ecx1442; X86-AVX-NEXT: vmovd %ecx, %xmm01443; X86-AVX-NEXT: vpmovsxbd %xmm0, %xmm01444; X86-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [65408,0,127,0,u,u,u,u]1445; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1446; X86-AVX-NEXT: retl1447;1448; X64-SSE-LABEL: mul_2xi8_varconst2:1449; X64-SSE: # %bb.0: # %entry1450; X64-SSE-NEXT: movq c(%rip), %rax1451; X64-SSE-NEXT: movzwl (%rdi,%rsi), %ecx1452; X64-SSE-NEXT: movd %ecx, %xmm01453; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1454; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1455; X64-SSE-NEXT: psrad $24, %xmm01456; X64-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [65408,0,127,0,u,u,u,u]1457; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1458; X64-SSE-NEXT: retq1459;1460; X64-AVX-LABEL: mul_2xi8_varconst2:1461; X64-AVX: # %bb.0: # %entry1462; X64-AVX-NEXT: movq c(%rip), %rax1463; X64-AVX-NEXT: movzwl (%rdi,%rsi), %ecx1464; X64-AVX-NEXT: vmovd %ecx, %xmm01465; X64-AVX-NEXT: vpmovsxbd %xmm0, %xmm01466; X64-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [65408,0,127,0,u,u,u,u]1467; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1468; X64-AVX-NEXT: retq1469entry:1470 %pre = load ptr, ptr @c1471 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1472 %wide.load = load <2 x i8>, ptr %tmp6, align 11473 %tmp8 = sext <2 x i8> %wide.load to <2 x i32>1474 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 -128, i32 127>1475 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1476 store <2 x i32> %tmp13, ptr %tmp14, align 41477 ret void1478}1479 1480; %val = load <2 x i8>1481; %op1 = zext<2 x i32> %val1482; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (0 ~ 256)1483; %rst = mul <2 x i32> %op1, %op21484;1485define void @mul_2xi8_varconst3(ptr nocapture readonly %a, i64 %index) {1486; X86-SSE-LABEL: mul_2xi8_varconst3:1487; X86-SSE: # %bb.0: # %entry1488; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1489; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1490; X86-SSE-NEXT: movl c, %edx1491; X86-SSE-NEXT: movzwl (%ecx,%eax), %ecx1492; X86-SSE-NEXT: movd %ecx, %xmm01493; X86-SSE-NEXT: pxor %xmm1, %xmm11494; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1495; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1496; X86-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [0,0,256,0,u,u,u,u]1497; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1498; X86-SSE-NEXT: retl1499;1500; X86-AVX-LABEL: mul_2xi8_varconst3:1501; X86-AVX: # %bb.0: # %entry1502; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1503; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1504; X86-AVX-NEXT: movl c, %edx1505; X86-AVX-NEXT: movzwl (%ecx,%eax), %ecx1506; X86-AVX-NEXT: vmovd %ecx, %xmm01507; X86-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1508; X86-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [0,0,256,0,u,u,u,u]1509; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1510; X86-AVX-NEXT: retl1511;1512; X64-SSE-LABEL: mul_2xi8_varconst3:1513; X64-SSE: # %bb.0: # %entry1514; X64-SSE-NEXT: movq c(%rip), %rax1515; X64-SSE-NEXT: movzwl (%rdi,%rsi), %ecx1516; X64-SSE-NEXT: movd %ecx, %xmm01517; X64-SSE-NEXT: pxor %xmm1, %xmm11518; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1519; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1520; X64-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,0,256,0,u,u,u,u]1521; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1522; X64-SSE-NEXT: retq1523;1524; X64-AVX-LABEL: mul_2xi8_varconst3:1525; X64-AVX: # %bb.0: # %entry1526; X64-AVX-NEXT: movq c(%rip), %rax1527; X64-AVX-NEXT: movzwl (%rdi,%rsi), %ecx1528; X64-AVX-NEXT: vmovd %ecx, %xmm01529; X64-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1530; X64-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,0,256,0,u,u,u,u]1531; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1532; X64-AVX-NEXT: retq1533entry:1534 %pre = load ptr, ptr @c1535 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1536 %wide.load = load <2 x i8>, ptr %tmp6, align 11537 %tmp8 = zext <2 x i8> %wide.load to <2 x i32>1538 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 0, i32 256>1539 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1540 store <2 x i32> %tmp13, ptr %tmp14, align 41541 ret void1542}1543 1544; %val = load <2 x i8>1545; %op1 = zext<2 x i32> %val1546; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (-1 ~ 255)1547; %rst = mul <2 x i32> %op1, %op21548;1549define void @mul_2xi8_varconst4(ptr nocapture readonly %a, i64 %index) {1550; X86-SSE-LABEL: mul_2xi8_varconst4:1551; X86-SSE: # %bb.0: # %entry1552; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1553; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1554; X86-SSE-NEXT: movl c, %edx1555; X86-SSE-NEXT: movzwl (%ecx,%eax), %ecx1556; X86-SSE-NEXT: movd %ecx, %xmm01557; X86-SSE-NEXT: pxor %xmm1, %xmm11558; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1559; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1560; X86-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [65535,0,255,0,u,u,u,u]1561; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1562; X86-SSE-NEXT: retl1563;1564; X86-AVX-LABEL: mul_2xi8_varconst4:1565; X86-AVX: # %bb.0: # %entry1566; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1567; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1568; X86-AVX-NEXT: movl c, %edx1569; X86-AVX-NEXT: movzwl (%ecx,%eax), %ecx1570; X86-AVX-NEXT: vmovd %ecx, %xmm01571; X86-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1572; X86-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [65535,0,255,0,u,u,u,u]1573; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1574; X86-AVX-NEXT: retl1575;1576; X64-SSE-LABEL: mul_2xi8_varconst4:1577; X64-SSE: # %bb.0: # %entry1578; X64-SSE-NEXT: movq c(%rip), %rax1579; X64-SSE-NEXT: movzwl (%rdi,%rsi), %ecx1580; X64-SSE-NEXT: movd %ecx, %xmm01581; X64-SSE-NEXT: pxor %xmm1, %xmm11582; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1583; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1584; X64-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [65535,0,255,0,u,u,u,u]1585; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1586; X64-SSE-NEXT: retq1587;1588; X64-AVX-LABEL: mul_2xi8_varconst4:1589; X64-AVX: # %bb.0: # %entry1590; X64-AVX-NEXT: movq c(%rip), %rax1591; X64-AVX-NEXT: movzwl (%rdi,%rsi), %ecx1592; X64-AVX-NEXT: vmovd %ecx, %xmm01593; X64-AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1594; X64-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [65535,0,255,0,u,u,u,u]1595; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1596; X64-AVX-NEXT: retq1597entry:1598 %pre = load ptr, ptr @c1599 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1600 %wide.load = load <2 x i8>, ptr %tmp6, align 11601 %tmp8 = zext <2 x i8> %wide.load to <2 x i32>1602 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 -1, i32 255>1603 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1604 store <2 x i32> %tmp13, ptr %tmp14, align 41605 ret void1606}1607 1608; %val = load <2 x i8>1609; %op1 = sext<2 x i32> %val1610; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (-129 ~ 127)1611; %rst = mul <2 x i32> %op1, %op21612;1613define void @mul_2xi8_varconst5(ptr nocapture readonly %a, i64 %index) {1614; X86-SSE-LABEL: mul_2xi8_varconst5:1615; X86-SSE: # %bb.0: # %entry1616; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1617; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1618; X86-SSE-NEXT: movl c, %edx1619; X86-SSE-NEXT: movzwl (%ecx,%eax), %ecx1620; X86-SSE-NEXT: movd %ecx, %xmm01621; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1622; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1623; X86-SSE-NEXT: psrad $24, %xmm01624; X86-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [65407,0,127,0,u,u,u,u]1625; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1626; X86-SSE-NEXT: retl1627;1628; X86-AVX-LABEL: mul_2xi8_varconst5:1629; X86-AVX: # %bb.0: # %entry1630; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1631; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1632; X86-AVX-NEXT: movl c, %edx1633; X86-AVX-NEXT: movzwl (%ecx,%eax), %ecx1634; X86-AVX-NEXT: vmovd %ecx, %xmm01635; X86-AVX-NEXT: vpmovsxbd %xmm0, %xmm01636; X86-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [65407,0,127,0,u,u,u,u]1637; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1638; X86-AVX-NEXT: retl1639;1640; X64-SSE-LABEL: mul_2xi8_varconst5:1641; X64-SSE: # %bb.0: # %entry1642; X64-SSE-NEXT: movq c(%rip), %rax1643; X64-SSE-NEXT: movzwl (%rdi,%rsi), %ecx1644; X64-SSE-NEXT: movd %ecx, %xmm01645; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1646; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1647; X64-SSE-NEXT: psrad $24, %xmm01648; X64-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [65407,0,127,0,u,u,u,u]1649; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1650; X64-SSE-NEXT: retq1651;1652; X64-AVX-LABEL: mul_2xi8_varconst5:1653; X64-AVX: # %bb.0: # %entry1654; X64-AVX-NEXT: movq c(%rip), %rax1655; X64-AVX-NEXT: movzwl (%rdi,%rsi), %ecx1656; X64-AVX-NEXT: vmovd %ecx, %xmm01657; X64-AVX-NEXT: vpmovsxbd %xmm0, %xmm01658; X64-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [65407,0,127,0,u,u,u,u]1659; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1660; X64-AVX-NEXT: retq1661entry:1662 %pre = load ptr, ptr @c1663 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1664 %wide.load = load <2 x i8>, ptr %tmp6, align 11665 %tmp8 = sext <2 x i8> %wide.load to <2 x i32>1666 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 -129, i32 127>1667 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1668 store <2 x i32> %tmp13, ptr %tmp14, align 41669 ret void1670}1671 1672; %val = load <2 x i8>1673; %op1 = sext<2 x i32> %val1674; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (-128 ~ 128)1675; %rst = mul <2 x i32> %op1, %op21676;1677define void @mul_2xi8_varconst6(ptr nocapture readonly %a, i64 %index) {1678; X86-SSE-LABEL: mul_2xi8_varconst6:1679; X86-SSE: # %bb.0: # %entry1680; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1681; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1682; X86-SSE-NEXT: movl c, %edx1683; X86-SSE-NEXT: movzwl (%ecx,%eax), %ecx1684; X86-SSE-NEXT: movd %ecx, %xmm01685; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1686; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1687; X86-SSE-NEXT: psrad $24, %xmm01688; X86-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [65408,0,128,0,u,u,u,u]1689; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1690; X86-SSE-NEXT: retl1691;1692; X86-AVX-LABEL: mul_2xi8_varconst6:1693; X86-AVX: # %bb.0: # %entry1694; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1695; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1696; X86-AVX-NEXT: movl c, %edx1697; X86-AVX-NEXT: movzwl (%ecx,%eax), %ecx1698; X86-AVX-NEXT: vmovd %ecx, %xmm01699; X86-AVX-NEXT: vpmovsxbd %xmm0, %xmm01700; X86-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [65408,0,128,0,u,u,u,u]1701; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1702; X86-AVX-NEXT: retl1703;1704; X64-SSE-LABEL: mul_2xi8_varconst6:1705; X64-SSE: # %bb.0: # %entry1706; X64-SSE-NEXT: movq c(%rip), %rax1707; X64-SSE-NEXT: movzwl (%rdi,%rsi), %ecx1708; X64-SSE-NEXT: movd %ecx, %xmm01709; X64-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1710; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1711; X64-SSE-NEXT: psrad $24, %xmm01712; X64-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [65408,0,128,0,u,u,u,u]1713; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1714; X64-SSE-NEXT: retq1715;1716; X64-AVX-LABEL: mul_2xi8_varconst6:1717; X64-AVX: # %bb.0: # %entry1718; X64-AVX-NEXT: movq c(%rip), %rax1719; X64-AVX-NEXT: movzwl (%rdi,%rsi), %ecx1720; X64-AVX-NEXT: vmovd %ecx, %xmm01721; X64-AVX-NEXT: vpmovsxbd %xmm0, %xmm01722; X64-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [65408,0,128,0,u,u,u,u]1723; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1724; X64-AVX-NEXT: retq1725entry:1726 %pre = load ptr, ptr @c1727 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1728 %wide.load = load <2 x i8>, ptr %tmp6, align 11729 %tmp8 = sext <2 x i8> %wide.load to <2 x i32>1730 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 -128, i32 128>1731 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1732 store <2 x i32> %tmp13, ptr %tmp14, align 41733 ret void1734}1735 1736; %val = load <2 x i16>1737; %op1 = zext<2 x i32> %val1738; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (0 ~ 65535)1739; %rst = mul <2 x i32> %op1, %op21740;1741define void @mul_2xi16_varconst1(ptr nocapture readonly %a, i64 %index) {1742; X86-SSE-LABEL: mul_2xi16_varconst1:1743; X86-SSE: # %bb.0: # %entry1744; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1745; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1746; X86-SSE-NEXT: movl c, %edx1747; X86-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1748; X86-SSE-NEXT: movd {{.*#+}} xmm1 = [0,65535,0,0,0,0,0,0]1749; X86-SSE-NEXT: movdqa %xmm0, %xmm21750; X86-SSE-NEXT: pmulhuw %xmm1, %xmm21751; X86-SSE-NEXT: pmullw %xmm1, %xmm01752; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]1753; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1754; X86-SSE-NEXT: retl1755;1756; X86-AVX-LABEL: mul_2xi16_varconst1:1757; X86-AVX: # %bb.0: # %entry1758; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1759; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1760; X86-AVX-NEXT: movl c, %edx1761; X86-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1762; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1763; X86-AVX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [0,65535,u,u]1764; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1765; X86-AVX-NEXT: retl1766;1767; X64-SSE-LABEL: mul_2xi16_varconst1:1768; X64-SSE: # %bb.0: # %entry1769; X64-SSE-NEXT: movq c(%rip), %rax1770; X64-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1771; X64-SSE-NEXT: movd {{.*#+}} xmm1 = [0,65535,0,0,0,0,0,0]1772; X64-SSE-NEXT: movdqa %xmm0, %xmm21773; X64-SSE-NEXT: pmulhuw %xmm1, %xmm21774; X64-SSE-NEXT: pmullw %xmm1, %xmm01775; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]1776; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1777; X64-SSE-NEXT: retq1778;1779; X64-AVX-LABEL: mul_2xi16_varconst1:1780; X64-AVX: # %bb.0: # %entry1781; X64-AVX-NEXT: movq c(%rip), %rax1782; X64-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1783; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1784; X64-AVX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,65535,u,u]1785; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1786; X64-AVX-NEXT: retq1787entry:1788 %pre = load ptr, ptr @c1789 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1790 %wide.load = load <2 x i16>, ptr %tmp6, align 11791 %tmp8 = zext <2 x i16> %wide.load to <2 x i32>1792 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 0, i32 65535>1793 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1794 store <2 x i32> %tmp13, ptr %tmp14, align 41795 ret void1796}1797 1798; %val = load <2 x i16>1799; %op1 = sext<2 x i32> %val1800; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (-32768 ~ 32767)1801; %rst = mul <2 x i32> %op1, %op21802;1803define void @mul_2xi16_varconst2(ptr nocapture readonly %a, i64 %index) {1804; X86-SSE-LABEL: mul_2xi16_varconst2:1805; X86-SSE: # %bb.0: # %entry1806; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1807; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1808; X86-SSE-NEXT: movl c, %edx1809; X86-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1810; X86-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,1,3,4,5,6,7]1811; X86-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [32768,0,32767,0,u,u,u,u]1812; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1813; X86-SSE-NEXT: retl1814;1815; X86-AVX-LABEL: mul_2xi16_varconst2:1816; X86-AVX: # %bb.0: # %entry1817; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1818; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1819; X86-AVX-NEXT: movl c, %edx1820; X86-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1821; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1822; X86-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [32768,0,32767,0,u,u,u,u]1823; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1824; X86-AVX-NEXT: retl1825;1826; X64-SSE-LABEL: mul_2xi16_varconst2:1827; X64-SSE: # %bb.0: # %entry1828; X64-SSE-NEXT: movq c(%rip), %rax1829; X64-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1830; X64-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,1,3,4,5,6,7]1831; X64-SSE-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [32768,0,32767,0,u,u,u,u]1832; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1833; X64-SSE-NEXT: retq1834;1835; X64-AVX-LABEL: mul_2xi16_varconst2:1836; X64-AVX: # %bb.0: # %entry1837; X64-AVX-NEXT: movq c(%rip), %rax1838; X64-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1839; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1840; X64-AVX-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32768,0,32767,0,u,u,u,u]1841; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1842; X64-AVX-NEXT: retq1843entry:1844 %pre = load ptr, ptr @c1845 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1846 %wide.load = load <2 x i16>, ptr %tmp6, align 11847 %tmp8 = sext <2 x i16> %wide.load to <2 x i32>1848 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 -32768, i32 32767>1849 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1850 store <2 x i32> %tmp13, ptr %tmp14, align 41851 ret void1852}1853 1854; %val = load <2 x i16>1855; %op1 = zext<2 x i32> %val1856; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (0 ~ 65536)1857; %rst = mul <2 x i32> %op1, %op21858;1859define void @mul_2xi16_varconst3(ptr nocapture readonly %a, i64 %index) {1860; X86-SSE-LABEL: mul_2xi16_varconst3:1861; X86-SSE: # %bb.0: # %entry1862; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1863; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1864; X86-SSE-NEXT: movl c, %edx1865; X86-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1866; X86-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,1,1,1,4,5,6,7]1867; X86-SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [65536,65536,65536,65536]1868; X86-SSE-NEXT: psllq $32, %xmm01869; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1870; X86-SSE-NEXT: retl1871;1872; X86-AVX-LABEL: mul_2xi16_varconst3:1873; X86-AVX: # %bb.0: # %entry1874; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1875; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1876; X86-AVX-NEXT: movl c, %edx1877; X86-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1878; X86-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1879; X86-AVX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [0,65536,u,u]1880; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1881; X86-AVX-NEXT: retl1882;1883; X64-SSE-LABEL: mul_2xi16_varconst3:1884; X64-SSE: # %bb.0: # %entry1885; X64-SSE-NEXT: movq c(%rip), %rax1886; X64-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1887; X64-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,1,1,1,4,5,6,7]1888; X64-SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [65536,65536,65536,65536]1889; X64-SSE-NEXT: psllq $32, %xmm01890; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1891; X64-SSE-NEXT: retq1892;1893; X64-AVX-LABEL: mul_2xi16_varconst3:1894; X64-AVX: # %bb.0: # %entry1895; X64-AVX-NEXT: movq c(%rip), %rax1896; X64-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1897; X64-AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1898; X64-AVX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,65536,u,u]1899; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1900; X64-AVX-NEXT: retq1901entry:1902 %pre = load ptr, ptr @c1903 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1904 %wide.load = load <2 x i16>, ptr %tmp6, align 11905 %tmp8 = zext <2 x i16> %wide.load to <2 x i32>1906 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 0, i32 65536>1907 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1908 store <2 x i32> %tmp13, ptr %tmp14, align 41909 ret void1910}1911 1912; %val = load <2 x i16>1913; %op1 = sext<2 x i32> %val1914; %op2 = const <2 x i32> {c1, c2} // c1 and c2 are within (0 ~ 32768)1915; %rst = mul <2 x i32> %op1, %op21916;1917define void @mul_2xi16_varconst4(ptr nocapture readonly %a, i64 %index) {1918; X86-SSE-LABEL: mul_2xi16_varconst4:1919; X86-SSE: # %bb.0: # %entry1920; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1921; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1922; X86-SSE-NEXT: movl c, %edx1923; X86-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1924; X86-SSE-NEXT: psrad $16, %xmm01925; X86-SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [32768,32768,32768,32768]1926; X86-SSE-NEXT: psllq $32, %xmm01927; X86-SSE-NEXT: movq %xmm0, (%edx,%eax,4)1928; X86-SSE-NEXT: retl1929;1930; X86-AVX-LABEL: mul_2xi16_varconst4:1931; X86-AVX: # %bb.0: # %entry1932; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1933; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx1934; X86-AVX-NEXT: movl c, %edx1935; X86-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1936; X86-AVX-NEXT: vpmovsxwd %xmm0, %xmm01937; X86-AVX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [0,32768,u,u]1938; X86-AVX-NEXT: vmovq %xmm0, (%edx,%eax,4)1939; X86-AVX-NEXT: retl1940;1941; X64-SSE-LABEL: mul_2xi16_varconst4:1942; X64-SSE: # %bb.0: # %entry1943; X64-SSE-NEXT: movq c(%rip), %rax1944; X64-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1945; X64-SSE-NEXT: psrad $16, %xmm01946; X64-SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [32768,32768,32768,32768]1947; X64-SSE-NEXT: psllq $32, %xmm01948; X64-SSE-NEXT: movq %xmm0, (%rax,%rsi,4)1949; X64-SSE-NEXT: retq1950;1951; X64-AVX-LABEL: mul_2xi16_varconst4:1952; X64-AVX: # %bb.0: # %entry1953; X64-AVX-NEXT: movq c(%rip), %rax1954; X64-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1955; X64-AVX-NEXT: vpmovsxwd %xmm0, %xmm01956; X64-AVX-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,32768,u,u]1957; X64-AVX-NEXT: vmovq %xmm0, (%rax,%rsi,4)1958; X64-AVX-NEXT: retq1959entry:1960 %pre = load ptr, ptr @c1961 %tmp6 = getelementptr inbounds i8, ptr %a, i64 %index1962 %wide.load = load <2 x i16>, ptr %tmp6, align 11963 %tmp8 = sext <2 x i16> %wide.load to <2 x i32>1964 %tmp13 = mul nuw nsw <2 x i32> %tmp8, <i32 0, i32 32768>1965 %tmp14 = getelementptr inbounds i32, ptr %pre, i64 %index1966 store <2 x i32> %tmp13, ptr %tmp14, align 41967 ret void1968}1969 1970;1971; Illegal Types1972;1973 1974define void @PR34947(ptr %p0, ptr %p1) nounwind {1975; X86-SSE-LABEL: PR34947:1976; X86-SSE: # %bb.0:1977; X86-SSE-NEXT: pushl %ebp1978; X86-SSE-NEXT: pushl %ebx1979; X86-SSE-NEXT: pushl %edi1980; X86-SSE-NEXT: pushl %esi1981; X86-SSE-NEXT: pushl %eax1982; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx1983; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax1984; X86-SSE-NEXT: movzwl 16(%eax), %edx1985; X86-SSE-NEXT: movl %edx, (%esp) # 4-byte Spill1986; X86-SSE-NEXT: movdqa (%eax), %xmm21987; X86-SSE-NEXT: pxor %xmm1, %xmm11988; X86-SSE-NEXT: movdqa %xmm2, %xmm01989; X86-SSE-NEXT: pextrw $7, %xmm2, %eax1990; X86-SSE-NEXT: pextrw $4, %xmm2, %esi1991; X86-SSE-NEXT: pextrw $1, %xmm2, %edi1992; X86-SSE-NEXT: pextrw $0, %xmm2, %ebx1993; X86-SSE-NEXT: pextrw $3, %xmm2, %ebp1994; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]1995; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1996; X86-SSE-NEXT: xorl %edx, %edx1997; X86-SSE-NEXT: divl 28(%ecx)1998; X86-SSE-NEXT: movd %edx, %xmm11999; X86-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]2000; X86-SSE-NEXT: movd %xmm3, %eax2001; X86-SSE-NEXT: xorl %edx, %edx2002; X86-SSE-NEXT: divl 24(%ecx)2003; X86-SSE-NEXT: movd %edx, %xmm32004; X86-SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]2005; X86-SSE-NEXT: movl %esi, %eax2006; X86-SSE-NEXT: xorl %edx, %edx2007; X86-SSE-NEXT: divl 16(%ecx)2008; X86-SSE-NEXT: movd %edx, %xmm12009; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]2010; X86-SSE-NEXT: movd %xmm0, %eax2011; X86-SSE-NEXT: xorl %edx, %edx2012; X86-SSE-NEXT: divl 20(%ecx)2013; X86-SSE-NEXT: movd %edx, %xmm02014; X86-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2015; X86-SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]2016; X86-SSE-NEXT: movl %edi, %eax2017; X86-SSE-NEXT: xorl %edx, %edx2018; X86-SSE-NEXT: divl 4(%ecx)2019; X86-SSE-NEXT: movd %edx, %xmm32020; X86-SSE-NEXT: movl %ebx, %eax2021; X86-SSE-NEXT: xorl %edx, %edx2022; X86-SSE-NEXT: divl (%ecx)2023; X86-SSE-NEXT: movd %edx, %xmm02024; X86-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]2025; X86-SSE-NEXT: movl %ebp, %eax2026; X86-SSE-NEXT: xorl %edx, %edx2027; X86-SSE-NEXT: divl 12(%ecx)2028; X86-SSE-NEXT: movd %edx, %xmm32029; X86-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]2030; X86-SSE-NEXT: movd %xmm2, %eax2031; X86-SSE-NEXT: xorl %edx, %edx2032; X86-SSE-NEXT: divl 8(%ecx)2033; X86-SSE-NEXT: movd %edx, %xmm22034; X86-SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]2035; X86-SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]2036; X86-SSE-NEXT: movl (%esp), %eax # 4-byte Reload2037; X86-SSE-NEXT: xorl %edx, %edx2038; X86-SSE-NEXT: divl 32(%ecx)2039; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [8199,8199,8199,8199]2040; X86-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]2041; X86-SSE-NEXT: pmuludq %xmm2, %xmm02042; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]2043; X86-SSE-NEXT: pmuludq %xmm2, %xmm32044; X86-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]2045; X86-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]2046; X86-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]2047; X86-SSE-NEXT: pmuludq %xmm2, %xmm12048; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]2049; X86-SSE-NEXT: pmuludq %xmm2, %xmm32050; X86-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]2051; X86-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]2052; X86-SSE-NEXT: imull $8199, %edx, %eax # imm = 0x20072053; X86-SSE-NEXT: movl %eax, (%eax)2054; X86-SSE-NEXT: movdqa %xmm1, (%eax)2055; X86-SSE-NEXT: movdqa %xmm0, (%eax)2056; X86-SSE-NEXT: addl $4, %esp2057; X86-SSE-NEXT: popl %esi2058; X86-SSE-NEXT: popl %edi2059; X86-SSE-NEXT: popl %ebx2060; X86-SSE-NEXT: popl %ebp2061; X86-SSE-NEXT: retl2062;2063; X86-AVX1-LABEL: PR34947:2064; X86-AVX1: # %bb.0:2065; X86-AVX1-NEXT: pushl %ebp2066; X86-AVX1-NEXT: pushl %ebx2067; X86-AVX1-NEXT: pushl %edi2068; X86-AVX1-NEXT: pushl %esi2069; X86-AVX1-NEXT: subl $16, %esp2070; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx2071; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax2072; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero2073; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero2074; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero2075; X86-AVX1-NEXT: vmovd %xmm2, %eax2076; X86-AVX1-NEXT: xorl %edx, %edx2077; X86-AVX1-NEXT: divl 32(%ecx)2078; X86-AVX1-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2079; X86-AVX1-NEXT: vpextrd $3, %xmm1, %eax2080; X86-AVX1-NEXT: xorl %edx, %edx2081; X86-AVX1-NEXT: divl 28(%ecx)2082; X86-AVX1-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2083; X86-AVX1-NEXT: vpextrd $2, %xmm1, %eax2084; X86-AVX1-NEXT: xorl %edx, %edx2085; X86-AVX1-NEXT: divl 24(%ecx)2086; X86-AVX1-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2087; X86-AVX1-NEXT: vpextrd $1, %xmm1, %eax2088; X86-AVX1-NEXT: xorl %edx, %edx2089; X86-AVX1-NEXT: divl 20(%ecx)2090; X86-AVX1-NEXT: movl %edx, (%esp) # 4-byte Spill2091; X86-AVX1-NEXT: vmovd %xmm1, %eax2092; X86-AVX1-NEXT: xorl %edx, %edx2093; X86-AVX1-NEXT: divl 16(%ecx)2094; X86-AVX1-NEXT: movl %edx, %ebp2095; X86-AVX1-NEXT: vpextrd $3, %xmm0, %eax2096; X86-AVX1-NEXT: xorl %edx, %edx2097; X86-AVX1-NEXT: divl 12(%ecx)2098; X86-AVX1-NEXT: movl %edx, %ebx2099; X86-AVX1-NEXT: vpextrd $2, %xmm0, %eax2100; X86-AVX1-NEXT: xorl %edx, %edx2101; X86-AVX1-NEXT: divl 8(%ecx)2102; X86-AVX1-NEXT: movl %edx, %esi2103; X86-AVX1-NEXT: vpextrd $1, %xmm0, %eax2104; X86-AVX1-NEXT: xorl %edx, %edx2105; X86-AVX1-NEXT: divl 4(%ecx)2106; X86-AVX1-NEXT: movl %edx, %edi2107; X86-AVX1-NEXT: vmovd %xmm0, %eax2108; X86-AVX1-NEXT: xorl %edx, %edx2109; X86-AVX1-NEXT: divl (%ecx)2110; X86-AVX1-NEXT: vmovd %edx, %xmm02111; X86-AVX1-NEXT: vpinsrd $1, %edi, %xmm0, %xmm02112; X86-AVX1-NEXT: vpinsrd $2, %esi, %xmm0, %xmm02113; X86-AVX1-NEXT: vpinsrd $3, %ebx, %xmm0, %xmm02114; X86-AVX1-NEXT: vmovd %ebp, %xmm12115; X86-AVX1-NEXT: vpinsrd $1, (%esp), %xmm1, %xmm1 # 4-byte Folded Reload2116; X86-AVX1-NEXT: vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload2117; X86-AVX1-NEXT: vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload2118; X86-AVX1-NEXT: imull $8199, {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload2119; X86-AVX1-NEXT: # imm = 0x20072120; X86-AVX1-NEXT: movl %eax, (%eax)2121; X86-AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [8199,8199,8199,8199]2122; X86-AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm02123; X86-AVX1-NEXT: vpmulld %xmm2, %xmm1, %xmm12124; X86-AVX1-NEXT: vmovdqa %xmm1, (%eax)2125; X86-AVX1-NEXT: vmovdqa %xmm0, (%eax)2126; X86-AVX1-NEXT: addl $16, %esp2127; X86-AVX1-NEXT: popl %esi2128; X86-AVX1-NEXT: popl %edi2129; X86-AVX1-NEXT: popl %ebx2130; X86-AVX1-NEXT: popl %ebp2131; X86-AVX1-NEXT: retl2132;2133; X86-AVX2-LABEL: PR34947:2134; X86-AVX2: # %bb.0:2135; X86-AVX2-NEXT: pushl %esi2136; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %esi2137; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax2138; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero2139; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero2140; X86-AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22141; X86-AVX2-NEXT: vpextrd $1, %xmm2, %eax2142; X86-AVX2-NEXT: xorl %edx, %edx2143; X86-AVX2-NEXT: divl 20(%esi)2144; X86-AVX2-NEXT: movl %edx, %ecx2145; X86-AVX2-NEXT: vmovd %xmm2, %eax2146; X86-AVX2-NEXT: xorl %edx, %edx2147; X86-AVX2-NEXT: divl 16(%esi)2148; X86-AVX2-NEXT: vmovd %edx, %xmm32149; X86-AVX2-NEXT: vpinsrd $1, %ecx, %xmm3, %xmm32150; X86-AVX2-NEXT: vpextrd $2, %xmm2, %eax2151; X86-AVX2-NEXT: xorl %edx, %edx2152; X86-AVX2-NEXT: divl 24(%esi)2153; X86-AVX2-NEXT: vpinsrd $2, %edx, %xmm3, %xmm32154; X86-AVX2-NEXT: vpextrd $3, %xmm2, %eax2155; X86-AVX2-NEXT: xorl %edx, %edx2156; X86-AVX2-NEXT: divl 28(%esi)2157; X86-AVX2-NEXT: vpinsrd $3, %edx, %xmm3, %xmm22158; X86-AVX2-NEXT: vpextrd $1, %xmm1, %eax2159; X86-AVX2-NEXT: xorl %edx, %edx2160; X86-AVX2-NEXT: divl 4(%esi)2161; X86-AVX2-NEXT: movl %edx, %ecx2162; X86-AVX2-NEXT: vmovd %xmm1, %eax2163; X86-AVX2-NEXT: xorl %edx, %edx2164; X86-AVX2-NEXT: divl (%esi)2165; X86-AVX2-NEXT: vmovd %edx, %xmm32166; X86-AVX2-NEXT: vpinsrd $1, %ecx, %xmm3, %xmm32167; X86-AVX2-NEXT: vpextrd $2, %xmm1, %eax2168; X86-AVX2-NEXT: xorl %edx, %edx2169; X86-AVX2-NEXT: divl 8(%esi)2170; X86-AVX2-NEXT: vpinsrd $2, %edx, %xmm3, %xmm32171; X86-AVX2-NEXT: vpextrd $3, %xmm1, %eax2172; X86-AVX2-NEXT: xorl %edx, %edx2173; X86-AVX2-NEXT: divl 12(%esi)2174; X86-AVX2-NEXT: vpinsrd $3, %edx, %xmm3, %xmm12175; X86-AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm12176; X86-AVX2-NEXT: vmovd %xmm0, %eax2177; X86-AVX2-NEXT: xorl %edx, %edx2178; X86-AVX2-NEXT: divl 32(%esi)2179; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [8199,8199,8199,8199,8199,8199,8199,8199]2180; X86-AVX2-NEXT: vpmulld %ymm0, %ymm1, %ymm02181; X86-AVX2-NEXT: imull $8199, %edx, %eax # imm = 0x20072182; X86-AVX2-NEXT: movl %eax, (%eax)2183; X86-AVX2-NEXT: vmovdqa %ymm0, (%eax)2184; X86-AVX2-NEXT: popl %esi2185; X86-AVX2-NEXT: vzeroupper2186; X86-AVX2-NEXT: retl2187;2188; X64-SSE-LABEL: PR34947:2189; X64-SSE: # %bb.0:2190; X64-SSE-NEXT: movzwl 16(%rdi), %ecx2191; X64-SSE-NEXT: movdqa (%rdi), %xmm22192; X64-SSE-NEXT: pxor %xmm1, %xmm12193; X64-SSE-NEXT: movdqa %xmm2, %xmm02194; X64-SSE-NEXT: pextrw $7, %xmm2, %eax2195; X64-SSE-NEXT: pextrw $4, %xmm2, %edi2196; X64-SSE-NEXT: pextrw $1, %xmm2, %r8d2197; X64-SSE-NEXT: pextrw $0, %xmm2, %r9d2198; X64-SSE-NEXT: pextrw $3, %xmm2, %r10d2199; X64-SSE-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]2200; X64-SSE-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2201; X64-SSE-NEXT: xorl %edx, %edx2202; X64-SSE-NEXT: divl 28(%rsi)2203; X64-SSE-NEXT: movd %edx, %xmm12204; X64-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]2205; X64-SSE-NEXT: movd %xmm3, %eax2206; X64-SSE-NEXT: xorl %edx, %edx2207; X64-SSE-NEXT: divl 24(%rsi)2208; X64-SSE-NEXT: movd %edx, %xmm32209; X64-SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]2210; X64-SSE-NEXT: movl %edi, %eax2211; X64-SSE-NEXT: xorl %edx, %edx2212; X64-SSE-NEXT: divl 16(%rsi)2213; X64-SSE-NEXT: movd %edx, %xmm12214; X64-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]2215; X64-SSE-NEXT: movd %xmm0, %eax2216; X64-SSE-NEXT: xorl %edx, %edx2217; X64-SSE-NEXT: divl 20(%rsi)2218; X64-SSE-NEXT: movd %edx, %xmm02219; X64-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2220; X64-SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]2221; X64-SSE-NEXT: movl %r8d, %eax2222; X64-SSE-NEXT: xorl %edx, %edx2223; X64-SSE-NEXT: divl 4(%rsi)2224; X64-SSE-NEXT: movd %edx, %xmm02225; X64-SSE-NEXT: movl %r9d, %eax2226; X64-SSE-NEXT: xorl %edx, %edx2227; X64-SSE-NEXT: divl (%rsi)2228; X64-SSE-NEXT: movd %edx, %xmm32229; X64-SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]2230; X64-SSE-NEXT: movl %r10d, %eax2231; X64-SSE-NEXT: xorl %edx, %edx2232; X64-SSE-NEXT: divl 12(%rsi)2233; X64-SSE-NEXT: movd %edx, %xmm02234; X64-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]2235; X64-SSE-NEXT: movd %xmm2, %eax2236; X64-SSE-NEXT: xorl %edx, %edx2237; X64-SSE-NEXT: divl 8(%rsi)2238; X64-SSE-NEXT: movd %edx, %xmm22239; X64-SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]2240; X64-SSE-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm2[0]2241; X64-SSE-NEXT: movl %ecx, %eax2242; X64-SSE-NEXT: xorl %edx, %edx2243; X64-SSE-NEXT: divl 32(%rsi)2244; X64-SSE-NEXT: movdqa {{.*#+}} xmm0 = [8199,8199,8199,8199]2245; X64-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]2246; X64-SSE-NEXT: pmuludq %xmm0, %xmm32247; X64-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]2248; X64-SSE-NEXT: pmuludq %xmm0, %xmm22249; X64-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]2250; X64-SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]2251; X64-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]2252; X64-SSE-NEXT: pmuludq %xmm0, %xmm12253; X64-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]2254; X64-SSE-NEXT: pmuludq %xmm0, %xmm22255; X64-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]2256; X64-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2257; X64-SSE-NEXT: imull $8199, %edx, %eax # imm = 0x20072258; X64-SSE-NEXT: movl %eax, (%rax)2259; X64-SSE-NEXT: movdqa %xmm1, (%rax)2260; X64-SSE-NEXT: movdqa %xmm3, (%rax)2261; X64-SSE-NEXT: retq2262;2263; X64-AVX1-LABEL: PR34947:2264; X64-AVX1: # %bb.0:2265; X64-AVX1-NEXT: pushq %rbp2266; X64-AVX1-NEXT: pushq %rbx2267; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero2268; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero2269; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero2270; X64-AVX1-NEXT: vmovd %xmm2, %eax2271; X64-AVX1-NEXT: xorl %edx, %edx2272; X64-AVX1-NEXT: divl 32(%rsi)2273; X64-AVX1-NEXT: movl %edx, %ecx2274; X64-AVX1-NEXT: vpextrd $3, %xmm1, %eax2275; X64-AVX1-NEXT: xorl %edx, %edx2276; X64-AVX1-NEXT: divl 28(%rsi)2277; X64-AVX1-NEXT: movl %edx, %edi2278; X64-AVX1-NEXT: vpextrd $2, %xmm1, %eax2279; X64-AVX1-NEXT: xorl %edx, %edx2280; X64-AVX1-NEXT: divl 24(%rsi)2281; X64-AVX1-NEXT: movl %edx, %r8d2282; X64-AVX1-NEXT: vpextrd $1, %xmm1, %eax2283; X64-AVX1-NEXT: xorl %edx, %edx2284; X64-AVX1-NEXT: divl 20(%rsi)2285; X64-AVX1-NEXT: movl %edx, %r9d2286; X64-AVX1-NEXT: vmovd %xmm1, %eax2287; X64-AVX1-NEXT: xorl %edx, %edx2288; X64-AVX1-NEXT: divl 16(%rsi)2289; X64-AVX1-NEXT: movl %edx, %r10d2290; X64-AVX1-NEXT: vpextrd $3, %xmm0, %eax2291; X64-AVX1-NEXT: xorl %edx, %edx2292; X64-AVX1-NEXT: divl 12(%rsi)2293; X64-AVX1-NEXT: movl %edx, %r11d2294; X64-AVX1-NEXT: vpextrd $2, %xmm0, %eax2295; X64-AVX1-NEXT: xorl %edx, %edx2296; X64-AVX1-NEXT: divl 8(%rsi)2297; X64-AVX1-NEXT: movl %edx, %ebx2298; X64-AVX1-NEXT: vpextrd $1, %xmm0, %eax2299; X64-AVX1-NEXT: xorl %edx, %edx2300; X64-AVX1-NEXT: divl 4(%rsi)2301; X64-AVX1-NEXT: movl %edx, %ebp2302; X64-AVX1-NEXT: vmovd %xmm0, %eax2303; X64-AVX1-NEXT: xorl %edx, %edx2304; X64-AVX1-NEXT: divl (%rsi)2305; X64-AVX1-NEXT: vmovd %edx, %xmm02306; X64-AVX1-NEXT: vpinsrd $1, %ebp, %xmm0, %xmm02307; X64-AVX1-NEXT: vpinsrd $2, %ebx, %xmm0, %xmm02308; X64-AVX1-NEXT: vpinsrd $3, %r11d, %xmm0, %xmm02309; X64-AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [8199,8199,8199,8199]2310; X64-AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm02311; X64-AVX1-NEXT: vmovd %r10d, %xmm22312; X64-AVX1-NEXT: vpinsrd $1, %r9d, %xmm2, %xmm22313; X64-AVX1-NEXT: vpinsrd $2, %r8d, %xmm2, %xmm22314; X64-AVX1-NEXT: vpinsrd $3, %edi, %xmm2, %xmm22315; X64-AVX1-NEXT: vpmulld %xmm1, %xmm2, %xmm12316; X64-AVX1-NEXT: imull $8199, %ecx, %eax # imm = 0x20072317; X64-AVX1-NEXT: movl %eax, (%rax)2318; X64-AVX1-NEXT: vmovdqa %xmm1, (%rax)2319; X64-AVX1-NEXT: vmovdqa %xmm0, (%rax)2320; X64-AVX1-NEXT: popq %rbx2321; X64-AVX1-NEXT: popq %rbp2322; X64-AVX1-NEXT: retq2323;2324; X64-AVX2-LABEL: PR34947:2325; X64-AVX2: # %bb.0:2326; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero2327; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero2328; X64-AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22329; X64-AVX2-NEXT: vpextrd $1, %xmm2, %eax2330; X64-AVX2-NEXT: xorl %edx, %edx2331; X64-AVX2-NEXT: divl 20(%rsi)2332; X64-AVX2-NEXT: movl %edx, %ecx2333; X64-AVX2-NEXT: vmovd %xmm2, %eax2334; X64-AVX2-NEXT: xorl %edx, %edx2335; X64-AVX2-NEXT: divl 16(%rsi)2336; X64-AVX2-NEXT: vmovd %edx, %xmm32337; X64-AVX2-NEXT: vpinsrd $1, %ecx, %xmm3, %xmm32338; X64-AVX2-NEXT: vpextrd $2, %xmm2, %eax2339; X64-AVX2-NEXT: xorl %edx, %edx2340; X64-AVX2-NEXT: divl 24(%rsi)2341; X64-AVX2-NEXT: vpinsrd $2, %edx, %xmm3, %xmm32342; X64-AVX2-NEXT: vpextrd $3, %xmm2, %eax2343; X64-AVX2-NEXT: xorl %edx, %edx2344; X64-AVX2-NEXT: divl 28(%rsi)2345; X64-AVX2-NEXT: vpinsrd $3, %edx, %xmm3, %xmm22346; X64-AVX2-NEXT: vpextrd $1, %xmm1, %eax2347; X64-AVX2-NEXT: xorl %edx, %edx2348; X64-AVX2-NEXT: divl 4(%rsi)2349; X64-AVX2-NEXT: movl %edx, %ecx2350; X64-AVX2-NEXT: vmovd %xmm1, %eax2351; X64-AVX2-NEXT: xorl %edx, %edx2352; X64-AVX2-NEXT: divl (%rsi)2353; X64-AVX2-NEXT: vmovd %edx, %xmm32354; X64-AVX2-NEXT: vpinsrd $1, %ecx, %xmm3, %xmm32355; X64-AVX2-NEXT: vpextrd $2, %xmm1, %eax2356; X64-AVX2-NEXT: xorl %edx, %edx2357; X64-AVX2-NEXT: divl 8(%rsi)2358; X64-AVX2-NEXT: vpinsrd $2, %edx, %xmm3, %xmm32359; X64-AVX2-NEXT: vpextrd $3, %xmm1, %eax2360; X64-AVX2-NEXT: xorl %edx, %edx2361; X64-AVX2-NEXT: divl 12(%rsi)2362; X64-AVX2-NEXT: vpinsrd $3, %edx, %xmm3, %xmm12363; X64-AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm12364; X64-AVX2-NEXT: vmovd %xmm0, %eax2365; X64-AVX2-NEXT: xorl %edx, %edx2366; X64-AVX2-NEXT: divl 32(%rsi)2367; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [8199,8199,8199,8199,8199,8199,8199,8199]2368; X64-AVX2-NEXT: vpmulld %ymm0, %ymm1, %ymm02369; X64-AVX2-NEXT: imull $8199, %edx, %eax # imm = 0x20072370; X64-AVX2-NEXT: movl %eax, (%rax)2371; X64-AVX2-NEXT: vmovdqa %ymm0, (%rax)2372; X64-AVX2-NEXT: vzeroupper2373; X64-AVX2-NEXT: retq2374 %a0 = load <9 x i16>, ptr %p0, align 642375 %a1 = load <9 x i32>, ptr %p1, align 642376 %ext0 = zext <9 x i16> %a0 to <9 x i32>2377 %rem = urem <9 x i32> %ext0, %a12378 %mul = mul <9 x i32> <i32 8199, i32 8199, i32 8199, i32 8199, i32 8199, i32 8199, i32 8199, i32 8199, i32 8199>, %rem2379 store <9 x i32> %mul, ptr undef, align 642380 ret void2381}2382