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