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; AVX512-LABEL: test_v2i32: 794; AVX512: # %bb.0: 795; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 796; AVX512-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 797; AVX512-NEXT: vmovd %xmm0, %eax 798; AVX512-NEXT: retq 799 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v2i32(<2 x i32> %a0) 800 ret i32 %1 801} 802 803define i32 @test_v4i32(<4 x i32> %a0) { 804; SSE2-LABEL: test_v4i32: 805; SSE2: # %bb.0: 806; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 807; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1] 808; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 809; SSE2-NEXT: pmuludq %xmm2, %xmm3 810; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 811; SSE2-NEXT: pmuludq %xmm0, %xmm1 812; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 813; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 814; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 815; SSE2-NEXT: pmuludq %xmm0, %xmm1 816; SSE2-NEXT: movd %xmm1, %eax 817; SSE2-NEXT: retq 818; 819; SSE41-LABEL: test_v4i32: 820; SSE41: # %bb.0: 821; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 822; SSE41-NEXT: pmulld %xmm0, %xmm1 823; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 824; SSE41-NEXT: pmulld %xmm1, %xmm0 825; SSE41-NEXT: movd %xmm0, %eax 826; SSE41-NEXT: retq 827; 828; AVX-LABEL: test_v4i32: 829; AVX: # %bb.0: 830; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 831; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 832; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 833; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 834; AVX-NEXT: vmovd %xmm0, %eax 835; AVX-NEXT: retq 836; 837; AVX512-LABEL: test_v4i32: 838; AVX512: # %bb.0: 839; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 840; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 841; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 842; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 843; AVX512-NEXT: vmovd %xmm0, %eax 844; AVX512-NEXT: retq 845 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v4i32(<4 x i32> %a0) 846 ret i32 %1 847} 848 849define i32 @test_v8i32(<8 x i32> %a0) { 850; SSE2-LABEL: test_v8i32: 851; SSE2: # %bb.0: 852; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 853; SSE2-NEXT: pmuludq %xmm1, %xmm0 854; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 855; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 856; SSE2-NEXT: pmuludq %xmm2, %xmm1 857; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3] 858; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 859; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 860; SSE2-NEXT: pmuludq %xmm0, %xmm2 861; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 862; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,0,0] 863; SSE2-NEXT: pmuludq %xmm1, %xmm2 864; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 865; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 866; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 867; SSE2-NEXT: pmuludq %xmm0, %xmm1 868; SSE2-NEXT: movd %xmm1, %eax 869; SSE2-NEXT: retq 870; 871; SSE41-LABEL: test_v8i32: 872; SSE41: # %bb.0: 873; SSE41-NEXT: pmulld %xmm1, %xmm0 874; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 875; SSE41-NEXT: pmulld %xmm0, %xmm1 876; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 877; SSE41-NEXT: pmulld %xmm1, %xmm0 878; SSE41-NEXT: movd %xmm0, %eax 879; SSE41-NEXT: retq 880; 881; AVX1-LABEL: test_v8i32: 882; AVX1: # %bb.0: 883; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 884; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 885; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 886; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 887; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 888; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 889; AVX1-NEXT: vmovd %xmm0, %eax 890; AVX1-NEXT: vzeroupper 891; AVX1-NEXT: retq 892; 893; AVX2-LABEL: test_v8i32: 894; AVX2: # %bb.0: 895; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 896; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 897; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 898; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 899; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 900; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0 901; AVX2-NEXT: vmovd %xmm0, %eax 902; AVX2-NEXT: vzeroupper 903; AVX2-NEXT: retq 904; 905; AVX512-LABEL: test_v8i32: 906; AVX512: # %bb.0: 907; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 908; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm0 909; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 910; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm0 911; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 912; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 913; AVX512-NEXT: vmovd %xmm0, %eax 914; AVX512-NEXT: vzeroupper 915; AVX512-NEXT: retq 916 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v8i32(<8 x i32> %a0) 917 ret i32 %1 918} 919 920define i32 @test_v16i32(<16 x i32> %a0) { 921; SSE2-LABEL: test_v16i32: 922; SSE2: # %bb.0: 923; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 924; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 925; SSE2-NEXT: pmuludq %xmm4, %xmm5 926; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 927; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 928; SSE2-NEXT: pmuludq %xmm4, %xmm6 929; SSE2-NEXT: pmuludq %xmm5, %xmm6 930; SSE2-NEXT: pmuludq %xmm3, %xmm1 931; SSE2-NEXT: pmuludq %xmm2, %xmm0 932; SSE2-NEXT: pmuludq %xmm1, %xmm0 933; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 934; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3] 935; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 936; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 937; SSE2-NEXT: pmuludq %xmm0, %xmm1 938; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 939; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[2,2,0,0] 940; SSE2-NEXT: pmuludq %xmm6, %xmm1 941; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 942; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 943; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 944; SSE2-NEXT: pmuludq %xmm0, %xmm1 945; SSE2-NEXT: movd %xmm1, %eax 946; SSE2-NEXT: retq 947; 948; SSE41-LABEL: test_v16i32: 949; SSE41: # %bb.0: 950; SSE41-NEXT: pmulld %xmm3, %xmm1 951; SSE41-NEXT: pmulld %xmm2, %xmm0 952; SSE41-NEXT: pmulld %xmm1, %xmm0 953; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 954; SSE41-NEXT: pmulld %xmm0, %xmm1 955; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 956; SSE41-NEXT: pmulld %xmm1, %xmm0 957; SSE41-NEXT: movd %xmm0, %eax 958; SSE41-NEXT: retq 959; 960; AVX1-LABEL: test_v16i32: 961; AVX1: # %bb.0: 962; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 963; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 964; AVX1-NEXT: vpmulld %xmm2, %xmm3, %xmm2 965; AVX1-NEXT: vpmulld %xmm2, %xmm1, %xmm1 966; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 967; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 968; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 969; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 970; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 971; AVX1-NEXT: vmovd %xmm0, %eax 972; AVX1-NEXT: vzeroupper 973; AVX1-NEXT: retq 974; 975; AVX2-LABEL: test_v16i32: 976; AVX2: # %bb.0: 977; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 978; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 979; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 980; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 981; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 982; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 983; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0 984; AVX2-NEXT: vmovd %xmm0, %eax 985; AVX2-NEXT: vzeroupper 986; AVX2-NEXT: retq 987; 988; AVX512-LABEL: test_v16i32: 989; AVX512: # %bb.0: 990; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 991; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 992; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 993; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 994; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 995; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 996; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 997; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 998; AVX512-NEXT: vmovd %xmm0, %eax 999; AVX512-NEXT: vzeroupper 1000; AVX512-NEXT: retq 1001 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v16i32(<16 x i32> %a0) 1002 ret i32 %1 1003} 1004 1005define i32 @test_v32i32(<32 x i32> %a0) { 1006; SSE2-LABEL: test_v32i32: 1007; SSE2: # %bb.0: 1008; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[1,1,3,3] 1009; SSE2-NEXT: pmuludq %xmm6, %xmm2 1010; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3] 1011; SSE2-NEXT: pmuludq %xmm4, %xmm0 1012; SSE2-NEXT: pmuludq %xmm2, %xmm0 1013; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 1014; SSE2-NEXT: pmuludq %xmm7, %xmm3 1015; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3] 1016; SSE2-NEXT: pmuludq %xmm5, %xmm1 1017; SSE2-NEXT: pmuludq %xmm3, %xmm1 1018; SSE2-NEXT: pmuludq %xmm0, %xmm1 1019; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1020; SSE2-NEXT: pmuludq %xmm8, %xmm0 1021; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1022; SSE2-NEXT: pmuludq %xmm9, %xmm3 1023; SSE2-NEXT: pmuludq %xmm0, %xmm3 1024; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] 1025; SSE2-NEXT: pmuludq %xmm2, %xmm0 1026; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1027; SSE2-NEXT: pmuludq %xmm10, %xmm2 1028; SSE2-NEXT: pmuludq %xmm0, %xmm2 1029; SSE2-NEXT: pmuludq %xmm3, %xmm2 1030; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1031; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 1032; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1033; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1034; SSE2-NEXT: pmuludq %xmm0, %xmm1 1035; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1036; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,2,0,0] 1037; SSE2-NEXT: pmuludq %xmm2, %xmm1 1038; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1039; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1040; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1041; SSE2-NEXT: pmuludq %xmm0, %xmm1 1042; SSE2-NEXT: movd %xmm1, %eax 1043; SSE2-NEXT: retq 1044; 1045; SSE41-LABEL: test_v32i32: 1046; SSE41: # %bb.0: 1047; SSE41-NEXT: pmulld %xmm6, %xmm2 1048; SSE41-NEXT: pmulld %xmm4, %xmm0 1049; SSE41-NEXT: pmulld %xmm2, %xmm0 1050; SSE41-NEXT: pmulld %xmm7, %xmm3 1051; SSE41-NEXT: pmulld %xmm5, %xmm1 1052; SSE41-NEXT: pmulld %xmm3, %xmm1 1053; SSE41-NEXT: pmulld %xmm0, %xmm1 1054; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 1055; SSE41-NEXT: pmulld %xmm1, %xmm0 1056; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1057; SSE41-NEXT: pmulld %xmm0, %xmm1 1058; SSE41-NEXT: movd %xmm1, %eax 1059; SSE41-NEXT: retq 1060; 1061; AVX1-LABEL: test_v32i32: 1062; AVX1: # %bb.0: 1063; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm4 1064; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1065; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1066; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm1 1067; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 1068; AVX1-NEXT: vpmulld %xmm1, %xmm3, %xmm1 1069; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1070; AVX1-NEXT: vpmulld %xmm1, %xmm3, %xmm1 1071; AVX1-NEXT: vpmulld %xmm4, %xmm2, %xmm2 1072; AVX1-NEXT: vpmulld %xmm1, %xmm2, %xmm1 1073; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1074; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1075; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1076; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1077; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1078; AVX1-NEXT: vmovd %xmm0, %eax 1079; AVX1-NEXT: vzeroupper 1080; AVX1-NEXT: retq 1081; 1082; AVX2-LABEL: test_v32i32: 1083; AVX2: # %bb.0: 1084; AVX2-NEXT: vpmulld %ymm3, %ymm1, %ymm1 1085; AVX2-NEXT: vpmulld %ymm1, %ymm2, %ymm1 1086; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1087; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1088; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1089; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1090; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1091; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1092; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1093; AVX2-NEXT: vmovd %xmm0, %eax 1094; AVX2-NEXT: vzeroupper 1095; AVX2-NEXT: retq 1096; 1097; AVX512-LABEL: test_v32i32: 1098; AVX512: # %bb.0: 1099; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1100; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1101; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1102; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1103; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1104; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1105; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 1106; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1107; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1108; AVX512-NEXT: vmovd %xmm0, %eax 1109; AVX512-NEXT: vzeroupper 1110; AVX512-NEXT: retq 1111 %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v32i32(<32 x i32> %a0) 1112 ret i32 %1 1113} 1114 1115; 1116; vXi16 1117; 1118 1119define i16 @test_v2i16(<2 x i16> %a0) { 1120; SSE-LABEL: test_v2i16: 1121; SSE: # %bb.0: 1122; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1123; SSE-NEXT: pmuludq %xmm0, %xmm1 1124; SSE-NEXT: movd %xmm1, %eax 1125; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1126; SSE-NEXT: retq 1127; 1128; AVX-LABEL: test_v2i16: 1129; AVX: # %bb.0: 1130; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1131; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1132; AVX-NEXT: vmovd %xmm0, %eax 1133; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1134; AVX-NEXT: retq 1135; 1136; AVX512-LABEL: test_v2i16: 1137; AVX512: # %bb.0: 1138; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1139; AVX512-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1140; AVX512-NEXT: vmovd %xmm0, %eax 1141; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1142; AVX512-NEXT: retq 1143 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v2i16(<2 x i16> %a0) 1144 ret i16 %1 1145} 1146 1147define i16 @test_v4i16(<4 x i16> %a0) { 1148; SSE2-LABEL: test_v4i16: 1149; SSE2: # %bb.0: 1150; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1151; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1] 1152; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 1153; SSE2-NEXT: pmuludq %xmm2, %xmm3 1154; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 1155; SSE2-NEXT: pmuludq %xmm0, %xmm1 1156; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1157; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1158; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1159; SSE2-NEXT: pmuludq %xmm0, %xmm1 1160; SSE2-NEXT: pextrw $0, %xmm1, %eax 1161; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1162; SSE2-NEXT: retq 1163; 1164; SSE41-LABEL: test_v4i16: 1165; SSE41: # %bb.0: 1166; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1167; SSE41-NEXT: pmulld %xmm0, %xmm1 1168; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1169; SSE41-NEXT: pmulld %xmm1, %xmm0 1170; SSE41-NEXT: movd %xmm0, %eax 1171; SSE41-NEXT: # kill: def $ax killed $ax killed $eax 1172; SSE41-NEXT: retq 1173; 1174; AVX-LABEL: test_v4i16: 1175; AVX: # %bb.0: 1176; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1177; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1178; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1179; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1180; AVX-NEXT: vmovd %xmm0, %eax 1181; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1182; AVX-NEXT: retq 1183; 1184; AVX512-LABEL: test_v4i16: 1185; AVX512: # %bb.0: 1186; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1187; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1188; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1189; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1190; AVX512-NEXT: vmovd %xmm0, %eax 1191; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1192; AVX512-NEXT: retq 1193 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v4i16(<4 x i16> %a0) 1194 ret i16 %1 1195} 1196 1197define i16 @test_v8i16(<8 x i16> %a0) { 1198; SSE-LABEL: test_v8i16: 1199; SSE: # %bb.0: 1200; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1201; SSE-NEXT: pmullw %xmm0, %xmm1 1202; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1203; SSE-NEXT: pmullw %xmm1, %xmm0 1204; SSE-NEXT: movdqa %xmm0, %xmm1 1205; SSE-NEXT: psrld $16, %xmm1 1206; SSE-NEXT: pmullw %xmm0, %xmm1 1207; SSE-NEXT: movd %xmm1, %eax 1208; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1209; SSE-NEXT: retq 1210; 1211; AVX-LABEL: test_v8i16: 1212; AVX: # %bb.0: 1213; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1214; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1215; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1216; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1217; AVX-NEXT: vpsrld $16, %xmm0, %xmm1 1218; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1219; AVX-NEXT: vmovd %xmm0, %eax 1220; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1221; AVX-NEXT: retq 1222; 1223; AVX512-LABEL: test_v8i16: 1224; AVX512: # %bb.0: 1225; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1226; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1227; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1228; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1229; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1230; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1231; AVX512-NEXT: vmovd %xmm0, %eax 1232; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1233; AVX512-NEXT: retq 1234 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v8i16(<8 x i16> %a0) 1235 ret i16 %1 1236} 1237 1238define i16 @test_v16i16(<16 x i16> %a0) { 1239; SSE-LABEL: test_v16i16: 1240; SSE: # %bb.0: 1241; SSE-NEXT: pmullw %xmm1, %xmm0 1242; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1243; SSE-NEXT: pmullw %xmm0, %xmm1 1244; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1245; SSE-NEXT: pmullw %xmm1, %xmm0 1246; SSE-NEXT: movdqa %xmm0, %xmm1 1247; SSE-NEXT: psrld $16, %xmm1 1248; SSE-NEXT: pmullw %xmm0, %xmm1 1249; SSE-NEXT: movd %xmm1, %eax 1250; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1251; SSE-NEXT: retq 1252; 1253; AVX1-LABEL: test_v16i16: 1254; AVX1: # %bb.0: 1255; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1256; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1257; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1258; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1259; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1260; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1261; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1 1262; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1263; AVX1-NEXT: vmovd %xmm0, %eax 1264; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1265; AVX1-NEXT: vzeroupper 1266; AVX1-NEXT: retq 1267; 1268; AVX2-LABEL: test_v16i16: 1269; AVX2: # %bb.0: 1270; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1271; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1272; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1273; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1274; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1275; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1276; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1 1277; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1278; AVX2-NEXT: vmovd %xmm0, %eax 1279; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1280; AVX2-NEXT: vzeroupper 1281; AVX2-NEXT: retq 1282; 1283; AVX512-LABEL: test_v16i16: 1284; AVX512: # %bb.0: 1285; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1286; AVX512-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1287; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1288; AVX512-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1289; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1290; AVX512-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1291; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1292; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1293; AVX512-NEXT: vmovd %xmm0, %eax 1294; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1295; AVX512-NEXT: vzeroupper 1296; AVX512-NEXT: retq 1297 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v16i16(<16 x i16> %a0) 1298 ret i16 %1 1299} 1300 1301define i16 @test_v32i16(<32 x i16> %a0) { 1302; SSE-LABEL: test_v32i16: 1303; SSE: # %bb.0: 1304; SSE-NEXT: pmullw %xmm3, %xmm1 1305; SSE-NEXT: pmullw %xmm2, %xmm0 1306; SSE-NEXT: pmullw %xmm1, %xmm0 1307; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1308; SSE-NEXT: pmullw %xmm0, %xmm1 1309; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1310; SSE-NEXT: pmullw %xmm1, %xmm0 1311; SSE-NEXT: movdqa %xmm0, %xmm1 1312; SSE-NEXT: psrld $16, %xmm1 1313; SSE-NEXT: pmullw %xmm0, %xmm1 1314; SSE-NEXT: movd %xmm1, %eax 1315; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1316; SSE-NEXT: retq 1317; 1318; AVX1-LABEL: test_v32i16: 1319; AVX1: # %bb.0: 1320; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1321; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1322; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 1323; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm1 1324; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1325; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1326; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1327; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1328; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1329; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1 1330; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1331; AVX1-NEXT: vmovd %xmm0, %eax 1332; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1333; AVX1-NEXT: vzeroupper 1334; AVX1-NEXT: retq 1335; 1336; AVX2-LABEL: test_v32i16: 1337; AVX2: # %bb.0: 1338; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1339; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1340; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1341; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1342; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1343; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1344; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1345; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1 1346; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1347; AVX2-NEXT: vmovd %xmm0, %eax 1348; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1349; AVX2-NEXT: vzeroupper 1350; AVX2-NEXT: retq 1351; 1352; AVX512BW-LABEL: test_v32i16: 1353; AVX512BW: # %bb.0: 1354; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1355; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1356; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 1357; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1358; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1359; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1360; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1361; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1362; AVX512BW-NEXT: vpsrld $16, %xmm0, %xmm1 1363; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1364; AVX512BW-NEXT: vmovd %xmm0, %eax 1365; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 1366; AVX512BW-NEXT: vzeroupper 1367; AVX512BW-NEXT: retq 1368; 1369; AVX512BWVL-LABEL: test_v32i16: 1370; AVX512BWVL: # %bb.0: 1371; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1372; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1373; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 1374; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1375; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1376; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1377; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1378; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1379; AVX512BWVL-NEXT: vpsrld $16, %xmm0, %xmm1 1380; AVX512BWVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1381; AVX512BWVL-NEXT: vmovd %xmm0, %eax 1382; AVX512BWVL-NEXT: # kill: def $ax killed $ax killed $eax 1383; AVX512BWVL-NEXT: vzeroupper 1384; AVX512BWVL-NEXT: retq 1385; 1386; AVX512DQ-LABEL: test_v32i16: 1387; AVX512DQ: # %bb.0: 1388; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1389; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 1390; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1391; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1392; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1393; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1394; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1395; AVX512DQ-NEXT: vpsrld $16, %xmm0, %xmm1 1396; AVX512DQ-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1397; AVX512DQ-NEXT: vmovd %xmm0, %eax 1398; AVX512DQ-NEXT: # kill: def $ax killed $ax killed $eax 1399; AVX512DQ-NEXT: vzeroupper 1400; AVX512DQ-NEXT: retq 1401; 1402; AVX512DQVL-LABEL: test_v32i16: 1403; AVX512DQVL: # %bb.0: 1404; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1405; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 1406; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1407; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1408; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1409; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1410; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1411; AVX512DQVL-NEXT: vpsrld $16, %xmm0, %xmm1 1412; AVX512DQVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1413; AVX512DQVL-NEXT: vmovd %xmm0, %eax 1414; AVX512DQVL-NEXT: # kill: def $ax killed $ax killed $eax 1415; AVX512DQVL-NEXT: vzeroupper 1416; AVX512DQVL-NEXT: retq 1417 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v32i16(<32 x i16> %a0) 1418 ret i16 %1 1419} 1420 1421define i16 @test_v64i16(<64 x i16> %a0) { 1422; SSE-LABEL: test_v64i16: 1423; SSE: # %bb.0: 1424; SSE-NEXT: pmullw %xmm6, %xmm2 1425; SSE-NEXT: pmullw %xmm4, %xmm0 1426; SSE-NEXT: pmullw %xmm2, %xmm0 1427; SSE-NEXT: pmullw %xmm7, %xmm3 1428; SSE-NEXT: pmullw %xmm5, %xmm1 1429; SSE-NEXT: pmullw %xmm3, %xmm1 1430; SSE-NEXT: pmullw %xmm0, %xmm1 1431; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 1432; SSE-NEXT: pmullw %xmm1, %xmm0 1433; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1434; SSE-NEXT: pmullw %xmm0, %xmm1 1435; SSE-NEXT: movdqa %xmm1, %xmm0 1436; SSE-NEXT: psrld $16, %xmm0 1437; SSE-NEXT: pmullw %xmm1, %xmm0 1438; SSE-NEXT: movd %xmm0, %eax 1439; SSE-NEXT: # kill: def $ax killed $ax killed $eax 1440; SSE-NEXT: retq 1441; 1442; AVX1-LABEL: test_v64i16: 1443; AVX1: # %bb.0: 1444; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm4 1445; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1446; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1447; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1 1448; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 1449; AVX1-NEXT: vpmullw %xmm1, %xmm3, %xmm1 1450; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1451; AVX1-NEXT: vpmullw %xmm1, %xmm3, %xmm1 1452; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm2 1453; AVX1-NEXT: vpmullw %xmm1, %xmm2, %xmm1 1454; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1455; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1456; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1457; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1458; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1459; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1 1460; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1461; AVX1-NEXT: vmovd %xmm0, %eax 1462; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1463; AVX1-NEXT: vzeroupper 1464; AVX1-NEXT: retq 1465; 1466; AVX2-LABEL: test_v64i16: 1467; AVX2: # %bb.0: 1468; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm1 1469; AVX2-NEXT: vpmullw %ymm1, %ymm2, %ymm1 1470; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1471; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1472; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1473; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1474; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1475; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1476; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1477; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1 1478; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1479; AVX2-NEXT: vmovd %xmm0, %eax 1480; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1481; AVX2-NEXT: vzeroupper 1482; AVX2-NEXT: retq 1483; 1484; AVX512BW-LABEL: test_v64i16: 1485; AVX512BW: # %bb.0: 1486; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1487; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1488; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1489; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 1490; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1491; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1492; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1493; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1494; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1495; AVX512BW-NEXT: vpsrld $16, %xmm0, %xmm1 1496; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1497; AVX512BW-NEXT: vmovd %xmm0, %eax 1498; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 1499; AVX512BW-NEXT: vzeroupper 1500; AVX512BW-NEXT: retq 1501; 1502; AVX512BWVL-LABEL: test_v64i16: 1503; AVX512BWVL: # %bb.0: 1504; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1505; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1506; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1507; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 1508; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1509; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1510; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1511; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1512; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 1513; AVX512BWVL-NEXT: vpsrld $16, %xmm0, %xmm1 1514; AVX512BWVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1515; AVX512BWVL-NEXT: vmovd %xmm0, %eax 1516; AVX512BWVL-NEXT: # kill: def $ax killed $ax killed $eax 1517; AVX512BWVL-NEXT: vzeroupper 1518; AVX512BWVL-NEXT: retq 1519; 1520; AVX512DQ-LABEL: test_v64i16: 1521; AVX512DQ: # %bb.0: 1522; AVX512DQ-NEXT: vpmullw %ymm3, %ymm1, %ymm1 1523; AVX512DQ-NEXT: vpmullw %ymm1, %ymm2, %ymm1 1524; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1525; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 1526; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1527; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1528; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1529; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1530; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1531; AVX512DQ-NEXT: vpsrld $16, %xmm0, %xmm1 1532; AVX512DQ-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1533; AVX512DQ-NEXT: vmovd %xmm0, %eax 1534; AVX512DQ-NEXT: # kill: def $ax killed $ax killed $eax 1535; AVX512DQ-NEXT: vzeroupper 1536; AVX512DQ-NEXT: retq 1537; 1538; AVX512DQVL-LABEL: test_v64i16: 1539; AVX512DQVL: # %bb.0: 1540; AVX512DQVL-NEXT: vpmullw %ymm3, %ymm1, %ymm1 1541; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm2, %ymm1 1542; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1543; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 1544; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1545; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1546; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1547; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1548; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1549; AVX512DQVL-NEXT: vpsrld $16, %xmm0, %xmm1 1550; AVX512DQVL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1551; AVX512DQVL-NEXT: vmovd %xmm0, %eax 1552; AVX512DQVL-NEXT: # kill: def $ax killed $ax killed $eax 1553; AVX512DQVL-NEXT: vzeroupper 1554; AVX512DQVL-NEXT: retq 1555 %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v64i16(<64 x i16> %a0) 1556 ret i16 %1 1557} 1558 1559; 1560; vXi8 1561; 1562 1563define i8 @test_v2i8(<2 x i8> %a0) { 1564; SSE2-LABEL: test_v2i8: 1565; SSE2: # %bb.0: 1566; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1567; SSE2-NEXT: pmuludq %xmm0, %xmm1 1568; SSE2-NEXT: movd %xmm1, %eax 1569; SSE2-NEXT: # kill: def $al killed $al killed $eax 1570; SSE2-NEXT: retq 1571; 1572; SSE41-LABEL: test_v2i8: 1573; SSE41: # %bb.0: 1574; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1575; SSE41-NEXT: pmuludq %xmm0, %xmm1 1576; SSE41-NEXT: pextrb $0, %xmm1, %eax 1577; SSE41-NEXT: # kill: def $al killed $al killed $eax 1578; SSE41-NEXT: retq 1579; 1580; AVX-LABEL: test_v2i8: 1581; AVX: # %bb.0: 1582; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1583; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1584; AVX-NEXT: vpextrb $0, %xmm0, %eax 1585; AVX-NEXT: # kill: def $al killed $al killed $eax 1586; AVX-NEXT: retq 1587; 1588; AVX512-LABEL: test_v2i8: 1589; AVX512: # %bb.0: 1590; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1591; AVX512-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 1592; AVX512-NEXT: vpextrb $0, %xmm0, %eax 1593; AVX512-NEXT: # kill: def $al killed $al killed $eax 1594; AVX512-NEXT: retq 1595 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v2i8(<2 x i8> %a0) 1596 ret i8 %1 1597} 1598 1599define i8 @test_v4i8(<4 x i8> %a0) { 1600; SSE2-LABEL: test_v4i8: 1601; SSE2: # %bb.0: 1602; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1603; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1] 1604; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 1605; SSE2-NEXT: pmuludq %xmm2, %xmm3 1606; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 1607; SSE2-NEXT: pmuludq %xmm0, %xmm1 1608; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1609; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1610; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1611; SSE2-NEXT: pmuludq %xmm0, %xmm1 1612; SSE2-NEXT: movd %xmm1, %eax 1613; SSE2-NEXT: # kill: def $al killed $al killed $eax 1614; SSE2-NEXT: retq 1615; 1616; SSE41-LABEL: test_v4i8: 1617; SSE41: # %bb.0: 1618; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1619; SSE41-NEXT: pmulld %xmm0, %xmm1 1620; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1621; SSE41-NEXT: pmulld %xmm1, %xmm0 1622; SSE41-NEXT: pextrb $0, %xmm0, %eax 1623; SSE41-NEXT: # kill: def $al killed $al killed $eax 1624; SSE41-NEXT: retq 1625; 1626; AVX-LABEL: test_v4i8: 1627; AVX: # %bb.0: 1628; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1629; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1630; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1631; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1632; AVX-NEXT: vpextrb $0, %xmm0, %eax 1633; AVX-NEXT: # kill: def $al killed $al killed $eax 1634; AVX-NEXT: retq 1635; 1636; AVX512-LABEL: test_v4i8: 1637; AVX512: # %bb.0: 1638; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1639; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1640; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1641; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1642; AVX512-NEXT: vpextrb $0, %xmm0, %eax 1643; AVX512-NEXT: # kill: def $al killed $al killed $eax 1644; AVX512-NEXT: retq 1645 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v4i8(<4 x i8> %a0) 1646 ret i8 %1 1647} 1648 1649define i8 @test_v8i8(<8 x i8> %a0) { 1650; SSE2-LABEL: test_v8i8: 1651; SSE2: # %bb.0: 1652; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1653; SSE2-NEXT: pmullw %xmm0, %xmm1 1654; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1655; SSE2-NEXT: pmullw %xmm1, %xmm0 1656; SSE2-NEXT: movdqa %xmm0, %xmm1 1657; SSE2-NEXT: psrld $16, %xmm1 1658; SSE2-NEXT: pmullw %xmm0, %xmm1 1659; SSE2-NEXT: movd %xmm1, %eax 1660; SSE2-NEXT: # kill: def $al killed $al killed $eax 1661; SSE2-NEXT: retq 1662; 1663; SSE41-LABEL: test_v8i8: 1664; SSE41: # %bb.0: 1665; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1666; SSE41-NEXT: pmullw %xmm0, %xmm1 1667; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1668; SSE41-NEXT: pmullw %xmm1, %xmm0 1669; SSE41-NEXT: movdqa %xmm0, %xmm1 1670; SSE41-NEXT: psrld $16, %xmm1 1671; SSE41-NEXT: pmullw %xmm0, %xmm1 1672; SSE41-NEXT: pextrb $0, %xmm1, %eax 1673; SSE41-NEXT: # kill: def $al killed $al killed $eax 1674; SSE41-NEXT: retq 1675; 1676; AVX-LABEL: test_v8i8: 1677; AVX: # %bb.0: 1678; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1679; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1680; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1681; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1682; AVX-NEXT: vpsrld $16, %xmm0, %xmm1 1683; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1684; AVX-NEXT: vpextrb $0, %xmm0, %eax 1685; AVX-NEXT: # kill: def $al killed $al killed $eax 1686; AVX-NEXT: retq 1687; 1688; AVX512-LABEL: test_v8i8: 1689; AVX512: # %bb.0: 1690; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1691; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1692; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1693; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1694; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1695; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1696; AVX512-NEXT: vpextrb $0, %xmm0, %eax 1697; AVX512-NEXT: # kill: def $al killed $al killed $eax 1698; AVX512-NEXT: retq 1699 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v8i8(<8 x i8> %a0) 1700 ret i8 %1 1701} 1702 1703define i8 @test_v16i8(<16 x i8> %a0) { 1704; SSE2-LABEL: test_v16i8: 1705; SSE2: # %bb.0: 1706; SSE2-NEXT: movdqa %xmm0, %xmm1 1707; 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] 1708; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1709; SSE2-NEXT: pmullw %xmm1, %xmm0 1710; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1711; SSE2-NEXT: pand %xmm1, %xmm0 1712; SSE2-NEXT: pxor %xmm2, %xmm2 1713; SSE2-NEXT: packuswb %xmm2, %xmm0 1714; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,2,3,3] 1715; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1716; 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] 1717; SSE2-NEXT: pmullw %xmm0, %xmm3 1718; SSE2-NEXT: pand %xmm1, %xmm3 1719; SSE2-NEXT: packuswb %xmm2, %xmm3 1720; SSE2-NEXT: movdqa %xmm3, %xmm0 1721; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1722; SSE2-NEXT: psrldq {{.*#+}} xmm3 = xmm3[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1723; 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] 1724; SSE2-NEXT: pmullw %xmm0, %xmm3 1725; SSE2-NEXT: pand %xmm1, %xmm3 1726; SSE2-NEXT: packuswb %xmm2, %xmm3 1727; SSE2-NEXT: movdqa %xmm3, %xmm0 1728; SSE2-NEXT: psrlw $8, %xmm0 1729; 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] 1730; SSE2-NEXT: pmullw %xmm0, %xmm3 1731; SSE2-NEXT: pand %xmm1, %xmm3 1732; SSE2-NEXT: packuswb %xmm2, %xmm3 1733; SSE2-NEXT: movd %xmm3, %eax 1734; SSE2-NEXT: # kill: def $al killed $al killed $eax 1735; SSE2-NEXT: retq 1736; 1737; SSE41-LABEL: test_v16i8: 1738; SSE41: # %bb.0: 1739; 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 1740; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1741; SSE41-NEXT: pmullw %xmm1, %xmm0 1742; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1743; SSE41-NEXT: pand %xmm1, %xmm0 1744; SSE41-NEXT: pxor %xmm2, %xmm2 1745; SSE41-NEXT: packuswb %xmm2, %xmm0 1746; 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 1747; SSE41-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1748; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1749; SSE41-NEXT: pmullw %xmm3, %xmm0 1750; SSE41-NEXT: pand %xmm1, %xmm0 1751; SSE41-NEXT: packuswb %xmm2, %xmm0 1752; 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 1753; SSE41-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1754; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1755; SSE41-NEXT: pmullw %xmm3, %xmm0 1756; SSE41-NEXT: pand %xmm1, %xmm0 1757; SSE41-NEXT: packuswb %xmm2, %xmm0 1758; 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 1759; SSE41-NEXT: psrlw $8, %xmm0 1760; SSE41-NEXT: pmullw %xmm1, %xmm0 1761; SSE41-NEXT: pextrb $0, %xmm0, %eax 1762; SSE41-NEXT: # kill: def $al killed $al killed $eax 1763; SSE41-NEXT: retq 1764; 1765; AVX1-LABEL: test_v16i8: 1766; AVX1: # %bb.0: 1767; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1768; 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 1769; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1770; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1771; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 1772; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1773; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1774; 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 1775; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1776; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1777; AVX1-NEXT: vpmullw %xmm0, %xmm3, %xmm0 1778; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 1779; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1780; 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 1781; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1782; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1783; AVX1-NEXT: vpmullw %xmm0, %xmm3, %xmm0 1784; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 1785; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1786; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 1787; 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 1788; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1789; AVX1-NEXT: vpextrb $0, %xmm0, %eax 1790; AVX1-NEXT: # kill: def $al killed $al killed $eax 1791; AVX1-NEXT: retq 1792; 1793; AVX2-LABEL: test_v16i8: 1794; AVX2: # %bb.0: 1795; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1796; 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 1797; 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 1798; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1799; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 1800; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1801; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1802; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1803; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 1804; 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 1805; 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 1806; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 1807; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1808; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1809; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1810; AVX2-NEXT: vpsrld $16, %xmm0, %xmm2 1811; 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 1812; 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 1813; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 1814; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1815; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1816; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1817; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 1818; 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 1819; 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 1820; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1821; AVX2-NEXT: vpextrb $0, %xmm0, %eax 1822; AVX2-NEXT: # kill: def $al killed $al killed $eax 1823; AVX2-NEXT: vzeroupper 1824; AVX2-NEXT: retq 1825; 1826; AVX512BW-LABEL: test_v16i8: 1827; AVX512BW: # %bb.0: 1828; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1829; 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 1830; 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 1831; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1832; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 1833; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1834; 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 1835; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1836; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 1837; AVX512BW-NEXT: vpsrld $16, %xmm1, %xmm1 1838; 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 1839; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1840; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 1841; AVX512BW-NEXT: vpsrlw $8, %xmm1, %xmm1 1842; 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 1843; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1844; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 1845; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 1846; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 1847; AVX512BW-NEXT: vzeroupper 1848; AVX512BW-NEXT: retq 1849; 1850; AVX512BWVL-LABEL: test_v16i8: 1851; AVX512BWVL: # %bb.0: 1852; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1853; 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 1854; 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 1855; AVX512BWVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1856; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm1 1857; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1858; 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 1859; AVX512BWVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1860; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm1 1861; AVX512BWVL-NEXT: vpsrld $16, %xmm1, %xmm1 1862; 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 1863; AVX512BWVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1864; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm1 1865; AVX512BWVL-NEXT: vpsrlw $8, %xmm1, %xmm1 1866; 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 1867; AVX512BWVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1868; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0 1869; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 1870; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 1871; AVX512BWVL-NEXT: vzeroupper 1872; AVX512BWVL-NEXT: retq 1873; 1874; AVX512DQ-LABEL: test_v16i8: 1875; AVX512DQ: # %bb.0: 1876; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1877; 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 1878; 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 1879; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1880; 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 1881; AVX512DQ-NEXT: vpmovdb %zmm1, %xmm1 1882; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1883; 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 1884; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1885; 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 1886; AVX512DQ-NEXT: vpmovdb %zmm1, %xmm1 1887; AVX512DQ-NEXT: vpsrld $16, %xmm1, %xmm1 1888; 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 1889; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1890; 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 1891; AVX512DQ-NEXT: vpmovdb %zmm1, %xmm1 1892; AVX512DQ-NEXT: vpsrlw $8, %xmm1, %xmm1 1893; 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 1894; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1895; 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 1896; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 1897; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 1898; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 1899; AVX512DQ-NEXT: vzeroupper 1900; AVX512DQ-NEXT: retq 1901; 1902; AVX512DQVL-LABEL: test_v16i8: 1903; AVX512DQVL: # %bb.0: 1904; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1905; 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 1906; 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 1907; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1908; 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 1909; AVX512DQVL-NEXT: vpmovdb %zmm1, %xmm1 1910; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1911; 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 1912; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1913; 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 1914; AVX512DQVL-NEXT: vpmovdb %zmm1, %xmm1 1915; AVX512DQVL-NEXT: vpsrld $16, %xmm1, %xmm1 1916; 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 1917; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1918; 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 1919; AVX512DQVL-NEXT: vpmovdb %zmm1, %xmm1 1920; AVX512DQVL-NEXT: vpsrlw $8, %xmm1, %xmm1 1921; 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 1922; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1923; 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 1924; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0 1925; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 1926; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 1927; AVX512DQVL-NEXT: vzeroupper 1928; AVX512DQVL-NEXT: retq 1929 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v16i8(<16 x i8> %a0) 1930 ret i8 %1 1931} 1932 1933define i8 @test_v32i8(<32 x i8> %a0) { 1934; SSE2-LABEL: test_v32i8: 1935; SSE2: # %bb.0: 1936; SSE2-NEXT: movdqa %xmm1, %xmm2 1937; 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] 1938; SSE2-NEXT: movdqa %xmm0, %xmm3 1939; 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] 1940; SSE2-NEXT: pmullw %xmm2, %xmm3 1941; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 1942; SSE2-NEXT: pand %xmm2, %xmm3 1943; 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] 1944; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1945; SSE2-NEXT: pmullw %xmm1, %xmm0 1946; SSE2-NEXT: pand %xmm2, %xmm0 1947; SSE2-NEXT: packuswb %xmm3, %xmm0 1948; SSE2-NEXT: movdqa %xmm0, %xmm1 1949; 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] 1950; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1951; SSE2-NEXT: pmullw %xmm1, %xmm0 1952; SSE2-NEXT: pand %xmm2, %xmm0 1953; SSE2-NEXT: pxor %xmm1, %xmm1 1954; SSE2-NEXT: packuswb %xmm1, %xmm0 1955; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,2,3,3] 1956; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1957; 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] 1958; SSE2-NEXT: pmullw %xmm0, %xmm3 1959; SSE2-NEXT: pand %xmm2, %xmm3 1960; SSE2-NEXT: packuswb %xmm1, %xmm3 1961; SSE2-NEXT: movdqa %xmm3, %xmm0 1962; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1963; SSE2-NEXT: psrldq {{.*#+}} xmm3 = xmm3[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1964; 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] 1965; SSE2-NEXT: pmullw %xmm0, %xmm3 1966; SSE2-NEXT: pand %xmm2, %xmm3 1967; SSE2-NEXT: packuswb %xmm1, %xmm3 1968; SSE2-NEXT: movdqa %xmm3, %xmm0 1969; SSE2-NEXT: psrlw $8, %xmm0 1970; 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] 1971; SSE2-NEXT: pmullw %xmm0, %xmm3 1972; SSE2-NEXT: pand %xmm2, %xmm3 1973; SSE2-NEXT: packuswb %xmm1, %xmm3 1974; SSE2-NEXT: movd %xmm3, %eax 1975; SSE2-NEXT: # kill: def $al killed $al killed $eax 1976; SSE2-NEXT: retq 1977; 1978; SSE41-LABEL: test_v32i8: 1979; SSE41: # %bb.0: 1980; 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 1981; 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] 1982; 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 1983; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1984; SSE41-NEXT: pmullw %xmm1, %xmm0 1985; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1986; SSE41-NEXT: pand %xmm1, %xmm0 1987; SSE41-NEXT: pmullw %xmm2, %xmm3 1988; SSE41-NEXT: pand %xmm1, %xmm3 1989; SSE41-NEXT: packuswb %xmm0, %xmm3 1990; 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 1991; 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] 1992; SSE41-NEXT: pmullw %xmm0, %xmm3 1993; SSE41-NEXT: pand %xmm1, %xmm3 1994; SSE41-NEXT: pxor %xmm0, %xmm0 1995; SSE41-NEXT: packuswb %xmm0, %xmm3 1996; 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 1997; SSE41-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1998; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1] 1999; SSE41-NEXT: pmullw %xmm2, %xmm3 2000; SSE41-NEXT: pand %xmm1, %xmm3 2001; SSE41-NEXT: packuswb %xmm0, %xmm3 2002; 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 2003; SSE41-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2004; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,2,3] 2005; SSE41-NEXT: pmullw %xmm2, %xmm3 2006; SSE41-NEXT: pand %xmm1, %xmm3 2007; SSE41-NEXT: packuswb %xmm0, %xmm3 2008; 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 2009; SSE41-NEXT: psrlw $8, %xmm3 2010; SSE41-NEXT: pmullw %xmm0, %xmm3 2011; SSE41-NEXT: pextrb $0, %xmm3, %eax 2012; SSE41-NEXT: # kill: def $al killed $al killed $eax 2013; SSE41-NEXT: retq 2014; 2015; AVX1-LABEL: test_v32i8: 2016; AVX1: # %bb.0: 2017; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2018; 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] 2019; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2020; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 2021; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 2022; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 2023; 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 2024; 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 2025; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2026; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 2027; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2028; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 2029; 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 2030; 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 2031; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2032; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 2033; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 2034; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2035; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 2036; 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 2037; 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 2038; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2039; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 2040; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2041; AVX1-NEXT: vpsrld $16, %xmm0, %xmm2 2042; 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 2043; 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 2044; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2045; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 2046; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2047; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm2 2048; 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 2049; 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 2050; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2051; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 2052; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2053; AVX1-NEXT: vpextrb $0, %xmm0, %eax 2054; AVX1-NEXT: # kill: def $al killed $al killed $eax 2055; AVX1-NEXT: vzeroupper 2056; AVX1-NEXT: retq 2057; 2058; AVX2-LABEL: test_v32i8: 2059; AVX2: # %bb.0: 2060; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 2061; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm1 = 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] 2062; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = 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] 2063; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm3 2064; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2065; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm3 2066; 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] 2067; 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] 2068; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 2069; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 2070; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2071; 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] 2072; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2073; AVX2-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2074; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 2075; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 2076; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2077; 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] 2078; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2079; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2080; AVX2-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2081; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 2082; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2083; 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] 2084; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2085; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2086; AVX2-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2087; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 2088; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2089; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm3 2090; 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] 2091; AVX2-NEXT: vpmullw %ymm3, %ymm0, %ymm0 2092; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 2093; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2094; AVX2-NEXT: vpextrb $0, %xmm0, %eax 2095; AVX2-NEXT: # kill: def $al killed $al killed $eax 2096; AVX2-NEXT: vzeroupper 2097; AVX2-NEXT: retq 2098; 2099; AVX512BW-LABEL: test_v32i8: 2100; AVX512BW: # %bb.0: 2101; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 2102; 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 2103; 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 2104; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2105; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 2106; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2107; 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 2108; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2109; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 2110; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 2111; 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 2112; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2113; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 2114; AVX512BW-NEXT: vpsrld $16, %xmm1, %xmm1 2115; 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 2116; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2117; AVX512BW-NEXT: vpmovwb %zmm0, %ymm1 2118; AVX512BW-NEXT: vpsrlw $8, %xmm1, %xmm1 2119; 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 2120; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2121; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 2122; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 2123; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 2124; AVX512BW-NEXT: vzeroupper 2125; AVX512BW-NEXT: retq 2126; 2127; AVX512BWVL-LABEL: test_v32i8: 2128; AVX512BWVL: # %bb.0: 2129; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 2130; 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 2131; 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 2132; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2133; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm1 2134; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2135; 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 2136; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2137; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm1 2138; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 2139; 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 2140; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2141; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm1 2142; AVX512BWVL-NEXT: vpsrld $16, %xmm1, %xmm1 2143; 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 2144; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2145; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm1 2146; AVX512BWVL-NEXT: vpsrlw $8, %xmm1, %xmm1 2147; 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 2148; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2149; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0 2150; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 2151; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 2152; AVX512BWVL-NEXT: vzeroupper 2153; AVX512BWVL-NEXT: retq 2154; 2155; AVX512DQ-LABEL: test_v32i8: 2156; AVX512DQ: # %bb.0: 2157; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm2 2158; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm1 = 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] 2159; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = 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] 2160; AVX512DQ-NEXT: vpmullw %ymm3, %ymm1, %ymm3 2161; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2162; AVX512DQ-NEXT: vpand %ymm1, %ymm3, %ymm3 2163; 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] 2164; 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] 2165; AVX512DQ-NEXT: vpmullw %ymm2, %ymm0, %ymm0 2166; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0 2167; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2168; 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] 2169; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2170; AVX512DQ-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2171; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0 2172; AVX512DQ-NEXT: vpxor %xmm2, %xmm2, %xmm2 2173; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2174; 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] 2175; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2176; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2177; AVX512DQ-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2178; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0 2179; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2180; 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] 2181; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2182; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2183; AVX512DQ-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2184; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0 2185; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2186; AVX512DQ-NEXT: vpsrlw $8, %xmm0, %xmm3 2187; 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] 2188; AVX512DQ-NEXT: vpmullw %ymm3, %ymm0, %ymm0 2189; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0 2190; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2191; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 2192; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 2193; AVX512DQ-NEXT: vzeroupper 2194; AVX512DQ-NEXT: retq 2195; 2196; AVX512DQVL-LABEL: test_v32i8: 2197; AVX512DQVL: # %bb.0: 2198; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 2199; 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] 2200; 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] 2201; AVX512DQVL-NEXT: vpmullw %ymm3, %ymm2, %ymm2 2202; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2203; AVX512DQVL-NEXT: vpand %ymm3, %ymm2, %ymm2 2204; 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] 2205; 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] 2206; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2207; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2208; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2209; 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] 2210; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2211; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2212; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2213; AVX512DQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2214; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2215; 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] 2216; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2217; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2218; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2219; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2220; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2221; 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] 2222; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2223; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2224; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2225; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2226; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2227; AVX512DQVL-NEXT: vpsrlw $8, %xmm0, %xmm2 2228; 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] 2229; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm0, %ymm0 2230; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2231; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2232; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 2233; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 2234; AVX512DQVL-NEXT: vzeroupper 2235; AVX512DQVL-NEXT: retq 2236 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v32i8(<32 x i8> %a0) 2237 ret i8 %1 2238} 2239 2240define i8 @test_v64i8(<64 x i8> %a0) { 2241; SSE2-LABEL: test_v64i8: 2242; SSE2: # %bb.0: 2243; SSE2-NEXT: movdqa %xmm2, %xmm4 2244; 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] 2245; SSE2-NEXT: movdqa %xmm0, %xmm5 2246; 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] 2247; SSE2-NEXT: pmullw %xmm4, %xmm5 2248; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 2249; SSE2-NEXT: pand %xmm4, %xmm5 2250; 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] 2251; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2252; SSE2-NEXT: pmullw %xmm2, %xmm0 2253; SSE2-NEXT: pand %xmm4, %xmm0 2254; SSE2-NEXT: packuswb %xmm5, %xmm0 2255; SSE2-NEXT: movdqa %xmm3, %xmm2 2256; 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] 2257; SSE2-NEXT: movdqa %xmm1, %xmm5 2258; 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] 2259; SSE2-NEXT: pmullw %xmm2, %xmm5 2260; SSE2-NEXT: pand %xmm4, %xmm5 2261; 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] 2262; 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] 2263; SSE2-NEXT: pmullw %xmm3, %xmm1 2264; SSE2-NEXT: pand %xmm4, %xmm1 2265; SSE2-NEXT: packuswb %xmm5, %xmm1 2266; SSE2-NEXT: movdqa %xmm1, %xmm2 2267; 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] 2268; SSE2-NEXT: movdqa %xmm0, %xmm3 2269; 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] 2270; SSE2-NEXT: pmullw %xmm2, %xmm3 2271; SSE2-NEXT: pand %xmm4, %xmm3 2272; 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] 2273; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2274; SSE2-NEXT: pmullw %xmm1, %xmm0 2275; SSE2-NEXT: pand %xmm4, %xmm0 2276; SSE2-NEXT: packuswb %xmm3, %xmm0 2277; SSE2-NEXT: movdqa %xmm0, %xmm1 2278; 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] 2279; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2280; SSE2-NEXT: pmullw %xmm1, %xmm0 2281; SSE2-NEXT: pand %xmm4, %xmm0 2282; SSE2-NEXT: pxor %xmm1, %xmm1 2283; SSE2-NEXT: packuswb %xmm1, %xmm0 2284; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,2,3,3] 2285; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2286; 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] 2287; SSE2-NEXT: pmullw %xmm0, %xmm2 2288; SSE2-NEXT: pand %xmm4, %xmm2 2289; SSE2-NEXT: packuswb %xmm1, %xmm2 2290; SSE2-NEXT: movdqa %xmm2, %xmm0 2291; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2292; SSE2-NEXT: psrldq {{.*#+}} xmm2 = xmm2[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 2293; 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] 2294; SSE2-NEXT: pmullw %xmm0, %xmm2 2295; SSE2-NEXT: pand %xmm4, %xmm2 2296; SSE2-NEXT: packuswb %xmm1, %xmm2 2297; SSE2-NEXT: movdqa %xmm2, %xmm0 2298; SSE2-NEXT: psrlw $8, %xmm0 2299; 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] 2300; SSE2-NEXT: pmullw %xmm0, %xmm2 2301; SSE2-NEXT: pand %xmm4, %xmm2 2302; SSE2-NEXT: packuswb %xmm1, %xmm2 2303; SSE2-NEXT: movd %xmm2, %eax 2304; SSE2-NEXT: # kill: def $al killed $al killed $eax 2305; SSE2-NEXT: retq 2306; 2307; SSE41-LABEL: test_v64i8: 2308; SSE41: # %bb.0: 2309; 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 2310; 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] 2311; 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 2312; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2313; SSE41-NEXT: pmullw %xmm2, %xmm0 2314; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2315; SSE41-NEXT: pand %xmm2, %xmm0 2316; SSE41-NEXT: pmullw %xmm5, %xmm4 2317; SSE41-NEXT: pand %xmm2, %xmm4 2318; SSE41-NEXT: packuswb %xmm0, %xmm4 2319; 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 2320; 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] 2321; 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 2322; 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] 2323; SSE41-NEXT: pmullw %xmm3, %xmm1 2324; SSE41-NEXT: pand %xmm2, %xmm1 2325; SSE41-NEXT: pmullw %xmm0, %xmm5 2326; SSE41-NEXT: pand %xmm2, %xmm5 2327; SSE41-NEXT: packuswb %xmm1, %xmm5 2328; 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 2329; 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] 2330; 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 2331; 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] 2332; SSE41-NEXT: pmullw %xmm5, %xmm4 2333; SSE41-NEXT: pand %xmm2, %xmm4 2334; SSE41-NEXT: pmullw %xmm0, %xmm1 2335; SSE41-NEXT: pand %xmm2, %xmm1 2336; SSE41-NEXT: packuswb %xmm4, %xmm1 2337; 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 2338; 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] 2339; SSE41-NEXT: pmullw %xmm0, %xmm1 2340; SSE41-NEXT: pand %xmm2, %xmm1 2341; SSE41-NEXT: pxor %xmm0, %xmm0 2342; SSE41-NEXT: packuswb %xmm0, %xmm1 2343; 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 2344; SSE41-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2345; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2346; SSE41-NEXT: pmullw %xmm3, %xmm1 2347; SSE41-NEXT: pand %xmm2, %xmm1 2348; SSE41-NEXT: packuswb %xmm0, %xmm1 2349; 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 2350; SSE41-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2351; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 2352; SSE41-NEXT: pmullw %xmm3, %xmm1 2353; SSE41-NEXT: pand %xmm2, %xmm1 2354; SSE41-NEXT: packuswb %xmm0, %xmm1 2355; 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 2356; SSE41-NEXT: psrlw $8, %xmm1 2357; SSE41-NEXT: pmullw %xmm0, %xmm1 2358; SSE41-NEXT: pextrb $0, %xmm1, %eax 2359; SSE41-NEXT: # kill: def $al killed $al killed $eax 2360; SSE41-NEXT: retq 2361; 2362; AVX1-LABEL: test_v64i8: 2363; AVX1: # %bb.0: 2364; 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] 2365; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2366; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm3 2367; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2368; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm3 2369; 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 2370; 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 2371; AVX1-NEXT: vpmullw %xmm4, %xmm5, %xmm4 2372; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm4 2373; AVX1-NEXT: vpackuswb %xmm3, %xmm4, %xmm3 2374; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2375; 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] 2376; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2377; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2378; AVX1-NEXT: vpmullw %xmm4, %xmm5, %xmm4 2379; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm4 2380; 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 2381; 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 2382; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2383; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2384; AVX1-NEXT: vpackuswb %xmm4, %xmm0, %xmm0 2385; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2386; 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] 2387; AVX1-NEXT: vpmullw %xmm1, %xmm4, %xmm1 2388; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 2389; 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 2390; 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 2391; AVX1-NEXT: vpmullw %xmm0, %xmm3, %xmm0 2392; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2393; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2394; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 2395; 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 2396; 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 2397; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2398; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2399; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 2400; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2401; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,2,3] 2402; 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 2403; 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 2404; AVX1-NEXT: vpmullw %xmm3, %xmm0, %xmm0 2405; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2406; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2407; AVX1-NEXT: vpsrld $16, %xmm0, %xmm3 2408; 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 2409; 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 2410; AVX1-NEXT: vpmullw %xmm3, %xmm0, %xmm0 2411; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2412; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2413; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm3 2414; 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 2415; 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 2416; AVX1-NEXT: vpmullw %xmm3, %xmm0, %xmm0 2417; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2418; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2419; AVX1-NEXT: vpextrb $0, %xmm0, %eax 2420; AVX1-NEXT: # kill: def $al killed $al killed $eax 2421; AVX1-NEXT: vzeroupper 2422; AVX1-NEXT: retq 2423; 2424; AVX2-LABEL: test_v64i8: 2425; AVX2: # %bb.0: 2426; 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] 2427; 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] 2428; AVX2-NEXT: vpmullw %ymm2, %ymm3, %ymm3 2429; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2430; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm3 2431; 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] 2432; 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] 2433; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2434; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2435; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2436; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2437; 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] 2438; 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] 2439; AVX2-NEXT: vpmullw %ymm4, %ymm3, %ymm3 2440; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm3 2441; 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] 2442; 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] 2443; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2444; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2445; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2446; 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] 2447; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2448; AVX2-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2449; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2450; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 2451; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2452; 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] 2453; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2454; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2455; AVX2-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2456; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2457; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2458; 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] 2459; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2460; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2461; AVX2-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2462; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2463; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2464; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm3 2465; 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] 2466; AVX2-NEXT: vpmullw %ymm3, %ymm0, %ymm0 2467; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2468; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2469; AVX2-NEXT: vpextrb $0, %xmm0, %eax 2470; AVX2-NEXT: # kill: def $al killed $al killed $eax 2471; AVX2-NEXT: vzeroupper 2472; AVX2-NEXT: retq 2473; 2474; AVX512BW-LABEL: test_v64i8: 2475; AVX512BW: # %bb.0: 2476; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2477; 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] 2478; 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] 2479; AVX512BW-NEXT: vpmullw %zmm3, %zmm2, %zmm2 2480; 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] 2481; AVX512BW-NEXT: vpandq %zmm3, %zmm2, %zmm2 2482; 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] 2483; 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] 2484; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2485; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2486; AVX512BW-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 2487; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 2488; 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] 2489; 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] 2490; AVX512BW-NEXT: vpmullw %zmm4, %zmm2, %zmm2 2491; AVX512BW-NEXT: vpandq %zmm3, %zmm2, %zmm2 2492; 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] 2493; 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] 2494; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2495; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2496; AVX512BW-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 2497; 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] 2498; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2499; AVX512BW-NEXT: vpmullw %zmm0, %zmm1, %zmm0 2500; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2501; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 2502; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2503; 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] 2504; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2505; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2506; AVX512BW-NEXT: vpmullw %zmm0, %zmm2, %zmm0 2507; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2508; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2509; 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] 2510; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2511; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2512; AVX512BW-NEXT: vpmullw %zmm0, %zmm2, %zmm0 2513; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2514; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2515; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm2 2516; 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] 2517; AVX512BW-NEXT: vpmullw %zmm2, %zmm0, %zmm0 2518; AVX512BW-NEXT: vpandq %zmm3, %zmm0, %zmm0 2519; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2520; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 2521; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 2522; AVX512BW-NEXT: vzeroupper 2523; AVX512BW-NEXT: retq 2524; 2525; AVX512BWVL-LABEL: test_v64i8: 2526; AVX512BWVL: # %bb.0: 2527; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2528; 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] 2529; 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] 2530; AVX512BWVL-NEXT: vpmullw %zmm3, %zmm2, %zmm2 2531; 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] 2532; AVX512BWVL-NEXT: vpandq %zmm3, %zmm2, %zmm2 2533; 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] 2534; 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] 2535; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2536; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2537; AVX512BWVL-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 2538; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 2539; 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] 2540; 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] 2541; AVX512BWVL-NEXT: vpmullw %zmm4, %zmm2, %zmm2 2542; AVX512BWVL-NEXT: vpandq %zmm3, %zmm2, %zmm2 2543; 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] 2544; 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] 2545; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 2546; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2547; AVX512BWVL-NEXT: vpackuswb %zmm2, %zmm0, %zmm0 2548; 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] 2549; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2550; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm1, %zmm0 2551; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2552; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2553; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2554; 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] 2555; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2556; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2557; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm2, %zmm0 2558; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2559; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2560; 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] 2561; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2562; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2563; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm2, %zmm0 2564; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2565; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2566; AVX512BWVL-NEXT: vpsrlw $8, %xmm0, %xmm2 2567; 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] 2568; AVX512BWVL-NEXT: vpmullw %zmm2, %zmm0, %zmm0 2569; AVX512BWVL-NEXT: vpandq %zmm3, %zmm0, %zmm0 2570; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 2571; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 2572; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 2573; AVX512BWVL-NEXT: vzeroupper 2574; AVX512BWVL-NEXT: retq 2575; 2576; AVX512DQ-LABEL: test_v64i8: 2577; AVX512DQ: # %bb.0: 2578; 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] 2579; 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] 2580; AVX512DQ-NEXT: vpmullw %ymm2, %ymm3, %ymm3 2581; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2582; AVX512DQ-NEXT: vpand %ymm2, %ymm3, %ymm3 2583; 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] 2584; 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] 2585; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2586; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2587; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2588; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 2589; 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] 2590; 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] 2591; AVX512DQ-NEXT: vpmullw %ymm4, %ymm3, %ymm3 2592; AVX512DQ-NEXT: vpand %ymm2, %ymm3, %ymm3 2593; 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] 2594; 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] 2595; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2596; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2597; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm0, %ymm0 2598; 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] 2599; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2600; AVX512DQ-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2601; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2602; AVX512DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1 2603; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2604; 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] 2605; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2606; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2607; AVX512DQ-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2608; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2609; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2610; 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] 2611; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2612; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2613; AVX512DQ-NEXT: vpmullw %ymm0, %ymm3, %ymm0 2614; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2615; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2616; AVX512DQ-NEXT: vpsrlw $8, %xmm0, %xmm3 2617; 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] 2618; AVX512DQ-NEXT: vpmullw %ymm3, %ymm0, %ymm0 2619; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 2620; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2621; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 2622; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 2623; AVX512DQ-NEXT: vzeroupper 2624; AVX512DQ-NEXT: retq 2625; 2626; AVX512DQVL-LABEL: test_v64i8: 2627; AVX512DQVL: # %bb.0: 2628; 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] 2629; 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] 2630; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm3, %ymm2 2631; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2632; AVX512DQVL-NEXT: vpand %ymm3, %ymm2, %ymm2 2633; 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] 2634; 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] 2635; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2636; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2637; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2638; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 2639; 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] 2640; 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] 2641; AVX512DQVL-NEXT: vpmullw %ymm4, %ymm2, %ymm2 2642; AVX512DQVL-NEXT: vpand %ymm3, %ymm2, %ymm2 2643; 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] 2644; 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] 2645; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2646; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2647; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 2648; 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] 2649; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2650; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm1, %ymm0 2651; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2652; AVX512DQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2653; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2654; 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] 2655; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2656; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2657; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2658; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2659; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2660; 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] 2661; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2662; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 2663; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 2664; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2665; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2666; AVX512DQVL-NEXT: vpsrlw $8, %xmm0, %xmm2 2667; 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] 2668; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm0, %ymm0 2669; AVX512DQVL-NEXT: vpand %ymm3, %ymm0, %ymm0 2670; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2671; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 2672; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 2673; AVX512DQVL-NEXT: vzeroupper 2674; AVX512DQVL-NEXT: retq 2675 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v64i8(<64 x i8> %a0) 2676 ret i8 %1 2677} 2678 2679define i8 @test_v128i8(<128 x i8> %a0) { 2680; SSE2-LABEL: test_v128i8: 2681; SSE2: # %bb.0: 2682; SSE2-NEXT: movdqa %xmm5, %xmm8 2683; 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] 2684; SSE2-NEXT: movdqa %xmm1, %xmm9 2685; 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] 2686; SSE2-NEXT: pmullw %xmm8, %xmm9 2687; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255] 2688; SSE2-NEXT: pand %xmm8, %xmm9 2689; 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] 2690; 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] 2691; SSE2-NEXT: pmullw %xmm5, %xmm1 2692; SSE2-NEXT: pand %xmm8, %xmm1 2693; SSE2-NEXT: packuswb %xmm9, %xmm1 2694; SSE2-NEXT: movdqa %xmm7, %xmm9 2695; 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] 2696; SSE2-NEXT: movdqa %xmm3, %xmm5 2697; 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] 2698; SSE2-NEXT: pmullw %xmm9, %xmm5 2699; SSE2-NEXT: pand %xmm8, %xmm5 2700; 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] 2701; 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] 2702; SSE2-NEXT: pmullw %xmm7, %xmm3 2703; SSE2-NEXT: pand %xmm8, %xmm3 2704; SSE2-NEXT: packuswb %xmm5, %xmm3 2705; SSE2-NEXT: movdqa %xmm4, %xmm5 2706; 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] 2707; SSE2-NEXT: movdqa %xmm0, %xmm7 2708; 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] 2709; SSE2-NEXT: pmullw %xmm5, %xmm7 2710; SSE2-NEXT: pand %xmm8, %xmm7 2711; 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] 2712; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2713; SSE2-NEXT: pmullw %xmm4, %xmm0 2714; SSE2-NEXT: pand %xmm8, %xmm0 2715; SSE2-NEXT: packuswb %xmm7, %xmm0 2716; SSE2-NEXT: movdqa %xmm6, %xmm4 2717; 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] 2718; SSE2-NEXT: movdqa %xmm2, %xmm5 2719; 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] 2720; SSE2-NEXT: pmullw %xmm4, %xmm5 2721; SSE2-NEXT: pand %xmm8, %xmm5 2722; 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] 2723; 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] 2724; SSE2-NEXT: pmullw %xmm6, %xmm2 2725; SSE2-NEXT: pand %xmm8, %xmm2 2726; SSE2-NEXT: packuswb %xmm5, %xmm2 2727; SSE2-NEXT: movdqa %xmm2, %xmm4 2728; 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] 2729; SSE2-NEXT: movdqa %xmm0, %xmm5 2730; 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] 2731; SSE2-NEXT: pmullw %xmm4, %xmm5 2732; SSE2-NEXT: pand %xmm8, %xmm5 2733; 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] 2734; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2735; SSE2-NEXT: pmullw %xmm2, %xmm0 2736; SSE2-NEXT: pand %xmm8, %xmm0 2737; SSE2-NEXT: packuswb %xmm5, %xmm0 2738; SSE2-NEXT: movdqa %xmm3, %xmm2 2739; 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] 2740; SSE2-NEXT: movdqa %xmm1, %xmm4 2741; 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] 2742; SSE2-NEXT: pmullw %xmm2, %xmm4 2743; SSE2-NEXT: pand %xmm8, %xmm4 2744; 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] 2745; 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] 2746; SSE2-NEXT: pmullw %xmm3, %xmm1 2747; SSE2-NEXT: pand %xmm8, %xmm1 2748; SSE2-NEXT: packuswb %xmm4, %xmm1 2749; SSE2-NEXT: movdqa %xmm1, %xmm2 2750; 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] 2751; SSE2-NEXT: movdqa %xmm0, %xmm3 2752; 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] 2753; SSE2-NEXT: pmullw %xmm2, %xmm3 2754; SSE2-NEXT: pand %xmm8, %xmm3 2755; 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] 2756; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2757; SSE2-NEXT: pmullw %xmm1, %xmm0 2758; SSE2-NEXT: pand %xmm8, %xmm0 2759; SSE2-NEXT: packuswb %xmm3, %xmm0 2760; SSE2-NEXT: movdqa %xmm0, %xmm1 2761; 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] 2762; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2763; SSE2-NEXT: pmullw %xmm1, %xmm0 2764; SSE2-NEXT: pand %xmm8, %xmm0 2765; SSE2-NEXT: pxor %xmm1, %xmm1 2766; SSE2-NEXT: packuswb %xmm1, %xmm0 2767; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,2,3,3] 2768; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2769; 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] 2770; SSE2-NEXT: pmullw %xmm0, %xmm2 2771; SSE2-NEXT: pand %xmm8, %xmm2 2772; SSE2-NEXT: packuswb %xmm1, %xmm2 2773; SSE2-NEXT: movdqa %xmm2, %xmm0 2774; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2775; SSE2-NEXT: psrldq {{.*#+}} xmm2 = xmm2[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 2776; 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] 2777; SSE2-NEXT: pmullw %xmm0, %xmm2 2778; SSE2-NEXT: pand %xmm8, %xmm2 2779; SSE2-NEXT: packuswb %xmm1, %xmm2 2780; SSE2-NEXT: movdqa %xmm2, %xmm0 2781; SSE2-NEXT: psrlw $8, %xmm0 2782; 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] 2783; SSE2-NEXT: pmullw %xmm0, %xmm2 2784; SSE2-NEXT: pand %xmm8, %xmm2 2785; SSE2-NEXT: packuswb %xmm1, %xmm2 2786; SSE2-NEXT: movd %xmm2, %eax 2787; SSE2-NEXT: # kill: def $al killed $al killed $eax 2788; SSE2-NEXT: retq 2789; 2790; SSE41-LABEL: test_v128i8: 2791; SSE41: # %bb.0: 2792; 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 2793; 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] 2794; 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 2795; 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] 2796; SSE41-NEXT: pmullw %xmm5, %xmm1 2797; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 2798; SSE41-NEXT: pand %xmm5, %xmm1 2799; SSE41-NEXT: pmullw %xmm9, %xmm8 2800; SSE41-NEXT: pand %xmm5, %xmm8 2801; SSE41-NEXT: packuswb %xmm1, %xmm8 2802; 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 2803; 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] 2804; 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 2805; 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] 2806; SSE41-NEXT: pmullw %xmm7, %xmm3 2807; SSE41-NEXT: pand %xmm5, %xmm3 2808; SSE41-NEXT: pmullw %xmm9, %xmm1 2809; SSE41-NEXT: pand %xmm5, %xmm1 2810; SSE41-NEXT: packuswb %xmm3, %xmm1 2811; 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 2812; 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] 2813; 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 2814; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2815; SSE41-NEXT: pmullw %xmm4, %xmm0 2816; SSE41-NEXT: pand %xmm5, %xmm0 2817; SSE41-NEXT: pmullw %xmm7, %xmm3 2818; SSE41-NEXT: pand %xmm5, %xmm3 2819; SSE41-NEXT: packuswb %xmm0, %xmm3 2820; 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 2821; 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] 2822; 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 2823; 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] 2824; SSE41-NEXT: pmullw %xmm6, %xmm2 2825; SSE41-NEXT: pand %xmm5, %xmm2 2826; SSE41-NEXT: pmullw %xmm0, %xmm4 2827; SSE41-NEXT: pand %xmm5, %xmm4 2828; SSE41-NEXT: packuswb %xmm2, %xmm4 2829; 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 2830; 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] 2831; 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 2832; 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] 2833; SSE41-NEXT: pmullw %xmm4, %xmm3 2834; SSE41-NEXT: pand %xmm5, %xmm3 2835; SSE41-NEXT: pmullw %xmm2, %xmm0 2836; SSE41-NEXT: pand %xmm5, %xmm0 2837; SSE41-NEXT: packuswb %xmm3, %xmm0 2838; 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 2839; 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] 2840; 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 2841; 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] 2842; SSE41-NEXT: pmullw %xmm1, %xmm8 2843; SSE41-NEXT: pand %xmm5, %xmm8 2844; SSE41-NEXT: pmullw %xmm2, %xmm3 2845; SSE41-NEXT: pand %xmm5, %xmm3 2846; SSE41-NEXT: packuswb %xmm8, %xmm3 2847; 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 2848; 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] 2849; 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 2850; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2851; SSE41-NEXT: pmullw %xmm3, %xmm0 2852; SSE41-NEXT: pand %xmm5, %xmm0 2853; SSE41-NEXT: pmullw %xmm1, %xmm2 2854; SSE41-NEXT: pand %xmm5, %xmm2 2855; SSE41-NEXT: packuswb %xmm0, %xmm2 2856; 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 2857; 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] 2858; SSE41-NEXT: pmullw %xmm0, %xmm2 2859; SSE41-NEXT: pand %xmm5, %xmm2 2860; SSE41-NEXT: pxor %xmm0, %xmm0 2861; SSE41-NEXT: packuswb %xmm0, %xmm2 2862; 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 2863; SSE41-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2864; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 2865; SSE41-NEXT: pmullw %xmm1, %xmm2 2866; SSE41-NEXT: pand %xmm5, %xmm2 2867; SSE41-NEXT: packuswb %xmm0, %xmm2 2868; 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 2869; SSE41-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2870; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,2,3] 2871; SSE41-NEXT: pmullw %xmm1, %xmm2 2872; SSE41-NEXT: pand %xmm5, %xmm2 2873; SSE41-NEXT: packuswb %xmm0, %xmm2 2874; 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 2875; SSE41-NEXT: psrlw $8, %xmm2 2876; SSE41-NEXT: pmullw %xmm0, %xmm2 2877; SSE41-NEXT: pextrb $0, %xmm2, %eax 2878; SSE41-NEXT: # kill: def $al killed $al killed $eax 2879; SSE41-NEXT: retq 2880; 2881; AVX1-LABEL: test_v128i8: 2882; AVX1: # %bb.0: 2883; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 2884; 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] 2885; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 2886; 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] 2887; AVX1-NEXT: vpmullw %xmm4, %xmm7, %xmm7 2888; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 2889; AVX1-NEXT: vpand %xmm4, %xmm7, %xmm7 2890; 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 2891; 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 2892; AVX1-NEXT: vpmullw %xmm5, %xmm6, %xmm5 2893; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm5 2894; AVX1-NEXT: vpackuswb %xmm7, %xmm5, %xmm8 2895; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 2896; 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] 2897; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2898; 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] 2899; AVX1-NEXT: vpmullw %xmm9, %xmm7, %xmm7 2900; AVX1-NEXT: vpand %xmm4, %xmm7, %xmm7 2901; 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 2902; 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 2903; AVX1-NEXT: vpmullw %xmm6, %xmm5, %xmm5 2904; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm5 2905; AVX1-NEXT: vpackuswb %xmm7, %xmm5, %xmm6 2906; 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] 2907; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm7 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2908; AVX1-NEXT: vpmullw %xmm5, %xmm7, %xmm5 2909; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm5 2910; 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 2911; 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 2912; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2913; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2914; AVX1-NEXT: vpackuswb %xmm5, %xmm0, %xmm0 2915; 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] 2916; 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] 2917; AVX1-NEXT: vpmullw %xmm2, %xmm5, %xmm2 2918; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2919; 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 2920; 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 2921; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1 2922; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2923; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 2924; 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] 2925; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2926; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 2927; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2928; 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 2929; 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 2930; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2931; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2932; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2933; 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] 2934; 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] 2935; AVX1-NEXT: vpmullw %xmm1, %xmm2, %xmm1 2936; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2937; 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 2938; 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 2939; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 2940; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2941; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm1 2942; 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] 2943; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2944; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 2945; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2946; 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 2947; 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 2948; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2949; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2950; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2951; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 2952; 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 2953; 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 2954; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2955; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2956; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 2957; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2958; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 2959; 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 2960; 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 2961; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2962; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2963; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2964; AVX1-NEXT: vpsrld $16, %xmm0, %xmm2 2965; 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 2966; 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 2967; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2968; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2969; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2970; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm2 2971; 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 2972; 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 2973; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 2974; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2975; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2976; AVX1-NEXT: vpextrb $0, %xmm0, %eax 2977; AVX1-NEXT: # kill: def $al killed $al killed $eax 2978; AVX1-NEXT: vzeroupper 2979; AVX1-NEXT: retq 2980; 2981; AVX2-LABEL: test_v128i8: 2982; AVX2: # %bb.0: 2983; 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] 2984; 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] 2985; AVX2-NEXT: vpmullw %ymm4, %ymm5, %ymm5 2986; AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2987; AVX2-NEXT: vpand %ymm4, %ymm5, %ymm5 2988; 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] 2989; 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] 2990; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 2991; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 2992; AVX2-NEXT: vpackuswb %ymm5, %ymm0, %ymm0 2993; 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] 2994; 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] 2995; AVX2-NEXT: vpmullw %ymm2, %ymm5, %ymm2 2996; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2 2997; 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] 2998; 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] 2999; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm1 3000; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1 3001; AVX2-NEXT: vpackuswb %ymm2, %ymm1, %ymm1 3002; 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] 3003; 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] 3004; AVX2-NEXT: vpmullw %ymm2, %ymm3, %ymm2 3005; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2 3006; 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] 3007; 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] 3008; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3009; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3010; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3011; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3012; 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] 3013; 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] 3014; AVX2-NEXT: vpmullw %ymm3, %ymm2, %ymm2 3015; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2 3016; 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] 3017; 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] 3018; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3019; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3020; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3021; 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] 3022; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3023; AVX2-NEXT: vpmullw %ymm0, %ymm1, %ymm0 3024; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3025; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 3026; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3027; 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] 3028; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3029; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3030; AVX2-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3031; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3032; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3033; 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] 3034; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3035; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3036; AVX2-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3037; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3038; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3039; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm2 3040; 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] 3041; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm0 3042; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 3043; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3044; AVX2-NEXT: vpextrb $0, %xmm0, %eax 3045; AVX2-NEXT: # kill: def $al killed $al killed $eax 3046; AVX2-NEXT: vzeroupper 3047; AVX2-NEXT: retq 3048; 3049; AVX512BW-LABEL: test_v128i8: 3050; AVX512BW: # %bb.0: 3051; 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] 3052; 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] 3053; AVX512BW-NEXT: vpmullw %zmm2, %zmm3, %zmm3 3054; AVX512BW-NEXT: vmovdqa64 {{.*#+}} zmm2 = [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] 3055; AVX512BW-NEXT: vpandq %zmm2, %zmm3, %zmm3 3056; 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] 3057; 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] 3058; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3059; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0 3060; AVX512BW-NEXT: vpackuswb %zmm3, %zmm0, %zmm0 3061; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 3062; 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] 3063; 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] 3064; AVX512BW-NEXT: vpmullw %zmm4, %zmm3, %zmm3 3065; AVX512BW-NEXT: vpandq %zmm2, %zmm3, %zmm3 3066; 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] 3067; 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] 3068; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3069; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0 3070; AVX512BW-NEXT: vpackuswb %zmm3, %zmm0, %zmm0 3071; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 3072; 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] 3073; 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] 3074; AVX512BW-NEXT: vpmullw %zmm4, %zmm3, %zmm3 3075; AVX512BW-NEXT: vpandq %zmm2, %zmm3, %zmm3 3076; 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] 3077; 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] 3078; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3079; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0 3080; AVX512BW-NEXT: vpackuswb %zmm3, %zmm0, %zmm0 3081; 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] 3082; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3083; AVX512BW-NEXT: vpmullw %zmm0, %zmm1, %zmm0 3084; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0 3085; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 3086; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3087; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm3 = 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] 3088; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3089; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3090; AVX512BW-NEXT: vpmullw %zmm0, %zmm3, %zmm0 3091; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0 3092; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3093; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm3 = 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] 3094; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3095; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3096; AVX512BW-NEXT: vpmullw %zmm0, %zmm3, %zmm0 3097; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0 3098; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3099; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm3 3100; 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] 3101; AVX512BW-NEXT: vpmullw %zmm3, %zmm0, %zmm0 3102; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0 3103; AVX512BW-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3104; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 3105; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 3106; AVX512BW-NEXT: vzeroupper 3107; AVX512BW-NEXT: retq 3108; 3109; AVX512BWVL-LABEL: test_v128i8: 3110; AVX512BWVL: # %bb.0: 3111; 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] 3112; 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] 3113; AVX512BWVL-NEXT: vpmullw %zmm2, %zmm3, %zmm3 3114; AVX512BWVL-NEXT: vmovdqa64 {{.*#+}} zmm2 = [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] 3115; AVX512BWVL-NEXT: vpandq %zmm2, %zmm3, %zmm3 3116; 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] 3117; 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] 3118; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3119; AVX512BWVL-NEXT: vpandq %zmm2, %zmm0, %zmm0 3120; AVX512BWVL-NEXT: vpackuswb %zmm3, %zmm0, %zmm0 3121; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 3122; 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] 3123; 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] 3124; AVX512BWVL-NEXT: vpmullw %zmm4, %zmm3, %zmm3 3125; AVX512BWVL-NEXT: vpandq %zmm2, %zmm3, %zmm3 3126; 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] 3127; 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] 3128; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3129; AVX512BWVL-NEXT: vpandq %zmm2, %zmm0, %zmm0 3130; AVX512BWVL-NEXT: vpackuswb %zmm3, %zmm0, %zmm0 3131; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1 3132; 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] 3133; 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] 3134; AVX512BWVL-NEXT: vpmullw %zmm4, %zmm3, %zmm3 3135; AVX512BWVL-NEXT: vpandq %zmm2, %zmm3, %zmm3 3136; 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] 3137; 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] 3138; AVX512BWVL-NEXT: vpmullw %zmm1, %zmm0, %zmm0 3139; AVX512BWVL-NEXT: vpandq %zmm2, %zmm0, %zmm0 3140; AVX512BWVL-NEXT: vpackuswb %zmm3, %zmm0, %zmm0 3141; 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] 3142; AVX512BWVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3143; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm1, %zmm0 3144; AVX512BWVL-NEXT: vpandq %zmm2, %zmm0, %zmm0 3145; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3146; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3147; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm3 = 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] 3148; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3149; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3150; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm3, %zmm0 3151; AVX512BWVL-NEXT: vpandq %zmm2, %zmm0, %zmm0 3152; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3153; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} zmm3 = 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] 3154; AVX512BWVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3155; AVX512BWVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3156; AVX512BWVL-NEXT: vpmullw %zmm0, %zmm3, %zmm0 3157; AVX512BWVL-NEXT: vpandq %zmm2, %zmm0, %zmm0 3158; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3159; AVX512BWVL-NEXT: vpsrlw $8, %xmm0, %xmm3 3160; 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] 3161; AVX512BWVL-NEXT: vpmullw %zmm3, %zmm0, %zmm0 3162; AVX512BWVL-NEXT: vpandq %zmm2, %zmm0, %zmm0 3163; AVX512BWVL-NEXT: vpackuswb %zmm1, %zmm0, %zmm0 3164; AVX512BWVL-NEXT: vpextrb $0, %xmm0, %eax 3165; AVX512BWVL-NEXT: # kill: def $al killed $al killed $eax 3166; AVX512BWVL-NEXT: vzeroupper 3167; AVX512BWVL-NEXT: retq 3168; 3169; AVX512DQ-LABEL: test_v128i8: 3170; AVX512DQ: # %bb.0: 3171; 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] 3172; 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] 3173; AVX512DQ-NEXT: vpmullw %ymm4, %ymm5, %ymm5 3174; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3175; AVX512DQ-NEXT: vpand %ymm4, %ymm5, %ymm5 3176; 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] 3177; 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] 3178; AVX512DQ-NEXT: vpmullw %ymm2, %ymm0, %ymm0 3179; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3180; AVX512DQ-NEXT: vpackuswb %ymm5, %ymm0, %ymm0 3181; 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] 3182; 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] 3183; AVX512DQ-NEXT: vpmullw %ymm2, %ymm5, %ymm2 3184; AVX512DQ-NEXT: vpand %ymm4, %ymm2, %ymm2 3185; 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] 3186; 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] 3187; AVX512DQ-NEXT: vpmullw %ymm3, %ymm1, %ymm1 3188; AVX512DQ-NEXT: vpand %ymm4, %ymm1, %ymm1 3189; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm1, %ymm1 3190; 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] 3191; 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] 3192; AVX512DQ-NEXT: vpmullw %ymm2, %ymm3, %ymm2 3193; AVX512DQ-NEXT: vpand %ymm4, %ymm2, %ymm2 3194; 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] 3195; 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] 3196; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3197; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3198; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3199; AVX512DQ-NEXT: vextracti128 $1, %ymm0, %xmm1 3200; 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] 3201; 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] 3202; AVX512DQ-NEXT: vpmullw %ymm3, %ymm2, %ymm2 3203; AVX512DQ-NEXT: vpand %ymm4, %ymm2, %ymm2 3204; 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] 3205; 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] 3206; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3207; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3208; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3209; 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] 3210; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3211; AVX512DQ-NEXT: vpmullw %ymm0, %ymm1, %ymm0 3212; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3213; AVX512DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1 3214; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3215; 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] 3216; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3217; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3218; AVX512DQ-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3219; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3220; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3221; 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] 3222; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3223; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3224; AVX512DQ-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3225; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3226; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3227; AVX512DQ-NEXT: vpsrlw $8, %xmm0, %xmm2 3228; 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] 3229; AVX512DQ-NEXT: vpmullw %ymm2, %ymm0, %ymm0 3230; AVX512DQ-NEXT: vpand %ymm4, %ymm0, %ymm0 3231; AVX512DQ-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3232; AVX512DQ-NEXT: vpextrb $0, %xmm0, %eax 3233; AVX512DQ-NEXT: # kill: def $al killed $al killed $eax 3234; AVX512DQ-NEXT: vzeroupper 3235; AVX512DQ-NEXT: retq 3236; 3237; AVX512DQVL-LABEL: test_v128i8: 3238; AVX512DQVL: # %bb.0: 3239; 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] 3240; 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] 3241; AVX512DQVL-NEXT: vpmullw %ymm4, %ymm5, %ymm5 3242; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3243; AVX512DQVL-NEXT: vpand %ymm4, %ymm5, %ymm5 3244; 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] 3245; 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] 3246; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm0, %ymm0 3247; AVX512DQVL-NEXT: vpand %ymm4, %ymm0, %ymm0 3248; AVX512DQVL-NEXT: vpackuswb %ymm5, %ymm0, %ymm0 3249; 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] 3250; AVX512DQVL-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] 3251; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm5, %ymm2 3252; AVX512DQVL-NEXT: vpand %ymm4, %ymm2, %ymm2 3253; 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] 3254; 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] 3255; AVX512DQVL-NEXT: vpmullw %ymm3, %ymm1, %ymm1 3256; AVX512DQVL-NEXT: vpand %ymm4, %ymm1, %ymm1 3257; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm1, %ymm1 3258; 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] 3259; 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] 3260; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm3, %ymm2 3261; AVX512DQVL-NEXT: vpand %ymm4, %ymm2, %ymm2 3262; 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] 3263; 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] 3264; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3265; AVX512DQVL-NEXT: vpand %ymm4, %ymm0, %ymm0 3266; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3267; AVX512DQVL-NEXT: vextracti128 $1, %ymm0, %xmm1 3268; 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] 3269; 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] 3270; AVX512DQVL-NEXT: vpmullw %ymm3, %ymm2, %ymm2 3271; AVX512DQVL-NEXT: vpand %ymm4, %ymm2, %ymm2 3272; 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] 3273; 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] 3274; AVX512DQVL-NEXT: vpmullw %ymm1, %ymm0, %ymm0 3275; AVX512DQVL-NEXT: vpand %ymm4, %ymm0, %ymm0 3276; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 3277; 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] 3278; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 3279; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm1, %ymm0 3280; AVX512DQVL-NEXT: vpand %ymm4, %ymm0, %ymm0 3281; AVX512DQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3282; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3283; 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] 3284; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3285; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 3286; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3287; AVX512DQVL-NEXT: vpand %ymm4, %ymm0, %ymm0 3288; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3289; 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] 3290; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 3291; AVX512DQVL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 3292; AVX512DQVL-NEXT: vpmullw %ymm0, %ymm2, %ymm0 3293; AVX512DQVL-NEXT: vpand %ymm4, %ymm0, %ymm0 3294; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3295; AVX512DQVL-NEXT: vpsrlw $8, %xmm0, %xmm2 3296; 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] 3297; AVX512DQVL-NEXT: vpmullw %ymm2, %ymm0, %ymm0 3298; AVX512DQVL-NEXT: vpand %ymm4, %ymm0, %ymm0 3299; AVX512DQVL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3300; AVX512DQVL-NEXT: vpextrb $0, %xmm0, %eax 3301; AVX512DQVL-NEXT: # kill: def $al killed $al killed $eax 3302; AVX512DQVL-NEXT: vzeroupper 3303; AVX512DQVL-NEXT: retq 3304 %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v128i8(<128 x i8> %a0) 3305 ret i8 %1 3306} 3307 3308declare i64 @llvm.experimental.vector.reduce.mul.i64.v2i64(<2 x i64>) 3309declare i64 @llvm.experimental.vector.reduce.mul.i64.v4i64(<4 x i64>) 3310declare i64 @llvm.experimental.vector.reduce.mul.i64.v8i64(<8 x i64>) 3311declare i64 @llvm.experimental.vector.reduce.mul.i64.v16i64(<16 x i64>) 3312 3313declare i32 @llvm.experimental.vector.reduce.mul.i32.v2i32(<2 x i32>) 3314declare i32 @llvm.experimental.vector.reduce.mul.i32.v4i32(<4 x i32>) 3315declare i32 @llvm.experimental.vector.reduce.mul.i32.v8i32(<8 x i32>) 3316declare i32 @llvm.experimental.vector.reduce.mul.i32.v16i32(<16 x i32>) 3317declare i32 @llvm.experimental.vector.reduce.mul.i32.v32i32(<32 x i32>) 3318 3319declare i16 @llvm.experimental.vector.reduce.mul.i16.v2i16(<2 x i16>) 3320declare i16 @llvm.experimental.vector.reduce.mul.i16.v4i16(<4 x i16>) 3321declare i16 @llvm.experimental.vector.reduce.mul.i16.v8i16(<8 x i16>) 3322declare i16 @llvm.experimental.vector.reduce.mul.i16.v16i16(<16 x i16>) 3323declare i16 @llvm.experimental.vector.reduce.mul.i16.v32i16(<32 x i16>) 3324declare i16 @llvm.experimental.vector.reduce.mul.i16.v64i16(<64 x i16>) 3325 3326declare i8 @llvm.experimental.vector.reduce.mul.i8.v2i8(<2 x i8>) 3327declare i8 @llvm.experimental.vector.reduce.mul.i8.v4i8(<4 x i8>) 3328declare i8 @llvm.experimental.vector.reduce.mul.i8.v8i8(<8 x i8>) 3329declare i8 @llvm.experimental.vector.reduce.mul.i8.v16i8(<16 x i8>) 3330declare i8 @llvm.experimental.vector.reduce.mul.i8.v32i8(<32 x i8>) 3331declare i8 @llvm.experimental.vector.reduce.mul.i8.v64i8(<64 x i8>) 3332declare i8 @llvm.experimental.vector.reduce.mul.i8.v128i8(<128 x i8>) 3333