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