1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X86-SSE41 3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X64-SSE41 4; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx | FileCheck %s --check-prefix=X86-AVX 5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=X64-AVX 6; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X86-AVX2 7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64-AVX2 8; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefix=X86-AVX512 9; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefix=X64-AVX512 10 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 %ebp 15; X86-SSE41-NEXT: movl %esp, %ebp 16; X86-SSE41-NEXT: andl $-16, %esp 17; X86-SSE41-NEXT: subl $16, %esp 18; X86-SSE41-NEXT: paddw 40(%ebp), %xmm1 19; X86-SSE41-NEXT: paddw 24(%ebp), %xmm0 20; 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, %esp 23; X86-SSE41-NEXT: popl %ebp 24; X86-SSE41-NEXT: retl 25; 26; X64-SSE41-LABEL: blendw_to_blendd_32: 27; X64-SSE41: # %bb.0: 28; X64-SSE41-NEXT: paddw %xmm5, %xmm1 29; X64-SSE41-NEXT: paddw %xmm4, %xmm0 30; 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: retq 33; 34; X86-AVX-LABEL: blendw_to_blendd_32: 35; X86-AVX: # %bb.0: 36; X86-AVX-NEXT: vextractf128 $1, %ymm2, %xmm3 37; X86-AVX-NEXT: vextractf128 $1, %ymm0, %xmm4 38; X86-AVX-NEXT: vpaddw %xmm3, %xmm4, %xmm3 39; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0 40; X86-AVX-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 41; 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: retl 43; 44; X64-AVX-LABEL: blendw_to_blendd_32: 45; X64-AVX: # %bb.0: 46; X64-AVX-NEXT: vextractf128 $1, %ymm2, %xmm3 47; X64-AVX-NEXT: vextractf128 $1, %ymm0, %xmm4 48; X64-AVX-NEXT: vpaddw %xmm3, %xmm4, %xmm3 49; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0 50; X64-AVX-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 51; 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: retq 53; 54; X86-AVX2-LABEL: blendw_to_blendd_32: 55; X86-AVX2: # %bb.0: 56; X86-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 57; 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: retl 59; 60; X64-AVX2-LABEL: blendw_to_blendd_32: 61; X64-AVX2: # %bb.0: 62; X64-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 63; 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: retq 65; 66; X86-AVX512-LABEL: blendw_to_blendd_32: 67; X86-AVX512: # %bb.0: 68; X86-AVX512-NEXT: vpaddw %ymm2, %ymm0, %ymm0 69; 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: retl 71; 72; X64-AVX512-LABEL: blendw_to_blendd_32: 73; X64-AVX512: # %bb.0: 74; X64-AVX512-NEXT: vpaddw %ymm2, %ymm0, %ymm0 75; 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: retq 77 %x1 = add <16 x i16> %x, %z 78 %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> %shuffle 80} 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, %xmm0 86; X86-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 87; X86-SSE41-NEXT: retl 88; 89; X64-SSE41-LABEL: blendw_to_blendd_16: 90; X64-SSE41: # %bb.0: 91; X64-SSE41-NEXT: paddw %xmm2, %xmm0 92; X64-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 93; X64-SSE41-NEXT: retq 94; 95; X86-AVX-LABEL: blendw_to_blendd_16: 96; X86-AVX: # %bb.0: 97; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0 98; X86-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 99; X86-AVX-NEXT: retl 100; 101; X64-AVX-LABEL: blendw_to_blendd_16: 102; X64-AVX: # %bb.0: 103; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0 104; X64-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 105; X64-AVX-NEXT: retq 106; 107; X86-AVX2-LABEL: blendw_to_blendd_16: 108; X86-AVX2: # %bb.0: 109; X86-AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm0 110; X86-AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3] 111; X86-AVX2-NEXT: retl 112; 113; X64-AVX2-LABEL: blendw_to_blendd_16: 114; X64-AVX2: # %bb.0: 115; X64-AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm0 116; X64-AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3] 117; X64-AVX2-NEXT: retq 118; 119; X86-AVX512-LABEL: blendw_to_blendd_16: 120; X86-AVX512: # %bb.0: 121; X86-AVX512-NEXT: vpaddw %xmm2, %xmm0, %xmm0 122; X86-AVX512-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3] 123; X86-AVX512-NEXT: retl 124; 125; X64-AVX512-LABEL: blendw_to_blendd_16: 126; X64-AVX512: # %bb.0: 127; X64-AVX512-NEXT: vpaddw %xmm2, %xmm0, %xmm0 128; X64-AVX512-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3] 129; X64-AVX512-NEXT: retq 130 %x1 = add <8 x i16> %x, %z 131 %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> %shuffle 133} 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 %ebp 139; X86-SSE41-NEXT: movl %esp, %ebp 140; X86-SSE41-NEXT: andl $-16, %esp 141; X86-SSE41-NEXT: subl $16, %esp 142; X86-SSE41-NEXT: paddw 40(%ebp), %xmm1 143; X86-SSE41-NEXT: paddw 24(%ebp), %xmm0 144; 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, %esp 147; X86-SSE41-NEXT: popl %ebp 148; X86-SSE41-NEXT: retl 149; 150; X64-SSE41-LABEL: blendw_to_blendd_fail_32: 151; X64-SSE41: # %bb.0: 152; X64-SSE41-NEXT: paddw %xmm5, %xmm1 153; X64-SSE41-NEXT: paddw %xmm4, %xmm0 154; 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: retq 157; 158; X86-AVX-LABEL: blendw_to_blendd_fail_32: 159; X86-AVX: # %bb.0: 160; X86-AVX-NEXT: vextractf128 $1, %ymm2, %xmm3 161; X86-AVX-NEXT: vextractf128 $1, %ymm0, %xmm4 162; X86-AVX-NEXT: vpaddw %xmm3, %xmm4, %xmm3 163; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0 164; X86-AVX-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 165; 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, %ymm0 168; X86-AVX-NEXT: vandnps %ymm1, %ymm2, %ymm1 169; X86-AVX-NEXT: vorps %ymm1, %ymm0, %ymm0 170; X86-AVX-NEXT: retl 171; 172; X64-AVX-LABEL: blendw_to_blendd_fail_32: 173; X64-AVX: # %bb.0: 174; X64-AVX-NEXT: vextractf128 $1, %ymm2, %xmm3 175; X64-AVX-NEXT: vextractf128 $1, %ymm0, %xmm4 176; X64-AVX-NEXT: vpaddw %xmm3, %xmm4, %xmm3 177; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0 178; X64-AVX-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 179; 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, %ymm0 182; X64-AVX-NEXT: vandnps %ymm1, %ymm2, %ymm1 183; X64-AVX-NEXT: vorps %ymm1, %ymm0, %ymm0 184; X64-AVX-NEXT: retq 185; 186; X86-AVX2-LABEL: blendw_to_blendd_fail_32: 187; X86-AVX2: # %bb.0: 188; X86-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 189; 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: retl 191; 192; X64-AVX2-LABEL: blendw_to_blendd_fail_32: 193; X64-AVX2: # %bb.0: 194; X64-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 195; 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: retq 197; 198; X86-AVX512-LABEL: blendw_to_blendd_fail_32: 199; X86-AVX512: # %bb.0: 200; X86-AVX512-NEXT: vpaddw %ymm2, %ymm0, %ymm0 201; 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: retl 203; 204; X64-AVX512-LABEL: blendw_to_blendd_fail_32: 205; X64-AVX512: # %bb.0: 206; X64-AVX512-NEXT: vpaddw %ymm2, %ymm0, %ymm0 207; 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: retq 209 %x1 = add <16 x i16> %x, %z 210 %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> %shuffle 212} 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, %xmm0 218; X86-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 219; X86-SSE41-NEXT: retl 220; 221; X64-SSE41-LABEL: blendw_to_blendd_fail_16: 222; X64-SSE41: # %bb.0: 223; X64-SSE41-NEXT: paddw %xmm2, %xmm0 224; X64-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 225; X64-SSE41-NEXT: retq 226; 227; X86-AVX-LABEL: blendw_to_blendd_fail_16: 228; X86-AVX: # %bb.0: 229; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0 230; X86-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 231; X86-AVX-NEXT: retl 232; 233; X64-AVX-LABEL: blendw_to_blendd_fail_16: 234; X64-AVX: # %bb.0: 235; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0 236; X64-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 237; X64-AVX-NEXT: retq 238; 239; X86-AVX2-LABEL: blendw_to_blendd_fail_16: 240; X86-AVX2: # %bb.0: 241; X86-AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm0 242; X86-AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 243; X86-AVX2-NEXT: retl 244; 245; X64-AVX2-LABEL: blendw_to_blendd_fail_16: 246; X64-AVX2: # %bb.0: 247; X64-AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm0 248; X64-AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 249; X64-AVX2-NEXT: retq 250; 251; X86-AVX512-LABEL: blendw_to_blendd_fail_16: 252; X86-AVX512: # %bb.0: 253; X86-AVX512-NEXT: vpaddw %xmm2, %xmm0, %xmm0 254; X86-AVX512-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 255; X86-AVX512-NEXT: retl 256; 257; X64-AVX512-LABEL: blendw_to_blendd_fail_16: 258; X64-AVX512: # %bb.0: 259; X64-AVX512-NEXT: vpaddw %xmm2, %xmm0, %xmm0 260; X64-AVX512-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 261; X64-AVX512-NEXT: retq 262 %x1 = add <8 x i16> %x, %z 263 %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> %shuffle 265} 266