266 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X86-SSE413; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X64-SSE414; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx | FileCheck %s --check-prefix=X86-AVX5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=X64-AVX6; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X86-AVX27; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64-AVX28; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefix=X86-AVX5129; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefix=X64-AVX51210 11define <16 x i16> @blendw_to_blendd_32(<16 x i16> %x, <16 x i16> %y, <16 x i16> %z) nounwind {12; X86-SSE41-LABEL: blendw_to_blendd_32:13; X86-SSE41: # %bb.0:14; X86-SSE41-NEXT: pushl %ebp15; X86-SSE41-NEXT: movl %esp, %ebp16; X86-SSE41-NEXT: andl $-16, %esp17; X86-SSE41-NEXT: subl $16, %esp18; X86-SSE41-NEXT: paddw 40(%ebp), %xmm119; X86-SSE41-NEXT: paddw 24(%ebp), %xmm020; X86-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]21; X86-SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],mem[2,3],xmm1[4,5],mem[6,7]22; X86-SSE41-NEXT: movl %ebp, %esp23; X86-SSE41-NEXT: popl %ebp24; X86-SSE41-NEXT: retl25;26; X64-SSE41-LABEL: blendw_to_blendd_32:27; X64-SSE41: # %bb.0:28; X64-SSE41-NEXT: paddw %xmm5, %xmm129; X64-SSE41-NEXT: paddw %xmm4, %xmm030; X64-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]31; X64-SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]32; X64-SSE41-NEXT: retq33;34; X86-AVX-LABEL: blendw_to_blendd_32:35; X86-AVX: # %bb.0:36; X86-AVX-NEXT: vextractf128 $1, %ymm2, %xmm337; X86-AVX-NEXT: vextractf128 $1, %ymm0, %xmm438; X86-AVX-NEXT: vpaddw %xmm3, %xmm4, %xmm339; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm040; X86-AVX-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm041; X86-AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]42; X86-AVX-NEXT: retl43;44; X64-AVX-LABEL: blendw_to_blendd_32:45; X64-AVX: # %bb.0:46; X64-AVX-NEXT: vextractf128 $1, %ymm2, %xmm347; X64-AVX-NEXT: vextractf128 $1, %ymm0, %xmm448; X64-AVX-NEXT: vpaddw %xmm3, %xmm4, %xmm349; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm050; X64-AVX-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm051; X64-AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]52; X64-AVX-NEXT: retq53;54; X86-AVX2-LABEL: blendw_to_blendd_32:55; X86-AVX2: # %bb.0:56; X86-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm057; X86-AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]58; X86-AVX2-NEXT: retl59;60; X64-AVX2-LABEL: blendw_to_blendd_32:61; X64-AVX2: # %bb.0:62; X64-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm063; X64-AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]64; X64-AVX2-NEXT: retq65;66; X86-AVX512-LABEL: blendw_to_blendd_32:67; X86-AVX512: # %bb.0:68; X86-AVX512-NEXT: vpaddw %ymm2, %ymm0, %ymm069; X86-AVX512-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]70; X86-AVX512-NEXT: retl71;72; X64-AVX512-LABEL: blendw_to_blendd_32:73; X64-AVX512: # %bb.0:74; X64-AVX512-NEXT: vpaddw %ymm2, %ymm0, %ymm075; X64-AVX512-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]76; X64-AVX512-NEXT: retq77 %x1 = add <16 x i16> %x, %z78 %shuffle = shufflevector <16 x i16> %x1, <16 x i16> %y, <16 x i32> <i32 0, i32 1, i32 18, i32 19, i32 4, i32 5, i32 22, i32 23, i32 8, i32 9, i32 26, i32 27, i32 12, i32 13, i32 30, i32 31>79 ret <16 x i16> %shuffle80}81 82define <8 x i16> @blendw_to_blendd_16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %z) nounwind {83; X86-SSE41-LABEL: blendw_to_blendd_16:84; X86-SSE41: # %bb.0:85; X86-SSE41-NEXT: paddw %xmm2, %xmm086; X86-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]87; X86-SSE41-NEXT: retl88;89; X64-SSE41-LABEL: blendw_to_blendd_16:90; X64-SSE41: # %bb.0:91; X64-SSE41-NEXT: paddw %xmm2, %xmm092; X64-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]93; X64-SSE41-NEXT: retq94;95; X86-AVX-LABEL: blendw_to_blendd_16:96; X86-AVX: # %bb.0:97; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm098; X86-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]99; X86-AVX-NEXT: retl100;101; X64-AVX-LABEL: blendw_to_blendd_16:102; X64-AVX: # %bb.0:103; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0104; X64-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]105; X64-AVX-NEXT: retq106;107; X86-AVX2-LABEL: blendw_to_blendd_16:108; X86-AVX2: # %bb.0:109; X86-AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm0110; X86-AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]111; X86-AVX2-NEXT: retl112;113; X64-AVX2-LABEL: blendw_to_blendd_16:114; X64-AVX2: # %bb.0:115; X64-AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm0116; X64-AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]117; X64-AVX2-NEXT: retq118;119; X86-AVX512-LABEL: blendw_to_blendd_16:120; X86-AVX512: # %bb.0:121; X86-AVX512-NEXT: vpaddw %xmm2, %xmm0, %xmm0122; X86-AVX512-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]123; X86-AVX512-NEXT: retl124;125; X64-AVX512-LABEL: blendw_to_blendd_16:126; X64-AVX512: # %bb.0:127; X64-AVX512-NEXT: vpaddw %xmm2, %xmm0, %xmm0128; X64-AVX512-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]129; X64-AVX512-NEXT: retq130 %x1 = add <8 x i16> %x, %z131 %shuffle = shufflevector <8 x i16> %x1, <8 x i16> %y, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>132 ret <8 x i16> %shuffle133}134 135define <16 x i16> @blendw_to_blendd_fail_32(<16 x i16> %x, <16 x i16> %y, <16 x i16> %z) nounwind {136; X86-SSE41-LABEL: blendw_to_blendd_fail_32:137; X86-SSE41: # %bb.0:138; X86-SSE41-NEXT: pushl %ebp139; X86-SSE41-NEXT: movl %esp, %ebp140; X86-SSE41-NEXT: andl $-16, %esp141; X86-SSE41-NEXT: subl $16, %esp142; X86-SSE41-NEXT: paddw 40(%ebp), %xmm1143; X86-SSE41-NEXT: paddw 24(%ebp), %xmm0144; X86-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm2[3],xmm0[4,5],xmm2[6,7]145; X86-SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2],mem[3],xmm1[4,5],mem[6,7]146; X86-SSE41-NEXT: movl %ebp, %esp147; X86-SSE41-NEXT: popl %ebp148; X86-SSE41-NEXT: retl149;150; X64-SSE41-LABEL: blendw_to_blendd_fail_32:151; X64-SSE41: # %bb.0:152; X64-SSE41-NEXT: paddw %xmm5, %xmm1153; X64-SSE41-NEXT: paddw %xmm4, %xmm0154; X64-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm2[3],xmm0[4,5],xmm2[6,7]155; X64-SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2],xmm3[3],xmm1[4,5],xmm3[6,7]156; X64-SSE41-NEXT: retq157;158; X86-AVX-LABEL: blendw_to_blendd_fail_32:159; X86-AVX: # %bb.0:160; X86-AVX-NEXT: vextractf128 $1, %ymm2, %xmm3161; X86-AVX-NEXT: vextractf128 $1, %ymm0, %xmm4162; X86-AVX-NEXT: vpaddw %xmm3, %xmm4, %xmm3163; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0164; X86-AVX-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0165; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm2 = [65535,65535,65535,0,65535,65535,0,0,65535,65535,65535,0,65535,65535,0,0]166; X86-AVX-NEXT: # ymm2 = mem[0,1,0,1]167; X86-AVX-NEXT: vandps %ymm2, %ymm0, %ymm0168; X86-AVX-NEXT: vandnps %ymm1, %ymm2, %ymm1169; X86-AVX-NEXT: vorps %ymm1, %ymm0, %ymm0170; X86-AVX-NEXT: retl171;172; X64-AVX-LABEL: blendw_to_blendd_fail_32:173; X64-AVX: # %bb.0:174; X64-AVX-NEXT: vextractf128 $1, %ymm2, %xmm3175; X64-AVX-NEXT: vextractf128 $1, %ymm0, %xmm4176; X64-AVX-NEXT: vpaddw %xmm3, %xmm4, %xmm3177; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0178; X64-AVX-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0179; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm2 = [65535,65535,65535,0,65535,65535,0,0,65535,65535,65535,0,65535,65535,0,0]180; X64-AVX-NEXT: # ymm2 = mem[0,1,0,1]181; X64-AVX-NEXT: vandps %ymm2, %ymm0, %ymm0182; X64-AVX-NEXT: vandnps %ymm1, %ymm2, %ymm1183; X64-AVX-NEXT: vorps %ymm1, %ymm0, %ymm0184; X64-AVX-NEXT: retq185;186; X86-AVX2-LABEL: blendw_to_blendd_fail_32:187; X86-AVX2: # %bb.0:188; X86-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0189; X86-AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3],ymm0[4,5],ymm1[6,7],ymm0[8,9,10],ymm1[11],ymm0[12,13],ymm1[14,15]190; X86-AVX2-NEXT: retl191;192; X64-AVX2-LABEL: blendw_to_blendd_fail_32:193; X64-AVX2: # %bb.0:194; X64-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0195; X64-AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3],ymm0[4,5],ymm1[6,7],ymm0[8,9,10],ymm1[11],ymm0[12,13],ymm1[14,15]196; X64-AVX2-NEXT: retq197;198; X86-AVX512-LABEL: blendw_to_blendd_fail_32:199; X86-AVX512: # %bb.0:200; X86-AVX512-NEXT: vpaddw %ymm2, %ymm0, %ymm0201; X86-AVX512-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3],ymm0[4,5],ymm1[6,7],ymm0[8,9,10],ymm1[11],ymm0[12,13],ymm1[14,15]202; X86-AVX512-NEXT: retl203;204; X64-AVX512-LABEL: blendw_to_blendd_fail_32:205; X64-AVX512: # %bb.0:206; X64-AVX512-NEXT: vpaddw %ymm2, %ymm0, %ymm0207; X64-AVX512-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3],ymm0[4,5],ymm1[6,7],ymm0[8,9,10],ymm1[11],ymm0[12,13],ymm1[14,15]208; X64-AVX512-NEXT: retq209 %x1 = add <16 x i16> %x, %z210 %shuffle = shufflevector <16 x i16> %x1, <16 x i16> %y, <16 x i32> <i32 0, i32 1, i32 2, i32 19, i32 4, i32 5, i32 22, i32 23, i32 8, i32 9, i32 10, i32 27, i32 12, i32 13, i32 30, i32 31>211 ret <16 x i16> %shuffle212}213 214define <8 x i16> @blendw_to_blendd_fail_16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %z) nounwind {215; X86-SSE41-LABEL: blendw_to_blendd_fail_16:216; X86-SSE41: # %bb.0:217; X86-SSE41-NEXT: paddw %xmm2, %xmm0218; X86-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]219; X86-SSE41-NEXT: retl220;221; X64-SSE41-LABEL: blendw_to_blendd_fail_16:222; X64-SSE41: # %bb.0:223; X64-SSE41-NEXT: paddw %xmm2, %xmm0224; X64-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]225; X64-SSE41-NEXT: retq226;227; X86-AVX-LABEL: blendw_to_blendd_fail_16:228; X86-AVX: # %bb.0:229; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0230; X86-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]231; X86-AVX-NEXT: retl232;233; X64-AVX-LABEL: blendw_to_blendd_fail_16:234; X64-AVX: # %bb.0:235; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0236; X64-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]237; X64-AVX-NEXT: retq238;239; X86-AVX2-LABEL: blendw_to_blendd_fail_16:240; X86-AVX2: # %bb.0:241; X86-AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm0242; X86-AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]243; X86-AVX2-NEXT: retl244;245; X64-AVX2-LABEL: blendw_to_blendd_fail_16:246; X64-AVX2: # %bb.0:247; X64-AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm0248; X64-AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]249; X64-AVX2-NEXT: retq250;251; X86-AVX512-LABEL: blendw_to_blendd_fail_16:252; X86-AVX512: # %bb.0:253; X86-AVX512-NEXT: vpaddw %xmm2, %xmm0, %xmm0254; X86-AVX512-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]255; X86-AVX512-NEXT: retl256;257; X64-AVX512-LABEL: blendw_to_blendd_fail_16:258; X64-AVX512: # %bb.0:259; X64-AVX512-NEXT: vpaddw %xmm2, %xmm0, %xmm0260; X64-AVX512-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]261; X64-AVX512-NEXT: retq262 %x1 = add <8 x i16> %x, %z263 %shuffle = shufflevector <8 x i16> %x1, <8 x i16> %y, <8 x i32> <i32 8, i32 1, i32 10, i32 11, i32 4, i32 5, i32 14, i32 15>264 ret <8 x i16> %shuffle265}266