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=SSE,SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512DQ 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512BW 10 11; Shifts of uniform vXi8 constant values can be performed by a PSHUFB LUT 12 13define <16 x i8> @uniform_shl_v16i8(<16 x i8> %a) nounwind { 14; SSE2-LABEL: uniform_shl_v16i8: 15; SSE2: # %bb.0: 16; SSE2-NEXT: movdqa %xmm0, %xmm1 17; SSE2-NEXT: psllw $5, %xmm1 18; SSE2-NEXT: pxor %xmm2, %xmm2 19; SSE2-NEXT: pxor %xmm3, %xmm3 20; SSE2-NEXT: pcmpgtb %xmm1, %xmm3 21; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 22; SSE2-NEXT: pand %xmm3, %xmm0 23; SSE2-NEXT: paddb %xmm3, %xmm0 24; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 25; SSE2-NEXT: psubb %xmm3, %xmm0 26; SSE2-NEXT: paddb %xmm1, %xmm1 27; SSE2-NEXT: pxor %xmm3, %xmm3 28; SSE2-NEXT: pcmpgtb %xmm1, %xmm3 29; SSE2-NEXT: movdqa %xmm3, %xmm4 30; SSE2-NEXT: pandn %xmm0, %xmm4 31; SSE2-NEXT: psllw $2, %xmm0 32; SSE2-NEXT: pand %xmm3, %xmm0 33; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 34; SSE2-NEXT: por %xmm4, %xmm0 35; SSE2-NEXT: paddb %xmm1, %xmm1 36; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 37; SSE2-NEXT: movdqa %xmm2, %xmm1 38; SSE2-NEXT: pandn %xmm0, %xmm1 39; SSE2-NEXT: paddb %xmm0, %xmm0 40; SSE2-NEXT: pand %xmm2, %xmm0 41; SSE2-NEXT: por %xmm1, %xmm0 42; SSE2-NEXT: retq 43; 44; SSE41-LABEL: uniform_shl_v16i8: 45; SSE41: # %bb.0: 46; SSE41-NEXT: movq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0] 47; SSE41-NEXT: pshufb %xmm0, %xmm1 48; SSE41-NEXT: movdqa %xmm1, %xmm0 49; SSE41-NEXT: retq 50; 51; AVX-LABEL: uniform_shl_v16i8: 52; AVX: # %bb.0: 53; AVX-NEXT: vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0] 54; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 55; AVX-NEXT: retq 56; 57; XOP-LABEL: uniform_shl_v16i8: 58; XOP: # %bb.0: 59; XOP-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 60; XOP-NEXT: retq 61; 62; AVX512DQ-LABEL: uniform_shl_v16i8: 63; AVX512DQ: # %bb.0: 64; AVX512DQ-NEXT: vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0] 65; AVX512DQ-NEXT: vpshufb %xmm0, %xmm1, %xmm0 66; AVX512DQ-NEXT: retq 67; 68; AVX512BW-LABEL: uniform_shl_v16i8: 69; AVX512BW: # %bb.0: 70; AVX512BW-NEXT: vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0] 71; AVX512BW-NEXT: vpshufb %xmm0, %xmm1, %xmm0 72; AVX512BW-NEXT: retq 73 %shift = shl <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, %a 74 ret <16 x i8> %shift 75} 76 77define <16 x i8> @uniform_lshr_v16i8(<16 x i8> %a) nounwind { 78; SSE2-LABEL: uniform_lshr_v16i8: 79; SSE2: # %bb.0: 80; SSE2-NEXT: psllw $5, %xmm0 81; SSE2-NEXT: pxor %xmm1, %xmm1 82; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 83; SSE2-NEXT: movdqa %xmm0, %xmm2 84; SSE2-NEXT: paddb %xmm0, %xmm2 85; SSE2-NEXT: pxor %xmm3, %xmm3 86; SSE2-NEXT: pxor %xmm0, %xmm0 87; SSE2-NEXT: pcmpgtb %xmm2, %xmm0 88; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 89; SSE2-NEXT: pandn %xmm1, %xmm0 90; SSE2-NEXT: paddb %xmm2, %xmm2 91; SSE2-NEXT: pcmpgtb %xmm2, %xmm3 92; SSE2-NEXT: movdqa %xmm3, %xmm1 93; SSE2-NEXT: pandn %xmm0, %xmm1 94; SSE2-NEXT: psrlw $1, %xmm0 95; SSE2-NEXT: pand %xmm3, %xmm0 96; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 97; SSE2-NEXT: por %xmm1, %xmm0 98; SSE2-NEXT: retq 99; 100; SSE41-LABEL: uniform_lshr_v16i8: 101; SSE41: # %bb.0: 102; SSE41-NEXT: movd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 103; SSE41-NEXT: pshufb %xmm0, %xmm1 104; SSE41-NEXT: movdqa %xmm1, %xmm0 105; SSE41-NEXT: retq 106; 107; AVX-LABEL: uniform_lshr_v16i8: 108; AVX: # %bb.0: 109; AVX-NEXT: vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 110; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 111; AVX-NEXT: retq 112; 113; XOP-LABEL: uniform_lshr_v16i8: 114; XOP: # %bb.0: 115; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1 116; XOP-NEXT: vpsubb %xmm0, %xmm1, %xmm0 117; XOP-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 118; XOP-NEXT: retq 119; 120; AVX512DQ-LABEL: uniform_lshr_v16i8: 121; AVX512DQ: # %bb.0: 122; AVX512DQ-NEXT: vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 123; AVX512DQ-NEXT: vpshufb %xmm0, %xmm1, %xmm0 124; AVX512DQ-NEXT: retq 125; 126; AVX512BW-LABEL: uniform_lshr_v16i8: 127; AVX512BW: # %bb.0: 128; AVX512BW-NEXT: vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 129; AVX512BW-NEXT: vpshufb %xmm0, %xmm1, %xmm0 130; AVX512BW-NEXT: retq 131 %shift = lshr <16 x i8> <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a 132 ret <16 x i8> %shift 133} 134 135define <16 x i8> @uniform_ashr_v16i8(<16 x i8> %a) nounwind { 136; SSE2-LABEL: uniform_ashr_v16i8: 137; SSE2: # %bb.0: 138; SSE2-NEXT: psllw $5, %xmm0 139; SSE2-NEXT: pxor %xmm1, %xmm1 140; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 141; SSE2-NEXT: movdqa %xmm0, %xmm2 142; SSE2-NEXT: paddb %xmm0, %xmm2 143; SSE2-NEXT: pxor %xmm3, %xmm3 144; SSE2-NEXT: pxor %xmm0, %xmm0 145; SSE2-NEXT: pcmpgtb %xmm2, %xmm0 146; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 147; SSE2-NEXT: pandn %xmm1, %xmm0 148; SSE2-NEXT: paddb %xmm2, %xmm2 149; SSE2-NEXT: pcmpgtb %xmm2, %xmm3 150; SSE2-NEXT: movdqa %xmm3, %xmm1 151; SSE2-NEXT: pandn %xmm0, %xmm1 152; SSE2-NEXT: psrlw $1, %xmm0 153; SSE2-NEXT: pand %xmm3, %xmm0 154; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 155; SSE2-NEXT: por %xmm1, %xmm0 156; SSE2-NEXT: retq 157; 158; SSE41-LABEL: uniform_ashr_v16i8: 159; SSE41: # %bb.0: 160; SSE41-NEXT: movd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 161; SSE41-NEXT: pshufb %xmm0, %xmm1 162; SSE41-NEXT: movdqa %xmm1, %xmm0 163; SSE41-NEXT: retq 164; 165; AVX-LABEL: uniform_ashr_v16i8: 166; AVX: # %bb.0: 167; AVX-NEXT: vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 168; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 169; AVX-NEXT: retq 170; 171; XOP-LABEL: uniform_ashr_v16i8: 172; XOP: # %bb.0: 173; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1 174; XOP-NEXT: vpsubb %xmm0, %xmm1, %xmm0 175; XOP-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 176; XOP-NEXT: retq 177; 178; AVX512DQ-LABEL: uniform_ashr_v16i8: 179; AVX512DQ: # %bb.0: 180; AVX512DQ-NEXT: vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 181; AVX512DQ-NEXT: vpshufb %xmm0, %xmm1, %xmm0 182; AVX512DQ-NEXT: retq 183; 184; AVX512BW-LABEL: uniform_ashr_v16i8: 185; AVX512BW: # %bb.0: 186; AVX512BW-NEXT: vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 187; AVX512BW-NEXT: vpshufb %xmm0, %xmm1, %xmm0 188; AVX512BW-NEXT: retq 189 %shift = ashr <16 x i8> <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>, %a 190 ret <16 x i8> %shift 191} 192 193define <32 x i8> @uniform_shl_v32i8(<32 x i8> %a) nounwind { 194; SSE2-LABEL: uniform_shl_v32i8: 195; SSE2: # %bb.0: 196; SSE2-NEXT: movdqa %xmm0, %xmm2 197; SSE2-NEXT: psllw $5, %xmm2 198; SSE2-NEXT: pxor %xmm3, %xmm3 199; SSE2-NEXT: pxor %xmm7, %xmm7 200; SSE2-NEXT: pcmpgtb %xmm2, %xmm7 201; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4] 202; SSE2-NEXT: movdqa %xmm7, %xmm0 203; SSE2-NEXT: pandn %xmm4, %xmm0 204; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64] 205; SSE2-NEXT: pand %xmm5, %xmm7 206; SSE2-NEXT: por %xmm0, %xmm7 207; SSE2-NEXT: paddb %xmm2, %xmm2 208; SSE2-NEXT: pxor %xmm0, %xmm0 209; SSE2-NEXT: pcmpgtb %xmm2, %xmm0 210; SSE2-NEXT: movdqa %xmm0, %xmm8 211; SSE2-NEXT: pandn %xmm7, %xmm8 212; SSE2-NEXT: psllw $2, %xmm7 213; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 214; SSE2-NEXT: pand %xmm6, %xmm0 215; SSE2-NEXT: pand %xmm7, %xmm0 216; SSE2-NEXT: por %xmm8, %xmm0 217; SSE2-NEXT: paddb %xmm2, %xmm2 218; SSE2-NEXT: pxor %xmm7, %xmm7 219; SSE2-NEXT: pcmpgtb %xmm2, %xmm7 220; SSE2-NEXT: movdqa %xmm7, %xmm2 221; SSE2-NEXT: pandn %xmm0, %xmm2 222; SSE2-NEXT: paddb %xmm0, %xmm0 223; SSE2-NEXT: pand %xmm7, %xmm0 224; SSE2-NEXT: por %xmm2, %xmm0 225; SSE2-NEXT: psllw $5, %xmm1 226; SSE2-NEXT: pxor %xmm7, %xmm7 227; SSE2-NEXT: pcmpgtb %xmm1, %xmm7 228; SSE2-NEXT: movdqa %xmm7, %xmm2 229; SSE2-NEXT: pandn %xmm4, %xmm2 230; SSE2-NEXT: pand %xmm5, %xmm7 231; SSE2-NEXT: por %xmm2, %xmm7 232; SSE2-NEXT: paddb %xmm1, %xmm1 233; SSE2-NEXT: pxor %xmm2, %xmm2 234; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 235; SSE2-NEXT: movdqa %xmm2, %xmm4 236; SSE2-NEXT: pandn %xmm7, %xmm4 237; SSE2-NEXT: psllw $2, %xmm7 238; SSE2-NEXT: pand %xmm6, %xmm2 239; SSE2-NEXT: pand %xmm7, %xmm2 240; SSE2-NEXT: por %xmm4, %xmm2 241; SSE2-NEXT: paddb %xmm1, %xmm1 242; SSE2-NEXT: pcmpgtb %xmm1, %xmm3 243; SSE2-NEXT: movdqa %xmm3, %xmm1 244; SSE2-NEXT: pandn %xmm2, %xmm1 245; SSE2-NEXT: paddb %xmm2, %xmm2 246; SSE2-NEXT: pand %xmm3, %xmm2 247; SSE2-NEXT: por %xmm1, %xmm2 248; SSE2-NEXT: movdqa %xmm2, %xmm1 249; SSE2-NEXT: retq 250; 251; SSE41-LABEL: uniform_shl_v32i8: 252; SSE41: # %bb.0: 253; SSE41-NEXT: movq {{.*#+}} xmm2 = [4,8,16,32,64,128,0,0,0,0,0,0,0,0,0,0] 254; SSE41-NEXT: movdqa %xmm2, %xmm3 255; SSE41-NEXT: pshufb %xmm0, %xmm3 256; SSE41-NEXT: pshufb %xmm1, %xmm2 257; SSE41-NEXT: movdqa %xmm3, %xmm0 258; SSE41-NEXT: movdqa %xmm2, %xmm1 259; SSE41-NEXT: retq 260; 261; AVX1-LABEL: uniform_shl_v32i8: 262; AVX1: # %bb.0: 263; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 264; AVX1-NEXT: vmovq {{.*#+}} xmm2 = [4,8,16,32,64,128,0,0,0,0,0,0,0,0,0,0] 265; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 266; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0 267; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 268; AVX1-NEXT: retq 269; 270; AVX2-LABEL: uniform_shl_v32i8: 271; AVX2: # %bb.0: 272; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0] 273; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 274; AVX2-NEXT: retq 275; 276; XOPAVX1-LABEL: uniform_shl_v32i8: 277; XOPAVX1: # %bb.0: 278; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 279; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4] 280; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm1 281; XOPAVX1-NEXT: vpshlb %xmm0, %xmm2, %xmm0 282; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 283; XOPAVX1-NEXT: retq 284; 285; XOPAVX2-LABEL: uniform_shl_v32i8: 286; XOPAVX2: # %bb.0: 287; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0] 288; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 289; XOPAVX2-NEXT: retq 290; 291; AVX512DQ-LABEL: uniform_shl_v32i8: 292; AVX512DQ: # %bb.0: 293; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0] 294; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0 295; AVX512DQ-NEXT: retq 296; 297; AVX512BW-LABEL: uniform_shl_v32i8: 298; AVX512BW: # %bb.0: 299; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0] 300; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0 301; AVX512BW-NEXT: retq 302 %shift = shl <32 x i8> <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>, %a 303 ret <32 x i8> %shift 304} 305 306define <32 x i8> @uniform_lshr_v32i8(<32 x i8> %a) nounwind { 307; SSE2-LABEL: uniform_lshr_v32i8: 308; SSE2: # %bb.0: 309; SSE2-NEXT: movdqa %xmm1, %xmm2 310; SSE2-NEXT: movdqa %xmm0, %xmm3 311; SSE2-NEXT: psllw $5, %xmm3 312; SSE2-NEXT: pxor %xmm1, %xmm1 313; SSE2-NEXT: pxor %xmm0, %xmm0 314; SSE2-NEXT: pcmpgtb %xmm3, %xmm0 315; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5] 316; SSE2-NEXT: pandn %xmm4, %xmm0 317; SSE2-NEXT: paddb %xmm3, %xmm3 318; SSE2-NEXT: pxor %xmm6, %xmm6 319; SSE2-NEXT: pcmpgtb %xmm3, %xmm6 320; SSE2-NEXT: movdqa %xmm6, %xmm7 321; SSE2-NEXT: pandn %xmm0, %xmm7 322; SSE2-NEXT: psrlw $2, %xmm0 323; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 324; SSE2-NEXT: pand %xmm5, %xmm6 325; SSE2-NEXT: pand %xmm0, %xmm6 326; SSE2-NEXT: por %xmm7, %xmm6 327; SSE2-NEXT: paddb %xmm3, %xmm3 328; SSE2-NEXT: pxor %xmm0, %xmm0 329; SSE2-NEXT: pcmpgtb %xmm3, %xmm0 330; SSE2-NEXT: movdqa %xmm0, %xmm7 331; SSE2-NEXT: pandn %xmm6, %xmm7 332; SSE2-NEXT: psrlw $1, %xmm6 333; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 334; SSE2-NEXT: pand %xmm3, %xmm0 335; SSE2-NEXT: pand %xmm6, %xmm0 336; SSE2-NEXT: por %xmm7, %xmm0 337; SSE2-NEXT: psllw $5, %xmm2 338; SSE2-NEXT: pxor %xmm6, %xmm6 339; SSE2-NEXT: pcmpgtb %xmm2, %xmm6 340; SSE2-NEXT: pandn %xmm4, %xmm6 341; SSE2-NEXT: paddb %xmm2, %xmm2 342; SSE2-NEXT: pxor %xmm4, %xmm4 343; SSE2-NEXT: pcmpgtb %xmm2, %xmm4 344; SSE2-NEXT: movdqa %xmm4, %xmm7 345; SSE2-NEXT: pandn %xmm6, %xmm7 346; SSE2-NEXT: psrlw $2, %xmm6 347; SSE2-NEXT: pand %xmm5, %xmm4 348; SSE2-NEXT: pand %xmm6, %xmm4 349; SSE2-NEXT: por %xmm7, %xmm4 350; SSE2-NEXT: paddb %xmm2, %xmm2 351; SSE2-NEXT: pcmpgtb %xmm2, %xmm1 352; SSE2-NEXT: movdqa %xmm1, %xmm2 353; SSE2-NEXT: pandn %xmm4, %xmm2 354; SSE2-NEXT: psrlw $1, %xmm4 355; SSE2-NEXT: pand %xmm3, %xmm1 356; SSE2-NEXT: pand %xmm4, %xmm1 357; SSE2-NEXT: por %xmm2, %xmm1 358; SSE2-NEXT: retq 359; 360; SSE41-LABEL: uniform_lshr_v32i8: 361; SSE41: # %bb.0: 362; SSE41-NEXT: movd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 363; SSE41-NEXT: movdqa %xmm2, %xmm3 364; SSE41-NEXT: pshufb %xmm0, %xmm3 365; SSE41-NEXT: pshufb %xmm1, %xmm2 366; SSE41-NEXT: movdqa %xmm3, %xmm0 367; SSE41-NEXT: movdqa %xmm2, %xmm1 368; SSE41-NEXT: retq 369; 370; AVX1-LABEL: uniform_lshr_v32i8: 371; AVX1: # %bb.0: 372; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 373; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 374; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 375; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0 376; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 377; AVX1-NEXT: retq 378; 379; AVX2-LABEL: uniform_lshr_v32i8: 380; AVX2: # %bb.0: 381; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0] 382; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 383; AVX2-NEXT: retq 384; 385; XOPAVX1-LABEL: uniform_lshr_v32i8: 386; XOPAVX1: # %bb.0: 387; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 388; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 389; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1 390; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5] 391; XOPAVX1-NEXT: vpshlb %xmm1, %xmm3, %xmm1 392; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm0 393; XOPAVX1-NEXT: vpshlb %xmm0, %xmm3, %xmm0 394; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 395; XOPAVX1-NEXT: retq 396; 397; XOPAVX2-LABEL: uniform_lshr_v32i8: 398; XOPAVX2: # %bb.0: 399; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0] 400; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 401; XOPAVX2-NEXT: retq 402; 403; AVX512DQ-LABEL: uniform_lshr_v32i8: 404; AVX512DQ: # %bb.0: 405; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0] 406; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0 407; AVX512DQ-NEXT: retq 408; 409; AVX512BW-LABEL: uniform_lshr_v32i8: 410; AVX512BW: # %bb.0: 411; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0] 412; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0 413; AVX512BW-NEXT: retq 414 %shift = lshr <32 x i8> <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>, %a 415 ret <32 x i8> %shift 416} 417 418define <32 x i8> @uniform_ashr_v32i8(<32 x i8> %a) nounwind { 419; SSE2-LABEL: uniform_ashr_v32i8: 420; SSE2: # %bb.0: 421; SSE2-NEXT: movdqa %xmm1, %xmm2 422; SSE2-NEXT: movdqa %xmm0, %xmm3 423; SSE2-NEXT: psllw $5, %xmm3 424; SSE2-NEXT: pxor %xmm1, %xmm1 425; SSE2-NEXT: pxor %xmm0, %xmm0 426; SSE2-NEXT: pcmpgtb %xmm3, %xmm0 427; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6] 428; SSE2-NEXT: pandn %xmm4, %xmm0 429; SSE2-NEXT: paddb %xmm3, %xmm3 430; SSE2-NEXT: pxor %xmm6, %xmm6 431; SSE2-NEXT: pcmpgtb %xmm3, %xmm6 432; SSE2-NEXT: movdqa %xmm6, %xmm7 433; SSE2-NEXT: pandn %xmm0, %xmm7 434; SSE2-NEXT: psrlw $2, %xmm0 435; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 436; SSE2-NEXT: pand %xmm5, %xmm6 437; SSE2-NEXT: pand %xmm0, %xmm6 438; SSE2-NEXT: por %xmm7, %xmm6 439; SSE2-NEXT: paddb %xmm3, %xmm3 440; SSE2-NEXT: pxor %xmm0, %xmm0 441; SSE2-NEXT: pcmpgtb %xmm3, %xmm0 442; SSE2-NEXT: movdqa %xmm0, %xmm7 443; SSE2-NEXT: pandn %xmm6, %xmm7 444; SSE2-NEXT: psrlw $1, %xmm6 445; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 446; SSE2-NEXT: pand %xmm3, %xmm0 447; SSE2-NEXT: pand %xmm6, %xmm0 448; SSE2-NEXT: por %xmm7, %xmm0 449; SSE2-NEXT: psllw $5, %xmm2 450; SSE2-NEXT: pxor %xmm6, %xmm6 451; SSE2-NEXT: pcmpgtb %xmm2, %xmm6 452; SSE2-NEXT: pandn %xmm4, %xmm6 453; SSE2-NEXT: paddb %xmm2, %xmm2 454; SSE2-NEXT: pxor %xmm4, %xmm4 455; SSE2-NEXT: pcmpgtb %xmm2, %xmm4 456; SSE2-NEXT: movdqa %xmm4, %xmm7 457; SSE2-NEXT: pandn %xmm6, %xmm7 458; SSE2-NEXT: psrlw $2, %xmm6 459; SSE2-NEXT: pand %xmm5, %xmm4 460; SSE2-NEXT: pand %xmm6, %xmm4 461; SSE2-NEXT: por %xmm7, %xmm4 462; SSE2-NEXT: paddb %xmm2, %xmm2 463; SSE2-NEXT: pcmpgtb %xmm2, %xmm1 464; SSE2-NEXT: movdqa %xmm1, %xmm2 465; SSE2-NEXT: pandn %xmm4, %xmm2 466; SSE2-NEXT: psrlw $1, %xmm4 467; SSE2-NEXT: pand %xmm3, %xmm1 468; SSE2-NEXT: pand %xmm4, %xmm1 469; SSE2-NEXT: por %xmm2, %xmm1 470; SSE2-NEXT: retq 471; 472; SSE41-LABEL: uniform_ashr_v32i8: 473; SSE41: # %bb.0: 474; SSE41-NEXT: movd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 475; SSE41-NEXT: movdqa %xmm2, %xmm3 476; SSE41-NEXT: pshufb %xmm0, %xmm3 477; SSE41-NEXT: pshufb %xmm1, %xmm2 478; SSE41-NEXT: movdqa %xmm3, %xmm0 479; SSE41-NEXT: movdqa %xmm2, %xmm1 480; SSE41-NEXT: retq 481; 482; AVX1-LABEL: uniform_ashr_v32i8: 483; AVX1: # %bb.0: 484; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 485; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 486; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 487; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0 488; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 489; AVX1-NEXT: retq 490; 491; AVX2-LABEL: uniform_ashr_v32i8: 492; AVX2: # %bb.0: 493; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0] 494; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 495; AVX2-NEXT: retq 496; 497; XOPAVX1-LABEL: uniform_ashr_v32i8: 498; XOPAVX1: # %bb.0: 499; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 500; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 501; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1 502; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6] 503; XOPAVX1-NEXT: vpshlb %xmm1, %xmm3, %xmm1 504; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm0 505; XOPAVX1-NEXT: vpshlb %xmm0, %xmm3, %xmm0 506; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 507; XOPAVX1-NEXT: retq 508; 509; XOPAVX2-LABEL: uniform_ashr_v32i8: 510; XOPAVX2: # %bb.0: 511; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0] 512; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 513; XOPAVX2-NEXT: retq 514; 515; AVX512DQ-LABEL: uniform_ashr_v32i8: 516; AVX512DQ: # %bb.0: 517; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0] 518; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0 519; AVX512DQ-NEXT: retq 520; 521; AVX512BW-LABEL: uniform_ashr_v32i8: 522; AVX512BW: # %bb.0: 523; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0] 524; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0 525; AVX512BW-NEXT: retq 526 %shift = ashr <32 x i8> <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a 527 ret <32 x i8> %shift 528} 529 530define <64 x i8> @uniform_shl_v64i8(<64 x i8> %a) nounwind { 531; SSE2-LABEL: uniform_shl_v64i8: 532; SSE2: # %bb.0: 533; SSE2-NEXT: movdqa %xmm1, %xmm4 534; SSE2-NEXT: movdqa %xmm0, %xmm1 535; SSE2-NEXT: psllw $5, %xmm1 536; SSE2-NEXT: pxor %xmm6, %xmm6 537; SSE2-NEXT: pxor %xmm9, %xmm9 538; SSE2-NEXT: pcmpgtb %xmm1, %xmm9 539; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] 540; SSE2-NEXT: movdqa %xmm9, %xmm0 541; SSE2-NEXT: pandn %xmm5, %xmm0 542; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112] 543; SSE2-NEXT: pand %xmm7, %xmm9 544; SSE2-NEXT: por %xmm0, %xmm9 545; SSE2-NEXT: paddb %xmm1, %xmm1 546; SSE2-NEXT: pxor %xmm0, %xmm0 547; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 548; SSE2-NEXT: movdqa %xmm0, %xmm10 549; SSE2-NEXT: pandn %xmm9, %xmm10 550; SSE2-NEXT: psllw $2, %xmm9 551; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 552; SSE2-NEXT: pand %xmm8, %xmm0 553; SSE2-NEXT: pand %xmm9, %xmm0 554; SSE2-NEXT: por %xmm10, %xmm0 555; SSE2-NEXT: paddb %xmm1, %xmm1 556; SSE2-NEXT: pxor %xmm9, %xmm9 557; SSE2-NEXT: pcmpgtb %xmm1, %xmm9 558; SSE2-NEXT: movdqa %xmm9, %xmm1 559; SSE2-NEXT: pandn %xmm0, %xmm1 560; SSE2-NEXT: paddb %xmm0, %xmm0 561; SSE2-NEXT: pand %xmm9, %xmm0 562; SSE2-NEXT: por %xmm1, %xmm0 563; SSE2-NEXT: psllw $5, %xmm4 564; SSE2-NEXT: pxor %xmm9, %xmm9 565; SSE2-NEXT: pcmpgtb %xmm4, %xmm9 566; SSE2-NEXT: movdqa %xmm9, %xmm1 567; SSE2-NEXT: pandn %xmm5, %xmm1 568; SSE2-NEXT: pand %xmm7, %xmm9 569; SSE2-NEXT: por %xmm1, %xmm9 570; SSE2-NEXT: paddb %xmm4, %xmm4 571; SSE2-NEXT: pxor %xmm1, %xmm1 572; SSE2-NEXT: pcmpgtb %xmm4, %xmm1 573; SSE2-NEXT: movdqa %xmm1, %xmm10 574; SSE2-NEXT: pandn %xmm9, %xmm10 575; SSE2-NEXT: psllw $2, %xmm9 576; SSE2-NEXT: pand %xmm8, %xmm1 577; SSE2-NEXT: pand %xmm9, %xmm1 578; SSE2-NEXT: por %xmm10, %xmm1 579; SSE2-NEXT: paddb %xmm4, %xmm4 580; SSE2-NEXT: pxor %xmm9, %xmm9 581; SSE2-NEXT: pcmpgtb %xmm4, %xmm9 582; SSE2-NEXT: movdqa %xmm9, %xmm4 583; SSE2-NEXT: pandn %xmm1, %xmm4 584; SSE2-NEXT: paddb %xmm1, %xmm1 585; SSE2-NEXT: pand %xmm9, %xmm1 586; SSE2-NEXT: por %xmm4, %xmm1 587; SSE2-NEXT: psllw $5, %xmm2 588; SSE2-NEXT: pxor %xmm9, %xmm9 589; SSE2-NEXT: pcmpgtb %xmm2, %xmm9 590; SSE2-NEXT: movdqa %xmm9, %xmm4 591; SSE2-NEXT: pandn %xmm5, %xmm4 592; SSE2-NEXT: pand %xmm7, %xmm9 593; SSE2-NEXT: por %xmm4, %xmm9 594; SSE2-NEXT: paddb %xmm2, %xmm2 595; SSE2-NEXT: pxor %xmm4, %xmm4 596; SSE2-NEXT: pcmpgtb %xmm2, %xmm4 597; SSE2-NEXT: movdqa %xmm4, %xmm10 598; SSE2-NEXT: pandn %xmm9, %xmm10 599; SSE2-NEXT: psllw $2, %xmm9 600; SSE2-NEXT: pand %xmm8, %xmm4 601; SSE2-NEXT: pand %xmm9, %xmm4 602; SSE2-NEXT: por %xmm10, %xmm4 603; SSE2-NEXT: paddb %xmm2, %xmm2 604; SSE2-NEXT: pxor %xmm9, %xmm9 605; SSE2-NEXT: pcmpgtb %xmm2, %xmm9 606; SSE2-NEXT: movdqa %xmm9, %xmm2 607; SSE2-NEXT: pandn %xmm4, %xmm2 608; SSE2-NEXT: paddb %xmm4, %xmm4 609; SSE2-NEXT: pand %xmm9, %xmm4 610; SSE2-NEXT: por %xmm2, %xmm4 611; SSE2-NEXT: psllw $5, %xmm3 612; SSE2-NEXT: pxor %xmm2, %xmm2 613; SSE2-NEXT: pcmpgtb %xmm3, %xmm2 614; SSE2-NEXT: movdqa %xmm2, %xmm9 615; SSE2-NEXT: pandn %xmm5, %xmm9 616; SSE2-NEXT: pand %xmm7, %xmm2 617; SSE2-NEXT: por %xmm9, %xmm2 618; SSE2-NEXT: paddb %xmm3, %xmm3 619; SSE2-NEXT: pxor %xmm5, %xmm5 620; SSE2-NEXT: pcmpgtb %xmm3, %xmm5 621; SSE2-NEXT: movdqa %xmm5, %xmm7 622; SSE2-NEXT: pandn %xmm2, %xmm7 623; SSE2-NEXT: psllw $2, %xmm2 624; SSE2-NEXT: pand %xmm8, %xmm5 625; SSE2-NEXT: pand %xmm2, %xmm5 626; SSE2-NEXT: por %xmm7, %xmm5 627; SSE2-NEXT: paddb %xmm3, %xmm3 628; SSE2-NEXT: pcmpgtb %xmm3, %xmm6 629; SSE2-NEXT: movdqa %xmm6, %xmm2 630; SSE2-NEXT: pandn %xmm5, %xmm2 631; SSE2-NEXT: paddb %xmm5, %xmm5 632; SSE2-NEXT: pand %xmm6, %xmm5 633; SSE2-NEXT: por %xmm2, %xmm5 634; SSE2-NEXT: movdqa %xmm4, %xmm2 635; SSE2-NEXT: movdqa %xmm5, %xmm3 636; SSE2-NEXT: retq 637; 638; SSE41-LABEL: uniform_shl_v64i8: 639; SSE41: # %bb.0: 640; SSE41-NEXT: movq {{.*#+}} xmm4 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0] 641; SSE41-NEXT: movdqa %xmm4, %xmm5 642; SSE41-NEXT: pshufb %xmm0, %xmm5 643; SSE41-NEXT: movdqa %xmm4, %xmm6 644; SSE41-NEXT: pshufb %xmm1, %xmm6 645; SSE41-NEXT: movdqa %xmm4, %xmm7 646; SSE41-NEXT: pshufb %xmm2, %xmm7 647; SSE41-NEXT: pshufb %xmm3, %xmm4 648; SSE41-NEXT: movdqa %xmm5, %xmm0 649; SSE41-NEXT: movdqa %xmm6, %xmm1 650; SSE41-NEXT: movdqa %xmm7, %xmm2 651; SSE41-NEXT: movdqa %xmm4, %xmm3 652; SSE41-NEXT: retq 653; 654; AVX1-LABEL: uniform_shl_v64i8: 655; AVX1: # %bb.0: 656; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 657; AVX1-NEXT: vmovq {{.*#+}} xmm3 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0] 658; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 659; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0 660; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 661; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 662; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 663; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1 664; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 665; AVX1-NEXT: retq 666; 667; AVX2-LABEL: uniform_shl_v64i8: 668; AVX2: # %bb.0: 669; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128] 670; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 671; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 672; AVX2-NEXT: retq 673; 674; XOPAVX1-LABEL: uniform_shl_v64i8: 675; XOPAVX1: # %bb.0: 676; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 677; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] 678; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2 679; XOPAVX1-NEXT: vpshlb %xmm0, %xmm3, %xmm0 680; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 681; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 682; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2 683; XOPAVX1-NEXT: vpshlb %xmm1, %xmm3, %xmm1 684; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 685; XOPAVX1-NEXT: retq 686; 687; XOPAVX2-LABEL: uniform_shl_v64i8: 688; XOPAVX2: # %bb.0: 689; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128] 690; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 691; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 692; XOPAVX2-NEXT: retq 693; 694; AVX512DQ-LABEL: uniform_shl_v64i8: 695; AVX512DQ: # %bb.0: 696; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1 697; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128] 698; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1 699; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0 700; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 701; AVX512DQ-NEXT: retq 702; 703; AVX512BW-LABEL: uniform_shl_v64i8: 704; AVX512BW: # %bb.0: 705; AVX512BW-NEXT: vpbroadcastq {{.*#+}} zmm1 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128] 706; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 707; AVX512BW-NEXT: retq 708 %shift = shl <64 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>, %a 709 ret <64 x i8> %shift 710} 711 712define <64 x i8> @uniform_lshr_v64i8(<64 x i8> %a) nounwind { 713; SSE2-LABEL: uniform_lshr_v64i8: 714; SSE2: # %bb.0: 715; SSE2-NEXT: movdqa %xmm3, %xmm4 716; SSE2-NEXT: movdqa %xmm1, %xmm5 717; SSE2-NEXT: movdqa %xmm0, %xmm1 718; SSE2-NEXT: psllw $5, %xmm1 719; SSE2-NEXT: pxor %xmm3, %xmm3 720; SSE2-NEXT: pxor %xmm0, %xmm0 721; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 722; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 723; SSE2-NEXT: pandn %xmm6, %xmm0 724; SSE2-NEXT: paddb %xmm1, %xmm1 725; SSE2-NEXT: pxor %xmm8, %xmm8 726; SSE2-NEXT: pcmpgtb %xmm1, %xmm8 727; SSE2-NEXT: pandn %xmm0, %xmm8 728; SSE2-NEXT: paddb %xmm1, %xmm1 729; SSE2-NEXT: pxor %xmm0, %xmm0 730; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 731; SSE2-NEXT: movdqa %xmm0, %xmm1 732; SSE2-NEXT: pandn %xmm8, %xmm1 733; SSE2-NEXT: psrlw $1, %xmm8 734; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 735; SSE2-NEXT: pand %xmm7, %xmm0 736; SSE2-NEXT: pand %xmm8, %xmm0 737; SSE2-NEXT: por %xmm1, %xmm0 738; SSE2-NEXT: psllw $5, %xmm5 739; SSE2-NEXT: pxor %xmm1, %xmm1 740; SSE2-NEXT: pcmpgtb %xmm5, %xmm1 741; SSE2-NEXT: pandn %xmm6, %xmm1 742; SSE2-NEXT: paddb %xmm5, %xmm5 743; SSE2-NEXT: pxor %xmm8, %xmm8 744; SSE2-NEXT: pcmpgtb %xmm5, %xmm8 745; SSE2-NEXT: pandn %xmm1, %xmm8 746; SSE2-NEXT: paddb %xmm5, %xmm5 747; SSE2-NEXT: pxor %xmm1, %xmm1 748; SSE2-NEXT: pcmpgtb %xmm5, %xmm1 749; SSE2-NEXT: movdqa %xmm1, %xmm5 750; SSE2-NEXT: pandn %xmm8, %xmm5 751; SSE2-NEXT: psrlw $1, %xmm8 752; SSE2-NEXT: pand %xmm7, %xmm1 753; SSE2-NEXT: pand %xmm8, %xmm1 754; SSE2-NEXT: por %xmm5, %xmm1 755; SSE2-NEXT: psllw $5, %xmm2 756; SSE2-NEXT: pxor %xmm5, %xmm5 757; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 758; SSE2-NEXT: pandn %xmm6, %xmm5 759; SSE2-NEXT: paddb %xmm2, %xmm2 760; SSE2-NEXT: pxor %xmm8, %xmm8 761; SSE2-NEXT: pcmpgtb %xmm2, %xmm8 762; SSE2-NEXT: pandn %xmm5, %xmm8 763; SSE2-NEXT: paddb %xmm2, %xmm2 764; SSE2-NEXT: pxor %xmm5, %xmm5 765; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 766; SSE2-NEXT: movdqa %xmm5, %xmm2 767; SSE2-NEXT: pandn %xmm8, %xmm2 768; SSE2-NEXT: psrlw $1, %xmm8 769; SSE2-NEXT: pand %xmm7, %xmm5 770; SSE2-NEXT: pand %xmm8, %xmm5 771; SSE2-NEXT: por %xmm2, %xmm5 772; SSE2-NEXT: psllw $5, %xmm4 773; SSE2-NEXT: pxor %xmm2, %xmm2 774; SSE2-NEXT: pcmpgtb %xmm4, %xmm2 775; SSE2-NEXT: pandn %xmm6, %xmm2 776; SSE2-NEXT: paddb %xmm4, %xmm4 777; SSE2-NEXT: pxor %xmm6, %xmm6 778; SSE2-NEXT: pcmpgtb %xmm4, %xmm6 779; SSE2-NEXT: pandn %xmm2, %xmm6 780; SSE2-NEXT: paddb %xmm4, %xmm4 781; SSE2-NEXT: pcmpgtb %xmm4, %xmm3 782; SSE2-NEXT: movdqa %xmm3, %xmm2 783; SSE2-NEXT: pandn %xmm6, %xmm2 784; SSE2-NEXT: psrlw $1, %xmm6 785; SSE2-NEXT: pand %xmm7, %xmm3 786; SSE2-NEXT: pand %xmm6, %xmm3 787; SSE2-NEXT: por %xmm2, %xmm3 788; SSE2-NEXT: movdqa %xmm5, %xmm2 789; SSE2-NEXT: retq 790; 791; SSE41-LABEL: uniform_lshr_v64i8: 792; SSE41: # %bb.0: 793; SSE41-NEXT: pmovsxbq {{.*#+}} xmm4 = [1,0] 794; SSE41-NEXT: movdqa %xmm4, %xmm5 795; SSE41-NEXT: pshufb %xmm0, %xmm5 796; SSE41-NEXT: movdqa %xmm4, %xmm6 797; SSE41-NEXT: pshufb %xmm1, %xmm6 798; SSE41-NEXT: movdqa %xmm4, %xmm7 799; SSE41-NEXT: pshufb %xmm2, %xmm7 800; SSE41-NEXT: pshufb %xmm3, %xmm4 801; SSE41-NEXT: movdqa %xmm5, %xmm0 802; SSE41-NEXT: movdqa %xmm6, %xmm1 803; SSE41-NEXT: movdqa %xmm7, %xmm2 804; SSE41-NEXT: movdqa %xmm4, %xmm3 805; SSE41-NEXT: retq 806; 807; AVX1-LABEL: uniform_lshr_v64i8: 808; AVX1: # %bb.0: 809; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 810; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm3 = [1,0] 811; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 812; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0 813; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 814; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 815; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 816; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1 817; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 818; AVX1-NEXT: retq 819; 820; AVX2-LABEL: uniform_lshr_v64i8: 821; AVX2: # %bb.0: 822; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0] 823; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 824; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 825; AVX2-NEXT: retq 826; 827; XOPAVX1-LABEL: uniform_lshr_v64i8: 828; XOPAVX1: # %bb.0: 829; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 830; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 831; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2 832; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 833; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2 834; XOPAVX1-NEXT: vpsubb %xmm0, %xmm3, %xmm0 835; XOPAVX1-NEXT: vpshlb %xmm0, %xmm4, %xmm0 836; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 837; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 838; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2 839; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2 840; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1 841; XOPAVX1-NEXT: vpshlb %xmm1, %xmm4, %xmm1 842; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 843; XOPAVX1-NEXT: retq 844; 845; XOPAVX2-LABEL: uniform_lshr_v64i8: 846; XOPAVX2: # %bb.0: 847; XOPAVX2-NEXT: vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0] 848; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 849; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 850; XOPAVX2-NEXT: retq 851; 852; AVX512DQ-LABEL: uniform_lshr_v64i8: 853; AVX512DQ: # %bb.0: 854; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1 855; AVX512DQ-NEXT: vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0] 856; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1 857; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0 858; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 859; AVX512DQ-NEXT: retq 860; 861; AVX512BW-LABEL: uniform_lshr_v64i8: 862; AVX512BW: # %bb.0: 863; AVX512BW-NEXT: vpbroadcastq {{.*#+}} zmm1 = [1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0] 864; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 865; AVX512BW-NEXT: retq 866 %shift = lshr <64 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, %a 867 ret <64 x i8> %shift 868} 869 870define <64 x i8> @uniform_ashr_v64i8(<64 x i8> %a) nounwind { 871; SSE2-LABEL: uniform_ashr_v64i8: 872; SSE2: # %bb.0: 873; SSE2-NEXT: movdqa %xmm3, %xmm4 874; SSE2-NEXT: movdqa %xmm1, %xmm5 875; SSE2-NEXT: movdqa %xmm0, %xmm1 876; SSE2-NEXT: psllw $5, %xmm1 877; SSE2-NEXT: pxor %xmm3, %xmm3 878; SSE2-NEXT: pxor %xmm0, %xmm0 879; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 880; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 881; SSE2-NEXT: pandn %xmm6, %xmm0 882; SSE2-NEXT: paddb %xmm1, %xmm1 883; SSE2-NEXT: pxor %xmm8, %xmm8 884; SSE2-NEXT: pcmpgtb %xmm1, %xmm8 885; SSE2-NEXT: pandn %xmm0, %xmm8 886; SSE2-NEXT: paddb %xmm1, %xmm1 887; SSE2-NEXT: pxor %xmm0, %xmm0 888; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 889; SSE2-NEXT: movdqa %xmm0, %xmm1 890; SSE2-NEXT: pandn %xmm8, %xmm1 891; SSE2-NEXT: psrlw $1, %xmm8 892; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 893; SSE2-NEXT: pand %xmm7, %xmm0 894; SSE2-NEXT: pand %xmm8, %xmm0 895; SSE2-NEXT: por %xmm1, %xmm0 896; SSE2-NEXT: psllw $5, %xmm5 897; SSE2-NEXT: pxor %xmm1, %xmm1 898; SSE2-NEXT: pcmpgtb %xmm5, %xmm1 899; SSE2-NEXT: pandn %xmm6, %xmm1 900; SSE2-NEXT: paddb %xmm5, %xmm5 901; SSE2-NEXT: pxor %xmm8, %xmm8 902; SSE2-NEXT: pcmpgtb %xmm5, %xmm8 903; SSE2-NEXT: pandn %xmm1, %xmm8 904; SSE2-NEXT: paddb %xmm5, %xmm5 905; SSE2-NEXT: pxor %xmm1, %xmm1 906; SSE2-NEXT: pcmpgtb %xmm5, %xmm1 907; SSE2-NEXT: movdqa %xmm1, %xmm5 908; SSE2-NEXT: pandn %xmm8, %xmm5 909; SSE2-NEXT: psrlw $1, %xmm8 910; SSE2-NEXT: pand %xmm7, %xmm1 911; SSE2-NEXT: pand %xmm8, %xmm1 912; SSE2-NEXT: por %xmm5, %xmm1 913; SSE2-NEXT: psllw $5, %xmm2 914; SSE2-NEXT: pxor %xmm5, %xmm5 915; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 916; SSE2-NEXT: pandn %xmm6, %xmm5 917; SSE2-NEXT: paddb %xmm2, %xmm2 918; SSE2-NEXT: pxor %xmm8, %xmm8 919; SSE2-NEXT: pcmpgtb %xmm2, %xmm8 920; SSE2-NEXT: pandn %xmm5, %xmm8 921; SSE2-NEXT: paddb %xmm2, %xmm2 922; SSE2-NEXT: pxor %xmm5, %xmm5 923; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 924; SSE2-NEXT: movdqa %xmm5, %xmm2 925; SSE2-NEXT: pandn %xmm8, %xmm2 926; SSE2-NEXT: psrlw $1, %xmm8 927; SSE2-NEXT: pand %xmm7, %xmm5 928; SSE2-NEXT: pand %xmm8, %xmm5 929; SSE2-NEXT: por %xmm2, %xmm5 930; SSE2-NEXT: psllw $5, %xmm4 931; SSE2-NEXT: pxor %xmm2, %xmm2 932; SSE2-NEXT: pcmpgtb %xmm4, %xmm2 933; SSE2-NEXT: pandn %xmm6, %xmm2 934; SSE2-NEXT: paddb %xmm4, %xmm4 935; SSE2-NEXT: pxor %xmm6, %xmm6 936; SSE2-NEXT: pcmpgtb %xmm4, %xmm6 937; SSE2-NEXT: pandn %xmm2, %xmm6 938; SSE2-NEXT: paddb %xmm4, %xmm4 939; SSE2-NEXT: pcmpgtb %xmm4, %xmm3 940; SSE2-NEXT: movdqa %xmm3, %xmm2 941; SSE2-NEXT: pandn %xmm6, %xmm2 942; SSE2-NEXT: psrlw $1, %xmm6 943; SSE2-NEXT: pand %xmm7, %xmm3 944; SSE2-NEXT: pand %xmm6, %xmm3 945; SSE2-NEXT: por %xmm2, %xmm3 946; SSE2-NEXT: movdqa %xmm5, %xmm2 947; SSE2-NEXT: retq 948; 949; SSE41-LABEL: uniform_ashr_v64i8: 950; SSE41: # %bb.0: 951; SSE41-NEXT: movd {{.*#+}} xmm4 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 952; SSE41-NEXT: movdqa %xmm4, %xmm5 953; SSE41-NEXT: pshufb %xmm0, %xmm5 954; SSE41-NEXT: movdqa %xmm4, %xmm6 955; SSE41-NEXT: pshufb %xmm1, %xmm6 956; SSE41-NEXT: movdqa %xmm4, %xmm7 957; SSE41-NEXT: pshufb %xmm2, %xmm7 958; SSE41-NEXT: pshufb %xmm3, %xmm4 959; SSE41-NEXT: movdqa %xmm5, %xmm0 960; SSE41-NEXT: movdqa %xmm6, %xmm1 961; SSE41-NEXT: movdqa %xmm7, %xmm2 962; SSE41-NEXT: movdqa %xmm4, %xmm3 963; SSE41-NEXT: retq 964; 965; AVX1-LABEL: uniform_ashr_v64i8: 966; AVX1: # %bb.0: 967; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 968; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 969; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 970; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0 971; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 972; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 973; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 974; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1 975; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 976; AVX1-NEXT: retq 977; 978; AVX2-LABEL: uniform_ashr_v64i8: 979; AVX2: # %bb.0: 980; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0] 981; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 982; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 983; AVX2-NEXT: retq 984; 985; XOPAVX1-LABEL: uniform_ashr_v64i8: 986; XOPAVX1: # %bb.0: 987; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 988; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 989; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2 990; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 991; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2 992; XOPAVX1-NEXT: vpsubb %xmm0, %xmm3, %xmm0 993; XOPAVX1-NEXT: vpshlb %xmm0, %xmm4, %xmm0 994; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 995; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 996; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2 997; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2 998; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1 999; XOPAVX1-NEXT: vpshlb %xmm1, %xmm4, %xmm1 1000; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1001; XOPAVX1-NEXT: retq 1002; 1003; XOPAVX2-LABEL: uniform_ashr_v64i8: 1004; XOPAVX2: # %bb.0: 1005; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0] 1006; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1007; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1008; XOPAVX2-NEXT: retq 1009; 1010; AVX512DQ-LABEL: uniform_ashr_v64i8: 1011; AVX512DQ: # %bb.0: 1012; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1013; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0] 1014; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1015; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1016; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1017; AVX512DQ-NEXT: retq 1018; 1019; AVX512BW-LABEL: uniform_ashr_v64i8: 1020; AVX512BW: # %bb.0: 1021; AVX512BW-NEXT: vpbroadcastq {{.*#+}} zmm1 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0] 1022; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 1023; AVX512BW-NEXT: retq 1024 %shift = ashr <64 x i8> <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a 1025 ret <64 x i8> %shift 1026} 1027 1028; Test where each 128-bit lane has a different value 1029 1030define <32 x i8> @perlane_shl_v32i8(<32 x i8> %a) nounwind { 1031; SSE2-LABEL: perlane_shl_v32i8: 1032; SSE2: # %bb.0: 1033; SSE2-NEXT: movdqa %xmm1, %xmm2 1034; SSE2-NEXT: psllw $5, %xmm2 1035; SSE2-NEXT: pxor %xmm3, %xmm3 1036; SSE2-NEXT: pxor %xmm5, %xmm5 1037; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 1038; SSE2-NEXT: movdqa %xmm5, %xmm1 1039; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1040; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 1041; SSE2-NEXT: por %xmm1, %xmm5 1042; SSE2-NEXT: paddb %xmm2, %xmm2 1043; SSE2-NEXT: pxor %xmm1, %xmm1 1044; SSE2-NEXT: pcmpgtb %xmm2, %xmm1 1045; SSE2-NEXT: movdqa %xmm1, %xmm6 1046; SSE2-NEXT: pandn %xmm5, %xmm6 1047; SSE2-NEXT: psllw $2, %xmm5 1048; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 1049; SSE2-NEXT: pand %xmm4, %xmm1 1050; SSE2-NEXT: pand %xmm5, %xmm1 1051; SSE2-NEXT: por %xmm6, %xmm1 1052; SSE2-NEXT: paddb %xmm2, %xmm2 1053; SSE2-NEXT: pxor %xmm5, %xmm5 1054; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 1055; SSE2-NEXT: movdqa %xmm5, %xmm2 1056; SSE2-NEXT: pandn %xmm1, %xmm2 1057; SSE2-NEXT: paddb %xmm1, %xmm1 1058; SSE2-NEXT: pand %xmm5, %xmm1 1059; SSE2-NEXT: por %xmm2, %xmm1 1060; SSE2-NEXT: psllw $5, %xmm0 1061; SSE2-NEXT: pxor %xmm2, %xmm2 1062; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1063; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1064; SSE2-NEXT: pand %xmm2, %xmm5 1065; SSE2-NEXT: paddb %xmm2, %xmm5 1066; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 1067; SSE2-NEXT: psubb %xmm2, %xmm5 1068; SSE2-NEXT: paddb %xmm0, %xmm0 1069; SSE2-NEXT: pxor %xmm2, %xmm2 1070; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1071; SSE2-NEXT: movdqa %xmm2, %xmm6 1072; SSE2-NEXT: pandn %xmm5, %xmm6 1073; SSE2-NEXT: psllw $2, %xmm5 1074; SSE2-NEXT: pand %xmm4, %xmm2 1075; SSE2-NEXT: pand %xmm5, %xmm2 1076; SSE2-NEXT: por %xmm6, %xmm2 1077; SSE2-NEXT: paddb %xmm0, %xmm0 1078; SSE2-NEXT: pcmpgtb %xmm0, %xmm3 1079; SSE2-NEXT: movdqa %xmm3, %xmm0 1080; SSE2-NEXT: pandn %xmm2, %xmm0 1081; SSE2-NEXT: paddb %xmm2, %xmm2 1082; SSE2-NEXT: pand %xmm3, %xmm2 1083; SSE2-NEXT: por %xmm0, %xmm2 1084; SSE2-NEXT: movdqa %xmm2, %xmm0 1085; SSE2-NEXT: retq 1086; 1087; SSE41-LABEL: perlane_shl_v32i8: 1088; SSE41: # %bb.0: 1089; SSE41-NEXT: movq {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0] 1090; SSE41-NEXT: pshufb %xmm0, %xmm2 1091; SSE41-NEXT: movq {{.*#+}} xmm3 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0] 1092; SSE41-NEXT: pshufb %xmm1, %xmm3 1093; SSE41-NEXT: movdqa %xmm2, %xmm0 1094; SSE41-NEXT: movdqa %xmm3, %xmm1 1095; SSE41-NEXT: retq 1096; 1097; AVX1-LABEL: perlane_shl_v32i8: 1098; AVX1: # %bb.0: 1099; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1100; AVX1-NEXT: vmovq {{.*#+}} xmm2 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0] 1101; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 1102; AVX1-NEXT: vmovq {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0] 1103; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0 1104; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1105; AVX1-NEXT: retq 1106; 1107; AVX2-LABEL: perlane_shl_v32i8: 1108; AVX2: # %bb.0: 1109; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u] 1110; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1111; AVX2-NEXT: retq 1112; 1113; XOPAVX1-LABEL: perlane_shl_v32i8: 1114; XOPAVX1: # %bb.0: 1115; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1116; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1117; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1118; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1119; XOPAVX1-NEXT: retq 1120; 1121; XOPAVX2-LABEL: perlane_shl_v32i8: 1122; XOPAVX2: # %bb.0: 1123; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u] 1124; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1125; XOPAVX2-NEXT: retq 1126; 1127; AVX512DQ-LABEL: perlane_shl_v32i8: 1128; AVX512DQ: # %bb.0: 1129; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u] 1130; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1131; AVX512DQ-NEXT: retq 1132; 1133; AVX512BW-LABEL: perlane_shl_v32i8: 1134; AVX512BW: # %bb.0: 1135; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u] 1136; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1137; AVX512BW-NEXT: retq 1138 %shift = shl <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a 1139 ret <32 x i8> %shift 1140} 1141 1142define <32 x i8> @perlane_lshr_v32i8(<32 x i8> %a) nounwind { 1143; SSE2-LABEL: perlane_lshr_v32i8: 1144; SSE2: # %bb.0: 1145; SSE2-NEXT: psllw $5, %xmm1 1146; SSE2-NEXT: pxor %xmm3, %xmm3 1147; SSE2-NEXT: pcmpgtb %xmm1, %xmm3 1148; SSE2-NEXT: movdqa %xmm1, %xmm4 1149; SSE2-NEXT: paddb %xmm1, %xmm4 1150; SSE2-NEXT: pxor %xmm2, %xmm2 1151; SSE2-NEXT: pxor %xmm1, %xmm1 1152; SSE2-NEXT: pcmpgtb %xmm4, %xmm1 1153; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 1154; SSE2-NEXT: movdqa %xmm1, %xmm5 1155; SSE2-NEXT: pandn %xmm3, %xmm5 1156; SSE2-NEXT: psrlw $2, %xmm3 1157; SSE2-NEXT: pand %xmm1, %xmm3 1158; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 1159; SSE2-NEXT: por %xmm5, %xmm3 1160; SSE2-NEXT: paddb %xmm4, %xmm4 1161; SSE2-NEXT: pxor %xmm1, %xmm1 1162; SSE2-NEXT: pcmpgtb %xmm4, %xmm1 1163; SSE2-NEXT: movdqa %xmm1, %xmm4 1164; SSE2-NEXT: pandn %xmm3, %xmm4 1165; SSE2-NEXT: psrlw $1, %xmm3 1166; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 1167; SSE2-NEXT: pand %xmm5, %xmm1 1168; SSE2-NEXT: pand %xmm3, %xmm1 1169; SSE2-NEXT: por %xmm4, %xmm1 1170; SSE2-NEXT: psllw $5, %xmm0 1171; SSE2-NEXT: pxor %xmm3, %xmm3 1172; SSE2-NEXT: pcmpgtb %xmm0, %xmm3 1173; SSE2-NEXT: paddb %xmm0, %xmm0 1174; SSE2-NEXT: pxor %xmm4, %xmm4 1175; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 1176; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 1177; SSE2-NEXT: pandn %xmm3, %xmm4 1178; SSE2-NEXT: paddb %xmm0, %xmm0 1179; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1180; SSE2-NEXT: movdqa %xmm2, %xmm0 1181; SSE2-NEXT: pandn %xmm4, %xmm0 1182; SSE2-NEXT: psrlw $1, %xmm4 1183; SSE2-NEXT: pand %xmm5, %xmm2 1184; SSE2-NEXT: pand %xmm4, %xmm2 1185; SSE2-NEXT: por %xmm0, %xmm2 1186; SSE2-NEXT: movdqa %xmm2, %xmm0 1187; SSE2-NEXT: retq 1188; 1189; SSE41-LABEL: perlane_lshr_v32i8: 1190; SSE41: # %bb.0: 1191; SSE41-NEXT: movd {{.*#+}} xmm2 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 1192; SSE41-NEXT: pshufb %xmm0, %xmm2 1193; SSE41-NEXT: movd {{.*#+}} xmm3 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1194; SSE41-NEXT: pshufb %xmm1, %xmm3 1195; SSE41-NEXT: movdqa %xmm2, %xmm0 1196; SSE41-NEXT: movdqa %xmm3, %xmm1 1197; SSE41-NEXT: retq 1198; 1199; AVX1-LABEL: perlane_lshr_v32i8: 1200; AVX1: # %bb.0: 1201; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1202; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1203; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 1204; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 1205; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0 1206; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1207; AVX1-NEXT: retq 1208; 1209; AVX2-LABEL: perlane_lshr_v32i8: 1210; AVX2: # %bb.0: 1211; AVX2-NEXT: vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0] 1212; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1213; AVX2-NEXT: retq 1214; 1215; XOPAVX1-LABEL: perlane_lshr_v32i8: 1216; XOPAVX1: # %bb.0: 1217; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1218; XOPAVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm2 1219; XOPAVX1-NEXT: vpshlb %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 1220; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1221; XOPAVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm0 1222; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1223; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 1224; XOPAVX1-NEXT: retq 1225; 1226; XOPAVX2-LABEL: perlane_lshr_v32i8: 1227; XOPAVX2: # %bb.0: 1228; XOPAVX2-NEXT: vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0] 1229; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1230; XOPAVX2-NEXT: retq 1231; 1232; AVX512DQ-LABEL: perlane_lshr_v32i8: 1233; AVX512DQ: # %bb.0: 1234; AVX512DQ-NEXT: vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0] 1235; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1236; AVX512DQ-NEXT: retq 1237; 1238; AVX512BW-LABEL: perlane_lshr_v32i8: 1239; AVX512BW: # %bb.0: 1240; AVX512BW-NEXT: vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0] 1241; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1242; AVX512BW-NEXT: retq 1243 %shift = lshr <32 x i8> <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 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>, %a 1244 ret <32 x i8> %shift 1245} 1246 1247define <32 x i8> @perlane_ashr_v32i8(<32 x i8> %a) nounwind { 1248; SSE2-LABEL: perlane_ashr_v32i8: 1249; SSE2: # %bb.0: 1250; SSE2-NEXT: psllw $5, %xmm0 1251; SSE2-NEXT: pxor %xmm4, %xmm4 1252; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 1253; SSE2-NEXT: movdqa %xmm0, %xmm5 1254; SSE2-NEXT: paddb %xmm0, %xmm5 1255; SSE2-NEXT: pxor %xmm2, %xmm2 1256; SSE2-NEXT: pxor %xmm6, %xmm6 1257; SSE2-NEXT: pcmpgtb %xmm5, %xmm6 1258; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 1259; SSE2-NEXT: movdqa %xmm6, %xmm0 1260; SSE2-NEXT: pandn %xmm4, %xmm0 1261; SSE2-NEXT: psrlw $2, %xmm4 1262; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 1263; SSE2-NEXT: pand %xmm3, %xmm6 1264; SSE2-NEXT: pand %xmm4, %xmm6 1265; SSE2-NEXT: por %xmm0, %xmm6 1266; SSE2-NEXT: paddb %xmm5, %xmm5 1267; SSE2-NEXT: pxor %xmm0, %xmm0 1268; SSE2-NEXT: pcmpgtb %xmm5, %xmm0 1269; SSE2-NEXT: movdqa %xmm0, %xmm5 1270; SSE2-NEXT: pandn %xmm6, %xmm5 1271; SSE2-NEXT: psrlw $1, %xmm6 1272; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 1273; SSE2-NEXT: pand %xmm4, %xmm0 1274; SSE2-NEXT: pand %xmm6, %xmm0 1275; SSE2-NEXT: por %xmm5, %xmm0 1276; SSE2-NEXT: psllw $5, %xmm1 1277; SSE2-NEXT: pxor %xmm5, %xmm5 1278; SSE2-NEXT: pcmpgtb %xmm1, %xmm5 1279; SSE2-NEXT: paddb %xmm1, %xmm1 1280; SSE2-NEXT: pxor %xmm6, %xmm6 1281; SSE2-NEXT: pcmpgtb %xmm1, %xmm6 1282; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 1283; SSE2-NEXT: movdqa %xmm6, %xmm7 1284; SSE2-NEXT: pandn %xmm5, %xmm7 1285; SSE2-NEXT: psrlw $2, %xmm5 1286; SSE2-NEXT: pand %xmm3, %xmm6 1287; SSE2-NEXT: pand %xmm5, %xmm6 1288; SSE2-NEXT: por %xmm7, %xmm6 1289; SSE2-NEXT: paddb %xmm1, %xmm1 1290; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1291; SSE2-NEXT: movdqa %xmm2, %xmm1 1292; SSE2-NEXT: pandn %xmm6, %xmm1 1293; SSE2-NEXT: psrlw $1, %xmm6 1294; SSE2-NEXT: pand %xmm4, %xmm2 1295; SSE2-NEXT: pand %xmm6, %xmm2 1296; SSE2-NEXT: por %xmm1, %xmm2 1297; SSE2-NEXT: movdqa %xmm2, %xmm1 1298; SSE2-NEXT: retq 1299; 1300; SSE41-LABEL: perlane_ashr_v32i8: 1301; SSE41: # %bb.0: 1302; SSE41-NEXT: movd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1303; SSE41-NEXT: pshufb %xmm0, %xmm2 1304; SSE41-NEXT: movd {{.*#+}} xmm3 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1305; SSE41-NEXT: pshufb %xmm1, %xmm3 1306; SSE41-NEXT: movdqa %xmm2, %xmm0 1307; SSE41-NEXT: movdqa %xmm3, %xmm1 1308; SSE41-NEXT: retq 1309; 1310; AVX1-LABEL: perlane_ashr_v32i8: 1311; AVX1: # %bb.0: 1312; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1313; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1314; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 1315; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1316; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0 1317; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1318; AVX1-NEXT: retq 1319; 1320; AVX2-LABEL: perlane_ashr_v32i8: 1321; AVX2: # %bb.0: 1322; AVX2-NEXT: vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0] 1323; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1324; AVX2-NEXT: retq 1325; 1326; XOPAVX1-LABEL: perlane_ashr_v32i8: 1327; XOPAVX1: # %bb.0: 1328; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1329; XOPAVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm2 1330; XOPAVX1-NEXT: vpshlb %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 1331; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1332; XOPAVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm0 1333; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1334; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 1335; XOPAVX1-NEXT: retq 1336; 1337; XOPAVX2-LABEL: perlane_ashr_v32i8: 1338; XOPAVX2: # %bb.0: 1339; XOPAVX2-NEXT: vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0] 1340; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1341; XOPAVX2-NEXT: retq 1342; 1343; AVX512DQ-LABEL: perlane_ashr_v32i8: 1344; AVX512DQ: # %bb.0: 1345; AVX512DQ-NEXT: vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0] 1346; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1347; AVX512DQ-NEXT: retq 1348; 1349; AVX512BW-LABEL: perlane_ashr_v32i8: 1350; AVX512BW: # %bb.0: 1351; AVX512BW-NEXT: vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0] 1352; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1353; AVX512BW-NEXT: retq 1354 %shift = ashr <32 x i8> <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a 1355 ret <32 x i8> %shift 1356} 1357 1358define <64 x i8> @perlane_shl_v64i8(<64 x i8> %a) nounwind { 1359; SSE2-LABEL: perlane_shl_v64i8: 1360; SSE2: # %bb.0: 1361; SSE2-NEXT: movdqa %xmm0, %xmm1 1362; SSE2-NEXT: psllw $5, %xmm1 1363; SSE2-NEXT: pxor %xmm5, %xmm5 1364; SSE2-NEXT: pxor %xmm4, %xmm4 1365; SSE2-NEXT: pcmpgtb %xmm1, %xmm4 1366; SSE2-NEXT: movdqa %xmm4, %xmm0 1367; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1368; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 1369; SSE2-NEXT: por %xmm0, %xmm4 1370; SSE2-NEXT: paddb %xmm1, %xmm1 1371; SSE2-NEXT: pxor %xmm0, %xmm0 1372; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 1373; SSE2-NEXT: movdqa %xmm0, %xmm7 1374; SSE2-NEXT: pandn %xmm4, %xmm7 1375; SSE2-NEXT: psllw $2, %xmm4 1376; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 1377; SSE2-NEXT: pand %xmm6, %xmm0 1378; SSE2-NEXT: pand %xmm4, %xmm0 1379; SSE2-NEXT: por %xmm7, %xmm0 1380; SSE2-NEXT: paddb %xmm1, %xmm1 1381; SSE2-NEXT: pxor %xmm4, %xmm4 1382; SSE2-NEXT: pcmpgtb %xmm1, %xmm4 1383; SSE2-NEXT: movdqa %xmm4, %xmm1 1384; SSE2-NEXT: pandn %xmm0, %xmm1 1385; SSE2-NEXT: paddb %xmm0, %xmm0 1386; SSE2-NEXT: pand %xmm4, %xmm0 1387; SSE2-NEXT: por %xmm1, %xmm0 1388; SSE2-NEXT: psllw $5, %xmm3 1389; SSE2-NEXT: pxor %xmm1, %xmm1 1390; SSE2-NEXT: pcmpgtb %xmm3, %xmm1 1391; SSE2-NEXT: movdqa %xmm1, %xmm4 1392; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 1393; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1394; SSE2-NEXT: por %xmm4, %xmm1 1395; SSE2-NEXT: paddb %xmm3, %xmm3 1396; SSE2-NEXT: pxor %xmm4, %xmm4 1397; SSE2-NEXT: pcmpgtb %xmm3, %xmm4 1398; SSE2-NEXT: movdqa %xmm4, %xmm7 1399; SSE2-NEXT: pandn %xmm1, %xmm7 1400; SSE2-NEXT: psllw $2, %xmm1 1401; SSE2-NEXT: pand %xmm6, %xmm4 1402; SSE2-NEXT: pand %xmm1, %xmm4 1403; SSE2-NEXT: por %xmm7, %xmm4 1404; SSE2-NEXT: paddb %xmm3, %xmm3 1405; SSE2-NEXT: pxor %xmm1, %xmm1 1406; SSE2-NEXT: pcmpgtb %xmm3, %xmm1 1407; SSE2-NEXT: movdqa %xmm1, %xmm3 1408; SSE2-NEXT: pandn %xmm4, %xmm3 1409; SSE2-NEXT: paddb %xmm4, %xmm4 1410; SSE2-NEXT: pand %xmm1, %xmm4 1411; SSE2-NEXT: por %xmm3, %xmm4 1412; SSE2-NEXT: psllw $5, %xmm2 1413; SSE2-NEXT: pxor %xmm1, %xmm1 1414; SSE2-NEXT: pcmpgtb %xmm2, %xmm1 1415; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1416; SSE2-NEXT: pand %xmm1, %xmm7 1417; SSE2-NEXT: paddb %xmm1, %xmm7 1418; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 1419; SSE2-NEXT: psubb %xmm1, %xmm7 1420; SSE2-NEXT: paddb %xmm2, %xmm2 1421; SSE2-NEXT: pxor %xmm3, %xmm3 1422; SSE2-NEXT: pcmpgtb %xmm2, %xmm3 1423; SSE2-NEXT: movdqa %xmm3, %xmm1 1424; SSE2-NEXT: pandn %xmm7, %xmm1 1425; SSE2-NEXT: psllw $2, %xmm7 1426; SSE2-NEXT: pand %xmm6, %xmm3 1427; SSE2-NEXT: pand %xmm7, %xmm3 1428; SSE2-NEXT: por %xmm1, %xmm3 1429; SSE2-NEXT: paddb %xmm2, %xmm2 1430; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 1431; SSE2-NEXT: movdqa %xmm5, %xmm1 1432; SSE2-NEXT: pandn %xmm3, %xmm1 1433; SSE2-NEXT: paddb %xmm3, %xmm3 1434; SSE2-NEXT: pand %xmm5, %xmm3 1435; SSE2-NEXT: por %xmm1, %xmm3 1436; SSE2-NEXT: pxor %xmm1, %xmm1 1437; SSE2-NEXT: movdqa %xmm3, %xmm2 1438; SSE2-NEXT: movdqa %xmm4, %xmm3 1439; SSE2-NEXT: retq 1440; 1441; SSE41-LABEL: perlane_shl_v64i8: 1442; SSE41: # %bb.0: 1443; SSE41-NEXT: movq {{.*#+}} xmm4 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0] 1444; SSE41-NEXT: pshufb %xmm0, %xmm4 1445; SSE41-NEXT: movq {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0] 1446; SSE41-NEXT: pshufb %xmm2, %xmm5 1447; SSE41-NEXT: movq {{.*#+}} xmm6 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0] 1448; SSE41-NEXT: pshufb %xmm3, %xmm6 1449; SSE41-NEXT: xorps %xmm1, %xmm1 1450; SSE41-NEXT: movdqa %xmm4, %xmm0 1451; SSE41-NEXT: movdqa %xmm5, %xmm2 1452; SSE41-NEXT: movdqa %xmm6, %xmm3 1453; SSE41-NEXT: retq 1454; 1455; AVX1-LABEL: perlane_shl_v64i8: 1456; AVX1: # %bb.0: 1457; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1458; AVX1-NEXT: vmovq {{.*#+}} xmm3 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0] 1459; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1460; AVX1-NEXT: vmovq {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0] 1461; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1 1462; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1463; AVX1-NEXT: vmovq {{.*#+}} xmm2 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0] 1464; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0 1465; AVX1-NEXT: retq 1466; 1467; AVX2-LABEL: perlane_shl_v64i8: 1468; AVX2: # %bb.0: 1469; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u] 1470; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1471; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u] 1472; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1473; AVX2-NEXT: retq 1474; 1475; XOPAVX1-LABEL: perlane_shl_v64i8: 1476; XOPAVX1: # %bb.0: 1477; XOPAVX1-NEXT: vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 1478; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1479; XOPAVX1-NEXT: vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1480; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 1481; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1482; XOPAVX1-NEXT: retq 1483; 1484; XOPAVX2-LABEL: perlane_shl_v64i8: 1485; XOPAVX2: # %bb.0: 1486; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u] 1487; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1488; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u] 1489; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1490; XOPAVX2-NEXT: retq 1491; 1492; AVX512DQ-LABEL: perlane_shl_v64i8: 1493; AVX512DQ: # %bb.0: 1494; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1495; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u] 1496; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1497; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u] 1498; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1499; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1500; AVX512DQ-NEXT: retq 1501; 1502; AVX512BW-LABEL: perlane_shl_v64i8: 1503; AVX512BW: # %bb.0: 1504; AVX512BW-NEXT: vmovdqa64 {{.*#+}} zmm1 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u,1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u] 1505; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 1506; AVX512BW-NEXT: retq 1507 %shift = shl <64 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a 1508 ret <64 x i8> %shift 1509} 1510 1511define <64 x i8> @perlane_lshr_v64i8(<64 x i8> %a) nounwind { 1512; SSE2-LABEL: perlane_lshr_v64i8: 1513; SSE2: # %bb.0: 1514; SSE2-NEXT: movdqa %xmm2, %xmm5 1515; SSE2-NEXT: psllw $5, %xmm1 1516; SSE2-NEXT: pxor %xmm2, %xmm2 1517; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1518; SSE2-NEXT: movdqa %xmm1, %xmm6 1519; SSE2-NEXT: paddb %xmm1, %xmm6 1520; SSE2-NEXT: pxor %xmm4, %xmm4 1521; SSE2-NEXT: pxor %xmm8, %xmm8 1522; SSE2-NEXT: pcmpgtb %xmm6, %xmm8 1523; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 1524; SSE2-NEXT: movdqa %xmm8, %xmm1 1525; SSE2-NEXT: pandn %xmm2, %xmm1 1526; SSE2-NEXT: psrlw $2, %xmm2 1527; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 1528; SSE2-NEXT: pand %xmm7, %xmm8 1529; SSE2-NEXT: pand %xmm2, %xmm8 1530; SSE2-NEXT: por %xmm1, %xmm8 1531; SSE2-NEXT: paddb %xmm6, %xmm6 1532; SSE2-NEXT: pxor %xmm1, %xmm1 1533; SSE2-NEXT: pcmpgtb %xmm6, %xmm1 1534; SSE2-NEXT: movdqa %xmm1, %xmm2 1535; SSE2-NEXT: pandn %xmm8, %xmm2 1536; SSE2-NEXT: psrlw $1, %xmm8 1537; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 1538; SSE2-NEXT: pand %xmm6, %xmm1 1539; SSE2-NEXT: pand %xmm8, %xmm1 1540; SSE2-NEXT: por %xmm2, %xmm1 1541; SSE2-NEXT: psllw $5, %xmm5 1542; SSE2-NEXT: pxor %xmm2, %xmm2 1543; SSE2-NEXT: pcmpgtb %xmm5, %xmm2 1544; SSE2-NEXT: paddb %xmm5, %xmm5 1545; SSE2-NEXT: pxor %xmm8, %xmm8 1546; SSE2-NEXT: pcmpgtb %xmm5, %xmm8 1547; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 1548; SSE2-NEXT: movdqa %xmm8, %xmm9 1549; SSE2-NEXT: pandn %xmm2, %xmm9 1550; SSE2-NEXT: psrlw $2, %xmm2 1551; SSE2-NEXT: pand %xmm7, %xmm8 1552; SSE2-NEXT: pand %xmm2, %xmm8 1553; SSE2-NEXT: por %xmm9, %xmm8 1554; SSE2-NEXT: paddb %xmm5, %xmm5 1555; SSE2-NEXT: pxor %xmm2, %xmm2 1556; SSE2-NEXT: pcmpgtb %xmm5, %xmm2 1557; SSE2-NEXT: movdqa %xmm2, %xmm5 1558; SSE2-NEXT: pandn %xmm8, %xmm5 1559; SSE2-NEXT: psrlw $1, %xmm8 1560; SSE2-NEXT: pand %xmm6, %xmm2 1561; SSE2-NEXT: pand %xmm8, %xmm2 1562; SSE2-NEXT: por %xmm5, %xmm2 1563; SSE2-NEXT: psllw $5, %xmm3 1564; SSE2-NEXT: pxor %xmm5, %xmm5 1565; SSE2-NEXT: pcmpgtb %xmm3, %xmm5 1566; SSE2-NEXT: paddb %xmm3, %xmm3 1567; SSE2-NEXT: pxor %xmm8, %xmm8 1568; SSE2-NEXT: pcmpgtb %xmm3, %xmm8 1569; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 1570; SSE2-NEXT: movdqa %xmm8, %xmm9 1571; SSE2-NEXT: pandn %xmm5, %xmm9 1572; SSE2-NEXT: psrlw $2, %xmm5 1573; SSE2-NEXT: pand %xmm7, %xmm8 1574; SSE2-NEXT: pand %xmm5, %xmm8 1575; SSE2-NEXT: por %xmm9, %xmm8 1576; SSE2-NEXT: paddb %xmm3, %xmm3 1577; SSE2-NEXT: pxor %xmm5, %xmm5 1578; SSE2-NEXT: pcmpgtb %xmm3, %xmm5 1579; SSE2-NEXT: movdqa %xmm5, %xmm3 1580; SSE2-NEXT: pandn %xmm8, %xmm3 1581; SSE2-NEXT: psrlw $1, %xmm8 1582; SSE2-NEXT: pand %xmm6, %xmm5 1583; SSE2-NEXT: pand %xmm8, %xmm5 1584; SSE2-NEXT: por %xmm3, %xmm5 1585; SSE2-NEXT: psllw $5, %xmm0 1586; SSE2-NEXT: pxor %xmm3, %xmm3 1587; SSE2-NEXT: pcmpgtb %xmm0, %xmm3 1588; SSE2-NEXT: paddb %xmm0, %xmm0 1589; SSE2-NEXT: pxor %xmm7, %xmm7 1590; SSE2-NEXT: pcmpgtb %xmm0, %xmm7 1591; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 1592; SSE2-NEXT: pandn %xmm3, %xmm7 1593; SSE2-NEXT: paddb %xmm0, %xmm0 1594; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 1595; SSE2-NEXT: movdqa %xmm4, %xmm0 1596; SSE2-NEXT: pandn %xmm7, %xmm0 1597; SSE2-NEXT: psrlw $1, %xmm7 1598; SSE2-NEXT: pand %xmm6, %xmm4 1599; SSE2-NEXT: pand %xmm7, %xmm4 1600; SSE2-NEXT: por %xmm0, %xmm4 1601; SSE2-NEXT: movdqa %xmm4, %xmm0 1602; SSE2-NEXT: movdqa %xmm5, %xmm3 1603; SSE2-NEXT: retq 1604; 1605; SSE41-LABEL: perlane_lshr_v64i8: 1606; SSE41: # %bb.0: 1607; SSE41-NEXT: movd {{.*#+}} xmm4 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 1608; SSE41-NEXT: pshufb %xmm0, %xmm4 1609; SSE41-NEXT: movd {{.*#+}} xmm5 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1610; SSE41-NEXT: pshufb %xmm1, %xmm5 1611; SSE41-NEXT: movd {{.*#+}} xmm6 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1612; SSE41-NEXT: pshufb %xmm2, %xmm6 1613; SSE41-NEXT: movd {{.*#+}} xmm7 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1614; SSE41-NEXT: pshufb %xmm3, %xmm7 1615; SSE41-NEXT: movdqa %xmm4, %xmm0 1616; SSE41-NEXT: movdqa %xmm5, %xmm1 1617; SSE41-NEXT: movdqa %xmm6, %xmm2 1618; SSE41-NEXT: movdqa %xmm7, %xmm3 1619; SSE41-NEXT: retq 1620; 1621; AVX1-LABEL: perlane_lshr_v64i8: 1622; AVX1: # %bb.0: 1623; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1624; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1625; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1626; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 1627; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0 1628; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1629; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1630; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1631; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1632; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0] 1633; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1 1634; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1635; AVX1-NEXT: retq 1636; 1637; AVX2-LABEL: perlane_lshr_v64i8: 1638; AVX2: # %bb.0: 1639; AVX2-NEXT: vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0] 1640; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1641; AVX2-NEXT: vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0] 1642; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1643; AVX2-NEXT: retq 1644; 1645; XOPAVX1-LABEL: perlane_lshr_v64i8: 1646; XOPAVX1: # %bb.0: 1647; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1648; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm3 1649; XOPAVX1-NEXT: vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 1650; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1651; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm0 1652; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1653; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0 1654; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm3 1655; XOPAVX1-NEXT: vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 1656; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1657; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1 1658; XOPAVX1-NEXT: vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1659; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1 1660; XOPAVX1-NEXT: retq 1661; 1662; XOPAVX2-LABEL: perlane_lshr_v64i8: 1663; XOPAVX2: # %bb.0: 1664; XOPAVX2-NEXT: vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0] 1665; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1666; XOPAVX2-NEXT: vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0] 1667; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1668; XOPAVX2-NEXT: retq 1669; 1670; AVX512DQ-LABEL: perlane_lshr_v64i8: 1671; AVX512DQ: # %bb.0: 1672; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1673; AVX512DQ-NEXT: vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0] 1674; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1675; AVX512DQ-NEXT: vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0] 1676; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1677; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1678; AVX512DQ-NEXT: retq 1679; 1680; AVX512BW-LABEL: perlane_lshr_v64i8: 1681; AVX512BW: # %bb.0: 1682; AVX512BW-NEXT: vpmovsxdq {{.*#+}} zmm1 = [259,0,66052,0,66053,0,66310,0] 1683; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 1684; AVX512BW-NEXT: retq 1685 %shift = lshr <64 x i8> <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 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a 1686 ret <64 x i8> %shift 1687} 1688 1689define <64 x i8> @perlane_ashr_v64i8(<64 x i8> %a) nounwind { 1690; SSE2-LABEL: perlane_ashr_v64i8: 1691; SSE2: # %bb.0: 1692; SSE2-NEXT: psllw $5, %xmm1 1693; SSE2-NEXT: pxor %xmm0, %xmm0 1694; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 1695; SSE2-NEXT: movdqa %xmm1, %xmm5 1696; SSE2-NEXT: paddb %xmm1, %xmm5 1697; SSE2-NEXT: pxor %xmm4, %xmm4 1698; SSE2-NEXT: pxor %xmm6, %xmm6 1699; SSE2-NEXT: pcmpgtb %xmm5, %xmm6 1700; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1701; SSE2-NEXT: pandn %xmm0, %xmm6 1702; SSE2-NEXT: paddb %xmm5, %xmm5 1703; SSE2-NEXT: pxor %xmm1, %xmm1 1704; SSE2-NEXT: pcmpgtb %xmm5, %xmm1 1705; SSE2-NEXT: movdqa %xmm1, %xmm5 1706; SSE2-NEXT: pandn %xmm6, %xmm5 1707; SSE2-NEXT: psrlw $1, %xmm6 1708; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 1709; SSE2-NEXT: pand %xmm0, %xmm1 1710; SSE2-NEXT: pand %xmm6, %xmm1 1711; SSE2-NEXT: por %xmm5, %xmm1 1712; SSE2-NEXT: psllw $5, %xmm2 1713; SSE2-NEXT: pxor %xmm5, %xmm5 1714; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 1715; SSE2-NEXT: paddb %xmm2, %xmm2 1716; SSE2-NEXT: pxor %xmm6, %xmm6 1717; SSE2-NEXT: pcmpgtb %xmm2, %xmm6 1718; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 1719; SSE2-NEXT: pandn %xmm5, %xmm6 1720; SSE2-NEXT: paddb %xmm2, %xmm2 1721; SSE2-NEXT: pxor %xmm5, %xmm5 1722; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 1723; SSE2-NEXT: movdqa %xmm5, %xmm2 1724; SSE2-NEXT: pandn %xmm6, %xmm2 1725; SSE2-NEXT: psrlw $1, %xmm6 1726; SSE2-NEXT: pand %xmm0, %xmm5 1727; SSE2-NEXT: pand %xmm6, %xmm5 1728; SSE2-NEXT: por %xmm2, %xmm5 1729; SSE2-NEXT: psllw $5, %xmm3 1730; SSE2-NEXT: pxor %xmm2, %xmm2 1731; SSE2-NEXT: pcmpgtb %xmm3, %xmm2 1732; SSE2-NEXT: paddb %xmm3, %xmm3 1733; SSE2-NEXT: pxor %xmm6, %xmm6 1734; SSE2-NEXT: pcmpgtb %xmm3, %xmm6 1735; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 1736; SSE2-NEXT: pandn %xmm2, %xmm6 1737; SSE2-NEXT: paddb %xmm3, %xmm3 1738; SSE2-NEXT: pcmpgtb %xmm3, %xmm4 1739; SSE2-NEXT: movdqa %xmm4, %xmm2 1740; SSE2-NEXT: pandn %xmm6, %xmm2 1741; SSE2-NEXT: psrlw $1, %xmm6 1742; SSE2-NEXT: pand %xmm0, %xmm4 1743; SSE2-NEXT: pand %xmm6, %xmm4 1744; SSE2-NEXT: por %xmm2, %xmm4 1745; SSE2-NEXT: pxor %xmm0, %xmm0 1746; SSE2-NEXT: movdqa %xmm5, %xmm2 1747; SSE2-NEXT: movdqa %xmm4, %xmm3 1748; SSE2-NEXT: retq 1749; 1750; SSE41-LABEL: perlane_ashr_v64i8: 1751; SSE41: # %bb.0: 1752; SSE41-NEXT: pmovsxbq {{.*#+}} xmm4 = [1,0] 1753; SSE41-NEXT: pshufb %xmm1, %xmm4 1754; SSE41-NEXT: movd {{.*#+}} xmm5 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 1755; SSE41-NEXT: pshufb %xmm2, %xmm5 1756; SSE41-NEXT: movd {{.*#+}} xmm6 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 1757; SSE41-NEXT: pshufb %xmm3, %xmm6 1758; SSE41-NEXT: xorps %xmm0, %xmm0 1759; SSE41-NEXT: movdqa %xmm4, %xmm1 1760; SSE41-NEXT: movdqa %xmm5, %xmm2 1761; SSE41-NEXT: movdqa %xmm6, %xmm3 1762; SSE41-NEXT: retq 1763; 1764; AVX1-LABEL: perlane_ashr_v64i8: 1765; AVX1: # %bb.0: 1766; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1767; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 1768; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1769; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 1770; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1 1771; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1772; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1773; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm2 = [1,0] 1774; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0 1775; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1776; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 1777; AVX1-NEXT: retq 1778; 1779; AVX2-LABEL: perlane_ashr_v64i8: 1780; AVX2: # %bb.0: 1781; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0] 1782; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1783; AVX2-NEXT: vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0] 1784; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1785; AVX2-NEXT: retq 1786; 1787; XOPAVX1-LABEL: perlane_ashr_v64i8: 1788; XOPAVX1: # %bb.0: 1789; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1790; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm3 1791; XOPAVX1-NEXT: vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 1792; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1793; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1 1794; XOPAVX1-NEXT: vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1795; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1 1796; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1797; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm0 1798; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1799; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1800; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 1801; XOPAVX1-NEXT: retq 1802; 1803; XOPAVX2-LABEL: perlane_ashr_v64i8: 1804; XOPAVX2: # %bb.0: 1805; XOPAVX2-NEXT: vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0] 1806; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1807; XOPAVX2-NEXT: vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0] 1808; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1809; XOPAVX2-NEXT: retq 1810; 1811; AVX512DQ-LABEL: perlane_ashr_v64i8: 1812; AVX512DQ: # %bb.0: 1813; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1814; AVX512DQ-NEXT: vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0] 1815; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1 1816; AVX512DQ-NEXT: vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0] 1817; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0 1818; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1819; AVX512DQ-NEXT: retq 1820; 1821; AVX512BW-LABEL: perlane_ashr_v64i8: 1822; AVX512BW: # %bb.0: 1823; AVX512BW-NEXT: vpmovsxwq {{.*#+}} zmm1 = [0,0,1,0,258,0,259,0] 1824; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 1825; AVX512BW-NEXT: retq 1826 %shift = ashr <64 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, 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>, %a 1827 ret <64 x i8> %shift 1828} 1829 1830;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 1831; SSE: {{.*}} 1832