brintos

brintos / llvm-project-archived public Read only

0
0
Text · 146.9 KiB · 209ee79 Raw
3268 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX256,AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX256,AVX512,AVX512F6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX,AVX256,AVX512,AVX512BW7 8define i32 @_Z10test_shortPsS_i_128(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {9; SSE2-LABEL: _Z10test_shortPsS_i_128:10; SSE2:       # %bb.0: # %entry11; SSE2-NEXT:    movl %edx, %eax12; SSE2-NEXT:    pxor %xmm0, %xmm013; SSE2-NEXT:    xorl %ecx, %ecx14; SSE2-NEXT:    pxor %xmm1, %xmm115; SSE2-NEXT:    .p2align 416; SSE2-NEXT:  .LBB0_1: # %vector.body17; SSE2-NEXT:    # =>This Inner Loop Header: Depth=118; SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero19; SSE2-NEXT:    movq {{.*#+}} xmm3 = mem[0],zero20; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]21; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]22; SSE2-NEXT:    pmaddwd %xmm3, %xmm223; SSE2-NEXT:    paddd %xmm2, %xmm124; SSE2-NEXT:    addq $8, %rcx25; SSE2-NEXT:    cmpq %rcx, %rax26; SSE2-NEXT:    jne .LBB0_127; SSE2-NEXT:  # %bb.2: # %middle.block28; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]29; SSE2-NEXT:    paddd %xmm1, %xmm030; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]31; SSE2-NEXT:    paddd %xmm0, %xmm132; SSE2-NEXT:    movd %xmm1, %eax33; SSE2-NEXT:    retq34;35; AVX-LABEL: _Z10test_shortPsS_i_128:36; AVX:       # %bb.0: # %entry37; AVX-NEXT:    movl %edx, %eax38; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm039; AVX-NEXT:    xorl %ecx, %ecx40; AVX-NEXT:    .p2align 441; AVX-NEXT:  .LBB0_1: # %vector.body42; AVX-NEXT:    # =>This Inner Loop Header: Depth=143; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero44; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero45; AVX-NEXT:    vpmaddwd %xmm1, %xmm2, %xmm146; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm047; AVX-NEXT:    addq $8, %rcx48; AVX-NEXT:    cmpq %rcx, %rax49; AVX-NEXT:    jne .LBB0_150; AVX-NEXT:  # %bb.2: # %middle.block51; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]52; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm053; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]54; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm055; AVX-NEXT:    vmovd %xmm0, %eax56; AVX-NEXT:    retq57entry:58  %3 = zext i32 %2 to i6459  br label %vector.body60 61vector.body:62  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]63  %vec.phi = phi <4 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]64  %4 = getelementptr inbounds i16, ptr %0, i64 %index65  %5 = bitcast ptr %4 to ptr66  %wide.load = load <4 x i16>, ptr %5, align 267  %6 = sext <4 x i16> %wide.load to <4 x i32>68  %7 = getelementptr inbounds i16, ptr %1, i64 %index69  %8 = bitcast ptr %7 to ptr70  %wide.load14 = load <4 x i16>, ptr %8, align 271  %9 = sext <4 x i16> %wide.load14 to <4 x i32>72  %10 = mul nsw <4 x i32> %9, %673  %11 = add nsw <4 x i32> %10, %vec.phi74  %index.next = add i64 %index, 875  %12 = icmp eq i64 %index.next, %376  br i1 %12, label %middle.block, label %vector.body77 78middle.block:79  %rdx.shuf15 = shufflevector <4 x i32> %11, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>80  %bin.rdx16 = add <4 x i32> %11, %rdx.shuf1581  %rdx.shuf17 = shufflevector <4 x i32> %bin.rdx16, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>82  %bin.rdx18 = add <4 x i32> %bin.rdx16, %rdx.shuf1783  %13 = extractelement <4 x i32> %bin.rdx18, i32 084  ret i32 %1385}86 87define i32 @_Z10test_shortPsS_i_256(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {88; SSE2-LABEL: _Z10test_shortPsS_i_256:89; SSE2:       # %bb.0: # %entry90; SSE2-NEXT:    movl %edx, %eax91; SSE2-NEXT:    pxor %xmm0, %xmm092; SSE2-NEXT:    xorl %ecx, %ecx93; SSE2-NEXT:    pxor %xmm1, %xmm194; SSE2-NEXT:    .p2align 495; SSE2-NEXT:  .LBB1_1: # %vector.body96; SSE2-NEXT:    # =>This Inner Loop Header: Depth=197; SSE2-NEXT:    movdqu (%rdi,%rcx,2), %xmm298; SSE2-NEXT:    movdqu (%rsi,%rcx,2), %xmm399; SSE2-NEXT:    pmaddwd %xmm2, %xmm3100; SSE2-NEXT:    paddd %xmm3, %xmm1101; SSE2-NEXT:    addq $8, %rcx102; SSE2-NEXT:    cmpq %rcx, %rax103; SSE2-NEXT:    jne .LBB1_1104; SSE2-NEXT:  # %bb.2: # %middle.block105; SSE2-NEXT:    paddd %xmm0, %xmm1106; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]107; SSE2-NEXT:    paddd %xmm1, %xmm0108; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]109; SSE2-NEXT:    paddd %xmm0, %xmm1110; SSE2-NEXT:    movd %xmm1, %eax111; SSE2-NEXT:    retq112;113; AVX1-LABEL: _Z10test_shortPsS_i_256:114; AVX1:       # %bb.0: # %entry115; AVX1-NEXT:    movl %edx, %eax116; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0117; AVX1-NEXT:    xorl %ecx, %ecx118; AVX1-NEXT:    .p2align 4119; AVX1-NEXT:  .LBB1_1: # %vector.body120; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1121; AVX1-NEXT:    vmovdqu (%rsi,%rcx,2), %xmm1122; AVX1-NEXT:    vpmaddwd (%rdi,%rcx,2), %xmm1, %xmm1123; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm1124; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]125; AVX1-NEXT:    addq $8, %rcx126; AVX1-NEXT:    cmpq %rcx, %rax127; AVX1-NEXT:    jne .LBB1_1128; AVX1-NEXT:  # %bb.2: # %middle.block129; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1130; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0131; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]132; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0133; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]134; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0135; AVX1-NEXT:    vmovd %xmm0, %eax136; AVX1-NEXT:    vzeroupper137; AVX1-NEXT:    retq138;139; AVX256-LABEL: _Z10test_shortPsS_i_256:140; AVX256:       # %bb.0: # %entry141; AVX256-NEXT:    movl %edx, %eax142; AVX256-NEXT:    vpxor %xmm0, %xmm0, %xmm0143; AVX256-NEXT:    xorl %ecx, %ecx144; AVX256-NEXT:    .p2align 4145; AVX256-NEXT:  .LBB1_1: # %vector.body146; AVX256-NEXT:    # =>This Inner Loop Header: Depth=1147; AVX256-NEXT:    vmovdqu (%rsi,%rcx,2), %xmm1148; AVX256-NEXT:    vpmaddwd (%rdi,%rcx,2), %xmm1, %xmm1149; AVX256-NEXT:    vpaddd %ymm0, %ymm1, %ymm0150; AVX256-NEXT:    addq $8, %rcx151; AVX256-NEXT:    cmpq %rcx, %rax152; AVX256-NEXT:    jne .LBB1_1153; AVX256-NEXT:  # %bb.2: # %middle.block154; AVX256-NEXT:    vextracti128 $1, %ymm0, %xmm1155; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm0156; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]157; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm0158; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]159; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm0160; AVX256-NEXT:    vmovd %xmm0, %eax161; AVX256-NEXT:    vzeroupper162; AVX256-NEXT:    retq163entry:164  %3 = zext i32 %2 to i64165  br label %vector.body166 167vector.body:168  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]169  %vec.phi = phi <8 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]170  %4 = getelementptr inbounds i16, ptr %0, i64 %index171  %5 = bitcast ptr %4 to ptr172  %wide.load = load <8 x i16>, ptr %5, align 2173  %6 = sext <8 x i16> %wide.load to <8 x i32>174  %7 = getelementptr inbounds i16, ptr %1, i64 %index175  %8 = bitcast ptr %7 to ptr176  %wide.load14 = load <8 x i16>, ptr %8, align 2177  %9 = sext <8 x i16> %wide.load14 to <8 x i32>178  %10 = mul nsw <8 x i32> %9, %6179  %11 = add nsw <8 x i32> %10, %vec.phi180  %index.next = add i64 %index, 8181  %12 = icmp eq i64 %index.next, %3182  br i1 %12, label %middle.block, label %vector.body183 184middle.block:185  %rdx.shuf = shufflevector <8 x i32> %11, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>186  %bin.rdx = add <8 x i32> %11, %rdx.shuf187  %rdx.shuf15 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>188  %bin.rdx16 = add <8 x i32> %bin.rdx, %rdx.shuf15189  %rdx.shuf17 = shufflevector <8 x i32> %bin.rdx16, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>190  %bin.rdx18 = add <8 x i32> %bin.rdx16, %rdx.shuf17191  %13 = extractelement <8 x i32> %bin.rdx18, i32 0192  ret i32 %13193}194 195define i32 @_Z10test_shortPsS_i_512(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {196; SSE2-LABEL: _Z10test_shortPsS_i_512:197; SSE2:       # %bb.0: # %entry198; SSE2-NEXT:    movl %edx, %eax199; SSE2-NEXT:    pxor %xmm0, %xmm0200; SSE2-NEXT:    xorl %ecx, %ecx201; SSE2-NEXT:    pxor %xmm2, %xmm2202; SSE2-NEXT:    pxor %xmm1, %xmm1203; SSE2-NEXT:    .p2align 4204; SSE2-NEXT:  .LBB2_1: # %vector.body205; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1206; SSE2-NEXT:    movdqu (%rdi,%rcx,2), %xmm3207; SSE2-NEXT:    movdqu 16(%rdi,%rcx,2), %xmm4208; SSE2-NEXT:    movdqu (%rsi,%rcx,2), %xmm5209; SSE2-NEXT:    pmaddwd %xmm3, %xmm5210; SSE2-NEXT:    paddd %xmm5, %xmm2211; SSE2-NEXT:    movdqu 16(%rsi,%rcx,2), %xmm3212; SSE2-NEXT:    pmaddwd %xmm4, %xmm3213; SSE2-NEXT:    paddd %xmm3, %xmm1214; SSE2-NEXT:    addq $16, %rcx215; SSE2-NEXT:    cmpq %rcx, %rax216; SSE2-NEXT:    jne .LBB2_1217; SSE2-NEXT:  # %bb.2: # %middle.block218; SSE2-NEXT:    paddd %xmm0, %xmm2219; SSE2-NEXT:    paddd %xmm0, %xmm1220; SSE2-NEXT:    paddd %xmm2, %xmm1221; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]222; SSE2-NEXT:    paddd %xmm1, %xmm0223; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]224; SSE2-NEXT:    paddd %xmm0, %xmm1225; SSE2-NEXT:    movd %xmm1, %eax226; SSE2-NEXT:    retq227;228; AVX1-LABEL: _Z10test_shortPsS_i_512:229; AVX1:       # %bb.0: # %entry230; AVX1-NEXT:    movl %edx, %eax231; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0232; AVX1-NEXT:    xorl %ecx, %ecx233; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1234; AVX1-NEXT:    .p2align 4235; AVX1-NEXT:  .LBB2_1: # %vector.body236; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1237; AVX1-NEXT:    vmovdqu (%rsi,%rcx,2), %xmm2238; AVX1-NEXT:    vmovdqu 16(%rsi,%rcx,2), %xmm3239; AVX1-NEXT:    vpmaddwd (%rdi,%rcx,2), %xmm2, %xmm2240; AVX1-NEXT:    vpmaddwd 16(%rdi,%rcx,2), %xmm3, %xmm3241; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4242; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm3243; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1244; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1245; AVX1-NEXT:    addq $16, %rcx246; AVX1-NEXT:    cmpq %rcx, %rax247; AVX1-NEXT:    jne .LBB2_1248; AVX1-NEXT:  # %bb.2: # %middle.block249; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2250; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3251; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2252; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm0253; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0254; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]255; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0256; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]257; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0258; AVX1-NEXT:    vmovd %xmm0, %eax259; AVX1-NEXT:    vzeroupper260; AVX1-NEXT:    retq261;262; AVX2-LABEL: _Z10test_shortPsS_i_512:263; AVX2:       # %bb.0: # %entry264; AVX2-NEXT:    movl %edx, %eax265; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm0266; AVX2-NEXT:    xorl %ecx, %ecx267; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1268; AVX2-NEXT:    .p2align 4269; AVX2-NEXT:  .LBB2_1: # %vector.body270; AVX2-NEXT:    # =>This Inner Loop Header: Depth=1271; AVX2-NEXT:    vmovdqu (%rsi,%rcx,2), %ymm2272; AVX2-NEXT:    vpmaddwd (%rdi,%rcx,2), %ymm2, %ymm2273; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm1274; AVX2-NEXT:    addq $16, %rcx275; AVX2-NEXT:    cmpq %rcx, %rax276; AVX2-NEXT:    jne .LBB2_1277; AVX2-NEXT:  # %bb.2: # %middle.block278; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0279; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1280; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0281; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]282; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0283; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]284; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0285; AVX2-NEXT:    vmovd %xmm0, %eax286; AVX2-NEXT:    vzeroupper287; AVX2-NEXT:    retq288;289; AVX512-LABEL: _Z10test_shortPsS_i_512:290; AVX512:       # %bb.0: # %entry291; AVX512-NEXT:    movl %edx, %eax292; AVX512-NEXT:    vpxor %xmm0, %xmm0, %xmm0293; AVX512-NEXT:    xorl %ecx, %ecx294; AVX512-NEXT:    .p2align 4295; AVX512-NEXT:  .LBB2_1: # %vector.body296; AVX512-NEXT:    # =>This Inner Loop Header: Depth=1297; AVX512-NEXT:    vmovdqu (%rsi,%rcx,2), %ymm1298; AVX512-NEXT:    vpmaddwd (%rdi,%rcx,2), %ymm1, %ymm1299; AVX512-NEXT:    vpaddd %zmm0, %zmm1, %zmm0300; AVX512-NEXT:    addq $16, %rcx301; AVX512-NEXT:    cmpq %rcx, %rax302; AVX512-NEXT:    jne .LBB2_1303; AVX512-NEXT:  # %bb.2: # %middle.block304; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1305; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0306; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1307; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0308; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]309; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0310; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]311; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0312; AVX512-NEXT:    vmovd %xmm0, %eax313; AVX512-NEXT:    vzeroupper314; AVX512-NEXT:    retq315entry:316  %3 = zext i32 %2 to i64317  br label %vector.body318 319vector.body:320  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]321  %vec.phi = phi <16 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]322  %4 = getelementptr inbounds i16, ptr %0, i64 %index323  %5 = bitcast ptr %4 to ptr324  %wide.load = load <16 x i16>, ptr %5, align 2325  %6 = sext <16 x i16> %wide.load to <16 x i32>326  %7 = getelementptr inbounds i16, ptr %1, i64 %index327  %8 = bitcast ptr %7 to ptr328  %wide.load14 = load <16 x i16>, ptr %8, align 2329  %9 = sext <16 x i16> %wide.load14 to <16 x i32>330  %10 = mul nsw <16 x i32> %9, %6331  %11 = add nsw <16 x i32> %10, %vec.phi332  %index.next = add i64 %index, 16333  %12 = icmp eq i64 %index.next, %3334  br i1 %12, label %middle.block, label %vector.body335 336middle.block:337  %rdx.shuf1 = shufflevector <16 x i32> %11, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>338  %bin.rdx1 = add <16 x i32> %11, %rdx.shuf1339  %rdx.shuf = shufflevector <16 x i32> %bin.rdx1, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>340  %bin.rdx = add <16 x i32> %bin.rdx1, %rdx.shuf341  %rdx.shuf15 = shufflevector <16 x i32> %bin.rdx, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>342  %bin.rdx16 = add <16 x i32> %bin.rdx, %rdx.shuf15343  %rdx.shuf17 = shufflevector <16 x i32> %bin.rdx16, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>344  %bin.rdx18 = add <16 x i32> %bin.rdx16, %rdx.shuf17345  %13 = extractelement <16 x i32> %bin.rdx18, i32 0346  ret i32 %13347}348 349define i32 @_Z10test_shortPsS_i_1024(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {350; SSE2-LABEL: _Z10test_shortPsS_i_1024:351; SSE2:       # %bb.0: # %entry352; SSE2-NEXT:    movl %edx, %eax353; SSE2-NEXT:    pxor %xmm0, %xmm0354; SSE2-NEXT:    xorl %ecx, %ecx355; SSE2-NEXT:    pxor %xmm2, %xmm2356; SSE2-NEXT:    pxor %xmm4, %xmm4357; SSE2-NEXT:    pxor %xmm1, %xmm1358; SSE2-NEXT:    pxor %xmm3, %xmm3359; SSE2-NEXT:    .p2align 4360; SSE2-NEXT:  .LBB3_1: # %vector.body361; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1362; SSE2-NEXT:    movdqu (%rdi,%rcx,2), %xmm5363; SSE2-NEXT:    movdqu 16(%rdi,%rcx,2), %xmm6364; SSE2-NEXT:    movdqu 32(%rdi,%rcx,2), %xmm7365; SSE2-NEXT:    movdqu 48(%rdi,%rcx,2), %xmm8366; SSE2-NEXT:    movdqu (%rsi,%rcx,2), %xmm9367; SSE2-NEXT:    pmaddwd %xmm5, %xmm9368; SSE2-NEXT:    paddd %xmm9, %xmm2369; SSE2-NEXT:    movdqu 16(%rsi,%rcx,2), %xmm5370; SSE2-NEXT:    pmaddwd %xmm6, %xmm5371; SSE2-NEXT:    paddd %xmm5, %xmm4372; SSE2-NEXT:    movdqu 32(%rsi,%rcx,2), %xmm5373; SSE2-NEXT:    pmaddwd %xmm7, %xmm5374; SSE2-NEXT:    paddd %xmm5, %xmm1375; SSE2-NEXT:    movdqu 48(%rsi,%rcx,2), %xmm5376; SSE2-NEXT:    pmaddwd %xmm8, %xmm5377; SSE2-NEXT:    paddd %xmm5, %xmm3378; SSE2-NEXT:    addq $16, %rcx379; SSE2-NEXT:    cmpq %rcx, %rax380; SSE2-NEXT:    jne .LBB3_1381; SSE2-NEXT:  # %bb.2: # %middle.block382; SSE2-NEXT:    paddd %xmm0, %xmm4383; SSE2-NEXT:    paddd %xmm0, %xmm3384; SSE2-NEXT:    paddd %xmm4, %xmm3385; SSE2-NEXT:    paddd %xmm0, %xmm2386; SSE2-NEXT:    paddd %xmm0, %xmm1387; SSE2-NEXT:    paddd %xmm2, %xmm1388; SSE2-NEXT:    paddd %xmm3, %xmm1389; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]390; SSE2-NEXT:    paddd %xmm1, %xmm0391; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]392; SSE2-NEXT:    paddd %xmm0, %xmm1393; SSE2-NEXT:    movd %xmm1, %eax394; SSE2-NEXT:    retq395;396; AVX1-LABEL: _Z10test_shortPsS_i_1024:397; AVX1:       # %bb.0: # %entry398; AVX1-NEXT:    movl %edx, %eax399; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0400; AVX1-NEXT:    xorl %ecx, %ecx401; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2402; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1403; AVX1-NEXT:    .p2align 4404; AVX1-NEXT:  .LBB3_1: # %vector.body405; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1406; AVX1-NEXT:    vmovdqu (%rsi,%rcx,2), %xmm3407; AVX1-NEXT:    vmovdqu 16(%rsi,%rcx,2), %xmm4408; AVX1-NEXT:    vmovdqu 32(%rsi,%rcx,2), %xmm5409; AVX1-NEXT:    vmovdqu 48(%rsi,%rcx,2), %xmm6410; AVX1-NEXT:    vpmaddwd (%rdi,%rcx,2), %xmm3, %xmm3411; AVX1-NEXT:    vpmaddwd 16(%rdi,%rcx,2), %xmm4, %xmm4412; AVX1-NEXT:    vpmaddwd 32(%rdi,%rcx,2), %xmm5, %xmm5413; AVX1-NEXT:    vpmaddwd 48(%rdi,%rcx,2), %xmm6, %xmm6414; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7415; AVX1-NEXT:    vpaddd %xmm7, %xmm6, %xmm6416; AVX1-NEXT:    vpaddd %xmm1, %xmm5, %xmm1417; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1418; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5419; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4420; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2421; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2422; AVX1-NEXT:    addq $16, %rcx423; AVX1-NEXT:    cmpq %rcx, %rax424; AVX1-NEXT:    jne .LBB3_1425; AVX1-NEXT:  # %bb.2: # %middle.block426; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm3427; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm4428; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm3429; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2430; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0431; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm2432; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1433; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm0434; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm0435; AVX1-NEXT:    vpaddd %xmm0, %xmm3, %xmm0436; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]437; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0438; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]439; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0440; AVX1-NEXT:    vmovd %xmm0, %eax441; AVX1-NEXT:    vzeroupper442; AVX1-NEXT:    retq443;444; AVX2-LABEL: _Z10test_shortPsS_i_1024:445; AVX2:       # %bb.0: # %entry446; AVX2-NEXT:    movl %edx, %eax447; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm0448; AVX2-NEXT:    xorl %ecx, %ecx449; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1450; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2451; AVX2-NEXT:    .p2align 4452; AVX2-NEXT:  .LBB3_1: # %vector.body453; AVX2-NEXT:    # =>This Inner Loop Header: Depth=1454; AVX2-NEXT:    vmovdqu (%rsi,%rcx,2), %ymm3455; AVX2-NEXT:    vmovdqu 32(%rsi,%rcx,2), %ymm4456; AVX2-NEXT:    vpmaddwd (%rdi,%rcx,2), %ymm3, %ymm3457; AVX2-NEXT:    vpaddd %ymm1, %ymm3, %ymm1458; AVX2-NEXT:    vpmaddwd 32(%rdi,%rcx,2), %ymm4, %ymm3459; AVX2-NEXT:    vpaddd %ymm2, %ymm3, %ymm2460; AVX2-NEXT:    addq $16, %rcx461; AVX2-NEXT:    cmpq %rcx, %rax462; AVX2-NEXT:    jne .LBB3_1463; AVX2-NEXT:  # %bb.2: # %middle.block464; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm1465; AVX2-NEXT:    vpaddd %ymm0, %ymm2, %ymm0466; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0467; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1468; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0469; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]470; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0471; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]472; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0473; AVX2-NEXT:    vmovd %xmm0, %eax474; AVX2-NEXT:    vzeroupper475; AVX2-NEXT:    retq476;477; AVX512F-LABEL: _Z10test_shortPsS_i_1024:478; AVX512F:       # %bb.0: # %entry479; AVX512F-NEXT:    movl %edx, %eax480; AVX512F-NEXT:    vpxor %xmm0, %xmm0, %xmm0481; AVX512F-NEXT:    xorl %ecx, %ecx482; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1483; AVX512F-NEXT:    .p2align 4484; AVX512F-NEXT:  .LBB3_1: # %vector.body485; AVX512F-NEXT:    # =>This Inner Loop Header: Depth=1486; AVX512F-NEXT:    vmovdqu (%rsi,%rcx,2), %ymm2487; AVX512F-NEXT:    vmovdqu 32(%rsi,%rcx,2), %ymm3488; AVX512F-NEXT:    vpmaddwd 32(%rdi,%rcx,2), %ymm3, %ymm3489; AVX512F-NEXT:    vpmaddwd (%rdi,%rcx,2), %ymm2, %ymm2490; AVX512F-NEXT:    vinserti64x4 $1, %ymm3, %zmm2, %zmm2491; AVX512F-NEXT:    vpaddd %zmm1, %zmm2, %zmm1492; AVX512F-NEXT:    addq $16, %rcx493; AVX512F-NEXT:    cmpq %rcx, %rax494; AVX512F-NEXT:    jne .LBB3_1495; AVX512F-NEXT:  # %bb.2: # %middle.block496; AVX512F-NEXT:    vpaddd %zmm0, %zmm1, %zmm0497; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1498; AVX512F-NEXT:    vpaddd %zmm1, %zmm0, %zmm0499; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1500; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0501; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]502; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0503; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]504; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0505; AVX512F-NEXT:    vmovd %xmm0, %eax506; AVX512F-NEXT:    vzeroupper507; AVX512F-NEXT:    retq508;509; AVX512BW-LABEL: _Z10test_shortPsS_i_1024:510; AVX512BW:       # %bb.0: # %entry511; AVX512BW-NEXT:    movl %edx, %eax512; AVX512BW-NEXT:    vpxor %xmm0, %xmm0, %xmm0513; AVX512BW-NEXT:    xorl %ecx, %ecx514; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1515; AVX512BW-NEXT:    .p2align 4516; AVX512BW-NEXT:  .LBB3_1: # %vector.body517; AVX512BW-NEXT:    # =>This Inner Loop Header: Depth=1518; AVX512BW-NEXT:    vmovdqu64 (%rsi,%rcx,2), %zmm2519; AVX512BW-NEXT:    vpmaddwd (%rdi,%rcx,2), %zmm2, %zmm2520; AVX512BW-NEXT:    vpaddd %zmm1, %zmm2, %zmm1521; AVX512BW-NEXT:    addq $16, %rcx522; AVX512BW-NEXT:    cmpq %rcx, %rax523; AVX512BW-NEXT:    jne .LBB3_1524; AVX512BW-NEXT:  # %bb.2: # %middle.block525; AVX512BW-NEXT:    vpaddd %zmm0, %zmm1, %zmm0526; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1527; AVX512BW-NEXT:    vpaddd %zmm1, %zmm0, %zmm0528; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1529; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0530; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]531; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0532; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]533; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0534; AVX512BW-NEXT:    vmovd %xmm0, %eax535; AVX512BW-NEXT:    vzeroupper536; AVX512BW-NEXT:    retq537entry:538  %3 = zext i32 %2 to i64539  br label %vector.body540 541vector.body:542  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]543  %vec.phi = phi <32 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]544  %4 = getelementptr inbounds i16, ptr %0, i64 %index545  %5 = bitcast ptr %4 to ptr546  %wide.load = load <32 x i16>, ptr %5, align 2547  %6 = sext <32 x i16> %wide.load to <32 x i32>548  %7 = getelementptr inbounds i16, ptr %1, i64 %index549  %8 = bitcast ptr %7 to ptr550  %wide.load14 = load <32 x i16>, ptr %8, align 2551  %9 = sext <32 x i16> %wide.load14 to <32 x i32>552  %10 = mul nsw <32 x i32> %9, %6553  %11 = add nsw <32 x i32> %10, %vec.phi554  %index.next = add i64 %index, 16555  %12 = icmp eq i64 %index.next, %3556  br i1 %12, label %middle.block, label %vector.body557 558middle.block:559  %rdx.shuf2 = shufflevector <32 x i32> %11, <32 x i32> undef, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>560  %bin.rdx2 = add <32 x i32> %11, %rdx.shuf2561  %rdx.shuf1 = shufflevector <32 x i32> %bin.rdx2, <32 x i32> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>562  %bin.rdx1 = add <32 x i32> %bin.rdx2, %rdx.shuf1563  %rdx.shuf = shufflevector <32 x i32> %bin.rdx1, <32 x i32> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>564  %bin.rdx = add <32 x i32> %bin.rdx1, %rdx.shuf565  %rdx.shuf15 = shufflevector <32 x i32> %bin.rdx, <32 x i32> undef, <32 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>566  %bin.rdx16 = add <32 x i32> %bin.rdx, %rdx.shuf15567  %rdx.shuf17 = shufflevector <32 x i32> %bin.rdx16, <32 x i32> undef, <32 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>568  %bin.rdx18 = add <32 x i32> %bin.rdx16, %rdx.shuf17569  %13 = extractelement <32 x i32> %bin.rdx18, i32 0570  ret i32 %13571}572 573define i32 @_Z9test_charPcS_i_128(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {574; SSE2-LABEL: _Z9test_charPcS_i_128:575; SSE2:       # %bb.0: # %entry576; SSE2-NEXT:    movl %edx, %eax577; SSE2-NEXT:    pxor %xmm0, %xmm0578; SSE2-NEXT:    xorl %ecx, %ecx579; SSE2-NEXT:    .p2align 4580; SSE2-NEXT:  .LBB4_1: # %vector.body581; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1582; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero583; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]584; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero585; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]586; SSE2-NEXT:    psraw $8, %xmm1587; SSE2-NEXT:    psraw $8, %xmm2588; SSE2-NEXT:    pmullw %xmm1, %xmm2589; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]590; SSE2-NEXT:    psrad $16, %xmm1591; SSE2-NEXT:    paddd %xmm1, %xmm0592; SSE2-NEXT:    addq $16, %rcx593; SSE2-NEXT:    cmpq %rcx, %rax594; SSE2-NEXT:    jne .LBB4_1595; SSE2-NEXT:  # %bb.2: # %middle.block596; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]597; SSE2-NEXT:    paddd %xmm0, %xmm1598; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]599; SSE2-NEXT:    paddd %xmm1, %xmm0600; SSE2-NEXT:    movd %xmm0, %eax601; SSE2-NEXT:    retq602;603; AVX-LABEL: _Z9test_charPcS_i_128:604; AVX:       # %bb.0: # %entry605; AVX-NEXT:    movl %edx, %eax606; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0607; AVX-NEXT:    xorl %ecx, %ecx608; AVX-NEXT:    .p2align 4609; AVX-NEXT:  .LBB4_1: # %vector.body610; AVX-NEXT:    # =>This Inner Loop Header: Depth=1611; AVX-NEXT:    vpmovsxbd (%rdi,%rcx), %xmm1612; AVX-NEXT:    vpmovsxbd (%rsi,%rcx), %xmm2613; AVX-NEXT:    vpmulld %xmm1, %xmm2, %xmm1614; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm0615; AVX-NEXT:    addq $16, %rcx616; AVX-NEXT:    cmpq %rcx, %rax617; AVX-NEXT:    jne .LBB4_1618; AVX-NEXT:  # %bb.2: # %middle.block619; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]620; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0621; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]622; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0623; AVX-NEXT:    vmovd %xmm0, %eax624; AVX-NEXT:    retq625entry:626  %3 = zext i32 %2 to i64627  br label %vector.body628 629vector.body:630  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]631  %vec.phi = phi <4 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]632  %4 = getelementptr inbounds i8, ptr %0, i64 %index633  %5 = bitcast ptr %4 to ptr634  %wide.load = load <4 x i8>, ptr %5, align 1635  %6 = sext <4 x i8> %wide.load to <4 x i32>636  %7 = getelementptr inbounds i8, ptr %1, i64 %index637  %8 = bitcast ptr %7 to ptr638  %wide.load14 = load <4 x i8>, ptr %8, align 1639  %9 = sext <4 x i8> %wide.load14 to <4 x i32>640  %10 = mul nsw <4 x i32> %9, %6641  %11 = add nsw <4 x i32> %10, %vec.phi642  %index.next = add i64 %index, 16643  %12 = icmp eq i64 %index.next, %3644  br i1 %12, label %middle.block, label %vector.body645 646middle.block:647  %rdx.shuf17 = shufflevector <4 x i32> %11, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>648  %bin.rdx18 = add <4 x i32> %11, %rdx.shuf17649  %rdx.shuf19 = shufflevector <4 x i32> %bin.rdx18, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>650  %bin.rdx20 = add <4 x i32> %bin.rdx18, %rdx.shuf19651  %13 = extractelement <4 x i32> %bin.rdx20, i32 0652  ret i32 %13653}654 655define i32 @_Z9test_charPcS_i_256(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {656; SSE2-LABEL: _Z9test_charPcS_i_256:657; SSE2:       # %bb.0: # %entry658; SSE2-NEXT:    movl %edx, %eax659; SSE2-NEXT:    pxor %xmm0, %xmm0660; SSE2-NEXT:    xorl %ecx, %ecx661; SSE2-NEXT:    pxor %xmm1, %xmm1662; SSE2-NEXT:    .p2align 4663; SSE2-NEXT:  .LBB5_1: # %vector.body664; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1665; SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero666; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]667; SSE2-NEXT:    movq {{.*#+}} xmm3 = mem[0],zero668; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]669; SSE2-NEXT:    psraw $8, %xmm2670; SSE2-NEXT:    psraw $8, %xmm3671; SSE2-NEXT:    pmaddwd %xmm2, %xmm3672; SSE2-NEXT:    paddd %xmm3, %xmm1673; SSE2-NEXT:    addq $16, %rcx674; SSE2-NEXT:    cmpq %rcx, %rax675; SSE2-NEXT:    jne .LBB5_1676; SSE2-NEXT:  # %bb.2: # %middle.block677; SSE2-NEXT:    paddd %xmm0, %xmm1678; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]679; SSE2-NEXT:    paddd %xmm1, %xmm0680; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]681; SSE2-NEXT:    paddd %xmm0, %xmm1682; SSE2-NEXT:    movd %xmm1, %eax683; SSE2-NEXT:    retq684;685; AVX1-LABEL: _Z9test_charPcS_i_256:686; AVX1:       # %bb.0: # %entry687; AVX1-NEXT:    movl %edx, %eax688; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0689; AVX1-NEXT:    xorl %ecx, %ecx690; AVX1-NEXT:    .p2align 4691; AVX1-NEXT:  .LBB5_1: # %vector.body692; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1693; AVX1-NEXT:    vpmovsxbw (%rdi,%rcx), %xmm1694; AVX1-NEXT:    vpmovsxbw (%rsi,%rcx), %xmm2695; AVX1-NEXT:    vpmaddwd %xmm1, %xmm2, %xmm1696; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm1697; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]698; AVX1-NEXT:    addq $16, %rcx699; AVX1-NEXT:    cmpq %rcx, %rax700; AVX1-NEXT:    jne .LBB5_1701; AVX1-NEXT:  # %bb.2: # %middle.block702; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1703; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0704; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]705; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0706; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]707; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0708; AVX1-NEXT:    vmovd %xmm0, %eax709; AVX1-NEXT:    vzeroupper710; AVX1-NEXT:    retq711;712; AVX256-LABEL: _Z9test_charPcS_i_256:713; AVX256:       # %bb.0: # %entry714; AVX256-NEXT:    movl %edx, %eax715; AVX256-NEXT:    vpxor %xmm0, %xmm0, %xmm0716; AVX256-NEXT:    xorl %ecx, %ecx717; AVX256-NEXT:    .p2align 4718; AVX256-NEXT:  .LBB5_1: # %vector.body719; AVX256-NEXT:    # =>This Inner Loop Header: Depth=1720; AVX256-NEXT:    vpmovsxbw (%rdi,%rcx), %xmm1721; AVX256-NEXT:    vpmovsxbw (%rsi,%rcx), %xmm2722; AVX256-NEXT:    vpmaddwd %xmm1, %xmm2, %xmm1723; AVX256-NEXT:    vpaddd %ymm0, %ymm1, %ymm0724; AVX256-NEXT:    addq $16, %rcx725; AVX256-NEXT:    cmpq %rcx, %rax726; AVX256-NEXT:    jne .LBB5_1727; AVX256-NEXT:  # %bb.2: # %middle.block728; AVX256-NEXT:    vextracti128 $1, %ymm0, %xmm1729; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm0730; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]731; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm0732; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]733; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm0734; AVX256-NEXT:    vmovd %xmm0, %eax735; AVX256-NEXT:    vzeroupper736; AVX256-NEXT:    retq737entry:738  %3 = zext i32 %2 to i64739  br label %vector.body740 741vector.body:742  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]743  %vec.phi = phi <8 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]744  %4 = getelementptr inbounds i8, ptr %0, i64 %index745  %5 = bitcast ptr %4 to ptr746  %wide.load = load <8 x i8>, ptr %5, align 1747  %6 = sext <8 x i8> %wide.load to <8 x i32>748  %7 = getelementptr inbounds i8, ptr %1, i64 %index749  %8 = bitcast ptr %7 to ptr750  %wide.load14 = load <8 x i8>, ptr %8, align 1751  %9 = sext <8 x i8> %wide.load14 to <8 x i32>752  %10 = mul nsw <8 x i32> %9, %6753  %11 = add nsw <8 x i32> %10, %vec.phi754  %index.next = add i64 %index, 16755  %12 = icmp eq i64 %index.next, %3756  br i1 %12, label %middle.block, label %vector.body757 758middle.block:759  %rdx.shuf15 = shufflevector <8 x i32> %11, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>760  %bin.rdx16 = add <8 x i32> %11, %rdx.shuf15761  %rdx.shuf17 = shufflevector <8 x i32> %bin.rdx16, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>762  %bin.rdx18 = add <8 x i32> %bin.rdx16, %rdx.shuf17763  %rdx.shuf19 = shufflevector <8 x i32> %bin.rdx18, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>764  %bin.rdx20 = add <8 x i32> %bin.rdx18, %rdx.shuf19765  %13 = extractelement <8 x i32> %bin.rdx20, i32 0766  ret i32 %13767}768 769define i32 @_Z9test_charPcS_i_512(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {770; SSE2-LABEL: _Z9test_charPcS_i_512:771; SSE2:       # %bb.0: # %entry772; SSE2-NEXT:    movl %edx, %eax773; SSE2-NEXT:    pxor %xmm0, %xmm0774; SSE2-NEXT:    xorl %ecx, %ecx775; SSE2-NEXT:    pxor %xmm2, %xmm2776; SSE2-NEXT:    pxor %xmm1, %xmm1777; SSE2-NEXT:    .p2align 4778; SSE2-NEXT:  .LBB6_1: # %vector.body779; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1780; SSE2-NEXT:    movdqu (%rdi,%rcx), %xmm3781; SSE2-NEXT:    movdqu (%rsi,%rcx), %xmm4782; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3],xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]783; SSE2-NEXT:    psraw $8, %xmm5784; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1],xmm6[2],xmm4[2],xmm6[3],xmm4[3],xmm6[4],xmm4[4],xmm6[5],xmm4[5],xmm6[6],xmm4[6],xmm6[7],xmm4[7]785; SSE2-NEXT:    psraw $8, %xmm6786; SSE2-NEXT:    pmaddwd %xmm5, %xmm6787; SSE2-NEXT:    paddd %xmm6, %xmm2788; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]789; SSE2-NEXT:    psraw $8, %xmm3790; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]791; SSE2-NEXT:    psraw $8, %xmm4792; SSE2-NEXT:    pmaddwd %xmm3, %xmm4793; SSE2-NEXT:    paddd %xmm4, %xmm1794; SSE2-NEXT:    addq $16, %rcx795; SSE2-NEXT:    cmpq %rcx, %rax796; SSE2-NEXT:    jne .LBB6_1797; SSE2-NEXT:  # %bb.2: # %middle.block798; SSE2-NEXT:    paddd %xmm0, %xmm2799; SSE2-NEXT:    paddd %xmm0, %xmm1800; SSE2-NEXT:    paddd %xmm2, %xmm1801; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]802; SSE2-NEXT:    paddd %xmm1, %xmm0803; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]804; SSE2-NEXT:    paddd %xmm0, %xmm1805; SSE2-NEXT:    movd %xmm1, %eax806; SSE2-NEXT:    retq807;808; AVX1-LABEL: _Z9test_charPcS_i_512:809; AVX1:       # %bb.0: # %entry810; AVX1-NEXT:    movl %edx, %eax811; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0812; AVX1-NEXT:    xorl %ecx, %ecx813; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1814; AVX1-NEXT:    .p2align 4815; AVX1-NEXT:  .LBB6_1: # %vector.body816; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1817; AVX1-NEXT:    vpmovsxbw 8(%rdi,%rcx), %xmm2818; AVX1-NEXT:    vpmovsxbw (%rdi,%rcx), %xmm3819; AVX1-NEXT:    vpmovsxbw 8(%rsi,%rcx), %xmm4820; AVX1-NEXT:    vpmaddwd %xmm2, %xmm4, %xmm2821; AVX1-NEXT:    vpmovsxbw (%rsi,%rcx), %xmm4822; AVX1-NEXT:    vpmaddwd %xmm3, %xmm4, %xmm3823; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4824; AVX1-NEXT:    vpaddd %xmm4, %xmm2, %xmm2825; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1826; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1827; AVX1-NEXT:    addq $16, %rcx828; AVX1-NEXT:    cmpq %rcx, %rax829; AVX1-NEXT:    jne .LBB6_1830; AVX1-NEXT:  # %bb.2: # %middle.block831; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2832; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3833; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2834; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm0835; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0836; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]837; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0838; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]839; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0840; AVX1-NEXT:    vmovd %xmm0, %eax841; AVX1-NEXT:    vzeroupper842; AVX1-NEXT:    retq843;844; AVX2-LABEL: _Z9test_charPcS_i_512:845; AVX2:       # %bb.0: # %entry846; AVX2-NEXT:    movl %edx, %eax847; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm0848; AVX2-NEXT:    xorl %ecx, %ecx849; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1850; AVX2-NEXT:    .p2align 4851; AVX2-NEXT:  .LBB6_1: # %vector.body852; AVX2-NEXT:    # =>This Inner Loop Header: Depth=1853; AVX2-NEXT:    vpmovsxbw (%rdi,%rcx), %ymm2854; AVX2-NEXT:    vpmovsxbw (%rsi,%rcx), %ymm3855; AVX2-NEXT:    vpmaddwd %ymm2, %ymm3, %ymm2856; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm1857; AVX2-NEXT:    addq $16, %rcx858; AVX2-NEXT:    cmpq %rcx, %rax859; AVX2-NEXT:    jne .LBB6_1860; AVX2-NEXT:  # %bb.2: # %middle.block861; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0862; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1863; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0864; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]865; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0866; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]867; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0868; AVX2-NEXT:    vmovd %xmm0, %eax869; AVX2-NEXT:    vzeroupper870; AVX2-NEXT:    retq871;872; AVX512-LABEL: _Z9test_charPcS_i_512:873; AVX512:       # %bb.0: # %entry874; AVX512-NEXT:    movl %edx, %eax875; AVX512-NEXT:    vpxor %xmm0, %xmm0, %xmm0876; AVX512-NEXT:    xorl %ecx, %ecx877; AVX512-NEXT:    .p2align 4878; AVX512-NEXT:  .LBB6_1: # %vector.body879; AVX512-NEXT:    # =>This Inner Loop Header: Depth=1880; AVX512-NEXT:    vpmovsxbw (%rdi,%rcx), %ymm1881; AVX512-NEXT:    vpmovsxbw (%rsi,%rcx), %ymm2882; AVX512-NEXT:    vpmaddwd %ymm1, %ymm2, %ymm1883; AVX512-NEXT:    vpaddd %zmm0, %zmm1, %zmm0884; AVX512-NEXT:    addq $16, %rcx885; AVX512-NEXT:    cmpq %rcx, %rax886; AVX512-NEXT:    jne .LBB6_1887; AVX512-NEXT:  # %bb.2: # %middle.block888; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1889; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0890; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1891; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0892; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]893; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0894; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]895; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0896; AVX512-NEXT:    vmovd %xmm0, %eax897; AVX512-NEXT:    vzeroupper898; AVX512-NEXT:    retq899entry:900  %3 = zext i32 %2 to i64901  br label %vector.body902 903vector.body:904  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]905  %vec.phi = phi <16 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]906  %4 = getelementptr inbounds i8, ptr %0, i64 %index907  %5 = bitcast ptr %4 to ptr908  %wide.load = load <16 x i8>, ptr %5, align 1909  %6 = sext <16 x i8> %wide.load to <16 x i32>910  %7 = getelementptr inbounds i8, ptr %1, i64 %index911  %8 = bitcast ptr %7 to ptr912  %wide.load14 = load <16 x i8>, ptr %8, align 1913  %9 = sext <16 x i8> %wide.load14 to <16 x i32>914  %10 = mul nsw <16 x i32> %9, %6915  %11 = add nsw <16 x i32> %10, %vec.phi916  %index.next = add i64 %index, 16917  %12 = icmp eq i64 %index.next, %3918  br i1 %12, label %middle.block, label %vector.body919 920middle.block:921  %rdx.shuf = shufflevector <16 x i32> %11, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>922  %bin.rdx = add <16 x i32> %11, %rdx.shuf923  %rdx.shuf15 = shufflevector <16 x i32> %bin.rdx, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>924  %bin.rdx16 = add <16 x i32> %bin.rdx, %rdx.shuf15925  %rdx.shuf17 = shufflevector <16 x i32> %bin.rdx16, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>926  %bin.rdx18 = add <16 x i32> %bin.rdx16, %rdx.shuf17927  %rdx.shuf19 = shufflevector <16 x i32> %bin.rdx18, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>928  %bin.rdx20 = add <16 x i32> %bin.rdx18, %rdx.shuf19929  %13 = extractelement <16 x i32> %bin.rdx20, i32 0930  ret i32 %13931}932 933define i32 @_Z9test_charPcS_i_1024(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {934; SSE2-LABEL: _Z9test_charPcS_i_1024:935; SSE2:       # %bb.0: # %entry936; SSE2-NEXT:    movl %edx, %eax937; SSE2-NEXT:    pxor %xmm0, %xmm0938; SSE2-NEXT:    xorl %ecx, %ecx939; SSE2-NEXT:    pxor %xmm2, %xmm2940; SSE2-NEXT:    pxor %xmm4, %xmm4941; SSE2-NEXT:    pxor %xmm1, %xmm1942; SSE2-NEXT:    pxor %xmm3, %xmm3943; SSE2-NEXT:    .p2align 4944; SSE2-NEXT:  .LBB7_1: # %vector.body945; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1946; SSE2-NEXT:    movdqu (%rdi,%rcx), %xmm7947; SSE2-NEXT:    movdqu 16(%rdi,%rcx), %xmm6948; SSE2-NEXT:    movdqu (%rsi,%rcx), %xmm8949; SSE2-NEXT:    movdqu 16(%rsi,%rcx), %xmm5950; SSE2-NEXT:    punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm7[0],xmm9[1],xmm7[1],xmm9[2],xmm7[2],xmm9[3],xmm7[3],xmm9[4],xmm7[4],xmm9[5],xmm7[5],xmm9[6],xmm7[6],xmm9[7],xmm7[7]951; SSE2-NEXT:    psraw $8, %xmm9952; SSE2-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm8[0],xmm10[1],xmm8[1],xmm10[2],xmm8[2],xmm10[3],xmm8[3],xmm10[4],xmm8[4],xmm10[5],xmm8[5],xmm10[6],xmm8[6],xmm10[7],xmm8[7]953; SSE2-NEXT:    psraw $8, %xmm10954; SSE2-NEXT:    pmaddwd %xmm9, %xmm10955; SSE2-NEXT:    paddd %xmm10, %xmm2956; SSE2-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]957; SSE2-NEXT:    psraw $8, %xmm7958; SSE2-NEXT:    punpckhbw {{.*#+}} xmm8 = xmm8[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]959; SSE2-NEXT:    psraw $8, %xmm8960; SSE2-NEXT:    pmaddwd %xmm7, %xmm8961; SSE2-NEXT:    paddd %xmm8, %xmm4962; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]963; SSE2-NEXT:    psraw $8, %xmm7964; SSE2-NEXT:    punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm5[0],xmm8[1],xmm5[1],xmm8[2],xmm5[2],xmm8[3],xmm5[3],xmm8[4],xmm5[4],xmm8[5],xmm5[5],xmm8[6],xmm5[6],xmm8[7],xmm5[7]965; SSE2-NEXT:    psraw $8, %xmm8966; SSE2-NEXT:    pmaddwd %xmm7, %xmm8967; SSE2-NEXT:    paddd %xmm8, %xmm1968; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]969; SSE2-NEXT:    psraw $8, %xmm6970; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]971; SSE2-NEXT:    psraw $8, %xmm5972; SSE2-NEXT:    pmaddwd %xmm6, %xmm5973; SSE2-NEXT:    paddd %xmm5, %xmm3974; SSE2-NEXT:    addq $32, %rcx975; SSE2-NEXT:    cmpq %rcx, %rax976; SSE2-NEXT:    jne .LBB7_1977; SSE2-NEXT:  # %bb.2: # %middle.block978; SSE2-NEXT:    paddd %xmm0, %xmm4979; SSE2-NEXT:    paddd %xmm0, %xmm3980; SSE2-NEXT:    paddd %xmm4, %xmm3981; SSE2-NEXT:    paddd %xmm0, %xmm2982; SSE2-NEXT:    paddd %xmm0, %xmm1983; SSE2-NEXT:    paddd %xmm2, %xmm1984; SSE2-NEXT:    paddd %xmm3, %xmm1985; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]986; SSE2-NEXT:    paddd %xmm1, %xmm0987; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]988; SSE2-NEXT:    paddd %xmm0, %xmm1989; SSE2-NEXT:    movd %xmm1, %eax990; SSE2-NEXT:    retq991;992; AVX1-LABEL: _Z9test_charPcS_i_1024:993; AVX1:       # %bb.0: # %entry994; AVX1-NEXT:    movl %edx, %eax995; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0996; AVX1-NEXT:    xorl %ecx, %ecx997; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2998; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1999; AVX1-NEXT:    .p2align 41000; AVX1-NEXT:  .LBB7_1: # %vector.body1001; AVX1-NEXT:    # =>This Inner Loop Header: Depth=11002; AVX1-NEXT:    vpmovsxbw 24(%rdi,%rcx), %xmm31003; AVX1-NEXT:    vpmovsxbw 16(%rdi,%rcx), %xmm41004; AVX1-NEXT:    vpmovsxbw 8(%rdi,%rcx), %xmm51005; AVX1-NEXT:    vpmovsxbw (%rdi,%rcx), %xmm61006; AVX1-NEXT:    vpmovsxbw 24(%rsi,%rcx), %xmm71007; AVX1-NEXT:    vpmaddwd %xmm3, %xmm7, %xmm31008; AVX1-NEXT:    vpmovsxbw 16(%rsi,%rcx), %xmm71009; AVX1-NEXT:    vpmaddwd %xmm4, %xmm7, %xmm41010; AVX1-NEXT:    vpmovsxbw 8(%rsi,%rcx), %xmm71011; AVX1-NEXT:    vpmaddwd %xmm5, %xmm7, %xmm51012; AVX1-NEXT:    vpmovsxbw (%rsi,%rcx), %xmm71013; AVX1-NEXT:    vpmaddwd %xmm6, %xmm7, %xmm61014; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm71015; AVX1-NEXT:    vpaddd %xmm7, %xmm3, %xmm31016; AVX1-NEXT:    vpaddd %xmm1, %xmm4, %xmm11017; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm11018; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm31019; AVX1-NEXT:    vpaddd %xmm3, %xmm5, %xmm31020; AVX1-NEXT:    vpaddd %xmm2, %xmm6, %xmm21021; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm21022; AVX1-NEXT:    addq $32, %rcx1023; AVX1-NEXT:    cmpq %rcx, %rax1024; AVX1-NEXT:    jne .LBB7_11025; AVX1-NEXT:  # %bb.2: # %middle.block1026; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm31027; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm41028; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm31029; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm21030; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01031; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm21032; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11033; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm01034; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm01035; AVX1-NEXT:    vpaddd %xmm0, %xmm3, %xmm01036; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1037; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01038; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1039; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01040; AVX1-NEXT:    vmovd %xmm0, %eax1041; AVX1-NEXT:    vzeroupper1042; AVX1-NEXT:    retq1043;1044; AVX2-LABEL: _Z9test_charPcS_i_1024:1045; AVX2:       # %bb.0: # %entry1046; AVX2-NEXT:    movl %edx, %eax1047; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm01048; AVX2-NEXT:    xorl %ecx, %ecx1049; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11050; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm21051; AVX2-NEXT:    .p2align 41052; AVX2-NEXT:  .LBB7_1: # %vector.body1053; AVX2-NEXT:    # =>This Inner Loop Header: Depth=11054; AVX2-NEXT:    vpmovsxbw 16(%rdi,%rcx), %ymm31055; AVX2-NEXT:    vpmovsxbw (%rdi,%rcx), %ymm41056; AVX2-NEXT:    vpmovsxbw 16(%rsi,%rcx), %ymm51057; AVX2-NEXT:    vpmaddwd %ymm3, %ymm5, %ymm31058; AVX2-NEXT:    vpaddd %ymm2, %ymm3, %ymm21059; AVX2-NEXT:    vpmovsxbw (%rsi,%rcx), %ymm31060; AVX2-NEXT:    vpmaddwd %ymm4, %ymm3, %ymm31061; AVX2-NEXT:    vpaddd %ymm1, %ymm3, %ymm11062; AVX2-NEXT:    addq $32, %rcx1063; AVX2-NEXT:    cmpq %rcx, %rax1064; AVX2-NEXT:    jne .LBB7_11065; AVX2-NEXT:  # %bb.2: # %middle.block1066; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm11067; AVX2-NEXT:    vpaddd %ymm0, %ymm2, %ymm01068; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm01069; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11070; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01071; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1072; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01073; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1074; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01075; AVX2-NEXT:    vmovd %xmm0, %eax1076; AVX2-NEXT:    vzeroupper1077; AVX2-NEXT:    retq1078;1079; AVX512F-LABEL: _Z9test_charPcS_i_1024:1080; AVX512F:       # %bb.0: # %entry1081; AVX512F-NEXT:    movl %edx, %eax1082; AVX512F-NEXT:    vpxor %xmm0, %xmm0, %xmm01083; AVX512F-NEXT:    xorl %ecx, %ecx1084; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm11085; AVX512F-NEXT:    .p2align 41086; AVX512F-NEXT:  .LBB7_1: # %vector.body1087; AVX512F-NEXT:    # =>This Inner Loop Header: Depth=11088; AVX512F-NEXT:    vpmovsxbw (%rdi,%rcx), %ymm21089; AVX512F-NEXT:    vpmovsxbw 16(%rdi,%rcx), %ymm31090; AVX512F-NEXT:    vpmovsxbw (%rsi,%rcx), %ymm41091; AVX512F-NEXT:    vpmaddwd %ymm2, %ymm4, %ymm21092; AVX512F-NEXT:    vpmovsxbw 16(%rsi,%rcx), %ymm41093; AVX512F-NEXT:    vpmaddwd %ymm3, %ymm4, %ymm31094; AVX512F-NEXT:    vinserti64x4 $1, %ymm3, %zmm2, %zmm21095; AVX512F-NEXT:    vpaddd %zmm1, %zmm2, %zmm11096; AVX512F-NEXT:    addq $32, %rcx1097; AVX512F-NEXT:    cmpq %rcx, %rax1098; AVX512F-NEXT:    jne .LBB7_11099; AVX512F-NEXT:  # %bb.2: # %middle.block1100; AVX512F-NEXT:    vpaddd %zmm0, %zmm1, %zmm01101; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm11102; AVX512F-NEXT:    vpaddd %zmm1, %zmm0, %zmm01103; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm11104; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm01105; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1106; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm01107; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1108; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm01109; AVX512F-NEXT:    vmovd %xmm0, %eax1110; AVX512F-NEXT:    vzeroupper1111; AVX512F-NEXT:    retq1112;1113; AVX512BW-LABEL: _Z9test_charPcS_i_1024:1114; AVX512BW:       # %bb.0: # %entry1115; AVX512BW-NEXT:    movl %edx, %eax1116; AVX512BW-NEXT:    vpxor %xmm0, %xmm0, %xmm01117; AVX512BW-NEXT:    xorl %ecx, %ecx1118; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm11119; AVX512BW-NEXT:    .p2align 41120; AVX512BW-NEXT:  .LBB7_1: # %vector.body1121; AVX512BW-NEXT:    # =>This Inner Loop Header: Depth=11122; AVX512BW-NEXT:    vpmovsxbw (%rdi,%rcx), %zmm21123; AVX512BW-NEXT:    vpmovsxbw (%rsi,%rcx), %zmm31124; AVX512BW-NEXT:    vpmaddwd %zmm2, %zmm3, %zmm21125; AVX512BW-NEXT:    vpaddd %zmm1, %zmm2, %zmm11126; AVX512BW-NEXT:    addq $32, %rcx1127; AVX512BW-NEXT:    cmpq %rcx, %rax1128; AVX512BW-NEXT:    jne .LBB7_11129; AVX512BW-NEXT:  # %bb.2: # %middle.block1130; AVX512BW-NEXT:    vpaddd %zmm0, %zmm1, %zmm01131; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm11132; AVX512BW-NEXT:    vpaddd %zmm1, %zmm0, %zmm01133; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm11134; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm01135; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1136; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm01137; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1138; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm01139; AVX512BW-NEXT:    vmovd %xmm0, %eax1140; AVX512BW-NEXT:    vzeroupper1141; AVX512BW-NEXT:    retq1142entry:1143  %3 = zext i32 %2 to i641144  br label %vector.body1145 1146vector.body:1147  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]1148  %vec.phi = phi <32 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]1149  %4 = getelementptr inbounds i8, ptr %0, i64 %index1150  %5 = bitcast ptr %4 to ptr1151  %wide.load = load <32 x i8>, ptr %5, align 11152  %6 = sext <32 x i8> %wide.load to <32 x i32>1153  %7 = getelementptr inbounds i8, ptr %1, i64 %index1154  %8 = bitcast ptr %7 to ptr1155  %wide.load14 = load <32 x i8>, ptr %8, align 11156  %9 = sext <32 x i8> %wide.load14 to <32 x i32>1157  %10 = mul nsw <32 x i32> %9, %61158  %11 = add nsw <32 x i32> %10, %vec.phi1159  %index.next = add i64 %index, 321160  %12 = icmp eq i64 %index.next, %31161  br i1 %12, label %middle.block, label %vector.body1162 1163middle.block:1164  %rdx.shuf1 = shufflevector <32 x i32> %11, <32 x i32> undef, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1165  %bin.rdx1 = add <32 x i32> %11, %rdx.shuf11166  %rdx.shuf = shufflevector <32 x i32> %bin.rdx1, <32 x i32> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1167  %bin.rdx = add <32 x i32> %bin.rdx1, %rdx.shuf1168  %rdx.shuf15 = shufflevector <32 x i32> %bin.rdx, <32 x i32> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1169  %bin.rdx32 = add <32 x i32> %bin.rdx, %rdx.shuf151170  %rdx.shuf17 = shufflevector <32 x i32> %bin.rdx32, <32 x i32> undef, <32 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1171  %bin.rdx18 = add <32 x i32> %bin.rdx32, %rdx.shuf171172  %rdx.shuf19 = shufflevector <32 x i32> %bin.rdx18, <32 x i32> undef, <32 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1173  %bin.rdx20 = add <32 x i32> %bin.rdx18, %rdx.shuf191174  %13 = extractelement <32 x i32> %bin.rdx20, i32 01175  ret i32 %131176}1177 1178define i32 @test_unsigned_short_128(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {1179; SSE2-LABEL: test_unsigned_short_128:1180; SSE2:       # %bb.0: # %entry1181; SSE2-NEXT:    movl %edx, %eax1182; SSE2-NEXT:    pxor %xmm0, %xmm01183; SSE2-NEXT:    xorl %ecx, %ecx1184; SSE2-NEXT:    .p2align 41185; SSE2-NEXT:  .LBB8_1: # %vector.body1186; SSE2-NEXT:    # =>This Inner Loop Header: Depth=11187; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero1188; SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero1189; SSE2-NEXT:    movdqa %xmm2, %xmm31190; SSE2-NEXT:    pmulhuw %xmm1, %xmm31191; SSE2-NEXT:    pmullw %xmm1, %xmm21192; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]1193; SSE2-NEXT:    paddd %xmm2, %xmm01194; SSE2-NEXT:    addq $16, %rcx1195; SSE2-NEXT:    cmpq %rcx, %rax1196; SSE2-NEXT:    jne .LBB8_11197; SSE2-NEXT:  # %bb.2: # %middle.block1198; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1199; SSE2-NEXT:    paddd %xmm0, %xmm11200; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1201; SSE2-NEXT:    paddd %xmm1, %xmm01202; SSE2-NEXT:    movd %xmm0, %eax1203; SSE2-NEXT:    retq1204;1205; AVX-LABEL: test_unsigned_short_128:1206; AVX:       # %bb.0: # %entry1207; AVX-NEXT:    movl %edx, %eax1208; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm01209; AVX-NEXT:    xorl %ecx, %ecx1210; AVX-NEXT:    .p2align 41211; AVX-NEXT:  .LBB8_1: # %vector.body1212; AVX-NEXT:    # =>This Inner Loop Header: Depth=11213; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1214; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1215; AVX-NEXT:    vpmulld %xmm1, %xmm2, %xmm11216; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm01217; AVX-NEXT:    addq $16, %rcx1218; AVX-NEXT:    cmpq %rcx, %rax1219; AVX-NEXT:    jne .LBB8_11220; AVX-NEXT:  # %bb.2: # %middle.block1221; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1222; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm01223; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1224; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm01225; AVX-NEXT:    vmovd %xmm0, %eax1226; AVX-NEXT:    retq1227entry:1228  %3 = zext i32 %2 to i641229  br label %vector.body1230 1231vector.body:1232  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]1233  %vec.phi = phi <4 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]1234  %4 = getelementptr inbounds i16, ptr %0, i64 %index1235  %5 = bitcast ptr %4 to ptr1236  %wide.load = load <4 x i16>, ptr %5, align 21237  %6 = zext <4 x i16> %wide.load to <4 x i32>1238  %7 = getelementptr inbounds i16, ptr %1, i64 %index1239  %8 = bitcast ptr %7 to ptr1240  %wide.load14 = load <4 x i16>, ptr %8, align 21241  %9 = zext <4 x i16> %wide.load14 to <4 x i32>1242  %10 = mul nsw <4 x i32> %9, %61243  %11 = add nsw <4 x i32> %10, %vec.phi1244  %index.next = add i64 %index, 161245  %12 = icmp eq i64 %index.next, %31246  br i1 %12, label %middle.block, label %vector.body1247 1248middle.block:1249  %rdx.shuf15 = shufflevector <4 x i32> %11, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>1250  %bin.rdx16 = add <4 x i32> %11, %rdx.shuf151251  %rdx.shuf17 = shufflevector <4 x i32> %bin.rdx16, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>1252  %bin.rdx18 = add <4 x i32> %bin.rdx16, %rdx.shuf171253  %13 = extractelement <4 x i32> %bin.rdx18, i32 01254  ret i32 %131255}1256 1257define i32 @test_unsigned_short_256(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {1258; SSE2-LABEL: test_unsigned_short_256:1259; SSE2:       # %bb.0: # %entry1260; SSE2-NEXT:    movl %edx, %eax1261; SSE2-NEXT:    pxor %xmm0, %xmm01262; SSE2-NEXT:    xorl %ecx, %ecx1263; SSE2-NEXT:    pxor %xmm1, %xmm11264; SSE2-NEXT:    .p2align 41265; SSE2-NEXT:  .LBB9_1: # %vector.body1266; SSE2-NEXT:    # =>This Inner Loop Header: Depth=11267; SSE2-NEXT:    movdqu (%rdi,%rcx,2), %xmm21268; SSE2-NEXT:    movdqu (%rsi,%rcx,2), %xmm31269; SSE2-NEXT:    movdqa %xmm3, %xmm41270; SSE2-NEXT:    pmulhuw %xmm2, %xmm41271; SSE2-NEXT:    pmullw %xmm2, %xmm31272; SSE2-NEXT:    movdqa %xmm3, %xmm21273; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]1274; SSE2-NEXT:    paddd %xmm2, %xmm01275; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]1276; SSE2-NEXT:    paddd %xmm3, %xmm11277; SSE2-NEXT:    addq $16, %rcx1278; SSE2-NEXT:    cmpq %rcx, %rax1279; SSE2-NEXT:    jne .LBB9_11280; SSE2-NEXT:  # %bb.2: # %middle.block1281; SSE2-NEXT:    paddd %xmm1, %xmm01282; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1283; SSE2-NEXT:    paddd %xmm0, %xmm11284; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1285; SSE2-NEXT:    paddd %xmm1, %xmm01286; SSE2-NEXT:    movd %xmm0, %eax1287; SSE2-NEXT:    retq1288;1289; AVX1-LABEL: test_unsigned_short_256:1290; AVX1:       # %bb.0: # %entry1291; AVX1-NEXT:    movl %edx, %eax1292; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm01293; AVX1-NEXT:    xorl %ecx, %ecx1294; AVX1-NEXT:    .p2align 41295; AVX1-NEXT:  .LBB9_1: # %vector.body1296; AVX1-NEXT:    # =>This Inner Loop Header: Depth=11297; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1298; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1299; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm3 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1300; AVX1-NEXT:    vpmulld %xmm1, %xmm3, %xmm11301; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm3 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1302; AVX1-NEXT:    vpmulld %xmm2, %xmm3, %xmm21303; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm31304; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm11305; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm01306; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01307; AVX1-NEXT:    addq $16, %rcx1308; AVX1-NEXT:    cmpq %rcx, %rax1309; AVX1-NEXT:    jne .LBB9_11310; AVX1-NEXT:  # %bb.2: # %middle.block1311; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11312; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01313; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1314; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01315; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1316; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01317; AVX1-NEXT:    vmovd %xmm0, %eax1318; AVX1-NEXT:    vzeroupper1319; AVX1-NEXT:    retq1320;1321; AVX256-LABEL: test_unsigned_short_256:1322; AVX256:       # %bb.0: # %entry1323; AVX256-NEXT:    movl %edx, %eax1324; AVX256-NEXT:    vpxor %xmm0, %xmm0, %xmm01325; AVX256-NEXT:    xorl %ecx, %ecx1326; AVX256-NEXT:    .p2align 41327; AVX256-NEXT:  .LBB9_1: # %vector.body1328; AVX256-NEXT:    # =>This Inner Loop Header: Depth=11329; AVX256-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],zero1330; AVX256-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],zero1331; AVX256-NEXT:    vpmulld %ymm1, %ymm2, %ymm11332; AVX256-NEXT:    vpaddd %ymm0, %ymm1, %ymm01333; AVX256-NEXT:    addq $16, %rcx1334; AVX256-NEXT:    cmpq %rcx, %rax1335; AVX256-NEXT:    jne .LBB9_11336; AVX256-NEXT:  # %bb.2: # %middle.block1337; AVX256-NEXT:    vextracti128 $1, %ymm0, %xmm11338; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm01339; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1340; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm01341; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1342; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm01343; AVX256-NEXT:    vmovd %xmm0, %eax1344; AVX256-NEXT:    vzeroupper1345; AVX256-NEXT:    retq1346entry:1347  %3 = zext i32 %2 to i641348  br label %vector.body1349 1350vector.body:1351  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]1352  %vec.phi = phi <8 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]1353  %4 = getelementptr inbounds i16, ptr %0, i64 %index1354  %5 = bitcast ptr %4 to ptr1355  %wide.load = load <8 x i16>, ptr %5, align 21356  %6 = zext <8 x i16> %wide.load to <8 x i32>1357  %7 = getelementptr inbounds i16, ptr %1, i64 %index1358  %8 = bitcast ptr %7 to ptr1359  %wide.load14 = load <8 x i16>, ptr %8, align 21360  %9 = zext <8 x i16> %wide.load14 to <8 x i32>1361  %10 = mul nsw <8 x i32> %9, %61362  %11 = add nsw <8 x i32> %10, %vec.phi1363  %index.next = add i64 %index, 161364  %12 = icmp eq i64 %index.next, %31365  br i1 %12, label %middle.block, label %vector.body1366 1367middle.block:1368  %rdx.shuf = shufflevector <8 x i32> %11, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>1369  %bin.rdx = add <8 x i32> %11, %rdx.shuf1370  %rdx.shuf15 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1371  %bin.rdx16 = add <8 x i32> %bin.rdx, %rdx.shuf151372  %rdx.shuf17 = shufflevector <8 x i32> %bin.rdx16, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1373  %bin.rdx18 = add <8 x i32> %bin.rdx16, %rdx.shuf171374  %13 = extractelement <8 x i32> %bin.rdx18, i32 01375  ret i32 %131376}1377 1378define i32 @test_unsigned_short_512(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {1379; SSE2-LABEL: test_unsigned_short_512:1380; SSE2:       # %bb.0: # %entry1381; SSE2-NEXT:    movl %edx, %eax1382; SSE2-NEXT:    pxor %xmm0, %xmm01383; SSE2-NEXT:    xorl %ecx, %ecx1384; SSE2-NEXT:    pxor %xmm1, %xmm11385; SSE2-NEXT:    pxor %xmm3, %xmm31386; SSE2-NEXT:    pxor %xmm2, %xmm21387; SSE2-NEXT:    .p2align 41388; SSE2-NEXT:  .LBB10_1: # %vector.body1389; SSE2-NEXT:    # =>This Inner Loop Header: Depth=11390; SSE2-NEXT:    movdqu (%rdi,%rcx,2), %xmm41391; SSE2-NEXT:    movdqu 16(%rdi,%rcx,2), %xmm51392; SSE2-NEXT:    movdqu (%rsi,%rcx,2), %xmm61393; SSE2-NEXT:    movdqu 16(%rsi,%rcx,2), %xmm71394; SSE2-NEXT:    movdqa %xmm6, %xmm81395; SSE2-NEXT:    pmulhuw %xmm4, %xmm81396; SSE2-NEXT:    pmullw %xmm4, %xmm61397; SSE2-NEXT:    movdqa %xmm6, %xmm41398; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1],xmm4[2],xmm8[2],xmm4[3],xmm8[3]1399; SSE2-NEXT:    paddd %xmm4, %xmm01400; SSE2-NEXT:    punpckhwd {{.*#+}} xmm6 = xmm6[4],xmm8[4],xmm6[5],xmm8[5],xmm6[6],xmm8[6],xmm6[7],xmm8[7]1401; SSE2-NEXT:    paddd %xmm6, %xmm11402; SSE2-NEXT:    movdqa %xmm7, %xmm41403; SSE2-NEXT:    pmulhuw %xmm5, %xmm41404; SSE2-NEXT:    pmullw %xmm5, %xmm71405; SSE2-NEXT:    movdqa %xmm7, %xmm51406; SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]1407; SSE2-NEXT:    paddd %xmm5, %xmm31408; SSE2-NEXT:    punpckhwd {{.*#+}} xmm7 = xmm7[4],xmm4[4],xmm7[5],xmm4[5],xmm7[6],xmm4[6],xmm7[7],xmm4[7]1409; SSE2-NEXT:    paddd %xmm7, %xmm21410; SSE2-NEXT:    addq $16, %rcx1411; SSE2-NEXT:    cmpq %rcx, %rax1412; SSE2-NEXT:    jne .LBB10_11413; SSE2-NEXT:  # %bb.2: # %middle.block1414; SSE2-NEXT:    paddd %xmm3, %xmm01415; SSE2-NEXT:    paddd %xmm2, %xmm11416; SSE2-NEXT:    paddd %xmm0, %xmm11417; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1418; SSE2-NEXT:    paddd %xmm1, %xmm01419; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1420; SSE2-NEXT:    paddd %xmm0, %xmm11421; SSE2-NEXT:    movd %xmm1, %eax1422; SSE2-NEXT:    retq1423;1424; AVX1-LABEL: test_unsigned_short_512:1425; AVX1:       # %bb.0: # %entry1426; AVX1-NEXT:    movl %edx, %eax1427; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm01428; AVX1-NEXT:    xorl %ecx, %ecx1429; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11430; AVX1-NEXT:    .p2align 41431; AVX1-NEXT:  .LBB10_1: # %vector.body1432; AVX1-NEXT:    # =>This Inner Loop Header: Depth=11433; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1434; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm3 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1435; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1436; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm5 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1437; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm6 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1438; AVX1-NEXT:    vpmulld %xmm2, %xmm6, %xmm21439; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm6 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1440; AVX1-NEXT:    vpmulld %xmm3, %xmm6, %xmm31441; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm6 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1442; AVX1-NEXT:    vpmulld %xmm4, %xmm6, %xmm41443; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm6 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1444; AVX1-NEXT:    vpmulld %xmm5, %xmm6, %xmm51445; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm61446; AVX1-NEXT:    vpaddd %xmm6, %xmm2, %xmm21447; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm11448; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm11449; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21450; AVX1-NEXT:    vpaddd %xmm2, %xmm4, %xmm21451; AVX1-NEXT:    vpaddd %xmm0, %xmm5, %xmm01452; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01453; AVX1-NEXT:    addq $16, %rcx1454; AVX1-NEXT:    cmpq %rcx, %rax1455; AVX1-NEXT:    jne .LBB10_11456; AVX1-NEXT:  # %bb.2: # %middle.block1457; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21458; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm31459; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm21460; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01461; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm01462; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1463; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01464; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1465; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01466; AVX1-NEXT:    vmovd %xmm0, %eax1467; AVX1-NEXT:    vzeroupper1468; AVX1-NEXT:    retq1469;1470; AVX2-LABEL: test_unsigned_short_512:1471; AVX2:       # %bb.0: # %entry1472; AVX2-NEXT:    movl %edx, %eax1473; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm01474; AVX2-NEXT:    xorl %ecx, %ecx1475; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11476; AVX2-NEXT:    .p2align 41477; AVX2-NEXT:  .LBB10_1: # %vector.body1478; AVX2-NEXT:    # =>This Inner Loop Header: Depth=11479; 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],zero1480; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm3 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1481; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1482; AVX2-NEXT:    vpmulld %ymm2, %ymm4, %ymm21483; AVX2-NEXT:    vpaddd %ymm0, %ymm2, %ymm01484; 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],zero1485; AVX2-NEXT:    vpmulld %ymm3, %ymm2, %ymm21486; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm11487; AVX2-NEXT:    addq $16, %rcx1488; AVX2-NEXT:    cmpq %rcx, %rax1489; AVX2-NEXT:    jne .LBB10_11490; AVX2-NEXT:  # %bb.2: # %middle.block1491; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm01492; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11493; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01494; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1495; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01496; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1497; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01498; AVX2-NEXT:    vmovd %xmm0, %eax1499; AVX2-NEXT:    vzeroupper1500; AVX2-NEXT:    retq1501;1502; AVX512-LABEL: test_unsigned_short_512:1503; AVX512:       # %bb.0: # %entry1504; AVX512-NEXT:    movl %edx, %eax1505; AVX512-NEXT:    vpxor %xmm0, %xmm0, %xmm01506; AVX512-NEXT:    xorl %ecx, %ecx1507; AVX512-NEXT:    .p2align 41508; AVX512-NEXT:  .LBB10_1: # %vector.body1509; AVX512-NEXT:    # =>This Inner Loop Header: Depth=11510; AVX512-NEXT:    vpmovzxwd {{.*#+}} zmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero1511; AVX512-NEXT:    vpmovzxwd {{.*#+}} zmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero1512; AVX512-NEXT:    vpmulld %zmm1, %zmm2, %zmm11513; AVX512-NEXT:    vpaddd %zmm0, %zmm1, %zmm01514; AVX512-NEXT:    addq $16, %rcx1515; AVX512-NEXT:    cmpq %rcx, %rax1516; AVX512-NEXT:    jne .LBB10_11517; AVX512-NEXT:  # %bb.2: # %middle.block1518; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11519; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm01520; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11521; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01522; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1523; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01524; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1525; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01526; AVX512-NEXT:    vmovd %xmm0, %eax1527; AVX512-NEXT:    vzeroupper1528; AVX512-NEXT:    retq1529entry:1530  %3 = zext i32 %2 to i641531  br label %vector.body1532 1533vector.body:1534  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]1535  %vec.phi = phi <16 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]1536  %4 = getelementptr inbounds i16, ptr %0, i64 %index1537  %5 = bitcast ptr %4 to ptr1538  %wide.load = load <16 x i16>, ptr %5, align 21539  %6 = zext <16 x i16> %wide.load to <16 x i32>1540  %7 = getelementptr inbounds i16, ptr %1, i64 %index1541  %8 = bitcast ptr %7 to ptr1542  %wide.load14 = load <16 x i16>, ptr %8, align 21543  %9 = zext <16 x i16> %wide.load14 to <16 x i32>1544  %10 = mul nsw <16 x i32> %9, %61545  %11 = add nsw <16 x i32> %10, %vec.phi1546  %index.next = add i64 %index, 161547  %12 = icmp eq i64 %index.next, %31548  br i1 %12, label %middle.block, label %vector.body1549 1550middle.block:1551  %rdx.shuf1 = shufflevector <16 x i32> %11, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1552  %bin.rdx1 = add <16 x i32> %11, %rdx.shuf11553  %rdx.shuf = shufflevector <16 x i32> %bin.rdx1, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1554  %bin.rdx = add <16 x i32> %bin.rdx1, %rdx.shuf1555  %rdx.shuf15 = shufflevector <16 x i32> %bin.rdx, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1556  %bin.rdx16 = add <16 x i32> %bin.rdx, %rdx.shuf151557  %rdx.shuf17 = shufflevector <16 x i32> %bin.rdx16, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1558  %bin.rdx18 = add <16 x i32> %bin.rdx16, %rdx.shuf171559  %13 = extractelement <16 x i32> %bin.rdx18, i32 01560  ret i32 %131561}1562 1563define i32 @test_unsigned_short_1024(ptr nocapture readonly, ptr nocapture readonly, i32) local_unnamed_addr #0 {1564; SSE2-LABEL: test_unsigned_short_1024:1565; SSE2:       # %bb.0: # %entry1566; SSE2-NEXT:    movl %edx, %eax1567; SSE2-NEXT:    pxor %xmm0, %xmm01568; SSE2-NEXT:    xorl %ecx, %ecx1569; SSE2-NEXT:    pxor %xmm3, %xmm31570; SSE2-NEXT:    pxor %xmm1, %xmm11571; SSE2-NEXT:    pxor %xmm2, %xmm21572; SSE2-NEXT:    pxor %xmm4, %xmm41573; SSE2-NEXT:    pxor %xmm6, %xmm61574; SSE2-NEXT:    pxor %xmm5, %xmm51575; SSE2-NEXT:    pxor %xmm7, %xmm71576; SSE2-NEXT:    .p2align 41577; SSE2-NEXT:  .LBB11_1: # %vector.body1578; SSE2-NEXT:    # =>This Inner Loop Header: Depth=11579; SSE2-NEXT:    movdqu 48(%rdi,%rcx,2), %xmm81580; SSE2-NEXT:    movdqu 48(%rsi,%rcx,2), %xmm91581; SSE2-NEXT:    movdqa %xmm9, %xmm101582; SSE2-NEXT:    pmulhuw %xmm8, %xmm101583; SSE2-NEXT:    pmullw %xmm8, %xmm91584; SSE2-NEXT:    movdqa %xmm9, %xmm81585; SSE2-NEXT:    punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm10[4],xmm8[5],xmm10[5],xmm8[6],xmm10[6],xmm8[7],xmm10[7]1586; SSE2-NEXT:    paddd %xmm8, %xmm71587; SSE2-NEXT:    movdqu 32(%rdi,%rcx,2), %xmm81588; SSE2-NEXT:    punpcklwd {{.*#+}} xmm9 = xmm9[0],xmm10[0],xmm9[1],xmm10[1],xmm9[2],xmm10[2],xmm9[3],xmm10[3]1589; SSE2-NEXT:    movdqu 32(%rsi,%rcx,2), %xmm101590; SSE2-NEXT:    paddd %xmm9, %xmm51591; SSE2-NEXT:    movdqa %xmm10, %xmm91592; SSE2-NEXT:    pmulhuw %xmm8, %xmm91593; SSE2-NEXT:    pmullw %xmm8, %xmm101594; SSE2-NEXT:    movdqa %xmm10, %xmm81595; SSE2-NEXT:    punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm9[4],xmm8[5],xmm9[5],xmm8[6],xmm9[6],xmm8[7],xmm9[7]1596; SSE2-NEXT:    paddd %xmm8, %xmm61597; SSE2-NEXT:    movdqu (%rdi,%rcx,2), %xmm81598; SSE2-NEXT:    punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm9[0],xmm10[1],xmm9[1],xmm10[2],xmm9[2],xmm10[3],xmm9[3]1599; SSE2-NEXT:    movdqu (%rsi,%rcx,2), %xmm91600; SSE2-NEXT:    paddd %xmm10, %xmm41601; SSE2-NEXT:    movdqa %xmm9, %xmm101602; SSE2-NEXT:    pmulhuw %xmm8, %xmm101603; SSE2-NEXT:    pmullw %xmm8, %xmm91604; SSE2-NEXT:    movdqa %xmm9, %xmm81605; SSE2-NEXT:    punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm10[0],xmm8[1],xmm10[1],xmm8[2],xmm10[2],xmm8[3],xmm10[3]1606; SSE2-NEXT:    paddd %xmm8, %xmm01607; SSE2-NEXT:    movdqu 16(%rdi,%rcx,2), %xmm81608; SSE2-NEXT:    punpckhwd {{.*#+}} xmm9 = xmm9[4],xmm10[4],xmm9[5],xmm10[5],xmm9[6],xmm10[6],xmm9[7],xmm10[7]1609; SSE2-NEXT:    movdqu 16(%rsi,%rcx,2), %xmm101610; SSE2-NEXT:    paddd %xmm9, %xmm31611; SSE2-NEXT:    movdqa %xmm10, %xmm91612; SSE2-NEXT:    pmulhuw %xmm8, %xmm91613; SSE2-NEXT:    pmullw %xmm8, %xmm101614; SSE2-NEXT:    movdqa %xmm10, %xmm81615; SSE2-NEXT:    punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm9[0],xmm8[1],xmm9[1],xmm8[2],xmm9[2],xmm8[3],xmm9[3]1616; SSE2-NEXT:    paddd %xmm8, %xmm11617; SSE2-NEXT:    punpckhwd {{.*#+}} xmm10 = xmm10[4],xmm9[4],xmm10[5],xmm9[5],xmm10[6],xmm9[6],xmm10[7],xmm9[7]1618; SSE2-NEXT:    paddd %xmm10, %xmm21619; SSE2-NEXT:    addq $16, %rcx1620; SSE2-NEXT:    cmpq %rcx, %rax1621; SSE2-NEXT:    jne .LBB11_11622; SSE2-NEXT:  # %bb.2: # %middle.block1623; SSE2-NEXT:    paddd %xmm6, %xmm31624; SSE2-NEXT:    paddd %xmm7, %xmm21625; SSE2-NEXT:    paddd %xmm3, %xmm21626; SSE2-NEXT:    paddd %xmm4, %xmm01627; SSE2-NEXT:    paddd %xmm5, %xmm11628; SSE2-NEXT:    paddd %xmm0, %xmm11629; SSE2-NEXT:    paddd %xmm2, %xmm11630; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1631; SSE2-NEXT:    paddd %xmm1, %xmm01632; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1633; SSE2-NEXT:    paddd %xmm0, %xmm11634; SSE2-NEXT:    movd %xmm1, %eax1635; SSE2-NEXT:    retq1636;1637; AVX1-LABEL: test_unsigned_short_1024:1638; AVX1:       # %bb.0: # %entry1639; AVX1-NEXT:    movl %edx, %eax1640; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm01641; AVX1-NEXT:    xorl %ecx, %ecx1642; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11643; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm31644; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21645; AVX1-NEXT:    .p2align 41646; AVX1-NEXT:  .LBB11_1: # %vector.body1647; AVX1-NEXT:    # =>This Inner Loop Header: Depth=11648; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1649; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm5 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1650; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm6 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1651; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm7 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1652; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm8 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1653; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm9 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1654; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm10 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1655; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm11 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1656; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm12 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1657; AVX1-NEXT:    vpmulld %xmm4, %xmm12, %xmm41658; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm12 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1659; AVX1-NEXT:    vpmulld %xmm5, %xmm12, %xmm51660; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm12 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1661; AVX1-NEXT:    vpmulld %xmm6, %xmm12, %xmm61662; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm12 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1663; AVX1-NEXT:    vpmulld %xmm7, %xmm12, %xmm71664; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm12 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1665; AVX1-NEXT:    vpmulld %xmm8, %xmm12, %xmm81666; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm12 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1667; AVX1-NEXT:    vpmulld %xmm9, %xmm12, %xmm91668; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm12 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1669; AVX1-NEXT:    vpmulld %xmm10, %xmm12, %xmm101670; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm12 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1671; AVX1-NEXT:    vpmulld %xmm11, %xmm12, %xmm111672; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm121673; AVX1-NEXT:    vpaddd %xmm4, %xmm12, %xmm41674; AVX1-NEXT:    vpaddd %xmm1, %xmm5, %xmm11675; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm11676; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm41677; AVX1-NEXT:    vpaddd %xmm4, %xmm6, %xmm41678; AVX1-NEXT:    vpaddd %xmm0, %xmm7, %xmm01679; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm01680; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm41681; AVX1-NEXT:    vpaddd %xmm4, %xmm8, %xmm41682; AVX1-NEXT:    vpaddd %xmm3, %xmm9, %xmm31683; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm31684; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm41685; AVX1-NEXT:    vpaddd %xmm4, %xmm10, %xmm41686; AVX1-NEXT:    vpaddd %xmm2, %xmm11, %xmm21687; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm21688; AVX1-NEXT:    addq $16, %rcx1689; AVX1-NEXT:    cmpq %rcx, %rax1690; AVX1-NEXT:    jne .LBB11_11691; AVX1-NEXT:  # %bb.2: # %middle.block1692; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm41693; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm51694; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm41695; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01696; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm31697; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm01698; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11699; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm21700; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm11701; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01702; AVX1-NEXT:    vpaddd %xmm0, %xmm4, %xmm01703; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1704; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01705; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1706; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01707; AVX1-NEXT:    vmovd %xmm0, %eax1708; AVX1-NEXT:    vzeroupper1709; AVX1-NEXT:    retq1710;1711; AVX2-LABEL: test_unsigned_short_1024:1712; AVX2:       # %bb.0: # %entry1713; AVX2-NEXT:    movl %edx, %eax1714; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm01715; AVX2-NEXT:    xorl %ecx, %ecx1716; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11717; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm21718; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm31719; AVX2-NEXT:    .p2align 41720; AVX2-NEXT:  .LBB11_1: # %vector.body1721; AVX2-NEXT:    # =>This Inner Loop Header: Depth=11722; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1723; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm5 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1724; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm6 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1725; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm7 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1726; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm8 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1727; AVX2-NEXT:    vpmulld %ymm4, %ymm8, %ymm41728; AVX2-NEXT:    vpaddd %ymm2, %ymm4, %ymm21729; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1730; AVX2-NEXT:    vpmulld %ymm5, %ymm4, %ymm41731; AVX2-NEXT:    vpaddd %ymm0, %ymm4, %ymm01732; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1733; AVX2-NEXT:    vpmulld %ymm6, %ymm4, %ymm41734; AVX2-NEXT:    vpaddd %ymm1, %ymm4, %ymm11735; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero1736; AVX2-NEXT:    vpmulld %ymm7, %ymm4, %ymm41737; AVX2-NEXT:    vpaddd %ymm3, %ymm4, %ymm31738; AVX2-NEXT:    addq $16, %rcx1739; AVX2-NEXT:    cmpq %rcx, %rax1740; AVX2-NEXT:    jne .LBB11_11741; AVX2-NEXT:  # %bb.2: # %middle.block1742; AVX2-NEXT:    vpaddd %ymm2, %ymm1, %ymm11743; AVX2-NEXT:    vpaddd %ymm3, %ymm0, %ymm01744; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm01745; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11746; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01747; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1748; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01749; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1750; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01751; AVX2-NEXT:    vmovd %xmm0, %eax1752; AVX2-NEXT:    vzeroupper1753; AVX2-NEXT:    retq1754;1755; AVX512-LABEL: test_unsigned_short_1024:1756; AVX512:       # %bb.0: # %entry1757; AVX512-NEXT:    movl %edx, %eax1758; AVX512-NEXT:    vpxor %xmm0, %xmm0, %xmm01759; AVX512-NEXT:    xorl %ecx, %ecx1760; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11761; AVX512-NEXT:    .p2align 41762; AVX512-NEXT:  .LBB11_1: # %vector.body1763; AVX512-NEXT:    # =>This Inner Loop Header: Depth=11764; AVX512-NEXT:    vpmovzxwd {{.*#+}} zmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero1765; AVX512-NEXT:    vpmovzxwd {{.*#+}} zmm3 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero1766; AVX512-NEXT:    vpmovzxwd {{.*#+}} zmm4 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero1767; AVX512-NEXT:    vpmulld %zmm2, %zmm4, %zmm21768; AVX512-NEXT:    vpaddd %zmm0, %zmm2, %zmm01769; AVX512-NEXT:    vpmovzxwd {{.*#+}} zmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero1770; AVX512-NEXT:    vpmulld %zmm3, %zmm2, %zmm21771; AVX512-NEXT:    vpaddd %zmm1, %zmm2, %zmm11772; AVX512-NEXT:    addq $16, %rcx1773; AVX512-NEXT:    cmpq %rcx, %rax1774; AVX512-NEXT:    jne .LBB11_11775; AVX512-NEXT:  # %bb.2: # %middle.block1776; AVX512-NEXT:    vpaddd %zmm0, %zmm1, %zmm01777; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11778; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm01779; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11780; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01781; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1782; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01783; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1784; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01785; AVX512-NEXT:    vmovd %xmm0, %eax1786; AVX512-NEXT:    vzeroupper1787; AVX512-NEXT:    retq1788entry:1789  %3 = zext i32 %2 to i641790  br label %vector.body1791 1792vector.body:1793  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]1794  %vec.phi = phi <32 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]1795  %4 = getelementptr inbounds i16, ptr %0, i64 %index1796  %5 = bitcast ptr %4 to ptr1797  %wide.load = load <32 x i16>, ptr %5, align 21798  %6 = zext <32 x i16> %wide.load to <32 x i32>1799  %7 = getelementptr inbounds i16, ptr %1, i64 %index1800  %8 = bitcast ptr %7 to ptr1801  %wide.load14 = load <32 x i16>, ptr %8, align 21802  %9 = zext <32 x i16> %wide.load14 to <32 x i32>1803  %10 = mul nsw <32 x i32> %9, %61804  %11 = add nsw <32 x i32> %10, %vec.phi1805  %index.next = add i64 %index, 161806  %12 = icmp eq i64 %index.next, %31807  br i1 %12, label %middle.block, label %vector.body1808 1809middle.block:1810  %rdx.shuf2 = shufflevector <32 x i32> %11, <32 x i32> undef, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1811  %bin.rdx2 = add <32 x i32> %11, %rdx.shuf21812  %rdx.shuf1 = shufflevector <32 x i32> %bin.rdx2, <32 x i32> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1813  %bin.rdx1 = add <32 x i32> %bin.rdx2, %rdx.shuf11814  %rdx.shuf = shufflevector <32 x i32> %bin.rdx1, <32 x i32> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1815  %bin.rdx = add <32 x i32> %bin.rdx1, %rdx.shuf1816  %rdx.shuf15 = shufflevector <32 x i32> %bin.rdx, <32 x i32> undef, <32 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1817  %bin.rdx16 = add <32 x i32> %bin.rdx, %rdx.shuf151818  %rdx.shuf17 = shufflevector <32 x i32> %bin.rdx16, <32 x i32> undef, <32 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1819  %bin.rdx18 = add <32 x i32> %bin.rdx16, %rdx.shuf171820  %13 = extractelement <32 x i32> %bin.rdx18, i32 01821  ret i32 %131822}1823 1824define <4 x i32> @pmaddwd_8(<8 x i16> %A, <8 x i16> %B) {1825; SSE2-LABEL: pmaddwd_8:1826; SSE2:       # %bb.0:1827; SSE2-NEXT:    pmaddwd %xmm1, %xmm01828; SSE2-NEXT:    retq1829;1830; AVX-LABEL: pmaddwd_8:1831; AVX:       # %bb.0:1832; AVX-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm01833; AVX-NEXT:    retq1834   %a = sext <8 x i16> %A to <8 x i32>1835   %b = sext <8 x i16> %B to <8 x i32>1836   %m = mul nsw <8 x i32> %a, %b1837   %odd = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1838   %even = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1839   %ret = add <4 x i32> %odd, %even1840   ret <4 x i32> %ret1841}1842 1843define <4 x i32> @pmaddwd_8_swapped(<8 x i16> %A, <8 x i16> %B) {1844; SSE2-LABEL: pmaddwd_8_swapped:1845; SSE2:       # %bb.0:1846; SSE2-NEXT:    pmaddwd %xmm1, %xmm01847; SSE2-NEXT:    retq1848;1849; AVX-LABEL: pmaddwd_8_swapped:1850; AVX:       # %bb.0:1851; AVX-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm01852; AVX-NEXT:    retq1853   %a = sext <8 x i16> %A to <8 x i32>1854   %b = sext <8 x i16> %B to <8 x i32>1855   %m = mul nsw <8 x i32> %a, %b1856   %odd = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1857   %even = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1858   %ret = add <4 x i32> %even, %odd1859   ret <4 x i32> %ret1860}1861 1862; FIXME: SSE fails to match PMADDWD1863define <4 x i32> @larger_mul(<16 x i16> %A, <16 x i16> %B) {1864; SSE2-LABEL: larger_mul:1865; SSE2:       # %bb.0:1866; SSE2-NEXT:    movdqa %xmm0, %xmm11867; SSE2-NEXT:    pmulhw %xmm2, %xmm11868; SSE2-NEXT:    pmullw %xmm2, %xmm01869; SSE2-NEXT:    movdqa %xmm0, %xmm21870; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]1871; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1872; SSE2-NEXT:    movdqa %xmm0, %xmm11873; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]1874; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]1875; SSE2-NEXT:    paddd %xmm1, %xmm01876; SSE2-NEXT:    retq1877;1878; AVX1-LABEL: larger_mul:1879; AVX1:       # %bb.0:1880; AVX1-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm01881; AVX1-NEXT:    vzeroupper1882; AVX1-NEXT:    retq1883;1884; AVX2-LABEL: larger_mul:1885; AVX2:       # %bb.0:1886; AVX2-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm01887; AVX2-NEXT:    vzeroupper1888; AVX2-NEXT:    retq1889;1890; AVX512-LABEL: larger_mul:1891; AVX512:       # %bb.0:1892; AVX512-NEXT:    vpmovsxwd %ymm0, %zmm01893; AVX512-NEXT:    vpmovsxwd %ymm1, %zmm11894; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm01895; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11896; AVX512-NEXT:    vphaddd %xmm1, %xmm0, %xmm01897; AVX512-NEXT:    vzeroupper1898; AVX512-NEXT:    retq1899   %a = sext <16 x i16> %A to <16 x i32>1900   %b = sext <16 x i16> %B to <16 x i32>1901   %m = mul nsw <16 x i32> %a, %b1902   %odd = shufflevector <16 x i32> %m, <16 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1903   %even = shufflevector <16 x i32> %m, <16 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1904   %ret = add <4 x i32> %odd, %even1905   ret <4 x i32> %ret1906}1907 1908define <8 x i32> @pmaddwd_16(<16 x i16> %A, <16 x i16> %B) {1909; SSE2-LABEL: pmaddwd_16:1910; SSE2:       # %bb.0:1911; SSE2-NEXT:    pmaddwd %xmm2, %xmm01912; SSE2-NEXT:    pmaddwd %xmm3, %xmm11913; SSE2-NEXT:    retq1914;1915; AVX1-LABEL: pmaddwd_16:1916; AVX1:       # %bb.0:1917; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21918; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm31919; AVX1-NEXT:    vpmaddwd %xmm2, %xmm3, %xmm21920; AVX1-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm01921; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01922; AVX1-NEXT:    retq1923;1924; AVX256-LABEL: pmaddwd_16:1925; AVX256:       # %bb.0:1926; AVX256-NEXT:    vpmaddwd %ymm1, %ymm0, %ymm01927; AVX256-NEXT:    retq1928   %a = sext <16 x i16> %A to <16 x i32>1929   %b = sext <16 x i16> %B to <16 x i32>1930   %m = mul nsw <16 x i32> %a, %b1931   %odd = shufflevector <16 x i32> %m, <16 x i32> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>1932   %even = shufflevector <16 x i32> %m, <16 x i32> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>1933   %ret = add <8 x i32> %odd, %even1934   ret <8 x i32> %ret1935}1936 1937define <16 x i32> @pmaddwd_32(<32 x i16> %A, <32 x i16> %B) {1938; SSE2-LABEL: pmaddwd_32:1939; SSE2:       # %bb.0:1940; SSE2-NEXT:    pmaddwd %xmm4, %xmm01941; SSE2-NEXT:    pmaddwd %xmm5, %xmm11942; SSE2-NEXT:    pmaddwd %xmm6, %xmm21943; SSE2-NEXT:    pmaddwd %xmm7, %xmm31944; SSE2-NEXT:    retq1945;1946; AVX1-LABEL: pmaddwd_32:1947; AVX1:       # %bb.0:1948; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm41949; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm51950; AVX1-NEXT:    vpmaddwd %xmm4, %xmm5, %xmm41951; AVX1-NEXT:    vpmaddwd %xmm2, %xmm0, %xmm01952; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm01953; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm21954; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm41955; AVX1-NEXT:    vpmaddwd %xmm2, %xmm4, %xmm21956; AVX1-NEXT:    vpmaddwd %xmm3, %xmm1, %xmm11957; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm11958; AVX1-NEXT:    retq1959;1960; AVX2-LABEL: pmaddwd_32:1961; AVX2:       # %bb.0:1962; AVX2-NEXT:    vpmaddwd %ymm2, %ymm0, %ymm01963; AVX2-NEXT:    vpmaddwd %ymm3, %ymm1, %ymm11964; AVX2-NEXT:    retq1965;1966; AVX512F-LABEL: pmaddwd_32:1967; AVX512F:       # %bb.0:1968; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm21969; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm31970; AVX512F-NEXT:    vpmaddwd %ymm2, %ymm3, %ymm21971; AVX512F-NEXT:    vpmaddwd %ymm1, %ymm0, %ymm01972; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm01973; AVX512F-NEXT:    retq1974;1975; AVX512BW-LABEL: pmaddwd_32:1976; AVX512BW:       # %bb.0:1977; AVX512BW-NEXT:    vpmaddwd %zmm1, %zmm0, %zmm01978; AVX512BW-NEXT:    retq1979   %a = sext <32 x i16> %A to <32 x i32>1980   %b = sext <32 x i16> %B to <32 x i32>1981   %m = mul nsw <32 x i32> %a, %b1982   %odd = shufflevector <32 x i32> %m, <32 x i32> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>1983   %even = shufflevector <32 x i32> %m, <32 x i32> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>1984   %ret = add <16 x i32> %odd, %even1985   ret <16 x i32> %ret1986}1987 1988define <4 x i32> @pmaddwd_const(<8 x i16> %A) {1989; SSE2-LABEL: pmaddwd_const:1990; SSE2:       # %bb.0:1991; SSE2-NEXT:    pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [32767,32768,0,0,1,7,42,32]1992; SSE2-NEXT:    retq1993;1994; AVX-LABEL: pmaddwd_const:1995; AVX:       # %bb.0:1996; AVX-NEXT:    vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32767,32768,0,0,1,7,42,32]1997; AVX-NEXT:    retq1998   %a = sext <8 x i16> %A to <8 x i32>1999   %m = mul nsw <8 x i32> %a, <i32 32767, i32 -32768, i32 0, i32 0, i32 1, i32 7, i32 42, i32 32>2000   %odd = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>2001   %even = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>2002   %ret = add <4 x i32> %odd, %even2003   ret <4 x i32> %ret2004}2005 2006; Do not select unsigned i16 multiplication2007define <4 x i32> @pmaddwd_negative1(<8 x i16> %A, <8 x i16> %B) {2008; SSE2-LABEL: pmaddwd_negative1:2009; SSE2:       # %bb.0:2010; SSE2-NEXT:    movdqa %xmm0, %xmm22011; SSE2-NEXT:    pmulhuw %xmm1, %xmm22012; SSE2-NEXT:    pmullw %xmm1, %xmm02013; SSE2-NEXT:    movdqa %xmm0, %xmm12014; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]2015; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]2016; SSE2-NEXT:    movdqa %xmm0, %xmm22017; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[0,2]2018; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]2019; SSE2-NEXT:    paddd %xmm2, %xmm02020; SSE2-NEXT:    retq2021;2022; AVX1-LABEL: pmaddwd_negative1:2023; AVX1:       # %bb.0:2024; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm22025; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]2026; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero2027; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]2028; AVX1-NEXT:    vpmulld %xmm2, %xmm3, %xmm22029; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero2030; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm02031; AVX1-NEXT:    vphaddd %xmm2, %xmm0, %xmm02032; AVX1-NEXT:    retq2033;2034; AVX256-LABEL: pmaddwd_negative1:2035; AVX256:       # %bb.0:2036; AVX256-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2037; AVX256-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero2038; AVX256-NEXT:    vpmulld %ymm1, %ymm0, %ymm02039; AVX256-NEXT:    vextracti128 $1, %ymm0, %xmm12040; AVX256-NEXT:    vphaddd %xmm1, %xmm0, %xmm02041; AVX256-NEXT:    vzeroupper2042; AVX256-NEXT:    retq2043   %a = zext <8 x i16> %A to <8 x i32>2044   %b = zext <8 x i16> %B to <8 x i32>2045   %m = mul nuw <8 x i32> %a, %b2046   %odd = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>2047   %even = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>2048   %ret = add <4 x i32> %odd, %even2049   ret <4 x i32> %ret2050}2051 2052; Do not select if constant is too large2053; Lower half is too large, upper half is in range.2054define <4 x i32> @pmaddwd_negative2(<8 x i16> %A) {2055; SSE2-LABEL: pmaddwd_negative2:2056; SSE2:       # %bb.0:2057; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]2058; SSE2-NEXT:    psrad $16, %xmm22059; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]2060; SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4294934528,0,0,0]2061; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]2062; SSE2-NEXT:    pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,0,7,0,42,0,32,0]2063; SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [32768,4294934528,0,0]2064; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm0[0,2]2065; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,3]2066; SSE2-NEXT:    paddd %xmm2, %xmm12067; SSE2-NEXT:    movdqa %xmm1, %xmm02068; SSE2-NEXT:    retq2069;2070; AVX1-LABEL: pmaddwd_negative2:2071; AVX1:       # %bb.0:2072; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm12073; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]2074; AVX1-NEXT:    vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,7,42,32]2075; AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [32768,4294934528,0,0]2076; AVX1-NEXT:    vphaddd %xmm0, %xmm1, %xmm02077; AVX1-NEXT:    retq2078;2079; AVX256-LABEL: pmaddwd_negative2:2080; AVX256:       # %bb.0:2081; AVX256-NEXT:    vpmovsxwd %xmm0, %ymm02082; AVX256-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [32768,4294934528,0,0,1,7,42,32]2083; AVX256-NEXT:    vextracti128 $1, %ymm0, %xmm12084; AVX256-NEXT:    vphaddd %xmm1, %xmm0, %xmm02085; AVX256-NEXT:    vzeroupper2086; AVX256-NEXT:    retq2087   %a = sext <8 x i16> %A to <8 x i32>2088   %m = mul nsw <8 x i32> %a, <i32 32768, i32 -32768, i32 0, i32 0, i32 1, i32 7, i32 42, i32 32>2089   %odd = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>2090   %even = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>2091   %ret = add <4 x i32> %odd, %even2092   ret <4 x i32> %ret2093}2094 2095define <4 x i32> @jumbled_indices4(<8 x i16> %A, <8 x i16> %B) {2096; SSE2-LABEL: jumbled_indices4:2097; SSE2:       # %bb.0:2098; SSE2-NEXT:    pmaddwd %xmm1, %xmm02099; SSE2-NEXT:    retq2100;2101; AVX-LABEL: jumbled_indices4:2102; AVX:       # %bb.0:2103; AVX-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm02104; AVX-NEXT:    retq2105  %exta = sext <8 x i16> %A to <8 x i32>2106  %extb = sext <8 x i16> %B to <8 x i32>2107  %m = mul <8 x i32> %exta, %extb2108  %sa = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 3, i32 1, i32 5, i32 6>2109  %sb = shufflevector <8 x i32> %m, <8 x i32> undef, <4 x i32> <i32 2, i32 0, i32 4, i32 7>2110  %a = add <4 x i32> %sa, %sb2111  ret <4 x i32> %a2112}2113 2114define <8 x i32> @jumbled_indices8(<16 x i16> %A, <16 x i16> %B) {2115; SSE2-LABEL: jumbled_indices8:2116; SSE2:       # %bb.0:2117; SSE2-NEXT:    pmaddwd %xmm2, %xmm02118; SSE2-NEXT:    pmaddwd %xmm3, %xmm12119; SSE2-NEXT:    retq2120;2121; AVX1-LABEL: jumbled_indices8:2122; AVX1:       # %bb.0:2123; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm22124; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm32125; AVX1-NEXT:    vpmaddwd %xmm2, %xmm3, %xmm22126; AVX1-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm02127; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm02128; AVX1-NEXT:    retq2129;2130; AVX256-LABEL: jumbled_indices8:2131; AVX256:       # %bb.0:2132; AVX256-NEXT:    vpmaddwd %ymm1, %ymm0, %ymm02133; AVX256-NEXT:    retq2134  %exta = sext <16 x i16> %A to <16 x i32>2135  %extb = sext <16 x i16> %B to <16 x i32>2136  %m = mul <16 x i32> %exta, %extb2137  %sa = shufflevector <16 x i32> %m, <16 x i32> undef, <8 x i32> <i32 0, i32 2, i32 7, i32 4, i32 11, i32 8, i32 15, i32 12>2138  %sb = shufflevector <16 x i32> %m, <16 x i32> undef, <8 x i32> <i32 1, i32 3, i32 6, i32 5, i32 10, i32 9, i32 14, i32 13>2139  %a = add <8 x i32> %sa, %sb2140  ret <8 x i32> %a2141}2142 2143define <16 x i32> @jumbled_indices16(<32 x i16> %A, <32 x i16> %B) {2144; SSE2-LABEL: jumbled_indices16:2145; SSE2:       # %bb.0:2146; SSE2-NEXT:    pmaddwd %xmm4, %xmm02147; SSE2-NEXT:    pmaddwd %xmm5, %xmm12148; SSE2-NEXT:    pmaddwd %xmm6, %xmm22149; SSE2-NEXT:    pmaddwd %xmm7, %xmm32150; SSE2-NEXT:    retq2151;2152; AVX1-LABEL: jumbled_indices16:2153; AVX1:       # %bb.0:2154; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm42155; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm52156; AVX1-NEXT:    vpmaddwd %xmm4, %xmm5, %xmm42157; AVX1-NEXT:    vpmaddwd %xmm2, %xmm0, %xmm02158; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm02159; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm22160; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm42161; AVX1-NEXT:    vpmaddwd %xmm2, %xmm4, %xmm22162; AVX1-NEXT:    vpmaddwd %xmm3, %xmm1, %xmm12163; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm12164; AVX1-NEXT:    retq2165;2166; AVX2-LABEL: jumbled_indices16:2167; AVX2:       # %bb.0:2168; AVX2-NEXT:    vpmaddwd %ymm2, %ymm0, %ymm02169; AVX2-NEXT:    vpmaddwd %ymm3, %ymm1, %ymm12170; AVX2-NEXT:    retq2171;2172; AVX512F-LABEL: jumbled_indices16:2173; AVX512F:       # %bb.0:2174; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm22175; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm32176; AVX512F-NEXT:    vpmaddwd %ymm2, %ymm3, %ymm22177; AVX512F-NEXT:    vpmaddwd %ymm1, %ymm0, %ymm02178; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm02179; AVX512F-NEXT:    retq2180;2181; AVX512BW-LABEL: jumbled_indices16:2182; AVX512BW:       # %bb.0:2183; AVX512BW-NEXT:    vpmaddwd %zmm1, %zmm0, %zmm02184; AVX512BW-NEXT:    retq2185  %exta = sext <32 x i16> %A to <32 x i32>2186  %extb = sext <32 x i16> %B to <32 x i32>2187  %m = mul <32 x i32> %exta, %extb2188  %sa = shufflevector <32 x i32> %m, <32 x i32> undef, <16 x i32> <i32 2, i32 0, i32 5, i32 6, i32 11, i32 9, i32 15, i32 12, i32 17, i32 18, i32 20, i32 23, i32 27, i32 24, i32 31, i32 29>2189  %sb = shufflevector <32 x i32> %m, <32 x i32> undef, <16 x i32> <i32 3, i32 1, i32 4, i32 7, i32 10, i32 8, i32 14, i32 13, i32 16, i32 19, i32 21, i32 22, i32 26, i32 25, i32 30, i32 28>2190  %a = add <16 x i32> %sa, %sb2191  ret <16 x i32> %a2192}2193 2194define <32 x i32> @jumbled_indices32(<64 x i16> %A, <64 x i16> %B) {2195; SSE2-LABEL: jumbled_indices32:2196; SSE2:       # %bb.0:2197; SSE2-NEXT:    movq %rdi, %rax2198; SSE2-NEXT:    pmaddwd {{[0-9]+}}(%rsp), %xmm02199; SSE2-NEXT:    pmaddwd {{[0-9]+}}(%rsp), %xmm12200; SSE2-NEXT:    pmaddwd {{[0-9]+}}(%rsp), %xmm22201; SSE2-NEXT:    pmaddwd {{[0-9]+}}(%rsp), %xmm32202; SSE2-NEXT:    pmaddwd {{[0-9]+}}(%rsp), %xmm42203; SSE2-NEXT:    pmaddwd {{[0-9]+}}(%rsp), %xmm52204; SSE2-NEXT:    pmaddwd {{[0-9]+}}(%rsp), %xmm62205; SSE2-NEXT:    pmaddwd {{[0-9]+}}(%rsp), %xmm72206; SSE2-NEXT:    movdqa %xmm7, 112(%rdi)2207; SSE2-NEXT:    movdqa %xmm6, 96(%rdi)2208; SSE2-NEXT:    movdqa %xmm5, 80(%rdi)2209; SSE2-NEXT:    movdqa %xmm4, 64(%rdi)2210; SSE2-NEXT:    movdqa %xmm3, 48(%rdi)2211; SSE2-NEXT:    movdqa %xmm2, 32(%rdi)2212; SSE2-NEXT:    movdqa %xmm1, 16(%rdi)2213; SSE2-NEXT:    movdqa %xmm0, (%rdi)2214; SSE2-NEXT:    retq2215;2216; AVX1-LABEL: jumbled_indices32:2217; AVX1:       # %bb.0:2218; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm82219; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm92220; AVX1-NEXT:    vpmaddwd %xmm8, %xmm9, %xmm82221; AVX1-NEXT:    vpmaddwd %xmm4, %xmm0, %xmm02222; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm0, %ymm02223; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm42224; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm82225; AVX1-NEXT:    vpmaddwd %xmm4, %xmm8, %xmm42226; AVX1-NEXT:    vpmaddwd %xmm5, %xmm1, %xmm12227; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm12228; AVX1-NEXT:    vextractf128 $1, %ymm6, %xmm42229; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm52230; AVX1-NEXT:    vpmaddwd %xmm4, %xmm5, %xmm42231; AVX1-NEXT:    vpmaddwd %xmm6, %xmm2, %xmm22232; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm22233; AVX1-NEXT:    vextractf128 $1, %ymm7, %xmm42234; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm52235; AVX1-NEXT:    vpmaddwd %xmm4, %xmm5, %xmm42236; AVX1-NEXT:    vpmaddwd %xmm7, %xmm3, %xmm32237; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm32238; AVX1-NEXT:    retq2239;2240; AVX2-LABEL: jumbled_indices32:2241; AVX2:       # %bb.0:2242; AVX2-NEXT:    vpmaddwd %ymm4, %ymm0, %ymm02243; AVX2-NEXT:    vpmaddwd %ymm5, %ymm1, %ymm12244; AVX2-NEXT:    vpmaddwd %ymm6, %ymm2, %ymm22245; AVX2-NEXT:    vpmaddwd %ymm7, %ymm3, %ymm32246; AVX2-NEXT:    retq2247;2248; AVX512F-LABEL: jumbled_indices32:2249; AVX512F:       # %bb.0:2250; AVX512F-NEXT:    vextracti64x4 $1, %zmm2, %ymm42251; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm52252; AVX512F-NEXT:    vpmaddwd %ymm4, %ymm5, %ymm42253; AVX512F-NEXT:    vpmaddwd %ymm2, %ymm0, %ymm02254; AVX512F-NEXT:    vinserti64x4 $1, %ymm4, %zmm0, %zmm02255; AVX512F-NEXT:    vextracti64x4 $1, %zmm3, %ymm22256; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm42257; AVX512F-NEXT:    vpmaddwd %ymm2, %ymm4, %ymm22258; AVX512F-NEXT:    vpmaddwd %ymm3, %ymm1, %ymm12259; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm1, %zmm12260; AVX512F-NEXT:    retq2261;2262; AVX512BW-LABEL: jumbled_indices32:2263; AVX512BW:       # %bb.0:2264; AVX512BW-NEXT:    vpmaddwd %zmm2, %zmm0, %zmm02265; AVX512BW-NEXT:    vpmaddwd %zmm3, %zmm1, %zmm12266; AVX512BW-NEXT:    retq2267  %exta = sext <64 x i16> %A to <64 x i32>2268  %extb = sext <64 x i16> %B to <64 x i32>2269  %m = mul <64 x i32> %exta, %extb2270  %sa = shufflevector <64 x i32> %m, <64 x i32> undef, <32 x i32> <i32 1, i32 2, i32 6, i32 5, i32 10, i32 8, i32 14, i32 12, i32 19, i32 17, i32 22, i32 20, i32 25, i32 27, i32 30, i32 28, i32 32, i32 34, i32 37, i32 38, i32 41, i32 43, i32 45, i32 47, i32 50, i32 48, i32 52, i32 54, i32 59, i32 56, i32 61, i32 63>2271  %sb = shufflevector <64 x i32> %m, <64 x i32> undef, <32 x i32> <i32 0, i32 3, i32 7, i32 4, i32 11, i32 9, i32 15, i32 13, i32 18, i32 16, i32 23, i32 21, i32 24, i32 26, i32 31, i32 29, i32 33, i32 35, i32 36, i32 39, i32 40, i32 42, i32 44, i32 46, i32 51, i32 49, i32 53, i32 55, i32 58, i32 57, i32 60, i32 62>2272  %a = add <32 x i32> %sa, %sb2273  ret <32 x i32> %a2274}2275 2276; NOTE: We're testing with loads because ABI lowering creates a concat_vectors that extract_vector_elt creation can see through.2277; This would require the combine to recreate the concat_vectors.2278define <4 x i32> @pmaddwd_128(ptr %Aptr, ptr %Bptr) {2279; SSE2-LABEL: pmaddwd_128:2280; SSE2:       # %bb.0:2281; SSE2-NEXT:    movdqa (%rdi), %xmm02282; SSE2-NEXT:    pmaddwd (%rsi), %xmm02283; SSE2-NEXT:    retq2284;2285; AVX-LABEL: pmaddwd_128:2286; AVX:       # %bb.0:2287; AVX-NEXT:    vmovdqa (%rdi), %xmm02288; AVX-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02289; AVX-NEXT:    retq2290  %A = load <8 x i16>, ptr %Aptr2291  %B = load <8 x i16>, ptr %Bptr2292  %A_even = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>2293  %A_odd = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>2294  %B_even = shufflevector <8 x i16> %B, <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>2295  %B_odd = shufflevector <8 x i16> %B, <8 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>2296  %A_even_ext = sext <4 x i16> %A_even to <4 x i32>2297  %B_even_ext = sext <4 x i16> %B_even to <4 x i32>2298  %A_odd_ext = sext <4 x i16> %A_odd to <4 x i32>2299  %B_odd_ext = sext <4 x i16> %B_odd to <4 x i32>2300  %even_mul = mul <4 x i32> %A_even_ext, %B_even_ext2301  %odd_mul = mul <4 x i32> %A_odd_ext, %B_odd_ext2302  %add = add <4 x i32> %even_mul, %odd_mul2303  ret <4 x i32> %add2304}2305 2306define <8 x i32> @pmaddwd_256(ptr %Aptr, ptr %Bptr) {2307; SSE2-LABEL: pmaddwd_256:2308; SSE2:       # %bb.0:2309; SSE2-NEXT:    movdqa (%rdi), %xmm02310; SSE2-NEXT:    movdqa 16(%rdi), %xmm12311; SSE2-NEXT:    pmaddwd (%rsi), %xmm02312; SSE2-NEXT:    pmaddwd 16(%rsi), %xmm12313; SSE2-NEXT:    retq2314;2315; AVX1-LABEL: pmaddwd_256:2316; AVX1:       # %bb.0:2317; AVX1-NEXT:    vmovdqa (%rdi), %xmm02318; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm12319; AVX1-NEXT:    vpmaddwd 16(%rsi), %xmm1, %xmm12320; AVX1-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02321; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02322; AVX1-NEXT:    retq2323;2324; AVX256-LABEL: pmaddwd_256:2325; AVX256:       # %bb.0:2326; AVX256-NEXT:    vmovdqa (%rdi), %ymm02327; AVX256-NEXT:    vpmaddwd (%rsi), %ymm0, %ymm02328; AVX256-NEXT:    retq2329  %A = load <16 x i16>, ptr %Aptr2330  %B = load <16 x i16>, ptr %Bptr2331  %A_even = shufflevector <16 x i16> %A, <16 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>2332  %A_odd = shufflevector <16 x i16> %A, <16 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>2333  %B_even = shufflevector <16 x i16> %B, <16 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>2334  %B_odd = shufflevector <16 x i16> %B, <16 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>2335  %A_even_ext = sext <8 x i16> %A_even to <8 x i32>2336  %B_even_ext = sext <8 x i16> %B_even to <8 x i32>2337  %A_odd_ext = sext <8 x i16> %A_odd to <8 x i32>2338  %B_odd_ext = sext <8 x i16> %B_odd to <8 x i32>2339  %even_mul = mul <8 x i32> %A_even_ext, %B_even_ext2340  %odd_mul = mul <8 x i32> %A_odd_ext, %B_odd_ext2341  %add = add <8 x i32> %even_mul, %odd_mul2342  ret <8 x i32> %add2343}2344 2345define <16 x i32> @pmaddwd_512(ptr %Aptr, ptr %Bptr) {2346; SSE2-LABEL: pmaddwd_512:2347; SSE2:       # %bb.0:2348; SSE2-NEXT:    movdqa (%rdi), %xmm02349; SSE2-NEXT:    movdqa 16(%rdi), %xmm12350; SSE2-NEXT:    movdqa 32(%rdi), %xmm22351; SSE2-NEXT:    movdqa 48(%rdi), %xmm32352; SSE2-NEXT:    pmaddwd (%rsi), %xmm02353; SSE2-NEXT:    pmaddwd 16(%rsi), %xmm12354; SSE2-NEXT:    pmaddwd 32(%rsi), %xmm22355; SSE2-NEXT:    pmaddwd 48(%rsi), %xmm32356; SSE2-NEXT:    retq2357;2358; AVX1-LABEL: pmaddwd_512:2359; AVX1:       # %bb.0:2360; AVX1-NEXT:    vmovdqa (%rdi), %xmm02361; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm12362; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm22363; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm32364; AVX1-NEXT:    vpmaddwd 16(%rsi), %xmm1, %xmm12365; AVX1-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02366; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02367; AVX1-NEXT:    vpmaddwd 48(%rsi), %xmm3, %xmm12368; AVX1-NEXT:    vpmaddwd 32(%rsi), %xmm2, %xmm22369; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm12370; AVX1-NEXT:    retq2371;2372; AVX2-LABEL: pmaddwd_512:2373; AVX2:       # %bb.0:2374; AVX2-NEXT:    vmovdqa (%rdi), %ymm02375; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm12376; AVX2-NEXT:    vpmaddwd (%rsi), %ymm0, %ymm02377; AVX2-NEXT:    vpmaddwd 32(%rsi), %ymm1, %ymm12378; AVX2-NEXT:    retq2379;2380; AVX512F-LABEL: pmaddwd_512:2381; AVX512F:       # %bb.0:2382; AVX512F-NEXT:    vmovdqa (%rdi), %ymm02383; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm12384; AVX512F-NEXT:    vpmaddwd 32(%rsi), %ymm1, %ymm12385; AVX512F-NEXT:    vpmaddwd (%rsi), %ymm0, %ymm02386; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm02387; AVX512F-NEXT:    retq2388;2389; AVX512BW-LABEL: pmaddwd_512:2390; AVX512BW:       # %bb.0:2391; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm02392; AVX512BW-NEXT:    vpmaddwd (%rsi), %zmm0, %zmm02393; AVX512BW-NEXT:    retq2394  %A = load <32 x i16>, ptr %Aptr2395  %B = load <32 x i16>, ptr %Bptr2396  %A_even = shufflevector <32 x i16> %A, <32 x i16> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>2397  %A_odd = shufflevector <32 x i16> %A, <32 x i16> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>2398  %B_even = shufflevector <32 x i16> %B, <32 x i16> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>2399  %B_odd = shufflevector <32 x i16> %B, <32 x i16> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>2400  %A_even_ext = sext <16 x i16> %A_even to <16 x i32>2401  %B_even_ext = sext <16 x i16> %B_even to <16 x i32>2402  %A_odd_ext = sext <16 x i16> %A_odd to <16 x i32>2403  %B_odd_ext = sext <16 x i16> %B_odd to <16 x i32>2404  %even_mul = mul <16 x i32> %A_even_ext, %B_even_ext2405  %odd_mul = mul <16 x i32> %A_odd_ext, %B_odd_ext2406  %add = add <16 x i32> %even_mul, %odd_mul2407  ret <16 x i32> %add2408}2409 2410define <32 x i32> @pmaddwd_1024(ptr %Aptr, ptr %Bptr) {2411; SSE2-LABEL: pmaddwd_1024:2412; SSE2:       # %bb.0:2413; SSE2-NEXT:    movq %rdi, %rax2414; SSE2-NEXT:    movdqa (%rsi), %xmm02415; SSE2-NEXT:    movdqa 16(%rsi), %xmm12416; SSE2-NEXT:    movdqa 32(%rsi), %xmm22417; SSE2-NEXT:    movdqa 48(%rsi), %xmm32418; SSE2-NEXT:    pmaddwd (%rdx), %xmm02419; SSE2-NEXT:    pmaddwd 16(%rdx), %xmm12420; SSE2-NEXT:    pmaddwd 32(%rdx), %xmm22421; SSE2-NEXT:    pmaddwd 48(%rdx), %xmm32422; SSE2-NEXT:    movdqa 64(%rsi), %xmm42423; SSE2-NEXT:    pmaddwd 64(%rdx), %xmm42424; SSE2-NEXT:    movdqa 80(%rsi), %xmm52425; SSE2-NEXT:    pmaddwd 80(%rdx), %xmm52426; SSE2-NEXT:    movdqa 96(%rsi), %xmm62427; SSE2-NEXT:    pmaddwd 96(%rdx), %xmm62428; SSE2-NEXT:    movdqa 112(%rsi), %xmm72429; SSE2-NEXT:    pmaddwd 112(%rdx), %xmm72430; SSE2-NEXT:    movdqa %xmm7, 112(%rdi)2431; SSE2-NEXT:    movdqa %xmm6, 96(%rdi)2432; SSE2-NEXT:    movdqa %xmm5, 80(%rdi)2433; SSE2-NEXT:    movdqa %xmm4, 64(%rdi)2434; SSE2-NEXT:    movdqa %xmm3, 48(%rdi)2435; SSE2-NEXT:    movdqa %xmm2, 32(%rdi)2436; SSE2-NEXT:    movdqa %xmm1, 16(%rdi)2437; SSE2-NEXT:    movdqa %xmm0, (%rdi)2438; SSE2-NEXT:    retq2439;2440; AVX1-LABEL: pmaddwd_1024:2441; AVX1:       # %bb.0:2442; AVX1-NEXT:    vmovdqa (%rdi), %xmm02443; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm12444; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm22445; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm32446; AVX1-NEXT:    vpmaddwd 16(%rsi), %xmm1, %xmm12447; AVX1-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02448; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02449; AVX1-NEXT:    vpmaddwd 48(%rsi), %xmm3, %xmm12450; AVX1-NEXT:    vpmaddwd 32(%rsi), %xmm2, %xmm22451; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm12452; AVX1-NEXT:    vmovdqa 80(%rdi), %xmm22453; AVX1-NEXT:    vpmaddwd 80(%rsi), %xmm2, %xmm22454; AVX1-NEXT:    vmovdqa 64(%rdi), %xmm32455; AVX1-NEXT:    vpmaddwd 64(%rsi), %xmm3, %xmm32456; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm22457; AVX1-NEXT:    vmovdqa 112(%rdi), %xmm32458; AVX1-NEXT:    vpmaddwd 112(%rsi), %xmm3, %xmm32459; AVX1-NEXT:    vmovdqa 96(%rdi), %xmm42460; AVX1-NEXT:    vpmaddwd 96(%rsi), %xmm4, %xmm42461; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm32462; AVX1-NEXT:    retq2463;2464; AVX2-LABEL: pmaddwd_1024:2465; AVX2:       # %bb.0:2466; AVX2-NEXT:    vmovdqa (%rdi), %ymm02467; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm12468; AVX2-NEXT:    vmovdqa 64(%rdi), %ymm22469; AVX2-NEXT:    vmovdqa 96(%rdi), %ymm32470; AVX2-NEXT:    vpmaddwd (%rsi), %ymm0, %ymm02471; AVX2-NEXT:    vpmaddwd 32(%rsi), %ymm1, %ymm12472; AVX2-NEXT:    vpmaddwd 64(%rsi), %ymm2, %ymm22473; AVX2-NEXT:    vpmaddwd 96(%rsi), %ymm3, %ymm32474; AVX2-NEXT:    retq2475;2476; AVX512F-LABEL: pmaddwd_1024:2477; AVX512F:       # %bb.0:2478; AVX512F-NEXT:    vmovdqa (%rdi), %ymm02479; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm12480; AVX512F-NEXT:    vmovdqa 64(%rdi), %ymm22481; AVX512F-NEXT:    vmovdqa 96(%rdi), %ymm32482; AVX512F-NEXT:    vpmaddwd 32(%rsi), %ymm1, %ymm12483; AVX512F-NEXT:    vpmaddwd (%rsi), %ymm0, %ymm02484; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm02485; AVX512F-NEXT:    vpmaddwd 96(%rsi), %ymm3, %ymm12486; AVX512F-NEXT:    vpmaddwd 64(%rsi), %ymm2, %ymm22487; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm2, %zmm12488; AVX512F-NEXT:    retq2489;2490; AVX512BW-LABEL: pmaddwd_1024:2491; AVX512BW:       # %bb.0:2492; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm02493; AVX512BW-NEXT:    vmovdqa64 64(%rdi), %zmm12494; AVX512BW-NEXT:    vpmaddwd (%rsi), %zmm0, %zmm02495; AVX512BW-NEXT:    vpmaddwd 64(%rsi), %zmm1, %zmm12496; AVX512BW-NEXT:    retq2497  %A = load <64 x i16>, ptr %Aptr2498  %B = load <64 x i16>, ptr %Bptr2499  %A_even = shufflevector <64 x i16> %A, <64 x i16> undef, <32 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30, i32 32, i32 34, i32 36, i32 38, i32 40, i32 42, i32 44, i32 46, i32 48, i32 50, i32 52, i32 54, i32 56, i32 58, i32 60, i32 62>2500  %A_odd = shufflevector <64 x i16> %A, <64 x i16> undef, <32 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31, i32 33, i32 35, i32 37, i32 39, i32 41, i32 43, i32 45, i32 47, i32 49, i32 51, i32 53, i32 55, i32 57, i32 59, i32 61, i32 63>2501  %B_even = shufflevector <64 x i16> %B, <64 x i16> undef, <32 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30, i32 32, i32 34, i32 36, i32 38, i32 40, i32 42, i32 44, i32 46, i32 48, i32 50, i32 52, i32 54, i32 56, i32 58, i32 60, i32 62>2502  %B_odd = shufflevector <64 x i16> %B, <64 x i16> undef, <32 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31, i32 33, i32 35, i32 37, i32 39, i32 41, i32 43, i32 45, i32 47, i32 49, i32 51, i32 53, i32 55, i32 57, i32 59, i32 61, i32 63>2503  %A_even_ext = sext <32 x i16> %A_even to <32 x i32>2504  %B_even_ext = sext <32 x i16> %B_even to <32 x i32>2505  %A_odd_ext = sext <32 x i16> %A_odd to <32 x i32>2506  %B_odd_ext = sext <32 x i16> %B_odd to <32 x i32>2507  %even_mul = mul <32 x i32> %A_even_ext, %B_even_ext2508  %odd_mul = mul <32 x i32> %A_odd_ext, %B_odd_ext2509  %add = add <32 x i32> %even_mul, %odd_mul2510  ret <32 x i32> %add2511}2512 2513define <4 x i32> @pmaddwd_commuted_mul(ptr %Aptr, ptr %Bptr) {2514; SSE2-LABEL: pmaddwd_commuted_mul:2515; SSE2:       # %bb.0:2516; SSE2-NEXT:    movdqa (%rdi), %xmm02517; SSE2-NEXT:    pmaddwd (%rsi), %xmm02518; SSE2-NEXT:    retq2519;2520; AVX-LABEL: pmaddwd_commuted_mul:2521; AVX:       # %bb.0:2522; AVX-NEXT:    vmovdqa (%rdi), %xmm02523; AVX-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02524; AVX-NEXT:    retq2525  %A = load <8 x i16>, ptr %Aptr2526  %B = load <8 x i16>, ptr %Bptr2527  %A_even = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>2528  %A_odd = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>2529  %B_even = shufflevector <8 x i16> %B, <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>2530  %B_odd = shufflevector <8 x i16> %B, <8 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>2531  %A_even_ext = sext <4 x i16> %A_even to <4 x i32>2532  %B_even_ext = sext <4 x i16> %B_even to <4 x i32>2533  %A_odd_ext = sext <4 x i16> %A_odd to <4 x i32>2534  %B_odd_ext = sext <4 x i16> %B_odd to <4 x i32>2535  %even_mul = mul <4 x i32> %A_even_ext, %B_even_ext2536  %odd_mul = mul <4 x i32> %B_odd_ext, %A_odd_ext ; Different order than previous mul2537  %add = add <4 x i32> %even_mul, %odd_mul2538  ret <4 x i32> %add2539}2540 2541define <4 x i32> @pmaddwd_swapped_indices(ptr %Aptr, ptr %Bptr) {2542; SSE2-LABEL: pmaddwd_swapped_indices:2543; SSE2:       # %bb.0:2544; SSE2-NEXT:    movdqa (%rdi), %xmm02545; SSE2-NEXT:    pmaddwd (%rsi), %xmm02546; SSE2-NEXT:    retq2547;2548; AVX-LABEL: pmaddwd_swapped_indices:2549; AVX:       # %bb.0:2550; AVX-NEXT:    vmovdqa (%rdi), %xmm02551; AVX-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02552; AVX-NEXT:    retq2553  %A = load <8 x i16>, ptr %Aptr2554  %B = load <8 x i16>, ptr %Bptr2555  %A_even = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 1, i32 2, i32 5, i32 6> ; indices aren't all even2556  %A_odd = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 3, i32 4, i32 7> ; indices aren't all odd2557  %B_even = shufflevector <8 x i16> %B, <8 x i16> undef, <4 x i32> <i32 1, i32 2, i32 5, i32 6> ; same indices as A2558  %B_odd = shufflevector <8 x i16> %B, <8 x i16> undef, <4 x i32> <i32 0, i32 3, i32 4, i32 7> ; same indices as A2559  %A_even_ext = sext <4 x i16> %A_even to <4 x i32>2560  %B_even_ext = sext <4 x i16> %B_even to <4 x i32>2561  %A_odd_ext = sext <4 x i16> %A_odd to <4 x i32>2562  %B_odd_ext = sext <4 x i16> %B_odd to <4 x i32>2563  %even_mul = mul <4 x i32> %A_even_ext, %B_even_ext2564  %odd_mul = mul <4 x i32> %A_odd_ext, %B_odd_ext2565  %add = add <4 x i32> %even_mul, %odd_mul2566  ret <4 x i32> %add2567}2568 2569; Negative test where indices aren't paired properly2570define <4 x i32> @pmaddwd_bad_indices(ptr %Aptr, ptr %Bptr) {2571; SSE2-LABEL: pmaddwd_bad_indices:2572; SSE2:       # %bb.0:2573; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = mem[1,0,2,3,4,5,6,7]2574; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]2575; SSE2-NEXT:    pmaddwd (%rsi), %xmm02576; SSE2-NEXT:    retq2577;2578; AVX-LABEL: pmaddwd_bad_indices:2579; AVX:       # %bb.0:2580; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = mem[1,0,2,3,4,5,6,7]2581; AVX-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]2582; AVX-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02583; AVX-NEXT:    retq2584  %A = load <8 x i16>, ptr %Aptr2585  %B = load <8 x i16>, ptr %Bptr2586  %A_even = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 1, i32 2, i32 5, i32 6>2587  %A_odd = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 3, i32 4, i32 7>2588  %B_even = shufflevector <8 x i16> %B, <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6> ; different indices than A2589  %B_odd = shufflevector <8 x i16> %B, <8 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7> ; different indices than A2590  %A_even_ext = sext <4 x i16> %A_even to <4 x i32>2591  %B_even_ext = sext <4 x i16> %B_even to <4 x i32>2592  %A_odd_ext = sext <4 x i16> %A_odd to <4 x i32>2593  %B_odd_ext = sext <4 x i16> %B_odd to <4 x i32>2594  %even_mul = mul <4 x i32> %A_even_ext, %B_even_ext2595  %odd_mul = mul <4 x i32> %A_odd_ext, %B_odd_ext2596  %add = add <4 x i32> %even_mul, %odd_mul2597  ret <4 x i32> %add2598}2599 2600; This test contains two multiplies joined by an add. The result of that add is then reduced to a single element.2601; SelectionDAGBuilder should tag the joining add as a vector reduction. We need to recognize that both sides can use pmaddwd2602define i32 @madd_double_reduction(ptr %arg, ptr %arg1, ptr %arg2, ptr %arg3) {2603; SSE2-LABEL: madd_double_reduction:2604; SSE2:       # %bb.0:2605; SSE2-NEXT:    movdqu (%rdi), %xmm02606; SSE2-NEXT:    movdqu (%rsi), %xmm12607; SSE2-NEXT:    pmaddwd %xmm0, %xmm12608; SSE2-NEXT:    movdqu (%rdx), %xmm02609; SSE2-NEXT:    movdqu (%rcx), %xmm22610; SSE2-NEXT:    pmaddwd %xmm0, %xmm22611; SSE2-NEXT:    paddd %xmm1, %xmm22612; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]2613; SSE2-NEXT:    paddd %xmm2, %xmm02614; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2615; SSE2-NEXT:    paddd %xmm0, %xmm12616; SSE2-NEXT:    movd %xmm1, %eax2617; SSE2-NEXT:    retq2618;2619; AVX-LABEL: madd_double_reduction:2620; AVX:       # %bb.0:2621; AVX-NEXT:    vmovdqu (%rdi), %xmm02622; AVX-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02623; AVX-NEXT:    vmovdqu (%rdx), %xmm12624; AVX-NEXT:    vpmaddwd (%rcx), %xmm1, %xmm12625; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm02626; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2627; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm02628; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2629; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm02630; AVX-NEXT:    vmovd %xmm0, %eax2631; AVX-NEXT:    retq2632  %tmp = load <8 x i16>, ptr %arg, align 12633  %tmp6 = load <8 x i16>, ptr %arg1, align 12634  %tmp7 = sext <8 x i16> %tmp to <8 x i32>2635  %tmp17 = sext <8 x i16> %tmp6 to <8 x i32>2636  %tmp19 = mul nsw <8 x i32> %tmp7, %tmp172637  %tmp20 = load <8 x i16>, ptr %arg2, align 12638  %tmp21 = load <8 x i16>, ptr %arg3, align 12639  %tmp22 = sext <8 x i16> %tmp20 to <8 x i32>2640  %tmp23 = sext <8 x i16> %tmp21 to <8 x i32>2641  %tmp25 = mul nsw <8 x i32> %tmp22, %tmp232642  %tmp26 = add nuw nsw <8 x i32> %tmp25, %tmp192643  %tmp29 = shufflevector <8 x i32> %tmp26, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>2644  %tmp30 = add <8 x i32> %tmp26, %tmp292645  %tmp31 = shufflevector <8 x i32> %tmp30, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2646  %tmp32 = add <8 x i32> %tmp30, %tmp312647  %tmp33 = shufflevector <8 x i32> %tmp32, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2648  %tmp34 = add <8 x i32> %tmp32, %tmp332649  %tmp35 = extractelement <8 x i32> %tmp34, i64 02650  ret i32 %tmp352651}2652 2653define i32 @madd_quad_reduction(ptr %arg, ptr %arg1, ptr %arg2, ptr %arg3, ptr %arg4, ptr %arg5, ptr %arg6, ptr %arg7) {2654; SSE2-LABEL: madd_quad_reduction:2655; SSE2:       # %bb.0:2656; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rax2657; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r102658; SSE2-NEXT:    movdqu (%rdi), %xmm02659; SSE2-NEXT:    movdqu (%rsi), %xmm12660; SSE2-NEXT:    pmaddwd %xmm0, %xmm12661; SSE2-NEXT:    movdqu (%rdx), %xmm02662; SSE2-NEXT:    movdqu (%rcx), %xmm22663; SSE2-NEXT:    pmaddwd %xmm0, %xmm22664; SSE2-NEXT:    paddd %xmm1, %xmm22665; SSE2-NEXT:    movdqu (%r8), %xmm02666; SSE2-NEXT:    movdqu (%r9), %xmm12667; SSE2-NEXT:    pmaddwd %xmm0, %xmm12668; SSE2-NEXT:    paddd %xmm2, %xmm12669; SSE2-NEXT:    movdqu (%r10), %xmm02670; SSE2-NEXT:    movdqu (%rax), %xmm22671; SSE2-NEXT:    pmaddwd %xmm0, %xmm22672; SSE2-NEXT:    paddd %xmm1, %xmm22673; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]2674; SSE2-NEXT:    paddd %xmm2, %xmm02675; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2676; SSE2-NEXT:    paddd %xmm0, %xmm12677; SSE2-NEXT:    movd %xmm1, %eax2678; SSE2-NEXT:    retq2679;2680; AVX-LABEL: madd_quad_reduction:2681; AVX:       # %bb.0:2682; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %rax2683; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r102684; AVX-NEXT:    vmovdqu (%rdi), %xmm02685; AVX-NEXT:    vpmaddwd (%rsi), %xmm0, %xmm02686; AVX-NEXT:    vmovdqu (%rdx), %xmm12687; AVX-NEXT:    vpmaddwd (%rcx), %xmm1, %xmm12688; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm02689; AVX-NEXT:    vmovdqu (%r8), %xmm12690; AVX-NEXT:    vpmaddwd (%r9), %xmm1, %xmm12691; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm02692; AVX-NEXT:    vmovdqu (%r10), %xmm12693; AVX-NEXT:    vpmaddwd (%rax), %xmm1, %xmm12694; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm02695; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2696; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm02697; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2698; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm02699; AVX-NEXT:    vmovd %xmm0, %eax2700; AVX-NEXT:    retq2701  %tmp = load <8 x i16>, ptr %arg, align 12702  %tmp6 = load <8 x i16>, ptr %arg1, align 12703  %tmp7 = sext <8 x i16> %tmp to <8 x i32>2704  %tmp17 = sext <8 x i16> %tmp6 to <8 x i32>2705  %tmp19 = mul nsw <8 x i32> %tmp7, %tmp172706  %tmp20 = load <8 x i16>, ptr %arg2, align 12707  %tmp21 = load <8 x i16>, ptr %arg3, align 12708  %tmp22 = sext <8 x i16> %tmp20 to <8 x i32>2709  %tmp23 = sext <8 x i16> %tmp21 to <8 x i32>2710  %tmp25 = mul nsw <8 x i32> %tmp22, %tmp232711  %tmp26 = add nuw nsw <8 x i32> %tmp25, %tmp192712 2713  %tmp40 = load <8 x i16>, ptr %arg4, align 12714  %tmp41 = load <8 x i16>, ptr %arg5, align 12715  %tmp42 = sext <8 x i16> %tmp40 to <8 x i32>2716  %tmp43 = sext <8 x i16> %tmp41 to <8 x i32>2717  %tmp45 = mul nsw <8 x i32> %tmp42, %tmp432718  %tmp56 = add nuw nsw <8 x i32> %tmp26, %tmp452719 2720  %tmp50 = load <8 x i16>, ptr %arg6, align 12721  %tmp51 = load <8 x i16>, ptr %arg7, align 12722  %tmp52 = sext <8 x i16> %tmp50 to <8 x i32>2723  %tmp53 = sext <8 x i16> %tmp51 to <8 x i32>2724  %tmp55 = mul nsw <8 x i32> %tmp52, %tmp532725  %tmp57 = add nuw nsw <8 x i32> %tmp55, %tmp562726 2727  %tmp29 = shufflevector <8 x i32> %tmp57, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>2728  %tmp30 = add <8 x i32> %tmp57, %tmp292729  %tmp31 = shufflevector <8 x i32> %tmp30, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2730  %tmp32 = add <8 x i32> %tmp30, %tmp312731  %tmp33 = shufflevector <8 x i32> %tmp32, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2732  %tmp34 = add <8 x i32> %tmp32, %tmp332733  %tmp35 = extractelement <8 x i32> %tmp34, i64 02734  ret i32 %tmp352735}2736 2737define i64 @sum_and_sum_of_squares(ptr %a, i32 %n) {2738; SSE2-LABEL: sum_and_sum_of_squares:2739; SSE2:       # %bb.0: # %entry2740; SSE2-NEXT:    movl %esi, %eax2741; SSE2-NEXT:    pxor %xmm0, %xmm02742; SSE2-NEXT:    pxor %xmm1, %xmm12743; SSE2-NEXT:    pxor %xmm2, %xmm22744; SSE2-NEXT:    pxor %xmm3, %xmm32745; SSE2-NEXT:    .p2align 42746; SSE2-NEXT:  .LBB33_1: # %vector.body2747; SSE2-NEXT:    # =>This Inner Loop Header: Depth=12748; SSE2-NEXT:    movq {{.*#+}} xmm4 = mem[0],zero2749; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]2750; SSE2-NEXT:    movdqa %xmm4, %xmm52751; SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3]2752; SSE2-NEXT:    paddd %xmm5, %xmm22753; SSE2-NEXT:    movdqa %xmm4, %xmm52754; SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]2755; SSE2-NEXT:    paddd %xmm5, %xmm32756; SSE2-NEXT:    pmaddwd %xmm4, %xmm42757; SSE2-NEXT:    paddd %xmm4, %xmm12758; SSE2-NEXT:    addq $8, %rdi2759; SSE2-NEXT:    addq $-8, %rax2760; SSE2-NEXT:    jne .LBB33_12761; SSE2-NEXT:  # %bb.2: # %middle.block2762; SSE2-NEXT:    paddd %xmm3, %xmm22763; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]2764; SSE2-NEXT:    paddd %xmm2, %xmm32765; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,1,1]2766; SSE2-NEXT:    paddd %xmm3, %xmm22767; SSE2-NEXT:    movd %xmm2, %ecx2768; SSE2-NEXT:    paddd %xmm0, %xmm12769; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]2770; SSE2-NEXT:    paddd %xmm1, %xmm02771; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2772; SSE2-NEXT:    paddd %xmm0, %xmm12773; SSE2-NEXT:    movd %xmm1, %eax2774; SSE2-NEXT:    shlq $32, %rcx2775; SSE2-NEXT:    orq %rcx, %rax2776; SSE2-NEXT:    retq2777;2778; AVX1-LABEL: sum_and_sum_of_squares:2779; AVX1:       # %bb.0: # %entry2780; AVX1-NEXT:    movl %esi, %eax2781; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm02782; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm12783; AVX1-NEXT:    .p2align 42784; AVX1-NEXT:  .LBB33_1: # %vector.body2785; AVX1-NEXT:    # =>This Inner Loop Header: Depth=12786; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero2787; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm3 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero2788; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm42789; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm42790; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm12791; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm12792; AVX1-NEXT:    vpmaddwd %xmm2, %xmm2, %xmm22793; AVX1-NEXT:    vpmaddwd %xmm3, %xmm3, %xmm32794; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm42795; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm32796; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm02797; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm02798; AVX1-NEXT:    addq $8, %rdi2799; AVX1-NEXT:    addq $-8, %rax2800; AVX1-NEXT:    jne .LBB33_12801; AVX1-NEXT:  # %bb.2: # %middle.block2802; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm22803; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm12804; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]2805; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm12806; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]2807; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm12808; AVX1-NEXT:    vmovd %xmm1, %ecx2809; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12810; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm02811; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2812; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm02813; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2814; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm02815; AVX1-NEXT:    vmovd %xmm0, %eax2816; AVX1-NEXT:    shlq $32, %rcx2817; AVX1-NEXT:    orq %rcx, %rax2818; AVX1-NEXT:    vzeroupper2819; AVX1-NEXT:    retq2820;2821; AVX256-LABEL: sum_and_sum_of_squares:2822; AVX256:       # %bb.0: # %entry2823; AVX256-NEXT:    movl %esi, %eax2824; AVX256-NEXT:    vpxor %xmm0, %xmm0, %xmm02825; AVX256-NEXT:    vpxor %xmm1, %xmm1, %xmm12826; AVX256-NEXT:    .p2align 42827; AVX256-NEXT:  .LBB33_1: # %vector.body2828; AVX256-NEXT:    # =>This Inner Loop Header: Depth=12829; AVX256-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,zero2830; AVX256-NEXT:    vpaddd %ymm1, %ymm2, %ymm12831; AVX256-NEXT:    vpmaddwd %ymm2, %ymm2, %ymm22832; AVX256-NEXT:    vpaddd %ymm0, %ymm2, %ymm02833; AVX256-NEXT:    addq $8, %rdi2834; AVX256-NEXT:    addq $-8, %rax2835; AVX256-NEXT:    jne .LBB33_12836; AVX256-NEXT:  # %bb.2: # %middle.block2837; AVX256-NEXT:    vextracti128 $1, %ymm1, %xmm22838; AVX256-NEXT:    vpaddd %xmm2, %xmm1, %xmm12839; AVX256-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]2840; AVX256-NEXT:    vpaddd %xmm2, %xmm1, %xmm12841; AVX256-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]2842; AVX256-NEXT:    vpaddd %xmm2, %xmm1, %xmm12843; AVX256-NEXT:    vmovd %xmm1, %ecx2844; AVX256-NEXT:    vextracti128 $1, %ymm0, %xmm12845; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm02846; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2847; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm02848; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2849; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm02850; AVX256-NEXT:    vmovd %xmm0, %eax2851; AVX256-NEXT:    shlq $32, %rcx2852; AVX256-NEXT:    orq %rcx, %rax2853; AVX256-NEXT:    vzeroupper2854; AVX256-NEXT:    retq2855entry:2856  %0 = zext i32 %n to i642857  br label %vector.body2858 2859vector.body:2860  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]2861  %vec.phi = phi <8 x i32> [ %6, %vector.body ], [ zeroinitializer, %entry ]2862  %sum.phi = phi <8 x i32> [ %4, %vector.body ], [ zeroinitializer, %entry ]2863  %1 = getelementptr inbounds i8, ptr %a, i64 %index2864  %2 = bitcast ptr %1 to ptr2865  %wide.load = load <8 x i8>, ptr %2, align 12866  %3 = zext <8 x i8> %wide.load to <8 x i32>2867  %4 = add nsw <8 x i32> %3, %sum.phi2868  %5 = mul nsw <8 x i32> %3, %32869  %6 = add nsw <8 x i32> %5, %vec.phi2870  %index.next = add i64 %index, 82871  %7 = icmp eq i64 %index.next, %02872  br i1 %7, label %middle.block, label %vector.body2873 2874middle.block:2875  %rdx.shuf35 = shufflevector <8 x i32> %4, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>2876  %bin.rdx36 = add <8 x i32> %4, %rdx.shuf352877  %rdx.shuf37 = shufflevector <8 x i32> %bin.rdx36, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2878  %bin.rdx38 = add <8 x i32> %bin.rdx36, %rdx.shuf372879  %rdx.shuf39 = shufflevector <8 x i32> %bin.rdx38, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2880  %bin.rdx40 = add <8 x i32> %bin.rdx38, %rdx.shuf392881  %8 = extractelement <8 x i32> %bin.rdx40, i32 02882  %rdx.shuf = shufflevector <8 x i32> %6, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>2883  %bin.rdx = add <8 x i32> %6, %rdx.shuf2884  %rdx.shuf31 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2885  %bin.rdx32 = add <8 x i32> %bin.rdx, %rdx.shuf312886  %rdx.shuf33 = shufflevector <8 x i32> %bin.rdx32, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2887  %bin.rdx34 = add <8 x i32> %bin.rdx32, %rdx.shuf332888  %9 = extractelement <8 x i32> %bin.rdx34, i32 02889  %tmp = zext i32 %8 to i642890  %tmp28 = shl nuw i64 %tmp, 322891  %tmp29 = zext i32 %9 to i642892  %tmp30 = or i64 %tmp28, %tmp292893  ret i64 %tmp302894}2895 2896define i32 @sum_of_square_differences(ptr %a, ptr %b, i32 %n) {2897; SSE2-LABEL: sum_of_square_differences:2898; SSE2:       # %bb.0: # %entry2899; SSE2-NEXT:    movl %edx, %eax2900; SSE2-NEXT:    pxor %xmm0, %xmm02901; SSE2-NEXT:    xorl %ecx, %ecx2902; SSE2-NEXT:    pxor %xmm1, %xmm12903; SSE2-NEXT:    .p2align 42904; SSE2-NEXT:  .LBB34_1: # %vector.body2905; SSE2-NEXT:    # =>This Inner Loop Header: Depth=12906; SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero2907; SSE2-NEXT:    movq {{.*#+}} xmm3 = mem[0],zero2908; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]2909; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]2910; SSE2-NEXT:    psubw %xmm2, %xmm32911; SSE2-NEXT:    pmaddwd %xmm3, %xmm32912; SSE2-NEXT:    paddd %xmm3, %xmm12913; SSE2-NEXT:    addq $8, %rcx2914; SSE2-NEXT:    cmpq %rcx, %rax2915; SSE2-NEXT:    jne .LBB34_12916; SSE2-NEXT:  # %bb.2: # %middle.block2917; SSE2-NEXT:    paddd %xmm0, %xmm12918; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]2919; SSE2-NEXT:    paddd %xmm1, %xmm02920; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2921; SSE2-NEXT:    paddd %xmm0, %xmm12922; SSE2-NEXT:    movd %xmm1, %eax2923; SSE2-NEXT:    retq2924;2925; AVX1-LABEL: sum_of_square_differences:2926; AVX1:       # %bb.0: # %entry2927; AVX1-NEXT:    movl %edx, %eax2928; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm02929; AVX1-NEXT:    xorl %ecx, %ecx2930; AVX1-NEXT:    .p2align 42931; AVX1-NEXT:  .LBB34_1: # %vector.body2932; AVX1-NEXT:    # =>This Inner Loop Header: Depth=12933; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero2934; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero2935; AVX1-NEXT:    vpsubw %xmm1, %xmm2, %xmm12936; AVX1-NEXT:    vpmaddwd %xmm1, %xmm1, %xmm12937; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm12938; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]2939; AVX1-NEXT:    addq $8, %rcx2940; AVX1-NEXT:    cmpq %rcx, %rax2941; AVX1-NEXT:    jne .LBB34_12942; AVX1-NEXT:  # %bb.2: # %middle.block2943; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12944; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm02945; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2946; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm02947; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2948; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm02949; AVX1-NEXT:    vmovd %xmm0, %eax2950; AVX1-NEXT:    vzeroupper2951; AVX1-NEXT:    retq2952;2953; AVX256-LABEL: sum_of_square_differences:2954; AVX256:       # %bb.0: # %entry2955; AVX256-NEXT:    movl %edx, %eax2956; AVX256-NEXT:    vpxor %xmm0, %xmm0, %xmm02957; AVX256-NEXT:    xorl %ecx, %ecx2958; AVX256-NEXT:    .p2align 42959; AVX256-NEXT:  .LBB34_1: # %vector.body2960; AVX256-NEXT:    # =>This Inner Loop Header: Depth=12961; AVX256-NEXT:    vpmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero2962; AVX256-NEXT:    vpmovzxbw {{.*#+}} xmm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero2963; AVX256-NEXT:    vpsubw %xmm1, %xmm2, %xmm12964; AVX256-NEXT:    vpmaddwd %xmm1, %xmm1, %xmm12965; AVX256-NEXT:    vpaddd %ymm0, %ymm1, %ymm02966; AVX256-NEXT:    addq $8, %rcx2967; AVX256-NEXT:    cmpq %rcx, %rax2968; AVX256-NEXT:    jne .LBB34_12969; AVX256-NEXT:  # %bb.2: # %middle.block2970; AVX256-NEXT:    vextracti128 $1, %ymm0, %xmm12971; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm02972; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2973; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm02974; AVX256-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2975; AVX256-NEXT:    vpaddd %xmm1, %xmm0, %xmm02976; AVX256-NEXT:    vmovd %xmm0, %eax2977; AVX256-NEXT:    vzeroupper2978; AVX256-NEXT:    retq2979entry:2980  %0 = zext i32 %n to i642981  br label %vector.body2982 2983vector.body:2984  %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]2985  %vec.phi = phi <8 x i32> [ %9, %vector.body ], [ zeroinitializer, %entry ]2986  %1 = getelementptr inbounds i8, ptr %a, i64 %index2987  %2 = bitcast ptr %1 to ptr2988  %wide.load = load <8 x i8>, ptr %2, align 12989  %3 = zext <8 x i8> %wide.load to <8 x i32>2990  %4 = getelementptr inbounds i8, ptr %b, i64 %index2991  %5 = bitcast ptr %4 to ptr2992  %wide.load2 = load <8 x i8>, ptr %5, align 12993  %6 = zext <8 x i8> %wide.load2 to <8 x i32>2994  %7 = sub <8 x i32> %6, %32995  %8 = mul <8 x i32> %7, %72996  %9 = add nsw <8 x i32> %8, %vec.phi2997  %index.next = add i64 %index, 82998  %10 = icmp eq i64 %index.next, %02999  br i1 %10, label %middle.block, label %vector.body3000 3001middle.block:3002  %rdx.shuf = shufflevector <8 x i32> %9, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>3003  %bin.rdx = add <8 x i32> %9, %rdx.shuf3004  %rdx.shuf31 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>3005  %bin.rdx32 = add <8 x i32> %bin.rdx, %rdx.shuf313006  %rdx.shuf33 = shufflevector <8 x i32> %bin.rdx32, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>3007  %bin.rdx34 = add <8 x i32> %bin.rdx32, %rdx.shuf333008  %11 = extractelement <8 x i32> %bin.rdx34, i32 03009  ret i32 %113010}3011 3012; PR49716 - https://llvm.org/PR497163013 3014define <4 x i32> @input_size_mismatch(<16 x i16> %x, ptr %p) {3015; SSE2-LABEL: input_size_mismatch:3016; SSE2:       # %bb.0:3017; SSE2-NEXT:    pmaddwd (%rdi), %xmm03018; SSE2-NEXT:    retq3019;3020; AVX-LABEL: input_size_mismatch:3021; AVX:       # %bb.0:3022; AVX-NEXT:    vpmaddwd (%rdi), %xmm0, %xmm03023; AVX-NEXT:    vzeroupper3024; AVX-NEXT:    retq3025  %y = load <16 x i16>, ptr %p, align 323026  %x0 = shufflevector <16 x i16> %x, <16 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>3027  %x1 = shufflevector <16 x i16> %x, <16 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>3028  %y0 = shufflevector <16 x i16> %y, <16 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>3029  %y1 = shufflevector <16 x i16> %y, <16 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>3030  %sx0 = sext <4 x i16> %x0 to <4 x i32>3031  %sx1 = sext <4 x i16> %x1 to <4 x i32>3032  %sy0 = sext <4 x i16> %y0 to <4 x i32>3033  %sy1 = sext <4 x i16> %y1 to <4 x i32>3034  %m0 = mul <4 x i32> %sx0, %sy03035  %m1 = mul <4 x i32> %sx1, %sy13036  %r = add <4 x i32> %m0, %m13037  ret <4 x i32> %r3038}3039 3040define <4 x i32> @output_size_mismatch(<16 x i16> %x, <16 x i16> %y) {3041; SSE2-LABEL: output_size_mismatch:3042; SSE2:       # %bb.0:3043; SSE2-NEXT:    pmaddwd %xmm2, %xmm03044; SSE2-NEXT:    retq3045;3046; AVX-LABEL: output_size_mismatch:3047; AVX:       # %bb.0:3048; AVX-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm03049; AVX-NEXT:    vzeroupper3050; AVX-NEXT:    retq3051  %x0 = shufflevector <16 x i16> %x, <16 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>3052  %x1 = shufflevector <16 x i16> %x, <16 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>3053  %y0 = shufflevector <16 x i16> %y, <16 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>3054  %y1 = shufflevector <16 x i16> %y, <16 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>3055  %sx0 = sext <4 x i16> %x0 to <4 x i32>3056  %sx1 = sext <4 x i16> %x1 to <4 x i32>3057  %sy0 = sext <4 x i16> %y0 to <4 x i32>3058  %sy1 = sext <4 x i16> %y1 to <4 x i32>3059  %m0 = mul <4 x i32> %sx0, %sy03060  %m1 = mul <4 x i32> %sx1, %sy13061  %r = add <4 x i32> %m0, %m13062  ret <4 x i32> %r3063}3064 3065define <4 x i32> @output_size_mismatch_high_subvector(<16 x i16> %x, <16 x i16> %y) {3066; SSE2-LABEL: output_size_mismatch_high_subvector:3067; SSE2:       # %bb.0:3068; SSE2-NEXT:    movdqa %xmm1, %xmm03069; SSE2-NEXT:    pmaddwd %xmm2, %xmm03070; SSE2-NEXT:    retq3071;3072; AVX1-LABEL: output_size_mismatch_high_subvector:3073; AVX1:       # %bb.0:3074; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm03075; AVX1-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm03076; AVX1-NEXT:    vzeroupper3077; AVX1-NEXT:    retq3078;3079; AVX256-LABEL: output_size_mismatch_high_subvector:3080; AVX256:       # %bb.0:3081; AVX256-NEXT:    vextracti128 $1, %ymm0, %xmm03082; AVX256-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm03083; AVX256-NEXT:    vzeroupper3084; AVX256-NEXT:    retq3085  %x0 = shufflevector <16 x i16> %x, <16 x i16> undef, <4 x i32> <i32 8, i32 10, i32 12, i32 14>3086  %x1 = shufflevector <16 x i16> %x, <16 x i16> undef, <4 x i32> <i32 9, i32 11, i32 13, i32 15>3087  %y0 = shufflevector <16 x i16> %y, <16 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>3088  %y1 = shufflevector <16 x i16> %y, <16 x i16> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>3089  %sx0 = sext <4 x i16> %x0 to <4 x i32>3090  %sx1 = sext <4 x i16> %x1 to <4 x i32>3091  %sy0 = sext <4 x i16> %y0 to <4 x i32>3092  %sy1 = sext <4 x i16> %y1 to <4 x i32>3093  %m0 = mul <4 x i32> %sx0, %sy03094  %m1 = mul <4 x i32> %sx1, %sy13095  %r = add <4 x i32> %m0, %m13096  ret <4 x i32> %r3097}3098 3099define i32 @add_used_by_loop_phi(ptr %a, ptr %b, i64 %offset_a, i64 %offset_b, i64 %k) {3100; SSE2-LABEL: add_used_by_loop_phi:3101; SSE2:       # %bb.0: # %entry3102; SSE2-NEXT:    addq %rdx, %rdi3103; SSE2-NEXT:    addq %rcx, %rsi3104; SSE2-NEXT:    pxor %xmm0, %xmm03105; SSE2-NEXT:    xorl %eax, %eax3106; SSE2-NEXT:    pxor %xmm2, %xmm23107; SSE2-NEXT:    pxor %xmm1, %xmm13108; SSE2-NEXT:    .p2align 43109; SSE2-NEXT:  .LBB38_1: # %loop3110; SSE2-NEXT:    # =>This Inner Loop Header: Depth=13111; SSE2-NEXT:    movdqu (%rdi,%rax), %xmm33112; SSE2-NEXT:    movdqu (%rsi,%rax), %xmm43113; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]3114; SSE2-NEXT:    psraw $8, %xmm53115; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1],xmm6[2],xmm3[2],xmm6[3],xmm3[3],xmm6[4],xmm3[4],xmm6[5],xmm3[5],xmm6[6],xmm3[6],xmm6[7],xmm3[7]3116; SSE2-NEXT:    psraw $8, %xmm63117; SSE2-NEXT:    pmaddwd %xmm5, %xmm63118; SSE2-NEXT:    paddd %xmm6, %xmm23119; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]3120; SSE2-NEXT:    psraw $8, %xmm43121; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]3122; SSE2-NEXT:    psraw $8, %xmm33123; SSE2-NEXT:    pmaddwd %xmm4, %xmm33124; SSE2-NEXT:    paddd %xmm3, %xmm13125; SSE2-NEXT:    addq $16, %rax3126; SSE2-NEXT:    cmpq %r8, %rax3127; SSE2-NEXT:    jb .LBB38_13128; SSE2-NEXT:  # %bb.2: # %afterloop3129; SSE2-NEXT:    paddd %xmm0, %xmm23130; SSE2-NEXT:    paddd %xmm0, %xmm13131; SSE2-NEXT:    paddd %xmm2, %xmm13132; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]3133; SSE2-NEXT:    paddd %xmm1, %xmm03134; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]3135; SSE2-NEXT:    paddd %xmm0, %xmm13136; SSE2-NEXT:    movd %xmm1, %eax3137; SSE2-NEXT:    retq3138;3139; AVX1-LABEL: add_used_by_loop_phi:3140; AVX1:       # %bb.0: # %entry3141; AVX1-NEXT:    addq %rdx, %rdi3142; AVX1-NEXT:    addq %rcx, %rsi3143; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm03144; AVX1-NEXT:    xorl %eax, %eax3145; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm13146; AVX1-NEXT:    .p2align 43147; AVX1-NEXT:  .LBB38_1: # %loop3148; AVX1-NEXT:    # =>This Inner Loop Header: Depth=13149; AVX1-NEXT:    vpmovsxbw 8(%rdi,%rax), %xmm23150; AVX1-NEXT:    vpmovsxbw (%rdi,%rax), %xmm33151; AVX1-NEXT:    vpmovsxbw 8(%rsi,%rax), %xmm43152; AVX1-NEXT:    vpmaddwd %xmm4, %xmm2, %xmm23153; AVX1-NEXT:    vpmovsxbw (%rsi,%rax), %xmm43154; AVX1-NEXT:    vpmaddwd %xmm4, %xmm3, %xmm33155; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm43156; AVX1-NEXT:    vpaddd %xmm4, %xmm2, %xmm23157; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm13158; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm13159; AVX1-NEXT:    addq $16, %rax3160; AVX1-NEXT:    cmpq %r8, %rax3161; AVX1-NEXT:    jb .LBB38_13162; AVX1-NEXT:  # %bb.2: # %afterloop3163; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm23164; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm33165; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm23166; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm03167; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm03168; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]3169; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm03170; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]3171; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm03172; AVX1-NEXT:    vmovd %xmm0, %eax3173; AVX1-NEXT:    vzeroupper3174; AVX1-NEXT:    retq3175;3176; AVX2-LABEL: add_used_by_loop_phi:3177; AVX2:       # %bb.0: # %entry3178; AVX2-NEXT:    addq %rdx, %rdi3179; AVX2-NEXT:    addq %rcx, %rsi3180; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm03181; AVX2-NEXT:    xorl %eax, %eax3182; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm13183; AVX2-NEXT:    .p2align 43184; AVX2-NEXT:  .LBB38_1: # %loop3185; AVX2-NEXT:    # =>This Inner Loop Header: Depth=13186; AVX2-NEXT:    vpmovsxbw (%rdi,%rax), %ymm23187; AVX2-NEXT:    vpmovsxbw (%rsi,%rax), %ymm33188; AVX2-NEXT:    vpmaddwd %ymm3, %ymm2, %ymm23189; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm13190; AVX2-NEXT:    addq $16, %rax3191; AVX2-NEXT:    cmpq %r8, %rax3192; AVX2-NEXT:    jb .LBB38_13193; AVX2-NEXT:  # %bb.2: # %afterloop3194; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm03195; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm13196; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm03197; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]3198; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm03199; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]3200; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm03201; AVX2-NEXT:    vmovd %xmm0, %eax3202; AVX2-NEXT:    vzeroupper3203; AVX2-NEXT:    retq3204;3205; AVX512-LABEL: add_used_by_loop_phi:3206; AVX512:       # %bb.0: # %entry3207; AVX512-NEXT:    addq %rdx, %rdi3208; AVX512-NEXT:    addq %rcx, %rsi3209; AVX512-NEXT:    vpxor %xmm0, %xmm0, %xmm03210; AVX512-NEXT:    xorl %eax, %eax3211; AVX512-NEXT:    .p2align 43212; AVX512-NEXT:  .LBB38_1: # %loop3213; AVX512-NEXT:    # =>This Inner Loop Header: Depth=13214; AVX512-NEXT:    vpmovsxbw (%rdi,%rax), %ymm13215; AVX512-NEXT:    vpmovsxbw (%rsi,%rax), %ymm23216; AVX512-NEXT:    vpmaddwd %ymm2, %ymm1, %ymm13217; AVX512-NEXT:    vpaddd %zmm0, %zmm1, %zmm03218; AVX512-NEXT:    addq $16, %rax3219; AVX512-NEXT:    cmpq %r8, %rax3220; AVX512-NEXT:    jb .LBB38_13221; AVX512-NEXT:  # %bb.2: # %afterloop3222; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm13223; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm03224; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm13225; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm03226; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]3227; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm03228; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]3229; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm03230; AVX512-NEXT:    vmovd %xmm0, %eax3231; AVX512-NEXT:    vzeroupper3232; AVX512-NEXT:    retq3233entry:3234  %scevgep_a = getelementptr i8, ptr %a, i64 %offset_a3235  %scevgep_b = getelementptr i8, ptr %b, i64 %offset_b3236  br label %loop3237 3238loop:3239  %t0 = phi <16 x i32> [ %3, %loop ], [ zeroinitializer, %entry ]3240  %ivloop = phi i64 [ %nextivloop, %loop ], [ 0, %entry ]3241  %scevgep_a1 = getelementptr i8, ptr %scevgep_a, i64 %ivloop3242  %scevgep_a2 = bitcast ptr %scevgep_a1 to ptr3243  %gepload_a = load <16 x i8>, ptr %scevgep_a2, align 13244  %scevgep_b1 = getelementptr i8, ptr %scevgep_b, i64 %ivloop3245  %scevgep_b2 = bitcast ptr %scevgep_b1 to ptr3246  %gepload_b = load <16 x i8>, ptr %scevgep_b2, align 13247  %0 = sext <16 x i8> %gepload_a to <16 x i32>3248  %1 = sext <16 x i8> %gepload_b to <16 x i32>3249  %2 = mul nsw <16 x i32> %0, %13250  %3 = add <16 x i32> %2, %t03251  %nextivloop = add nuw nsw i64 %ivloop, 163252  %condloop = icmp ult i64 %nextivloop, %k3253  br i1 %condloop, label %loop, label %afterloop3254 3255afterloop:3256  %.lcssa = phi <16 x i32> [ %3, %loop ]3257  %rdx.shuf = shufflevector <16 x i32> %.lcssa, <16 x i32> poison, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>3258  %bin.rdx = add <16 x i32> %.lcssa, %rdx.shuf3259  %rdx.shuf90 = shufflevector <16 x i32> %bin.rdx, <16 x i32> poison, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>3260  %bin.rdx91 = add <16 x i32> %bin.rdx, %rdx.shuf903261  %rdx.shuf92 = shufflevector <16 x i32> %bin.rdx91, <16 x i32> poison, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>3262  %bin.rdx93 = add <16 x i32> %bin.rdx91, %rdx.shuf923263  %rdx.shuf94 = shufflevector <16 x i32> %bin.rdx93, <16 x i32> poison, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>3264  %bin.rdx95 = add <16 x i32> %bin.rdx93, %rdx.shuf943265  %sum = extractelement <16 x i32> %bin.rdx95, i32 03266  ret i32 %sum3267}3268