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-prefixes=CHECK,SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=CHECK,SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE41 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX1 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX2 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512,AVX512F 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512,AVX512F 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512,AVX512BW 10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512,AVX512BW 11 12declare {<1 x i32>, <1 x i1>} @llvm.smul.with.overflow.v1i32(<1 x i32>, <1 x i32>) 13declare {<2 x i32>, <2 x i1>} @llvm.smul.with.overflow.v2i32(<2 x i32>, <2 x i32>) 14declare {<3 x i32>, <3 x i1>} @llvm.smul.with.overflow.v3i32(<3 x i32>, <3 x i32>) 15declare {<4 x i32>, <4 x i1>} @llvm.smul.with.overflow.v4i32(<4 x i32>, <4 x i32>) 16declare {<6 x i32>, <6 x i1>} @llvm.smul.with.overflow.v6i32(<6 x i32>, <6 x i32>) 17declare {<8 x i32>, <8 x i1>} @llvm.smul.with.overflow.v8i32(<8 x i32>, <8 x i32>) 18declare {<16 x i32>, <16 x i1>} @llvm.smul.with.overflow.v16i32(<16 x i32>, <16 x i32>) 19 20declare {<16 x i8>, <16 x i1>} @llvm.smul.with.overflow.v16i8(<16 x i8>, <16 x i8>) 21declare {<32 x i8>, <32 x i1>} @llvm.smul.with.overflow.v32i8(<32 x i8>, <32 x i8>) 22declare {<64 x i8>, <64 x i1>} @llvm.smul.with.overflow.v64i8(<64 x i8>, <64 x i8>) 23declare {<8 x i16>, <8 x i1>} @llvm.smul.with.overflow.v8i16(<8 x i16>, <8 x i16>) 24declare {<2 x i64>, <2 x i1>} @llvm.smul.with.overflow.v2i64(<2 x i64>, <2 x i64>) 25 26declare {<4 x i24>, <4 x i1>} @llvm.smul.with.overflow.v4i24(<4 x i24>, <4 x i24>) 27declare {<4 x i1>, <4 x i1>} @llvm.smul.with.overflow.v4i1(<4 x i1>, <4 x i1>) 28declare {<2 x i128>, <2 x i1>} @llvm.smul.with.overflow.v2i128(<2 x i128>, <2 x i128>) 29 30define <1 x i32> @smulo_v1i32(<1 x i32> %a0, <1 x i32> %a1, <1 x i32>* %p2) nounwind { 31; CHECK-LABEL: smulo_v1i32: 32; CHECK: # %bb.0: 33; CHECK-NEXT: xorl %eax, %eax 34; CHECK-NEXT: imull %esi, %edi 35; CHECK-NEXT: seto %al 36; CHECK-NEXT: negl %eax 37; CHECK-NEXT: movl %edi, (%rdx) 38; CHECK-NEXT: retq 39 %t = call {<1 x i32>, <1 x i1>} @llvm.smul.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1) 40 %val = extractvalue {<1 x i32>, <1 x i1>} %t, 0 41 %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1 42 %res = sext <1 x i1> %obit to <1 x i32> 43 store <1 x i32> %val, <1 x i32>* %p2 44 ret <1 x i32> %res 45} 46 47define <2 x i32> @smulo_v2i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32>* %p2) nounwind { 48; SSE2-LABEL: smulo_v2i32: 49; SSE2: # %bb.0: 50; SSE2-NEXT: pxor %xmm2, %xmm2 51; SSE2-NEXT: pxor %xmm3, %xmm3 52; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 53; SSE2-NEXT: pand %xmm0, %xmm3 54; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 55; SSE2-NEXT: pand %xmm1, %xmm2 56; SSE2-NEXT: paddd %xmm3, %xmm2 57; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 58; SSE2-NEXT: pmuludq %xmm1, %xmm0 59; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3] 60; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 61; SSE2-NEXT: pmuludq %xmm3, %xmm1 62; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3] 63; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 64; SSE2-NEXT: psubd %xmm2, %xmm4 65; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 66; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 67; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 68; SSE2-NEXT: movq %xmm0, (%rdi) 69; SSE2-NEXT: movdqa %xmm0, %xmm1 70; SSE2-NEXT: psrad $31, %xmm1 71; SSE2-NEXT: pcmpeqd %xmm4, %xmm1 72; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 73; SSE2-NEXT: pxor %xmm1, %xmm0 74; SSE2-NEXT: retq 75; 76; SSSE3-LABEL: smulo_v2i32: 77; SSSE3: # %bb.0: 78; SSSE3-NEXT: pxor %xmm2, %xmm2 79; SSSE3-NEXT: pxor %xmm3, %xmm3 80; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 81; SSSE3-NEXT: pand %xmm0, %xmm3 82; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 83; SSSE3-NEXT: pand %xmm1, %xmm2 84; SSSE3-NEXT: paddd %xmm3, %xmm2 85; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 86; SSSE3-NEXT: pmuludq %xmm1, %xmm0 87; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3] 88; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 89; SSSE3-NEXT: pmuludq %xmm3, %xmm1 90; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3] 91; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 92; SSSE3-NEXT: psubd %xmm2, %xmm4 93; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 94; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 95; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 96; SSSE3-NEXT: movq %xmm0, (%rdi) 97; SSSE3-NEXT: movdqa %xmm0, %xmm1 98; SSSE3-NEXT: psrad $31, %xmm1 99; SSSE3-NEXT: pcmpeqd %xmm4, %xmm1 100; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0 101; SSSE3-NEXT: pxor %xmm1, %xmm0 102; SSSE3-NEXT: retq 103; 104; SSE41-LABEL: smulo_v2i32: 105; SSE41: # %bb.0: 106; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 107; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 108; SSE41-NEXT: pmuldq %xmm2, %xmm3 109; SSE41-NEXT: movdqa %xmm0, %xmm2 110; SSE41-NEXT: pmuldq %xmm1, %xmm2 111; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 112; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 113; SSE41-NEXT: pmulld %xmm1, %xmm0 114; SSE41-NEXT: movq %xmm0, (%rdi) 115; SSE41-NEXT: movdqa %xmm0, %xmm1 116; SSE41-NEXT: psrad $31, %xmm1 117; SSE41-NEXT: pcmpeqd %xmm2, %xmm1 118; SSE41-NEXT: pcmpeqd %xmm0, %xmm0 119; SSE41-NEXT: pxor %xmm1, %xmm0 120; SSE41-NEXT: retq 121; 122; AVX1-LABEL: smulo_v2i32: 123; AVX1: # %bb.0: 124; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 125; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 126; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 127; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm3 128; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 129; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7] 130; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1 131; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0 132; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 133; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 134; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 135; AVX1-NEXT: vmovq %xmm1, (%rdi) 136; AVX1-NEXT: retq 137; 138; AVX2-LABEL: smulo_v2i32: 139; AVX2: # %bb.0: 140; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 141; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 142; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 143; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm3 144; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 145; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3] 146; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm1 147; AVX2-NEXT: vpsrad $31, %xmm1, %xmm0 148; AVX2-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 149; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 150; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 151; AVX2-NEXT: vmovq %xmm1, (%rdi) 152; AVX2-NEXT: retq 153; 154; AVX512-LABEL: smulo_v2i32: 155; AVX512: # %bb.0: 156; AVX512-NEXT: vpmuldq %xmm1, %xmm0, %xmm2 157; AVX512-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 158; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 159; AVX512-NEXT: vpmuldq %xmm3, %xmm4, %xmm3 160; AVX512-NEXT: vmovdqa {{.*#+}} xmm4 = [1,5,3,7] 161; AVX512-NEXT: vpermi2d %xmm3, %xmm2, %xmm4 162; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm1 163; AVX512-NEXT: vpsrad $31, %xmm1, %xmm0 164; AVX512-NEXT: vpcmpneqd %xmm0, %xmm4, %k1 165; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 166; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 167; AVX512-NEXT: vmovq %xmm1, (%rdi) 168; AVX512-NEXT: retq 169 %t = call {<2 x i32>, <2 x i1>} @llvm.smul.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1) 170 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0 171 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1 172 %res = sext <2 x i1> %obit to <2 x i32> 173 store <2 x i32> %val, <2 x i32>* %p2 174 ret <2 x i32> %res 175} 176 177define <3 x i32> @smulo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind { 178; SSE2-LABEL: smulo_v3i32: 179; SSE2: # %bb.0: 180; SSE2-NEXT: pxor %xmm2, %xmm2 181; SSE2-NEXT: pxor %xmm3, %xmm3 182; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 183; SSE2-NEXT: pand %xmm0, %xmm3 184; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 185; SSE2-NEXT: pand %xmm1, %xmm2 186; SSE2-NEXT: paddd %xmm3, %xmm2 187; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 188; SSE2-NEXT: pmuludq %xmm1, %xmm0 189; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3] 190; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 191; SSE2-NEXT: pmuludq %xmm3, %xmm1 192; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3] 193; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 194; SSE2-NEXT: psubd %xmm2, %xmm4 195; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3] 196; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 197; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 198; SSE2-NEXT: movq %xmm2, (%rdi) 199; SSE2-NEXT: psrad $31, %xmm2 200; SSE2-NEXT: pcmpeqd %xmm4, %xmm2 201; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 202; SSE2-NEXT: pxor %xmm2, %xmm1 203; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 204; SSE2-NEXT: movd %xmm0, 8(%rdi) 205; SSE2-NEXT: movdqa %xmm1, %xmm0 206; SSE2-NEXT: retq 207; 208; SSSE3-LABEL: smulo_v3i32: 209; SSSE3: # %bb.0: 210; SSSE3-NEXT: pxor %xmm2, %xmm2 211; SSSE3-NEXT: pxor %xmm3, %xmm3 212; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 213; SSSE3-NEXT: pand %xmm0, %xmm3 214; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 215; SSSE3-NEXT: pand %xmm1, %xmm2 216; SSSE3-NEXT: paddd %xmm3, %xmm2 217; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 218; SSSE3-NEXT: pmuludq %xmm1, %xmm0 219; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3] 220; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 221; SSSE3-NEXT: pmuludq %xmm3, %xmm1 222; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3] 223; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 224; SSSE3-NEXT: psubd %xmm2, %xmm4 225; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3] 226; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 227; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 228; SSSE3-NEXT: movq %xmm2, (%rdi) 229; SSSE3-NEXT: psrad $31, %xmm2 230; SSSE3-NEXT: pcmpeqd %xmm4, %xmm2 231; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1 232; SSSE3-NEXT: pxor %xmm2, %xmm1 233; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 234; SSSE3-NEXT: movd %xmm0, 8(%rdi) 235; SSSE3-NEXT: movdqa %xmm1, %xmm0 236; SSSE3-NEXT: retq 237; 238; SSE41-LABEL: smulo_v3i32: 239; SSE41: # %bb.0: 240; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 241; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 242; SSE41-NEXT: pmuldq %xmm2, %xmm3 243; SSE41-NEXT: movdqa %xmm0, %xmm2 244; SSE41-NEXT: pmuldq %xmm1, %xmm2 245; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 246; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 247; SSE41-NEXT: pmulld %xmm1, %xmm0 248; SSE41-NEXT: pextrd $2, %xmm0, 8(%rdi) 249; SSE41-NEXT: movq %xmm0, (%rdi) 250; SSE41-NEXT: movdqa %xmm0, %xmm1 251; SSE41-NEXT: psrad $31, %xmm1 252; SSE41-NEXT: pcmpeqd %xmm2, %xmm1 253; SSE41-NEXT: pcmpeqd %xmm0, %xmm0 254; SSE41-NEXT: pxor %xmm1, %xmm0 255; SSE41-NEXT: retq 256; 257; AVX1-LABEL: smulo_v3i32: 258; AVX1: # %bb.0: 259; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 260; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 261; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 262; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm3 263; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 264; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7] 265; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1 266; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0 267; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 268; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 269; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 270; AVX1-NEXT: vpextrd $2, %xmm1, 8(%rdi) 271; AVX1-NEXT: vmovq %xmm1, (%rdi) 272; AVX1-NEXT: retq 273; 274; AVX2-LABEL: smulo_v3i32: 275; AVX2: # %bb.0: 276; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 277; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 278; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 279; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm3 280; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 281; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3] 282; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm1 283; AVX2-NEXT: vpsrad $31, %xmm1, %xmm0 284; AVX2-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 285; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 286; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 287; AVX2-NEXT: vpextrd $2, %xmm1, 8(%rdi) 288; AVX2-NEXT: vmovq %xmm1, (%rdi) 289; AVX2-NEXT: retq 290; 291; AVX512-LABEL: smulo_v3i32: 292; AVX512: # %bb.0: 293; AVX512-NEXT: vpmuldq %xmm1, %xmm0, %xmm2 294; AVX512-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 295; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 296; AVX512-NEXT: vpmuldq %xmm3, %xmm4, %xmm3 297; AVX512-NEXT: vmovdqa {{.*#+}} xmm4 = [1,5,3,7] 298; AVX512-NEXT: vpermi2d %xmm3, %xmm2, %xmm4 299; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm1 300; AVX512-NEXT: vpsrad $31, %xmm1, %xmm0 301; AVX512-NEXT: vpcmpneqd %xmm0, %xmm4, %k1 302; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 303; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 304; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi) 305; AVX512-NEXT: vmovq %xmm1, (%rdi) 306; AVX512-NEXT: retq 307 %t = call {<3 x i32>, <3 x i1>} @llvm.smul.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1) 308 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0 309 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1 310 %res = sext <3 x i1> %obit to <3 x i32> 311 store <3 x i32> %val, <3 x i32>* %p2 312 ret <3 x i32> %res 313} 314 315define <4 x i32> @smulo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind { 316; SSE2-LABEL: smulo_v4i32: 317; SSE2: # %bb.0: 318; SSE2-NEXT: pxor %xmm2, %xmm2 319; SSE2-NEXT: pxor %xmm3, %xmm3 320; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 321; SSE2-NEXT: pand %xmm0, %xmm3 322; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 323; SSE2-NEXT: pand %xmm1, %xmm2 324; SSE2-NEXT: paddd %xmm3, %xmm2 325; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 326; SSE2-NEXT: pmuludq %xmm1, %xmm0 327; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3] 328; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 329; SSE2-NEXT: pmuludq %xmm3, %xmm1 330; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3] 331; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 332; SSE2-NEXT: psubd %xmm2, %xmm4 333; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 334; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 335; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 336; SSE2-NEXT: movdqa %xmm0, (%rdi) 337; SSE2-NEXT: movdqa %xmm0, %xmm1 338; SSE2-NEXT: psrad $31, %xmm1 339; SSE2-NEXT: pcmpeqd %xmm4, %xmm1 340; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 341; SSE2-NEXT: pxor %xmm1, %xmm0 342; SSE2-NEXT: retq 343; 344; SSSE3-LABEL: smulo_v4i32: 345; SSSE3: # %bb.0: 346; SSSE3-NEXT: pxor %xmm2, %xmm2 347; SSSE3-NEXT: pxor %xmm3, %xmm3 348; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 349; SSSE3-NEXT: pand %xmm0, %xmm3 350; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 351; SSSE3-NEXT: pand %xmm1, %xmm2 352; SSSE3-NEXT: paddd %xmm3, %xmm2 353; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 354; SSSE3-NEXT: pmuludq %xmm1, %xmm0 355; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3] 356; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 357; SSSE3-NEXT: pmuludq %xmm3, %xmm1 358; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3] 359; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 360; SSSE3-NEXT: psubd %xmm2, %xmm4 361; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 362; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 363; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 364; SSSE3-NEXT: movdqa %xmm0, (%rdi) 365; SSSE3-NEXT: movdqa %xmm0, %xmm1 366; SSSE3-NEXT: psrad $31, %xmm1 367; SSSE3-NEXT: pcmpeqd %xmm4, %xmm1 368; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0 369; SSSE3-NEXT: pxor %xmm1, %xmm0 370; SSSE3-NEXT: retq 371; 372; SSE41-LABEL: smulo_v4i32: 373; SSE41: # %bb.0: 374; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 375; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 376; SSE41-NEXT: pmuldq %xmm2, %xmm3 377; SSE41-NEXT: movdqa %xmm0, %xmm2 378; SSE41-NEXT: pmuldq %xmm1, %xmm2 379; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 380; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 381; SSE41-NEXT: pmulld %xmm1, %xmm0 382; SSE41-NEXT: movdqa %xmm0, (%rdi) 383; SSE41-NEXT: movdqa %xmm0, %xmm1 384; SSE41-NEXT: psrad $31, %xmm1 385; SSE41-NEXT: pcmpeqd %xmm2, %xmm1 386; SSE41-NEXT: pcmpeqd %xmm0, %xmm0 387; SSE41-NEXT: pxor %xmm1, %xmm0 388; SSE41-NEXT: retq 389; 390; AVX1-LABEL: smulo_v4i32: 391; AVX1: # %bb.0: 392; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 393; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 394; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 395; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm3 396; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 397; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7] 398; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1 399; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0 400; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 401; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 402; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 403; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 404; AVX1-NEXT: retq 405; 406; AVX2-LABEL: smulo_v4i32: 407; AVX2: # %bb.0: 408; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 409; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 410; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 411; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm3 412; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 413; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3] 414; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm1 415; AVX2-NEXT: vpsrad $31, %xmm1, %xmm0 416; AVX2-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 417; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 418; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 419; AVX2-NEXT: vmovdqa %xmm1, (%rdi) 420; AVX2-NEXT: retq 421; 422; AVX512-LABEL: smulo_v4i32: 423; AVX512: # %bb.0: 424; AVX512-NEXT: vpmuldq %xmm1, %xmm0, %xmm2 425; AVX512-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 426; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 427; AVX512-NEXT: vpmuldq %xmm3, %xmm4, %xmm3 428; AVX512-NEXT: vmovdqa {{.*#+}} xmm4 = [1,5,3,7] 429; AVX512-NEXT: vpermi2d %xmm3, %xmm2, %xmm4 430; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm1 431; AVX512-NEXT: vpsrad $31, %xmm1, %xmm0 432; AVX512-NEXT: vpcmpneqd %xmm0, %xmm4, %k1 433; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 434; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 435; AVX512-NEXT: vmovdqa %xmm1, (%rdi) 436; AVX512-NEXT: retq 437 %t = call {<4 x i32>, <4 x i1>} @llvm.smul.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1) 438 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0 439 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1 440 %res = sext <4 x i1> %obit to <4 x i32> 441 store <4 x i32> %val, <4 x i32>* %p2 442 ret <4 x i32> %res 443} 444 445define <6 x i32> @smulo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind { 446; SSE2-LABEL: smulo_v6i32: 447; SSE2: # %bb.0: 448; SSE2-NEXT: movq %rdi, %rax 449; SSE2-NEXT: movd %r8d, %xmm0 450; SSE2-NEXT: movd %ecx, %xmm1 451; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 452; SSE2-NEXT: movd %edx, %xmm0 453; SSE2-NEXT: movd %esi, %xmm2 454; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] 455; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 456; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 457; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 458; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 459; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 460; SSE2-NEXT: movd {{.*#+}} xmm5 = mem[0],zero,zero,zero 461; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1] 462; SSE2-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm1[0] 463; SSE2-NEXT: movd %r9d, %xmm10 464; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 465; SSE2-NEXT: movdqa %xmm10, %xmm9 466; SSE2-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm1[0],xmm9[1],xmm1[1] 467; SSE2-NEXT: movd {{.*#+}} xmm8 = mem[0],zero,zero,zero 468; SSE2-NEXT: movd {{.*#+}} xmm6 = mem[0],zero,zero,zero 469; SSE2-NEXT: pmuludq %xmm6, %xmm10 470; SSE2-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm8[0],xmm6[1],xmm8[1] 471; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx 472; SSE2-NEXT: pxor %xmm7, %xmm7 473; SSE2-NEXT: pxor %xmm4, %xmm4 474; SSE2-NEXT: pcmpgtd %xmm5, %xmm4 475; SSE2-NEXT: pand %xmm2, %xmm4 476; SSE2-NEXT: pxor %xmm3, %xmm3 477; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 478; SSE2-NEXT: pand %xmm5, %xmm3 479; SSE2-NEXT: paddd %xmm4, %xmm3 480; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 481; SSE2-NEXT: pmuludq %xmm5, %xmm2 482; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3] 483; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 484; SSE2-NEXT: pmuludq %xmm4, %xmm5 485; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,3,2,3] 486; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 487; SSE2-NEXT: psubd %xmm3, %xmm0 488; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 489; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[0,2,2,3] 490; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1] 491; SSE2-NEXT: movdqa %xmm2, (%rcx) 492; SSE2-NEXT: psrad $31, %xmm2 493; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 494; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 495; SSE2-NEXT: pxor %xmm0, %xmm2 496; SSE2-NEXT: pxor %xmm3, %xmm3 497; SSE2-NEXT: pcmpgtd %xmm6, %xmm3 498; SSE2-NEXT: pand %xmm9, %xmm3 499; SSE2-NEXT: pcmpgtd %xmm9, %xmm7 500; SSE2-NEXT: pand %xmm6, %xmm7 501; SSE2-NEXT: paddd %xmm3, %xmm7 502; SSE2-NEXT: pmuludq %xmm8, %xmm1 503; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3] 504; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm10[1,3,2,3] 505; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 506; SSE2-NEXT: psubd %xmm7, %xmm4 507; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 508; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm10[0,2,2,3] 509; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1] 510; SSE2-NEXT: movq %xmm3, 16(%rcx) 511; SSE2-NEXT: psrad $31, %xmm3 512; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 513; SSE2-NEXT: pxor %xmm0, %xmm3 514; SSE2-NEXT: movq %xmm3, 16(%rdi) 515; SSE2-NEXT: movdqa %xmm2, (%rdi) 516; SSE2-NEXT: retq 517; 518; SSSE3-LABEL: smulo_v6i32: 519; SSSE3: # %bb.0: 520; SSSE3-NEXT: movq %rdi, %rax 521; SSSE3-NEXT: movd %r8d, %xmm0 522; SSSE3-NEXT: movd %ecx, %xmm1 523; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 524; SSSE3-NEXT: movd %edx, %xmm0 525; SSSE3-NEXT: movd %esi, %xmm2 526; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] 527; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 528; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 529; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 530; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 531; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 532; SSSE3-NEXT: movd {{.*#+}} xmm5 = mem[0],zero,zero,zero 533; SSSE3-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1] 534; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm1[0] 535; SSSE3-NEXT: movd %r9d, %xmm10 536; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 537; SSSE3-NEXT: movdqa %xmm10, %xmm9 538; SSSE3-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm1[0],xmm9[1],xmm1[1] 539; SSSE3-NEXT: movd {{.*#+}} xmm8 = mem[0],zero,zero,zero 540; SSSE3-NEXT: movd {{.*#+}} xmm6 = mem[0],zero,zero,zero 541; SSSE3-NEXT: pmuludq %xmm6, %xmm10 542; SSSE3-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm8[0],xmm6[1],xmm8[1] 543; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx 544; SSSE3-NEXT: pxor %xmm7, %xmm7 545; SSSE3-NEXT: pxor %xmm4, %xmm4 546; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 547; SSSE3-NEXT: pand %xmm2, %xmm4 548; SSSE3-NEXT: pxor %xmm3, %xmm3 549; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 550; SSSE3-NEXT: pand %xmm5, %xmm3 551; SSSE3-NEXT: paddd %xmm4, %xmm3 552; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 553; SSSE3-NEXT: pmuludq %xmm5, %xmm2 554; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3] 555; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 556; SSSE3-NEXT: pmuludq %xmm4, %xmm5 557; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,3,2,3] 558; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 559; SSSE3-NEXT: psubd %xmm3, %xmm0 560; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 561; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[0,2,2,3] 562; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1] 563; SSSE3-NEXT: movdqa %xmm2, (%rcx) 564; SSSE3-NEXT: psrad $31, %xmm2 565; SSSE3-NEXT: pcmpeqd %xmm0, %xmm2 566; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0 567; SSSE3-NEXT: pxor %xmm0, %xmm2 568; SSSE3-NEXT: pxor %xmm3, %xmm3 569; SSSE3-NEXT: pcmpgtd %xmm6, %xmm3 570; SSSE3-NEXT: pand %xmm9, %xmm3 571; SSSE3-NEXT: pcmpgtd %xmm9, %xmm7 572; SSSE3-NEXT: pand %xmm6, %xmm7 573; SSSE3-NEXT: paddd %xmm3, %xmm7 574; SSSE3-NEXT: pmuludq %xmm8, %xmm1 575; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3] 576; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm10[1,3,2,3] 577; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1] 578; SSSE3-NEXT: psubd %xmm7, %xmm4 579; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 580; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[0,2,2,3] 581; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1] 582; SSSE3-NEXT: movq %xmm3, 16(%rcx) 583; SSSE3-NEXT: psrad $31, %xmm3 584; SSSE3-NEXT: pcmpeqd %xmm4, %xmm3 585; SSSE3-NEXT: pxor %xmm0, %xmm3 586; SSSE3-NEXT: movq %xmm3, 16(%rdi) 587; SSSE3-NEXT: movdqa %xmm2, (%rdi) 588; SSSE3-NEXT: retq 589; 590; SSE41-LABEL: smulo_v6i32: 591; SSE41: # %bb.0: 592; SSE41-NEXT: movq %rdi, %rax 593; SSE41-NEXT: movd %esi, %xmm2 594; SSE41-NEXT: pinsrd $1, %edx, %xmm2 595; SSE41-NEXT: pinsrd $2, %ecx, %xmm2 596; SSE41-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 597; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm1 598; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm1 599; SSE41-NEXT: movdqa %xmm1, %xmm0 600; SSE41-NEXT: pmuldq %xmm2, %xmm1 601; SSE41-NEXT: pinsrd $3, %r8d, %xmm2 602; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 603; SSE41-NEXT: movd %r9d, %xmm4 604; SSE41-NEXT: movdqa %xmm4, %xmm5 605; SSE41-NEXT: pmuldq %xmm3, %xmm4 606; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm3 607; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm5 608; SSE41-NEXT: pmulld %xmm3, %xmm5 609; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm0 610; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx 611; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3] 612; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 613; SSE41-NEXT: pmuldq %xmm3, %xmm6 614; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 615; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7] 616; SSE41-NEXT: pmulld %xmm2, %xmm0 617; SSE41-NEXT: movdqa %xmm0, (%rcx) 618; SSE41-NEXT: psrad $31, %xmm0 619; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 620; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 621; SSE41-NEXT: pxor %xmm1, %xmm0 622; SSE41-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 623; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 624; SSE41-NEXT: pmuldq %xmm2, %xmm3 625; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 626; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 627; SSE41-NEXT: movq %xmm5, 16(%rcx) 628; SSE41-NEXT: psrad $31, %xmm5 629; SSE41-NEXT: pcmpeqd %xmm2, %xmm5 630; SSE41-NEXT: pxor %xmm1, %xmm5 631; SSE41-NEXT: movq %xmm5, 16(%rdi) 632; SSE41-NEXT: movdqa %xmm0, (%rdi) 633; SSE41-NEXT: retq 634; 635; AVX1-LABEL: smulo_v6i32: 636; AVX1: # %bb.0: 637; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 638; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3] 639; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 640; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3] 641; AVX1-NEXT: vpmuldq %xmm3, %xmm5, %xmm3 642; AVX1-NEXT: vpmuldq %xmm2, %xmm4, %xmm5 643; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 644; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm5[0,1],xmm3[2,3],xmm5[4,5],xmm3[6,7] 645; AVX1-NEXT: vpmulld %xmm2, %xmm4, %xmm2 646; AVX1-NEXT: vpsrad $31, %xmm2, %xmm4 647; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 648; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 649; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 650; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 651; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 652; AVX1-NEXT: vpmuldq %xmm5, %xmm6, %xmm5 653; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm6 654; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 655; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7] 656; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1 657; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0 658; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0 659; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 660; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 661; AVX1-NEXT: vmovq %xmm2, 16(%rdi) 662; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 663; AVX1-NEXT: retq 664; 665; AVX2-LABEL: smulo_v6i32: 666; AVX2: # %bb.0: 667; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7] 668; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7] 669; AVX2-NEXT: vpmuldq %ymm2, %ymm3, %ymm2 670; AVX2-NEXT: vpmuldq %ymm1, %ymm0, %ymm3 671; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm3[1,1,3,3,5,5,7,7] 672; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7] 673; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm1 674; AVX2-NEXT: vpsrad $31, %ymm1, %ymm0 675; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0 676; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 677; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 678; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 679; AVX2-NEXT: vmovq %xmm2, 16(%rdi) 680; AVX2-NEXT: vmovdqa %xmm1, (%rdi) 681; AVX2-NEXT: retq 682; 683; AVX512-LABEL: smulo_v6i32: 684; AVX512: # %bb.0: 685; AVX512-NEXT: vpmuldq %ymm1, %ymm0, %ymm2 686; AVX512-NEXT: vpshufd {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7] 687; AVX512-NEXT: vpshufd {{.*#+}} ymm4 = ymm0[1,1,3,3,5,5,7,7] 688; AVX512-NEXT: vpmuldq %ymm3, %ymm4, %ymm3 689; AVX512-NEXT: vmovdqa {{.*#+}} ymm4 = [1,9,3,11,5,13,7,15] 690; AVX512-NEXT: vpermi2d %ymm3, %ymm2, %ymm4 691; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm1 692; AVX512-NEXT: vpsrad $31, %ymm1, %ymm0 693; AVX512-NEXT: vpcmpneqd %ymm0, %ymm4, %k1 694; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 695; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} 696; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2 697; AVX512-NEXT: vmovq %xmm2, 16(%rdi) 698; AVX512-NEXT: vmovdqa %xmm1, (%rdi) 699; AVX512-NEXT: retq 700 %t = call {<6 x i32>, <6 x i1>} @llvm.smul.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1) 701 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0 702 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1 703 %res = sext <6 x i1> %obit to <6 x i32> 704 store <6 x i32> %val, <6 x i32>* %p2 705 ret <6 x i32> %res 706} 707 708define <8 x i32> @smulo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind { 709; SSE2-LABEL: smulo_v8i32: 710; SSE2: # %bb.0: 711; SSE2-NEXT: pxor %xmm4, %xmm4 712; SSE2-NEXT: pxor %xmm5, %xmm5 713; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 714; SSE2-NEXT: pand %xmm0, %xmm5 715; SSE2-NEXT: pxor %xmm6, %xmm6 716; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 717; SSE2-NEXT: pand %xmm2, %xmm6 718; SSE2-NEXT: paddd %xmm5, %xmm6 719; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 720; SSE2-NEXT: pmuludq %xmm2, %xmm0 721; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3] 722; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 723; SSE2-NEXT: pmuludq %xmm7, %xmm2 724; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,3,2,3] 725; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1] 726; SSE2-NEXT: psubd %xmm6, %xmm5 727; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 728; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 729; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 730; SSE2-NEXT: movdqa %xmm0, (%rdi) 731; SSE2-NEXT: psrad $31, %xmm0 732; SSE2-NEXT: pcmpeqd %xmm5, %xmm0 733; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 734; SSE2-NEXT: pxor %xmm2, %xmm0 735; SSE2-NEXT: pxor %xmm5, %xmm5 736; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 737; SSE2-NEXT: pand %xmm1, %xmm5 738; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 739; SSE2-NEXT: pand %xmm3, %xmm4 740; SSE2-NEXT: paddd %xmm5, %xmm4 741; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 742; SSE2-NEXT: pmuludq %xmm3, %xmm1 743; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,3,2,3] 744; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 745; SSE2-NEXT: pmuludq %xmm5, %xmm3 746; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3] 747; SSE2-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1] 748; SSE2-NEXT: psubd %xmm4, %xmm6 749; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 750; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3] 751; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 752; SSE2-NEXT: movdqa %xmm1, 16(%rdi) 753; SSE2-NEXT: psrad $31, %xmm1 754; SSE2-NEXT: pcmpeqd %xmm6, %xmm1 755; SSE2-NEXT: pxor %xmm2, %xmm1 756; SSE2-NEXT: retq 757; 758; SSSE3-LABEL: smulo_v8i32: 759; SSSE3: # %bb.0: 760; SSSE3-NEXT: pxor %xmm4, %xmm4 761; SSSE3-NEXT: pxor %xmm5, %xmm5 762; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 763; SSSE3-NEXT: pand %xmm0, %xmm5 764; SSSE3-NEXT: pxor %xmm6, %xmm6 765; SSSE3-NEXT: pcmpgtd %xmm0, %xmm6 766; SSSE3-NEXT: pand %xmm2, %xmm6 767; SSSE3-NEXT: paddd %xmm5, %xmm6 768; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 769; SSSE3-NEXT: pmuludq %xmm2, %xmm0 770; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3] 771; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 772; SSSE3-NEXT: pmuludq %xmm7, %xmm2 773; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,3,2,3] 774; SSSE3-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1] 775; SSSE3-NEXT: psubd %xmm6, %xmm5 776; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 777; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 778; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 779; SSSE3-NEXT: movdqa %xmm0, (%rdi) 780; SSSE3-NEXT: psrad $31, %xmm0 781; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0 782; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2 783; SSSE3-NEXT: pxor %xmm2, %xmm0 784; SSSE3-NEXT: pxor %xmm5, %xmm5 785; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5 786; SSSE3-NEXT: pand %xmm1, %xmm5 787; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 788; SSSE3-NEXT: pand %xmm3, %xmm4 789; SSSE3-NEXT: paddd %xmm5, %xmm4 790; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 791; SSSE3-NEXT: pmuludq %xmm3, %xmm1 792; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,3,2,3] 793; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 794; SSSE3-NEXT: pmuludq %xmm5, %xmm3 795; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3] 796; SSSE3-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1] 797; SSSE3-NEXT: psubd %xmm4, %xmm6 798; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 799; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3] 800; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 801; SSSE3-NEXT: movdqa %xmm1, 16(%rdi) 802; SSSE3-NEXT: psrad $31, %xmm1 803; SSSE3-NEXT: pcmpeqd %xmm6, %xmm1 804; SSSE3-NEXT: pxor %xmm2, %xmm1 805; SSSE3-NEXT: retq 806; 807; SSE41-LABEL: smulo_v8i32: 808; SSE41: # %bb.0: 809; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 810; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 811; SSE41-NEXT: pmuldq %xmm4, %xmm5 812; SSE41-NEXT: movdqa %xmm0, %xmm4 813; SSE41-NEXT: pmuldq %xmm2, %xmm4 814; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 815; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 816; SSE41-NEXT: pmulld %xmm2, %xmm0 817; SSE41-NEXT: movdqa %xmm0, (%rdi) 818; SSE41-NEXT: psrad $31, %xmm0 819; SSE41-NEXT: pcmpeqd %xmm4, %xmm0 820; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 821; SSE41-NEXT: pxor %xmm2, %xmm0 822; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 823; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 824; SSE41-NEXT: pmuldq %xmm4, %xmm5 825; SSE41-NEXT: movdqa %xmm1, %xmm4 826; SSE41-NEXT: pmuldq %xmm3, %xmm4 827; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 828; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 829; SSE41-NEXT: pmulld %xmm3, %xmm1 830; SSE41-NEXT: movdqa %xmm1, 16(%rdi) 831; SSE41-NEXT: psrad $31, %xmm1 832; SSE41-NEXT: pcmpeqd %xmm4, %xmm1 833; SSE41-NEXT: pxor %xmm2, %xmm1 834; SSE41-NEXT: retq 835; 836; AVX1-LABEL: smulo_v8i32: 837; AVX1: # %bb.0: 838; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 839; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3] 840; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 841; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3] 842; AVX1-NEXT: vpmuldq %xmm3, %xmm5, %xmm3 843; AVX1-NEXT: vpmuldq %xmm2, %xmm4, %xmm5 844; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 845; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm5[0,1],xmm3[2,3],xmm5[4,5],xmm3[6,7] 846; AVX1-NEXT: vpmulld %xmm2, %xmm4, %xmm2 847; AVX1-NEXT: vpsrad $31, %xmm2, %xmm4 848; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 849; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 850; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 851; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 852; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 853; AVX1-NEXT: vpmuldq %xmm5, %xmm6, %xmm5 854; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm6 855; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 856; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7] 857; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1 858; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0 859; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0 860; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 861; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 862; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi) 863; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 864; AVX1-NEXT: retq 865; 866; AVX2-LABEL: smulo_v8i32: 867; AVX2: # %bb.0: 868; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7] 869; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7] 870; AVX2-NEXT: vpmuldq %ymm2, %ymm3, %ymm2 871; AVX2-NEXT: vpmuldq %ymm1, %ymm0, %ymm3 872; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm3[1,1,3,3,5,5,7,7] 873; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7] 874; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm1 875; AVX2-NEXT: vpsrad $31, %ymm1, %ymm0 876; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0 877; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 878; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 879; AVX2-NEXT: vmovdqa %ymm1, (%rdi) 880; AVX2-NEXT: retq 881; 882; AVX512-LABEL: smulo_v8i32: 883; AVX512: # %bb.0: 884; AVX512-NEXT: vpmuldq %ymm1, %ymm0, %ymm2 885; AVX512-NEXT: vpshufd {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7] 886; AVX512-NEXT: vpshufd {{.*#+}} ymm4 = ymm0[1,1,3,3,5,5,7,7] 887; AVX512-NEXT: vpmuldq %ymm3, %ymm4, %ymm3 888; AVX512-NEXT: vmovdqa {{.*#+}} ymm4 = [1,9,3,11,5,13,7,15] 889; AVX512-NEXT: vpermi2d %ymm3, %ymm2, %ymm4 890; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm1 891; AVX512-NEXT: vpsrad $31, %ymm1, %ymm0 892; AVX512-NEXT: vpcmpneqd %ymm0, %ymm4, %k1 893; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 894; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} 895; AVX512-NEXT: vmovdqa %ymm1, (%rdi) 896; AVX512-NEXT: retq 897 %t = call {<8 x i32>, <8 x i1>} @llvm.smul.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1) 898 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0 899 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1 900 %res = sext <8 x i1> %obit to <8 x i32> 901 store <8 x i32> %val, <8 x i32>* %p2 902 ret <8 x i32> %res 903} 904 905define <16 x i32> @smulo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind { 906; SSE2-LABEL: smulo_v16i32: 907; SSE2: # %bb.0: 908; SSE2-NEXT: pxor %xmm8, %xmm8 909; SSE2-NEXT: pxor %xmm9, %xmm9 910; SSE2-NEXT: pcmpgtd %xmm4, %xmm9 911; SSE2-NEXT: pand %xmm0, %xmm9 912; SSE2-NEXT: pxor %xmm10, %xmm10 913; SSE2-NEXT: pcmpgtd %xmm0, %xmm10 914; SSE2-NEXT: pand %xmm4, %xmm10 915; SSE2-NEXT: paddd %xmm9, %xmm10 916; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3] 917; SSE2-NEXT: pmuludq %xmm4, %xmm0 918; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,3,2,3] 919; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm4[1,1,3,3] 920; SSE2-NEXT: pmuludq %xmm11, %xmm12 921; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm12[1,3,2,3] 922; SSE2-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm4[0],xmm9[1],xmm4[1] 923; SSE2-NEXT: psubd %xmm10, %xmm9 924; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 925; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3] 926; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 927; SSE2-NEXT: movdqa %xmm0, (%rdi) 928; SSE2-NEXT: psrad $31, %xmm0 929; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 930; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 931; SSE2-NEXT: pxor %xmm9, %xmm0 932; SSE2-NEXT: pxor %xmm10, %xmm10 933; SSE2-NEXT: pcmpgtd %xmm5, %xmm10 934; SSE2-NEXT: pand %xmm1, %xmm10 935; SSE2-NEXT: pxor %xmm4, %xmm4 936; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 937; SSE2-NEXT: pand %xmm5, %xmm4 938; SSE2-NEXT: paddd %xmm10, %xmm4 939; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3] 940; SSE2-NEXT: pmuludq %xmm5, %xmm1 941; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,3,2,3] 942; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm5[1,1,3,3] 943; SSE2-NEXT: pmuludq %xmm10, %xmm12 944; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm12[1,3,2,3] 945; SSE2-NEXT: punpckldq {{.*#+}} xmm11 = xmm11[0],xmm5[0],xmm11[1],xmm5[1] 946; SSE2-NEXT: psubd %xmm4, %xmm11 947; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 948; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3] 949; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] 950; SSE2-NEXT: movdqa %xmm1, 16(%rdi) 951; SSE2-NEXT: psrad $31, %xmm1 952; SSE2-NEXT: pcmpeqd %xmm11, %xmm1 953; SSE2-NEXT: pxor %xmm9, %xmm1 954; SSE2-NEXT: pxor %xmm4, %xmm4 955; SSE2-NEXT: pcmpgtd %xmm6, %xmm4 956; SSE2-NEXT: pand %xmm2, %xmm4 957; SSE2-NEXT: pxor %xmm5, %xmm5 958; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 959; SSE2-NEXT: pand %xmm6, %xmm5 960; SSE2-NEXT: paddd %xmm4, %xmm5 961; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm2[1,1,3,3] 962; SSE2-NEXT: pmuludq %xmm6, %xmm2 963; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3] 964; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3] 965; SSE2-NEXT: pmuludq %xmm10, %xmm11 966; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,3,2,3] 967; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1] 968; SSE2-NEXT: psubd %xmm5, %xmm4 969; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 970; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm11[0,2,2,3] 971; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1] 972; SSE2-NEXT: movdqa %xmm2, 32(%rdi) 973; SSE2-NEXT: psrad $31, %xmm2 974; SSE2-NEXT: pcmpeqd %xmm4, %xmm2 975; SSE2-NEXT: pxor %xmm9, %xmm2 976; SSE2-NEXT: pxor %xmm4, %xmm4 977; SSE2-NEXT: pcmpgtd %xmm7, %xmm4 978; SSE2-NEXT: pand %xmm3, %xmm4 979; SSE2-NEXT: pcmpgtd %xmm3, %xmm8 980; SSE2-NEXT: pand %xmm7, %xmm8 981; SSE2-NEXT: paddd %xmm4, %xmm8 982; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 983; SSE2-NEXT: pmuludq %xmm7, %xmm3 984; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3] 985; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3] 986; SSE2-NEXT: pmuludq %xmm4, %xmm6 987; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,3,2,3] 988; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1] 989; SSE2-NEXT: psubd %xmm8, %xmm5 990; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3] 991; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,2,2,3] 992; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1] 993; SSE2-NEXT: movdqa %xmm3, 48(%rdi) 994; SSE2-NEXT: psrad $31, %xmm3 995; SSE2-NEXT: pcmpeqd %xmm5, %xmm3 996; SSE2-NEXT: pxor %xmm9, %xmm3 997; SSE2-NEXT: retq 998; 999; SSSE3-LABEL: smulo_v16i32: 1000; SSSE3: # %bb.0: 1001; SSSE3-NEXT: pxor %xmm8, %xmm8 1002; SSSE3-NEXT: pxor %xmm9, %xmm9 1003; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9 1004; SSSE3-NEXT: pand %xmm0, %xmm9 1005; SSSE3-NEXT: pxor %xmm10, %xmm10 1006; SSSE3-NEXT: pcmpgtd %xmm0, %xmm10 1007; SSSE3-NEXT: pand %xmm4, %xmm10 1008; SSSE3-NEXT: paddd %xmm9, %xmm10 1009; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3] 1010; SSSE3-NEXT: pmuludq %xmm4, %xmm0 1011; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,3,2,3] 1012; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm4[1,1,3,3] 1013; SSSE3-NEXT: pmuludq %xmm11, %xmm12 1014; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm12[1,3,2,3] 1015; SSSE3-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm4[0],xmm9[1],xmm4[1] 1016; SSSE3-NEXT: psubd %xmm10, %xmm9 1017; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1018; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3] 1019; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 1020; SSSE3-NEXT: movdqa %xmm0, (%rdi) 1021; SSSE3-NEXT: psrad $31, %xmm0 1022; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0 1023; SSSE3-NEXT: pcmpeqd %xmm9, %xmm9 1024; SSSE3-NEXT: pxor %xmm9, %xmm0 1025; SSSE3-NEXT: pxor %xmm10, %xmm10 1026; SSSE3-NEXT: pcmpgtd %xmm5, %xmm10 1027; SSSE3-NEXT: pand %xmm1, %xmm10 1028; SSSE3-NEXT: pxor %xmm4, %xmm4 1029; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 1030; SSSE3-NEXT: pand %xmm5, %xmm4 1031; SSSE3-NEXT: paddd %xmm10, %xmm4 1032; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3] 1033; SSSE3-NEXT: pmuludq %xmm5, %xmm1 1034; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,3,2,3] 1035; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm5[1,1,3,3] 1036; SSSE3-NEXT: pmuludq %xmm10, %xmm12 1037; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm12[1,3,2,3] 1038; SSSE3-NEXT: punpckldq {{.*#+}} xmm11 = xmm11[0],xmm5[0],xmm11[1],xmm5[1] 1039; SSSE3-NEXT: psubd %xmm4, %xmm11 1040; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1041; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3] 1042; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] 1043; SSSE3-NEXT: movdqa %xmm1, 16(%rdi) 1044; SSSE3-NEXT: psrad $31, %xmm1 1045; SSSE3-NEXT: pcmpeqd %xmm11, %xmm1 1046; SSSE3-NEXT: pxor %xmm9, %xmm1 1047; SSSE3-NEXT: pxor %xmm4, %xmm4 1048; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4 1049; SSSE3-NEXT: pand %xmm2, %xmm4 1050; SSSE3-NEXT: pxor %xmm5, %xmm5 1051; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 1052; SSSE3-NEXT: pand %xmm6, %xmm5 1053; SSSE3-NEXT: paddd %xmm4, %xmm5 1054; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm2[1,1,3,3] 1055; SSSE3-NEXT: pmuludq %xmm6, %xmm2 1056; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3] 1057; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3] 1058; SSSE3-NEXT: pmuludq %xmm10, %xmm11 1059; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,3,2,3] 1060; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1] 1061; SSSE3-NEXT: psubd %xmm5, %xmm4 1062; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 1063; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm11[0,2,2,3] 1064; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1] 1065; SSSE3-NEXT: movdqa %xmm2, 32(%rdi) 1066; SSSE3-NEXT: psrad $31, %xmm2 1067; SSSE3-NEXT: pcmpeqd %xmm4, %xmm2 1068; SSSE3-NEXT: pxor %xmm9, %xmm2 1069; SSSE3-NEXT: pxor %xmm4, %xmm4 1070; SSSE3-NEXT: pcmpgtd %xmm7, %xmm4 1071; SSSE3-NEXT: pand %xmm3, %xmm4 1072; SSSE3-NEXT: pcmpgtd %xmm3, %xmm8 1073; SSSE3-NEXT: pand %xmm7, %xmm8 1074; SSSE3-NEXT: paddd %xmm4, %xmm8 1075; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 1076; SSSE3-NEXT: pmuludq %xmm7, %xmm3 1077; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3] 1078; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3] 1079; SSSE3-NEXT: pmuludq %xmm4, %xmm6 1080; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,3,2,3] 1081; SSSE3-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1] 1082; SSSE3-NEXT: psubd %xmm8, %xmm5 1083; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3] 1084; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,2,2,3] 1085; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1] 1086; SSSE3-NEXT: movdqa %xmm3, 48(%rdi) 1087; SSSE3-NEXT: psrad $31, %xmm3 1088; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 1089; SSSE3-NEXT: pxor %xmm9, %xmm3 1090; SSSE3-NEXT: retq 1091; 1092; SSE41-LABEL: smulo_v16i32: 1093; SSE41: # %bb.0: 1094; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3] 1095; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3] 1096; SSE41-NEXT: pmuldq %xmm8, %xmm9 1097; SSE41-NEXT: movdqa %xmm0, %xmm8 1098; SSE41-NEXT: pmuldq %xmm4, %xmm8 1099; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3] 1100; SSE41-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7] 1101; SSE41-NEXT: pmulld %xmm4, %xmm0 1102; SSE41-NEXT: movdqa %xmm0, (%rdi) 1103; SSE41-NEXT: psrad $31, %xmm0 1104; SSE41-NEXT: pcmpeqd %xmm8, %xmm0 1105; SSE41-NEXT: pcmpeqd %xmm8, %xmm8 1106; SSE41-NEXT: pxor %xmm8, %xmm0 1107; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3] 1108; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3] 1109; SSE41-NEXT: pmuldq %xmm9, %xmm10 1110; SSE41-NEXT: movdqa %xmm1, %xmm4 1111; SSE41-NEXT: pmuldq %xmm5, %xmm4 1112; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1113; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm10[2,3],xmm4[4,5],xmm10[6,7] 1114; SSE41-NEXT: pmulld %xmm5, %xmm1 1115; SSE41-NEXT: movdqa %xmm1, 16(%rdi) 1116; SSE41-NEXT: psrad $31, %xmm1 1117; SSE41-NEXT: pcmpeqd %xmm4, %xmm1 1118; SSE41-NEXT: pxor %xmm8, %xmm1 1119; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 1120; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 1121; SSE41-NEXT: pmuldq %xmm4, %xmm5 1122; SSE41-NEXT: movdqa %xmm2, %xmm4 1123; SSE41-NEXT: pmuldq %xmm6, %xmm4 1124; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1125; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1126; SSE41-NEXT: pmulld %xmm6, %xmm2 1127; SSE41-NEXT: movdqa %xmm2, 32(%rdi) 1128; SSE41-NEXT: psrad $31, %xmm2 1129; SSE41-NEXT: pcmpeqd %xmm4, %xmm2 1130; SSE41-NEXT: pxor %xmm8, %xmm2 1131; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] 1132; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 1133; SSE41-NEXT: pmuldq %xmm4, %xmm5 1134; SSE41-NEXT: movdqa %xmm3, %xmm4 1135; SSE41-NEXT: pmuldq %xmm7, %xmm4 1136; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1137; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1138; SSE41-NEXT: pmulld %xmm7, %xmm3 1139; SSE41-NEXT: movdqa %xmm3, 48(%rdi) 1140; SSE41-NEXT: psrad $31, %xmm3 1141; SSE41-NEXT: pcmpeqd %xmm4, %xmm3 1142; SSE41-NEXT: pxor %xmm8, %xmm3 1143; SSE41-NEXT: retq 1144; 1145; AVX1-LABEL: smulo_v16i32: 1146; AVX1: # %bb.0: 1147; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1148; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3] 1149; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 1150; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm6[1,1,3,3] 1151; AVX1-NEXT: vpmuldq %xmm5, %xmm7, %xmm5 1152; AVX1-NEXT: vpmuldq %xmm4, %xmm6, %xmm7 1153; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1154; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm7[0,1],xmm5[2,3],xmm7[4,5],xmm5[6,7] 1155; AVX1-NEXT: vpmulld %xmm4, %xmm6, %xmm8 1156; AVX1-NEXT: vpsrad $31, %xmm8, %xmm6 1157; AVX1-NEXT: vpcmpeqd %xmm6, %xmm5, %xmm6 1158; AVX1-NEXT: vpcmpeqd %xmm9, %xmm9, %xmm9 1159; AVX1-NEXT: vpxor %xmm6, %xmm9, %xmm6 1160; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 1161; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 1162; AVX1-NEXT: vpmuldq %xmm7, %xmm4, %xmm4 1163; AVX1-NEXT: vpmuldq %xmm3, %xmm1, %xmm7 1164; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1165; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm7[0,1],xmm4[2,3],xmm7[4,5],xmm4[6,7] 1166; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm3 1167; AVX1-NEXT: vpsrad $31, %xmm3, %xmm1 1168; AVX1-NEXT: vpcmpeqd %xmm1, %xmm4, %xmm1 1169; AVX1-NEXT: vpxor %xmm1, %xmm9, %xmm1 1170; AVX1-NEXT: vpackssdw %xmm6, %xmm1, %xmm1 1171; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1172; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] 1173; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 1174; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 1175; AVX1-NEXT: vpmuldq %xmm6, %xmm5, %xmm5 1176; AVX1-NEXT: vpmuldq %xmm4, %xmm7, %xmm6 1177; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1178; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7] 1179; AVX1-NEXT: vpmulld %xmm4, %xmm7, %xmm4 1180; AVX1-NEXT: vpsrad $31, %xmm4, %xmm6 1181; AVX1-NEXT: vpcmpeqd %xmm6, %xmm5, %xmm5 1182; AVX1-NEXT: vpxor %xmm5, %xmm9, %xmm5 1183; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm2[1,1,3,3] 1184; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1185; AVX1-NEXT: vpmuldq %xmm6, %xmm7, %xmm6 1186; AVX1-NEXT: vpmuldq %xmm2, %xmm0, %xmm7 1187; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1188; AVX1-NEXT: vpblendw {{.*#+}} xmm6 = xmm7[0,1],xmm6[2,3],xmm7[4,5],xmm6[6,7] 1189; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm2 1190; AVX1-NEXT: vpsrad $31, %xmm2, %xmm0 1191; AVX1-NEXT: vpcmpeqd %xmm0, %xmm6, %xmm0 1192; AVX1-NEXT: vpxor %xmm0, %xmm9, %xmm0 1193; AVX1-NEXT: vpackssdw %xmm5, %xmm0, %xmm0 1194; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 1195; AVX1-NEXT: vpmovsxbd %xmm0, %xmm5 1196; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1] 1197; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0 1198; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm5, %ymm0 1199; AVX1-NEXT: vpacksswb %xmm1, %xmm1, %xmm1 1200; AVX1-NEXT: vpmovsxbd %xmm1, %xmm5 1201; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1] 1202; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 1203; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm5, %ymm1 1204; AVX1-NEXT: vmovdqa %xmm8, 48(%rdi) 1205; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi) 1206; AVX1-NEXT: vmovdqa %xmm4, 16(%rdi) 1207; AVX1-NEXT: vmovdqa %xmm2, (%rdi) 1208; AVX1-NEXT: retq 1209; 1210; AVX2-LABEL: smulo_v16i32: 1211; AVX2: # %bb.0: 1212; AVX2-NEXT: vpshufd {{.*#+}} ymm4 = ymm3[1,1,3,3,5,5,7,7] 1213; AVX2-NEXT: vpshufd {{.*#+}} ymm5 = ymm1[1,1,3,3,5,5,7,7] 1214; AVX2-NEXT: vpmuldq %ymm4, %ymm5, %ymm4 1215; AVX2-NEXT: vpmuldq %ymm3, %ymm1, %ymm5 1216; AVX2-NEXT: vpshufd {{.*#+}} ymm5 = ymm5[1,1,3,3,5,5,7,7] 1217; AVX2-NEXT: vpblendd {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2],ymm4[3],ymm5[4],ymm4[5],ymm5[6],ymm4[7] 1218; AVX2-NEXT: vpmulld %ymm3, %ymm1, %ymm3 1219; AVX2-NEXT: vpsrad $31, %ymm3, %ymm1 1220; AVX2-NEXT: vpcmpeqd %ymm1, %ymm4, %ymm1 1221; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 1222; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 1223; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5 1224; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1 1225; AVX2-NEXT: vpshufd {{.*#+}} ymm5 = ymm2[1,1,3,3,5,5,7,7] 1226; AVX2-NEXT: vpshufd {{.*#+}} ymm6 = ymm0[1,1,3,3,5,5,7,7] 1227; AVX2-NEXT: vpmuldq %ymm5, %ymm6, %ymm5 1228; AVX2-NEXT: vpmuldq %ymm2, %ymm0, %ymm6 1229; AVX2-NEXT: vpshufd {{.*#+}} ymm6 = ymm6[1,1,3,3,5,5,7,7] 1230; AVX2-NEXT: vpblendd {{.*#+}} ymm5 = ymm6[0],ymm5[1],ymm6[2],ymm5[3],ymm6[4],ymm5[5],ymm6[6],ymm5[7] 1231; AVX2-NEXT: vpmulld %ymm2, %ymm0, %ymm2 1232; AVX2-NEXT: vpsrad $31, %ymm2, %ymm0 1233; AVX2-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0 1234; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0 1235; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 1236; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0 1237; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 1238; AVX2-NEXT: vpmovsxbd %xmm0, %ymm0 1239; AVX2-NEXT: vpacksswb %xmm1, %xmm1, %xmm1 1240; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1 1241; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi) 1242; AVX2-NEXT: vmovdqa %ymm2, (%rdi) 1243; AVX2-NEXT: retq 1244; 1245; AVX512-LABEL: smulo_v16i32: 1246; AVX512: # %bb.0: 1247; AVX512-NEXT: vpmuldq %zmm1, %zmm0, %zmm2 1248; AVX512-NEXT: vpshufd {{.*#+}} zmm3 = zmm1[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15] 1249; AVX512-NEXT: vpshufd {{.*#+}} zmm4 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15] 1250; AVX512-NEXT: vpmuldq %zmm3, %zmm4, %zmm3 1251; AVX512-NEXT: vmovdqa64 {{.*#+}} zmm4 = [1,17,3,19,5,21,7,23,9,25,11,27,13,29,15,31] 1252; AVX512-NEXT: vpermi2d %zmm3, %zmm2, %zmm4 1253; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm1 1254; AVX512-NEXT: vpsrad $31, %zmm1, %zmm0 1255; AVX512-NEXT: vpcmpneqd %zmm0, %zmm4, %k1 1256; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 1257; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi) 1258; AVX512-NEXT: retq 1259 %t = call {<16 x i32>, <16 x i1>} @llvm.smul.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1) 1260 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0 1261 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1 1262 %res = sext <16 x i1> %obit to <16 x i32> 1263 store <16 x i32> %val, <16 x i32>* %p2 1264 ret <16 x i32> %res 1265} 1266 1267define <16 x i32> @smulo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind { 1268; SSE2-LABEL: smulo_v16i8: 1269; SSE2: # %bb.0: 1270; SSE2-NEXT: pxor %xmm2, %xmm2 1271; SSE2-NEXT: pxor %xmm3, %xmm3 1272; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15] 1273; SSE2-NEXT: pxor %xmm5, %xmm5 1274; 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] 1275; SSE2-NEXT: pmulhw %xmm3, %xmm5 1276; SSE2-NEXT: movdqa %xmm5, %xmm3 1277; SSE2-NEXT: psrlw $8, %xmm3 1278; SSE2-NEXT: pxor %xmm6, %xmm6 1279; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1],xmm6[2],xmm1[2],xmm6[3],xmm1[3],xmm6[4],xmm1[4],xmm6[5],xmm1[5],xmm6[6],xmm1[6],xmm6[7],xmm1[7] 1280; SSE2-NEXT: pxor %xmm4, %xmm4 1281; 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] 1282; SSE2-NEXT: pmulhw %xmm6, %xmm4 1283; SSE2-NEXT: movdqa %xmm4, %xmm0 1284; SSE2-NEXT: psrlw $8, %xmm0 1285; SSE2-NEXT: packuswb %xmm3, %xmm0 1286; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1287; SSE2-NEXT: pand %xmm1, %xmm5 1288; SSE2-NEXT: pand %xmm1, %xmm4 1289; SSE2-NEXT: packuswb %xmm5, %xmm4 1290; SSE2-NEXT: pcmpgtb %xmm4, %xmm2 1291; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1292; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 1293; SSE2-NEXT: pxor %xmm2, %xmm3 1294; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1295; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 1296; SSE2-NEXT: psrad $24, %xmm0 1297; SSE2-NEXT: movdqa %xmm3, %xmm1 1298; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1299; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 1300; SSE2-NEXT: pslld $31, %xmm1 1301; SSE2-NEXT: psrad $31, %xmm1 1302; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1303; SSE2-NEXT: movdqa %xmm3, %xmm2 1304; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3] 1305; SSE2-NEXT: pslld $31, %xmm2 1306; SSE2-NEXT: psrad $31, %xmm2 1307; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7] 1308; SSE2-NEXT: pslld $31, %xmm3 1309; SSE2-NEXT: psrad $31, %xmm3 1310; SSE2-NEXT: movdqa %xmm4, (%rdi) 1311; SSE2-NEXT: retq 1312; 1313; SSSE3-LABEL: smulo_v16i8: 1314; SSSE3: # %bb.0: 1315; SSSE3-NEXT: pxor %xmm2, %xmm2 1316; SSSE3-NEXT: pxor %xmm3, %xmm3 1317; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15] 1318; SSSE3-NEXT: pxor %xmm5, %xmm5 1319; SSSE3-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] 1320; SSSE3-NEXT: pmulhw %xmm3, %xmm5 1321; SSSE3-NEXT: movdqa %xmm5, %xmm3 1322; SSSE3-NEXT: psrlw $8, %xmm3 1323; SSSE3-NEXT: pxor %xmm6, %xmm6 1324; SSSE3-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1],xmm6[2],xmm1[2],xmm6[3],xmm1[3],xmm6[4],xmm1[4],xmm6[5],xmm1[5],xmm6[6],xmm1[6],xmm6[7],xmm1[7] 1325; SSSE3-NEXT: pxor %xmm4, %xmm4 1326; SSSE3-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] 1327; SSSE3-NEXT: pmulhw %xmm6, %xmm4 1328; SSSE3-NEXT: movdqa %xmm4, %xmm0 1329; SSSE3-NEXT: psrlw $8, %xmm0 1330; SSSE3-NEXT: packuswb %xmm3, %xmm0 1331; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1332; SSSE3-NEXT: pand %xmm1, %xmm5 1333; SSSE3-NEXT: pand %xmm1, %xmm4 1334; SSSE3-NEXT: packuswb %xmm5, %xmm4 1335; SSSE3-NEXT: pcmpgtb %xmm4, %xmm2 1336; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2 1337; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3 1338; SSSE3-NEXT: pxor %xmm2, %xmm3 1339; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1340; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 1341; SSSE3-NEXT: psrad $24, %xmm0 1342; SSSE3-NEXT: movdqa %xmm3, %xmm1 1343; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1344; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 1345; SSSE3-NEXT: pslld $31, %xmm1 1346; SSSE3-NEXT: psrad $31, %xmm1 1347; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1348; SSSE3-NEXT: movdqa %xmm3, %xmm2 1349; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3] 1350; SSSE3-NEXT: pslld $31, %xmm2 1351; SSSE3-NEXT: psrad $31, %xmm2 1352; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7] 1353; SSSE3-NEXT: pslld $31, %xmm3 1354; SSSE3-NEXT: psrad $31, %xmm3 1355; SSSE3-NEXT: movdqa %xmm4, (%rdi) 1356; SSSE3-NEXT: retq 1357; 1358; SSE41-LABEL: smulo_v16i8: 1359; SSE41: # %bb.0: 1360; SSE41-NEXT: pxor %xmm2, %xmm2 1361; SSE41-NEXT: pxor %xmm3, %xmm3 1362; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15] 1363; SSE41-NEXT: pxor %xmm5, %xmm5 1364; 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] 1365; SSE41-NEXT: pmulhw %xmm3, %xmm5 1366; SSE41-NEXT: movdqa %xmm5, %xmm3 1367; SSE41-NEXT: psrlw $8, %xmm3 1368; SSE41-NEXT: pxor %xmm6, %xmm6 1369; SSE41-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1],xmm6[2],xmm1[2],xmm6[3],xmm1[3],xmm6[4],xmm1[4],xmm6[5],xmm1[5],xmm6[6],xmm1[6],xmm6[7],xmm1[7] 1370; SSE41-NEXT: pxor %xmm4, %xmm4 1371; SSE41-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] 1372; SSE41-NEXT: pmulhw %xmm6, %xmm4 1373; SSE41-NEXT: movdqa %xmm4, %xmm0 1374; SSE41-NEXT: psrlw $8, %xmm0 1375; SSE41-NEXT: packuswb %xmm3, %xmm0 1376; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1377; SSE41-NEXT: pand %xmm1, %xmm5 1378; SSE41-NEXT: pand %xmm1, %xmm4 1379; SSE41-NEXT: packuswb %xmm5, %xmm4 1380; SSE41-NEXT: pcmpgtb %xmm4, %xmm2 1381; SSE41-NEXT: pcmpeqb %xmm0, %xmm2 1382; SSE41-NEXT: pcmpeqd %xmm3, %xmm3 1383; SSE41-NEXT: pxor %xmm2, %xmm3 1384; SSE41-NEXT: pmovsxbd %xmm3, %xmm0 1385; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1] 1386; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 1387; SSE41-NEXT: pslld $31, %xmm1 1388; SSE41-NEXT: psrad $31, %xmm1 1389; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3] 1390; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero 1391; SSE41-NEXT: pslld $31, %xmm2 1392; SSE41-NEXT: psrad $31, %xmm2 1393; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3] 1394; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 1395; SSE41-NEXT: pslld $31, %xmm3 1396; SSE41-NEXT: psrad $31, %xmm3 1397; SSE41-NEXT: movdqa %xmm4, (%rdi) 1398; SSE41-NEXT: retq 1399; 1400; AVX1-LABEL: smulo_v16i8: 1401; AVX1: # %bb.0: 1402; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1403; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15] 1404; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 1405; AVX1-NEXT: vpmulhw %xmm3, %xmm4, %xmm3 1406; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm4 1407; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 1408; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = 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] 1409; AVX1-NEXT: vpmulhw %xmm1, %xmm0, %xmm0 1410; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 1411; AVX1-NEXT: vpackuswb %xmm4, %xmm1, %xmm1 1412; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 1413; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 1414; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 1415; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm3 1416; AVX1-NEXT: vpcmpgtb %xmm3, %xmm2, %xmm0 1417; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1418; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1419; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1 1420; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0 1421; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1] 1422; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2 1423; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1424; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 1425; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2 1426; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3] 1427; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 1428; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 1429; AVX1-NEXT: vmovdqa %xmm3, (%rdi) 1430; AVX1-NEXT: retq 1431; 1432; AVX2-LABEL: smulo_v16i8: 1433; AVX2: # %bb.0: 1434; AVX2-NEXT: vpmovsxbw %xmm1, %ymm1 1435; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0 1436; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 1437; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm1 1438; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 1439; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 1440; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1441; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1442; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm2 1443; AVX2-NEXT: vpxor %xmm0, %xmm0, %xmm0 1444; AVX2-NEXT: vpcmpgtb %xmm2, %xmm0, %xmm0 1445; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1446; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1447; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1 1448; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0 1449; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3] 1450; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1 1451; AVX2-NEXT: vmovdqa %xmm2, (%rdi) 1452; AVX2-NEXT: retq 1453; 1454; AVX512F-LABEL: smulo_v16i8: 1455; AVX512F: # %bb.0: 1456; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1 1457; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 1458; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm1 1459; AVX512F-NEXT: vpsraw $8, %ymm1, %ymm0 1460; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 1461; AVX512F-NEXT: vpsllw $8, %ymm1, %ymm2 1462; AVX512F-NEXT: vpsraw $15, %ymm2, %ymm2 1463; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2 1464; AVX512F-NEXT: vpcmpneqd %zmm0, %zmm2, %k1 1465; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 1466; AVX512F-NEXT: vpmovzxwd {{.*#+}} 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 1467; AVX512F-NEXT: vpmovdb %zmm1, (%rdi) 1468; AVX512F-NEXT: retq 1469; 1470; AVX512BW-LABEL: smulo_v16i8: 1471; AVX512BW: # %bb.0: 1472; AVX512BW-NEXT: vpmovsxbw %xmm1, %ymm1 1473; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm0 1474; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm1 1475; AVX512BW-NEXT: vpsraw $8, %ymm1, %ymm0 1476; AVX512BW-NEXT: vpsllw $8, %ymm1, %ymm2 1477; AVX512BW-NEXT: vpsraw $15, %ymm2, %ymm2 1478; AVX512BW-NEXT: vpcmpneqw %ymm0, %ymm2, %k1 1479; AVX512BW-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 1480; AVX512BW-NEXT: vpmovwb %ymm1, (%rdi) 1481; AVX512BW-NEXT: retq 1482 %t = call {<16 x i8>, <16 x i1>} @llvm.smul.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1) 1483 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0 1484 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1 1485 %res = sext <16 x i1> %obit to <16 x i32> 1486 store <16 x i8> %val, <16 x i8>* %p2 1487 ret <16 x i32> %res 1488} 1489 1490define <32 x i32> @smulo_v32i8(<32 x i8> %a0, <32 x i8> %a1, <32 x i8>* %p2) nounwind { 1491; SSE2-LABEL: smulo_v32i8: 1492; SSE2: # %bb.0: 1493; SSE2-NEXT: movq %rdi, %rax 1494; SSE2-NEXT: pxor %xmm4, %xmm4 1495; SSE2-NEXT: pxor %xmm5, %xmm5 1496; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15] 1497; SSE2-NEXT: pxor %xmm6, %xmm6 1498; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15] 1499; SSE2-NEXT: pmulhw %xmm5, %xmm6 1500; SSE2-NEXT: movdqa %xmm6, %xmm5 1501; SSE2-NEXT: psrlw $8, %xmm5 1502; SSE2-NEXT: pxor %xmm7, %xmm7 1503; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1],xmm7[2],xmm3[2],xmm7[3],xmm3[3],xmm7[4],xmm3[4],xmm7[5],xmm3[5],xmm7[6],xmm3[6],xmm7[7],xmm3[7] 1504; SSE2-NEXT: pxor %xmm10, %xmm10 1505; SSE2-NEXT: punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm1[0],xmm10[1],xmm1[1],xmm10[2],xmm1[2],xmm10[3],xmm1[3],xmm10[4],xmm1[4],xmm10[5],xmm1[5],xmm10[6],xmm1[6],xmm10[7],xmm1[7] 1506; SSE2-NEXT: pmulhw %xmm7, %xmm10 1507; SSE2-NEXT: movdqa %xmm10, %xmm7 1508; SSE2-NEXT: psrlw $8, %xmm7 1509; SSE2-NEXT: packuswb %xmm5, %xmm7 1510; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255] 1511; SSE2-NEXT: pand %xmm9, %xmm6 1512; SSE2-NEXT: pand %xmm9, %xmm10 1513; SSE2-NEXT: packuswb %xmm6, %xmm10 1514; SSE2-NEXT: pxor %xmm3, %xmm3 1515; SSE2-NEXT: pcmpgtb %xmm10, %xmm3 1516; SSE2-NEXT: pcmpeqb %xmm7, %xmm3 1517; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 1518; SSE2-NEXT: pxor %xmm8, %xmm3 1519; SSE2-NEXT: pxor %xmm7, %xmm7 1520; SSE2-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm2[8],xmm7[9],xmm2[9],xmm7[10],xmm2[10],xmm7[11],xmm2[11],xmm7[12],xmm2[12],xmm7[13],xmm2[13],xmm7[14],xmm2[14],xmm7[15],xmm2[15] 1521; SSE2-NEXT: pxor %xmm6, %xmm6 1522; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15] 1523; SSE2-NEXT: pmulhw %xmm7, %xmm6 1524; SSE2-NEXT: movdqa %xmm6, %xmm7 1525; SSE2-NEXT: psrlw $8, %xmm7 1526; SSE2-NEXT: pxor %xmm5, %xmm5 1527; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7] 1528; SSE2-NEXT: pxor %xmm11, %xmm11 1529; SSE2-NEXT: punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm0[0],xmm11[1],xmm0[1],xmm11[2],xmm0[2],xmm11[3],xmm0[3],xmm11[4],xmm0[4],xmm11[5],xmm0[5],xmm11[6],xmm0[6],xmm11[7],xmm0[7] 1530; SSE2-NEXT: pmulhw %xmm5, %xmm11 1531; SSE2-NEXT: movdqa %xmm11, %xmm0 1532; SSE2-NEXT: psrlw $8, %xmm0 1533; SSE2-NEXT: packuswb %xmm7, %xmm0 1534; SSE2-NEXT: pand %xmm9, %xmm6 1535; SSE2-NEXT: pand %xmm9, %xmm11 1536; SSE2-NEXT: packuswb %xmm6, %xmm11 1537; SSE2-NEXT: pcmpgtb %xmm11, %xmm4 1538; SSE2-NEXT: pcmpeqb %xmm0, %xmm4 1539; SSE2-NEXT: pxor %xmm8, %xmm4 1540; SSE2-NEXT: movdqa %xmm4, %xmm0 1541; SSE2-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm4[0],xmm8[1],xmm4[1],xmm8[2],xmm4[2],xmm8[3],xmm4[3],xmm8[4],xmm4[4],xmm8[5],xmm4[5],xmm8[6],xmm4[6],xmm8[7],xmm4[7] 1542; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1543; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7] 1544; SSE2-NEXT: pslld $31, %xmm4 1545; SSE2-NEXT: psrad $31, %xmm4 1546; SSE2-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1547; SSE2-NEXT: movdqa %xmm0, %xmm6 1548; SSE2-NEXT: punpcklwd {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3] 1549; SSE2-NEXT: pslld $31, %xmm6 1550; SSE2-NEXT: psrad $31, %xmm6 1551; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7] 1552; SSE2-NEXT: pslld $31, %xmm0 1553; SSE2-NEXT: psrad $31, %xmm0 1554; SSE2-NEXT: movdqa %xmm3, %xmm7 1555; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1556; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7] 1557; SSE2-NEXT: pslld $31, %xmm7 1558; SSE2-NEXT: psrad $31, %xmm7 1559; SSE2-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm3[0],xmm9[1],xmm3[1],xmm9[2],xmm3[2],xmm9[3],xmm3[3],xmm9[4],xmm3[4],xmm9[5],xmm3[5],xmm9[6],xmm3[6],xmm9[7],xmm3[7] 1560; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1561; SSE2-NEXT: movdqa %xmm3, %xmm1 1562; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3] 1563; SSE2-NEXT: pslld $31, %xmm1 1564; SSE2-NEXT: psrad $31, %xmm1 1565; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7] 1566; SSE2-NEXT: pslld $31, %xmm3 1567; SSE2-NEXT: psrad $31, %xmm3 1568; SSE2-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3] 1569; SSE2-NEXT: psrad $24, %xmm5 1570; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm9[0],xmm2[1],xmm9[1],xmm2[2],xmm9[2],xmm2[3],xmm9[3] 1571; SSE2-NEXT: psrad $24, %xmm2 1572; SSE2-NEXT: movdqa %xmm10, 16(%rsi) 1573; SSE2-NEXT: movdqa %xmm11, (%rsi) 1574; SSE2-NEXT: movdqa %xmm2, 64(%rdi) 1575; SSE2-NEXT: movdqa %xmm5, (%rdi) 1576; SSE2-NEXT: movdqa %xmm3, 112(%rdi) 1577; SSE2-NEXT: movdqa %xmm1, 96(%rdi) 1578; SSE2-NEXT: movdqa %xmm7, 80(%rdi) 1579; SSE2-NEXT: movdqa %xmm0, 48(%rdi) 1580; SSE2-NEXT: movdqa %xmm6, 32(%rdi) 1581; SSE2-NEXT: movdqa %xmm4, 16(%rdi) 1582; SSE2-NEXT: retq 1583; 1584; SSSE3-LABEL: smulo_v32i8: 1585; SSSE3: # %bb.0: 1586; SSSE3-NEXT: movq %rdi, %rax 1587; SSSE3-NEXT: pxor %xmm4, %xmm4 1588; SSSE3-NEXT: pxor %xmm5, %xmm5 1589; SSSE3-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15] 1590; SSSE3-NEXT: pxor %xmm6, %xmm6 1591; SSSE3-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15] 1592; SSSE3-NEXT: pmulhw %xmm5, %xmm6 1593; SSSE3-NEXT: movdqa %xmm6, %xmm5 1594; SSSE3-NEXT: psrlw $8, %xmm5 1595; SSSE3-NEXT: pxor %xmm7, %xmm7 1596; SSSE3-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1],xmm7[2],xmm3[2],xmm7[3],xmm3[3],xmm7[4],xmm3[4],xmm7[5],xmm3[5],xmm7[6],xmm3[6],xmm7[7],xmm3[7] 1597; SSSE3-NEXT: pxor %xmm10, %xmm10 1598; SSSE3-NEXT: punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm1[0],xmm10[1],xmm1[1],xmm10[2],xmm1[2],xmm10[3],xmm1[3],xmm10[4],xmm1[4],xmm10[5],xmm1[5],xmm10[6],xmm1[6],xmm10[7],xmm1[7] 1599; SSSE3-NEXT: pmulhw %xmm7, %xmm10 1600; SSSE3-NEXT: movdqa %xmm10, %xmm7 1601; SSSE3-NEXT: psrlw $8, %xmm7 1602; SSSE3-NEXT: packuswb %xmm5, %xmm7 1603; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255] 1604; SSSE3-NEXT: pand %xmm9, %xmm6 1605; SSSE3-NEXT: pand %xmm9, %xmm10 1606; SSSE3-NEXT: packuswb %xmm6, %xmm10 1607; SSSE3-NEXT: pxor %xmm3, %xmm3 1608; SSSE3-NEXT: pcmpgtb %xmm10, %xmm3 1609; SSSE3-NEXT: pcmpeqb %xmm7, %xmm3 1610; SSSE3-NEXT: pcmpeqd %xmm8, %xmm8 1611; SSSE3-NEXT: pxor %xmm8, %xmm3 1612; SSSE3-NEXT: pxor %xmm7, %xmm7 1613; SSSE3-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm2[8],xmm7[9],xmm2[9],xmm7[10],xmm2[10],xmm7[11],xmm2[11],xmm7[12],xmm2[12],xmm7[13],xmm2[13],xmm7[14],xmm2[14],xmm7[15],xmm2[15] 1614; SSSE3-NEXT: pxor %xmm6, %xmm6 1615; SSSE3-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] 1616; SSSE3-NEXT: pmulhw %xmm7, %xmm6 1617; SSSE3-NEXT: movdqa %xmm6, %xmm7 1618; SSSE3-NEXT: psrlw $8, %xmm7 1619; SSSE3-NEXT: pxor %xmm5, %xmm5 1620; SSSE3-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7] 1621; SSSE3-NEXT: pxor %xmm11, %xmm11 1622; SSSE3-NEXT: punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm0[0],xmm11[1],xmm0[1],xmm11[2],xmm0[2],xmm11[3],xmm0[3],xmm11[4],xmm0[4],xmm11[5],xmm0[5],xmm11[6],xmm0[6],xmm11[7],xmm0[7] 1623; SSSE3-NEXT: pmulhw %xmm5, %xmm11 1624; SSSE3-NEXT: movdqa %xmm11, %xmm0 1625; SSSE3-NEXT: psrlw $8, %xmm0 1626; SSSE3-NEXT: packuswb %xmm7, %xmm0 1627; SSSE3-NEXT: pand %xmm9, %xmm6 1628; SSSE3-NEXT: pand %xmm9, %xmm11 1629; SSSE3-NEXT: packuswb %xmm6, %xmm11 1630; SSSE3-NEXT: pcmpgtb %xmm11, %xmm4 1631; SSSE3-NEXT: pcmpeqb %xmm0, %xmm4 1632; SSSE3-NEXT: pxor %xmm8, %xmm4 1633; SSSE3-NEXT: movdqa %xmm4, %xmm0 1634; SSSE3-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm4[0],xmm8[1],xmm4[1],xmm8[2],xmm4[2],xmm8[3],xmm4[3],xmm8[4],xmm4[4],xmm8[5],xmm4[5],xmm8[6],xmm4[6],xmm8[7],xmm4[7] 1635; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1636; SSSE3-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7] 1637; SSSE3-NEXT: pslld $31, %xmm4 1638; SSSE3-NEXT: psrad $31, %xmm4 1639; SSSE3-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1640; SSSE3-NEXT: movdqa %xmm0, %xmm6 1641; SSSE3-NEXT: punpcklwd {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3] 1642; SSSE3-NEXT: pslld $31, %xmm6 1643; SSSE3-NEXT: psrad $31, %xmm6 1644; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7] 1645; SSSE3-NEXT: pslld $31, %xmm0 1646; SSSE3-NEXT: psrad $31, %xmm0 1647; SSSE3-NEXT: movdqa %xmm3, %xmm7 1648; SSSE3-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1649; SSSE3-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7] 1650; SSSE3-NEXT: pslld $31, %xmm7 1651; SSSE3-NEXT: psrad $31, %xmm7 1652; SSSE3-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm3[0],xmm9[1],xmm3[1],xmm9[2],xmm3[2],xmm9[3],xmm3[3],xmm9[4],xmm3[4],xmm9[5],xmm3[5],xmm9[6],xmm3[6],xmm9[7],xmm3[7] 1653; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1654; SSSE3-NEXT: movdqa %xmm3, %xmm1 1655; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3] 1656; SSSE3-NEXT: pslld $31, %xmm1 1657; SSSE3-NEXT: psrad $31, %xmm1 1658; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7] 1659; SSSE3-NEXT: pslld $31, %xmm3 1660; SSSE3-NEXT: psrad $31, %xmm3 1661; SSSE3-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3] 1662; SSSE3-NEXT: psrad $24, %xmm5 1663; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm9[0],xmm2[1],xmm9[1],xmm2[2],xmm9[2],xmm2[3],xmm9[3] 1664; SSSE3-NEXT: psrad $24, %xmm2 1665; SSSE3-NEXT: movdqa %xmm10, 16(%rsi) 1666; SSSE3-NEXT: movdqa %xmm11, (%rsi) 1667; SSSE3-NEXT: movdqa %xmm2, 64(%rdi) 1668; SSSE3-NEXT: movdqa %xmm5, (%rdi) 1669; SSSE3-NEXT: movdqa %xmm3, 112(%rdi) 1670; SSSE3-NEXT: movdqa %xmm1, 96(%rdi) 1671; SSSE3-NEXT: movdqa %xmm7, 80(%rdi) 1672; SSSE3-NEXT: movdqa %xmm0, 48(%rdi) 1673; SSSE3-NEXT: movdqa %xmm6, 32(%rdi) 1674; SSSE3-NEXT: movdqa %xmm4, 16(%rdi) 1675; SSSE3-NEXT: retq 1676; 1677; SSE41-LABEL: smulo_v32i8: 1678; SSE41: # %bb.0: 1679; SSE41-NEXT: movq %rdi, %rax 1680; SSE41-NEXT: pxor %xmm10, %xmm10 1681; SSE41-NEXT: pxor %xmm5, %xmm5 1682; SSE41-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15] 1683; SSE41-NEXT: pxor %xmm6, %xmm6 1684; SSE41-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15] 1685; SSE41-NEXT: pmulhw %xmm5, %xmm6 1686; SSE41-NEXT: movdqa %xmm6, %xmm5 1687; SSE41-NEXT: psrlw $8, %xmm5 1688; SSE41-NEXT: pxor %xmm7, %xmm7 1689; SSE41-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1],xmm7[2],xmm3[2],xmm7[3],xmm3[3],xmm7[4],xmm3[4],xmm7[5],xmm3[5],xmm7[6],xmm3[6],xmm7[7],xmm3[7] 1690; SSE41-NEXT: pxor %xmm3, %xmm3 1691; SSE41-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7] 1692; SSE41-NEXT: pmulhw %xmm7, %xmm3 1693; SSE41-NEXT: movdqa %xmm3, %xmm7 1694; SSE41-NEXT: psrlw $8, %xmm7 1695; SSE41-NEXT: packuswb %xmm5, %xmm7 1696; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255] 1697; SSE41-NEXT: pand %xmm9, %xmm6 1698; SSE41-NEXT: pand %xmm9, %xmm3 1699; SSE41-NEXT: packuswb %xmm6, %xmm3 1700; SSE41-NEXT: pxor %xmm1, %xmm1 1701; SSE41-NEXT: pcmpgtb %xmm3, %xmm1 1702; SSE41-NEXT: pcmpeqb %xmm7, %xmm1 1703; SSE41-NEXT: pcmpeqd %xmm8, %xmm8 1704; SSE41-NEXT: pxor %xmm8, %xmm1 1705; SSE41-NEXT: pxor %xmm7, %xmm7 1706; SSE41-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm2[8],xmm7[9],xmm2[9],xmm7[10],xmm2[10],xmm7[11],xmm2[11],xmm7[12],xmm2[12],xmm7[13],xmm2[13],xmm7[14],xmm2[14],xmm7[15],xmm2[15] 1707; SSE41-NEXT: pxor %xmm6, %xmm6 1708; 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] 1709; SSE41-NEXT: pmulhw %xmm7, %xmm6 1710; SSE41-NEXT: movdqa %xmm6, %xmm7 1711; SSE41-NEXT: psrlw $8, %xmm7 1712; SSE41-NEXT: pxor %xmm5, %xmm5 1713; SSE41-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7] 1714; SSE41-NEXT: pxor %xmm2, %xmm2 1715; SSE41-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] 1716; SSE41-NEXT: pmulhw %xmm5, %xmm2 1717; SSE41-NEXT: movdqa %xmm2, %xmm0 1718; SSE41-NEXT: psrlw $8, %xmm0 1719; SSE41-NEXT: packuswb %xmm7, %xmm0 1720; SSE41-NEXT: pand %xmm9, %xmm6 1721; SSE41-NEXT: pand %xmm9, %xmm2 1722; SSE41-NEXT: packuswb %xmm6, %xmm2 1723; SSE41-NEXT: pcmpgtb %xmm2, %xmm10 1724; SSE41-NEXT: pcmpeqb %xmm0, %xmm10 1725; SSE41-NEXT: pxor %xmm8, %xmm10 1726; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,1,1] 1727; SSE41-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1728; SSE41-NEXT: pslld $31, %xmm8 1729; SSE41-NEXT: psrad $31, %xmm8 1730; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3] 1731; SSE41-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero 1732; SSE41-NEXT: pslld $31, %xmm5 1733; SSE41-NEXT: psrad $31, %xmm5 1734; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm10[3,3,3,3] 1735; SSE41-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero,xmm6[2],zero,zero,zero,xmm6[3],zero,zero,zero 1736; SSE41-NEXT: pslld $31, %xmm6 1737; SSE41-NEXT: psrad $31, %xmm6 1738; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,1,1] 1739; SSE41-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero 1740; SSE41-NEXT: pslld $31, %xmm7 1741; SSE41-NEXT: psrad $31, %xmm7 1742; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 1743; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1744; SSE41-NEXT: pslld $31, %xmm0 1745; SSE41-NEXT: psrad $31, %xmm0 1746; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[3,3,3,3] 1747; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero 1748; SSE41-NEXT: pslld $31, %xmm4 1749; SSE41-NEXT: psrad $31, %xmm4 1750; SSE41-NEXT: pmovsxbd %xmm10, %xmm9 1751; SSE41-NEXT: pmovsxbd %xmm1, %xmm1 1752; SSE41-NEXT: movdqa %xmm3, 16(%rsi) 1753; SSE41-NEXT: movdqa %xmm2, (%rsi) 1754; SSE41-NEXT: movdqa %xmm1, 64(%rdi) 1755; SSE41-NEXT: movdqa %xmm9, (%rdi) 1756; SSE41-NEXT: movdqa %xmm4, 112(%rdi) 1757; SSE41-NEXT: movdqa %xmm0, 96(%rdi) 1758; SSE41-NEXT: movdqa %xmm7, 80(%rdi) 1759; SSE41-NEXT: movdqa %xmm6, 48(%rdi) 1760; SSE41-NEXT: movdqa %xmm5, 32(%rdi) 1761; SSE41-NEXT: movdqa %xmm8, 16(%rdi) 1762; SSE41-NEXT: retq 1763; 1764; AVX1-LABEL: smulo_v32i8: 1765; AVX1: # %bb.0: 1766; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1767; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1768; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15] 1769; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1770; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = xmm2[8],xmm5[8],xmm2[9],xmm5[9],xmm2[10],xmm5[10],xmm2[11],xmm5[11],xmm2[12],xmm5[12],xmm2[13],xmm5[13],xmm2[14],xmm5[14],xmm2[15],xmm5[15] 1771; AVX1-NEXT: vpmulhw %xmm4, %xmm6, %xmm4 1772; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm6 1773; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7] 1774; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm5 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3],xmm2[4],xmm5[4],xmm2[5],xmm5[5],xmm2[6],xmm5[6],xmm2[7],xmm5[7] 1775; AVX1-NEXT: vpmulhw %xmm3, %xmm5, %xmm3 1776; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm5 1777; AVX1-NEXT: vpackuswb %xmm6, %xmm5, %xmm5 1778; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255] 1779; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4 1780; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3 1781; AVX1-NEXT: vpackuswb %xmm4, %xmm3, %xmm4 1782; AVX1-NEXT: vpcmpgtb %xmm4, %xmm2, %xmm3 1783; AVX1-NEXT: vpcmpeqb %xmm5, %xmm3, %xmm3 1784; AVX1-NEXT: vpcmpeqd %xmm8, %xmm8, %xmm8 1785; AVX1-NEXT: vpxor %xmm3, %xmm8, %xmm3 1786; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm7 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15] 1787; 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] 1788; AVX1-NEXT: vpmulhw %xmm7, %xmm5, %xmm5 1789; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm7 1790; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 1791; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = 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] 1792; AVX1-NEXT: vpmulhw %xmm1, %xmm0, %xmm0 1793; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 1794; AVX1-NEXT: vpackuswb %xmm7, %xmm1, %xmm1 1795; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5 1796; AVX1-NEXT: vpand %xmm6, %xmm0, %xmm0 1797; AVX1-NEXT: vpackuswb %xmm5, %xmm0, %xmm5 1798; AVX1-NEXT: vpcmpgtb %xmm5, %xmm2, %xmm0 1799; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1800; AVX1-NEXT: vpxor %xmm0, %xmm8, %xmm1 1801; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0 1802; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1] 1803; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2 1804; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1805; AVX1-NEXT: vpmovsxbd %xmm3, %xmm2 1806; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm3[1,1,1,1] 1807; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6 1808; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2 1809; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[2,3,2,3] 1810; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6 1811; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3] 1812; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 1813; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm6, %ymm1 1814; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm3[2,3,2,3] 1815; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6 1816; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[3,3,3,3] 1817; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3 1818; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3 1819; AVX1-NEXT: vmovdqa %xmm4, 16(%rdi) 1820; AVX1-NEXT: vmovdqa %xmm5, (%rdi) 1821; AVX1-NEXT: retq 1822; 1823; AVX2-LABEL: smulo_v32i8: 1824; AVX2: # %bb.0: 1825; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1826; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15],ymm2[24],ymm1[24],ymm2[25],ymm1[25],ymm2[26],ymm1[26],ymm2[27],ymm1[27],ymm2[28],ymm1[28],ymm2[29],ymm1[29],ymm2[30],ymm1[30],ymm2[31],ymm1[31] 1827; 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] 1828; AVX2-NEXT: vpmulhw %ymm3, %ymm4, %ymm3 1829; AVX2-NEXT: vpsrlw $8, %ymm3, %ymm4 1830; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[16],ymm1[16],ymm2[17],ymm1[17],ymm2[18],ymm1[18],ymm2[19],ymm1[19],ymm2[20],ymm1[20],ymm2[21],ymm1[21],ymm2[22],ymm1[22],ymm2[23],ymm1[23] 1831; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = 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] 1832; AVX2-NEXT: vpmulhw %ymm1, %ymm0, %ymm0 1833; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm1 1834; AVX2-NEXT: vpackuswb %ymm4, %ymm1, %ymm1 1835; AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 1836; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm3 1837; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 1838; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm4 1839; AVX2-NEXT: vpcmpgtb %ymm4, %ymm2, %ymm0 1840; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 1841; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 1842; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 1843; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0 1844; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 1845; AVX2-NEXT: vpmovsxbd %xmm3, %ymm2 1846; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3] 1847; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1 1848; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3] 1849; AVX2-NEXT: vpmovsxbd %xmm3, %ymm3 1850; AVX2-NEXT: vmovdqa %ymm4, (%rdi) 1851; AVX2-NEXT: retq 1852; 1853; AVX512F-LABEL: smulo_v32i8: 1854; AVX512F: # %bb.0: 1855; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 1856; AVX512F-NEXT: vpmovsxbw %xmm2, %ymm2 1857; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 1858; AVX512F-NEXT: vpmovsxbw %xmm3, %ymm3 1859; AVX512F-NEXT: vpmullw %ymm2, %ymm3, %ymm2 1860; AVX512F-NEXT: vpsraw $8, %ymm2, %ymm3 1861; AVX512F-NEXT: vpmovsxwd %ymm3, %zmm3 1862; AVX512F-NEXT: vpsllw $8, %ymm2, %ymm4 1863; AVX512F-NEXT: vpsraw $15, %ymm4, %ymm4 1864; AVX512F-NEXT: vpmovsxwd %ymm4, %zmm4 1865; AVX512F-NEXT: vpcmpneqd %zmm3, %zmm4, %k1 1866; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1 1867; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 1868; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm3 1869; AVX512F-NEXT: vpsraw $8, %ymm3, %ymm0 1870; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 1871; AVX512F-NEXT: vpsllw $8, %ymm3, %ymm1 1872; AVX512F-NEXT: vpsraw $15, %ymm1, %ymm1 1873; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1 1874; AVX512F-NEXT: vpcmpneqd %zmm0, %zmm1, %k2 1875; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k2} {z} 1876; AVX512F-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z} 1877; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero 1878; AVX512F-NEXT: vpmovdb %zmm2, 16(%rdi) 1879; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero 1880; AVX512F-NEXT: vpmovdb %zmm2, (%rdi) 1881; AVX512F-NEXT: retq 1882; 1883; AVX512BW-LABEL: smulo_v32i8: 1884; AVX512BW: # %bb.0: 1885; AVX512BW-NEXT: vpmovsxbw %ymm1, %zmm1 1886; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 1887; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm2 1888; AVX512BW-NEXT: vpsraw $8, %zmm2, %zmm0 1889; AVX512BW-NEXT: vpsllw $8, %zmm2, %zmm1 1890; AVX512BW-NEXT: vpsraw $15, %zmm1, %zmm1 1891; AVX512BW-NEXT: vpcmpneqw %zmm0, %zmm1, %k1 1892; AVX512BW-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 1893; AVX512BW-NEXT: kshiftrd $16, %k1, %k1 1894; AVX512BW-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z} 1895; AVX512BW-NEXT: vpmovwb %zmm2, (%rdi) 1896; AVX512BW-NEXT: retq 1897 %t = call {<32 x i8>, <32 x i1>} @llvm.smul.with.overflow.v32i8(<32 x i8> %a0, <32 x i8> %a1) 1898 %val = extractvalue {<32 x i8>, <32 x i1>} %t, 0 1899 %obit = extractvalue {<32 x i8>, <32 x i1>} %t, 1 1900 %res = sext <32 x i1> %obit to <32 x i32> 1901 store <32 x i8> %val, <32 x i8>* %p2 1902 ret <32 x i32> %res 1903} 1904 1905define <64 x i32> @smulo_v64i8(<64 x i8> %a0, <64 x i8> %a1, <64 x i8>* %p2) nounwind { 1906; SSE2-LABEL: smulo_v64i8: 1907; SSE2: # %bb.0: 1908; SSE2-NEXT: movq %rdi, %rax 1909; SSE2-NEXT: pxor %xmm8, %xmm8 1910; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm7[8],xmm8[9],xmm7[9],xmm8[10],xmm7[10],xmm8[11],xmm7[11],xmm8[12],xmm7[12],xmm8[13],xmm7[13],xmm8[14],xmm7[14],xmm8[15],xmm7[15] 1911; SSE2-NEXT: pxor %xmm9, %xmm9 1912; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm3[8],xmm9[9],xmm3[9],xmm9[10],xmm3[10],xmm9[11],xmm3[11],xmm9[12],xmm3[12],xmm9[13],xmm3[13],xmm9[14],xmm3[14],xmm9[15],xmm3[15] 1913; SSE2-NEXT: pmulhw %xmm8, %xmm9 1914; SSE2-NEXT: movdqa %xmm9, %xmm8 1915; SSE2-NEXT: psrlw $8, %xmm8 1916; SSE2-NEXT: pxor %xmm10, %xmm10 1917; SSE2-NEXT: punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3],xmm10[4],xmm7[4],xmm10[5],xmm7[5],xmm10[6],xmm7[6],xmm10[7],xmm7[7] 1918; SSE2-NEXT: pxor %xmm11, %xmm11 1919; SSE2-NEXT: punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm3[0],xmm11[1],xmm3[1],xmm11[2],xmm3[2],xmm11[3],xmm3[3],xmm11[4],xmm3[4],xmm11[5],xmm3[5],xmm11[6],xmm3[6],xmm11[7],xmm3[7] 1920; SSE2-NEXT: pmulhw %xmm10, %xmm11 1921; SSE2-NEXT: movdqa %xmm11, %xmm7 1922; SSE2-NEXT: psrlw $8, %xmm7 1923; SSE2-NEXT: packuswb %xmm8, %xmm7 1924; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255] 1925; SSE2-NEXT: pand %xmm8, %xmm9 1926; SSE2-NEXT: pand %xmm8, %xmm11 1927; SSE2-NEXT: packuswb %xmm9, %xmm11 1928; SSE2-NEXT: pxor %xmm9, %xmm9 1929; SSE2-NEXT: pcmpgtb %xmm11, %xmm9 1930; SSE2-NEXT: pcmpeqb %xmm7, %xmm9 1931; SSE2-NEXT: pxor %xmm7, %xmm7 1932; SSE2-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm6[8],xmm7[9],xmm6[9],xmm7[10],xmm6[10],xmm7[11],xmm6[11],xmm7[12],xmm6[12],xmm7[13],xmm6[13],xmm7[14],xmm6[14],xmm7[15],xmm6[15] 1933; SSE2-NEXT: pxor %xmm3, %xmm3 1934; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15] 1935; SSE2-NEXT: pmulhw %xmm7, %xmm3 1936; SSE2-NEXT: pxor %xmm7, %xmm7 1937; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7] 1938; SSE2-NEXT: pxor %xmm6, %xmm6 1939; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7] 1940; SSE2-NEXT: movdqa %xmm3, %xmm2 1941; SSE2-NEXT: psrlw $8, %xmm2 1942; SSE2-NEXT: pmulhw %xmm7, %xmm6 1943; SSE2-NEXT: movdqa %xmm6, %xmm7 1944; SSE2-NEXT: psrlw $8, %xmm7 1945; SSE2-NEXT: packuswb %xmm2, %xmm7 1946; SSE2-NEXT: pand %xmm8, %xmm3 1947; SSE2-NEXT: pand %xmm8, %xmm6 1948; SSE2-NEXT: packuswb %xmm3, %xmm6 1949; SSE2-NEXT: pxor %xmm2, %xmm2 1950; SSE2-NEXT: pcmpgtb %xmm6, %xmm2 1951; SSE2-NEXT: pcmpeqb %xmm7, %xmm2 1952; SSE2-NEXT: pxor %xmm3, %xmm3 1953; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm5[8],xmm3[9],xmm5[9],xmm3[10],xmm5[10],xmm3[11],xmm5[11],xmm3[12],xmm5[12],xmm3[13],xmm5[13],xmm3[14],xmm5[14],xmm3[15],xmm5[15] 1954; SSE2-NEXT: pxor %xmm7, %xmm7 1955; SSE2-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm1[8],xmm7[9],xmm1[9],xmm7[10],xmm1[10],xmm7[11],xmm1[11],xmm7[12],xmm1[12],xmm7[13],xmm1[13],xmm7[14],xmm1[14],xmm7[15],xmm1[15] 1956; SSE2-NEXT: pmulhw %xmm3, %xmm7 1957; SSE2-NEXT: pxor %xmm3, %xmm3 1958; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7] 1959; SSE2-NEXT: pxor %xmm5, %xmm5 1960; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7] 1961; SSE2-NEXT: movdqa %xmm7, %xmm1 1962; SSE2-NEXT: psrlw $8, %xmm1 1963; SSE2-NEXT: pmulhw %xmm3, %xmm5 1964; SSE2-NEXT: movdqa %xmm5, %xmm3 1965; SSE2-NEXT: psrlw $8, %xmm3 1966; SSE2-NEXT: packuswb %xmm1, %xmm3 1967; SSE2-NEXT: pand %xmm8, %xmm7 1968; SSE2-NEXT: pand %xmm8, %xmm5 1969; SSE2-NEXT: packuswb %xmm7, %xmm5 1970; SSE2-NEXT: pxor %xmm1, %xmm1 1971; SSE2-NEXT: pcmpgtb %xmm5, %xmm1 1972; SSE2-NEXT: pcmpeqb %xmm3, %xmm1 1973; SSE2-NEXT: pxor %xmm3, %xmm3 1974; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15] 1975; SSE2-NEXT: pxor %xmm7, %xmm7 1976; 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] 1977; SSE2-NEXT: pmulhw %xmm3, %xmm7 1978; SSE2-NEXT: pxor %xmm3, %xmm3 1979; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 1980; SSE2-NEXT: pxor %xmm4, %xmm4 1981; 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] 1982; SSE2-NEXT: movdqa %xmm7, %xmm0 1983; SSE2-NEXT: psrlw $8, %xmm0 1984; SSE2-NEXT: pmulhw %xmm3, %xmm4 1985; SSE2-NEXT: movdqa %xmm4, %xmm3 1986; SSE2-NEXT: psrlw $8, %xmm3 1987; SSE2-NEXT: packuswb %xmm0, %xmm3 1988; SSE2-NEXT: pand %xmm8, %xmm7 1989; SSE2-NEXT: pand %xmm8, %xmm4 1990; SSE2-NEXT: packuswb %xmm7, %xmm4 1991; SSE2-NEXT: pxor %xmm0, %xmm0 1992; SSE2-NEXT: pcmpgtb %xmm4, %xmm0 1993; SSE2-NEXT: pcmpeqb %xmm3, %xmm0 1994; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 1995; SSE2-NEXT: pxor %xmm3, %xmm9 1996; SSE2-NEXT: pxor %xmm3, %xmm2 1997; SSE2-NEXT: pxor %xmm3, %xmm1 1998; SSE2-NEXT: pxor %xmm3, %xmm0 1999; SSE2-NEXT: movdqa %xmm11, 48(%rsi) 2000; SSE2-NEXT: movdqa %xmm6, 32(%rsi) 2001; SSE2-NEXT: movdqa %xmm5, 16(%rsi) 2002; SSE2-NEXT: movdqa %xmm9, %xmm3 2003; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2004; SSE2-NEXT: movdqa %xmm4, (%rsi) 2005; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm9[0],xmm4[1],xmm9[1],xmm4[2],xmm9[2],xmm4[3],xmm9[3],xmm4[4],xmm9[4],xmm4[5],xmm9[5],xmm4[6],xmm9[6],xmm4[7],xmm9[7] 2006; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3] 2007; SSE2-NEXT: psrad $24, %xmm4 2008; SSE2-NEXT: movdqa %xmm4, 192(%rdi) 2009; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7] 2010; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3] 2011; SSE2-NEXT: psrad $24, %xmm4 2012; SSE2-NEXT: movdqa %xmm4, 128(%rdi) 2013; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7] 2014; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3] 2015; SSE2-NEXT: psrad $24, %xmm4 2016; SSE2-NEXT: movdqa %xmm4, 64(%rdi) 2017; 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] 2018; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3] 2019; SSE2-NEXT: psrad $24, %xmm4 2020; SSE2-NEXT: movdqa %xmm4, (%rdi) 2021; SSE2-NEXT: movdqa %xmm3, %xmm4 2022; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3] 2023; SSE2-NEXT: pslld $31, %xmm3 2024; SSE2-NEXT: psrad $31, %xmm3 2025; SSE2-NEXT: movdqa %xmm3, 224(%rdi) 2026; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7] 2027; SSE2-NEXT: pslld $31, %xmm4 2028; SSE2-NEXT: psrad $31, %xmm4 2029; SSE2-NEXT: movdqa %xmm4, 240(%rdi) 2030; SSE2-NEXT: movdqa %xmm2, %xmm3 2031; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2032; SSE2-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2033; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7] 2034; SSE2-NEXT: pslld $31, %xmm9 2035; SSE2-NEXT: psrad $31, %xmm9 2036; SSE2-NEXT: movdqa %xmm9, 208(%rdi) 2037; SSE2-NEXT: movdqa %xmm3, %xmm4 2038; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3] 2039; SSE2-NEXT: pslld $31, %xmm3 2040; SSE2-NEXT: psrad $31, %xmm3 2041; SSE2-NEXT: movdqa %xmm3, 160(%rdi) 2042; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7] 2043; SSE2-NEXT: pslld $31, %xmm4 2044; SSE2-NEXT: psrad $31, %xmm4 2045; SSE2-NEXT: movdqa %xmm4, 176(%rdi) 2046; SSE2-NEXT: movdqa %xmm1, %xmm3 2047; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2048; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2049; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7] 2050; SSE2-NEXT: pslld $31, %xmm2 2051; SSE2-NEXT: psrad $31, %xmm2 2052; SSE2-NEXT: movdqa %xmm2, 144(%rdi) 2053; SSE2-NEXT: movdqa %xmm3, %xmm2 2054; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3] 2055; SSE2-NEXT: pslld $31, %xmm3 2056; SSE2-NEXT: psrad $31, %xmm3 2057; SSE2-NEXT: movdqa %xmm3, 96(%rdi) 2058; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7] 2059; SSE2-NEXT: pslld $31, %xmm2 2060; SSE2-NEXT: psrad $31, %xmm2 2061; SSE2-NEXT: movdqa %xmm2, 112(%rdi) 2062; SSE2-NEXT: movdqa %xmm0, %xmm2 2063; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2064; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2065; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 2066; SSE2-NEXT: pslld $31, %xmm1 2067; SSE2-NEXT: psrad $31, %xmm1 2068; SSE2-NEXT: movdqa %xmm1, 80(%rdi) 2069; SSE2-NEXT: movdqa %xmm2, %xmm1 2070; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3] 2071; SSE2-NEXT: pslld $31, %xmm2 2072; SSE2-NEXT: psrad $31, %xmm2 2073; SSE2-NEXT: movdqa %xmm2, 32(%rdi) 2074; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 2075; SSE2-NEXT: pslld $31, %xmm1 2076; SSE2-NEXT: psrad $31, %xmm1 2077; SSE2-NEXT: movdqa %xmm1, 48(%rdi) 2078; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2079; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7] 2080; SSE2-NEXT: pslld $31, %xmm0 2081; SSE2-NEXT: psrad $31, %xmm0 2082; SSE2-NEXT: movdqa %xmm0, 16(%rdi) 2083; SSE2-NEXT: retq 2084; 2085; SSSE3-LABEL: smulo_v64i8: 2086; SSSE3: # %bb.0: 2087; SSSE3-NEXT: movq %rdi, %rax 2088; SSSE3-NEXT: pxor %xmm8, %xmm8 2089; SSSE3-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm7[8],xmm8[9],xmm7[9],xmm8[10],xmm7[10],xmm8[11],xmm7[11],xmm8[12],xmm7[12],xmm8[13],xmm7[13],xmm8[14],xmm7[14],xmm8[15],xmm7[15] 2090; SSSE3-NEXT: pxor %xmm9, %xmm9 2091; SSSE3-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm3[8],xmm9[9],xmm3[9],xmm9[10],xmm3[10],xmm9[11],xmm3[11],xmm9[12],xmm3[12],xmm9[13],xmm3[13],xmm9[14],xmm3[14],xmm9[15],xmm3[15] 2092; SSSE3-NEXT: pmulhw %xmm8, %xmm9 2093; SSSE3-NEXT: movdqa %xmm9, %xmm8 2094; SSSE3-NEXT: psrlw $8, %xmm8 2095; SSSE3-NEXT: pxor %xmm10, %xmm10 2096; SSSE3-NEXT: punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3],xmm10[4],xmm7[4],xmm10[5],xmm7[5],xmm10[6],xmm7[6],xmm10[7],xmm7[7] 2097; SSSE3-NEXT: pxor %xmm11, %xmm11 2098; SSSE3-NEXT: punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm3[0],xmm11[1],xmm3[1],xmm11[2],xmm3[2],xmm11[3],xmm3[3],xmm11[4],xmm3[4],xmm11[5],xmm3[5],xmm11[6],xmm3[6],xmm11[7],xmm3[7] 2099; SSSE3-NEXT: pmulhw %xmm10, %xmm11 2100; SSSE3-NEXT: movdqa %xmm11, %xmm7 2101; SSSE3-NEXT: psrlw $8, %xmm7 2102; SSSE3-NEXT: packuswb %xmm8, %xmm7 2103; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255] 2104; SSSE3-NEXT: pand %xmm8, %xmm9 2105; SSSE3-NEXT: pand %xmm8, %xmm11 2106; SSSE3-NEXT: packuswb %xmm9, %xmm11 2107; SSSE3-NEXT: pxor %xmm9, %xmm9 2108; SSSE3-NEXT: pcmpgtb %xmm11, %xmm9 2109; SSSE3-NEXT: pcmpeqb %xmm7, %xmm9 2110; SSSE3-NEXT: pxor %xmm7, %xmm7 2111; SSSE3-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm6[8],xmm7[9],xmm6[9],xmm7[10],xmm6[10],xmm7[11],xmm6[11],xmm7[12],xmm6[12],xmm7[13],xmm6[13],xmm7[14],xmm6[14],xmm7[15],xmm6[15] 2112; SSSE3-NEXT: pxor %xmm3, %xmm3 2113; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15] 2114; SSSE3-NEXT: pmulhw %xmm7, %xmm3 2115; SSSE3-NEXT: pxor %xmm7, %xmm7 2116; SSSE3-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7] 2117; SSSE3-NEXT: pxor %xmm6, %xmm6 2118; SSSE3-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7] 2119; SSSE3-NEXT: movdqa %xmm3, %xmm2 2120; SSSE3-NEXT: psrlw $8, %xmm2 2121; SSSE3-NEXT: pmulhw %xmm7, %xmm6 2122; SSSE3-NEXT: movdqa %xmm6, %xmm7 2123; SSSE3-NEXT: psrlw $8, %xmm7 2124; SSSE3-NEXT: packuswb %xmm2, %xmm7 2125; SSSE3-NEXT: pand %xmm8, %xmm3 2126; SSSE3-NEXT: pand %xmm8, %xmm6 2127; SSSE3-NEXT: packuswb %xmm3, %xmm6 2128; SSSE3-NEXT: pxor %xmm2, %xmm2 2129; SSSE3-NEXT: pcmpgtb %xmm6, %xmm2 2130; SSSE3-NEXT: pcmpeqb %xmm7, %xmm2 2131; SSSE3-NEXT: pxor %xmm3, %xmm3 2132; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm5[8],xmm3[9],xmm5[9],xmm3[10],xmm5[10],xmm3[11],xmm5[11],xmm3[12],xmm5[12],xmm3[13],xmm5[13],xmm3[14],xmm5[14],xmm3[15],xmm5[15] 2133; SSSE3-NEXT: pxor %xmm7, %xmm7 2134; SSSE3-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm1[8],xmm7[9],xmm1[9],xmm7[10],xmm1[10],xmm7[11],xmm1[11],xmm7[12],xmm1[12],xmm7[13],xmm1[13],xmm7[14],xmm1[14],xmm7[15],xmm1[15] 2135; SSSE3-NEXT: pmulhw %xmm3, %xmm7 2136; SSSE3-NEXT: pxor %xmm3, %xmm3 2137; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7] 2138; SSSE3-NEXT: pxor %xmm5, %xmm5 2139; SSSE3-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7] 2140; SSSE3-NEXT: movdqa %xmm7, %xmm1 2141; SSSE3-NEXT: psrlw $8, %xmm1 2142; SSSE3-NEXT: pmulhw %xmm3, %xmm5 2143; SSSE3-NEXT: movdqa %xmm5, %xmm3 2144; SSSE3-NEXT: psrlw $8, %xmm3 2145; SSSE3-NEXT: packuswb %xmm1, %xmm3 2146; SSSE3-NEXT: pand %xmm8, %xmm7 2147; SSSE3-NEXT: pand %xmm8, %xmm5 2148; SSSE3-NEXT: packuswb %xmm7, %xmm5 2149; SSSE3-NEXT: pxor %xmm1, %xmm1 2150; SSSE3-NEXT: pcmpgtb %xmm5, %xmm1 2151; SSSE3-NEXT: pcmpeqb %xmm3, %xmm1 2152; SSSE3-NEXT: pxor %xmm3, %xmm3 2153; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15] 2154; SSSE3-NEXT: pxor %xmm7, %xmm7 2155; SSSE3-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] 2156; SSSE3-NEXT: pmulhw %xmm3, %xmm7 2157; SSSE3-NEXT: pxor %xmm3, %xmm3 2158; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 2159; SSSE3-NEXT: pxor %xmm4, %xmm4 2160; SSSE3-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] 2161; SSSE3-NEXT: movdqa %xmm7, %xmm0 2162; SSSE3-NEXT: psrlw $8, %xmm0 2163; SSSE3-NEXT: pmulhw %xmm3, %xmm4 2164; SSSE3-NEXT: movdqa %xmm4, %xmm3 2165; SSSE3-NEXT: psrlw $8, %xmm3 2166; SSSE3-NEXT: packuswb %xmm0, %xmm3 2167; SSSE3-NEXT: pand %xmm8, %xmm7 2168; SSSE3-NEXT: pand %xmm8, %xmm4 2169; SSSE3-NEXT: packuswb %xmm7, %xmm4 2170; SSSE3-NEXT: pxor %xmm0, %xmm0 2171; SSSE3-NEXT: pcmpgtb %xmm4, %xmm0 2172; SSSE3-NEXT: pcmpeqb %xmm3, %xmm0 2173; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3 2174; SSSE3-NEXT: pxor %xmm3, %xmm9 2175; SSSE3-NEXT: pxor %xmm3, %xmm2 2176; SSSE3-NEXT: pxor %xmm3, %xmm1 2177; SSSE3-NEXT: pxor %xmm3, %xmm0 2178; SSSE3-NEXT: movdqa %xmm11, 48(%rsi) 2179; SSSE3-NEXT: movdqa %xmm6, 32(%rsi) 2180; SSSE3-NEXT: movdqa %xmm5, 16(%rsi) 2181; SSSE3-NEXT: movdqa %xmm9, %xmm3 2182; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2183; SSSE3-NEXT: movdqa %xmm4, (%rsi) 2184; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm9[0],xmm4[1],xmm9[1],xmm4[2],xmm9[2],xmm4[3],xmm9[3],xmm4[4],xmm9[4],xmm4[5],xmm9[5],xmm4[6],xmm9[6],xmm4[7],xmm9[7] 2185; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3] 2186; SSSE3-NEXT: psrad $24, %xmm4 2187; SSSE3-NEXT: movdqa %xmm4, 192(%rdi) 2188; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7] 2189; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3] 2190; SSSE3-NEXT: psrad $24, %xmm4 2191; SSSE3-NEXT: movdqa %xmm4, 128(%rdi) 2192; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7] 2193; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3] 2194; SSSE3-NEXT: psrad $24, %xmm4 2195; SSSE3-NEXT: movdqa %xmm4, 64(%rdi) 2196; SSSE3-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] 2197; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3] 2198; SSSE3-NEXT: psrad $24, %xmm4 2199; SSSE3-NEXT: movdqa %xmm4, (%rdi) 2200; SSSE3-NEXT: movdqa %xmm3, %xmm4 2201; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3] 2202; SSSE3-NEXT: pslld $31, %xmm3 2203; SSSE3-NEXT: psrad $31, %xmm3 2204; SSSE3-NEXT: movdqa %xmm3, 224(%rdi) 2205; SSSE3-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7] 2206; SSSE3-NEXT: pslld $31, %xmm4 2207; SSSE3-NEXT: psrad $31, %xmm4 2208; SSSE3-NEXT: movdqa %xmm4, 240(%rdi) 2209; SSSE3-NEXT: movdqa %xmm2, %xmm3 2210; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2211; SSSE3-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2212; SSSE3-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7] 2213; SSSE3-NEXT: pslld $31, %xmm9 2214; SSSE3-NEXT: psrad $31, %xmm9 2215; SSSE3-NEXT: movdqa %xmm9, 208(%rdi) 2216; SSSE3-NEXT: movdqa %xmm3, %xmm4 2217; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3] 2218; SSSE3-NEXT: pslld $31, %xmm3 2219; SSSE3-NEXT: psrad $31, %xmm3 2220; SSSE3-NEXT: movdqa %xmm3, 160(%rdi) 2221; SSSE3-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7] 2222; SSSE3-NEXT: pslld $31, %xmm4 2223; SSSE3-NEXT: psrad $31, %xmm4 2224; SSSE3-NEXT: movdqa %xmm4, 176(%rdi) 2225; SSSE3-NEXT: movdqa %xmm1, %xmm3 2226; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2227; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2228; SSSE3-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7] 2229; SSSE3-NEXT: pslld $31, %xmm2 2230; SSSE3-NEXT: psrad $31, %xmm2 2231; SSSE3-NEXT: movdqa %xmm2, 144(%rdi) 2232; SSSE3-NEXT: movdqa %xmm3, %xmm2 2233; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3] 2234; SSSE3-NEXT: pslld $31, %xmm3 2235; SSSE3-NEXT: psrad $31, %xmm3 2236; SSSE3-NEXT: movdqa %xmm3, 96(%rdi) 2237; SSSE3-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7] 2238; SSSE3-NEXT: pslld $31, %xmm2 2239; SSSE3-NEXT: psrad $31, %xmm2 2240; SSSE3-NEXT: movdqa %xmm2, 112(%rdi) 2241; SSSE3-NEXT: movdqa %xmm0, %xmm2 2242; SSSE3-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 2243; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2244; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 2245; SSSE3-NEXT: pslld $31, %xmm1 2246; SSSE3-NEXT: psrad $31, %xmm1 2247; SSSE3-NEXT: movdqa %xmm1, 80(%rdi) 2248; SSSE3-NEXT: movdqa %xmm2, %xmm1 2249; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3] 2250; SSSE3-NEXT: pslld $31, %xmm2 2251; SSSE3-NEXT: psrad $31, %xmm2 2252; SSSE3-NEXT: movdqa %xmm2, 32(%rdi) 2253; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 2254; SSSE3-NEXT: pslld $31, %xmm1 2255; SSSE3-NEXT: psrad $31, %xmm1 2256; SSSE3-NEXT: movdqa %xmm1, 48(%rdi) 2257; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2258; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7] 2259; SSSE3-NEXT: pslld $31, %xmm0 2260; SSSE3-NEXT: psrad $31, %xmm0 2261; SSSE3-NEXT: movdqa %xmm0, 16(%rdi) 2262; SSSE3-NEXT: retq 2263; 2264; SSE41-LABEL: smulo_v64i8: 2265; SSE41: # %bb.0: 2266; SSE41-NEXT: movq %rdi, %rax 2267; SSE41-NEXT: pxor %xmm8, %xmm8 2268; SSE41-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm7[8],xmm8[9],xmm7[9],xmm8[10],xmm7[10],xmm8[11],xmm7[11],xmm8[12],xmm7[12],xmm8[13],xmm7[13],xmm8[14],xmm7[14],xmm8[15],xmm7[15] 2269; SSE41-NEXT: pxor %xmm9, %xmm9 2270; SSE41-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm3[8],xmm9[9],xmm3[9],xmm9[10],xmm3[10],xmm9[11],xmm3[11],xmm9[12],xmm3[12],xmm9[13],xmm3[13],xmm9[14],xmm3[14],xmm9[15],xmm3[15] 2271; SSE41-NEXT: pmulhw %xmm8, %xmm9 2272; SSE41-NEXT: movdqa %xmm9, %xmm8 2273; SSE41-NEXT: psrlw $8, %xmm8 2274; SSE41-NEXT: pxor %xmm10, %xmm10 2275; SSE41-NEXT: punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3],xmm10[4],xmm7[4],xmm10[5],xmm7[5],xmm10[6],xmm7[6],xmm10[7],xmm7[7] 2276; SSE41-NEXT: pxor %xmm11, %xmm11 2277; SSE41-NEXT: punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm3[0],xmm11[1],xmm3[1],xmm11[2],xmm3[2],xmm11[3],xmm3[3],xmm11[4],xmm3[4],xmm11[5],xmm3[5],xmm11[6],xmm3[6],xmm11[7],xmm3[7] 2278; SSE41-NEXT: pmulhw %xmm10, %xmm11 2279; SSE41-NEXT: movdqa %xmm11, %xmm7 2280; SSE41-NEXT: psrlw $8, %xmm7 2281; SSE41-NEXT: packuswb %xmm8, %xmm7 2282; SSE41-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255] 2283; SSE41-NEXT: pand %xmm8, %xmm9 2284; SSE41-NEXT: pand %xmm8, %xmm11 2285; SSE41-NEXT: packuswb %xmm9, %xmm11 2286; SSE41-NEXT: pxor %xmm9, %xmm9 2287; SSE41-NEXT: pcmpgtb %xmm11, %xmm9 2288; SSE41-NEXT: pcmpeqb %xmm7, %xmm9 2289; SSE41-NEXT: pxor %xmm7, %xmm7 2290; SSE41-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm6[8],xmm7[9],xmm6[9],xmm7[10],xmm6[10],xmm7[11],xmm6[11],xmm7[12],xmm6[12],xmm7[13],xmm6[13],xmm7[14],xmm6[14],xmm7[15],xmm6[15] 2291; SSE41-NEXT: pxor %xmm3, %xmm3 2292; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15] 2293; SSE41-NEXT: pmulhw %xmm7, %xmm3 2294; SSE41-NEXT: pxor %xmm7, %xmm7 2295; SSE41-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7] 2296; SSE41-NEXT: pxor %xmm6, %xmm6 2297; SSE41-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7] 2298; SSE41-NEXT: movdqa %xmm3, %xmm2 2299; SSE41-NEXT: psrlw $8, %xmm2 2300; SSE41-NEXT: pmulhw %xmm7, %xmm6 2301; SSE41-NEXT: movdqa %xmm6, %xmm7 2302; SSE41-NEXT: psrlw $8, %xmm7 2303; SSE41-NEXT: packuswb %xmm2, %xmm7 2304; SSE41-NEXT: pand %xmm8, %xmm3 2305; SSE41-NEXT: pand %xmm8, %xmm6 2306; SSE41-NEXT: packuswb %xmm3, %xmm6 2307; SSE41-NEXT: pxor %xmm2, %xmm2 2308; SSE41-NEXT: pcmpgtb %xmm6, %xmm2 2309; SSE41-NEXT: pcmpeqb %xmm7, %xmm2 2310; SSE41-NEXT: pxor %xmm3, %xmm3 2311; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm5[8],xmm3[9],xmm5[9],xmm3[10],xmm5[10],xmm3[11],xmm5[11],xmm3[12],xmm5[12],xmm3[13],xmm5[13],xmm3[14],xmm5[14],xmm3[15],xmm5[15] 2312; SSE41-NEXT: pxor %xmm7, %xmm7 2313; SSE41-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm1[8],xmm7[9],xmm1[9],xmm7[10],xmm1[10],xmm7[11],xmm1[11],xmm7[12],xmm1[12],xmm7[13],xmm1[13],xmm7[14],xmm1[14],xmm7[15],xmm1[15] 2314; SSE41-NEXT: pmulhw %xmm3, %xmm7 2315; SSE41-NEXT: pxor %xmm3, %xmm3 2316; SSE41-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7] 2317; SSE41-NEXT: pxor %xmm5, %xmm5 2318; SSE41-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7] 2319; SSE41-NEXT: movdqa %xmm7, %xmm1 2320; SSE41-NEXT: psrlw $8, %xmm1 2321; SSE41-NEXT: pmulhw %xmm3, %xmm5 2322; SSE41-NEXT: movdqa %xmm5, %xmm3 2323; SSE41-NEXT: psrlw $8, %xmm3 2324; SSE41-NEXT: packuswb %xmm1, %xmm3 2325; SSE41-NEXT: pand %xmm8, %xmm7 2326; SSE41-NEXT: pand %xmm8, %xmm5 2327; SSE41-NEXT: packuswb %xmm7, %xmm5 2328; SSE41-NEXT: pxor %xmm1, %xmm1 2329; SSE41-NEXT: pcmpgtb %xmm5, %xmm1 2330; SSE41-NEXT: pcmpeqb %xmm3, %xmm1 2331; SSE41-NEXT: pxor %xmm3, %xmm3 2332; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15] 2333; SSE41-NEXT: pxor %xmm7, %xmm7 2334; 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] 2335; SSE41-NEXT: pmulhw %xmm3, %xmm7 2336; SSE41-NEXT: pxor %xmm3, %xmm3 2337; SSE41-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 2338; SSE41-NEXT: pxor %xmm4, %xmm4 2339; SSE41-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] 2340; SSE41-NEXT: movdqa %xmm7, %xmm0 2341; SSE41-NEXT: psrlw $8, %xmm0 2342; SSE41-NEXT: pmulhw %xmm3, %xmm4 2343; SSE41-NEXT: movdqa %xmm4, %xmm3 2344; SSE41-NEXT: psrlw $8, %xmm3 2345; SSE41-NEXT: packuswb %xmm0, %xmm3 2346; SSE41-NEXT: pand %xmm8, %xmm7 2347; SSE41-NEXT: pand %xmm8, %xmm4 2348; SSE41-NEXT: packuswb %xmm7, %xmm4 2349; SSE41-NEXT: pxor %xmm0, %xmm0 2350; SSE41-NEXT: pcmpgtb %xmm4, %xmm0 2351; SSE41-NEXT: pcmpeqb %xmm3, %xmm0 2352; SSE41-NEXT: pcmpeqd %xmm3, %xmm3 2353; SSE41-NEXT: pxor %xmm3, %xmm9 2354; SSE41-NEXT: pxor %xmm3, %xmm2 2355; SSE41-NEXT: pxor %xmm3, %xmm1 2356; SSE41-NEXT: pxor %xmm3, %xmm0 2357; SSE41-NEXT: movdqa %xmm11, 48(%rsi) 2358; SSE41-NEXT: movdqa %xmm6, 32(%rsi) 2359; SSE41-NEXT: movdqa %xmm5, 16(%rsi) 2360; SSE41-NEXT: movdqa %xmm4, (%rsi) 2361; SSE41-NEXT: pmovsxbd %xmm9, %xmm3 2362; SSE41-NEXT: movdqa %xmm3, 192(%rdi) 2363; SSE41-NEXT: pmovsxbd %xmm2, %xmm3 2364; SSE41-NEXT: movdqa %xmm3, 128(%rdi) 2365; SSE41-NEXT: pmovsxbd %xmm1, %xmm3 2366; SSE41-NEXT: movdqa %xmm3, 64(%rdi) 2367; SSE41-NEXT: pmovsxbd %xmm0, %xmm3 2368; SSE41-NEXT: movdqa %xmm3, (%rdi) 2369; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm9[2,3,2,3] 2370; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 2371; SSE41-NEXT: pslld $31, %xmm3 2372; SSE41-NEXT: psrad $31, %xmm3 2373; SSE41-NEXT: movdqa %xmm3, 224(%rdi) 2374; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm9[3,3,3,3] 2375; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 2376; SSE41-NEXT: pslld $31, %xmm3 2377; SSE41-NEXT: psrad $31, %xmm3 2378; SSE41-NEXT: movdqa %xmm3, 240(%rdi) 2379; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,1,1] 2380; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 2381; SSE41-NEXT: pslld $31, %xmm3 2382; SSE41-NEXT: psrad $31, %xmm3 2383; SSE41-NEXT: movdqa %xmm3, 208(%rdi) 2384; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3] 2385; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 2386; SSE41-NEXT: pslld $31, %xmm3 2387; SSE41-NEXT: psrad $31, %xmm3 2388; SSE41-NEXT: movdqa %xmm3, 160(%rdi) 2389; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3] 2390; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 2391; SSE41-NEXT: pslld $31, %xmm3 2392; SSE41-NEXT: psrad $31, %xmm3 2393; SSE41-NEXT: movdqa %xmm3, 176(%rdi) 2394; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,1,1] 2395; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero 2396; SSE41-NEXT: pslld $31, %xmm2 2397; SSE41-NEXT: psrad $31, %xmm2 2398; SSE41-NEXT: movdqa %xmm2, 144(%rdi) 2399; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 2400; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero 2401; SSE41-NEXT: pslld $31, %xmm2 2402; SSE41-NEXT: psrad $31, %xmm2 2403; SSE41-NEXT: movdqa %xmm2, 96(%rdi) 2404; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3] 2405; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero 2406; SSE41-NEXT: pslld $31, %xmm2 2407; SSE41-NEXT: psrad $31, %xmm2 2408; SSE41-NEXT: movdqa %xmm2, 112(%rdi) 2409; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1] 2410; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 2411; SSE41-NEXT: pslld $31, %xmm1 2412; SSE41-NEXT: psrad $31, %xmm1 2413; SSE41-NEXT: movdqa %xmm1, 80(%rdi) 2414; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 2415; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 2416; SSE41-NEXT: pslld $31, %xmm1 2417; SSE41-NEXT: psrad $31, %xmm1 2418; SSE41-NEXT: movdqa %xmm1, 32(%rdi) 2419; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3] 2420; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 2421; SSE41-NEXT: pslld $31, %xmm1 2422; SSE41-NEXT: psrad $31, %xmm1 2423; SSE41-NEXT: movdqa %xmm1, 48(%rdi) 2424; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1] 2425; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 2426; SSE41-NEXT: pslld $31, %xmm0 2427; SSE41-NEXT: psrad $31, %xmm0 2428; SSE41-NEXT: movdqa %xmm0, 16(%rdi) 2429; SSE41-NEXT: retq 2430; 2431; AVX1-LABEL: smulo_v64i8: 2432; AVX1: # %bb.0: 2433; AVX1-NEXT: movq %rdi, %rax 2434; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 2435; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 2436; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm8 = xmm5[8],xmm4[8],xmm5[9],xmm4[9],xmm5[10],xmm4[10],xmm5[11],xmm4[11],xmm5[12],xmm4[12],xmm5[13],xmm4[13],xmm5[14],xmm4[14],xmm5[15],xmm4[15] 2437; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 2438; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = xmm5[8],xmm7[8],xmm5[9],xmm7[9],xmm5[10],xmm7[10],xmm5[11],xmm7[11],xmm5[12],xmm7[12],xmm5[13],xmm7[13],xmm5[14],xmm7[14],xmm5[15],xmm7[15] 2439; AVX1-NEXT: vpmulhw %xmm6, %xmm8, %xmm6 2440; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm8 2441; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7] 2442; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm7 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3],xmm5[4],xmm7[4],xmm5[5],xmm7[5],xmm5[6],xmm7[6],xmm5[7],xmm7[7] 2443; AVX1-NEXT: vpmulhw %xmm4, %xmm7, %xmm7 2444; AVX1-NEXT: vpsrlw $8, %xmm7, %xmm4 2445; AVX1-NEXT: vpackuswb %xmm8, %xmm4, %xmm4 2446; AVX1-NEXT: vmovdqa {{.*#+}} xmm10 = [255,255,255,255,255,255,255,255] 2447; AVX1-NEXT: vpand %xmm6, %xmm10, %xmm6 2448; AVX1-NEXT: vpand %xmm7, %xmm10, %xmm7 2449; AVX1-NEXT: vpackuswb %xmm6, %xmm7, %xmm9 2450; AVX1-NEXT: vpcmpgtb %xmm9, %xmm5, %xmm6 2451; AVX1-NEXT: vpcmpeqb %xmm4, %xmm6, %xmm8 2452; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15] 2453; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = xmm5[8],xmm1[8],xmm5[9],xmm1[9],xmm5[10],xmm1[10],xmm5[11],xmm1[11],xmm5[12],xmm1[12],xmm5[13],xmm1[13],xmm5[14],xmm1[14],xmm5[15],xmm1[15] 2454; AVX1-NEXT: vpmulhw %xmm4, %xmm6, %xmm4 2455; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm6 2456; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3],xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7] 2457; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7] 2458; AVX1-NEXT: vpmulhw %xmm3, %xmm1, %xmm1 2459; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm3 2460; AVX1-NEXT: vpackuswb %xmm6, %xmm3, %xmm3 2461; AVX1-NEXT: vpand %xmm4, %xmm10, %xmm4 2462; AVX1-NEXT: vpand %xmm1, %xmm10, %xmm1 2463; AVX1-NEXT: vpackuswb %xmm4, %xmm1, %xmm11 2464; AVX1-NEXT: vpcmpgtb %xmm11, %xmm5, %xmm4 2465; AVX1-NEXT: vpcmpeqb %xmm3, %xmm4, %xmm12 2466; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 2467; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15] 2468; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 2469; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm5[8],xmm6[8],xmm5[9],xmm6[9],xmm5[10],xmm6[10],xmm5[11],xmm6[11],xmm5[12],xmm6[12],xmm5[13],xmm6[13],xmm5[14],xmm6[14],xmm5[15],xmm6[15] 2470; AVX1-NEXT: vpmulhw %xmm4, %xmm1, %xmm1 2471; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm4 2472; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3],xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7] 2473; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm6 = xmm5[0],xmm6[0],xmm5[1],xmm6[1],xmm5[2],xmm6[2],xmm5[3],xmm6[3],xmm5[4],xmm6[4],xmm5[5],xmm6[5],xmm5[6],xmm6[6],xmm5[7],xmm6[7] 2474; AVX1-NEXT: vpmulhw %xmm3, %xmm6, %xmm3 2475; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm6 2476; AVX1-NEXT: vpackuswb %xmm4, %xmm6, %xmm4 2477; AVX1-NEXT: vpand %xmm1, %xmm10, %xmm1 2478; AVX1-NEXT: vpand %xmm3, %xmm10, %xmm3 2479; AVX1-NEXT: vpackuswb %xmm1, %xmm3, %xmm3 2480; AVX1-NEXT: vpcmpgtb %xmm3, %xmm5, %xmm1 2481; AVX1-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm1 2482; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm2[8],xmm5[9],xmm2[9],xmm5[10],xmm2[10],xmm5[11],xmm2[11],xmm5[12],xmm2[12],xmm5[13],xmm2[13],xmm5[14],xmm2[14],xmm5[15],xmm2[15] 2483; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = 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] 2484; AVX1-NEXT: vpmulhw %xmm4, %xmm6, %xmm4 2485; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm6 2486; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7] 2487; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = 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] 2488; AVX1-NEXT: vpmulhw %xmm2, %xmm0, %xmm0 2489; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm2 2490; AVX1-NEXT: vpackuswb %xmm6, %xmm2, %xmm2 2491; AVX1-NEXT: vpand %xmm4, %xmm10, %xmm4 2492; AVX1-NEXT: vpand %xmm0, %xmm10, %xmm0 2493; AVX1-NEXT: vpackuswb %xmm4, %xmm0, %xmm4 2494; AVX1-NEXT: vpcmpgtb %xmm4, %xmm5, %xmm0 2495; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0 2496; AVX1-NEXT: vpcmpeqd %xmm7, %xmm7, %xmm7 2497; AVX1-NEXT: vpxor %xmm7, %xmm8, %xmm6 2498; AVX1-NEXT: vpxor %xmm7, %xmm12, %xmm5 2499; AVX1-NEXT: vpxor %xmm7, %xmm1, %xmm2 2500; AVX1-NEXT: vpxor %xmm7, %xmm0, %xmm0 2501; AVX1-NEXT: vmovdqa %xmm9, 48(%rsi) 2502; AVX1-NEXT: vmovdqa %xmm11, 32(%rsi) 2503; AVX1-NEXT: vmovdqa %xmm3, 16(%rsi) 2504; AVX1-NEXT: vmovdqa %xmm4, (%rsi) 2505; AVX1-NEXT: vpmovsxbd %xmm6, %xmm1 2506; AVX1-NEXT: vmovdqa %xmm1, 192(%rdi) 2507; AVX1-NEXT: vpmovsxbd %xmm5, %xmm1 2508; AVX1-NEXT: vmovdqa %xmm1, 128(%rdi) 2509; AVX1-NEXT: vpmovsxbd %xmm2, %xmm1 2510; AVX1-NEXT: vmovdqa %xmm1, 64(%rdi) 2511; AVX1-NEXT: vpmovsxbd %xmm0, %xmm1 2512; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 2513; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm6[2,3,2,3] 2514; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2515; AVX1-NEXT: vmovdqa %xmm1, 224(%rdi) 2516; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm6[3,3,3,3] 2517; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2518; AVX1-NEXT: vmovdqa %xmm1, 240(%rdi) 2519; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm6[1,1,1,1] 2520; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2521; AVX1-NEXT: vmovdqa %xmm1, 208(%rdi) 2522; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm5[2,3,2,3] 2523; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2524; AVX1-NEXT: vmovdqa %xmm1, 160(%rdi) 2525; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm5[3,3,3,3] 2526; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2527; AVX1-NEXT: vmovdqa %xmm1, 176(%rdi) 2528; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm5[1,1,1,1] 2529; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2530; AVX1-NEXT: vmovdqa %xmm1, 144(%rdi) 2531; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[2,3,2,3] 2532; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2533; AVX1-NEXT: vmovdqa %xmm1, 96(%rdi) 2534; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[3,3,3,3] 2535; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2536; AVX1-NEXT: vmovdqa %xmm1, 112(%rdi) 2537; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[1,1,1,1] 2538; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2539; AVX1-NEXT: vmovdqa %xmm1, 80(%rdi) 2540; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 2541; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2542; AVX1-NEXT: vmovdqa %xmm1, 32(%rdi) 2543; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[3,3,3,3] 2544; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 2545; AVX1-NEXT: vmovdqa %xmm1, 48(%rdi) 2546; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1] 2547; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0 2548; AVX1-NEXT: vmovdqa %xmm0, 16(%rdi) 2549; AVX1-NEXT: vzeroupper 2550; AVX1-NEXT: retq 2551; 2552; AVX2-LABEL: smulo_v64i8: 2553; AVX2: # %bb.0: 2554; AVX2-NEXT: movq %rdi, %rax 2555; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 2556; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm4[8],ymm3[8],ymm4[9],ymm3[9],ymm4[10],ymm3[10],ymm4[11],ymm3[11],ymm4[12],ymm3[12],ymm4[13],ymm3[13],ymm4[14],ymm3[14],ymm4[15],ymm3[15],ymm4[24],ymm3[24],ymm4[25],ymm3[25],ymm4[26],ymm3[26],ymm4[27],ymm3[27],ymm4[28],ymm3[28],ymm4[29],ymm3[29],ymm4[30],ymm3[30],ymm4[31],ymm3[31] 2557; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm6 = ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15],ymm4[24],ymm1[24],ymm4[25],ymm1[25],ymm4[26],ymm1[26],ymm4[27],ymm1[27],ymm4[28],ymm1[28],ymm4[29],ymm1[29],ymm4[30],ymm1[30],ymm4[31],ymm1[31] 2558; AVX2-NEXT: vpmulhw %ymm5, %ymm6, %ymm5 2559; AVX2-NEXT: vpsrlw $8, %ymm5, %ymm6 2560; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm4[0],ymm3[0],ymm4[1],ymm3[1],ymm4[2],ymm3[2],ymm4[3],ymm3[3],ymm4[4],ymm3[4],ymm4[5],ymm3[5],ymm4[6],ymm3[6],ymm4[7],ymm3[7],ymm4[16],ymm3[16],ymm4[17],ymm3[17],ymm4[18],ymm3[18],ymm4[19],ymm3[19],ymm4[20],ymm3[20],ymm4[21],ymm3[21],ymm4[22],ymm3[22],ymm4[23],ymm3[23] 2561; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[16],ymm1[16],ymm4[17],ymm1[17],ymm4[18],ymm1[18],ymm4[19],ymm1[19],ymm4[20],ymm1[20],ymm4[21],ymm1[21],ymm4[22],ymm1[22],ymm4[23],ymm1[23] 2562; AVX2-NEXT: vpmulhw %ymm3, %ymm1, %ymm1 2563; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm3 2564; AVX2-NEXT: vpackuswb %ymm6, %ymm3, %ymm3 2565; AVX2-NEXT: vmovdqa {{.*#+}} ymm6 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2566; AVX2-NEXT: vpand %ymm6, %ymm5, %ymm5 2567; AVX2-NEXT: vpand %ymm6, %ymm1, %ymm1 2568; AVX2-NEXT: vpackuswb %ymm5, %ymm1, %ymm1 2569; AVX2-NEXT: vpcmpgtb %ymm1, %ymm4, %ymm5 2570; AVX2-NEXT: vpcmpeqb %ymm3, %ymm5, %ymm3 2571; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 2572; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm3 2573; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm7 = ymm4[8],ymm2[8],ymm4[9],ymm2[9],ymm4[10],ymm2[10],ymm4[11],ymm2[11],ymm4[12],ymm2[12],ymm4[13],ymm2[13],ymm4[14],ymm2[14],ymm4[15],ymm2[15],ymm4[24],ymm2[24],ymm4[25],ymm2[25],ymm4[26],ymm2[26],ymm4[27],ymm2[27],ymm4[28],ymm2[28],ymm4[29],ymm2[29],ymm4[30],ymm2[30],ymm4[31],ymm2[31] 2574; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm8 = ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15],ymm4[24],ymm0[24],ymm4[25],ymm0[25],ymm4[26],ymm0[26],ymm4[27],ymm0[27],ymm4[28],ymm0[28],ymm4[29],ymm0[29],ymm4[30],ymm0[30],ymm4[31],ymm0[31] 2575; AVX2-NEXT: vpmulhw %ymm7, %ymm8, %ymm7 2576; AVX2-NEXT: vpsrlw $8, %ymm7, %ymm8 2577; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm4[0],ymm2[0],ymm4[1],ymm2[1],ymm4[2],ymm2[2],ymm4[3],ymm2[3],ymm4[4],ymm2[4],ymm4[5],ymm2[5],ymm4[6],ymm2[6],ymm4[7],ymm2[7],ymm4[16],ymm2[16],ymm4[17],ymm2[17],ymm4[18],ymm2[18],ymm4[19],ymm2[19],ymm4[20],ymm2[20],ymm4[21],ymm2[21],ymm4[22],ymm2[22],ymm4[23],ymm2[23] 2578; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[16],ymm0[16],ymm4[17],ymm0[17],ymm4[18],ymm0[18],ymm4[19],ymm0[19],ymm4[20],ymm0[20],ymm4[21],ymm0[21],ymm4[22],ymm0[22],ymm4[23],ymm0[23] 2579; AVX2-NEXT: vpmulhw %ymm2, %ymm0, %ymm0 2580; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm2 2581; AVX2-NEXT: vpackuswb %ymm8, %ymm2, %ymm2 2582; AVX2-NEXT: vpand %ymm6, %ymm7, %ymm7 2583; AVX2-NEXT: vpand %ymm6, %ymm0, %ymm0 2584; AVX2-NEXT: vpackuswb %ymm7, %ymm0, %ymm0 2585; AVX2-NEXT: vpcmpgtb %ymm0, %ymm4, %ymm4 2586; AVX2-NEXT: vpcmpeqb %ymm2, %ymm4, %ymm2 2587; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm2 2588; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[2,3,2,3] 2589; AVX2-NEXT: vpmovsxbd %xmm4, %ymm8 2590; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm5 2591; AVX2-NEXT: vpshufd {{.*#+}} xmm6 = xmm5[2,3,2,3] 2592; AVX2-NEXT: vpmovsxbd %xmm6, %ymm9 2593; AVX2-NEXT: vpshufd {{.*#+}} xmm7 = xmm3[2,3,2,3] 2594; AVX2-NEXT: vpmovsxbd %xmm7, %ymm7 2595; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm4 2596; AVX2-NEXT: vpshufd {{.*#+}} xmm6 = xmm4[2,3,2,3] 2597; AVX2-NEXT: vpmovsxbd %xmm6, %ymm6 2598; AVX2-NEXT: vpmovsxbd %xmm2, %ymm2 2599; AVX2-NEXT: vpmovsxbd %xmm5, %ymm5 2600; AVX2-NEXT: vpmovsxbd %xmm3, %ymm3 2601; AVX2-NEXT: vpmovsxbd %xmm4, %ymm4 2602; AVX2-NEXT: vmovdqa %ymm1, 32(%rsi) 2603; AVX2-NEXT: vmovdqa %ymm0, (%rsi) 2604; AVX2-NEXT: vmovdqa %ymm4, 192(%rdi) 2605; AVX2-NEXT: vmovdqa %ymm3, 128(%rdi) 2606; AVX2-NEXT: vmovdqa %ymm5, 64(%rdi) 2607; AVX2-NEXT: vmovdqa %ymm2, (%rdi) 2608; AVX2-NEXT: vmovdqa %ymm6, 224(%rdi) 2609; AVX2-NEXT: vmovdqa %ymm7, 160(%rdi) 2610; AVX2-NEXT: vmovdqa %ymm9, 96(%rdi) 2611; AVX2-NEXT: vmovdqa %ymm8, 32(%rdi) 2612; AVX2-NEXT: vzeroupper 2613; AVX2-NEXT: retq 2614; 2615; AVX512F-LABEL: smulo_v64i8: 2616; AVX512F: # %bb.0: 2617; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2 2618; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm3 2619; AVX512F-NEXT: vpmovsxbw %xmm3, %ymm3 2620; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm5 2621; AVX512F-NEXT: vextracti128 $1, %ymm5, %xmm4 2622; AVX512F-NEXT: vpmovsxbw %xmm4, %ymm4 2623; AVX512F-NEXT: vpmullw %ymm3, %ymm4, %ymm4 2624; AVX512F-NEXT: vpsraw $8, %ymm4, %ymm3 2625; AVX512F-NEXT: vpmovsxwd %ymm3, %zmm3 2626; AVX512F-NEXT: vpsllw $8, %ymm4, %ymm6 2627; AVX512F-NEXT: vpsraw $15, %ymm6, %ymm6 2628; AVX512F-NEXT: vpmovsxwd %ymm6, %zmm6 2629; AVX512F-NEXT: vpcmpneqd %zmm3, %zmm6, %k1 2630; AVX512F-NEXT: vpmovsxbw %xmm2, %ymm2 2631; AVX512F-NEXT: vpmovsxbw %xmm5, %ymm3 2632; AVX512F-NEXT: vpmullw %ymm2, %ymm3, %ymm5 2633; AVX512F-NEXT: vpsraw $8, %ymm5, %ymm2 2634; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2 2635; AVX512F-NEXT: vpsllw $8, %ymm5, %ymm3 2636; AVX512F-NEXT: vpsraw $15, %ymm3, %ymm3 2637; AVX512F-NEXT: vpmovsxwd %ymm3, %zmm3 2638; AVX512F-NEXT: vpcmpneqd %zmm2, %zmm3, %k2 2639; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 2640; AVX512F-NEXT: vpmovsxbw %xmm2, %ymm2 2641; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 2642; AVX512F-NEXT: vpmovsxbw %xmm3, %ymm3 2643; AVX512F-NEXT: vpmullw %ymm2, %ymm3, %ymm6 2644; AVX512F-NEXT: vpsraw $8, %ymm6, %ymm2 2645; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2 2646; AVX512F-NEXT: vpsllw $8, %ymm6, %ymm3 2647; AVX512F-NEXT: vpsraw $15, %ymm3, %ymm3 2648; AVX512F-NEXT: vpmovsxwd %ymm3, %zmm3 2649; AVX512F-NEXT: vpcmpneqd %zmm2, %zmm3, %k3 2650; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1 2651; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0 2652; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm7 2653; AVX512F-NEXT: vpsraw $8, %ymm7, %ymm0 2654; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 2655; AVX512F-NEXT: vpsllw $8, %ymm7, %ymm1 2656; AVX512F-NEXT: vpsraw $15, %ymm1, %ymm1 2657; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1 2658; AVX512F-NEXT: vpcmpneqd %zmm0, %zmm1, %k4 2659; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k4} {z} 2660; AVX512F-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k3} {z} 2661; AVX512F-NEXT: vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k2} {z} 2662; AVX512F-NEXT: vpternlogd $255, %zmm3, %zmm3, %zmm3 {%k1} {z} 2663; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero 2664; AVX512F-NEXT: vpmovdb %zmm4, 48(%rdi) 2665; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm4 = ymm5[0],zero,ymm5[1],zero,ymm5[2],zero,ymm5[3],zero,ymm5[4],zero,ymm5[5],zero,ymm5[6],zero,ymm5[7],zero,ymm5[8],zero,ymm5[9],zero,ymm5[10],zero,ymm5[11],zero,ymm5[12],zero,ymm5[13],zero,ymm5[14],zero,ymm5[15],zero 2666; AVX512F-NEXT: vpmovdb %zmm4, 32(%rdi) 2667; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm4 = ymm6[0],zero,ymm6[1],zero,ymm6[2],zero,ymm6[3],zero,ymm6[4],zero,ymm6[5],zero,ymm6[6],zero,ymm6[7],zero,ymm6[8],zero,ymm6[9],zero,ymm6[10],zero,ymm6[11],zero,ymm6[12],zero,ymm6[13],zero,ymm6[14],zero,ymm6[15],zero 2668; AVX512F-NEXT: vpmovdb %zmm4, 16(%rdi) 2669; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm4 = ymm7[0],zero,ymm7[1],zero,ymm7[2],zero,ymm7[3],zero,ymm7[4],zero,ymm7[5],zero,ymm7[6],zero,ymm7[7],zero,ymm7[8],zero,ymm7[9],zero,ymm7[10],zero,ymm7[11],zero,ymm7[12],zero,ymm7[13],zero,ymm7[14],zero,ymm7[15],zero 2670; AVX512F-NEXT: vpmovdb %zmm4, (%rdi) 2671; AVX512F-NEXT: retq 2672; 2673; AVX512BW-LABEL: smulo_v64i8: 2674; AVX512BW: # %bb.0: 2675; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 2676; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm3 = zmm2[8],zmm1[8],zmm2[9],zmm1[9],zmm2[10],zmm1[10],zmm2[11],zmm1[11],zmm2[12],zmm1[12],zmm2[13],zmm1[13],zmm2[14],zmm1[14],zmm2[15],zmm1[15],zmm2[24],zmm1[24],zmm2[25],zmm1[25],zmm2[26],zmm1[26],zmm2[27],zmm1[27],zmm2[28],zmm1[28],zmm2[29],zmm1[29],zmm2[30],zmm1[30],zmm2[31],zmm1[31],zmm2[40],zmm1[40],zmm2[41],zmm1[41],zmm2[42],zmm1[42],zmm2[43],zmm1[43],zmm2[44],zmm1[44],zmm2[45],zmm1[45],zmm2[46],zmm1[46],zmm2[47],zmm1[47],zmm2[56],zmm1[56],zmm2[57],zmm1[57],zmm2[58],zmm1[58],zmm2[59],zmm1[59],zmm2[60],zmm1[60],zmm2[61],zmm1[61],zmm2[62],zmm1[62],zmm2[63],zmm1[63] 2677; AVX512BW-NEXT: vpunpckhbw {{.*#+}} zmm4 = zmm2[8],zmm0[8],zmm2[9],zmm0[9],zmm2[10],zmm0[10],zmm2[11],zmm0[11],zmm2[12],zmm0[12],zmm2[13],zmm0[13],zmm2[14],zmm0[14],zmm2[15],zmm0[15],zmm2[24],zmm0[24],zmm2[25],zmm0[25],zmm2[26],zmm0[26],zmm2[27],zmm0[27],zmm2[28],zmm0[28],zmm2[29],zmm0[29],zmm2[30],zmm0[30],zmm2[31],zmm0[31],zmm2[40],zmm0[40],zmm2[41],zmm0[41],zmm2[42],zmm0[42],zmm2[43],zmm0[43],zmm2[44],zmm0[44],zmm2[45],zmm0[45],zmm2[46],zmm0[46],zmm2[47],zmm0[47],zmm2[56],zmm0[56],zmm2[57],zmm0[57],zmm2[58],zmm0[58],zmm2[59],zmm0[59],zmm2[60],zmm0[60],zmm2[61],zmm0[61],zmm2[62],zmm0[62],zmm2[63],zmm0[63] 2678; AVX512BW-NEXT: vpmulhw %zmm3, %zmm4, %zmm3 2679; AVX512BW-NEXT: vpsrlw $8, %zmm3, %zmm4 2680; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm1 = zmm2[0],zmm1[0],zmm2[1],zmm1[1],zmm2[2],zmm1[2],zmm2[3],zmm1[3],zmm2[4],zmm1[4],zmm2[5],zmm1[5],zmm2[6],zmm1[6],zmm2[7],zmm1[7],zmm2[16],zmm1[16],zmm2[17],zmm1[17],zmm2[18],zmm1[18],zmm2[19],zmm1[19],zmm2[20],zmm1[20],zmm2[21],zmm1[21],zmm2[22],zmm1[22],zmm2[23],zmm1[23],zmm2[32],zmm1[32],zmm2[33],zmm1[33],zmm2[34],zmm1[34],zmm2[35],zmm1[35],zmm2[36],zmm1[36],zmm2[37],zmm1[37],zmm2[38],zmm1[38],zmm2[39],zmm1[39],zmm2[48],zmm1[48],zmm2[49],zmm1[49],zmm2[50],zmm1[50],zmm2[51],zmm1[51],zmm2[52],zmm1[52],zmm2[53],zmm1[53],zmm2[54],zmm1[54],zmm2[55],zmm1[55] 2681; AVX512BW-NEXT: vpunpcklbw {{.*#+}} zmm0 = zmm2[0],zmm0[0],zmm2[1],zmm0[1],zmm2[2],zmm0[2],zmm2[3],zmm0[3],zmm2[4],zmm0[4],zmm2[5],zmm0[5],zmm2[6],zmm0[6],zmm2[7],zmm0[7],zmm2[16],zmm0[16],zmm2[17],zmm0[17],zmm2[18],zmm0[18],zmm2[19],zmm0[19],zmm2[20],zmm0[20],zmm2[21],zmm0[21],zmm2[22],zmm0[22],zmm2[23],zmm0[23],zmm2[32],zmm0[32],zmm2[33],zmm0[33],zmm2[34],zmm0[34],zmm2[35],zmm0[35],zmm2[36],zmm0[36],zmm2[37],zmm0[37],zmm2[38],zmm0[38],zmm2[39],zmm0[39],zmm2[48],zmm0[48],zmm2[49],zmm0[49],zmm2[50],zmm0[50],zmm2[51],zmm0[51],zmm2[52],zmm0[52],zmm2[53],zmm0[53],zmm2[54],zmm0[54],zmm2[55],zmm0[55] 2682; AVX512BW-NEXT: vpmulhw %zmm1, %zmm0, %zmm0 2683; AVX512BW-NEXT: vpsrlw $8, %zmm0, %zmm1 2684; AVX512BW-NEXT: vpackuswb %zmm4, %zmm1, %zmm1 2685; 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] 2686; AVX512BW-NEXT: vpandq %zmm2, %zmm3, %zmm3 2687; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0 2688; AVX512BW-NEXT: vpackuswb %zmm3, %zmm0, %zmm4 2689; AVX512BW-NEXT: vpmovb2m %zmm4, %k0 2690; AVX512BW-NEXT: vpmovm2b %k0, %zmm0 2691; AVX512BW-NEXT: vpcmpneqb %zmm1, %zmm0, %k1 2692; AVX512BW-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 2693; AVX512BW-NEXT: kshiftrd $16, %k1, %k2 2694; AVX512BW-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z} 2695; AVX512BW-NEXT: kshiftrq $32, %k1, %k1 2696; AVX512BW-NEXT: vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k1} {z} 2697; AVX512BW-NEXT: kshiftrd $16, %k1, %k1 2698; AVX512BW-NEXT: vpternlogd $255, %zmm3, %zmm3, %zmm3 {%k1} {z} 2699; AVX512BW-NEXT: vmovdqa64 %zmm4, (%rdi) 2700; AVX512BW-NEXT: retq 2701 %t = call {<64 x i8>, <64 x i1>} @llvm.smul.with.overflow.v64i8(<64 x i8> %a0, <64 x i8> %a1) 2702 %val = extractvalue {<64 x i8>, <64 x i1>} %t, 0 2703 %obit = extractvalue {<64 x i8>, <64 x i1>} %t, 1 2704 %res = sext <64 x i1> %obit to <64 x i32> 2705 store <64 x i8> %val, <64 x i8>* %p2 2706 ret <64 x i32> %res 2707} 2708 2709define <8 x i32> @smulo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind { 2710; SSE2-LABEL: smulo_v8i16: 2711; SSE2: # %bb.0: 2712; SSE2-NEXT: movdqa %xmm0, %xmm2 2713; SSE2-NEXT: pmulhw %xmm1, %xmm2 2714; SSE2-NEXT: pmullw %xmm1, %xmm0 2715; SSE2-NEXT: movdqa %xmm0, (%rdi) 2716; SSE2-NEXT: psraw $15, %xmm0 2717; SSE2-NEXT: pcmpeqw %xmm2, %xmm0 2718; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 2719; SSE2-NEXT: pxor %xmm0, %xmm1 2720; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 2721; SSE2-NEXT: psrad $16, %xmm0 2722; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 2723; SSE2-NEXT: pslld $31, %xmm1 2724; SSE2-NEXT: psrad $31, %xmm1 2725; SSE2-NEXT: retq 2726; 2727; SSSE3-LABEL: smulo_v8i16: 2728; SSSE3: # %bb.0: 2729; SSSE3-NEXT: movdqa %xmm0, %xmm2 2730; SSSE3-NEXT: pmulhw %xmm1, %xmm2 2731; SSSE3-NEXT: pmullw %xmm1, %xmm0 2732; SSSE3-NEXT: movdqa %xmm0, (%rdi) 2733; SSSE3-NEXT: psraw $15, %xmm0 2734; SSSE3-NEXT: pcmpeqw %xmm2, %xmm0 2735; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1 2736; SSSE3-NEXT: pxor %xmm0, %xmm1 2737; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 2738; SSSE3-NEXT: psrad $16, %xmm0 2739; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 2740; SSSE3-NEXT: pslld $31, %xmm1 2741; SSSE3-NEXT: psrad $31, %xmm1 2742; SSSE3-NEXT: retq 2743; 2744; SSE41-LABEL: smulo_v8i16: 2745; SSE41: # %bb.0: 2746; SSE41-NEXT: movdqa %xmm0, %xmm2 2747; SSE41-NEXT: pmulhw %xmm1, %xmm2 2748; SSE41-NEXT: pmullw %xmm1, %xmm0 2749; SSE41-NEXT: movdqa %xmm0, (%rdi) 2750; SSE41-NEXT: psraw $15, %xmm0 2751; SSE41-NEXT: pcmpeqw %xmm2, %xmm0 2752; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 2753; SSE41-NEXT: pxor %xmm0, %xmm1 2754; SSE41-NEXT: pmovsxwd %xmm1, %xmm0 2755; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7] 2756; SSE41-NEXT: pslld $31, %xmm1 2757; SSE41-NEXT: psrad $31, %xmm1 2758; SSE41-NEXT: retq 2759; 2760; AVX1-LABEL: smulo_v8i16: 2761; AVX1: # %bb.0: 2762; AVX1-NEXT: vpmulhw %xmm1, %xmm0, %xmm2 2763; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm1 2764; AVX1-NEXT: vpsraw $15, %xmm1, %xmm0 2765; AVX1-NEXT: vpcmpeqw %xmm0, %xmm2, %xmm0 2766; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 2767; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 2768; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2 2769; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 2770; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0 2771; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 2772; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 2773; AVX1-NEXT: retq 2774; 2775; AVX2-LABEL: smulo_v8i16: 2776; AVX2: # %bb.0: 2777; AVX2-NEXT: vpmulhw %xmm1, %xmm0, %xmm2 2778; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm1 2779; AVX2-NEXT: vpsraw $15, %xmm1, %xmm0 2780; AVX2-NEXT: vpcmpeqw %xmm0, %xmm2, %xmm0 2781; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 2782; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 2783; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0 2784; AVX2-NEXT: vmovdqa %xmm1, (%rdi) 2785; AVX2-NEXT: retq 2786; 2787; AVX512F-LABEL: smulo_v8i16: 2788; AVX512F: # %bb.0: 2789; AVX512F-NEXT: vpmulhw %xmm1, %xmm0, %xmm2 2790; AVX512F-NEXT: vpmullw %xmm1, %xmm0, %xmm1 2791; AVX512F-NEXT: vpsraw $15, %xmm1, %xmm0 2792; AVX512F-NEXT: vpcmpeqw %xmm0, %xmm2, %xmm0 2793; AVX512F-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0 2794; AVX512F-NEXT: vpmovsxwd %xmm0, %ymm0 2795; AVX512F-NEXT: vptestmd %ymm0, %ymm0, %k1 2796; AVX512F-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 2797; AVX512F-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} 2798; AVX512F-NEXT: vmovdqa %xmm1, (%rdi) 2799; AVX512F-NEXT: retq 2800; 2801; AVX512BW-LABEL: smulo_v8i16: 2802; AVX512BW: # %bb.0: 2803; AVX512BW-NEXT: vpmulhw %xmm1, %xmm0, %xmm2 2804; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm1 2805; AVX512BW-NEXT: vpsraw $15, %xmm1, %xmm0 2806; AVX512BW-NEXT: vpcmpneqw %xmm0, %xmm2, %k1 2807; AVX512BW-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 2808; AVX512BW-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} 2809; AVX512BW-NEXT: vmovdqa %xmm1, (%rdi) 2810; AVX512BW-NEXT: retq 2811 %t = call {<8 x i16>, <8 x i1>} @llvm.smul.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1) 2812 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0 2813 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1 2814 %res = sext <8 x i1> %obit to <8 x i32> 2815 store <8 x i16> %val, <8 x i16>* %p2 2816 ret <8 x i32> %res 2817} 2818 2819define <2 x i32> @smulo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind { 2820; SSE2-LABEL: smulo_v2i64: 2821; SSE2: # %bb.0: 2822; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 2823; SSE2-NEXT: movq %xmm2, %r8 2824; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 2825; SSE2-NEXT: movq %xmm2, %rcx 2826; SSE2-NEXT: movq %xmm1, %rdx 2827; SSE2-NEXT: movq %xmm0, %rsi 2828; SSE2-NEXT: xorl %eax, %eax 2829; SSE2-NEXT: imulq %rdx, %rsi 2830; SSE2-NEXT: movq $-1, %r9 2831; SSE2-NEXT: movl $0, %edx 2832; SSE2-NEXT: cmovoq %r9, %rdx 2833; SSE2-NEXT: movq %rsi, %xmm1 2834; SSE2-NEXT: imulq %r8, %rcx 2835; SSE2-NEXT: movq %rcx, %xmm0 2836; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 2837; SSE2-NEXT: movq %rdx, %xmm0 2838; SSE2-NEXT: cmovoq %r9, %rax 2839; SSE2-NEXT: movq %rax, %xmm2 2840; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 2841; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2842; SSE2-NEXT: movdqa %xmm1, (%rdi) 2843; SSE2-NEXT: retq 2844; 2845; SSSE3-LABEL: smulo_v2i64: 2846; SSSE3: # %bb.0: 2847; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 2848; SSSE3-NEXT: movq %xmm2, %r8 2849; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 2850; SSSE3-NEXT: movq %xmm2, %rcx 2851; SSSE3-NEXT: movq %xmm1, %rdx 2852; SSSE3-NEXT: movq %xmm0, %rsi 2853; SSSE3-NEXT: xorl %eax, %eax 2854; SSSE3-NEXT: imulq %rdx, %rsi 2855; SSSE3-NEXT: movq $-1, %r9 2856; SSSE3-NEXT: movl $0, %edx 2857; SSSE3-NEXT: cmovoq %r9, %rdx 2858; SSSE3-NEXT: movq %rsi, %xmm1 2859; SSSE3-NEXT: imulq %r8, %rcx 2860; SSSE3-NEXT: movq %rcx, %xmm0 2861; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 2862; SSSE3-NEXT: movq %rdx, %xmm0 2863; SSSE3-NEXT: cmovoq %r9, %rax 2864; SSSE3-NEXT: movq %rax, %xmm2 2865; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 2866; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2867; SSSE3-NEXT: movdqa %xmm1, (%rdi) 2868; SSSE3-NEXT: retq 2869; 2870; SSE41-LABEL: smulo_v2i64: 2871; SSE41: # %bb.0: 2872; SSE41-NEXT: movq %xmm1, %r8 2873; SSE41-NEXT: movq %xmm0, %rcx 2874; SSE41-NEXT: pextrq $1, %xmm1, %rdx 2875; SSE41-NEXT: pextrq $1, %xmm0, %rsi 2876; SSE41-NEXT: xorl %eax, %eax 2877; SSE41-NEXT: imulq %rdx, %rsi 2878; SSE41-NEXT: movq $-1, %r9 2879; SSE41-NEXT: movl $0, %edx 2880; SSE41-NEXT: cmovoq %r9, %rdx 2881; SSE41-NEXT: movq %rsi, %xmm0 2882; SSE41-NEXT: imulq %r8, %rcx 2883; SSE41-NEXT: movq %rcx, %xmm1 2884; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 2885; SSE41-NEXT: movq %rdx, %xmm0 2886; SSE41-NEXT: cmovoq %r9, %rax 2887; SSE41-NEXT: movq %rax, %xmm2 2888; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0] 2889; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 2890; SSE41-NEXT: movdqa %xmm1, (%rdi) 2891; SSE41-NEXT: retq 2892; 2893; AVX-LABEL: smulo_v2i64: 2894; AVX: # %bb.0: 2895; AVX-NEXT: vmovq %xmm1, %r8 2896; AVX-NEXT: vmovq %xmm0, %rcx 2897; AVX-NEXT: vpextrq $1, %xmm1, %rdx 2898; AVX-NEXT: vpextrq $1, %xmm0, %rsi 2899; AVX-NEXT: xorl %eax, %eax 2900; AVX-NEXT: imulq %rdx, %rsi 2901; AVX-NEXT: movq $-1, %r9 2902; AVX-NEXT: movl $0, %edx 2903; AVX-NEXT: cmovoq %r9, %rdx 2904; AVX-NEXT: vmovq %rsi, %xmm0 2905; AVX-NEXT: imulq %r8, %rcx 2906; AVX-NEXT: vmovq %rcx, %xmm1 2907; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 2908; AVX-NEXT: vmovq %rdx, %xmm0 2909; AVX-NEXT: cmovoq %r9, %rax 2910; AVX-NEXT: vmovq %rax, %xmm2 2911; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 2912; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2913; AVX-NEXT: vmovdqa %xmm1, (%rdi) 2914; AVX-NEXT: retq 2915; 2916; AVX512F-LABEL: smulo_v2i64: 2917; AVX512F: # %bb.0: 2918; AVX512F-NEXT: vmovq %xmm1, %rax 2919; AVX512F-NEXT: vmovq %xmm0, %rcx 2920; AVX512F-NEXT: vpextrq $1, %xmm1, %rdx 2921; AVX512F-NEXT: vpextrq $1, %xmm0, %rsi 2922; AVX512F-NEXT: imulq %rdx, %rsi 2923; AVX512F-NEXT: seto %dl 2924; AVX512F-NEXT: vmovq %rsi, %xmm0 2925; AVX512F-NEXT: imulq %rax, %rcx 2926; AVX512F-NEXT: vmovq %rcx, %xmm1 2927; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 2928; AVX512F-NEXT: seto %al 2929; AVX512F-NEXT: movw $-3, %cx 2930; AVX512F-NEXT: kmovw %ecx, %k0 2931; AVX512F-NEXT: kmovw %eax, %k1 2932; AVX512F-NEXT: kandw %k0, %k1, %k0 2933; AVX512F-NEXT: kmovw %edx, %k1 2934; AVX512F-NEXT: kshiftlw $15, %k1, %k1 2935; AVX512F-NEXT: kshiftrw $14, %k1, %k1 2936; AVX512F-NEXT: korw %k1, %k0, %k1 2937; AVX512F-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 2938; AVX512F-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 2939; AVX512F-NEXT: vmovdqa %xmm1, (%rdi) 2940; AVX512F-NEXT: retq 2941; 2942; AVX512BW-LABEL: smulo_v2i64: 2943; AVX512BW: # %bb.0: 2944; AVX512BW-NEXT: vmovq %xmm1, %rax 2945; AVX512BW-NEXT: vmovq %xmm0, %rcx 2946; AVX512BW-NEXT: vpextrq $1, %xmm1, %rdx 2947; AVX512BW-NEXT: vpextrq $1, %xmm0, %rsi 2948; AVX512BW-NEXT: imulq %rdx, %rsi 2949; AVX512BW-NEXT: seto %dl 2950; AVX512BW-NEXT: vmovq %rsi, %xmm0 2951; AVX512BW-NEXT: imulq %rax, %rcx 2952; AVX512BW-NEXT: vmovq %rcx, %xmm1 2953; AVX512BW-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 2954; AVX512BW-NEXT: seto %al 2955; AVX512BW-NEXT: movw $-3, %cx 2956; AVX512BW-NEXT: kmovd %ecx, %k0 2957; AVX512BW-NEXT: kmovd %eax, %k1 2958; AVX512BW-NEXT: kandw %k0, %k1, %k0 2959; AVX512BW-NEXT: kmovd %edx, %k1 2960; AVX512BW-NEXT: kshiftlw $15, %k1, %k1 2961; AVX512BW-NEXT: kshiftrw $14, %k1, %k1 2962; AVX512BW-NEXT: korw %k1, %k0, %k1 2963; AVX512BW-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 2964; AVX512BW-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 2965; AVX512BW-NEXT: vmovdqa %xmm1, (%rdi) 2966; AVX512BW-NEXT: retq 2967 %t = call {<2 x i64>, <2 x i1>} @llvm.smul.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1) 2968 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0 2969 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1 2970 %res = sext <2 x i1> %obit to <2 x i32> 2971 store <2 x i64> %val, <2 x i64>* %p2 2972 ret <2 x i32> %res 2973} 2974 2975define <4 x i32> @smulo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind { 2976; SSE2-LABEL: smulo_v4i24: 2977; SSE2: # %bb.0: 2978; SSE2-NEXT: pslld $8, %xmm0 2979; SSE2-NEXT: psrad $8, %xmm0 2980; SSE2-NEXT: pslld $8, %xmm1 2981; SSE2-NEXT: psrad $8, %xmm1 2982; SSE2-NEXT: pxor %xmm3, %xmm3 2983; SSE2-NEXT: pxor %xmm2, %xmm2 2984; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 2985; SSE2-NEXT: pand %xmm0, %xmm2 2986; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 2987; SSE2-NEXT: pand %xmm1, %xmm3 2988; SSE2-NEXT: paddd %xmm2, %xmm3 2989; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 2990; SSE2-NEXT: pmuludq %xmm1, %xmm0 2991; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3] 2992; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 2993; SSE2-NEXT: pmuludq %xmm4, %xmm2 2994; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 2995; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1] 2996; SSE2-NEXT: psubd %xmm3, %xmm5 2997; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3] 2998; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 2999; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1] 3000; SSE2-NEXT: movdqa %xmm3, %xmm1 3001; SSE2-NEXT: pslld $8, %xmm1 3002; SSE2-NEXT: psrad $8, %xmm1 3003; SSE2-NEXT: pcmpeqd %xmm3, %xmm1 3004; SSE2-NEXT: psrad $31, %xmm3 3005; SSE2-NEXT: pcmpeqd %xmm5, %xmm3 3006; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 3007; SSE2-NEXT: pxor %xmm4, %xmm3 3008; SSE2-NEXT: pxor %xmm4, %xmm1 3009; SSE2-NEXT: por %xmm3, %xmm1 3010; SSE2-NEXT: movd %xmm0, %eax 3011; SSE2-NEXT: movw %ax, (%rdi) 3012; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 3013; SSE2-NEXT: movd %xmm0, %ecx 3014; SSE2-NEXT: movw %cx, 6(%rdi) 3015; SSE2-NEXT: movd %xmm2, %edx 3016; SSE2-NEXT: movw %dx, 3(%rdi) 3017; SSE2-NEXT: shrl $16, %eax 3018; SSE2-NEXT: movb %al, 2(%rdi) 3019; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,2,2,2] 3020; SSE2-NEXT: movd %xmm0, %eax 3021; SSE2-NEXT: movw %ax, 9(%rdi) 3022; SSE2-NEXT: shrl $16, %ecx 3023; SSE2-NEXT: movb %cl, 8(%rdi) 3024; SSE2-NEXT: shrl $16, %edx 3025; SSE2-NEXT: movb %dl, 5(%rdi) 3026; SSE2-NEXT: shrl $16, %eax 3027; SSE2-NEXT: movb %al, 11(%rdi) 3028; SSE2-NEXT: movdqa %xmm1, %xmm0 3029; SSE2-NEXT: retq 3030; 3031; SSSE3-LABEL: smulo_v4i24: 3032; SSSE3: # %bb.0: 3033; SSSE3-NEXT: pslld $8, %xmm0 3034; SSSE3-NEXT: psrad $8, %xmm0 3035; SSSE3-NEXT: pslld $8, %xmm1 3036; SSSE3-NEXT: psrad $8, %xmm1 3037; SSSE3-NEXT: pxor %xmm3, %xmm3 3038; SSSE3-NEXT: pxor %xmm2, %xmm2 3039; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 3040; SSSE3-NEXT: pand %xmm0, %xmm2 3041; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3 3042; SSSE3-NEXT: pand %xmm1, %xmm3 3043; SSSE3-NEXT: paddd %xmm2, %xmm3 3044; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 3045; SSSE3-NEXT: pmuludq %xmm1, %xmm0 3046; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3] 3047; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 3048; SSSE3-NEXT: pmuludq %xmm4, %xmm2 3049; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 3050; SSSE3-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1] 3051; SSSE3-NEXT: psubd %xmm3, %xmm5 3052; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3] 3053; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 3054; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1] 3055; SSSE3-NEXT: movdqa %xmm3, %xmm1 3056; SSSE3-NEXT: pslld $8, %xmm1 3057; SSSE3-NEXT: psrad $8, %xmm1 3058; SSSE3-NEXT: pcmpeqd %xmm3, %xmm1 3059; SSSE3-NEXT: psrad $31, %xmm3 3060; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 3061; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4 3062; SSSE3-NEXT: pxor %xmm4, %xmm3 3063; SSSE3-NEXT: pxor %xmm4, %xmm1 3064; SSSE3-NEXT: por %xmm3, %xmm1 3065; SSSE3-NEXT: movd %xmm0, %eax 3066; SSSE3-NEXT: movw %ax, (%rdi) 3067; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 3068; SSSE3-NEXT: movd %xmm0, %ecx 3069; SSSE3-NEXT: movw %cx, 6(%rdi) 3070; SSSE3-NEXT: movd %xmm2, %edx 3071; SSSE3-NEXT: movw %dx, 3(%rdi) 3072; SSSE3-NEXT: shrl $16, %eax 3073; SSSE3-NEXT: movb %al, 2(%rdi) 3074; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,2,2,2] 3075; SSSE3-NEXT: movd %xmm0, %eax 3076; SSSE3-NEXT: movw %ax, 9(%rdi) 3077; SSSE3-NEXT: shrl $16, %ecx 3078; SSSE3-NEXT: movb %cl, 8(%rdi) 3079; SSSE3-NEXT: shrl $16, %edx 3080; SSSE3-NEXT: movb %dl, 5(%rdi) 3081; SSSE3-NEXT: shrl $16, %eax 3082; SSSE3-NEXT: movb %al, 11(%rdi) 3083; SSSE3-NEXT: movdqa %xmm1, %xmm0 3084; SSSE3-NEXT: retq 3085; 3086; SSE41-LABEL: smulo_v4i24: 3087; SSE41: # %bb.0: 3088; SSE41-NEXT: pslld $8, %xmm0 3089; SSE41-NEXT: psrad $8, %xmm0 3090; SSE41-NEXT: pslld $8, %xmm1 3091; SSE41-NEXT: psrad $8, %xmm1 3092; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 3093; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 3094; SSE41-NEXT: pmuldq %xmm2, %xmm3 3095; SSE41-NEXT: movdqa %xmm0, %xmm2 3096; SSE41-NEXT: pmuldq %xmm1, %xmm2 3097; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 3098; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 3099; SSE41-NEXT: pmulld %xmm0, %xmm1 3100; SSE41-NEXT: movdqa %xmm1, %xmm0 3101; SSE41-NEXT: pslld $8, %xmm0 3102; SSE41-NEXT: psrad $8, %xmm0 3103; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 3104; SSE41-NEXT: pextrd $3, %xmm1, %eax 3105; SSE41-NEXT: pextrd $2, %xmm1, %ecx 3106; SSE41-NEXT: pextrd $1, %xmm1, %edx 3107; SSE41-NEXT: movd %xmm1, %esi 3108; SSE41-NEXT: psrad $31, %xmm1 3109; SSE41-NEXT: pcmpeqd %xmm2, %xmm1 3110; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 3111; SSE41-NEXT: pxor %xmm2, %xmm1 3112; SSE41-NEXT: pxor %xmm2, %xmm0 3113; SSE41-NEXT: por %xmm1, %xmm0 3114; SSE41-NEXT: movw %ax, 9(%rdi) 3115; SSE41-NEXT: movw %cx, 6(%rdi) 3116; SSE41-NEXT: movw %dx, 3(%rdi) 3117; SSE41-NEXT: movw %si, (%rdi) 3118; SSE41-NEXT: shrl $16, %eax 3119; SSE41-NEXT: movb %al, 11(%rdi) 3120; SSE41-NEXT: shrl $16, %ecx 3121; SSE41-NEXT: movb %cl, 8(%rdi) 3122; SSE41-NEXT: shrl $16, %edx 3123; SSE41-NEXT: movb %dl, 5(%rdi) 3124; SSE41-NEXT: shrl $16, %esi 3125; SSE41-NEXT: movb %sil, 2(%rdi) 3126; SSE41-NEXT: retq 3127; 3128; AVX1-LABEL: smulo_v4i24: 3129; AVX1: # %bb.0: 3130; AVX1-NEXT: vpslld $8, %xmm0, %xmm0 3131; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0 3132; AVX1-NEXT: vpslld $8, %xmm1, %xmm1 3133; AVX1-NEXT: vpsrad $8, %xmm1, %xmm1 3134; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 3135; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 3136; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 3137; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm3 3138; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3139; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7] 3140; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1 3141; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0 3142; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 3143; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 3144; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 3145; AVX1-NEXT: vpslld $8, %xmm1, %xmm3 3146; AVX1-NEXT: vpsrad $8, %xmm3, %xmm3 3147; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm3 3148; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm2 3149; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 3150; AVX1-NEXT: vpextrd $3, %xmm1, %eax 3151; AVX1-NEXT: movw %ax, 9(%rdi) 3152; AVX1-NEXT: vpextrd $2, %xmm1, %ecx 3153; AVX1-NEXT: movw %cx, 6(%rdi) 3154; AVX1-NEXT: vpextrd $1, %xmm1, %edx 3155; AVX1-NEXT: movw %dx, 3(%rdi) 3156; AVX1-NEXT: vmovd %xmm1, %esi 3157; AVX1-NEXT: movw %si, (%rdi) 3158; AVX1-NEXT: shrl $16, %eax 3159; AVX1-NEXT: movb %al, 11(%rdi) 3160; AVX1-NEXT: shrl $16, %ecx 3161; AVX1-NEXT: movb %cl, 8(%rdi) 3162; AVX1-NEXT: shrl $16, %edx 3163; AVX1-NEXT: movb %dl, 5(%rdi) 3164; AVX1-NEXT: shrl $16, %esi 3165; AVX1-NEXT: movb %sil, 2(%rdi) 3166; AVX1-NEXT: retq 3167; 3168; AVX2-LABEL: smulo_v4i24: 3169; AVX2: # %bb.0: 3170; AVX2-NEXT: vpslld $8, %xmm0, %xmm0 3171; AVX2-NEXT: vpsrad $8, %xmm0, %xmm0 3172; AVX2-NEXT: vpslld $8, %xmm1, %xmm1 3173; AVX2-NEXT: vpsrad $8, %xmm1, %xmm1 3174; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 3175; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 3176; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 3177; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm3 3178; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3179; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3] 3180; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm1 3181; AVX2-NEXT: vpsrad $31, %xmm1, %xmm0 3182; AVX2-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 3183; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 3184; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 3185; AVX2-NEXT: vpslld $8, %xmm1, %xmm3 3186; AVX2-NEXT: vpsrad $8, %xmm3, %xmm3 3187; AVX2-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm3 3188; AVX2-NEXT: vpxor %xmm2, %xmm3, %xmm2 3189; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0 3190; AVX2-NEXT: vpextrd $3, %xmm1, %eax 3191; AVX2-NEXT: movw %ax, 9(%rdi) 3192; AVX2-NEXT: vpextrd $2, %xmm1, %ecx 3193; AVX2-NEXT: movw %cx, 6(%rdi) 3194; AVX2-NEXT: vpextrd $1, %xmm1, %edx 3195; AVX2-NEXT: movw %dx, 3(%rdi) 3196; AVX2-NEXT: vmovd %xmm1, %esi 3197; AVX2-NEXT: movw %si, (%rdi) 3198; AVX2-NEXT: shrl $16, %eax 3199; AVX2-NEXT: movb %al, 11(%rdi) 3200; AVX2-NEXT: shrl $16, %ecx 3201; AVX2-NEXT: movb %cl, 8(%rdi) 3202; AVX2-NEXT: shrl $16, %edx 3203; AVX2-NEXT: movb %dl, 5(%rdi) 3204; AVX2-NEXT: shrl $16, %esi 3205; AVX2-NEXT: movb %sil, 2(%rdi) 3206; AVX2-NEXT: retq 3207; 3208; AVX512-LABEL: smulo_v4i24: 3209; AVX512: # %bb.0: 3210; AVX512-NEXT: vpslld $8, %xmm1, %xmm1 3211; AVX512-NEXT: vpsrad $8, %xmm1, %xmm1 3212; AVX512-NEXT: vpslld $8, %xmm0, %xmm0 3213; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0 3214; AVX512-NEXT: vpmuldq %xmm1, %xmm0, %xmm2 3215; AVX512-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 3216; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 3217; AVX512-NEXT: vpmuldq %xmm3, %xmm4, %xmm3 3218; AVX512-NEXT: vmovdqa {{.*#+}} xmm4 = [1,5,3,7] 3219; AVX512-NEXT: vpermi2d %xmm3, %xmm2, %xmm4 3220; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm1 3221; AVX512-NEXT: vpsrad $31, %xmm1, %xmm0 3222; AVX512-NEXT: vpcmpneqd %xmm0, %xmm4, %k0 3223; AVX512-NEXT: vpslld $8, %xmm1, %xmm0 3224; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0 3225; AVX512-NEXT: vpcmpneqd %xmm1, %xmm0, %k1 3226; AVX512-NEXT: korw %k0, %k1, %k1 3227; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 3228; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 3229; AVX512-NEXT: vpextrd $3, %xmm1, %eax 3230; AVX512-NEXT: movw %ax, 9(%rdi) 3231; AVX512-NEXT: vpextrd $2, %xmm1, %ecx 3232; AVX512-NEXT: movw %cx, 6(%rdi) 3233; AVX512-NEXT: vpextrd $1, %xmm1, %edx 3234; AVX512-NEXT: movw %dx, 3(%rdi) 3235; AVX512-NEXT: vmovd %xmm1, %esi 3236; AVX512-NEXT: movw %si, (%rdi) 3237; AVX512-NEXT: shrl $16, %eax 3238; AVX512-NEXT: movb %al, 11(%rdi) 3239; AVX512-NEXT: shrl $16, %ecx 3240; AVX512-NEXT: movb %cl, 8(%rdi) 3241; AVX512-NEXT: shrl $16, %edx 3242; AVX512-NEXT: movb %dl, 5(%rdi) 3243; AVX512-NEXT: shrl $16, %esi 3244; AVX512-NEXT: movb %sil, 2(%rdi) 3245; AVX512-NEXT: retq 3246 %t = call {<4 x i24>, <4 x i1>} @llvm.smul.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1) 3247 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0 3248 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1 3249 %res = sext <4 x i1> %obit to <4 x i32> 3250 store <4 x i24> %val, <4 x i24>* %p2 3251 ret <4 x i32> %res 3252} 3253 3254define <4 x i32> @smulo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind { 3255; SSE2-LABEL: smulo_v4i1: 3256; SSE2: # %bb.0: 3257; SSE2-NEXT: pand %xmm1, %xmm0 3258; SSE2-NEXT: pslld $31, %xmm0 3259; SSE2-NEXT: movmskps %xmm0, %eax 3260; SSE2-NEXT: psrad $31, %xmm0 3261; SSE2-NEXT: movb %al, (%rdi) 3262; SSE2-NEXT: retq 3263; 3264; SSSE3-LABEL: smulo_v4i1: 3265; SSSE3: # %bb.0: 3266; SSSE3-NEXT: pand %xmm1, %xmm0 3267; SSSE3-NEXT: pslld $31, %xmm0 3268; SSSE3-NEXT: movmskps %xmm0, %eax 3269; SSSE3-NEXT: psrad $31, %xmm0 3270; SSSE3-NEXT: movb %al, (%rdi) 3271; SSSE3-NEXT: retq 3272; 3273; SSE41-LABEL: smulo_v4i1: 3274; SSE41: # %bb.0: 3275; SSE41-NEXT: pand %xmm1, %xmm0 3276; SSE41-NEXT: pslld $31, %xmm0 3277; SSE41-NEXT: movmskps %xmm0, %eax 3278; SSE41-NEXT: psrad $31, %xmm0 3279; SSE41-NEXT: movb %al, (%rdi) 3280; SSE41-NEXT: retq 3281; 3282; AVX-LABEL: smulo_v4i1: 3283; AVX: # %bb.0: 3284; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 3285; AVX-NEXT: vpslld $31, %xmm0, %xmm0 3286; AVX-NEXT: vmovmskps %xmm0, %eax 3287; AVX-NEXT: vpsrad $31, %xmm0, %xmm0 3288; AVX-NEXT: movb %al, (%rdi) 3289; AVX-NEXT: retq 3290; 3291; AVX512F-LABEL: smulo_v4i1: 3292; AVX512F: # %bb.0: 3293; AVX512F-NEXT: vpand %xmm1, %xmm0, %xmm0 3294; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 3295; AVX512F-NEXT: vptestmd %xmm0, %xmm0, %k0 3296; AVX512F-NEXT: vpsrad $31, %xmm0, %xmm0 3297; AVX512F-NEXT: kmovw %k0, %eax 3298; AVX512F-NEXT: movb %al, (%rdi) 3299; AVX512F-NEXT: retq 3300; 3301; AVX512BW-LABEL: smulo_v4i1: 3302; AVX512BW: # %bb.0: 3303; AVX512BW-NEXT: vpand %xmm1, %xmm0, %xmm0 3304; AVX512BW-NEXT: vpslld $31, %xmm0, %xmm0 3305; AVX512BW-NEXT: vptestmd %xmm0, %xmm0, %k0 3306; AVX512BW-NEXT: vpsrad $31, %xmm0, %xmm0 3307; AVX512BW-NEXT: kmovd %k0, %eax 3308; AVX512BW-NEXT: movb %al, (%rdi) 3309; AVX512BW-NEXT: retq 3310 %t = call {<4 x i1>, <4 x i1>} @llvm.smul.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1) 3311 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0 3312 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1 3313 %res = sext <4 x i1> %obit to <4 x i32> 3314 store <4 x i1> %val, <4 x i1>* %p2 3315 ret <4 x i32> %res 3316} 3317 3318define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind { 3319; SSE2-LABEL: smulo_v2i128: 3320; SSE2: # %bb.0: 3321; SSE2-NEXT: pushq %rbp 3322; SSE2-NEXT: pushq %r15 3323; SSE2-NEXT: pushq %r14 3324; SSE2-NEXT: pushq %r13 3325; SSE2-NEXT: pushq %r12 3326; SSE2-NEXT: pushq %rbx 3327; SSE2-NEXT: movq %r8, %r14 3328; SSE2-NEXT: movq %rcx, %r11 3329; SSE2-NEXT: movq %rdx, %r15 3330; SSE2-NEXT: movq %rsi, %r13 3331; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r8 3332; SSE2-NEXT: movq %rsi, %rcx 3333; SSE2-NEXT: sarq $63, %rcx 3334; SSE2-NEXT: movq %r14, %rsi 3335; SSE2-NEXT: imulq %rcx, %rsi 3336; SSE2-NEXT: movq %r14, %rax 3337; SSE2-NEXT: mulq %rcx 3338; SSE2-NEXT: movq %rax, %r10 3339; SSE2-NEXT: addq %rsi, %rdx 3340; SSE2-NEXT: imulq %r9, %rcx 3341; SSE2-NEXT: addq %rdx, %rcx 3342; SSE2-NEXT: movq %r9, %rbx 3343; SSE2-NEXT: sarq $63, %rbx 3344; SSE2-NEXT: movq %rbx, %rsi 3345; SSE2-NEXT: imulq %r13, %rsi 3346; SSE2-NEXT: movq %rbx, %rax 3347; SSE2-NEXT: mulq %rdi 3348; SSE2-NEXT: movq %rax, %r12 3349; SSE2-NEXT: addq %rsi, %rdx 3350; SSE2-NEXT: imulq %rdi, %rbx 3351; SSE2-NEXT: addq %rdx, %rbx 3352; SSE2-NEXT: addq %r10, %r12 3353; SSE2-NEXT: adcq %rcx, %rbx 3354; SSE2-NEXT: movq %rdi, %rax 3355; SSE2-NEXT: mulq %r14 3356; SSE2-NEXT: movq %rdx, %rbp 3357; SSE2-NEXT: movq %rax, %r10 3358; SSE2-NEXT: movq %r13, %rax 3359; SSE2-NEXT: mulq %r14 3360; SSE2-NEXT: movq %rdx, %rsi 3361; SSE2-NEXT: movq %rax, %rcx 3362; SSE2-NEXT: addq %rbp, %rcx 3363; SSE2-NEXT: adcq $0, %rsi 3364; SSE2-NEXT: movq %rdi, %rax 3365; SSE2-NEXT: mulq %r9 3366; SSE2-NEXT: movq %rdx, %rbp 3367; SSE2-NEXT: movq %rax, %rdi 3368; SSE2-NEXT: addq %rcx, %rdi 3369; SSE2-NEXT: adcq %rsi, %rbp 3370; SSE2-NEXT: setb %al 3371; SSE2-NEXT: movzbl %al, %ecx 3372; SSE2-NEXT: movq %r13, %rax 3373; SSE2-NEXT: mulq %r9 3374; SSE2-NEXT: addq %rbp, %rax 3375; SSE2-NEXT: adcq %rcx, %rdx 3376; SSE2-NEXT: addq %r12, %rax 3377; SSE2-NEXT: adcq %rbx, %rdx 3378; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r13 3379; SSE2-NEXT: movq %rdi, 8(%r13) 3380; SSE2-NEXT: sarq $63, %rdi 3381; SSE2-NEXT: xorq %rdi, %rdx 3382; SSE2-NEXT: xorq %rax, %rdi 3383; SSE2-NEXT: xorl %r12d, %r12d 3384; SSE2-NEXT: orq %rdx, %rdi 3385; SSE2-NEXT: setne %r12b 3386; SSE2-NEXT: movq %r11, %rdi 3387; SSE2-NEXT: sarq $63, %rdi 3388; SSE2-NEXT: movq %r8, %rax 3389; SSE2-NEXT: movq %r8, %rsi 3390; SSE2-NEXT: imulq %rdi, %rsi 3391; SSE2-NEXT: movq %r8, %rbx 3392; SSE2-NEXT: mulq %rdi 3393; SSE2-NEXT: movq %rax, %rcx 3394; SSE2-NEXT: addq %rsi, %rdx 3395; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r8 3396; SSE2-NEXT: imulq %r8, %rdi 3397; SSE2-NEXT: addq %rdx, %rdi 3398; SSE2-NEXT: movq %r8, %rsi 3399; SSE2-NEXT: sarq $63, %rsi 3400; SSE2-NEXT: movq %rsi, %rbp 3401; SSE2-NEXT: imulq %r11, %rbp 3402; SSE2-NEXT: movq %rsi, %rax 3403; SSE2-NEXT: mulq %r15 3404; SSE2-NEXT: movq %rax, %r14 3405; SSE2-NEXT: addq %rbp, %rdx 3406; SSE2-NEXT: imulq %r15, %rsi 3407; SSE2-NEXT: addq %rdx, %rsi 3408; SSE2-NEXT: addq %rcx, %r14 3409; SSE2-NEXT: adcq %rdi, %rsi 3410; SSE2-NEXT: movq %r15, %rax 3411; SSE2-NEXT: mulq %rbx 3412; SSE2-NEXT: movq %rdx, %rcx 3413; SSE2-NEXT: movq %rax, %r9 3414; SSE2-NEXT: movq %r11, %rax 3415; SSE2-NEXT: mulq %rbx 3416; SSE2-NEXT: movq %rdx, %rbx 3417; SSE2-NEXT: movq %rax, %rbp 3418; SSE2-NEXT: addq %rcx, %rbp 3419; SSE2-NEXT: adcq $0, %rbx 3420; SSE2-NEXT: movq %r15, %rax 3421; SSE2-NEXT: mulq %r8 3422; SSE2-NEXT: movq %rdx, %rcx 3423; SSE2-NEXT: movq %rax, %rdi 3424; SSE2-NEXT: addq %rbp, %rdi 3425; SSE2-NEXT: adcq %rbx, %rcx 3426; SSE2-NEXT: setb %al 3427; SSE2-NEXT: movzbl %al, %ebp 3428; SSE2-NEXT: movq %r11, %rax 3429; SSE2-NEXT: mulq %r8 3430; SSE2-NEXT: addq %rcx, %rax 3431; SSE2-NEXT: adcq %rbp, %rdx 3432; SSE2-NEXT: addq %r14, %rax 3433; SSE2-NEXT: adcq %rsi, %rdx 3434; SSE2-NEXT: movq %rdi, 24(%r13) 3435; SSE2-NEXT: sarq $63, %rdi 3436; SSE2-NEXT: xorq %rdi, %rdx 3437; SSE2-NEXT: xorq %rax, %rdi 3438; SSE2-NEXT: xorl %eax, %eax 3439; SSE2-NEXT: orq %rdx, %rdi 3440; SSE2-NEXT: setne %al 3441; SSE2-NEXT: negl %eax 3442; SSE2-NEXT: movd %eax, %xmm1 3443; SSE2-NEXT: negl %r12d 3444; SSE2-NEXT: movd %r12d, %xmm0 3445; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 3446; SSE2-NEXT: movq %r9, 16(%r13) 3447; SSE2-NEXT: movq %r10, (%r13) 3448; SSE2-NEXT: popq %rbx 3449; SSE2-NEXT: popq %r12 3450; SSE2-NEXT: popq %r13 3451; SSE2-NEXT: popq %r14 3452; SSE2-NEXT: popq %r15 3453; SSE2-NEXT: popq %rbp 3454; SSE2-NEXT: retq 3455; 3456; SSSE3-LABEL: smulo_v2i128: 3457; SSSE3: # %bb.0: 3458; SSSE3-NEXT: pushq %rbp 3459; SSSE3-NEXT: pushq %r15 3460; SSSE3-NEXT: pushq %r14 3461; SSSE3-NEXT: pushq %r13 3462; SSSE3-NEXT: pushq %r12 3463; SSSE3-NEXT: pushq %rbx 3464; SSSE3-NEXT: movq %r8, %r14 3465; SSSE3-NEXT: movq %rcx, %r11 3466; SSSE3-NEXT: movq %rdx, %r15 3467; SSSE3-NEXT: movq %rsi, %r13 3468; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r8 3469; SSSE3-NEXT: movq %rsi, %rcx 3470; SSSE3-NEXT: sarq $63, %rcx 3471; SSSE3-NEXT: movq %r14, %rsi 3472; SSSE3-NEXT: imulq %rcx, %rsi 3473; SSSE3-NEXT: movq %r14, %rax 3474; SSSE3-NEXT: mulq %rcx 3475; SSSE3-NEXT: movq %rax, %r10 3476; SSSE3-NEXT: addq %rsi, %rdx 3477; SSSE3-NEXT: imulq %r9, %rcx 3478; SSSE3-NEXT: addq %rdx, %rcx 3479; SSSE3-NEXT: movq %r9, %rbx 3480; SSSE3-NEXT: sarq $63, %rbx 3481; SSSE3-NEXT: movq %rbx, %rsi 3482; SSSE3-NEXT: imulq %r13, %rsi 3483; SSSE3-NEXT: movq %rbx, %rax 3484; SSSE3-NEXT: mulq %rdi 3485; SSSE3-NEXT: movq %rax, %r12 3486; SSSE3-NEXT: addq %rsi, %rdx 3487; SSSE3-NEXT: imulq %rdi, %rbx 3488; SSSE3-NEXT: addq %rdx, %rbx 3489; SSSE3-NEXT: addq %r10, %r12 3490; SSSE3-NEXT: adcq %rcx, %rbx 3491; SSSE3-NEXT: movq %rdi, %rax 3492; SSSE3-NEXT: mulq %r14 3493; SSSE3-NEXT: movq %rdx, %rbp 3494; SSSE3-NEXT: movq %rax, %r10 3495; SSSE3-NEXT: movq %r13, %rax 3496; SSSE3-NEXT: mulq %r14 3497; SSSE3-NEXT: movq %rdx, %rsi 3498; SSSE3-NEXT: movq %rax, %rcx 3499; SSSE3-NEXT: addq %rbp, %rcx 3500; SSSE3-NEXT: adcq $0, %rsi 3501; SSSE3-NEXT: movq %rdi, %rax 3502; SSSE3-NEXT: mulq %r9 3503; SSSE3-NEXT: movq %rdx, %rbp 3504; SSSE3-NEXT: movq %rax, %rdi 3505; SSSE3-NEXT: addq %rcx, %rdi 3506; SSSE3-NEXT: adcq %rsi, %rbp 3507; SSSE3-NEXT: setb %al 3508; SSSE3-NEXT: movzbl %al, %ecx 3509; SSSE3-NEXT: movq %r13, %rax 3510; SSSE3-NEXT: mulq %r9 3511; SSSE3-NEXT: addq %rbp, %rax 3512; SSSE3-NEXT: adcq %rcx, %rdx 3513; SSSE3-NEXT: addq %r12, %rax 3514; SSSE3-NEXT: adcq %rbx, %rdx 3515; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r13 3516; SSSE3-NEXT: movq %rdi, 8(%r13) 3517; SSSE3-NEXT: sarq $63, %rdi 3518; SSSE3-NEXT: xorq %rdi, %rdx 3519; SSSE3-NEXT: xorq %rax, %rdi 3520; SSSE3-NEXT: xorl %r12d, %r12d 3521; SSSE3-NEXT: orq %rdx, %rdi 3522; SSSE3-NEXT: setne %r12b 3523; SSSE3-NEXT: movq %r11, %rdi 3524; SSSE3-NEXT: sarq $63, %rdi 3525; SSSE3-NEXT: movq %r8, %rax 3526; SSSE3-NEXT: movq %r8, %rsi 3527; SSSE3-NEXT: imulq %rdi, %rsi 3528; SSSE3-NEXT: movq %r8, %rbx 3529; SSSE3-NEXT: mulq %rdi 3530; SSSE3-NEXT: movq %rax, %rcx 3531; SSSE3-NEXT: addq %rsi, %rdx 3532; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r8 3533; SSSE3-NEXT: imulq %r8, %rdi 3534; SSSE3-NEXT: addq %rdx, %rdi 3535; SSSE3-NEXT: movq %r8, %rsi 3536; SSSE3-NEXT: sarq $63, %rsi 3537; SSSE3-NEXT: movq %rsi, %rbp 3538; SSSE3-NEXT: imulq %r11, %rbp 3539; SSSE3-NEXT: movq %rsi, %rax 3540; SSSE3-NEXT: mulq %r15 3541; SSSE3-NEXT: movq %rax, %r14 3542; SSSE3-NEXT: addq %rbp, %rdx 3543; SSSE3-NEXT: imulq %r15, %rsi 3544; SSSE3-NEXT: addq %rdx, %rsi 3545; SSSE3-NEXT: addq %rcx, %r14 3546; SSSE3-NEXT: adcq %rdi, %rsi 3547; SSSE3-NEXT: movq %r15, %rax 3548; SSSE3-NEXT: mulq %rbx 3549; SSSE3-NEXT: movq %rdx, %rcx 3550; SSSE3-NEXT: movq %rax, %r9 3551; SSSE3-NEXT: movq %r11, %rax 3552; SSSE3-NEXT: mulq %rbx 3553; SSSE3-NEXT: movq %rdx, %rbx 3554; SSSE3-NEXT: movq %rax, %rbp 3555; SSSE3-NEXT: addq %rcx, %rbp 3556; SSSE3-NEXT: adcq $0, %rbx 3557; SSSE3-NEXT: movq %r15, %rax 3558; SSSE3-NEXT: mulq %r8 3559; SSSE3-NEXT: movq %rdx, %rcx 3560; SSSE3-NEXT: movq %rax, %rdi 3561; SSSE3-NEXT: addq %rbp, %rdi 3562; SSSE3-NEXT: adcq %rbx, %rcx 3563; SSSE3-NEXT: setb %al 3564; SSSE3-NEXT: movzbl %al, %ebp 3565; SSSE3-NEXT: movq %r11, %rax 3566; SSSE3-NEXT: mulq %r8 3567; SSSE3-NEXT: addq %rcx, %rax 3568; SSSE3-NEXT: adcq %rbp, %rdx 3569; SSSE3-NEXT: addq %r14, %rax 3570; SSSE3-NEXT: adcq %rsi, %rdx 3571; SSSE3-NEXT: movq %rdi, 24(%r13) 3572; SSSE3-NEXT: sarq $63, %rdi 3573; SSSE3-NEXT: xorq %rdi, %rdx 3574; SSSE3-NEXT: xorq %rax, %rdi 3575; SSSE3-NEXT: xorl %eax, %eax 3576; SSSE3-NEXT: orq %rdx, %rdi 3577; SSSE3-NEXT: setne %al 3578; SSSE3-NEXT: negl %eax 3579; SSSE3-NEXT: movd %eax, %xmm1 3580; SSSE3-NEXT: negl %r12d 3581; SSSE3-NEXT: movd %r12d, %xmm0 3582; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 3583; SSSE3-NEXT: movq %r9, 16(%r13) 3584; SSSE3-NEXT: movq %r10, (%r13) 3585; SSSE3-NEXT: popq %rbx 3586; SSSE3-NEXT: popq %r12 3587; SSSE3-NEXT: popq %r13 3588; SSSE3-NEXT: popq %r14 3589; SSSE3-NEXT: popq %r15 3590; SSSE3-NEXT: popq %rbp 3591; SSSE3-NEXT: retq 3592; 3593; SSE41-LABEL: smulo_v2i128: 3594; SSE41: # %bb.0: 3595; SSE41-NEXT: pushq %rbp 3596; SSE41-NEXT: pushq %r15 3597; SSE41-NEXT: pushq %r14 3598; SSE41-NEXT: pushq %r13 3599; SSE41-NEXT: pushq %r12 3600; SSE41-NEXT: pushq %rbx 3601; SSE41-NEXT: movq %r8, %r14 3602; SSE41-NEXT: movq %rcx, %r11 3603; SSE41-NEXT: movq %rdx, %r15 3604; SSE41-NEXT: movq %rsi, %r13 3605; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r8 3606; SSE41-NEXT: movq %rsi, %rcx 3607; SSE41-NEXT: sarq $63, %rcx 3608; SSE41-NEXT: movq %r14, %rsi 3609; SSE41-NEXT: imulq %rcx, %rsi 3610; SSE41-NEXT: movq %r14, %rax 3611; SSE41-NEXT: mulq %rcx 3612; SSE41-NEXT: movq %rax, %r10 3613; SSE41-NEXT: addq %rsi, %rdx 3614; SSE41-NEXT: imulq %r9, %rcx 3615; SSE41-NEXT: addq %rdx, %rcx 3616; SSE41-NEXT: movq %r9, %rbx 3617; SSE41-NEXT: sarq $63, %rbx 3618; SSE41-NEXT: movq %rbx, %rsi 3619; SSE41-NEXT: imulq %r13, %rsi 3620; SSE41-NEXT: movq %rbx, %rax 3621; SSE41-NEXT: mulq %rdi 3622; SSE41-NEXT: movq %rax, %r12 3623; SSE41-NEXT: addq %rsi, %rdx 3624; SSE41-NEXT: imulq %rdi, %rbx 3625; SSE41-NEXT: addq %rdx, %rbx 3626; SSE41-NEXT: addq %r10, %r12 3627; SSE41-NEXT: adcq %rcx, %rbx 3628; SSE41-NEXT: movq %rdi, %rax 3629; SSE41-NEXT: mulq %r14 3630; SSE41-NEXT: movq %rdx, %rbp 3631; SSE41-NEXT: movq %rax, %r10 3632; SSE41-NEXT: movq %r13, %rax 3633; SSE41-NEXT: mulq %r14 3634; SSE41-NEXT: movq %rdx, %rsi 3635; SSE41-NEXT: movq %rax, %rcx 3636; SSE41-NEXT: addq %rbp, %rcx 3637; SSE41-NEXT: adcq $0, %rsi 3638; SSE41-NEXT: movq %rdi, %rax 3639; SSE41-NEXT: mulq %r9 3640; SSE41-NEXT: movq %rdx, %rbp 3641; SSE41-NEXT: movq %rax, %rdi 3642; SSE41-NEXT: addq %rcx, %rdi 3643; SSE41-NEXT: adcq %rsi, %rbp 3644; SSE41-NEXT: setb %al 3645; SSE41-NEXT: movzbl %al, %ecx 3646; SSE41-NEXT: movq %r13, %rax 3647; SSE41-NEXT: mulq %r9 3648; SSE41-NEXT: addq %rbp, %rax 3649; SSE41-NEXT: adcq %rcx, %rdx 3650; SSE41-NEXT: addq %r12, %rax 3651; SSE41-NEXT: adcq %rbx, %rdx 3652; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r13 3653; SSE41-NEXT: movq %rdi, 8(%r13) 3654; SSE41-NEXT: sarq $63, %rdi 3655; SSE41-NEXT: xorq %rdi, %rdx 3656; SSE41-NEXT: xorq %rax, %rdi 3657; SSE41-NEXT: xorl %r12d, %r12d 3658; SSE41-NEXT: orq %rdx, %rdi 3659; SSE41-NEXT: setne %r12b 3660; SSE41-NEXT: movq %r11, %rdi 3661; SSE41-NEXT: sarq $63, %rdi 3662; SSE41-NEXT: movq %r8, %rax 3663; SSE41-NEXT: movq %r8, %rsi 3664; SSE41-NEXT: imulq %rdi, %rsi 3665; SSE41-NEXT: movq %r8, %rbx 3666; SSE41-NEXT: mulq %rdi 3667; SSE41-NEXT: movq %rax, %rcx 3668; SSE41-NEXT: addq %rsi, %rdx 3669; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r8 3670; SSE41-NEXT: imulq %r8, %rdi 3671; SSE41-NEXT: addq %rdx, %rdi 3672; SSE41-NEXT: movq %r8, %rsi 3673; SSE41-NEXT: sarq $63, %rsi 3674; SSE41-NEXT: movq %rsi, %rbp 3675; SSE41-NEXT: imulq %r11, %rbp 3676; SSE41-NEXT: movq %rsi, %rax 3677; SSE41-NEXT: mulq %r15 3678; SSE41-NEXT: movq %rax, %r14 3679; SSE41-NEXT: addq %rbp, %rdx 3680; SSE41-NEXT: imulq %r15, %rsi 3681; SSE41-NEXT: addq %rdx, %rsi 3682; SSE41-NEXT: addq %rcx, %r14 3683; SSE41-NEXT: adcq %rdi, %rsi 3684; SSE41-NEXT: movq %r15, %rax 3685; SSE41-NEXT: mulq %rbx 3686; SSE41-NEXT: movq %rdx, %rcx 3687; SSE41-NEXT: movq %rax, %r9 3688; SSE41-NEXT: movq %r11, %rax 3689; SSE41-NEXT: mulq %rbx 3690; SSE41-NEXT: movq %rdx, %rbx 3691; SSE41-NEXT: movq %rax, %rbp 3692; SSE41-NEXT: addq %rcx, %rbp 3693; SSE41-NEXT: adcq $0, %rbx 3694; SSE41-NEXT: movq %r15, %rax 3695; SSE41-NEXT: mulq %r8 3696; SSE41-NEXT: movq %rdx, %rcx 3697; SSE41-NEXT: movq %rax, %rdi 3698; SSE41-NEXT: addq %rbp, %rdi 3699; SSE41-NEXT: adcq %rbx, %rcx 3700; SSE41-NEXT: setb %al 3701; SSE41-NEXT: movzbl %al, %ebp 3702; SSE41-NEXT: movq %r11, %rax 3703; SSE41-NEXT: mulq %r8 3704; SSE41-NEXT: addq %rcx, %rax 3705; SSE41-NEXT: adcq %rbp, %rdx 3706; SSE41-NEXT: addq %r14, %rax 3707; SSE41-NEXT: adcq %rsi, %rdx 3708; SSE41-NEXT: movq %rdi, 24(%r13) 3709; SSE41-NEXT: sarq $63, %rdi 3710; SSE41-NEXT: xorq %rdi, %rdx 3711; SSE41-NEXT: xorq %rax, %rdi 3712; SSE41-NEXT: xorl %eax, %eax 3713; SSE41-NEXT: orq %rdx, %rdi 3714; SSE41-NEXT: setne %al 3715; SSE41-NEXT: negl %eax 3716; SSE41-NEXT: negl %r12d 3717; SSE41-NEXT: movd %r12d, %xmm0 3718; SSE41-NEXT: pinsrd $1, %eax, %xmm0 3719; SSE41-NEXT: movq %r9, 16(%r13) 3720; SSE41-NEXT: movq %r10, (%r13) 3721; SSE41-NEXT: popq %rbx 3722; SSE41-NEXT: popq %r12 3723; SSE41-NEXT: popq %r13 3724; SSE41-NEXT: popq %r14 3725; SSE41-NEXT: popq %r15 3726; SSE41-NEXT: popq %rbp 3727; SSE41-NEXT: retq 3728; 3729; AVX-LABEL: smulo_v2i128: 3730; AVX: # %bb.0: 3731; AVX-NEXT: pushq %rbp 3732; AVX-NEXT: pushq %r15 3733; AVX-NEXT: pushq %r14 3734; AVX-NEXT: pushq %r13 3735; AVX-NEXT: pushq %r12 3736; AVX-NEXT: pushq %rbx 3737; AVX-NEXT: movq %r8, %r14 3738; AVX-NEXT: movq %rcx, %r11 3739; AVX-NEXT: movq %rdx, %r15 3740; AVX-NEXT: movq %rsi, %r13 3741; AVX-NEXT: movq {{[0-9]+}}(%rsp), %r8 3742; AVX-NEXT: movq %rsi, %rcx 3743; AVX-NEXT: sarq $63, %rcx 3744; AVX-NEXT: movq %r14, %rsi 3745; AVX-NEXT: imulq %rcx, %rsi 3746; AVX-NEXT: movq %r14, %rax 3747; AVX-NEXT: mulq %rcx 3748; AVX-NEXT: movq %rax, %r10 3749; AVX-NEXT: addq %rsi, %rdx 3750; AVX-NEXT: imulq %r9, %rcx 3751; AVX-NEXT: addq %rdx, %rcx 3752; AVX-NEXT: movq %r9, %rbx 3753; AVX-NEXT: sarq $63, %rbx 3754; AVX-NEXT: movq %rbx, %rsi 3755; AVX-NEXT: imulq %r13, %rsi 3756; AVX-NEXT: movq %rbx, %rax 3757; AVX-NEXT: mulq %rdi 3758; AVX-NEXT: movq %rax, %r12 3759; AVX-NEXT: addq %rsi, %rdx 3760; AVX-NEXT: imulq %rdi, %rbx 3761; AVX-NEXT: addq %rdx, %rbx 3762; AVX-NEXT: addq %r10, %r12 3763; AVX-NEXT: adcq %rcx, %rbx 3764; AVX-NEXT: movq %rdi, %rax 3765; AVX-NEXT: mulq %r14 3766; AVX-NEXT: movq %rdx, %rbp 3767; AVX-NEXT: movq %rax, %r10 3768; AVX-NEXT: movq %r13, %rax 3769; AVX-NEXT: mulq %r14 3770; AVX-NEXT: movq %rdx, %rsi 3771; AVX-NEXT: movq %rax, %rcx 3772; AVX-NEXT: addq %rbp, %rcx 3773; AVX-NEXT: adcq $0, %rsi 3774; AVX-NEXT: movq %rdi, %rax 3775; AVX-NEXT: mulq %r9 3776; AVX-NEXT: movq %rdx, %rbp 3777; AVX-NEXT: movq %rax, %rdi 3778; AVX-NEXT: addq %rcx, %rdi 3779; AVX-NEXT: adcq %rsi, %rbp 3780; AVX-NEXT: setb %al 3781; AVX-NEXT: movzbl %al, %ecx 3782; AVX-NEXT: movq %r13, %rax 3783; AVX-NEXT: mulq %r9 3784; AVX-NEXT: addq %rbp, %rax 3785; AVX-NEXT: adcq %rcx, %rdx 3786; AVX-NEXT: addq %r12, %rax 3787; AVX-NEXT: adcq %rbx, %rdx 3788; AVX-NEXT: movq {{[0-9]+}}(%rsp), %r13 3789; AVX-NEXT: movq %rdi, 8(%r13) 3790; AVX-NEXT: sarq $63, %rdi 3791; AVX-NEXT: xorq %rdi, %rdx 3792; AVX-NEXT: xorq %rax, %rdi 3793; AVX-NEXT: xorl %r12d, %r12d 3794; AVX-NEXT: orq %rdx, %rdi 3795; AVX-NEXT: setne %r12b 3796; AVX-NEXT: movq %r11, %rdi 3797; AVX-NEXT: sarq $63, %rdi 3798; AVX-NEXT: movq %r8, %rax 3799; AVX-NEXT: movq %r8, %rsi 3800; AVX-NEXT: imulq %rdi, %rsi 3801; AVX-NEXT: movq %r8, %rbx 3802; AVX-NEXT: mulq %rdi 3803; AVX-NEXT: movq %rax, %rcx 3804; AVX-NEXT: addq %rsi, %rdx 3805; AVX-NEXT: movq {{[0-9]+}}(%rsp), %r8 3806; AVX-NEXT: imulq %r8, %rdi 3807; AVX-NEXT: addq %rdx, %rdi 3808; AVX-NEXT: movq %r8, %rsi 3809; AVX-NEXT: sarq $63, %rsi 3810; AVX-NEXT: movq %rsi, %rbp 3811; AVX-NEXT: imulq %r11, %rbp 3812; AVX-NEXT: movq %rsi, %rax 3813; AVX-NEXT: mulq %r15 3814; AVX-NEXT: movq %rax, %r14 3815; AVX-NEXT: addq %rbp, %rdx 3816; AVX-NEXT: imulq %r15, %rsi 3817; AVX-NEXT: addq %rdx, %rsi 3818; AVX-NEXT: addq %rcx, %r14 3819; AVX-NEXT: adcq %rdi, %rsi 3820; AVX-NEXT: movq %r15, %rax 3821; AVX-NEXT: mulq %rbx 3822; AVX-NEXT: movq %rdx, %rcx 3823; AVX-NEXT: movq %rax, %r9 3824; AVX-NEXT: movq %r11, %rax 3825; AVX-NEXT: mulq %rbx 3826; AVX-NEXT: movq %rdx, %rbx 3827; AVX-NEXT: movq %rax, %rbp 3828; AVX-NEXT: addq %rcx, %rbp 3829; AVX-NEXT: adcq $0, %rbx 3830; AVX-NEXT: movq %r15, %rax 3831; AVX-NEXT: mulq %r8 3832; AVX-NEXT: movq %rdx, %rcx 3833; AVX-NEXT: movq %rax, %rdi 3834; AVX-NEXT: addq %rbp, %rdi 3835; AVX-NEXT: adcq %rbx, %rcx 3836; AVX-NEXT: setb %al 3837; AVX-NEXT: movzbl %al, %ebp 3838; AVX-NEXT: movq %r11, %rax 3839; AVX-NEXT: mulq %r8 3840; AVX-NEXT: addq %rcx, %rax 3841; AVX-NEXT: adcq %rbp, %rdx 3842; AVX-NEXT: addq %r14, %rax 3843; AVX-NEXT: adcq %rsi, %rdx 3844; AVX-NEXT: movq %rdi, 24(%r13) 3845; AVX-NEXT: sarq $63, %rdi 3846; AVX-NEXT: xorq %rdi, %rdx 3847; AVX-NEXT: xorq %rax, %rdi 3848; AVX-NEXT: xorl %eax, %eax 3849; AVX-NEXT: orq %rdx, %rdi 3850; AVX-NEXT: setne %al 3851; AVX-NEXT: negl %eax 3852; AVX-NEXT: negl %r12d 3853; AVX-NEXT: vmovd %r12d, %xmm0 3854; AVX-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0 3855; AVX-NEXT: movq %r9, 16(%r13) 3856; AVX-NEXT: movq %r10, (%r13) 3857; AVX-NEXT: popq %rbx 3858; AVX-NEXT: popq %r12 3859; AVX-NEXT: popq %r13 3860; AVX-NEXT: popq %r14 3861; AVX-NEXT: popq %r15 3862; AVX-NEXT: popq %rbp 3863; AVX-NEXT: retq 3864; 3865; AVX512F-LABEL: smulo_v2i128: 3866; AVX512F: # %bb.0: 3867; AVX512F-NEXT: pushq %rbp 3868; AVX512F-NEXT: pushq %r15 3869; AVX512F-NEXT: pushq %r14 3870; AVX512F-NEXT: pushq %r13 3871; AVX512F-NEXT: pushq %r12 3872; AVX512F-NEXT: pushq %rbx 3873; AVX512F-NEXT: movq %r9, %r10 3874; AVX512F-NEXT: movq %r8, %r9 3875; AVX512F-NEXT: movq %rcx, %r14 3876; AVX512F-NEXT: movq %rdx, %rcx 3877; AVX512F-NEXT: movq %rsi, %r11 3878; AVX512F-NEXT: movq %rdi, %r15 3879; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r12 3880; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r8 3881; AVX512F-NEXT: movq %r14, %rdi 3882; AVX512F-NEXT: sarq $63, %rdi 3883; AVX512F-NEXT: movq %r12, %rbx 3884; AVX512F-NEXT: imulq %rdi, %rbx 3885; AVX512F-NEXT: movq %r12, %rax 3886; AVX512F-NEXT: mulq %rdi 3887; AVX512F-NEXT: movq %rax, %rsi 3888; AVX512F-NEXT: addq %rbx, %rdx 3889; AVX512F-NEXT: imulq %r8, %rdi 3890; AVX512F-NEXT: addq %rdx, %rdi 3891; AVX512F-NEXT: movq %r8, %rbx 3892; AVX512F-NEXT: sarq $63, %rbx 3893; AVX512F-NEXT: movq %rbx, %rbp 3894; AVX512F-NEXT: imulq %r14, %rbp 3895; AVX512F-NEXT: movq %rbx, %rax 3896; AVX512F-NEXT: mulq %rcx 3897; AVX512F-NEXT: movq %rax, %r13 3898; AVX512F-NEXT: addq %rbp, %rdx 3899; AVX512F-NEXT: imulq %rcx, %rbx 3900; AVX512F-NEXT: addq %rdx, %rbx 3901; AVX512F-NEXT: addq %rsi, %r13 3902; AVX512F-NEXT: adcq %rdi, %rbx 3903; AVX512F-NEXT: movq %rcx, %rax 3904; AVX512F-NEXT: mulq %r12 3905; AVX512F-NEXT: movq %rdx, %rbp 3906; AVX512F-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill 3907; AVX512F-NEXT: movq %r14, %rax 3908; AVX512F-NEXT: mulq %r12 3909; AVX512F-NEXT: movq %rdx, %rdi 3910; AVX512F-NEXT: movq %rax, %rsi 3911; AVX512F-NEXT: addq %rbp, %rsi 3912; AVX512F-NEXT: adcq $0, %rdi 3913; AVX512F-NEXT: movq %rcx, %rax 3914; AVX512F-NEXT: mulq %r8 3915; AVX512F-NEXT: movq %rdx, %rbp 3916; AVX512F-NEXT: movq %rax, %rcx 3917; AVX512F-NEXT: addq %rsi, %rcx 3918; AVX512F-NEXT: adcq %rdi, %rbp 3919; AVX512F-NEXT: setb %al 3920; AVX512F-NEXT: movzbl %al, %esi 3921; AVX512F-NEXT: movq %r14, %rax 3922; AVX512F-NEXT: mulq %r8 3923; AVX512F-NEXT: addq %rbp, %rax 3924; AVX512F-NEXT: adcq %rsi, %rdx 3925; AVX512F-NEXT: addq %r13, %rax 3926; AVX512F-NEXT: adcq %rbx, %rdx 3927; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r8 3928; AVX512F-NEXT: movq %rcx, 24(%r8) 3929; AVX512F-NEXT: sarq $63, %rcx 3930; AVX512F-NEXT: xorq %rcx, %rdx 3931; AVX512F-NEXT: xorq %rax, %rcx 3932; AVX512F-NEXT: orq %rdx, %rcx 3933; AVX512F-NEXT: setne %al 3934; AVX512F-NEXT: kmovw %eax, %k0 3935; AVX512F-NEXT: movq %r11, %rdi 3936; AVX512F-NEXT: sarq $63, %rdi 3937; AVX512F-NEXT: movq %r9, %rsi 3938; AVX512F-NEXT: imulq %rdi, %rsi 3939; AVX512F-NEXT: movq %r9, %rax 3940; AVX512F-NEXT: mulq %rdi 3941; AVX512F-NEXT: movq %rax, %rcx 3942; AVX512F-NEXT: addq %rsi, %rdx 3943; AVX512F-NEXT: imulq %r10, %rdi 3944; AVX512F-NEXT: addq %rdx, %rdi 3945; AVX512F-NEXT: movq %r10, %rsi 3946; AVX512F-NEXT: sarq $63, %rsi 3947; AVX512F-NEXT: movq %rsi, %rbp 3948; AVX512F-NEXT: imulq %r11, %rbp 3949; AVX512F-NEXT: movq %rsi, %rax 3950; AVX512F-NEXT: mulq %r15 3951; AVX512F-NEXT: movq %rax, %r12 3952; AVX512F-NEXT: addq %rbp, %rdx 3953; AVX512F-NEXT: imulq %r15, %rsi 3954; AVX512F-NEXT: addq %rdx, %rsi 3955; AVX512F-NEXT: addq %rcx, %r12 3956; AVX512F-NEXT: adcq %rdi, %rsi 3957; AVX512F-NEXT: movq %r15, %rax 3958; AVX512F-NEXT: mulq %r9 3959; AVX512F-NEXT: movq %rdx, %rcx 3960; AVX512F-NEXT: movq %rax, %r14 3961; AVX512F-NEXT: movq %r11, %rax 3962; AVX512F-NEXT: mulq %r9 3963; AVX512F-NEXT: movq %rdx, %rbp 3964; AVX512F-NEXT: movq %rax, %rbx 3965; AVX512F-NEXT: addq %rcx, %rbx 3966; AVX512F-NEXT: adcq $0, %rbp 3967; AVX512F-NEXT: movq %r15, %rax 3968; AVX512F-NEXT: mulq %r10 3969; AVX512F-NEXT: movq %rdx, %rcx 3970; AVX512F-NEXT: movq %rax, %rdi 3971; AVX512F-NEXT: addq %rbx, %rdi 3972; AVX512F-NEXT: adcq %rbp, %rcx 3973; AVX512F-NEXT: setb %al 3974; AVX512F-NEXT: movzbl %al, %ebp 3975; AVX512F-NEXT: movq %r11, %rax 3976; AVX512F-NEXT: mulq %r10 3977; AVX512F-NEXT: addq %rcx, %rax 3978; AVX512F-NEXT: adcq %rbp, %rdx 3979; AVX512F-NEXT: addq %r12, %rax 3980; AVX512F-NEXT: adcq %rsi, %rdx 3981; AVX512F-NEXT: movq %rdi, 8(%r8) 3982; AVX512F-NEXT: sarq $63, %rdi 3983; AVX512F-NEXT: xorq %rdi, %rdx 3984; AVX512F-NEXT: xorq %rax, %rdi 3985; AVX512F-NEXT: orq %rdx, %rdi 3986; AVX512F-NEXT: setne %al 3987; AVX512F-NEXT: andl $1, %eax 3988; AVX512F-NEXT: kmovw %eax, %k1 3989; AVX512F-NEXT: kshiftlw $1, %k0, %k0 3990; AVX512F-NEXT: korw %k0, %k1, %k1 3991; AVX512F-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 3992; AVX512F-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 3993; AVX512F-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload 3994; AVX512F-NEXT: movq %rax, 16(%r8) 3995; AVX512F-NEXT: movq %r14, (%r8) 3996; AVX512F-NEXT: popq %rbx 3997; AVX512F-NEXT: popq %r12 3998; AVX512F-NEXT: popq %r13 3999; AVX512F-NEXT: popq %r14 4000; AVX512F-NEXT: popq %r15 4001; AVX512F-NEXT: popq %rbp 4002; AVX512F-NEXT: retq 4003; 4004; AVX512BW-LABEL: smulo_v2i128: 4005; AVX512BW: # %bb.0: 4006; AVX512BW-NEXT: pushq %rbp 4007; AVX512BW-NEXT: pushq %r15 4008; AVX512BW-NEXT: pushq %r14 4009; AVX512BW-NEXT: pushq %r13 4010; AVX512BW-NEXT: pushq %r12 4011; AVX512BW-NEXT: pushq %rbx 4012; AVX512BW-NEXT: movq %r9, %r10 4013; AVX512BW-NEXT: movq %r8, %r9 4014; AVX512BW-NEXT: movq %rcx, %r14 4015; AVX512BW-NEXT: movq %rdx, %rcx 4016; AVX512BW-NEXT: movq %rsi, %r11 4017; AVX512BW-NEXT: movq %rdi, %r15 4018; AVX512BW-NEXT: movq {{[0-9]+}}(%rsp), %r12 4019; AVX512BW-NEXT: movq {{[0-9]+}}(%rsp), %r8 4020; AVX512BW-NEXT: movq %r14, %rdi 4021; AVX512BW-NEXT: sarq $63, %rdi 4022; AVX512BW-NEXT: movq %r12, %rbx 4023; AVX512BW-NEXT: imulq %rdi, %rbx 4024; AVX512BW-NEXT: movq %r12, %rax 4025; AVX512BW-NEXT: mulq %rdi 4026; AVX512BW-NEXT: movq %rax, %rsi 4027; AVX512BW-NEXT: addq %rbx, %rdx 4028; AVX512BW-NEXT: imulq %r8, %rdi 4029; AVX512BW-NEXT: addq %rdx, %rdi 4030; AVX512BW-NEXT: movq %r8, %rbx 4031; AVX512BW-NEXT: sarq $63, %rbx 4032; AVX512BW-NEXT: movq %rbx, %rbp 4033; AVX512BW-NEXT: imulq %r14, %rbp 4034; AVX512BW-NEXT: movq %rbx, %rax 4035; AVX512BW-NEXT: mulq %rcx 4036; AVX512BW-NEXT: movq %rax, %r13 4037; AVX512BW-NEXT: addq %rbp, %rdx 4038; AVX512BW-NEXT: imulq %rcx, %rbx 4039; AVX512BW-NEXT: addq %rdx, %rbx 4040; AVX512BW-NEXT: addq %rsi, %r13 4041; AVX512BW-NEXT: adcq %rdi, %rbx 4042; AVX512BW-NEXT: movq %rcx, %rax 4043; AVX512BW-NEXT: mulq %r12 4044; AVX512BW-NEXT: movq %rdx, %rbp 4045; AVX512BW-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill 4046; AVX512BW-NEXT: movq %r14, %rax 4047; AVX512BW-NEXT: mulq %r12 4048; AVX512BW-NEXT: movq %rdx, %rdi 4049; AVX512BW-NEXT: movq %rax, %rsi 4050; AVX512BW-NEXT: addq %rbp, %rsi 4051; AVX512BW-NEXT: adcq $0, %rdi 4052; AVX512BW-NEXT: movq %rcx, %rax 4053; AVX512BW-NEXT: mulq %r8 4054; AVX512BW-NEXT: movq %rdx, %rbp 4055; AVX512BW-NEXT: movq %rax, %rcx 4056; AVX512BW-NEXT: addq %rsi, %rcx 4057; AVX512BW-NEXT: adcq %rdi, %rbp 4058; AVX512BW-NEXT: setb %al 4059; AVX512BW-NEXT: movzbl %al, %esi 4060; AVX512BW-NEXT: movq %r14, %rax 4061; AVX512BW-NEXT: mulq %r8 4062; AVX512BW-NEXT: addq %rbp, %rax 4063; AVX512BW-NEXT: adcq %rsi, %rdx 4064; AVX512BW-NEXT: addq %r13, %rax 4065; AVX512BW-NEXT: adcq %rbx, %rdx 4066; AVX512BW-NEXT: movq {{[0-9]+}}(%rsp), %r8 4067; AVX512BW-NEXT: movq %rcx, 24(%r8) 4068; AVX512BW-NEXT: sarq $63, %rcx 4069; AVX512BW-NEXT: xorq %rcx, %rdx 4070; AVX512BW-NEXT: xorq %rax, %rcx 4071; AVX512BW-NEXT: orq %rdx, %rcx 4072; AVX512BW-NEXT: setne %al 4073; AVX512BW-NEXT: kmovd %eax, %k0 4074; AVX512BW-NEXT: movq %r11, %rdi 4075; AVX512BW-NEXT: sarq $63, %rdi 4076; AVX512BW-NEXT: movq %r9, %rsi 4077; AVX512BW-NEXT: imulq %rdi, %rsi 4078; AVX512BW-NEXT: movq %r9, %rax 4079; AVX512BW-NEXT: mulq %rdi 4080; AVX512BW-NEXT: movq %rax, %rcx 4081; AVX512BW-NEXT: addq %rsi, %rdx 4082; AVX512BW-NEXT: imulq %r10, %rdi 4083; AVX512BW-NEXT: addq %rdx, %rdi 4084; AVX512BW-NEXT: movq %r10, %rsi 4085; AVX512BW-NEXT: sarq $63, %rsi 4086; AVX512BW-NEXT: movq %rsi, %rbp 4087; AVX512BW-NEXT: imulq %r11, %rbp 4088; AVX512BW-NEXT: movq %rsi, %rax 4089; AVX512BW-NEXT: mulq %r15 4090; AVX512BW-NEXT: movq %rax, %r12 4091; AVX512BW-NEXT: addq %rbp, %rdx 4092; AVX512BW-NEXT: imulq %r15, %rsi 4093; AVX512BW-NEXT: addq %rdx, %rsi 4094; AVX512BW-NEXT: addq %rcx, %r12 4095; AVX512BW-NEXT: adcq %rdi, %rsi 4096; AVX512BW-NEXT: movq %r15, %rax 4097; AVX512BW-NEXT: mulq %r9 4098; AVX512BW-NEXT: movq %rdx, %rcx 4099; AVX512BW-NEXT: movq %rax, %r14 4100; AVX512BW-NEXT: movq %r11, %rax 4101; AVX512BW-NEXT: mulq %r9 4102; AVX512BW-NEXT: movq %rdx, %rbp 4103; AVX512BW-NEXT: movq %rax, %rbx 4104; AVX512BW-NEXT: addq %rcx, %rbx 4105; AVX512BW-NEXT: adcq $0, %rbp 4106; AVX512BW-NEXT: movq %r15, %rax 4107; AVX512BW-NEXT: mulq %r10 4108; AVX512BW-NEXT: movq %rdx, %rcx 4109; AVX512BW-NEXT: movq %rax, %rdi 4110; AVX512BW-NEXT: addq %rbx, %rdi 4111; AVX512BW-NEXT: adcq %rbp, %rcx 4112; AVX512BW-NEXT: setb %al 4113; AVX512BW-NEXT: movzbl %al, %ebp 4114; AVX512BW-NEXT: movq %r11, %rax 4115; AVX512BW-NEXT: mulq %r10 4116; AVX512BW-NEXT: addq %rcx, %rax 4117; AVX512BW-NEXT: adcq %rbp, %rdx 4118; AVX512BW-NEXT: addq %r12, %rax 4119; AVX512BW-NEXT: adcq %rsi, %rdx 4120; AVX512BW-NEXT: movq %rdi, 8(%r8) 4121; AVX512BW-NEXT: sarq $63, %rdi 4122; AVX512BW-NEXT: xorq %rdi, %rdx 4123; AVX512BW-NEXT: xorq %rax, %rdi 4124; AVX512BW-NEXT: orq %rdx, %rdi 4125; AVX512BW-NEXT: setne %al 4126; AVX512BW-NEXT: andl $1, %eax 4127; AVX512BW-NEXT: kmovw %eax, %k1 4128; AVX512BW-NEXT: kshiftlw $1, %k0, %k0 4129; AVX512BW-NEXT: korw %k0, %k1, %k1 4130; AVX512BW-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 4131; AVX512BW-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 4132; AVX512BW-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload 4133; AVX512BW-NEXT: movq %rax, 16(%r8) 4134; AVX512BW-NEXT: movq %r14, (%r8) 4135; AVX512BW-NEXT: popq %rbx 4136; AVX512BW-NEXT: popq %r12 4137; AVX512BW-NEXT: popq %r13 4138; AVX512BW-NEXT: popq %r14 4139; AVX512BW-NEXT: popq %r15 4140; AVX512BW-NEXT: popq %rbp 4141; AVX512BW-NEXT: retq 4142 %t = call {<2 x i128>, <2 x i1>} @llvm.smul.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1) 4143 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0 4144 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1 4145 %res = sext <2 x i1> %obit to <2 x i32> 4146 store <2 x i128> %val, <2 x i128>* %p2 4147 ret <2 x i32> %res 4148} 4149