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