1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2 6; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW 7 8; 9; Variable Shifts 10; 11 12define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind { 13; AVX1-LABEL: var_shift_v4i64: 14; AVX1: # BB#0: 15; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 16; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 17; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm4 18; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 19; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm2 20; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7] 21; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm3 22; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 23; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0 24; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7] 25; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 26; AVX1-NEXT: retq 27; 28; AVX2-LABEL: var_shift_v4i64: 29; AVX2: # BB#0: 30; AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0 31; AVX2-NEXT: retq 32; 33; XOPAVX1-LABEL: var_shift_v4i64: 34; XOPAVX1: # BB#0: 35; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 36; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 37; XOPAVX1-NEXT: vpshlq %xmm2, %xmm3, %xmm2 38; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm0 39; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 40; XOPAVX1-NEXT: retq 41; 42; XOPAVX2-LABEL: var_shift_v4i64: 43; XOPAVX2: # BB#0: 44; XOPAVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0 45; XOPAVX2-NEXT: retq 46; 47; AVX512-LABEL: var_shift_v4i64: 48; AVX512: ## BB#0: 49; AVX512-NEXT: vpsllvq %ymm1, %ymm0, %ymm0 50; AVX512-NEXT: retq 51 %shift = shl <4 x i64> %a, %b 52 ret <4 x i64> %shift 53} 54 55define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind { 56; AVX1-LABEL: var_shift_v8i32: 57; AVX1: # BB#0: 58; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 59; AVX1-NEXT: vpslld $23, %xmm2, %xmm2 60; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216] 61; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2 62; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2 63; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 64; AVX1-NEXT: vpmulld %xmm4, %xmm2, %xmm2 65; AVX1-NEXT: vpslld $23, %xmm1, %xmm1 66; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1 67; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1 68; AVX1-NEXT: vpmulld %xmm0, %xmm1, %xmm0 69; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 70; AVX1-NEXT: retq 71; 72; AVX2-LABEL: var_shift_v8i32: 73; AVX2: # BB#0: 74; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 75; AVX2-NEXT: retq 76; 77; XOPAVX1-LABEL: var_shift_v8i32: 78; XOPAVX1: # BB#0: 79; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 80; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 81; XOPAVX1-NEXT: vpshld %xmm2, %xmm3, %xmm2 82; XOPAVX1-NEXT: vpshld %xmm1, %xmm0, %xmm0 83; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 84; XOPAVX1-NEXT: retq 85; 86; XOPAVX2-LABEL: var_shift_v8i32: 87; XOPAVX2: # BB#0: 88; XOPAVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 89; XOPAVX2-NEXT: retq 90; 91; AVX512-LABEL: var_shift_v8i32: 92; AVX512: ## BB#0: 93; AVX512-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 94; AVX512-NEXT: retq 95 %shift = shl <8 x i32> %a, %b 96 ret <8 x i32> %shift 97} 98 99define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind { 100; AVX1-LABEL: var_shift_v16i16: 101; AVX1: # BB#0: 102; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 103; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3 104; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2 105; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2 106; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3 107; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 108; AVX1-NEXT: vpsllw $8, %xmm4, %xmm5 109; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 110; AVX1-NEXT: vpsllw $4, %xmm2, %xmm4 111; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 112; AVX1-NEXT: vpsllw $2, %xmm2, %xmm4 113; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 114; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 115; AVX1-NEXT: vpsllw $1, %xmm2, %xmm4 116; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 117; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 118; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3 119; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1 120; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1 121; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3 122; AVX1-NEXT: vpsllw $8, %xmm0, %xmm4 123; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 124; AVX1-NEXT: vpsllw $4, %xmm0, %xmm1 125; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 126; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1 127; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 128; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 129; AVX1-NEXT: vpsllw $1, %xmm0, %xmm1 130; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 131; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 132; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 133; AVX1-NEXT: retq 134; 135; AVX2-LABEL: var_shift_v16i16: 136; AVX2: # BB#0: 137; AVX2-NEXT: vpxor %ymm2, %ymm2, %ymm2 138; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15] 139; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15] 140; AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3 141; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 142; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11] 143; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11] 144; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 145; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 146; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 147; AVX2-NEXT: retq 148; 149; XOPAVX1-LABEL: var_shift_v16i16: 150; XOPAVX1: # BB#0: 151; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 152; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 153; XOPAVX1-NEXT: vpshlw %xmm2, %xmm3, %xmm2 154; XOPAVX1-NEXT: vpshlw %xmm1, %xmm0, %xmm0 155; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 156; XOPAVX1-NEXT: retq 157; 158; XOPAVX2-LABEL: var_shift_v16i16: 159; XOPAVX2: # BB#0: 160; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 161; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 162; XOPAVX2-NEXT: vpshlw %xmm2, %xmm3, %xmm2 163; XOPAVX2-NEXT: vpshlw %xmm1, %xmm0, %xmm0 164; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 165; XOPAVX2-NEXT: retq 166; 167; AVX512-LABEL: var_shift_v16i16: 168; AVX512: ## BB#0: 169; AVX512-NEXT: ## kill: %YMM1<def> %YMM1<kill> %ZMM1<def> 170; AVX512-NEXT: ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 171; AVX512-NEXT: vpsllvw %zmm1, %zmm0, %zmm0 172; AVX512-NEXT: ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 173; AVX512-NEXT: retq 174 %shift = shl <16 x i16> %a, %b 175 ret <16 x i16> %shift 176} 177 178define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind { 179; AVX1-LABEL: var_shift_v32i8: 180; AVX1: # BB#0: 181; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 182; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3 183; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 184; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 185; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 186; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5 187; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2 188; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3 189; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 190; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3 191; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5 192; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2 193; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3 194; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5 195; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2 196; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3 197; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 198; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 199; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 200; AVX1-NEXT: vpsllw $2, %xmm0, %xmm3 201; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3 202; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1 203; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 204; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3 205; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1 206; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 207; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 208; AVX1-NEXT: retq 209; 210; AVX2-LABEL: var_shift_v32i8: 211; AVX2: # BB#0: 212; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 213; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2 214; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 215; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 216; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2 217; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 218; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1 219; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 220; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2 221; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1 222; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 223; AVX2-NEXT: retq 224; 225; XOPAVX1-LABEL: var_shift_v32i8: 226; XOPAVX1: # BB#0: 227; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 228; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 229; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2 230; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0 231; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 232; XOPAVX1-NEXT: retq 233; 234; XOPAVX2-LABEL: var_shift_v32i8: 235; XOPAVX2: # BB#0: 236; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 237; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 238; XOPAVX2-NEXT: vpshlb %xmm2, %xmm3, %xmm2 239; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0 240; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 241; XOPAVX2-NEXT: retq 242; 243; AVX512-LABEL: var_shift_v32i8: 244; AVX512: ## BB#0: 245; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1 246; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2 247; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 248; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 249; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2 250; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 251; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1 252; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 253; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2 254; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1 255; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 256; AVX512-NEXT: retq 257 %shift = shl <32 x i8> %a, %b 258 ret <32 x i8> %shift 259} 260 261; 262; Uniform Variable Shifts 263; 264 265define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind { 266; AVX1-LABEL: splatvar_shift_v4i64: 267; AVX1: # BB#0: 268; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 269; AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2 270; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0 271; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 272; AVX1-NEXT: retq 273; 274; AVX2-LABEL: splatvar_shift_v4i64: 275; AVX2: # BB#0: 276; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0 277; AVX2-NEXT: retq 278; 279; XOPAVX1-LABEL: splatvar_shift_v4i64: 280; XOPAVX1: # BB#0: 281; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 282; XOPAVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2 283; XOPAVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0 284; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 285; XOPAVX1-NEXT: retq 286; 287; XOPAVX2-LABEL: splatvar_shift_v4i64: 288; XOPAVX2: # BB#0: 289; XOPAVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0 290; XOPAVX2-NEXT: retq 291; 292; AVX512-LABEL: splatvar_shift_v4i64: 293; AVX512: ## BB#0: 294; AVX512-NEXT: vpsllq %xmm1, %ymm0, %ymm0 295; AVX512-NEXT: retq 296 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer 297 %shift = shl <4 x i64> %a, %splat 298 ret <4 x i64> %shift 299} 300 301define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind { 302; AVX1-LABEL: splatvar_shift_v8i32: 303; AVX1: # BB#0: 304; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 305; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 306; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 307; AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2 308; AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0 309; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 310; AVX1-NEXT: retq 311; 312; AVX2-LABEL: splatvar_shift_v8i32: 313; AVX2: # BB#0: 314; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 315; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 316; AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0 317; AVX2-NEXT: retq 318; 319; XOPAVX1-LABEL: splatvar_shift_v8i32: 320; XOPAVX1: # BB#0: 321; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 322; XOPAVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 323; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 324; XOPAVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2 325; XOPAVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0 326; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 327; XOPAVX1-NEXT: retq 328; 329; XOPAVX2-LABEL: splatvar_shift_v8i32: 330; XOPAVX2: # BB#0: 331; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 332; XOPAVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 333; XOPAVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0 334; XOPAVX2-NEXT: retq 335; 336; AVX512-LABEL: splatvar_shift_v8i32: 337; AVX512: ## BB#0: 338; AVX512-NEXT: vxorps %xmm2, %xmm2, %xmm2 339; AVX512-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] 340; AVX512-NEXT: vpslld %xmm1, %ymm0, %ymm0 341; AVX512-NEXT: retq 342 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer 343 %shift = shl <8 x i32> %a, %splat 344 ret <8 x i32> %shift 345} 346 347define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind { 348; AVX1-LABEL: splatvar_shift_v16i16: 349; AVX1: # BB#0: 350; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 351; AVX1-NEXT: vmovd %xmm1, %eax 352; AVX1-NEXT: movzwl %ax, %eax 353; AVX1-NEXT: vmovd %eax, %xmm1 354; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2 355; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0 356; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 357; AVX1-NEXT: retq 358; 359; AVX2-LABEL: splatvar_shift_v16i16: 360; AVX2: # BB#0: 361; AVX2-NEXT: vmovd %xmm1, %eax 362; AVX2-NEXT: movzwl %ax, %eax 363; AVX2-NEXT: vmovd %eax, %xmm1 364; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0 365; AVX2-NEXT: retq 366; 367; XOPAVX1-LABEL: splatvar_shift_v16i16: 368; XOPAVX1: # BB#0: 369; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 370; XOPAVX1-NEXT: vmovd %xmm1, %eax 371; XOPAVX1-NEXT: movzwl %ax, %eax 372; XOPAVX1-NEXT: vmovd %eax, %xmm1 373; XOPAVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2 374; XOPAVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0 375; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 376; XOPAVX1-NEXT: retq 377; 378; XOPAVX2-LABEL: splatvar_shift_v16i16: 379; XOPAVX2: # BB#0: 380; XOPAVX2-NEXT: vmovd %xmm1, %eax 381; XOPAVX2-NEXT: movzwl %ax, %eax 382; XOPAVX2-NEXT: vmovd %eax, %xmm1 383; XOPAVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0 384; XOPAVX2-NEXT: retq 385; 386; AVX512-LABEL: splatvar_shift_v16i16: 387; AVX512: ## BB#0: 388; AVX512-NEXT: vmovd %xmm1, %eax 389; AVX512-NEXT: movzwl %ax, %eax 390; AVX512-NEXT: vmovd %eax, %xmm1 391; AVX512-NEXT: vpsllw %xmm1, %ymm0, %ymm0 392; AVX512-NEXT: retq 393 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer 394 %shift = shl <16 x i16> %a, %splat 395 ret <16 x i16> %shift 396} 397 398define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind { 399; AVX1-LABEL: splatvar_shift_v32i8: 400; AVX1: # BB#0: 401; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 402; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 403; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 404; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3 405; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 406; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 407; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 408; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm2, %xmm2 409; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3 410; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 411; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3 412; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm6 413; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2 414; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3 415; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7 416; AVX1-NEXT: vpblendvb %xmm7, %xmm3, %xmm2, %xmm2 417; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3 418; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 419; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 420; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1 421; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1 422; AVX1-NEXT: vpblendvb %xmm6, %xmm1, %xmm0, %xmm0 423; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm1 424; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0 425; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 426; AVX1-NEXT: retq 427; 428; AVX2-LABEL: splatvar_shift_v32i8: 429; AVX2: # BB#0: 430; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1 431; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2 432; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 433; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 434; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 435; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2 436; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 437; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1 438; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 439; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2 440; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1 441; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 442; AVX2-NEXT: retq 443; 444; XOPAVX1-LABEL: splatvar_shift_v32i8: 445; XOPAVX1: # BB#0: 446; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 447; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 448; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 449; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm2 450; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0 451; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 452; XOPAVX1-NEXT: retq 453; 454; XOPAVX2-LABEL: splatvar_shift_v32i8: 455; XOPAVX2: # BB#0: 456; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1 457; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 458; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 459; XOPAVX2-NEXT: vpshlb %xmm3, %xmm2, %xmm2 460; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0 461; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 462; XOPAVX2-NEXT: retq 463; 464; AVX512-LABEL: splatvar_shift_v32i8: 465; AVX512: ## BB#0: 466; AVX512-NEXT: vpbroadcastb %xmm1, %ymm1 467; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2 468; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 469; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1 470; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 471; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2 472; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 473; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1 474; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 475; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2 476; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1 477; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 478; AVX512-NEXT: retq 479 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer 480 %shift = shl <32 x i8> %a, %splat 481 ret <32 x i8> %shift 482} 483 484; 485; Constant Shifts 486; 487 488define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind { 489; AVX1-LABEL: constant_shift_v4i64: 490; AVX1: # BB#0: 491; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 492; AVX1-NEXT: vpsllq $62, %xmm1, %xmm2 493; AVX1-NEXT: vpsllq $31, %xmm1, %xmm1 494; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7] 495; AVX1-NEXT: vpsllq $7, %xmm0, %xmm2 496; AVX1-NEXT: vpsllq $1, %xmm0, %xmm0 497; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 498; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 499; AVX1-NEXT: retq 500; 501; AVX2-LABEL: constant_shift_v4i64: 502; AVX2: # BB#0: 503; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0 504; AVX2-NEXT: retq 505; 506; XOPAVX1-LABEL: constant_shift_v4i64: 507; XOPAVX1: # BB#0: 508; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm1 509; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 510; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm0 511; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 512; XOPAVX1-NEXT: retq 513; 514; XOPAVX2-LABEL: constant_shift_v4i64: 515; XOPAVX2: # BB#0: 516; XOPAVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0 517; XOPAVX2-NEXT: retq 518; 519; AVX512-LABEL: constant_shift_v4i64: 520; AVX512: ## BB#0: 521; AVX512-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0 522; AVX512-NEXT: retq 523 %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62> 524 ret <4 x i64> %shift 525} 526 527define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind { 528; AVX1-LABEL: constant_shift_v8i32: 529; AVX1: # BB#0: 530; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm1 531; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 532; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0 533; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 534; AVX1-NEXT: retq 535; 536; AVX2-LABEL: constant_shift_v8i32: 537; AVX2: # BB#0: 538; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0 539; AVX2-NEXT: retq 540; 541; XOPAVX1-LABEL: constant_shift_v8i32: 542; XOPAVX1: # BB#0: 543; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm1 544; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 545; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0 546; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 547; XOPAVX1-NEXT: retq 548; 549; XOPAVX2-LABEL: constant_shift_v8i32: 550; XOPAVX2: # BB#0: 551; XOPAVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0 552; XOPAVX2-NEXT: retq 553; 554; AVX512-LABEL: constant_shift_v8i32: 555; AVX512: ## BB#0: 556; AVX512-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0 557; AVX512-NEXT: retq 558 %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7> 559 ret <8 x i32> %shift 560} 561 562define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind { 563; AVX1-LABEL: constant_shift_v16i16: 564; AVX1: # BB#0: 565; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1 566; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 567; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 568; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 569; AVX1-NEXT: retq 570; 571; AVX2-LABEL: constant_shift_v16i16: 572; AVX2: # BB#0: 573; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 574; AVX2-NEXT: retq 575; 576; XOPAVX1-LABEL: constant_shift_v16i16: 577; XOPAVX1: # BB#0: 578; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm1 579; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 580; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm0 581; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 582; XOPAVX1-NEXT: retq 583; 584; XOPAVX2-LABEL: constant_shift_v16i16: 585; XOPAVX2: # BB#0: 586; XOPAVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 587; XOPAVX2-NEXT: retq 588; 589; AVX512-LABEL: constant_shift_v16i16: 590; AVX512: ## BB#0: 591; AVX512-NEXT: ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 592; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 593; AVX512-NEXT: vpsllvw %zmm1, %zmm0, %zmm0 594; AVX512-NEXT: ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 595; AVX512-NEXT: retq 596 %shift = shl <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15> 597 ret <16 x i16> %shift 598} 599 600define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind { 601; AVX1-LABEL: constant_shift_v32i8: 602; AVX1: # BB#0: 603; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 604; AVX1-NEXT: vpsllw $4, %xmm1, %xmm2 605; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 606; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 607; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 608; AVX1-NEXT: vpsllw $5, %xmm4, %xmm4 609; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm1, %xmm1 610; AVX1-NEXT: vpsllw $2, %xmm1, %xmm2 611; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 612; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2 613; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm6 614; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm1, %xmm1 615; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm2 616; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7 617; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm1, %xmm1 618; AVX1-NEXT: vpsllw $4, %xmm0, %xmm2 619; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 620; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm0, %xmm0 621; AVX1-NEXT: vpsllw $2, %xmm0, %xmm2 622; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2 623; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm0, %xmm0 624; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm2 625; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm0, %xmm0 626; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 627; AVX1-NEXT: retq 628; 629; AVX2-LABEL: constant_shift_v32i8: 630; AVX2: # BB#0: 631; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 632; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 633; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2 634; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 635; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 636; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2 637; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 638; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1 639; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 640; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2 641; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1 642; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 643; AVX2-NEXT: retq 644; 645; XOPAVX1-LABEL: constant_shift_v32i8: 646; XOPAVX1: # BB#0: 647; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 648; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 649; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1 650; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0 651; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 652; XOPAVX1-NEXT: retq 653; 654; XOPAVX2-LABEL: constant_shift_v32i8: 655; XOPAVX2: # BB#0: 656; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 657; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 658; XOPAVX2-NEXT: vpshlb %xmm2, %xmm1, %xmm1 659; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm0 660; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 661; XOPAVX2-NEXT: retq 662; 663; AVX512-LABEL: constant_shift_v32i8: 664; AVX512: ## BB#0: 665; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 666; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1 667; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2 668; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 669; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 670; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2 671; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2 672; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1 673; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 674; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2 675; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1 676; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 677; AVX512-NEXT: retq 678 %shift = shl <32 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0> 679 ret <32 x i8> %shift 680} 681 682; 683; Uniform Constant Shifts 684; 685 686define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind { 687; AVX1-LABEL: splatconstant_shift_v4i64: 688; AVX1: # BB#0: 689; AVX1-NEXT: vpsllq $7, %xmm0, %xmm1 690; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 691; AVX1-NEXT: vpsllq $7, %xmm0, %xmm0 692; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 693; AVX1-NEXT: retq 694; 695; AVX2-LABEL: splatconstant_shift_v4i64: 696; AVX2: # BB#0: 697; AVX2-NEXT: vpsllq $7, %ymm0, %ymm0 698; AVX2-NEXT: retq 699; 700; XOPAVX1-LABEL: splatconstant_shift_v4i64: 701; XOPAVX1: # BB#0: 702; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm1 703; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 704; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm0 705; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 706; XOPAVX1-NEXT: retq 707; 708; XOPAVX2-LABEL: splatconstant_shift_v4i64: 709; XOPAVX2: # BB#0: 710; XOPAVX2-NEXT: vpsllq $7, %ymm0, %ymm0 711; XOPAVX2-NEXT: retq 712; 713; AVX512-LABEL: splatconstant_shift_v4i64: 714; AVX512: ## BB#0: 715; AVX512-NEXT: vpsllq $7, %ymm0, %ymm0 716; AVX512-NEXT: retq 717 %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7> 718 ret <4 x i64> %shift 719} 720 721define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind { 722; AVX1-LABEL: splatconstant_shift_v8i32: 723; AVX1: # BB#0: 724; AVX1-NEXT: vpslld $5, %xmm0, %xmm1 725; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 726; AVX1-NEXT: vpslld $5, %xmm0, %xmm0 727; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 728; AVX1-NEXT: retq 729; 730; AVX2-LABEL: splatconstant_shift_v8i32: 731; AVX2: # BB#0: 732; AVX2-NEXT: vpslld $5, %ymm0, %ymm0 733; AVX2-NEXT: retq 734; 735; XOPAVX1-LABEL: splatconstant_shift_v8i32: 736; XOPAVX1: # BB#0: 737; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm1 738; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 739; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm0 740; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 741; XOPAVX1-NEXT: retq 742; 743; XOPAVX2-LABEL: splatconstant_shift_v8i32: 744; XOPAVX2: # BB#0: 745; XOPAVX2-NEXT: vpslld $5, %ymm0, %ymm0 746; XOPAVX2-NEXT: retq 747; 748; AVX512-LABEL: splatconstant_shift_v8i32: 749; AVX512: ## BB#0: 750; AVX512-NEXT: vpslld $5, %ymm0, %ymm0 751; AVX512-NEXT: retq 752 %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 753 ret <8 x i32> %shift 754} 755 756define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind { 757; AVX1-LABEL: splatconstant_shift_v16i16: 758; AVX1: # BB#0: 759; AVX1-NEXT: vpsllw $3, %xmm0, %xmm1 760; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 761; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0 762; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 763; AVX1-NEXT: retq 764; 765; AVX2-LABEL: splatconstant_shift_v16i16: 766; AVX2: # BB#0: 767; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0 768; AVX2-NEXT: retq 769; 770; XOPAVX1-LABEL: splatconstant_shift_v16i16: 771; XOPAVX1: # BB#0: 772; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm1 773; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 774; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm0 775; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 776; XOPAVX1-NEXT: retq 777; 778; XOPAVX2-LABEL: splatconstant_shift_v16i16: 779; XOPAVX2: # BB#0: 780; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0 781; XOPAVX2-NEXT: retq 782; 783; AVX512-LABEL: splatconstant_shift_v16i16: 784; AVX512: ## BB#0: 785; AVX512-NEXT: vpsllw $3, %ymm0, %ymm0 786; AVX512-NEXT: retq 787 %shift = shl <16 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 788 ret <16 x i16> %shift 789} 790 791define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind { 792; AVX1-LABEL: splatconstant_shift_v32i8: 793; AVX1: # BB#0: 794; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 795; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1 796; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248] 797; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 798; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0 799; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 800; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 801; AVX1-NEXT: retq 802; 803; AVX2-LABEL: splatconstant_shift_v32i8: 804; AVX2: # BB#0: 805; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0 806; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 807; AVX2-NEXT: retq 808; 809; XOPAVX1-LABEL: splatconstant_shift_v32i8: 810; XOPAVX1: # BB#0: 811; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 812; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3] 813; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1 814; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0 815; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 816; XOPAVX1-NEXT: retq 817; 818; XOPAVX2-LABEL: splatconstant_shift_v32i8: 819; XOPAVX2: # BB#0: 820; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0 821; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 822; XOPAVX2-NEXT: retq 823; 824; AVX512-LABEL: splatconstant_shift_v32i8: 825; AVX512: ## BB#0: 826; AVX512-NEXT: vpsllw $3, %ymm0, %ymm0 827; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 828; AVX512-NEXT: retq 829 %shift = shl <32 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3> 830 ret <32 x i8> %shift 831} 832