1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL --check-prefix=AVX512BWVL 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL --check-prefix=AVX512DQVL 10 11; 12; vXi64 13; 14 15define i64 @test_v2i64(<2 x i64> %a0) { 16; SSE-LABEL: test_v2i64: 17; SSE: # %bb.0: 18; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 19; SSE-NEXT: movdqa %xmm0, %xmm2 20; SSE-NEXT: psrlq $32, %xmm2 21; SSE-NEXT: pmuludq %xmm1, %xmm2 22; SSE-NEXT: movdqa %xmm0, %xmm3 23; SSE-NEXT: psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 24; SSE-NEXT: pmuludq %xmm0, %xmm3 25; SSE-NEXT: paddq %xmm2, %xmm3 26; SSE-NEXT: psllq $32, %xmm3 27; SSE-NEXT: pmuludq %xmm1, %xmm0 28; SSE-NEXT: paddq %xmm3, %xmm0 29; SSE-NEXT: movq %xmm0, %rax 30; SSE-NEXT: retq 31; 32; AVX-LABEL: test_v2i64: 33; AVX: # %bb.0: 34; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 35; AVX-NEXT: vpsrlq $32, %xmm0, %xmm2 36; AVX-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 37; AVX-NEXT: vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 38; AVX-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 39; AVX-NEXT: vpaddq %xmm2, %xmm3, %xmm2 40; AVX-NEXT: vpsllq $32, %xmm2, %xmm2 41; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 42; AVX-NEXT: vpaddq %xmm2, %xmm0, %xmm0 43; AVX-NEXT: vmovq %xmm0, %rax 44; AVX-NEXT: retq 45; 46; AVX512BW-LABEL: test_v2i64: 47; AVX512BW: # %bb.0: 48; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 49; AVX512BW-NEXT: vpsrlq $32, %xmm0, %xmm2 50; AVX512BW-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 51; AVX512BW-NEXT: vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 52; AVX512BW-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 53; AVX512BW-NEXT: vpaddq %xmm2, %xmm3, %xmm2 54; AVX512BW-NEXT: vpsllq $32, %xmm2, %xmm2 55; AVX512BW-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 56; AVX512BW-NEXT: vpaddq %xmm2, %xmm0, %xmm0 57; AVX512BW-NEXT: vmovq %xmm0, %rax 58; AVX512BW-NEXT: retq 59; 60; AVX512BWVL-LABEL: test_v2i64: 61; AVX512BWVL: # %bb.0: 62; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 63; AVX512BWVL-NEXT: vpsrlq $32, %xmm0, %xmm2 64; AVX512BWVL-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 65; AVX512BWVL-NEXT: vpsrlq $32, %xmm1, %xmm3 66; AVX512BWVL-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 67; AVX512BWVL-NEXT: vpaddq %xmm2, %xmm3, %xmm2 68; AVX512BWVL-NEXT: vpsllq $32, %xmm2, %xmm2 69; AVX512BWVL-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 70; AVX512BWVL-NEXT: vpaddq %xmm2, %xmm0, %xmm0 71; AVX512BWVL-NEXT: vmovq %xmm0, %rax 72; AVX512BWVL-NEXT: retq 73; 74; AVX512DQ-LABEL: test_v2i64: 75; AVX512DQ: # %bb.0: 76; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 77; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 78; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 79; AVX512DQ-NEXT: vmovq %xmm0, %rax 80; AVX512DQ-NEXT: vzeroupper 81; AVX512DQ-NEXT: retq 82; 83; AVX512DQVL-LABEL: test_v2i64: 84; AVX512DQVL: # %bb.0: 85; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 86; AVX512DQVL-NEXT: vpmullq %xmm1, %xmm0, %xmm0 87; AVX512DQVL-NEXT: vmovq %xmm0, %rax 88; AVX512DQVL-NEXT: retq 89 %1 = call i64 @llvm.experimental.vector.reduce.mul.i64.v2i64(<2 x i64> %a0) 90 ret i64 %1 91} 92 93define i64 @test_v4i64(<4 x i64> %a0) { 94; SSE-LABEL: test_v4i64: 95; SSE: # %bb.0: 96; SSE-NEXT: movdqa %xmm0, %xmm2 97; SSE-NEXT: psrlq $32, %xmm2 98; SSE-NEXT: pmuludq %xmm1, %xmm2 99; SSE-NEXT: movdqa %xmm1, %xmm3 100; SSE-NEXT: psrlq $32, %xmm3 101; SSE-NEXT: pmuludq %xmm0, %xmm3 102; SSE-NEXT: paddq %xmm2, %xmm3 103; SSE-NEXT: psllq $32, %xmm3 104; SSE-NEXT: pmuludq %xmm1, %xmm0 105; SSE-NEXT: paddq %xmm3, %xmm0 106; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 107; SSE-NEXT: movdqa %xmm0, %xmm2 108; SSE-NEXT: psrlq $32, %xmm2 109; SSE-NEXT: pmuludq %xmm1, %xmm2 110; SSE-NEXT: movdqa %xmm0, %xmm3 111; SSE-NEXT: psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 112; SSE-NEXT: pmuludq %xmm0, %xmm3 113; SSE-NEXT: paddq %xmm2, %xmm3 114; SSE-NEXT: psllq $32, %xmm3 115; SSE-NEXT: pmuludq %xmm1, %xmm0 116; SSE-NEXT: paddq %xmm3, %xmm0 117; SSE-NEXT: movq %xmm0, %rax 118; SSE-NEXT: retq 119; 120; AVX1-LABEL: test_v4i64: 121; AVX1: # %bb.0: 122; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 123; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm2 124; AVX1-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 125; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3 126; AVX1-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 127; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 128; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2 129; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 130; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 131; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 132; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm2 133; AVX1-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 134; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3 135; AVX1-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 136; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 137; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2 138; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 139; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 140; AVX1-NEXT: vmovq %xmm0, %rax 141; AVX1-NEXT: vzeroupper 142; AVX1-NEXT: retq 143; 144; AVX2-LABEL: test_v4i64: 145; AVX2: # %bb.0: 146; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 147; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm2 148; AVX2-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 149; AVX2-NEXT: vpsrlq $32, %ymm1, %ymm3 150; AVX2-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 151; AVX2-NEXT: vpaddq %ymm2, %ymm3, %ymm2 152; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 153; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 154; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 155; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 156; AVX2-NEXT: vpsrldq {{.*#+}} ymm2 = ymm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,ymm0[28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 157; AVX2-NEXT: vpmuludq %ymm2, %ymm0, %ymm2 158; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm3 159; AVX2-NEXT: vpmuludq %ymm1, %ymm3, %ymm3 160; AVX2-NEXT: vpaddq %ymm3, %ymm2, %ymm2 161; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 162; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 163; AVX2-NEXT: vpaddq %xmm2, %xmm0, %xmm0 164; AVX2-NEXT: vmovq %xmm0, %rax 165; AVX2-NEXT: vzeroupper 166; AVX2-NEXT: retq 167; 168; AVX512BW-LABEL: test_v4i64: 169; AVX512BW: # %bb.0: 170; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 171; AVX512BW-NEXT: vpsrlq $32, %ymm0, %ymm2 172; AVX512BW-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 173; AVX512BW-NEXT: vpsrlq $32, %ymm1, %ymm3 174; AVX512BW-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 175; AVX512BW-NEXT: vpaddq %ymm2, %ymm3, %ymm2 176; AVX512BW-NEXT: vpsllq $32, %ymm2, %ymm2 177; AVX512BW-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 178; AVX512BW-NEXT: vpaddq %ymm2, %ymm0, %ymm0 179; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 180; AVX512BW-NEXT: vpsrldq {{.*#+}} ymm2 = ymm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,ymm0[28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 181; AVX512BW-NEXT: vpmuludq %ymm2, %ymm0, %ymm2 182; AVX512BW-NEXT: vpsrlq $32, %ymm0, %ymm3 183; AVX512BW-NEXT: vpmuludq %ymm1, %ymm3, %ymm3 184; AVX512BW-NEXT: vpaddq %ymm3, %ymm2, %ymm2 185; AVX512BW-NEXT: vpsllq $32, %ymm2, %ymm2 186; AVX512BW-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 187; AVX512BW-NEXT: vpaddq %xmm2, %xmm0, %xmm0 188; AVX512BW-NEXT: vmovq %xmm0, %rax 189; AVX512BW-NEXT: vzeroupper 190; AVX512BW-NEXT: retq 191; 192; AVX512BWVL-LABEL: test_v4i64: 193; AVX512BWVL: # %bb.0: 194; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 195; AVX512BWVL-NEXT: vpsrlq $32, %ymm0, %ymm2 196; AVX512BWVL-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 197; AVX512BWVL-NEXT: vpsrlq $32, %ymm1, %ymm3 198; AVX512BWVL-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 199; AVX512BWVL-NEXT: vpaddq %ymm2, %ymm3, %ymm2 200; AVX512BWVL-NEXT: vpsllq $32, %ymm2, %ymm2 201; AVX512BWVL-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 202; AVX512BWVL-NEXT: vpaddq %ymm2, %ymm0, %ymm0 203; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 204; AVX512BWVL-NEXT: vpsrlq $32, %ymm0, %ymm2 205; AVX512BWVL-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 206; AVX512BWVL-NEXT: vpsrlq $32, %ymm1, %ymm3 207; AVX512BWVL-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 208; AVX512BWVL-NEXT: vpaddq %ymm2, %ymm3, %ymm2 209; AVX512BWVL-NEXT: vpsllq $32, %ymm2, %ymm2 210; AVX512BWVL-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 211; AVX512BWVL-NEXT: vpaddq %xmm2, %xmm0, %xmm0 212; AVX512BWVL-NEXT: vmovq %xmm0, %rax 213; AVX512BWVL-NEXT: vzeroupper 214; AVX512BWVL-NEXT: retq 215; 216; AVX512DQ-LABEL: test_v4i64: 217; AVX512DQ: # %bb.0: 218; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 219; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 220; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 221; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 222; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 223; AVX512DQ-NEXT: vmovq %xmm0, %rax 224; AVX512DQ-NEXT: vzeroupper 225; AVX512DQ-NEXT: retq 226; 227; AVX512DQVL-LABEL: test_v4i64: 228; AVX512DQVL: # %bb.0: 229; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 230; AVX512DQVL-NEXT: vpmullq %ymm1, %ymm0, %ymm0 231; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 232; AVX512DQVL-NEXT: vpmullq %xmm1, %xmm0, %xmm0 233; AVX512DQVL-NEXT: vmovq %xmm0, %rax 234; AVX512DQVL-NEXT: vzeroupper 235; AVX512DQVL-NEXT: retq 236 %1 = call i64 @llvm.experimental.vector.reduce.mul.i64.v4i64(<4 x i64> %a0) 237 ret i64 %1 238} 239 240define i64 @test_v8i64(<8 x i64> %a0) { 241; SSE-LABEL: test_v8i64: 242; SSE: # %bb.0: 243; SSE-NEXT: movdqa %xmm1, %xmm4 244; SSE-NEXT: psrlq $32, %xmm4 245; SSE-NEXT: pmuludq %xmm3, %xmm4 246; SSE-NEXT: movdqa %xmm3, %xmm5 247; SSE-NEXT: psrlq $32, %xmm5 248; SSE-NEXT: pmuludq %xmm1, %xmm5 249; SSE-NEXT: paddq %xmm4, %xmm5 250; SSE-NEXT: psllq $32, %xmm5 251; SSE-NEXT: pmuludq %xmm3, %xmm1 252; SSE-NEXT: paddq %xmm5, %xmm1 253; SSE-NEXT: movdqa %xmm0, %xmm3 254; SSE-NEXT: psrlq $32, %xmm3 255; SSE-NEXT: pmuludq %xmm2, %xmm3 256; SSE-NEXT: movdqa %xmm2, %xmm4 257; SSE-NEXT: psrlq $32, %xmm4 258; SSE-NEXT: pmuludq %xmm0, %xmm4 259; SSE-NEXT: paddq %xmm3, %xmm4 260; SSE-NEXT: psllq $32, %xmm4 261; SSE-NEXT: pmuludq %xmm2, %xmm0 262; SSE-NEXT: paddq %xmm4, %xmm0 263; SSE-NEXT: movdqa %xmm0, %xmm2 264; SSE-NEXT: psrlq $32, %xmm2 265; SSE-NEXT: pmuludq %xmm1, %xmm2 266; SSE-NEXT: movdqa %xmm1, %xmm3 267; SSE-NEXT: psrlq $32, %xmm3 268; SSE-NEXT: pmuludq %xmm0, %xmm3 269; SSE-NEXT: paddq %xmm2, %xmm3 270; SSE-NEXT: psllq $32, %xmm3 271; SSE-NEXT: pmuludq %xmm1, %xmm0 272; SSE-NEXT: paddq %xmm3, %xmm0 273; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 274; SSE-NEXT: movdqa %xmm0, %xmm2 275; SSE-NEXT: psrlq $32, %xmm2 276; SSE-NEXT: pmuludq %xmm1, %xmm2 277; SSE-NEXT: movdqa %xmm0, %xmm3 278; SSE-NEXT: psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 279; SSE-NEXT: pmuludq %xmm0, %xmm3 280; SSE-NEXT: paddq %xmm2, %xmm3 281; SSE-NEXT: psllq $32, %xmm3 282; SSE-NEXT: pmuludq %xmm1, %xmm0 283; SSE-NEXT: paddq %xmm3, %xmm0 284; SSE-NEXT: movq %xmm0, %rax 285; SSE-NEXT: retq 286; 287; AVX1-LABEL: test_v8i64: 288; AVX1: # %bb.0: 289; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 290; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 291; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm4 292; AVX1-NEXT: vpmuludq %xmm2, %xmm4, %xmm4 293; AVX1-NEXT: vpsrlq $32, %xmm2, %xmm5 294; AVX1-NEXT: vpmuludq %xmm5, %xmm3, %xmm5 295; AVX1-NEXT: vpaddq %xmm4, %xmm5, %xmm4 296; AVX1-NEXT: vpsllq $32, %xmm4, %xmm4 297; AVX1-NEXT: vpmuludq %xmm2, %xmm3, %xmm2 298; AVX1-NEXT: vpaddq %xmm4, %xmm2, %xmm2 299; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm3 300; AVX1-NEXT: vpmuludq %xmm1, %xmm3, %xmm3 301; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4 302; AVX1-NEXT: vpmuludq %xmm4, %xmm0, %xmm4 303; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3 304; AVX1-NEXT: vpsllq $32, %xmm3, %xmm3 305; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 306; AVX1-NEXT: vpaddq %xmm3, %xmm0, %xmm0 307; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm1 308; AVX1-NEXT: vpmuludq %xmm2, %xmm1, %xmm1 309; AVX1-NEXT: vpsrlq $32, %xmm2, %xmm3 310; AVX1-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 311; AVX1-NEXT: vpaddq %xmm1, %xmm3, %xmm1 312; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1 313; AVX1-NEXT: vpmuludq %xmm2, %xmm0, %xmm0 314; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 315; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 316; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm2 317; AVX1-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 318; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3 319; AVX1-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 320; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 321; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2 322; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 323; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 324; AVX1-NEXT: vmovq %xmm0, %rax 325; AVX1-NEXT: vzeroupper 326; AVX1-NEXT: retq 327; 328; AVX2-LABEL: test_v8i64: 329; AVX2: # %bb.0: 330; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm2 331; AVX2-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 332; AVX2-NEXT: vpsrlq $32, %ymm1, %ymm3 333; AVX2-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 334; AVX2-NEXT: vpaddq %ymm2, %ymm3, %ymm2 335; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 336; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 337; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 338; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 339; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm2 340; AVX2-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 341; AVX2-NEXT: vpsrlq $32, %ymm1, %ymm3 342; AVX2-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 343; AVX2-NEXT: vpaddq %ymm2, %ymm3, %ymm2 344; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 345; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 346; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 347; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 348; AVX2-NEXT: vpsrldq {{.*#+}} ymm2 = ymm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,ymm0[28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 349; AVX2-NEXT: vpmuludq %ymm2, %ymm0, %ymm2 350; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm3 351; AVX2-NEXT: vpmuludq %ymm1, %ymm3, %ymm3 352; AVX2-NEXT: vpaddq %ymm3, %ymm2, %ymm2 353; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 354; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 355; AVX2-NEXT: vpaddq %xmm2, %xmm0, %xmm0 356; AVX2-NEXT: vmovq %xmm0, %rax 357; AVX2-NEXT: vzeroupper 358; AVX2-NEXT: retq 359; 360; AVX512BW-LABEL: test_v8i64: 361; AVX512BW: # %bb.0: 362; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 363; AVX512BW-NEXT: vpsrlq $32, %zmm0, %zmm2 364; AVX512BW-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 365; AVX512BW-NEXT: vpsrlq $32, %zmm1, %zmm3 366; AVX512BW-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 367; AVX512BW-NEXT: vpaddq %zmm2, %zmm3, %zmm2 368; AVX512BW-NEXT: vpsllq $32, %zmm2, %zmm2 369; AVX512BW-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 370; AVX512BW-NEXT: vpaddq %zmm2, %zmm0, %zmm0 371; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 372; AVX512BW-NEXT: vpsrlq $32, %zmm0, %zmm2 373; AVX512BW-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 374; AVX512BW-NEXT: vpsrlq $32, %zmm1, %zmm3 375; AVX512BW-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 376; AVX512BW-NEXT: vpaddq %zmm2, %zmm3, %zmm2 377; AVX512BW-NEXT: vpsllq $32, %zmm2, %zmm2 378; AVX512BW-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 379; AVX512BW-NEXT: vpaddq %zmm2, %zmm0, %zmm0 380; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 381; AVX512BW-NEXT: vpsrlq $32, %zmm0, %zmm2 382; AVX512BW-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 383; AVX512BW-NEXT: vpsrlq $32, %zmm1, %zmm3 384; AVX512BW-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 385; AVX512BW-NEXT: vpaddq %zmm2, %zmm3, %zmm2 386; AVX512BW-NEXT: vpsllq $32, %zmm2, %zmm2 387; AVX512BW-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 388; AVX512BW-NEXT: vpaddq %xmm2, %xmm0, %xmm0 389; AVX512BW-NEXT: vmovq %xmm0, %rax 390; AVX512BW-NEXT: vzeroupper 391; AVX512BW-NEXT: retq 392; 393; AVX512BWVL-LABEL: test_v8i64: 394; AVX512BWVL: # %bb.0: 395; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 396; AVX512BWVL-NEXT: vpsrlq $32, %zmm0, %zmm2 397; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 398; AVX512BWVL-NEXT: vpsrlq $32, %zmm1, %zmm3 399; AVX512BWVL-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 400; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm3, %zmm2 401; AVX512BWVL-NEXT: vpsllq $32, %zmm2, %zmm2 402; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 403; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm0, %zmm0 404; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 405; AVX512BWVL-NEXT: vpsrlq $32, %zmm0, %zmm2 406; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 407; AVX512BWVL-NEXT: vpsrlq $32, %zmm1, %zmm3 408; AVX512BWVL-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 409; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm3, %zmm2 410; AVX512BWVL-NEXT: vpsllq $32, %zmm2, %zmm2 411; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 412; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm0, %zmm0 413; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 414; AVX512BWVL-NEXT: vpsrlq $32, %zmm0, %zmm2 415; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 416; AVX512BWVL-NEXT: vpsrlq $32, %zmm1, %zmm3 417; AVX512BWVL-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 418; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm3, %zmm2 419; AVX512BWVL-NEXT: vpsllq $32, %zmm2, %zmm2 420; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 421; AVX512BWVL-NEXT: vpaddq %xmm2, %xmm0, %xmm0 422; AVX512BWVL-NEXT: vmovq %xmm0, %rax 423; AVX512BWVL-NEXT: vzeroupper 424; AVX512BWVL-NEXT: retq 425; 426; AVX512DQ-LABEL: test_v8i64: 427; AVX512DQ: # %bb.0: 428; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1 429; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 430; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 431; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 432; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 433; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 434; AVX512DQ-NEXT: vmovq %xmm0, %rax 435; AVX512DQ-NEXT: vzeroupper 436; AVX512DQ-NEXT: retq 437; 438; AVX512DQVL-LABEL: test_v8i64: 439; AVX512DQVL: # %bb.0: 440; AVX512DQVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 441; AVX512DQVL-NEXT: vpmullq %zmm1, %zmm0, %zmm0 442; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 443; AVX512DQVL-NEXT: vpmullq %zmm1, %zmm0, %zmm0 444; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 445; AVX512DQVL-NEXT: vpmullq %xmm1, %xmm0, %xmm0 446; AVX512DQVL-NEXT: vmovq %xmm0, %rax 447; AVX512DQVL-NEXT: vzeroupper 448; AVX512DQVL-NEXT: retq 449 %1 = call i64 @llvm.experimental.vector.reduce.mul.i64.v8i64(<8 x i64> %a0) 450 ret i64 %1 451} 452 453define i64 @test_v16i64(<16 x i64> %a0) { 454; SSE-LABEL: test_v16i64: 455; SSE: # %bb.0: 456; SSE-NEXT: movdqa %xmm2, %xmm8 457; SSE-NEXT: psrlq $32, %xmm8 458; SSE-NEXT: pmuludq %xmm6, %xmm8 459; SSE-NEXT: movdqa %xmm6, %xmm9 460; SSE-NEXT: psrlq $32, %xmm9 461; SSE-NEXT: pmuludq %xmm2, %xmm9 462; SSE-NEXT: paddq %xmm8, %xmm9 463; SSE-NEXT: psllq $32, %xmm9 464; SSE-NEXT: pmuludq %xmm6, %xmm2 465; SSE-NEXT: paddq %xmm9, %xmm2 466; SSE-NEXT: movdqa %xmm0, %xmm8 467; SSE-NEXT: psrlq $32, %xmm8 468; SSE-NEXT: pmuludq %xmm4, %xmm8 469; SSE-NEXT: movdqa %xmm4, %xmm6 470; SSE-NEXT: psrlq $32, %xmm6 471; SSE-NEXT: pmuludq %xmm0, %xmm6 472; SSE-NEXT: paddq %xmm8, %xmm6 473; SSE-NEXT: psllq $32, %xmm6 474; SSE-NEXT: pmuludq %xmm4, %xmm0 475; SSE-NEXT: paddq %xmm6, %xmm0 476; SSE-NEXT: movdqa %xmm3, %xmm4 477; SSE-NEXT: psrlq $32, %xmm4 478; SSE-NEXT: pmuludq %xmm7, %xmm4 479; SSE-NEXT: movdqa %xmm7, %xmm6 480; SSE-NEXT: psrlq $32, %xmm6 481; SSE-NEXT: pmuludq %xmm3, %xmm6 482; SSE-NEXT: paddq %xmm4, %xmm6 483; SSE-NEXT: psllq $32, %xmm6 484; SSE-NEXT: pmuludq %xmm7, %xmm3 485; SSE-NEXT: paddq %xmm6, %xmm3 486; SSE-NEXT: movdqa %xmm1, %xmm4 487; SSE-NEXT: psrlq $32, %xmm4 488; SSE-NEXT: pmuludq %xmm5, %xmm4 489; SSE-NEXT: movdqa %xmm5, %xmm6 490; SSE-NEXT: psrlq $32, %xmm6 491; SSE-NEXT: pmuludq %xmm1, %xmm6 492; SSE-NEXT: paddq %xmm4, %xmm6 493; SSE-NEXT: psllq $32, %xmm6 494; SSE-NEXT: pmuludq %xmm5, %xmm1 495; SSE-NEXT: paddq %xmm6, %xmm1 496; SSE-NEXT: movdqa %xmm1, %xmm4 497; SSE-NEXT: psrlq $32, %xmm4 498; SSE-NEXT: pmuludq %xmm3, %xmm4 499; SSE-NEXT: movdqa %xmm3, %xmm5 500; SSE-NEXT: psrlq $32, %xmm5 501; SSE-NEXT: pmuludq %xmm1, %xmm5 502; SSE-NEXT: paddq %xmm4, %xmm5 503; SSE-NEXT: psllq $32, %xmm5 504; SSE-NEXT: pmuludq %xmm3, %xmm1 505; SSE-NEXT: paddq %xmm5, %xmm1 506; SSE-NEXT: movdqa %xmm0, %xmm3 507; SSE-NEXT: psrlq $32, %xmm3 508; SSE-NEXT: pmuludq %xmm2, %xmm3 509; SSE-NEXT: movdqa %xmm2, %xmm4 510; SSE-NEXT: psrlq $32, %xmm4 511; SSE-NEXT: pmuludq %xmm0, %xmm4 512; SSE-NEXT: paddq %xmm3, %xmm4 513; SSE-NEXT: psllq $32, %xmm4 514; SSE-NEXT: pmuludq %xmm2, %xmm0 515; SSE-NEXT: paddq %xmm4, %xmm0 516; SSE-NEXT: movdqa %xmm0, %xmm2 517; SSE-NEXT: psrlq $32, %xmm2 518; SSE-NEXT: pmuludq %xmm1, %xmm2 519; SSE-NEXT: movdqa %xmm1, %xmm3 520; SSE-NEXT: psrlq $32, %xmm3 521; SSE-NEXT: pmuludq %xmm0, %xmm3 522; SSE-NEXT: paddq %xmm2, %xmm3 523; SSE-NEXT: psllq $32, %xmm3 524; SSE-NEXT: pmuludq %xmm1, %xmm0 525; SSE-NEXT: paddq %xmm3, %xmm0 526; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 527; SSE-NEXT: movdqa %xmm0, %xmm2 528; SSE-NEXT: psrlq $32, %xmm2 529; SSE-NEXT: pmuludq %xmm1, %xmm2 530; SSE-NEXT: movdqa %xmm0, %xmm3 531; SSE-NEXT: psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 532; SSE-NEXT: pmuludq %xmm0, %xmm3 533; SSE-NEXT: paddq %xmm2, %xmm3 534; SSE-NEXT: psllq $32, %xmm3 535; SSE-NEXT: pmuludq %xmm1, %xmm0 536; SSE-NEXT: paddq %xmm3, %xmm0 537; SSE-NEXT: movq %xmm0, %rax 538; SSE-NEXT: retq 539; 540; AVX1-LABEL: test_v16i64: 541; AVX1: # %bb.0: 542; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4 543; AVX1-NEXT: vpmuludq %xmm3, %xmm4, %xmm4 544; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5 545; AVX1-NEXT: vpmuludq %xmm5, %xmm1, %xmm5 546; AVX1-NEXT: vpaddq %xmm4, %xmm5, %xmm4 547; AVX1-NEXT: vpsllq $32, %xmm4, %xmm4 548; AVX1-NEXT: vpmuludq %xmm3, %xmm1, %xmm5 549; AVX1-NEXT: vpaddq %xmm4, %xmm5, %xmm4 550; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm5 551; AVX1-NEXT: vpmuludq %xmm2, %xmm5, %xmm5 552; AVX1-NEXT: vpsrlq $32, %xmm2, %xmm6 553; AVX1-NEXT: vpmuludq %xmm6, %xmm0, %xmm6 554; AVX1-NEXT: vpaddq %xmm5, %xmm6, %xmm5 555; AVX1-NEXT: vpsllq $32, %xmm5, %xmm5 556; AVX1-NEXT: vpmuludq %xmm2, %xmm0, %xmm6 557; AVX1-NEXT: vpaddq %xmm5, %xmm6, %xmm5 558; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 559; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 560; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm6 561; AVX1-NEXT: vpmuludq %xmm3, %xmm6, %xmm6 562; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm7 563; AVX1-NEXT: vpmuludq %xmm7, %xmm1, %xmm7 564; AVX1-NEXT: vpaddq %xmm6, %xmm7, %xmm6 565; AVX1-NEXT: vpsllq $32, %xmm6, %xmm6 566; AVX1-NEXT: vpmuludq %xmm3, %xmm1, %xmm1 567; AVX1-NEXT: vpaddq %xmm6, %xmm1, %xmm1 568; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 569; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 570; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm3 571; AVX1-NEXT: vpmuludq %xmm2, %xmm3, %xmm3 572; AVX1-NEXT: vpsrlq $32, %xmm2, %xmm6 573; AVX1-NEXT: vpmuludq %xmm6, %xmm0, %xmm6 574; AVX1-NEXT: vpaddq %xmm3, %xmm6, %xmm3 575; AVX1-NEXT: vpsllq $32, %xmm3, %xmm3 576; AVX1-NEXT: vpmuludq %xmm2, %xmm0, %xmm0 577; AVX1-NEXT: vpaddq %xmm3, %xmm0, %xmm0 578; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm2 579; AVX1-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 580; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3 581; AVX1-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 582; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 583; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2 584; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 585; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 586; AVX1-NEXT: vpsrlq $32, %xmm5, %xmm1 587; AVX1-NEXT: vpmuludq %xmm4, %xmm1, %xmm1 588; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm2 589; AVX1-NEXT: vpmuludq %xmm2, %xmm5, %xmm2 590; AVX1-NEXT: vpaddq %xmm1, %xmm2, %xmm1 591; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1 592; AVX1-NEXT: vpmuludq %xmm4, %xmm5, %xmm2 593; AVX1-NEXT: vpaddq %xmm1, %xmm2, %xmm1 594; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm2 595; AVX1-NEXT: vpmuludq %xmm0, %xmm2, %xmm2 596; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm3 597; AVX1-NEXT: vpmuludq %xmm3, %xmm1, %xmm3 598; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 599; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2 600; AVX1-NEXT: vpmuludq %xmm0, %xmm1, %xmm0 601; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 602; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 603; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm2 604; AVX1-NEXT: vpmuludq %xmm1, %xmm2, %xmm2 605; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3 606; AVX1-NEXT: vpmuludq %xmm3, %xmm0, %xmm3 607; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 608; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2 609; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 610; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 611; AVX1-NEXT: vmovq %xmm0, %rax 612; AVX1-NEXT: vzeroupper 613; AVX1-NEXT: retq 614; 615; AVX2-LABEL: test_v16i64: 616; AVX2: # %bb.0: 617; AVX2-NEXT: vpsrlq $32, %ymm1, %ymm4 618; AVX2-NEXT: vpmuludq %ymm3, %ymm4, %ymm4 619; AVX2-NEXT: vpsrlq $32, %ymm3, %ymm5 620; AVX2-NEXT: vpmuludq %ymm5, %ymm1, %ymm5 621; AVX2-NEXT: vpaddq %ymm4, %ymm5, %ymm4 622; AVX2-NEXT: vpsllq $32, %ymm4, %ymm4 623; AVX2-NEXT: vpmuludq %ymm3, %ymm1, %ymm1 624; AVX2-NEXT: vpaddq %ymm4, %ymm1, %ymm1 625; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm3 626; AVX2-NEXT: vpmuludq %ymm2, %ymm3, %ymm3 627; AVX2-NEXT: vpsrlq $32, %ymm2, %ymm4 628; AVX2-NEXT: vpmuludq %ymm4, %ymm0, %ymm4 629; AVX2-NEXT: vpaddq %ymm3, %ymm4, %ymm3 630; AVX2-NEXT: vpsllq $32, %ymm3, %ymm3 631; AVX2-NEXT: vpmuludq %ymm2, %ymm0, %ymm0 632; AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm0 633; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm2 634; AVX2-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 635; AVX2-NEXT: vpsrlq $32, %ymm1, %ymm3 636; AVX2-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 637; AVX2-NEXT: vpaddq %ymm2, %ymm3, %ymm2 638; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 639; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 640; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 641; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 642; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm2 643; AVX2-NEXT: vpmuludq %ymm1, %ymm2, %ymm2 644; AVX2-NEXT: vpsrlq $32, %ymm1, %ymm3 645; AVX2-NEXT: vpmuludq %ymm3, %ymm0, %ymm3 646; AVX2-NEXT: vpaddq %ymm2, %ymm3, %ymm2 647; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 648; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 649; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 650; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 651; AVX2-NEXT: vpsrldq {{.*#+}} ymm2 = ymm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,ymm0[28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 652; AVX2-NEXT: vpmuludq %ymm2, %ymm0, %ymm2 653; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm3 654; AVX2-NEXT: vpmuludq %ymm1, %ymm3, %ymm3 655; AVX2-NEXT: vpaddq %ymm3, %ymm2, %ymm2 656; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 657; AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0 658; AVX2-NEXT: vpaddq %xmm2, %xmm0, %xmm0 659; AVX2-NEXT: vmovq %xmm0, %rax 660; AVX2-NEXT: vzeroupper 661; AVX2-NEXT: retq 662; 663; AVX512BW-LABEL: test_v16i64: 664; AVX512BW: # %bb.0: 665; AVX512BW-NEXT: vpsrlq $32, %zmm0, %zmm2 666; AVX512BW-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 667; AVX512BW-NEXT: vpsrlq $32, %zmm1, %zmm3 668; AVX512BW-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 669; AVX512BW-NEXT: vpaddq %zmm2, %zmm3, %zmm2 670; AVX512BW-NEXT: vpsllq $32, %zmm2, %zmm2 671; AVX512BW-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 672; AVX512BW-NEXT: vpaddq %zmm2, %zmm0, %zmm0 673; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 674; AVX512BW-NEXT: vpsrlq $32, %zmm0, %zmm2 675; AVX512BW-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 676; AVX512BW-NEXT: vpsrlq $32, %zmm1, %zmm3 677; AVX512BW-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 678; AVX512BW-NEXT: vpaddq %zmm2, %zmm3, %zmm2 679; AVX512BW-NEXT: vpsllq $32, %zmm2, %zmm2 680; AVX512BW-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 681; AVX512BW-NEXT: vpaddq %zmm2, %zmm0, %zmm0 682; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 683; AVX512BW-NEXT: vpsrlq $32, %zmm0, %zmm2 684; AVX512BW-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 685; AVX512BW-NEXT: vpsrlq $32, %zmm1, %zmm3 686; AVX512BW-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 687; AVX512BW-NEXT: vpaddq %zmm2, %zmm3, %zmm2 688; AVX512BW-NEXT: vpsllq $32, %zmm2, %zmm2 689; AVX512BW-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 690; AVX512BW-NEXT: vpaddq %zmm2, %zmm0, %zmm0 691; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 692; AVX512BW-NEXT: vpsrlq $32, %zmm0, %zmm2 693; AVX512BW-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 694; AVX512BW-NEXT: vpsrlq $32, %zmm1, %zmm3 695; AVX512BW-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 696; AVX512BW-NEXT: vpaddq %zmm2, %zmm3, %zmm2 697; AVX512BW-NEXT: vpsllq $32, %zmm2, %zmm2 698; AVX512BW-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 699; AVX512BW-NEXT: vpaddq %xmm2, %xmm0, %xmm0 700; AVX512BW-NEXT: vmovq %xmm0, %rax 701; AVX512BW-NEXT: vzeroupper 702; AVX512BW-NEXT: retq 703; 704; AVX512BWVL-LABEL: test_v16i64: 705; AVX512BWVL: # %bb.0: 706; AVX512BWVL-NEXT: vpsrlq $32, %zmm0, %zmm2 707; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 708; AVX512BWVL-NEXT: vpsrlq $32, %zmm1, %zmm3 709; AVX512BWVL-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 710; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm3, %zmm2 711; AVX512BWVL-NEXT: vpsllq $32, %zmm2, %zmm2 712; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 713; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm0, %zmm0 714; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 715; AVX512BWVL-NEXT: vpsrlq $32, %zmm0, %zmm2 716; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 717; AVX512BWVL-NEXT: vpsrlq $32, %zmm1, %zmm3 718; AVX512BWVL-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 719; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm3, %zmm2 720; AVX512BWVL-NEXT: vpsllq $32, %zmm2, %zmm2 721; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 722; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm0, %zmm0 723; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 724; AVX512BWVL-NEXT: vpsrlq $32, %zmm0, %zmm2 725; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 726; AVX512BWVL-NEXT: vpsrlq $32, %zmm1, %zmm3 727; AVX512BWVL-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 728; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm3, %zmm2 729; AVX512BWVL-NEXT: vpsllq $32, %zmm2, %zmm2 730; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 731; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm0, %zmm0 732; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 733; AVX512BWVL-NEXT: vpsrlq $32, %zmm0, %zmm2 734; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm2, %zmm2 735; AVX512BWVL-NEXT: vpsrlq $32, %zmm1, %zmm3 736; AVX512BWVL-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 737; AVX512BWVL-NEXT: vpaddq %zmm2, %zmm3, %zmm2 738; AVX512BWVL-NEXT: vpsllq $32, %zmm2, %zmm2 739; AVX512BWVL-NEXT: vpmuludq %zmm1, %zmm0, %zmm0 740; AVX512BWVL-NEXT: vpaddq %xmm2, %xmm0, %xmm0 741; AVX512BWVL-NEXT: vmovq %xmm0, %rax 742; AVX512BWVL-NEXT: vzeroupper 743; AVX512BWVL-NEXT: retq 744; 745; AVX512DQ-LABEL: test_v16i64: 746; AVX512DQ: # %bb.0: 747; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 748; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1 749; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 750; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 751; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 752; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 753; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 754; AVX512DQ-NEXT: vmovq %xmm0, %rax 755; AVX512DQ-NEXT: vzeroupper 756; AVX512DQ-NEXT: retq 757; 758; AVX512DQVL-LABEL: test_v16i64: 759; AVX512DQVL: # %bb.0: 760; AVX512DQVL-NEXT: vpmullq %zmm1, %zmm0, %zmm0 761; AVX512DQVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 762; AVX512DQVL-NEXT: vpmullq %zmm1, %zmm0, %zmm0 763; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 764; AVX512DQVL-NEXT: vpmullq %zmm1, %zmm0, %zmm0 765; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 766; AVX512DQVL-NEXT: vpmullq %xmm1, %xmm0, %xmm0 767; AVX512DQVL-NEXT: vmovq %xmm0, %rax 768; AVX512DQVL-NEXT: vzeroupper 769; AVX512DQVL-NEXT: retq 770 %1 = call i64 @llvm.experimental.vector.reduce.mul.i64.v16i64(<16 x i64> %a0) 771 ret i64 %1 772} 773 774; 775; vXi32 776; 777 778define i32 @test_v2i32(<2 x i32> %a0) { 779; SSE-LABEL: test_v2i32: 780; SSE: # %bb.0: 781; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 782; SSE-NEXT: pmuludq %xmm0, %xmm1 783; SSE-NEXT: movd %xmm1, %eax 784; SSE-NEXT: retq 785; 786; AVX-LABEL: test_v2i32: 787; AVX: # %bb.0: 788; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 789; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 790; AVX-NEXT: vmovd %xmm0, %eax 791; AVX-NEXT: retq 792; 793; AVX512BW-LABEL: test_v2i32: 794; AVX512BW: # %bb.0: 795; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 796; AVX512BW-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 797; AVX512BW-NEXT: vmovd %xmm0, %eax 798; AVX512BW-NEXT: retq 799; 800; AVX512BWVL-LABEL: test_v2i32: 801; AVX512BWVL: # %bb.0: 802; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 803; AVX512BWVL-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 804; AVX512BWVL-NEXT: vmovd %xmm0, %eax 805; AVX512BWVL-NEXT: retq 806; 807; AVX512DQ-LABEL: test_v2i32: 808; AVX512DQ: # %bb.0: 809; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 810; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 811; AVX512DQ-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 812; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 813; AVX512DQ-NEXT: vmovd %xmm0, %eax 814; AVX512DQ-NEXT: vzeroupper 815; AVX512DQ-NEXT: retq 816; 817; AVX512DQVL-LABEL: test_v2i32: 818; AVX512DQVL: # %bb.0: 819; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 820; AVX512DQVL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 821; AVX512DQVL-NEXT: vpmullq %xmm1, %xmm0, %xmm0 822; AVX512DQVL-NEXT: vmovd %xmm0, %eax 823; AVX512DQVL-NEXT: retq 824 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v2i32(<2 x i32> %a0) 825 ret i32 %1 826} 827 828define i32 @test_v4i32(<4 x i32> %a0) { 829; SSE2-LABEL: test_v4i32: 830; SSE2: # %bb.0: 831; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 832; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1] 833; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 834; SSE2-NEXT: pmuludq %xmm2, %xmm3 835; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 836; SSE2-NEXT: pmuludq %xmm0, %xmm1 837; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 838; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 839; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 840; SSE2-NEXT: pmuludq %xmm0, %xmm1 841; SSE2-NEXT: movd %xmm1, %eax 842; SSE2-NEXT: retq 843; 844; SSE41-LABEL: test_v4i32: 845; SSE41: # %bb.0: 846; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 847; SSE41-NEXT: pmulld %xmm0, %xmm1 848; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 849; SSE41-NEXT: pmulld %xmm1, %xmm0 850; SSE41-NEXT: movd %xmm0, %eax 851; SSE41-NEXT: retq 852; 853; AVX-LABEL: test_v4i32: 854; AVX: # %bb.0: 855; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 856; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 857; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 858; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 859; AVX-NEXT: vmovd %xmm0, %eax 860; AVX-NEXT: retq 861; 862; AVX512-LABEL: test_v4i32: 863; AVX512: # %bb.0: 864; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 865; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 866; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 867; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 868; AVX512-NEXT: vmovd %xmm0, %eax 869; AVX512-NEXT: retq 870 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v4i32(<4 x i32> %a0) 871 ret i32 %1 872} 873 874define i32 @test_v8i32(<8 x i32> %a0) { 875; SSE2-LABEL: test_v8i32: 876; SSE2: # %bb.0: 877; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 878; SSE2-NEXT: pmuludq %xmm1, %xmm0 879; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 880; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 881; SSE2-NEXT: pmuludq %xmm2, %xmm1 882; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3] 883; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 884; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 885; SSE2-NEXT: pmuludq %xmm0, %xmm2 886; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 887; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,0,0] 888; SSE2-NEXT: pmuludq %xmm1, %xmm2 889; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 890; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 891; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 892; SSE2-NEXT: pmuludq %xmm0, %xmm1 893; SSE2-NEXT: movd %xmm1, %eax 894; SSE2-NEXT: retq 895; 896; SSE41-LABEL: test_v8i32: 897; SSE41: # %bb.0: 898; SSE41-NEXT: pmulld %xmm1, %xmm0 899; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 900; SSE41-NEXT: pmulld %xmm0, %xmm1 901; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 902; SSE41-NEXT: pmulld %xmm1, %xmm0 903; SSE41-NEXT: movd %xmm0, %eax 904; SSE41-NEXT: retq 905; 906; AVX1-LABEL: test_v8i32: 907; AVX1: # %bb.0: 908; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 909; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 910; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 911; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 912; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 913; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 914; AVX1-NEXT: vmovd %xmm0, %eax 915; AVX1-NEXT: vzeroupper 916; AVX1-NEXT: retq 917; 918; AVX2-LABEL: test_v8i32: 919; AVX2: # %bb.0: 920; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 921; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 922; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 923; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 924; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 925; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0 926; AVX2-NEXT: vmovd %xmm0, %eax 927; AVX2-NEXT: vzeroupper 928; AVX2-NEXT: retq 929; 930; AVX512-LABEL: test_v8i32: 931; AVX512: # %bb.0: 932; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 933; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm0 934; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 935; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm0 936; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 937; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 938; AVX512-NEXT: vmovd %xmm0, %eax 939; AVX512-NEXT: vzeroupper 940; AVX512-NEXT: retq 941 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v8i32(<8 x i32> %a0) 942 ret i32 %1 943} 944 945define i32 @test_v16i32(<16 x i32> %a0) { 946; SSE2-LABEL: test_v16i32: 947; SSE2: # %bb.0: 948; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 949; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 950; SSE2-NEXT: pmuludq %xmm4, %xmm5 951; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 952; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 953; SSE2-NEXT: pmuludq %xmm4, %xmm6 954; SSE2-NEXT: pmuludq %xmm5, %xmm6 955; SSE2-NEXT: pmuludq %xmm3, %xmm1 956; SSE2-NEXT: pmuludq %xmm2, %xmm0 957; SSE2-NEXT: pmuludq %xmm1, %xmm0 958; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 959; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3] 960; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 961; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 962; SSE2-NEXT: pmuludq %xmm0, %xmm1 963; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 964; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[2,2,0,0] 965; SSE2-NEXT: pmuludq %xmm6, %xmm1 966; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 967; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 968; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 969; SSE2-NEXT: pmuludq %xmm0, %xmm1 970; SSE2-NEXT: movd %xmm1, %eax 971; SSE2-NEXT: retq 972; 973; SSE41-LABEL: test_v16i32: 974; SSE41: # %bb.0: 975; SSE41-NEXT: pmulld %xmm3, %xmm1 976; SSE41-NEXT: pmulld %xmm2, %xmm0 977; SSE41-NEXT: pmulld %xmm1, %xmm0 978; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 979; SSE41-NEXT: pmulld %xmm0, %xmm1 980; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 981; SSE41-NEXT: pmulld %xmm1, %xmm0 982; SSE41-NEXT: movd %xmm0, %eax 983; SSE41-NEXT: retq 984; 985; AVX1-LABEL: test_v16i32: 986; AVX1: # %bb.0: 987; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 988; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 989; AVX1-NEXT: vpmulld %xmm2, %xmm3, %xmm2 990; AVX1-NEXT: vpmulld %xmm2, %xmm1, %xmm1 991; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 992; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 993; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 994; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 995; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 996; AVX1-NEXT: vmovd %xmm0, %eax 997; AVX1-NEXT: vzeroupper 998; AVX1-NEXT: retq 999; 1000; AVX2-LABEL: test_v16i32: 1001; AVX2: # %bb.0: 1002; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1003; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1004; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1005; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1006; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1007; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1008; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1009; AVX2-NEXT: vmovd %xmm0, %eax 1010; AVX2-NEXT: vzeroupper 1011; AVX2-NEXT: retq 1012; 1013; AVX512-LABEL: test_v16i32: 1014; AVX512: # %bb.0: 1015; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1016; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1017; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1018; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1019; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1020; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1021; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1022; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1023; AVX512-NEXT: vmovd %xmm0, %eax 1024; AVX512-NEXT: vzeroupper 1025; AVX512-NEXT: retq 1026 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v16i32(<16 x i32> %a0) 1027 ret i32 %1 1028} 1029 1030define i32 @test_v32i32(<32 x i32> %a0) { 1031; SSE2-LABEL: test_v32i32: 1032; SSE2: # %bb.0: 1033; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[1,1,3,3] 1034; SSE2-NEXT: pmuludq %xmm6, %xmm2 1035; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3] 1036; SSE2-NEXT: pmuludq %xmm4, %xmm0 1037; SSE2-NEXT: pmuludq %xmm2, %xmm0 1038; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 1039; SSE2-NEXT: pmuludq %xmm7, %xmm3 1040; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3] 1041; SSE2-NEXT: pmuludq %xmm5, %xmm1 1042; SSE2-NEXT: pmuludq %xmm3, %xmm1 1043; SSE2-NEXT: pmuludq %xmm0, %xmm1 1044; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1045; SSE2-NEXT: pmuludq %xmm8, %xmm0 1046; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1047; SSE2-NEXT: pmuludq %xmm9, %xmm3 1048; SSE2-NEXT: pmuludq %xmm0, %xmm3 1049; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] 1050; SSE2-NEXT: pmuludq %xmm2, %xmm0 1051; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1052; SSE2-NEXT: pmuludq %xmm10, %xmm2 1053; SSE2-NEXT: pmuludq %xmm0, %xmm2 1054; SSE2-NEXT: pmuludq %xmm3, %xmm2 1055; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1056; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 1057; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1058; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1059; SSE2-NEXT: pmuludq %xmm0, %xmm1 1060; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1061; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,2,0,0] 1062; SSE2-NEXT: pmuludq %xmm2, %xmm1 1063; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1064; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1065; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1066; SSE2-NEXT: pmuludq %xmm0, %xmm1 1067; SSE2-NEXT: movd %xmm1, %eax 1068; SSE2-NEXT: retq 1069; 1070; SSE41-LABEL: test_v32i32: 1071; SSE41: # %bb.0: 1072; SSE41-NEXT: pmulld %xmm6, %xmm2 1073; SSE41-NEXT: pmulld %xmm4, %xmm0 1074; SSE41-NEXT: pmulld %xmm2, %xmm0 1075; SSE41-NEXT: pmulld %xmm7, %xmm3 1076; SSE41-NEXT: pmulld %xmm5, %xmm1 1077; SSE41-NEXT: pmulld %xmm3, %xmm1 1078; SSE41-NEXT: pmulld %xmm0, %xmm1 1079; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 1080; SSE41-NEXT: pmulld %xmm1, %xmm0 1081; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1082; SSE41-NEXT: pmulld %xmm0, %xmm1 1083; SSE41-NEXT: movd %xmm1, %eax 1084; SSE41-NEXT: retq 1085; 1086; AVX1-LABEL: test_v32i32: 1087; AVX1: # %bb.0: 1088; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm4 1089; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1090; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1091; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm1 1092; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 1093; AVX1-NEXT: vpmulld %xmm1, %xmm3, %xmm1 1094; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1095; AVX1-NEXT: vpmulld %xmm1, %xmm3, %xmm1 1096; AVX1-NEXT: vpmulld %xmm4, %xmm2, %xmm2 1097; AVX1-NEXT: vpmulld %xmm1, %xmm2, %xmm1 1098; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1099; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1100; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1101; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1102; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1103; AVX1-NEXT: vmovd %xmm0, %eax 1104; AVX1-NEXT: vzeroupper 1105; AVX1-NEXT: retq 1106; 1107; AVX2-LABEL: test_v32i32: 1108; AVX2: # %bb.0: 1109; AVX2-NEXT: vpmulld %ymm3, %ymm1, %ymm1 1110; AVX2-NEXT: vpmulld %ymm1, %ymm2, %ymm1 1111; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1112; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1113; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1114; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1115; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1116; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1117; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1118; AVX2-NEXT: vmovd %xmm0, %eax 1119; AVX2-NEXT: vzeroupper 1120; AVX2-NEXT: retq 1121; 1122; AVX512-LABEL: test_v32i32: 1123; AVX512: # %bb.0: 1124; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1125; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1126; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1127; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1128; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1129; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1130; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1131; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1132; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1133; AVX512-NEXT: vmovd %xmm0, %eax 1134; AVX512-NEXT: vzeroupper 1135; AVX512-NEXT: retq 1136 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v32i32(<32 x i32> %a0) 1137 ret i32 %1 1138} 1139 1140; 1141; vXi16 1142; 1143 1144define i16 @test_v2i16(<2 x i16> %a0) { 1145; SSE-LABEL: test_v2i16: 1146; SSE: # %bb.0: 1147; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1148; SSE-NEXT: pmuludq %xmm0, %xmm1 1149; SSE-NEXT: movd %xmm1, %eax 1150; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1151; SSE-NEXT: retq 1152; 1153; AVX-LABEL: test_v2i16: 1154; AVX: # %bb.0: 1155; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1156; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1157; AVX-NEXT: vmovd %xmm0, %eax 1158; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1159; AVX-NEXT: retq 1160; 1161; AVX512BW-LABEL: test_v2i16: 1162; AVX512BW: # %bb.0: 1163; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1164; AVX512BW-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1165; AVX512BW-NEXT: vmovd %xmm0, %eax 1166; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 1167; AVX512BW-NEXT: retq 1168; 1169; AVX512BWVL-LABEL: test_v2i16: 1170; AVX512BWVL: # %bb.0: 1171; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1172; AVX512BWVL-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1173; AVX512BWVL-NEXT: vmovd %xmm0, %eax 1174; AVX512BWVL-NEXT: # kill: def $ax killed $ax killed $eax 1175; AVX512BWVL-NEXT: retq 1176; 1177; AVX512DQ-LABEL: test_v2i16: 1178; AVX512DQ: # %bb.0: 1179; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1180; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1181; AVX512DQ-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 1182; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 1183; AVX512DQ-NEXT: vmovd %xmm0, %eax 1184; AVX512DQ-NEXT: # kill: def $ax killed $ax killed $eax 1185; AVX512DQ-NEXT: vzeroupper 1186; AVX512DQ-NEXT: retq 1187; 1188; AVX512DQVL-LABEL: test_v2i16: 1189; AVX512DQVL: # %bb.0: 1190; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1191; AVX512DQVL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 1192; AVX512DQVL-NEXT: vpmullq %xmm1, %xmm0, %xmm0 1193; AVX512DQVL-NEXT: vmovd %xmm0, %eax 1194; AVX512DQVL-NEXT: # kill: def $ax killed $ax killed $eax 1195; AVX512DQVL-NEXT: retq 1196 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v2i16(<2 x i16> %a0) 1197 ret i16 %1 1198} 1199 1200define i16 @test_v4i16(<4 x i16> %a0) { 1201; SSE2-LABEL: test_v4i16: 1202; SSE2: # %bb.0: 1203; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1204; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1] 1205; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 1206; SSE2-NEXT: pmuludq %xmm2, %xmm3 1207; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 1208; SSE2-NEXT: pmuludq %xmm0, %xmm1 1209; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1210; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1211; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1212; SSE2-NEXT: pmuludq %xmm0, %xmm1 1213; SSE2-NEXT: movd %xmm1, %eax 1214; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1215; SSE2-NEXT: retq 1216; 1217; SSE41-LABEL: test_v4i16: 1218; SSE41: # %bb.0: 1219; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1220; SSE41-NEXT: pmulld %xmm0, %xmm1 1221; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1222; SSE41-NEXT: pmulld %xmm1, %xmm0 1223; SSE41-NEXT: movd %xmm0, %eax 1224; SSE41-NEXT: # kill: def $ax killed $ax killed $eax 1225; SSE41-NEXT: retq 1226; 1227; AVX-LABEL: test_v4i16: 1228; AVX: # %bb.0: 1229; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1230; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1231; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1232; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1233; AVX-NEXT: vmovd %xmm0, %eax 1234; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1235; AVX-NEXT: retq 1236; 1237; AVX512-LABEL: test_v4i16: 1238; AVX512: # %bb.0: 1239; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1240; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1241; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1242; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1243; AVX512-NEXT: vmovd %xmm0, %eax 1244; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1245; AVX512-NEXT: retq 1246 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v4i16(<4 x i16> %a0) 1247 ret i16 %1 1248} 1249 1250define i16 @test_v8i16(<8 x i16> %a0) { 1251; SSE-LABEL: test_v8i16: 1252; SSE: # %bb.0: 1253; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1254; SSE-NEXT: pmullw %xmm0, %xmm1 1255; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1256; SSE-NEXT: pmullw %xmm1, %xmm0 1257; SSE-NEXT: movdqa %xmm0, %xmm1 1258; SSE-NEXT: psrld $16, %xmm1 1259; SSE-NEXT: pmullw %xmm0, %xmm1 1260; SSE-NEXT: movd %xmm1, %eax 1261; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1262; SSE-NEXT: retq 1263; 1264; AVX-LABEL: test_v8i16: 1265; AVX: # %bb.0: 1266; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1267; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1268; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1269; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1270; AVX-NEXT: vpsrld $16, %xmm0, %xmm1 1271; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1272; AVX-NEXT: vmovd %xmm0, %eax 1273; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1274; AVX-NEXT: retq 1275; 1276; AVX512-LABEL: test_v8i16: 1277; AVX512: # %bb.0: 1278; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1279; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1280; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1281; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1282; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1283; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1284; AVX512-NEXT: vmovd %xmm0, %eax 1285; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1286; AVX512-NEXT: retq 1287 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v8i16(<8 x i16> %a0) 1288 ret i16 %1 1289} 1290 1291define i16 @test_v16i16(<16 x i16> %a0) { 1292; SSE-LABEL: test_v16i16: 1293; SSE: # %bb.0: 1294; SSE-NEXT: pmullw %xmm1, %xmm0 1295; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1296; SSE-NEXT: pmullw %xmm0, %xmm1 1297; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1298; SSE-NEXT: pmullw %xmm1, %xmm0 1299; SSE-NEXT: movdqa %xmm0, %xmm1 1300; SSE-NEXT: psrld $16, %xmm1 1301; SSE-NEXT: pmullw %xmm0, %xmm1 1302; SSE-NEXT: movd %xmm1, %eax 1303; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1304; SSE-NEXT: retq 1305; 1306; AVX1-LABEL: test_v16i16: 1307; AVX1: # %bb.0: 1308; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1309; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1310; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1311; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1312; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1313; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1314; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1 1315; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1316; AVX1-NEXT: vmovd %xmm0, %eax 1317; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1318; AVX1-NEXT: vzeroupper 1319; AVX1-NEXT: retq 1320; 1321; AVX2-LABEL: test_v16i16: 1322; AVX2: # %bb.0: 1323; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1324; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1325; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1326; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1327; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1328; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1329; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1 1330; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1331; AVX2-NEXT: vmovd %xmm0, %eax 1332; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1333; AVX2-NEXT: vzeroupper 1334; AVX2-NEXT: retq 1335; 1336; AVX512-LABEL: test_v16i16: 1337; AVX512: # %bb.0: 1338; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1339; AVX512-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1340; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1341; AVX512-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1342; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1343; AVX512-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1344; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1345; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1346; AVX512-NEXT: vmovd %xmm0, %eax 1347; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1348; AVX512-NEXT: vzeroupper 1349; AVX512-NEXT: retq 1350 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v16i16(<16 x i16> %a0) 1351 ret i16 %1 1352} 1353 1354define i16 @test_v32i16(<32 x i16> %a0) { 1355; SSE-LABEL: test_v32i16: 1356; SSE: # %bb.0: 1357; SSE-NEXT: pmullw %xmm3, %xmm1 1358; SSE-NEXT: pmullw %xmm2, %xmm0 1359; SSE-NEXT: pmullw %xmm1, %xmm0 1360; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1361; SSE-NEXT: pmullw %xmm0, %xmm1 1362; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1363; SSE-NEXT: pmullw %xmm1, %xmm0 1364; SSE-NEXT: movdqa %xmm0, %xmm1 1365; SSE-NEXT: psrld $16, %xmm1 1366; SSE-NEXT: pmullw %xmm0, %xmm1 1367; SSE-NEXT: movd %xmm1, %eax 1368; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1369; SSE-NEXT: retq 1370; 1371; AVX1-LABEL: test_v32i16: 1372; AVX1: # %bb.0: 1373; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1374; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1375; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 1376; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm1 1377; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1378; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1379; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1380; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1381; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1382; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1 1383; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1384; AVX1-NEXT: vmovd %xmm0, %eax 1385; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1386; AVX1-NEXT: vzeroupper 1387; AVX1-NEXT: retq 1388; 1389; AVX2-LABEL: test_v32i16: 1390; AVX2: # %bb.0: 1391; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1392; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1393; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1394; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1395; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1396; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1397; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1398; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1 1399; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1400; AVX2-NEXT: vmovd %xmm0, %eax 1401; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1402; AVX2-NEXT: vzeroupper 1403; AVX2-NEXT: retq 1404; 1405; AVX512BW-LABEL: test_v32i16: 1406; AVX512BW: # %bb.0: 1407; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1408; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1409; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 1410; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1411; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1412; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1413; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1414; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1415; AVX512BW-NEXT: vpsrld $16, %xmm0, %xmm1 1416; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1417; AVX512BW-NEXT: vmovd %xmm0, %eax 1418; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 1419; AVX512BW-NEXT: vzeroupper 1420; AVX512BW-NEXT: retq 1421; 1422; AVX512BWVL-LABEL: test_v32i16: 1423; AVX512BWVL: # %bb.0: 1424; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1425; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1426; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 1427; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1428; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1429; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1430; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1431; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1432; AVX512BWVL-NEXT: vpsrld $16, %xmm0, %xmm1 1433; AVX512BWVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1434; AVX512BWVL-NEXT: vmovd %xmm0, %eax 1435; AVX512BWVL-NEXT: # kill: def $ax killed $ax killed $eax 1436; AVX512BWVL-NEXT: vzeroupper 1437; AVX512BWVL-NEXT: retq 1438; 1439; AVX512DQ-LABEL: test_v32i16: 1440; AVX512DQ: # %bb.0: 1441; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1442; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 1443; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1444; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1445; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1446; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1447; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1448; AVX512DQ-NEXT: vpsrld $16, %xmm0, %xmm1 1449; AVX512DQ-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1450; AVX512DQ-NEXT: vmovd %xmm0, %eax 1451; AVX512DQ-NEXT: # kill: def $ax killed $ax killed $eax 1452; AVX512DQ-NEXT: vzeroupper 1453; AVX512DQ-NEXT: retq 1454; 1455; AVX512DQVL-LABEL: test_v32i16: 1456; AVX512DQVL: # %bb.0: 1457; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1458; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 1459; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1460; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1461; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1462; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1463; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1464; AVX512DQVL-NEXT: vpsrld $16, %xmm0, %xmm1 1465; AVX512DQVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1466; AVX512DQVL-NEXT: vmovd %xmm0, %eax 1467; AVX512DQVL-NEXT: # kill: def $ax killed $ax killed $eax 1468; AVX512DQVL-NEXT: vzeroupper 1469; AVX512DQVL-NEXT: retq 1470 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v32i16(<32 x i16> %a0) 1471 ret i16 %1 1472} 1473 1474define i16 @test_v64i16(<64 x i16> %a0) { 1475; SSE-LABEL: test_v64i16: 1476; SSE: # %bb.0: 1477; SSE-NEXT: pmullw %xmm6, %xmm2 1478; SSE-NEXT: pmullw %xmm4, %xmm0 1479; SSE-NEXT: pmullw %xmm2, %xmm0 1480; SSE-NEXT: pmullw %xmm7, %xmm3 1481; SSE-NEXT: pmullw %xmm5, %xmm1 1482; SSE-NEXT: pmullw %xmm3, %xmm1 1483; SSE-NEXT: pmullw %xmm0, %xmm1 1484; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 1485; SSE-NEXT: pmullw %xmm1, %xmm0 1486; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1487; SSE-NEXT: pmullw %xmm0, %xmm1 1488; SSE-NEXT: movdqa %xmm1, %xmm0 1489; SSE-NEXT: psrld $16, %xmm0 1490; SSE-NEXT: pmullw %xmm1, %xmm0 1491; SSE-NEXT: movd %xmm0, %eax 1492; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1493; SSE-NEXT: retq 1494; 1495; AVX1-LABEL: test_v64i16: 1496; AVX1: # %bb.0: 1497; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm4 1498; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1499; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1500; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1 1501; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 1502; AVX1-NEXT: vpmullw %xmm1, %xmm3, %xmm1 1503; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1504; AVX1-NEXT: vpmullw %xmm1, %xmm3, %xmm1 1505; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm2 1506; AVX1-NEXT: vpmullw %xmm1, %xmm2, %xmm1 1507; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1508; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1509; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1510; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1511; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1512; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1 1513; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1514; AVX1-NEXT: vmovd %xmm0, %eax 1515; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1516; AVX1-NEXT: vzeroupper 1517; AVX1-NEXT: retq 1518; 1519; AVX2-LABEL: test_v64i16: 1520; AVX2: # %bb.0: 1521; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm1 1522; AVX2-NEXT: vpmullw %ymm1, %ymm2, %ymm1 1523; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1524; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1525; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1526; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1527; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1528; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1529; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1530; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1 1531; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1532; AVX2-NEXT: vmovd %xmm0, %eax 1533; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1534; AVX2-NEXT: vzeroupper 1535; AVX2-NEXT: retq 1536; 1537; AVX512BW-LABEL: test_v64i16: 1538; AVX512BW: # %bb.0: 1539; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1540; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1541; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1542; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 1543; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1544; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1545; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1546; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1547; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1548; AVX512BW-NEXT: vpsrld $16, %xmm0, %xmm1 1549; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1550; AVX512BW-NEXT: vmovd %xmm0, %eax 1551; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 1552; AVX512BW-NEXT: vzeroupper 1553; AVX512BW-NEXT: retq 1554; 1555; AVX512BWVL-LABEL: test_v64i16: 1556; AVX512BWVL: # %bb.0: 1557; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1558; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1559; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1560; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 1561; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1562; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1563; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1564; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1565; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1566; AVX512BWVL-NEXT: vpsrld $16, %xmm0, %xmm1 1567; AVX512BWVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1568; AVX512BWVL-NEXT: vmovd %xmm0, %eax 1569; AVX512BWVL-NEXT: # kill: def $ax killed $ax killed $eax 1570; AVX512BWVL-NEXT: vzeroupper 1571; AVX512BWVL-NEXT: retq 1572; 1573; AVX512DQ-LABEL: test_v64i16: 1574; AVX512DQ: # %bb.0: 1575; AVX512DQ-NEXT: vpmullw %ymm3, %ymm1, %ymm1 1576; AVX512DQ-NEXT: vpmullw %ymm1, %ymm2, %ymm1 1577; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1578; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 1579; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1580; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1581; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1582; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1583; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1584; AVX512DQ-NEXT: vpsrld $16, %xmm0, %xmm1 1585; AVX512DQ-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1586; AVX512DQ-NEXT: vmovd %xmm0, %eax 1587; AVX512DQ-NEXT: # kill: def $ax killed $ax killed $eax 1588; AVX512DQ-NEXT: vzeroupper 1589; AVX512DQ-NEXT: retq 1590; 1591; AVX512DQVL-LABEL: test_v64i16: 1592; AVX512DQVL: # %bb.0: 1593; AVX512DQVL-NEXT: vpmullw %ymm3, %ymm1, %ymm1 1594; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm2, %ymm1 1595; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1596; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 1597; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1598; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1599; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1600; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1601; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1602; AVX512DQVL-NEXT: vpsrld $16, %xmm0, %xmm1 1603; AVX512DQVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1604; AVX512DQVL-NEXT: vmovd %xmm0, %eax 1605; AVX512DQVL-NEXT: # kill: def $ax killed $ax killed $eax 1606; AVX512DQVL-NEXT: vzeroupper 1607; AVX512DQVL-NEXT: retq 1608 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v64i16(<64 x i16> %a0) 1609 ret i16 %1 1610} 1611 1612; 1613; vXi8 1614; 1615 1616define i8 @test_v2i8(<2 x i8> %a0) { 1617; SSE2-LABEL: test_v2i8: 1618; SSE2: # %bb.0: 1619; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1620; SSE2-NEXT: pmuludq %xmm0, %xmm1 1621; SSE2-NEXT: movd %xmm1, %eax 1622; SSE2-NEXT: # kill: def $al killed $al killed $eax 1623; SSE2-NEXT: retq 1624; 1625; SSE41-LABEL: test_v2i8: 1626; SSE41: # %bb.0: 1627; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1628; SSE41-NEXT: pmuludq %xmm0, %xmm1 1629; SSE41-NEXT: pextrb $0, %xmm1, %eax 1630; SSE41-NEXT: # kill: def $al killed $al killed $eax 1631; SSE41-NEXT: retq 1632; 1633; AVX-LABEL: test_v2i8: 1634; AVX: # %bb.0: 1635; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1636; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1637; AVX-NEXT: vpextrb $0, %xmm0, %eax 1638; AVX-NEXT: # kill: def $al killed $al killed $eax 1639; AVX-NEXT: retq 1640; 1641; AVX512BW-LABEL: test_v2i8: 1642; AVX512BW: # %bb.0: 1643; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1644; AVX512BW-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1645; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 1646; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 1647; AVX512BW-NEXT: retq 1648; 1649; AVX512BWVL-LABEL: test_v2i8: 1650; AVX512BWVL: # %bb.0: 1651; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1652; AVX512BWVL-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1653; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 1654; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 1655; AVX512BWVL-NEXT: retq 1656; 1657; AVX512DQ-LABEL: test_v2i8: 1658; AVX512DQ: # %bb.0: 1659; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1660; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1661; AVX512DQ-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 1662; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 1663; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 1664; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 1665; AVX512DQ-NEXT: vzeroupper 1666; AVX512DQ-NEXT: retq 1667; 1668; AVX512DQVL-LABEL: test_v2i8: 1669; AVX512DQVL: # %bb.0: 1670; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1671; AVX512DQVL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 1672; AVX512DQVL-NEXT: vpmullq %xmm1, %xmm0, %xmm0 1673; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 1674; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 1675; AVX512DQVL-NEXT: retq 1676 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v2i8(<2 x i8> %a0) 1677 ret i8 %1 1678} 1679 1680define i8 @test_v4i8(<4 x i8> %a0) { 1681; SSE2-LABEL: test_v4i8: 1682; SSE2: # %bb.0: 1683; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1684; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1] 1685; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 1686; SSE2-NEXT: pmuludq %xmm2, %xmm3 1687; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 1688; SSE2-NEXT: pmuludq %xmm0, %xmm1 1689; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1690; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1691; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1692; SSE2-NEXT: pmuludq %xmm0, %xmm1 1693; SSE2-NEXT: movd %xmm1, %eax 1694; SSE2-NEXT: # kill: def $al killed $al killed $eax 1695; SSE2-NEXT: retq 1696; 1697; SSE41-LABEL: test_v4i8: 1698; SSE41: # %bb.0: 1699; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1700; SSE41-NEXT: pmulld %xmm0, %xmm1 1701; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1702; SSE41-NEXT: pmulld %xmm1, %xmm0 1703; SSE41-NEXT: pextrb $0, %xmm0, %eax 1704; SSE41-NEXT: # kill: def $al killed $al killed $eax 1705; SSE41-NEXT: retq 1706; 1707; AVX-LABEL: test_v4i8: 1708; AVX: # %bb.0: 1709; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1710; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1711; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1712; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1713; AVX-NEXT: vpextrb $0, %xmm0, %eax 1714; AVX-NEXT: # kill: def $al killed $al killed $eax 1715; AVX-NEXT: retq 1716; 1717; AVX512-LABEL: test_v4i8: 1718; AVX512: # %bb.0: 1719; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1720; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1721; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1722; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1723; AVX512-NEXT: vpextrb $0, %xmm0, %eax 1724; AVX512-NEXT: # kill: def $al killed $al killed $eax 1725; AVX512-NEXT: retq 1726 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v4i8(<4 x i8> %a0) 1727 ret i8 %1 1728} 1729 1730define i8 @test_v8i8(<8 x i8> %a0) { 1731; SSE2-LABEL: test_v8i8: 1732; SSE2: # %bb.0: 1733; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1734; SSE2-NEXT: pmullw %xmm0, %xmm1 1735; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1736; SSE2-NEXT: pmullw %xmm1, %xmm0 1737; SSE2-NEXT: movdqa %xmm0, %xmm1 1738; SSE2-NEXT: psrld $16, %xmm1 1739; SSE2-NEXT: pmullw %xmm0, %xmm1 1740; SSE2-NEXT: movd %xmm1, %eax 1741; SSE2-NEXT: # kill: def $al killed $al killed $eax 1742; SSE2-NEXT: retq 1743; 1744; SSE41-LABEL: test_v8i8: 1745; SSE41: # %bb.0: 1746; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1747; SSE41-NEXT: pmullw %xmm0, %xmm1 1748; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1749; SSE41-NEXT: pmullw %xmm1, %xmm0 1750; SSE41-NEXT: movdqa %xmm0, %xmm1 1751; SSE41-NEXT: psrld $16, %xmm1 1752; SSE41-NEXT: pmullw %xmm0, %xmm1 1753; SSE41-NEXT: pextrb $0, %xmm1, %eax 1754; SSE41-NEXT: # kill: def $al killed $al killed $eax 1755; SSE41-NEXT: retq 1756; 1757; AVX-LABEL: test_v8i8: 1758; AVX: # %bb.0: 1759; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1760; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1761; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1762; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1763; AVX-NEXT: vpsrld $16, %xmm0, %xmm1 1764; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1765; AVX-NEXT: vpextrb $0, %xmm0, %eax 1766; AVX-NEXT: # kill: def $al killed $al killed $eax 1767; AVX-NEXT: retq 1768; 1769; AVX512-LABEL: test_v8i8: 1770; AVX512: # %bb.0: 1771; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1772; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1773; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1774; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1775; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1776; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1777; AVX512-NEXT: vpextrb $0, %xmm0, %eax 1778; AVX512-NEXT: # kill: def $al killed $al killed $eax 1779; AVX512-NEXT: retq 1780 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v8i8(<8 x i8> %a0) 1781 ret i8 %1 1782} 1783 1784define i8 @test_v16i8(<16 x i8> %a0) { 1785; SSE2-LABEL: test_v16i8: 1786; SSE2: # %bb.0: 1787; SSE2-NEXT: movdqa %xmm0, %xmm1 1788; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 1789; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1790; SSE2-NEXT: pmullw %xmm1, %xmm0 1791; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1792; SSE2-NEXT: pand %xmm1, %xmm0 1793; SSE2-NEXT: pxor %xmm3, %xmm3 1794; SSE2-NEXT: packuswb %xmm3, %xmm0 1795; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,2,3,3] 1796; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1797; 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] 1798; SSE2-NEXT: pmullw %xmm0, %xmm2 1799; SSE2-NEXT: pand %xmm1, %xmm2 1800; SSE2-NEXT: packuswb %xmm3, %xmm2 1801; SSE2-NEXT: movdqa %xmm2, %xmm0 1802; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1803; SSE2-NEXT: psrldq {{.*#+}} xmm2 = xmm2[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1804; 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] 1805; SSE2-NEXT: pmullw %xmm0, %xmm2 1806; SSE2-NEXT: pand %xmm1, %xmm2 1807; SSE2-NEXT: packuswb %xmm3, %xmm2 1808; SSE2-NEXT: movdqa %xmm2, %xmm0 1809; SSE2-NEXT: psrlw $8, %xmm0 1810; 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] 1811; SSE2-NEXT: pmullw %xmm0, %xmm2 1812; SSE2-NEXT: pand %xmm1, %xmm2 1813; SSE2-NEXT: packuswb %xmm0, %xmm2 1814; SSE2-NEXT: movd %xmm2, %eax 1815; SSE2-NEXT: # kill: def $al killed $al killed $eax 1816; SSE2-NEXT: retq 1817; 1818; SSE41-LABEL: test_v16i8: 1819; SSE41: # %bb.0: 1820; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1821; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1822; SSE41-NEXT: pmullw %xmm1, %xmm0 1823; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1824; SSE41-NEXT: pand %xmm1, %xmm0 1825; SSE41-NEXT: pxor %xmm2, %xmm2 1826; SSE41-NEXT: packuswb %xmm2, %xmm0 1827; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1828; SSE41-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1829; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1830; SSE41-NEXT: pmullw %xmm3, %xmm0 1831; SSE41-NEXT: pand %xmm1, %xmm0 1832; SSE41-NEXT: packuswb %xmm2, %xmm0 1833; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1834; SSE41-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1835; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1836; SSE41-NEXT: pmullw %xmm3, %xmm0 1837; SSE41-NEXT: pand %xmm1, %xmm0 1838; SSE41-NEXT: packuswb %xmm2, %xmm0 1839; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1840; SSE41-NEXT: psrlw $8, %xmm0 1841; SSE41-NEXT: pmullw %xmm1, %xmm0 1842; SSE41-NEXT: pextrb $0, %xmm0, %eax 1843; SSE41-NEXT: # kill: def $al killed $al killed $eax 1844; SSE41-NEXT: retq 1845; 1846; AVX1-LABEL: test_v16i8: 1847; AVX1: # %bb.0: 1848; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1849; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1850; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1851; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1852; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 1853; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1854; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1855; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1856; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1857; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1858; AVX1-NEXT: vpmullw %xmm0, %xmm3, %xmm0 1859; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 1860; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1861; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1862; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1863; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1864; AVX1-NEXT: vpmullw %xmm0, %xmm3, %xmm0 1865; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 1866; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1867; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 1868; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1869; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1870; AVX1-NEXT: vpextrb $0, %xmm0, %eax 1871; AVX1-NEXT: # kill: def $al killed $al killed $eax 1872; AVX1-NEXT: retq 1873; 1874; AVX2-LABEL: test_v16i8: 1875; AVX2: # %bb.0: 1876; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1877; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 1878; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1879; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1880; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 1881; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1882; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1883; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1884; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 1885; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 1886; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero 1887; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 1888; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1889; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1890; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1891; AVX2-NEXT: vpsrld $16, %xmm0, %xmm2 1892; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 1893; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero 1894; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 1895; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1896; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1897; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1898; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 1899; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 1900; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1901; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1902; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 1903; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 1904; AVX2-NEXT: vpextrb $0, %xmm0, %eax 1905; AVX2-NEXT: # kill: def $al killed $al killed $eax 1906; AVX2-NEXT: vzeroupper 1907; AVX2-NEXT: retq 1908; 1909; AVX512BW-LABEL: test_v16i8: 1910; AVX512BW: # %bb.0: 1911; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1912; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 1913; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1914; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1915; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 1916; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1917; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1918; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1919; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 1920; AVX512BW-NEXT: vpsrld $16, %xmm1, %xmm1 1921; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1922; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1923; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 1924; AVX512BW-NEXT: vpsrlw $8, %xmm1, %xmm1 1925; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1926; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1927; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 1928; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 1929; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 1930; AVX512BW-NEXT: vzeroupper 1931; AVX512BW-NEXT: retq 1932; 1933; AVX512BWVL-LABEL: test_v16i8: 1934; AVX512BWVL: # %bb.0: 1935; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1936; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 1937; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1938; AVX512BWVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1939; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm1 1940; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1941; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1942; AVX512BWVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1943; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm1 1944; AVX512BWVL-NEXT: vpsrld $16, %xmm1, %xmm1 1945; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1946; AVX512BWVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1947; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm1 1948; AVX512BWVL-NEXT: vpsrlw $8, %xmm1, %xmm1 1949; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1950; AVX512BWVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1951; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0 1952; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 1953; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 1954; AVX512BWVL-NEXT: vzeroupper 1955; AVX512BWVL-NEXT: retq 1956; 1957; AVX512DQ-LABEL: test_v16i8: 1958; AVX512DQ: # %bb.0: 1959; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1960; AVX512DQ-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 1961; AVX512DQ-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1962; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1963; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 1964; AVX512DQ-NEXT: vpmovdb %zmm1, %xmm1 1965; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1966; AVX512DQ-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1967; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1968; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 1969; AVX512DQ-NEXT: vpmovdb %zmm1, %xmm1 1970; AVX512DQ-NEXT: vpsrld $16, %xmm1, %xmm1 1971; AVX512DQ-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1972; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1973; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 1974; AVX512DQ-NEXT: vpmovdb %zmm1, %xmm1 1975; AVX512DQ-NEXT: vpsrlw $8, %xmm1, %xmm1 1976; AVX512DQ-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1977; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1978; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 1979; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 1980; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 1981; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 1982; AVX512DQ-NEXT: vzeroupper 1983; AVX512DQ-NEXT: retq 1984; 1985; AVX512DQVL-LABEL: test_v16i8: 1986; AVX512DQVL: # %bb.0: 1987; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1988; AVX512DQVL-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 1989; AVX512DQVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1990; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1991; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 1992; AVX512DQVL-NEXT: vpmovdb %zmm1, %xmm1 1993; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1994; AVX512DQVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 1995; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1996; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 1997; AVX512DQVL-NEXT: vpmovdb %zmm1, %xmm1 1998; AVX512DQVL-NEXT: vpsrld $16, %xmm1, %xmm1 1999; AVX512DQVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 2000; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2001; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 2002; AVX512DQVL-NEXT: vpmovdb %zmm1, %xmm1 2003; AVX512DQVL-NEXT: vpsrlw $8, %xmm1, %xmm1 2004; AVX512DQVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero 2005; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2006; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 2007; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0 2008; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 2009; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 2010; AVX512DQVL-NEXT: vzeroupper 2011; AVX512DQVL-NEXT: retq 2012 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v16i8(<16 x i8> %a0) 2013 ret i8 %1 2014} 2015 2016define i8 @test_v32i8(<32 x i8> %a0) { 2017; SSE2-LABEL: test_v32i8: 2018; SSE2: # %bb.0: 2019; SSE2-NEXT: movdqa %xmm1, %xmm2 2020; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2021; SSE2-NEXT: movdqa %xmm0, %xmm3 2022; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2023; SSE2-NEXT: pmullw %xmm2, %xmm3 2024; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2025; SSE2-NEXT: pand %xmm2, %xmm3 2026; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2027; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2028; SSE2-NEXT: pmullw %xmm1, %xmm0 2029; SSE2-NEXT: pand %xmm2, %xmm0 2030; SSE2-NEXT: packuswb %xmm3, %xmm0 2031; SSE2-NEXT: movdqa %xmm0, %xmm1 2032; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2033; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2034; SSE2-NEXT: pmullw %xmm1, %xmm0 2035; SSE2-NEXT: pand %xmm2, %xmm0 2036; SSE2-NEXT: pxor %xmm3, %xmm3 2037; SSE2-NEXT: packuswb %xmm3, %xmm0 2038; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,2,3,3] 2039; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2040; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2041; SSE2-NEXT: pmullw %xmm0, %xmm1 2042; SSE2-NEXT: pand %xmm2, %xmm1 2043; SSE2-NEXT: packuswb %xmm3, %xmm1 2044; SSE2-NEXT: movdqa %xmm1, %xmm0 2045; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2046; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 2047; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2048; SSE2-NEXT: pmullw %xmm0, %xmm1 2049; SSE2-NEXT: pand %xmm2, %xmm1 2050; SSE2-NEXT: packuswb %xmm3, %xmm1 2051; SSE2-NEXT: movdqa %xmm1, %xmm0 2052; SSE2-NEXT: psrlw $8, %xmm0 2053; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2054; SSE2-NEXT: pmullw %xmm0, %xmm1 2055; SSE2-NEXT: pand %xmm2, %xmm1 2056; SSE2-NEXT: packuswb %xmm0, %xmm1 2057; SSE2-NEXT: movd %xmm1, %eax 2058; SSE2-NEXT: # kill: def $al killed $al killed $eax 2059; SSE2-NEXT: retq 2060; 2061; SSE41-LABEL: test_v32i8: 2062; SSE41: # %bb.0: 2063; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2064; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2065; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2066; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2067; SSE41-NEXT: pmullw %xmm1, %xmm0 2068; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 2069; SSE41-NEXT: pand %xmm1, %xmm0 2070; SSE41-NEXT: pmullw %xmm2, %xmm3 2071; SSE41-NEXT: pand %xmm1, %xmm3 2072; SSE41-NEXT: packuswb %xmm0, %xmm3 2073; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2074; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2075; SSE41-NEXT: pmullw %xmm0, %xmm3 2076; SSE41-NEXT: pand %xmm1, %xmm3 2077; SSE41-NEXT: pxor %xmm0, %xmm0 2078; SSE41-NEXT: packuswb %xmm0, %xmm3 2079; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2080; SSE41-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2081; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1] 2082; SSE41-NEXT: pmullw %xmm2, %xmm3 2083; SSE41-NEXT: pand %xmm1, %xmm3 2084; SSE41-NEXT: packuswb %xmm0, %xmm3 2085; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2086; SSE41-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2087; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,2,3] 2088; SSE41-NEXT: pmullw %xmm2, %xmm3 2089; SSE41-NEXT: pand %xmm1, %xmm3 2090; SSE41-NEXT: packuswb %xmm0, %xmm3 2091; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2092; SSE41-NEXT: psrlw $8, %xmm3 2093; SSE41-NEXT: pmullw %xmm0, %xmm3 2094; SSE41-NEXT: pextrb $0, %xmm3, %eax 2095; SSE41-NEXT: # kill: def $al killed $al killed $eax 2096; SSE41-NEXT: retq 2097; 2098; AVX1-LABEL: test_v32i8: 2099; AVX1: # %bb.0: 2100; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2101; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2102; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2103; AVX1-NEXT: vpmullw %xmm1, %xmm3, %xmm3 2104; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 2105; AVX1-NEXT: vpand %xmm1, %xmm3, %xmm3 2106; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2107; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2108; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2109; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 2110; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 2111; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 2112; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2113; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2114; AVX1-NEXT: vpmullw %xmm0, %xmm3, %xmm3 2115; AVX1-NEXT: vpand %xmm1, %xmm3, %xmm3 2116; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2117; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2118; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 2119; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 2120; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 2121; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2122; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2123; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 2124; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm2 2125; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2126; AVX1-NEXT: vpmullw %xmm0, %xmm0, %xmm0 2127; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 2128; AVX1-NEXT: vpackuswb %xmm0, %xmm2, %xmm0 2129; AVX1-NEXT: vpsrld $16, %xmm0, %xmm2 2130; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2131; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2132; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm3 2133; AVX1-NEXT: vpand %xmm1, %xmm3, %xmm3 2134; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2135; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2136; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2137; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 2138; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 2139; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 2140; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2141; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2142; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2143; AVX1-NEXT: vpextrb $0, %xmm0, %eax 2144; AVX1-NEXT: # kill: def $al killed $al killed $eax 2145; AVX1-NEXT: vzeroupper 2146; AVX1-NEXT: retq 2147; 2148; AVX2-LABEL: test_v32i8: 2149; AVX2: # %bb.0: 2150; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2151; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2152; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2153; AVX2-NEXT: vpmullw %ymm3, %ymm2, %ymm2 2154; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2155; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 2156; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2157; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2158; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2159; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 2160; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2161; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2162; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2163; AVX2-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2164; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 2165; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 2166; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2167; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2168; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2169; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2170; AVX2-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2171; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 2172; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2173; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2174; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2175; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2176; AVX2-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2177; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 2178; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2179; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 2180; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2181; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2182; AVX2-NEXT: vpextrb $0, %xmm0, %eax 2183; AVX2-NEXT: # kill: def $al killed $al killed $eax 2184; AVX2-NEXT: vzeroupper 2185; AVX2-NEXT: retq 2186; 2187; AVX512BW-LABEL: test_v32i8: 2188; AVX512BW: # %bb.0: 2189; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 2190; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2191; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero 2192; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2193; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 2194; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2195; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2196; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2197; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 2198; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 2199; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2200; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2201; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 2202; AVX512BW-NEXT: vpsrld $16, %xmm1, %xmm1 2203; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2204; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2205; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 2206; AVX512BW-NEXT: vpsrlw $8, %xmm1, %xmm1 2207; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2208; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2209; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 2210; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 2211; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 2212; AVX512BW-NEXT: vzeroupper 2213; AVX512BW-NEXT: retq 2214; 2215; AVX512BWVL-LABEL: test_v32i8: 2216; AVX512BWVL: # %bb.0: 2217; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 2218; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2219; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero 2220; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2221; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm1 2222; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2223; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2224; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2225; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm1 2226; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 2227; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2228; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2229; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm1 2230; AVX512BWVL-NEXT: vpsrld $16, %xmm1, %xmm1 2231; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2232; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2233; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm1 2234; AVX512BWVL-NEXT: vpsrlw $8, %xmm1, %xmm1 2235; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 2236; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2237; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0 2238; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 2239; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 2240; AVX512BWVL-NEXT: vzeroupper 2241; AVX512BWVL-NEXT: retq 2242; 2243; AVX512DQ-LABEL: test_v32i8: 2244; AVX512DQ: # %bb.0: 2245; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 2246; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2247; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2248; AVX512DQ-NEXT: vpmullw %ymm3, %ymm2, %ymm2 2249; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2250; AVX512DQ-NEXT: vpand %ymm3, %ymm2, %ymm2 2251; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2252; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2253; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2254; AVX512DQ-NEXT: vpand %ymm3, %ymm0, %ymm0 2255; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2256; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2257; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2258; AVX512DQ-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2259; AVX512DQ-NEXT: vpand %ymm3, %ymm0, %ymm0 2260; AVX512DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1 2261; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2262; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2263; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2264; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2265; AVX512DQ-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2266; AVX512DQ-NEXT: vpand %ymm3, %ymm0, %ymm0 2267; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2268; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2269; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2270; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2271; AVX512DQ-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2272; AVX512DQ-NEXT: vpand %ymm3, %ymm0, %ymm0 2273; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2274; AVX512DQ-NEXT: vpsrlw $8, %xmm0, %xmm1 2275; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2276; AVX512DQ-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2277; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 2278; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 2279; AVX512DQ-NEXT: vzeroupper 2280; AVX512DQ-NEXT: retq 2281; 2282; AVX512DQVL-LABEL: test_v32i8: 2283; AVX512DQVL: # %bb.0: 2284; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 2285; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2286; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2287; AVX512DQVL-NEXT: vpmullw %ymm3, %ymm2, %ymm2 2288; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2289; AVX512DQVL-NEXT: vpand %ymm3, %ymm2, %ymm2 2290; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2291; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2292; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2293; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2294; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2295; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2296; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2297; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2298; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2299; AVX512DQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2300; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2301; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2302; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2303; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2304; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2305; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2306; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2307; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2308; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2309; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2310; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2311; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2312; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2313; AVX512DQVL-NEXT: vpsrlw $8, %xmm0, %xmm1 2314; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2315; AVX512DQVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2316; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 2317; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 2318; AVX512DQVL-NEXT: vzeroupper 2319; AVX512DQVL-NEXT: retq 2320 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v32i8(<32 x i8> %a0) 2321 ret i8 %1 2322} 2323 2324define i8 @test_v64i8(<64 x i8> %a0) { 2325; SSE2-LABEL: test_v64i8: 2326; SSE2: # %bb.0: 2327; SSE2-NEXT: movdqa %xmm2, %xmm4 2328; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 2329; SSE2-NEXT: movdqa %xmm0, %xmm5 2330; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2331; SSE2-NEXT: pmullw %xmm4, %xmm5 2332; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 2333; SSE2-NEXT: pand %xmm4, %xmm5 2334; 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] 2335; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2336; SSE2-NEXT: pmullw %xmm2, %xmm0 2337; SSE2-NEXT: pand %xmm4, %xmm0 2338; SSE2-NEXT: packuswb %xmm5, %xmm0 2339; SSE2-NEXT: movdqa %xmm3, %xmm2 2340; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2341; SSE2-NEXT: movdqa %xmm1, %xmm5 2342; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2343; SSE2-NEXT: pmullw %xmm2, %xmm5 2344; SSE2-NEXT: pand %xmm4, %xmm5 2345; 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] 2346; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2347; SSE2-NEXT: pmullw %xmm3, %xmm1 2348; SSE2-NEXT: pand %xmm4, %xmm1 2349; SSE2-NEXT: packuswb %xmm5, %xmm1 2350; SSE2-NEXT: movdqa %xmm1, %xmm2 2351; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2352; SSE2-NEXT: movdqa %xmm0, %xmm3 2353; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2354; SSE2-NEXT: pmullw %xmm2, %xmm3 2355; SSE2-NEXT: pand %xmm4, %xmm3 2356; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2357; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2358; SSE2-NEXT: pmullw %xmm1, %xmm0 2359; SSE2-NEXT: pand %xmm4, %xmm0 2360; SSE2-NEXT: packuswb %xmm3, %xmm0 2361; SSE2-NEXT: movdqa %xmm0, %xmm1 2362; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2363; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2364; SSE2-NEXT: pmullw %xmm1, %xmm0 2365; SSE2-NEXT: pand %xmm4, %xmm0 2366; SSE2-NEXT: pxor %xmm2, %xmm2 2367; SSE2-NEXT: packuswb %xmm2, %xmm0 2368; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,2,3,3] 2369; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2370; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2371; SSE2-NEXT: pmullw %xmm0, %xmm1 2372; SSE2-NEXT: pand %xmm4, %xmm1 2373; SSE2-NEXT: packuswb %xmm2, %xmm1 2374; SSE2-NEXT: movdqa %xmm1, %xmm0 2375; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2376; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 2377; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2378; SSE2-NEXT: pmullw %xmm0, %xmm1 2379; SSE2-NEXT: pand %xmm4, %xmm1 2380; SSE2-NEXT: packuswb %xmm2, %xmm1 2381; SSE2-NEXT: movdqa %xmm1, %xmm0 2382; SSE2-NEXT: psrlw $8, %xmm0 2383; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2384; SSE2-NEXT: pmullw %xmm0, %xmm1 2385; SSE2-NEXT: pand %xmm4, %xmm1 2386; SSE2-NEXT: packuswb %xmm0, %xmm1 2387; SSE2-NEXT: movd %xmm1, %eax 2388; SSE2-NEXT: # kill: def $al killed $al killed $eax 2389; SSE2-NEXT: retq 2390; 2391; SSE41-LABEL: test_v64i8: 2392; SSE41: # %bb.0: 2393; SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2394; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2395; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2396; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2397; SSE41-NEXT: pmullw %xmm2, %xmm0 2398; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2399; SSE41-NEXT: pand %xmm2, %xmm0 2400; SSE41-NEXT: pmullw %xmm5, %xmm4 2401; SSE41-NEXT: pand %xmm2, %xmm4 2402; SSE41-NEXT: packuswb %xmm0, %xmm4 2403; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2404; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2405; SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2406; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2407; SSE41-NEXT: pmullw %xmm3, %xmm1 2408; SSE41-NEXT: pand %xmm2, %xmm1 2409; SSE41-NEXT: pmullw %xmm0, %xmm5 2410; SSE41-NEXT: pand %xmm2, %xmm5 2411; SSE41-NEXT: packuswb %xmm1, %xmm5 2412; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 2413; SSE41-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2414; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero 2415; SSE41-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 2416; SSE41-NEXT: pmullw %xmm5, %xmm4 2417; SSE41-NEXT: pand %xmm2, %xmm4 2418; SSE41-NEXT: pmullw %xmm0, %xmm1 2419; SSE41-NEXT: pand %xmm2, %xmm1 2420; SSE41-NEXT: packuswb %xmm4, %xmm1 2421; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2422; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2423; SSE41-NEXT: pmullw %xmm0, %xmm1 2424; SSE41-NEXT: pand %xmm2, %xmm1 2425; SSE41-NEXT: pxor %xmm0, %xmm0 2426; SSE41-NEXT: packuswb %xmm0, %xmm1 2427; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2428; SSE41-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2429; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2430; SSE41-NEXT: pmullw %xmm3, %xmm1 2431; SSE41-NEXT: pand %xmm2, %xmm1 2432; SSE41-NEXT: packuswb %xmm0, %xmm1 2433; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2434; SSE41-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2435; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 2436; SSE41-NEXT: pmullw %xmm3, %xmm1 2437; SSE41-NEXT: pand %xmm2, %xmm1 2438; SSE41-NEXT: packuswb %xmm0, %xmm1 2439; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2440; SSE41-NEXT: psrlw $8, %xmm1 2441; SSE41-NEXT: pmullw %xmm0, %xmm1 2442; SSE41-NEXT: pextrb $0, %xmm1, %eax 2443; SSE41-NEXT: # kill: def $al killed $al killed $eax 2444; SSE41-NEXT: retq 2445; 2446; AVX1-LABEL: test_v64i8: 2447; AVX1: # %bb.0: 2448; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2449; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2450; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm3 2451; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2452; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm3 2453; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm4 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2454; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2455; AVX1-NEXT: vpmullw %xmm4, %xmm5, %xmm4 2456; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm4 2457; AVX1-NEXT: vpackuswb %xmm3, %xmm4, %xmm3 2458; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2459; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2460; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2461; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2462; AVX1-NEXT: vpmullw %xmm4, %xmm5, %xmm4 2463; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm4 2464; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2465; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2466; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2467; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2468; AVX1-NEXT: vpackuswb %xmm4, %xmm0, %xmm0 2469; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2470; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2471; AVX1-NEXT: vpmullw %xmm1, %xmm4, %xmm1 2472; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 2473; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2474; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2475; AVX1-NEXT: vpmullw %xmm0, %xmm3, %xmm0 2476; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2477; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2478; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 2479; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2480; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2481; AVX1-NEXT: vpmullw %xmm0, %xmm3, %xmm3 2482; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm3 2483; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2484; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2485; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2486; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 2487; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 2488; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2489; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2490; AVX1-NEXT: vpmullw %xmm1, %xmm3, %xmm1 2491; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 2492; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2493; AVX1-NEXT: vpmullw %xmm0, %xmm0, %xmm0 2494; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2495; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0 2496; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1 2497; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2498; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2499; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm3 2500; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm3 2501; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2502; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2503; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2504; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2505; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 2506; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 2507; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2508; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2509; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2510; AVX1-NEXT: vpextrb $0, %xmm0, %eax 2511; AVX1-NEXT: # kill: def $al killed $al killed $eax 2512; AVX1-NEXT: vzeroupper 2513; AVX1-NEXT: retq 2514; 2515; AVX2-LABEL: test_v64i8: 2516; AVX2: # %bb.0: 2517; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2518; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2519; AVX2-NEXT: vpmullw %ymm2, %ymm3, %ymm3 2520; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2521; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm3 2522; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2523; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2524; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2525; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2526; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2527; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2528; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2529; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2530; AVX2-NEXT: vpmullw %ymm4, %ymm3, %ymm3 2531; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm3 2532; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2533; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2534; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2535; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2536; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2537; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2538; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2539; AVX2-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2540; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2541; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 2542; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2543; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2544; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2545; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2546; AVX2-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2547; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2548; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2549; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2550; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2551; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2552; AVX2-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2553; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2554; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2555; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 2556; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2557; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2558; AVX2-NEXT: vpextrb $0, %xmm0, %eax 2559; AVX2-NEXT: # kill: def $al killed $al killed $eax 2560; AVX2-NEXT: vzeroupper 2561; AVX2-NEXT: retq 2562; 2563; AVX512BW-LABEL: test_v64i8: 2564; AVX512BW: # %bb.0: 2565; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2566; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 2567; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 2568; AVX512BW-NEXT: vpmullw %zmm3, %zmm2, %zmm2 2569; AVX512BW-NEXT: vmovdqa64 {{.*#+}} zmm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2570; AVX512BW-NEXT: vpandq %zmm3, %zmm2, %zmm2 2571; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2572; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 2573; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2574; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2575; AVX512BW-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 2576; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 2577; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 2578; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 2579; AVX512BW-NEXT: vpmullw %zmm4, %zmm2, %zmm2 2580; AVX512BW-NEXT: vpandq %zmm3, %zmm2, %zmm2 2581; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2582; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 2583; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2584; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2585; AVX512BW-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 2586; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2587; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2588; AVX512BW-NEXT: vpmullw %zmm0, %zmm1, %zmm0 2589; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2590; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 2591; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2592; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2593; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2594; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2595; AVX512BW-NEXT: vpmullw %zmm0, %zmm2, %zmm0 2596; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2597; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2598; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2599; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2600; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2601; AVX512BW-NEXT: vpmullw %zmm0, %zmm2, %zmm0 2602; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2603; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2604; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm1 2605; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2606; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2607; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 2608; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 2609; AVX512BW-NEXT: vzeroupper 2610; AVX512BW-NEXT: retq 2611; 2612; AVX512BWVL-LABEL: test_v64i8: 2613; AVX512BWVL: # %bb.0: 2614; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2615; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 2616; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 2617; AVX512BWVL-NEXT: vpmullw %zmm3, %zmm2, %zmm2 2618; AVX512BWVL-NEXT: vmovdqa64 {{.*#+}} zmm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2619; AVX512BWVL-NEXT: vpandq %zmm3, %zmm2, %zmm2 2620; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2621; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 2622; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2623; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2624; AVX512BWVL-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 2625; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 2626; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 2627; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 2628; AVX512BWVL-NEXT: vpmullw %zmm4, %zmm2, %zmm2 2629; AVX512BWVL-NEXT: vpandq %zmm3, %zmm2, %zmm2 2630; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2631; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 2632; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2633; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2634; AVX512BWVL-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 2635; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2636; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2637; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm1, %zmm0 2638; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2639; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2640; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2641; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2642; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2643; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2644; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm2, %zmm0 2645; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2646; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2647; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2648; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2649; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2650; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm2, %zmm0 2651; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2652; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2653; AVX512BWVL-NEXT: vpsrlw $8, %xmm0, %xmm1 2654; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 2655; AVX512BWVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2656; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 2657; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 2658; AVX512BWVL-NEXT: vzeroupper 2659; AVX512BWVL-NEXT: retq 2660; 2661; AVX512DQ-LABEL: test_v64i8: 2662; AVX512DQ: # %bb.0: 2663; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2664; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2665; AVX512DQ-NEXT: vpmullw %ymm2, %ymm3, %ymm3 2666; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2667; AVX512DQ-NEXT: vpand %ymm2, %ymm3, %ymm3 2668; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2669; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2670; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2671; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2672; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2673; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 2674; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2675; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2676; AVX512DQ-NEXT: vpmullw %ymm4, %ymm3, %ymm3 2677; AVX512DQ-NEXT: vpand %ymm2, %ymm3, %ymm3 2678; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2679; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2680; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2681; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2682; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2683; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2684; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2685; AVX512DQ-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2686; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2687; AVX512DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1 2688; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2689; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2690; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2691; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2692; AVX512DQ-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2693; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2694; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2695; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2696; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2697; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2698; AVX512DQ-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2699; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2700; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2701; AVX512DQ-NEXT: vpsrlw $8, %xmm0, %xmm1 2702; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2703; AVX512DQ-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2704; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 2705; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 2706; AVX512DQ-NEXT: vzeroupper 2707; AVX512DQ-NEXT: retq 2708; 2709; AVX512DQVL-LABEL: test_v64i8: 2710; AVX512DQVL: # %bb.0: 2711; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2712; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2713; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm3, %ymm2 2714; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2715; AVX512DQVL-NEXT: vpand %ymm3, %ymm2, %ymm2 2716; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2717; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2718; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2719; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2720; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2721; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 2722; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 2723; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 2724; AVX512DQVL-NEXT: vpmullw %ymm4, %ymm2, %ymm2 2725; AVX512DQVL-NEXT: vpand %ymm3, %ymm2, %ymm2 2726; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2727; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 2728; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2729; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2730; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2731; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2732; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2733; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2734; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2735; AVX512DQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2736; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2737; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2738; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2739; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2740; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2741; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2742; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2743; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2744; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2745; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2746; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2747; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2748; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2749; AVX512DQVL-NEXT: vpsrlw $8, %xmm0, %xmm1 2750; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 2751; AVX512DQVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2752; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 2753; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 2754; AVX512DQVL-NEXT: vzeroupper 2755; AVX512DQVL-NEXT: retq 2756 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v64i8(<64 x i8> %a0) 2757 ret i8 %1 2758} 2759 2760define i8 @test_v128i8(<128 x i8> %a0) { 2761; SSE2-LABEL: test_v128i8: 2762; SSE2: # %bb.0: 2763; SSE2-NEXT: movdqa %xmm5, %xmm8 2764; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15] 2765; SSE2-NEXT: movdqa %xmm1, %xmm9 2766; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm0[8],xmm9[9],xmm0[9],xmm9[10],xmm0[10],xmm9[11],xmm0[11],xmm9[12],xmm0[12],xmm9[13],xmm0[13],xmm9[14],xmm0[14],xmm9[15],xmm0[15] 2767; SSE2-NEXT: pmullw %xmm8, %xmm9 2768; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255] 2769; SSE2-NEXT: pand %xmm8, %xmm9 2770; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7] 2771; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2772; SSE2-NEXT: pmullw %xmm5, %xmm1 2773; SSE2-NEXT: pand %xmm8, %xmm1 2774; SSE2-NEXT: packuswb %xmm9, %xmm1 2775; SSE2-NEXT: movdqa %xmm7, %xmm9 2776; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm0[8],xmm9[9],xmm0[9],xmm9[10],xmm0[10],xmm9[11],xmm0[11],xmm9[12],xmm0[12],xmm9[13],xmm0[13],xmm9[14],xmm0[14],xmm9[15],xmm0[15] 2777; SSE2-NEXT: movdqa %xmm3, %xmm5 2778; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2779; SSE2-NEXT: pmullw %xmm9, %xmm5 2780; SSE2-NEXT: pand %xmm8, %xmm5 2781; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm0[0],xmm7[1],xmm0[1],xmm7[2],xmm0[2],xmm7[3],xmm0[3],xmm7[4],xmm0[4],xmm7[5],xmm0[5],xmm7[6],xmm0[6],xmm7[7],xmm0[7] 2782; 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] 2783; SSE2-NEXT: pmullw %xmm7, %xmm3 2784; SSE2-NEXT: pand %xmm8, %xmm3 2785; SSE2-NEXT: packuswb %xmm5, %xmm3 2786; SSE2-NEXT: movdqa %xmm4, %xmm5 2787; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2788; SSE2-NEXT: movdqa %xmm0, %xmm7 2789; SSE2-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15] 2790; SSE2-NEXT: pmullw %xmm5, %xmm7 2791; SSE2-NEXT: pand %xmm8, %xmm7 2792; 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] 2793; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2794; SSE2-NEXT: pmullw %xmm4, %xmm0 2795; SSE2-NEXT: pand %xmm8, %xmm0 2796; SSE2-NEXT: packuswb %xmm7, %xmm0 2797; SSE2-NEXT: movdqa %xmm6, %xmm4 2798; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 2799; SSE2-NEXT: movdqa %xmm2, %xmm5 2800; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2801; SSE2-NEXT: pmullw %xmm4, %xmm5 2802; SSE2-NEXT: pand %xmm8, %xmm5 2803; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1],xmm6[2],xmm0[2],xmm6[3],xmm0[3],xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7] 2804; 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] 2805; SSE2-NEXT: pmullw %xmm6, %xmm2 2806; SSE2-NEXT: pand %xmm8, %xmm2 2807; SSE2-NEXT: packuswb %xmm5, %xmm2 2808; SSE2-NEXT: movdqa %xmm2, %xmm4 2809; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 2810; SSE2-NEXT: movdqa %xmm0, %xmm5 2811; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2812; SSE2-NEXT: pmullw %xmm4, %xmm5 2813; SSE2-NEXT: pand %xmm8, %xmm5 2814; 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] 2815; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2816; SSE2-NEXT: pmullw %xmm2, %xmm0 2817; SSE2-NEXT: pand %xmm8, %xmm0 2818; SSE2-NEXT: packuswb %xmm5, %xmm0 2819; SSE2-NEXT: movdqa %xmm3, %xmm2 2820; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2821; SSE2-NEXT: movdqa %xmm1, %xmm4 2822; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 2823; SSE2-NEXT: pmullw %xmm2, %xmm4 2824; SSE2-NEXT: pand %xmm8, %xmm4 2825; 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] 2826; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2827; SSE2-NEXT: pmullw %xmm3, %xmm1 2828; SSE2-NEXT: pand %xmm8, %xmm1 2829; SSE2-NEXT: packuswb %xmm4, %xmm1 2830; SSE2-NEXT: movdqa %xmm1, %xmm2 2831; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2832; SSE2-NEXT: movdqa %xmm0, %xmm3 2833; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2834; SSE2-NEXT: pmullw %xmm2, %xmm3 2835; SSE2-NEXT: pand %xmm8, %xmm3 2836; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2837; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2838; SSE2-NEXT: pmullw %xmm1, %xmm0 2839; SSE2-NEXT: pand %xmm8, %xmm0 2840; SSE2-NEXT: packuswb %xmm3, %xmm0 2841; SSE2-NEXT: movdqa %xmm0, %xmm1 2842; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2843; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2844; SSE2-NEXT: pmullw %xmm1, %xmm0 2845; SSE2-NEXT: pand %xmm8, %xmm0 2846; SSE2-NEXT: pxor %xmm2, %xmm2 2847; SSE2-NEXT: packuswb %xmm2, %xmm0 2848; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,2,3,3] 2849; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2850; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2851; SSE2-NEXT: pmullw %xmm0, %xmm1 2852; SSE2-NEXT: pand %xmm8, %xmm1 2853; SSE2-NEXT: packuswb %xmm2, %xmm1 2854; SSE2-NEXT: movdqa %xmm1, %xmm0 2855; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2856; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 2857; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2858; SSE2-NEXT: pmullw %xmm0, %xmm1 2859; SSE2-NEXT: pand %xmm8, %xmm1 2860; SSE2-NEXT: packuswb %xmm2, %xmm1 2861; SSE2-NEXT: movdqa %xmm1, %xmm0 2862; SSE2-NEXT: psrlw $8, %xmm0 2863; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2864; SSE2-NEXT: pmullw %xmm0, %xmm1 2865; SSE2-NEXT: pand %xmm8, %xmm1 2866; SSE2-NEXT: packuswb %xmm0, %xmm1 2867; SSE2-NEXT: movd %xmm1, %eax 2868; SSE2-NEXT: # kill: def $al killed $al killed $eax 2869; SSE2-NEXT: retq 2870; 2871; SSE41-LABEL: test_v128i8: 2872; SSE41: # %bb.0: 2873; SSE41-NEXT: pmovzxbw {{.*#+}} xmm9 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 2874; SSE41-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2875; SSE41-NEXT: pmovzxbw {{.*#+}} xmm8 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2876; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2877; SSE41-NEXT: pmullw %xmm5, %xmm1 2878; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 2879; SSE41-NEXT: pand %xmm5, %xmm1 2880; SSE41-NEXT: pmullw %xmm9, %xmm8 2881; SSE41-NEXT: pand %xmm5, %xmm8 2882; SSE41-NEXT: packuswb %xmm1, %xmm8 2883; SSE41-NEXT: pmovzxbw {{.*#+}} xmm9 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero 2884; SSE41-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15] 2885; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2886; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2887; SSE41-NEXT: pmullw %xmm7, %xmm3 2888; SSE41-NEXT: pand %xmm5, %xmm3 2889; SSE41-NEXT: pmullw %xmm9, %xmm1 2890; SSE41-NEXT: pand %xmm5, %xmm1 2891; SSE41-NEXT: packuswb %xmm3, %xmm1 2892; SSE41-NEXT: pmovzxbw {{.*#+}} xmm7 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero 2893; SSE41-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 2894; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2895; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2896; SSE41-NEXT: pmullw %xmm4, %xmm0 2897; SSE41-NEXT: pand %xmm5, %xmm0 2898; SSE41-NEXT: pmullw %xmm7, %xmm3 2899; SSE41-NEXT: pand %xmm5, %xmm3 2900; SSE41-NEXT: packuswb %xmm0, %xmm3 2901; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero 2902; SSE41-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 2903; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2904; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2905; SSE41-NEXT: pmullw %xmm6, %xmm2 2906; SSE41-NEXT: pand %xmm5, %xmm2 2907; SSE41-NEXT: pmullw %xmm0, %xmm4 2908; SSE41-NEXT: pand %xmm5, %xmm4 2909; SSE41-NEXT: packuswb %xmm2, %xmm4 2910; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero 2911; SSE41-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15] 2912; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2913; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2914; SSE41-NEXT: pmullw %xmm4, %xmm3 2915; SSE41-NEXT: pand %xmm5, %xmm3 2916; SSE41-NEXT: pmullw %xmm2, %xmm0 2917; SSE41-NEXT: pand %xmm5, %xmm0 2918; SSE41-NEXT: packuswb %xmm3, %xmm0 2919; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 2920; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2921; SSE41-NEXT: pmovzxbw {{.*#+}} xmm3 = xmm8[0],zero,xmm8[1],zero,xmm8[2],zero,xmm8[3],zero,xmm8[4],zero,xmm8[5],zero,xmm8[6],zero,xmm8[7],zero 2922; SSE41-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15] 2923; SSE41-NEXT: pmullw %xmm1, %xmm8 2924; SSE41-NEXT: pand %xmm5, %xmm8 2925; SSE41-NEXT: pmullw %xmm2, %xmm3 2926; SSE41-NEXT: pand %xmm5, %xmm3 2927; SSE41-NEXT: packuswb %xmm8, %xmm3 2928; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 2929; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2930; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2931; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2932; SSE41-NEXT: pmullw %xmm3, %xmm0 2933; SSE41-NEXT: pand %xmm5, %xmm0 2934; SSE41-NEXT: pmullw %xmm1, %xmm2 2935; SSE41-NEXT: pand %xmm5, %xmm2 2936; SSE41-NEXT: packuswb %xmm0, %xmm2 2937; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2938; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2939; SSE41-NEXT: pmullw %xmm0, %xmm2 2940; SSE41-NEXT: pand %xmm5, %xmm2 2941; SSE41-NEXT: pxor %xmm0, %xmm0 2942; SSE41-NEXT: packuswb %xmm0, %xmm2 2943; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2944; SSE41-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2945; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 2946; SSE41-NEXT: pmullw %xmm1, %xmm2 2947; SSE41-NEXT: pand %xmm5, %xmm2 2948; SSE41-NEXT: packuswb %xmm0, %xmm2 2949; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2950; SSE41-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2951; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,2,3] 2952; SSE41-NEXT: pmullw %xmm1, %xmm2 2953; SSE41-NEXT: pand %xmm5, %xmm2 2954; SSE41-NEXT: packuswb %xmm0, %xmm2 2955; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2956; SSE41-NEXT: psrlw $8, %xmm2 2957; SSE41-NEXT: pmullw %xmm0, %xmm2 2958; SSE41-NEXT: pextrb $0, %xmm2, %eax 2959; SSE41-NEXT: # kill: def $al killed $al killed $eax 2960; SSE41-NEXT: retq 2961; 2962; AVX1-LABEL: test_v128i8: 2963; AVX1: # %bb.0: 2964; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 2965; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2966; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 2967; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 2968; AVX1-NEXT: vpmullw %xmm4, %xmm7, %xmm7 2969; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 2970; AVX1-NEXT: vpand %xmm4, %xmm7, %xmm7 2971; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 2972; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero 2973; AVX1-NEXT: vpmullw %xmm5, %xmm6, %xmm5 2974; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm5 2975; AVX1-NEXT: vpackuswb %xmm7, %xmm5, %xmm8 2976; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 2977; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm9 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 2978; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2979; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm7 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 2980; AVX1-NEXT: vpmullw %xmm9, %xmm7, %xmm7 2981; AVX1-NEXT: vpand %xmm4, %xmm7, %xmm7 2982; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero 2983; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 2984; AVX1-NEXT: vpmullw %xmm6, %xmm5, %xmm5 2985; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm5 2986; AVX1-NEXT: vpackuswb %xmm7, %xmm5, %xmm6 2987; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 2988; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm7 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2989; AVX1-NEXT: vpmullw %xmm5, %xmm7, %xmm5 2990; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm5 2991; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero 2992; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2993; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2994; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2995; AVX1-NEXT: vpackuswb %xmm5, %xmm0, %xmm0 2996; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15] 2997; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 2998; AVX1-NEXT: vpmullw %xmm2, %xmm5, %xmm2 2999; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 3000; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 3001; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 3002; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1 3003; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 3004; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 3005; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 3006; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3007; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 3008; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 3009; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 3010; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 3011; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3012; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 3013; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3014; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 3015; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15] 3016; AVX1-NEXT: vpmullw %xmm1, %xmm2, %xmm1 3017; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 3018; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero 3019; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm8[0],zero,xmm8[1],zero,xmm8[2],zero,xmm8[3],zero,xmm8[4],zero,xmm8[5],zero,xmm8[6],zero,xmm8[7],zero 3020; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 3021; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 3022; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm1 3023; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 3024; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3025; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 3026; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 3027; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 3028; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 3029; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3030; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 3031; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3032; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 3033; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3034; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 3035; AVX1-NEXT: vpmullw %xmm0, %xmm2, %xmm2 3036; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 3037; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 3038; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3039; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 3040; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3041; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 3042; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 3043; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 3044; AVX1-NEXT: vpmullw %xmm1, %xmm2, %xmm1 3045; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 3046; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3047; AVX1-NEXT: vpmullw %xmm0, %xmm0, %xmm0 3048; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 3049; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0 3050; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1 3051; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3052; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 3053; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2 3054; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 3055; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 3056; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 3057; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3058; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 3059; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3060; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 3061; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 3062; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 3063; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3064; AVX1-NEXT: vpextrb $0, %xmm0, %eax 3065; AVX1-NEXT: # kill: def $al killed $al killed $eax 3066; AVX1-NEXT: vzeroupper 3067; AVX1-NEXT: retq 3068; 3069; AVX2-LABEL: test_v128i8: 3070; AVX2: # %bb.0: 3071; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31] 3072; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3073; AVX2-NEXT: vpmullw %ymm4, %ymm5, %ymm5 3074; AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3075; AVX2-NEXT: vpand %ymm4, %ymm5, %ymm5 3076; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23] 3077; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3078; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 3079; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3080; AVX2-NEXT: vpackuswb %ymm5, %ymm0, %ymm0 3081; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31] 3082; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3083; AVX2-NEXT: vpmullw %ymm2, %ymm5, %ymm2 3084; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2 3085; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23] 3086; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3087; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm1 3088; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1 3089; AVX2-NEXT: vpackuswb %ymm2, %ymm1, %ymm1 3090; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3091; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3092; AVX2-NEXT: vpmullw %ymm2, %ymm3, %ymm2 3093; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2 3094; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3095; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3096; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3097; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3098; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3099; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3100; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3101; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3102; AVX2-NEXT: vpmullw %ymm3, %ymm2, %ymm2 3103; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2 3104; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3105; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3106; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3107; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3108; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3109; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3110; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3111; AVX2-NEXT: vpmullw %ymm0, %ymm1, %ymm0 3112; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3113; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 3114; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3115; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3116; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3117; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3118; AVX2-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3119; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3120; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3121; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3122; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3123; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3124; AVX2-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3125; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3126; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3127; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 3128; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3129; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3130; AVX2-NEXT: vpextrb $0, %xmm0, %eax 3131; AVX2-NEXT: # kill: def $al killed $al killed $eax 3132; AVX2-NEXT: vzeroupper 3133; AVX2-NEXT: retq 3134; 3135; AVX512BW-LABEL: test_v128i8: 3136; AVX512BW: # %bb.0: 3137; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 3138; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm3 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 3139; AVX512BW-NEXT: vpmullw %zmm2, %zmm3, %zmm2 3140; AVX512BW-NEXT: vmovdqa64 {{.*#+}} zmm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3141; AVX512BW-NEXT: vpandq %zmm3, %zmm2, %zmm2 3142; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 3143; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3144; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3145; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 3146; AVX512BW-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 3147; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 3148; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 3149; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 3150; AVX512BW-NEXT: vpmullw %zmm4, %zmm2, %zmm2 3151; AVX512BW-NEXT: vpandq %zmm3, %zmm2, %zmm2 3152; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3153; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 3154; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3155; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 3156; AVX512BW-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 3157; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 3158; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 3159; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 3160; AVX512BW-NEXT: vpmullw %zmm4, %zmm2, %zmm2 3161; AVX512BW-NEXT: vpandq %zmm3, %zmm2, %zmm2 3162; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3163; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 3164; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3165; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 3166; AVX512BW-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 3167; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3168; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3169; AVX512BW-NEXT: vpmullw %zmm0, %zmm1, %zmm0 3170; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 3171; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 3172; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3173; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3174; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3175; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3176; AVX512BW-NEXT: vpmullw %zmm0, %zmm2, %zmm0 3177; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 3178; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3179; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3180; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3181; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3182; AVX512BW-NEXT: vpmullw %zmm0, %zmm2, %zmm0 3183; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 3184; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3185; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm1 3186; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3187; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3188; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 3189; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 3190; AVX512BW-NEXT: vzeroupper 3191; AVX512BW-NEXT: retq 3192; 3193; AVX512BWVL-LABEL: test_v128i8: 3194; AVX512BWVL: # %bb.0: 3195; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 3196; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm3 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 3197; AVX512BWVL-NEXT: vpmullw %zmm2, %zmm3, %zmm2 3198; AVX512BWVL-NEXT: vmovdqa64 {{.*#+}} zmm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3199; AVX512BWVL-NEXT: vpandq %zmm3, %zmm2, %zmm2 3200; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 3201; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3202; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3203; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 3204; AVX512BWVL-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 3205; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 3206; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 3207; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 3208; AVX512BWVL-NEXT: vpmullw %zmm4, %zmm2, %zmm2 3209; AVX512BWVL-NEXT: vpandq %zmm3, %zmm2, %zmm2 3210; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3211; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 3212; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3213; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 3214; AVX512BWVL-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 3215; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 3216; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63] 3217; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63] 3218; AVX512BWVL-NEXT: vpmullw %zmm4, %zmm2, %zmm2 3219; AVX512BWVL-NEXT: vpandq %zmm3, %zmm2, %zmm2 3220; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3221; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55] 3222; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3223; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 3224; AVX512BWVL-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 3225; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3226; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3227; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm1, %zmm0 3228; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 3229; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3230; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3231; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3232; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3233; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3234; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm2, %zmm0 3235; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 3236; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3237; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3238; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3239; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3240; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm2, %zmm0 3241; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 3242; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3243; AVX512BWVL-NEXT: vpsrlw $8, %xmm0, %xmm1 3244; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55] 3245; AVX512BWVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3246; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 3247; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 3248; AVX512BWVL-NEXT: vzeroupper 3249; AVX512BWVL-NEXT: retq 3250; 3251; AVX512DQ-LABEL: test_v128i8: 3252; AVX512DQ: # %bb.0: 3253; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31] 3254; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3255; AVX512DQ-NEXT: vpmullw %ymm4, %ymm5, %ymm5 3256; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3257; AVX512DQ-NEXT: vpand %ymm4, %ymm5, %ymm5 3258; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23] 3259; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3260; AVX512DQ-NEXT: vpmullw %ymm2, %ymm0, %ymm0 3261; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3262; AVX512DQ-NEXT: vpackuswb %ymm5, %ymm0, %ymm0 3263; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31] 3264; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3265; AVX512DQ-NEXT: vpmullw %ymm2, %ymm5, %ymm2 3266; AVX512DQ-NEXT: vpand %ymm4, %ymm2, %ymm2 3267; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23] 3268; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3269; AVX512DQ-NEXT: vpmullw %ymm3, %ymm1, %ymm1 3270; AVX512DQ-NEXT: vpand %ymm4, %ymm1, %ymm1 3271; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm1, %ymm1 3272; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3273; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3274; AVX512DQ-NEXT: vpmullw %ymm2, %ymm3, %ymm2 3275; AVX512DQ-NEXT: vpand %ymm4, %ymm2, %ymm2 3276; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3277; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3278; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3279; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3280; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3281; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 3282; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3283; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3284; AVX512DQ-NEXT: vpmullw %ymm3, %ymm2, %ymm2 3285; AVX512DQ-NEXT: vpand %ymm4, %ymm2, %ymm2 3286; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3287; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3288; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3289; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3290; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3291; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3292; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3293; AVX512DQ-NEXT: vpmullw %ymm0, %ymm1, %ymm0 3294; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3295; AVX512DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1 3296; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3297; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3298; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3299; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3300; AVX512DQ-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3301; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3302; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3303; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3304; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3305; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3306; AVX512DQ-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3307; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3308; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3309; AVX512DQ-NEXT: vpsrlw $8, %xmm0, %xmm1 3310; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3311; AVX512DQ-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3312; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 3313; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 3314; AVX512DQ-NEXT: vzeroupper 3315; AVX512DQ-NEXT: retq 3316; 3317; AVX512DQVL-LABEL: test_v128i8: 3318; AVX512DQVL: # %bb.0: 3319; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31] 3320; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3321; AVX512DQVL-NEXT: vpmullw %ymm4, %ymm5, %ymm4 3322; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm5 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3323; AVX512DQVL-NEXT: vpand %ymm5, %ymm4, %ymm4 3324; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23] 3325; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3326; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm0, %ymm0 3327; AVX512DQVL-NEXT: vpand %ymm5, %ymm0, %ymm0 3328; AVX512DQVL-NEXT: vpackuswb %ymm4, %ymm0, %ymm0 3329; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31] 3330; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3331; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm4, %ymm2 3332; AVX512DQVL-NEXT: vpand %ymm5, %ymm2, %ymm2 3333; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23] 3334; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3335; AVX512DQVL-NEXT: vpmullw %ymm3, %ymm1, %ymm1 3336; AVX512DQVL-NEXT: vpand %ymm5, %ymm1, %ymm1 3337; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm1, %ymm1 3338; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3339; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3340; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm3, %ymm2 3341; AVX512DQVL-NEXT: vpand %ymm5, %ymm2, %ymm2 3342; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3343; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3344; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3345; AVX512DQVL-NEXT: vpand %ymm5, %ymm0, %ymm0 3346; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3347; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 3348; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 3349; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] 3350; AVX512DQVL-NEXT: vpmullw %ymm3, %ymm2, %ymm2 3351; AVX512DQVL-NEXT: vpand %ymm5, %ymm2, %ymm2 3352; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3353; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] 3354; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3355; AVX512DQVL-NEXT: vpand %ymm5, %ymm0, %ymm0 3356; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3357; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3358; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3359; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm1, %ymm0 3360; AVX512DQVL-NEXT: vpand %ymm5, %ymm0, %ymm0 3361; AVX512DQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3362; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3363; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3364; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3365; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3366; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3367; AVX512DQVL-NEXT: vpand %ymm5, %ymm0, %ymm0 3368; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3369; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3370; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3371; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3372; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3373; AVX512DQVL-NEXT: vpand %ymm5, %ymm0, %ymm0 3374; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3375; AVX512DQVL-NEXT: vpsrlw $8, %xmm0, %xmm1 3376; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 3377; AVX512DQVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 3378; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 3379; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 3380; AVX512DQVL-NEXT: vzeroupper 3381; AVX512DQVL-NEXT: retq 3382 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v128i8(<128 x i8> %a0) 3383 ret i8 %1 3384} 3385 3386declare i64 @llvm.experimental.vector.reduce.mul.i64.v2i64(<2 x i64>) 3387declare i64 @llvm.experimental.vector.reduce.mul.i64.v4i64(<4 x i64>) 3388declare i64 @llvm.experimental.vector.reduce.mul.i64.v8i64(<8 x i64>) 3389declare i64 @llvm.experimental.vector.reduce.mul.i64.v16i64(<16 x i64>) 3390 3391declare i32 @llvm.experimental.vector.reduce.mul.i32.v2i32(<2 x i32>) 3392declare i32 @llvm.experimental.vector.reduce.mul.i32.v4i32(<4 x i32>) 3393declare i32 @llvm.experimental.vector.reduce.mul.i32.v8i32(<8 x i32>) 3394declare i32 @llvm.experimental.vector.reduce.mul.i32.v16i32(<16 x i32>) 3395declare i32 @llvm.experimental.vector.reduce.mul.i32.v32i32(<32 x i32>) 3396 3397declare i16 @llvm.experimental.vector.reduce.mul.i16.v2i16(<2 x i16>) 3398declare i16 @llvm.experimental.vector.reduce.mul.i16.v4i16(<4 x i16>) 3399declare i16 @llvm.experimental.vector.reduce.mul.i16.v8i16(<8 x i16>) 3400declare i16 @llvm.experimental.vector.reduce.mul.i16.v16i16(<16 x i16>) 3401declare i16 @llvm.experimental.vector.reduce.mul.i16.v32i16(<32 x i16>) 3402declare i16 @llvm.experimental.vector.reduce.mul.i16.v64i16(<64 x i16>) 3403 3404declare i8 @llvm.experimental.vector.reduce.mul.i8.v2i8(<2 x i8>) 3405declare i8 @llvm.experimental.vector.reduce.mul.i8.v4i8(<4 x i8>) 3406declare i8 @llvm.experimental.vector.reduce.mul.i8.v8i8(<8 x i8>) 3407declare i8 @llvm.experimental.vector.reduce.mul.i8.v16i8(<16 x i8>) 3408declare i8 @llvm.experimental.vector.reduce.mul.i8.v32i8(<32 x i8>) 3409declare i8 @llvm.experimental.vector.reduce.mul.i8.v64i8(<64 x i8>) 3410declare i8 @llvm.experimental.vector.reduce.mul.i8.v128i8(<128 x i8>) 3411