brintos

brintos / llvm-project-archived public Read only

0
0
Text · 77.2 KiB · 5ae3e2f Raw
1692 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512NOVLX,AVX512F5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLX,AVX512VL6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512NOVLX,AVX512BW7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLX,AVX512VLBW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512,AVX512NOVLX,AVX512VBMI29; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLX,AVX512VLVBMI210; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=XOPAVX111; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=XOPAVX212 13;14; Variable Rotates15;16 17define <4 x i64> @var_rotate_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {18; AVX1-LABEL: var_rotate_v4i64:19; AVX1:       # %bb.0:20; AVX1-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [64,64]21; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm322; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm423; AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm224; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm525; AVX1-NEXT:    vpsllq %xmm4, %xmm5, %xmm626; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]27; AVX1-NEXT:    vpsllq %xmm4, %xmm5, %xmm428; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]29; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm630; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]31; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm132; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm6[0,1,2,3],xmm1[4,5,6,7]33; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm134; AVX1-NEXT:    vpsrlq %xmm2, %xmm5, %xmm435; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]36; AVX1-NEXT:    vpsrlq %xmm2, %xmm5, %xmm237; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]38; AVX1-NEXT:    vpsrlq %xmm3, %xmm0, %xmm439; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]40; AVX1-NEXT:    vpsrlq %xmm3, %xmm0, %xmm041; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm4[0,1,2,3],xmm0[4,5,6,7]42; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm043; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm044; AVX1-NEXT:    retq45;46; AVX2-LABEL: var_rotate_v4i64:47; AVX2:       # %bb.0:48; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [64,64,64,64]49; AVX2-NEXT:    vpsubq %ymm1, %ymm2, %ymm250; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm151; AVX2-NEXT:    vpsrlvq %ymm2, %ymm0, %ymm052; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm053; AVX2-NEXT:    retq54;55; AVX512NOVLX-LABEL: var_rotate_v4i64:56; AVX512NOVLX:       # %bb.0:57; AVX512NOVLX-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm158; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm059; AVX512NOVLX-NEXT:    vprolvq %zmm1, %zmm0, %zmm060; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm061; AVX512NOVLX-NEXT:    retq62;63; AVX512VLX-LABEL: var_rotate_v4i64:64; AVX512VLX:       # %bb.0:65; AVX512VLX-NEXT:    vprolvq %ymm1, %ymm0, %ymm066; AVX512VLX-NEXT:    retq67;68; XOPAVX1-LABEL: var_rotate_v4i64:69; XOPAVX1:       # %bb.0:70; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm271; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm372; XOPAVX1-NEXT:    vprotq %xmm2, %xmm3, %xmm273; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm074; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm075; XOPAVX1-NEXT:    retq76;77; XOPAVX2-LABEL: var_rotate_v4i64:78; XOPAVX2:       # %bb.0:79; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm280; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm381; XOPAVX2-NEXT:    vprotq %xmm2, %xmm3, %xmm282; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm083; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm084; XOPAVX2-NEXT:    retq85  %b64 = sub <4 x i64> <i64 64, i64 64, i64 64, i64 64>, %b86  %shl = shl <4 x i64> %a, %b87  %lshr = lshr <4 x i64> %a, %b6488  %or = or <4 x i64> %shl, %lshr89  ret <4 x i64> %or90}91 92define <8 x i32> @var_rotate_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {93; AVX1-LABEL: var_rotate_v8i32:94; AVX1:       # %bb.0:95; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm296; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]97; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm298; AVX1-NEXT:    vpslld $23, %xmm2, %xmm299; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]100; AVX1-NEXT:    vpaddd %xmm4, %xmm2, %xmm2101; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2102; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]103; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6104; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]105; AVX1-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5106; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1107; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1108; AVX1-NEXT:    vpaddd %xmm4, %xmm1, %xmm1109; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1110; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]111; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]112; AVX1-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3113; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm3, %ymm3114; AVX1-NEXT:    vpmuludq %xmm2, %xmm6, %xmm2115; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0116; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0117; AVX1-NEXT:    vmovshdup {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]118; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0],ymm3[1],ymm1[2],ymm3[3],ymm1[4],ymm3[5],ymm1[6],ymm3[7]119; AVX1-NEXT:    vmovsldup {{.*#+}} ymm2 = ymm3[0,0,2,2,4,4,6,6]120; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2],ymm2[3],ymm0[4],ymm2[5],ymm0[6],ymm2[7]121; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0122; AVX1-NEXT:    retq123;124; AVX2-LABEL: var_rotate_v8i32:125; AVX2:       # %bb.0:126; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31]127; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1128; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm2129; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32]130; AVX2-NEXT:    vpsubd %ymm1, %ymm3, %ymm1131; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0132; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0133; AVX2-NEXT:    retq134;135; AVX512NOVLX-LABEL: var_rotate_v8i32:136; AVX512NOVLX:       # %bb.0:137; AVX512NOVLX-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1138; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0139; AVX512NOVLX-NEXT:    vprolvd %zmm1, %zmm0, %zmm0140; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0141; AVX512NOVLX-NEXT:    retq142;143; AVX512VLX-LABEL: var_rotate_v8i32:144; AVX512VLX:       # %bb.0:145; AVX512VLX-NEXT:    vprolvd %ymm1, %ymm0, %ymm0146; AVX512VLX-NEXT:    retq147;148; XOPAVX1-LABEL: var_rotate_v8i32:149; XOPAVX1:       # %bb.0:150; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2151; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3152; XOPAVX1-NEXT:    vprotd %xmm2, %xmm3, %xmm2153; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0154; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0155; XOPAVX1-NEXT:    retq156;157; XOPAVX2-LABEL: var_rotate_v8i32:158; XOPAVX2:       # %bb.0:159; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2160; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3161; XOPAVX2-NEXT:    vprotd %xmm2, %xmm3, %xmm2162; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0163; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0164; XOPAVX2-NEXT:    retq165  %b32 = sub <8 x i32> <i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32>, %b166  %shl = shl <8 x i32> %a, %b167  %lshr = lshr <8 x i32> %a, %b32168  %or = or <8 x i32> %shl, %lshr169  ret <8 x i32> %or170}171 172define <16 x i16> @var_rotate_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {173; AVX1-LABEL: var_rotate_v16i16:174; AVX1:       # %bb.0:175; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2176; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]177; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2178; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm2[4,4,5,5,6,6,7,7]179; AVX1-NEXT:    vpslld $23, %xmm4, %xmm4180; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]181; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4182; AVX1-NEXT:    vcvttps2dq %xmm4, %xmm4183; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero184; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2185; AVX1-NEXT:    vpaddd %xmm5, %xmm2, %xmm2186; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2187; AVX1-NEXT:    vpackusdw %xmm4, %xmm2, %xmm2188; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4189; AVX1-NEXT:    vpmulhuw %xmm2, %xmm4, %xmm6190; AVX1-NEXT:    vpmullw %xmm2, %xmm4, %xmm2191; AVX1-NEXT:    vpor %xmm6, %xmm2, %xmm2192; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1193; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm1[4,4,5,5,6,6,7,7]194; AVX1-NEXT:    vpslld $23, %xmm3, %xmm3195; AVX1-NEXT:    vpaddd %xmm5, %xmm3, %xmm3196; AVX1-NEXT:    vcvttps2dq %xmm3, %xmm3197; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero198; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1199; AVX1-NEXT:    vpaddd %xmm5, %xmm1, %xmm1200; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1201; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1202; AVX1-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm3203; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0204; AVX1-NEXT:    vpor %xmm3, %xmm0, %xmm0205; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0206; AVX1-NEXT:    retq207;208; AVX2-LABEL: var_rotate_v16i16:209; AVX2:       # %bb.0:210; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1211; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2212; 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]213; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]214; AVX2-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3215; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3216; 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]217; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]218; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0219; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0220; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0221; AVX2-NEXT:    retq222;223; AVX512F-LABEL: var_rotate_v16i16:224; AVX512F:       # %bb.0:225; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1226; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2227; AVX512F-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]228; AVX512F-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]229; AVX512F-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3230; AVX512F-NEXT:    vpsrld $16, %ymm3, %ymm3231; AVX512F-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]232; AVX512F-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]233; AVX512F-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0234; AVX512F-NEXT:    vpsrld $16, %ymm0, %ymm0235; AVX512F-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0236; AVX512F-NEXT:    retq237;238; AVX512VL-LABEL: var_rotate_v16i16:239; AVX512VL:       # %bb.0:240; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1241; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2242; AVX512VL-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]243; AVX512VL-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]244; AVX512VL-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3245; AVX512VL-NEXT:    vpsrld $16, %ymm3, %ymm3246; AVX512VL-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]247; AVX512VL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]248; AVX512VL-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0249; AVX512VL-NEXT:    vpsrld $16, %ymm0, %ymm0250; AVX512VL-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0251; AVX512VL-NEXT:    retq252;253; AVX512BW-LABEL: var_rotate_v16i16:254; AVX512BW:       # %bb.0:255; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0256; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1257; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm2258; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]259; AVX512BW-NEXT:    vpsubw %ymm1, %ymm3, %ymm1260; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0261; AVX512BW-NEXT:    vpor %ymm0, %ymm2, %ymm0262; AVX512BW-NEXT:    retq263;264; AVX512VLBW-LABEL: var_rotate_v16i16:265; AVX512VLBW:       # %bb.0:266; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1267; AVX512VLBW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm2268; AVX512VLBW-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]269; AVX512VLBW-NEXT:    vpsubw %ymm1, %ymm3, %ymm1270; AVX512VLBW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0271; AVX512VLBW-NEXT:    vpor %ymm0, %ymm2, %ymm0272; AVX512VLBW-NEXT:    retq273;274; AVX512VBMI2-LABEL: var_rotate_v16i16:275; AVX512VBMI2:       # %bb.0:276; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1277; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0278; AVX512VBMI2-NEXT:    vpshldvw %zmm1, %zmm0, %zmm0279; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0280; AVX512VBMI2-NEXT:    retq281;282; AVX512VLVBMI2-LABEL: var_rotate_v16i16:283; AVX512VLVBMI2:       # %bb.0:284; AVX512VLVBMI2-NEXT:    vpshldvw %ymm1, %ymm0, %ymm0285; AVX512VLVBMI2-NEXT:    retq286;287; XOPAVX1-LABEL: var_rotate_v16i16:288; XOPAVX1:       # %bb.0:289; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2290; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3291; XOPAVX1-NEXT:    vprotw %xmm2, %xmm3, %xmm2292; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0293; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0294; XOPAVX1-NEXT:    retq295;296; XOPAVX2-LABEL: var_rotate_v16i16:297; XOPAVX2:       # %bb.0:298; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2299; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3300; XOPAVX2-NEXT:    vprotw %xmm2, %xmm3, %xmm2301; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0302; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0303; XOPAVX2-NEXT:    retq304  %b16 = sub <16 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %b305  %shl = shl <16 x i16> %a, %b306  %lshr = lshr <16 x i16> %a, %b16307  %or = or <16 x i16> %shl, %lshr308  ret <16 x i16> %or309}310 311define <32 x i8> @var_rotate_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {312; AVX1-LABEL: var_rotate_v32i8:313; AVX1:       # %bb.0:314; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2315; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3316; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]317; AVX1-NEXT:    vpandn %xmm3, %xmm4, %xmm3318; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm5319; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm5320; AVX1-NEXT:    vpor %xmm3, %xmm5, %xmm3321; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5322; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5323; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2324; AVX1-NEXT:    vpsrlw $6, %xmm2, %xmm3325; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]326; AVX1-NEXT:    vpandn %xmm3, %xmm6, %xmm3327; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm7328; AVX1-NEXT:    vpand %xmm6, %xmm7, %xmm7329; AVX1-NEXT:    vpor %xmm3, %xmm7, %xmm3330; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5331; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2332; AVX1-NEXT:    vpsrlw $7, %xmm2, %xmm3333; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]334; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3335; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm8336; AVX1-NEXT:    vpor %xmm3, %xmm8, %xmm3337; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5338; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2339; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3340; AVX1-NEXT:    vpandn %xmm3, %xmm4, %xmm3341; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm5342; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm4343; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3344; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1345; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0346; AVX1-NEXT:    vpsrlw $6, %xmm0, %xmm3347; AVX1-NEXT:    vpandn %xmm3, %xmm6, %xmm3348; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm4349; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4350; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3351; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1352; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0353; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm3354; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3355; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm4356; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3357; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1358; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0359; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0360; AVX1-NEXT:    retq361;362; AVX2-LABEL: var_rotate_v32i8:363; AVX2:       # %bb.0:364; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2365; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2366; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm3367; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3368; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2369; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1370; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0371; AVX2-NEXT:    vpsrlw $6, %ymm0, %ymm2372; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2373; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm3374; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3375; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2376; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1377; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0378; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2379; AVX2-NEXT:    vpsrlw $7, %ymm0, %ymm3380; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3381; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2382; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1383; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0384; AVX2-NEXT:    retq385;386; AVX512F-LABEL: var_rotate_v32i8:387; AVX512F:       # %bb.0:388; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm2389; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm3390; AVX512F-NEXT:    vpternlogd {{.*#+}} zmm3 = zmm3 ^ (m32bcst & (zmm3 ^ zmm2))391; AVX512F-NEXT:    vpsllw $5, %ymm1, %ymm1392; AVX512F-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0393; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm2394; AVX512F-NEXT:    vpsrlw $6, %ymm0, %ymm3395; AVX512F-NEXT:    vpternlogd {{.*#+}} zmm3 = zmm3 ^ (m32bcst & (zmm3 ^ zmm2))396; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1397; AVX512F-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0398; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm2399; AVX512F-NEXT:    vpsrlw $7, %ymm0, %ymm3400; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3401; AVX512F-NEXT:    vpor %ymm3, %ymm2, %ymm2402; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1403; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0404; AVX512F-NEXT:    retq405;406; AVX512VL-LABEL: var_rotate_v32i8:407; AVX512VL:       # %bb.0:408; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm2409; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm3410; AVX512VL-NEXT:    vpternlogd {{.*#+}} ymm3 = ymm3 ^ (m32bcst & (ymm3 ^ ymm2))411; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1412; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0413; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm2414; AVX512VL-NEXT:    vpsrlw $6, %ymm0, %ymm3415; AVX512VL-NEXT:    vpternlogd {{.*#+}} ymm3 = ymm3 ^ (m32bcst & (ymm3 ^ ymm2))416; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1417; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0418; AVX512VL-NEXT:    vpsrlw $7, %ymm0, %ymm2419; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm3420; AVX512VL-NEXT:    vpternlogd {{.*#+}} ymm3 = ymm3 | (ymm2 & m32bcst)421; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1422; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0423; AVX512VL-NEXT:    retq424;425; AVX512BW-LABEL: var_rotate_v32i8:426; AVX512BW:       # %bb.0:427; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]428; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1429; AVX512BW-NEXT:    vpxor %xmm3, %xmm3, %xmm3430; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15],ymm1[24],ymm3[24],ymm1[25],ymm3[25],ymm1[26],ymm3[26],ymm1[27],ymm3[27],ymm1[28],ymm3[28],ymm1[29],ymm3[29],ymm1[30],ymm3[30],ymm1[31],ymm3[31]431; AVX512BW-NEXT:    vpsllvw %zmm4, %zmm2, %zmm2432; AVX512BW-NEXT:    vpsrlw $8, %ymm2, %ymm2433; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]434; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[16],ymm3[16],ymm1[17],ymm3[17],ymm1[18],ymm3[18],ymm1[19],ymm3[19],ymm1[20],ymm3[20],ymm1[21],ymm3[21],ymm1[22],ymm3[22],ymm1[23],ymm3[23]435; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0436; AVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0437; AVX512BW-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0438; AVX512BW-NEXT:    retq439;440; AVX512VLBW-LABEL: var_rotate_v32i8:441; AVX512VLBW:       # %bb.0:442; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1443; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2444; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]445; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]446; AVX512VLBW-NEXT:    vpsllvw %ymm3, %ymm4, %ymm3447; AVX512VLBW-NEXT:    vpsrlw $8, %ymm3, %ymm3448; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]449; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]450; AVX512VLBW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0451; AVX512VLBW-NEXT:    vpsrlw $8, %ymm0, %ymm0452; AVX512VLBW-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0453; AVX512VLBW-NEXT:    retq454;455; AVX512VBMI2-LABEL: var_rotate_v32i8:456; AVX512VBMI2:       # %bb.0:457; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]458; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1459; AVX512VBMI2-NEXT:    vpxor %xmm3, %xmm3, %xmm3460; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15],ymm1[24],ymm3[24],ymm1[25],ymm3[25],ymm1[26],ymm3[26],ymm1[27],ymm3[27],ymm1[28],ymm3[28],ymm1[29],ymm3[29],ymm1[30],ymm3[30],ymm1[31],ymm3[31]461; AVX512VBMI2-NEXT:    vpsllvw %zmm4, %zmm2, %zmm2462; AVX512VBMI2-NEXT:    vpsrlw $8, %ymm2, %ymm2463; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]464; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[16],ymm3[16],ymm1[17],ymm3[17],ymm1[18],ymm3[18],ymm1[19],ymm3[19],ymm1[20],ymm3[20],ymm1[21],ymm3[21],ymm1[22],ymm3[22],ymm1[23],ymm3[23]465; AVX512VBMI2-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0466; AVX512VBMI2-NEXT:    vpsrlw $8, %ymm0, %ymm0467; AVX512VBMI2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0468; AVX512VBMI2-NEXT:    retq469;470; AVX512VLVBMI2-LABEL: var_rotate_v32i8:471; AVX512VLVBMI2:       # %bb.0:472; AVX512VLVBMI2-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1473; AVX512VLVBMI2-NEXT:    vpxor %xmm2, %xmm2, %xmm2474; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]475; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]476; AVX512VLVBMI2-NEXT:    vpsllvw %ymm3, %ymm4, %ymm3477; AVX512VLVBMI2-NEXT:    vpsrlw $8, %ymm3, %ymm3478; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]479; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]480; AVX512VLVBMI2-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0481; AVX512VLVBMI2-NEXT:    vpsrlw $8, %ymm0, %ymm0482; AVX512VLVBMI2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0483; AVX512VLVBMI2-NEXT:    retq484;485; XOPAVX1-LABEL: var_rotate_v32i8:486; XOPAVX1:       # %bb.0:487; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2488; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3489; XOPAVX1-NEXT:    vprotb %xmm2, %xmm3, %xmm2490; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0491; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0492; XOPAVX1-NEXT:    retq493;494; XOPAVX2-LABEL: var_rotate_v32i8:495; XOPAVX2:       # %bb.0:496; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2497; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3498; XOPAVX2-NEXT:    vprotb %xmm2, %xmm3, %xmm2499; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0500; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0501; XOPAVX2-NEXT:    retq502  %b8 = sub <32 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>, %b503  %shl = shl <32 x i8> %a, %b504  %lshr = lshr <32 x i8> %a, %b8505  %or = or <32 x i8> %shl, %lshr506  ret <32 x i8> %or507}508 509;510; Uniform Variable Rotates511;512 513define <4 x i64> @splatvar_rotate_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {514; AVX1-LABEL: splatvar_rotate_v4i64:515; AVX1:       # %bb.0:516; AVX1-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [64,64]517; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm2518; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3519; AVX1-NEXT:    vpsllq %xmm1, %xmm3, %xmm4520; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm1521; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1522; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm3523; AVX1-NEXT:    vpsrlq %xmm2, %xmm0, %xmm0524; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0525; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0526; AVX1-NEXT:    retq527;528; AVX2-LABEL: splatvar_rotate_v4i64:529; AVX2:       # %bb.0:530; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm2531; AVX2-NEXT:    vpmovsxbq {{.*#+}} xmm3 = [64,64]532; AVX2-NEXT:    vpsubq %xmm1, %xmm3, %xmm1533; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0534; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0535; AVX2-NEXT:    retq536;537; AVX512NOVLX-LABEL: splatvar_rotate_v4i64:538; AVX512NOVLX:       # %bb.0:539; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0540; AVX512NOVLX-NEXT:    vpbroadcastq %xmm1, %ymm1541; AVX512NOVLX-NEXT:    vprolvq %zmm1, %zmm0, %zmm0542; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0543; AVX512NOVLX-NEXT:    retq544;545; AVX512VLX-LABEL: splatvar_rotate_v4i64:546; AVX512VLX:       # %bb.0:547; AVX512VLX-NEXT:    vpbroadcastq %xmm1, %ymm1548; AVX512VLX-NEXT:    vprolvq %ymm1, %ymm0, %ymm0549; AVX512VLX-NEXT:    retq550;551; XOPAVX1-LABEL: splatvar_rotate_v4i64:552; XOPAVX1:       # %bb.0:553; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2554; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]555; XOPAVX1-NEXT:    vprotq %xmm1, %xmm2, %xmm2556; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0557; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0558; XOPAVX1-NEXT:    retq559;560; XOPAVX2-LABEL: splatvar_rotate_v4i64:561; XOPAVX2:       # %bb.0:562; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2563; XOPAVX2-NEXT:    vpbroadcastq %xmm1, %xmm1564; XOPAVX2-NEXT:    vprotq %xmm1, %xmm2, %xmm2565; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0566; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0567; XOPAVX2-NEXT:    retq568  %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer569  %splat64 = sub <4 x i64> <i64 64, i64 64, i64 64, i64 64>, %splat570  %shl = shl <4 x i64> %a, %splat571  %lshr = lshr <4 x i64> %a, %splat64572  %or = or <4 x i64> %shl, %lshr573  ret <4 x i64> %or574}575 576define <8 x i32> @splatvar_rotate_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {577; AVX1-LABEL: splatvar_rotate_v8i32:578; AVX1:       # %bb.0:579; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1580; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2581; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[2,2,3,3]582; AVX1-NEXT:    vpsllq %xmm1, %xmm3, %xmm3583; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,1,1]584; AVX1-NEXT:    vpsllq %xmm1, %xmm2, %xmm2585; AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]586; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,2,3,3]587; AVX1-NEXT:    vpsllq %xmm1, %xmm3, %xmm3588; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]589; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0590; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]591; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0592; AVX1-NEXT:    retq593;594; AVX2-LABEL: splatvar_rotate_v8i32:595; AVX2:       # %bb.0:596; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm0[2,2,3,3,6,6,7,7]597; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1598; AVX2-NEXT:    vpsllq %xmm1, %ymm2, %ymm2599; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]600; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0601; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]602; AVX2-NEXT:    retq603;604; AVX512NOVLX-LABEL: splatvar_rotate_v8i32:605; AVX512NOVLX:       # %bb.0:606; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0607; AVX512NOVLX-NEXT:    vpbroadcastd %xmm1, %ymm1608; AVX512NOVLX-NEXT:    vprolvd %zmm1, %zmm0, %zmm0609; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0610; AVX512NOVLX-NEXT:    retq611;612; AVX512VLX-LABEL: splatvar_rotate_v8i32:613; AVX512VLX:       # %bb.0:614; AVX512VLX-NEXT:    vpbroadcastd %xmm1, %ymm1615; AVX512VLX-NEXT:    vprolvd %ymm1, %ymm0, %ymm0616; AVX512VLX-NEXT:    retq617;618; XOPAVX1-LABEL: splatvar_rotate_v8i32:619; XOPAVX1:       # %bb.0:620; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2621; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]622; XOPAVX1-NEXT:    vprotd %xmm1, %xmm2, %xmm2623; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0624; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0625; XOPAVX1-NEXT:    retq626;627; XOPAVX2-LABEL: splatvar_rotate_v8i32:628; XOPAVX2:       # %bb.0:629; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2630; XOPAVX2-NEXT:    vpbroadcastd %xmm1, %xmm1631; XOPAVX2-NEXT:    vprotd %xmm1, %xmm2, %xmm2632; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0633; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0634; XOPAVX2-NEXT:    retq635  %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer636  %splat32 = sub <8 x i32> <i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32>, %splat637  %shl = shl <8 x i32> %a, %splat638  %lshr = lshr <8 x i32> %a, %splat32639  %or = or <8 x i32> %shl, %lshr640  ret <8 x i32> %or641}642 643define <16 x i16> @splatvar_rotate_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {644; AVX1-LABEL: splatvar_rotate_v16i16:645; AVX1:       # %bb.0:646; AVX1-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [15,0]647; AVX1-NEXT:    vpandn %xmm2, %xmm1, %xmm3648; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4649; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm5650; AVX1-NEXT:    vpsrlw %xmm3, %xmm5, %xmm5651; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1652; AVX1-NEXT:    vpsllw %xmm1, %xmm4, %xmm2653; AVX1-NEXT:    vpor %xmm5, %xmm2, %xmm2654; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm4655; AVX1-NEXT:    vpsrlw %xmm3, %xmm4, %xmm3656; AVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0657; AVX1-NEXT:    vpor %xmm3, %xmm0, %xmm0658; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0659; AVX1-NEXT:    retq660;661; AVX2-LABEL: splatvar_rotate_v16i16:662; AVX2:       # %bb.0:663; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]664; AVX2-NEXT:    vpandn %xmm2, %xmm1, %xmm3665; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm4666; AVX2-NEXT:    vpsrlw %xmm3, %ymm4, %ymm3667; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1668; AVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0669; AVX2-NEXT:    vpor %ymm3, %ymm0, %ymm0670; AVX2-NEXT:    retq671;672; AVX512F-LABEL: splatvar_rotate_v16i16:673; AVX512F:       # %bb.0:674; AVX512F-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]675; AVX512F-NEXT:    vpandn %xmm2, %xmm1, %xmm3676; AVX512F-NEXT:    vpsrlw $1, %ymm0, %ymm4677; AVX512F-NEXT:    vpsrlw %xmm3, %ymm4, %ymm3678; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1679; AVX512F-NEXT:    vpsllw %xmm1, %ymm0, %ymm0680; AVX512F-NEXT:    vpor %ymm3, %ymm0, %ymm0681; AVX512F-NEXT:    retq682;683; AVX512VL-LABEL: splatvar_rotate_v16i16:684; AVX512VL:       # %bb.0:685; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]686; AVX512VL-NEXT:    vpandn %xmm2, %xmm1, %xmm3687; AVX512VL-NEXT:    vpsrlw $1, %ymm0, %ymm4688; AVX512VL-NEXT:    vpsrlw %xmm3, %ymm4, %ymm3689; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm1690; AVX512VL-NEXT:    vpsllw %xmm1, %ymm0, %ymm0691; AVX512VL-NEXT:    vpor %ymm3, %ymm0, %ymm0692; AVX512VL-NEXT:    retq693;694; AVX512BW-LABEL: splatvar_rotate_v16i16:695; AVX512BW:       # %bb.0:696; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]697; AVX512BW-NEXT:    vpandn %xmm2, %xmm1, %xmm3698; AVX512BW-NEXT:    vpsrlw $1, %ymm0, %ymm4699; AVX512BW-NEXT:    vpsrlw %xmm3, %ymm4, %ymm3700; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1701; AVX512BW-NEXT:    vpsllw %xmm1, %ymm0, %ymm0702; AVX512BW-NEXT:    vpor %ymm3, %ymm0, %ymm0703; AVX512BW-NEXT:    retq704;705; AVX512VLBW-LABEL: splatvar_rotate_v16i16:706; AVX512VLBW:       # %bb.0:707; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]708; AVX512VLBW-NEXT:    vpandn %xmm2, %xmm1, %xmm3709; AVX512VLBW-NEXT:    vpsrlw $1, %ymm0, %ymm4710; AVX512VLBW-NEXT:    vpsrlw %xmm3, %ymm4, %ymm3711; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm1712; AVX512VLBW-NEXT:    vpsllw %xmm1, %ymm0, %ymm0713; AVX512VLBW-NEXT:    vpor %ymm3, %ymm0, %ymm0714; AVX512VLBW-NEXT:    retq715;716; AVX512VBMI2-LABEL: splatvar_rotate_v16i16:717; AVX512VBMI2:       # %bb.0:718; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0719; AVX512VBMI2-NEXT:    vpbroadcastw %xmm1, %ymm1720; AVX512VBMI2-NEXT:    vpshldvw %zmm1, %zmm0, %zmm0721; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0722; AVX512VBMI2-NEXT:    retq723;724; AVX512VLVBMI2-LABEL: splatvar_rotate_v16i16:725; AVX512VLVBMI2:       # %bb.0:726; AVX512VLVBMI2-NEXT:    vpbroadcastw %xmm1, %ymm1727; AVX512VLVBMI2-NEXT:    vpshldvw %ymm1, %ymm0, %ymm0728; AVX512VLVBMI2-NEXT:    retq729;730; XOPAVX1-LABEL: splatvar_rotate_v16i16:731; XOPAVX1:       # %bb.0:732; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2733; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]734; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]735; XOPAVX1-NEXT:    vprotw %xmm1, %xmm2, %xmm2736; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0737; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0738; XOPAVX1-NEXT:    retq739;740; XOPAVX2-LABEL: splatvar_rotate_v16i16:741; XOPAVX2:       # %bb.0:742; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2743; XOPAVX2-NEXT:    vpbroadcastw %xmm1, %xmm1744; XOPAVX2-NEXT:    vprotw %xmm1, %xmm2, %xmm2745; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0746; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0747; XOPAVX2-NEXT:    retq748  %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer749  %splat16 = sub <16 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %splat750  %shl = shl <16 x i16> %a, %splat751  %lshr = lshr <16 x i16> %a, %splat16752  %or = or <16 x i16> %shl, %lshr753  ret <16 x i16> %or754}755 756define <32 x i8> @splatvar_rotate_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {757; AVX1-LABEL: splatvar_rotate_v32i8:758; AVX1:       # %bb.0:759; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1760; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2761; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]762; AVX1-NEXT:    vpsllw %xmm1, %xmm3, %xmm3763; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3764; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]765; AVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm2766; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2767; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2768; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]769; AVX1-NEXT:    vpsllw %xmm1, %xmm3, %xmm3770; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3771; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]772; AVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0773; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0774; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0775; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0776; AVX1-NEXT:    retq777;778; AVX2-LABEL: splatvar_rotate_v32i8:779; AVX2:       # %bb.0:780; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]781; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1782; AVX2-NEXT:    vpsllw %xmm1, %ymm2, %ymm2783; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2784; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]785; AVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0786; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0787; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0788; AVX2-NEXT:    retq789;790; AVX512-LABEL: splatvar_rotate_v32i8:791; AVX512:       # %bb.0:792; AVX512-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]793; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1794; AVX512-NEXT:    vpsllw %xmm1, %ymm2, %ymm2795; AVX512-NEXT:    vpsrlw $8, %ymm2, %ymm2796; AVX512-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]797; AVX512-NEXT:    vpsllw %xmm1, %ymm0, %ymm0798; AVX512-NEXT:    vpsrlw $8, %ymm0, %ymm0799; AVX512-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0800; AVX512-NEXT:    retq801;802; XOPAVX1-LABEL: splatvar_rotate_v32i8:803; XOPAVX1:       # %bb.0:804; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2805; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1806; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2807; XOPAVX1-NEXT:    vprotb %xmm1, %xmm2, %xmm2808; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0809; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0810; XOPAVX1-NEXT:    retq811;812; XOPAVX2-LABEL: splatvar_rotate_v32i8:813; XOPAVX2:       # %bb.0:814; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2815; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1816; XOPAVX2-NEXT:    vprotb %xmm1, %xmm2, %xmm2817; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0818; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0819; XOPAVX2-NEXT:    retq820  %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer821  %splat8 = sub <32 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>, %splat822  %shl = shl <32 x i8> %a, %splat823  %lshr = lshr <32 x i8> %a, %splat8824  %or = or <32 x i8> %shl, %lshr825  ret <32 x i8> %or826}827 828;829; Constant Rotates830;831 832define <4 x i64> @constant_rotate_v4i64(<4 x i64> %a) nounwind {833; AVX1-LABEL: constant_rotate_v4i64:834; AVX1:       # %bb.0:835; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1836; AVX1-NEXT:    vpsrlq $4, %xmm1, %xmm2837; AVX1-NEXT:    vpsrlq $14, %xmm1, %xmm3838; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]839; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm3840; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm4841; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]842; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2843; AVX1-NEXT:    vpsllq $60, %xmm1, %xmm3844; AVX1-NEXT:    vpsllq $50, %xmm1, %xmm1845; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]846; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm3847; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm0848; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]849; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0850; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0851; AVX1-NEXT:    retq852;853; AVX2-LABEL: constant_rotate_v4i64:854; AVX2:       # %bb.0:855; AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1856; AVX2-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0857; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0858; AVX2-NEXT:    retq859;860; AVX512NOVLX-LABEL: constant_rotate_v4i64:861; AVX512NOVLX:       # %bb.0:862; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0863; AVX512NOVLX-NEXT:    vpmovsxbq {{.*#+}} ymm1 = [4,14,50,60]864; AVX512NOVLX-NEXT:    vprolvq %zmm1, %zmm0, %zmm0865; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0866; AVX512NOVLX-NEXT:    retq867;868; AVX512VLX-LABEL: constant_rotate_v4i64:869; AVX512VLX:       # %bb.0:870; AVX512VLX-NEXT:    vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0871; AVX512VLX-NEXT:    retq872;873; XOPAVX1-LABEL: constant_rotate_v4i64:874; XOPAVX1:       # %bb.0:875; XOPAVX1-NEXT:    vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1876; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0877; XOPAVX1-NEXT:    vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0878; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0879; XOPAVX1-NEXT:    retq880;881; XOPAVX2-LABEL: constant_rotate_v4i64:882; XOPAVX2:       # %bb.0:883; XOPAVX2-NEXT:    vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1884; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0885; XOPAVX2-NEXT:    vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0886; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0887; XOPAVX2-NEXT:    retq888  %shl = shl <4 x i64> %a, <i64 4, i64 14, i64 50, i64 60>889  %lshr = lshr <4 x i64> %a, <i64 60, i64 50, i64 14, i64 4>890  %or = or <4 x i64> %shl, %lshr891  ret <4 x i64> %or892}893 894define <8 x i32> @constant_rotate_v8i32(<8 x i32> %a) nounwind {895; AVX1-LABEL: constant_rotate_v8i32:896; AVX1:       # %bb.0:897; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]898; AVX1-NEXT:    vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [32,u,128,u]899; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2900; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]901; AVX1-NEXT:    vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [512,u,2048,u]902; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1903; AVX1-NEXT:    vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [16,32,64,128]904; AVX1-NEXT:    vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [256,512,1024,2048]905; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0906; AVX1-NEXT:    vmovshdup {{.*#+}} ymm2 = ymm0[1,1,3,3,5,5,7,7]907; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]908; AVX1-NEXT:    vmovsldup {{.*#+}} ymm1 = ymm1[0,0,2,2,4,4,6,6]909; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]910; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0911; AVX1-NEXT:    retq912;913; AVX2-LABEL: constant_rotate_v8i32:914; AVX2:       # %bb.0:915; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1916; AVX2-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0917; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0918; AVX2-NEXT:    retq919;920; AVX512NOVLX-LABEL: constant_rotate_v8i32:921; AVX512NOVLX:       # %bb.0:922; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0923; AVX512NOVLX-NEXT:    vpmovsxbd {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]924; AVX512NOVLX-NEXT:    vprolvd %zmm1, %zmm0, %zmm0925; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0926; AVX512NOVLX-NEXT:    retq927;928; AVX512VLX-LABEL: constant_rotate_v8i32:929; AVX512VLX:       # %bb.0:930; AVX512VLX-NEXT:    vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0931; AVX512VLX-NEXT:    retq932;933; XOPAVX1-LABEL: constant_rotate_v8i32:934; XOPAVX1:       # %bb.0:935; XOPAVX1-NEXT:    vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1936; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0937; XOPAVX1-NEXT:    vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0938; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0939; XOPAVX1-NEXT:    retq940;941; XOPAVX2-LABEL: constant_rotate_v8i32:942; XOPAVX2:       # %bb.0:943; XOPAVX2-NEXT:    vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1944; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0945; XOPAVX2-NEXT:    vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0946; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0947; XOPAVX2-NEXT:    retq948  %shl = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>949  %lshr = lshr <8 x i32> %a, <i32 28, i32 27, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21>950  %or = or <8 x i32> %shl, %lshr951  ret <8 x i32> %or952}953 954define <16 x i16> @constant_rotate_v16i16(<16 x i16> %a) nounwind {955; AVX1-LABEL: constant_rotate_v16i16:956; AVX1:       # %bb.0:957; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1958; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]959; AVX1-NEXT:    vpmulhuw %xmm2, %xmm1, %xmm3960; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1961; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1962; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]963; AVX1-NEXT:    vpmulhuw %xmm2, %xmm0, %xmm3964; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0965; AVX1-NEXT:    vpor %xmm3, %xmm0, %xmm0966; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0967; AVX1-NEXT:    retq968;969; AVX2-LABEL: constant_rotate_v16i16:970; AVX2:       # %bb.0:971; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]972; AVX2-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2973; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0974; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0975; AVX2-NEXT:    retq976;977; AVX512F-LABEL: constant_rotate_v16i16:978; AVX512F:       # %bb.0:979; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]980; AVX512F-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2981; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm0982; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0983; AVX512F-NEXT:    retq984;985; AVX512VL-LABEL: constant_rotate_v16i16:986; AVX512VL:       # %bb.0:987; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]988; AVX512VL-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2989; AVX512VL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0990; AVX512VL-NEXT:    vpor %ymm2, %ymm0, %ymm0991; AVX512VL-NEXT:    retq992;993; AVX512BW-LABEL: constant_rotate_v16i16:994; AVX512BW:       # %bb.0:995; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0996; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]997; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm2 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]998; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm0, %zmm2999; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm01000; AVX512BW-NEXT:    vpor %ymm2, %ymm0, %ymm01001; AVX512BW-NEXT:    retq1002;1003; AVX512VLBW-LABEL: constant_rotate_v16i16:1004; AVX512VLBW:       # %bb.0:1005; AVX512VLBW-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm11006; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01007; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm01008; AVX512VLBW-NEXT:    retq1009;1010; AVX512VBMI2-LABEL: constant_rotate_v16i16:1011; AVX512VBMI2:       # %bb.0:1012; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01013; AVX512VBMI2-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]1014; AVX512VBMI2-NEXT:    vpshldvw %zmm1, %zmm0, %zmm01015; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01016; AVX512VBMI2-NEXT:    retq1017;1018; AVX512VLVBMI2-LABEL: constant_rotate_v16i16:1019; AVX512VLVBMI2:       # %bb.0:1020; AVX512VLVBMI2-NEXT:    vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01021; AVX512VLVBMI2-NEXT:    retq1022;1023; XOPAVX1-LABEL: constant_rotate_v16i16:1024; XOPAVX1:       # %bb.0:1025; XOPAVX1-NEXT:    vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11026; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01027; XOPAVX1-NEXT:    vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01028; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01029; XOPAVX1-NEXT:    retq1030;1031; XOPAVX2-LABEL: constant_rotate_v16i16:1032; XOPAVX2:       # %bb.0:1033; XOPAVX2-NEXT:    vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11034; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01035; XOPAVX2-NEXT:    vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01036; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01037; XOPAVX2-NEXT:    retq1038  %shl = 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>1039  %lshr = lshr <16 x i16> %a, <i16 16, i16 15, i16 14, i16 13, i16 12, i16 11, i16 10, i16 9, i16 8, i16 7, i16 6, i16 5, i16 4, i16 3, i16 2, i16 1>1040  %or = or <16 x i16> %shl, %lshr1041  ret <16 x i16> %or1042}1043 1044define <32 x i8> @constant_rotate_v32i8(<32 x i8> %a) nounwind {1045; AVX1-LABEL: constant_rotate_v32i8:1046; AVX1:       # %bb.0:1047; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11048; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1049; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = [1,128,64,32,16,8,4,2]1050; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm21051; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm21052; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1053; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]1054; AVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm11055; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm11056; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm11057; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1058; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm21059; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm21060; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1061; AVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm01062; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm01063; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01064; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01065; AVX1-NEXT:    retq1066;1067; AVX2-LABEL: constant_rotate_v32i8:1068; AVX2:       # %bb.0:1069; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1070; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]1071; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm11072; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1073; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1074; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm01075; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01076; AVX2-NEXT:    retq1077;1078; AVX512F-LABEL: constant_rotate_v32i8:1079; AVX512F:       # %bb.0:1080; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1081; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]1082; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm11083; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1084; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1085; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm01086; AVX512F-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01087; AVX512F-NEXT:    retq1088;1089; AVX512VL-LABEL: constant_rotate_v32i8:1090; AVX512VL:       # %bb.0:1091; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1092; AVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]1093; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm11094; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1095; AVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1096; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm01097; AVX512VL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01098; AVX512VL-NEXT:    retq1099;1100; AVX512BW-LABEL: constant_rotate_v32i8:1101; AVX512BW:       # %bb.0:1102; AVX512BW-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0]1103; AVX512BW-NEXT:    # ymm1 = mem[0,1,0,1]1104; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1105; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm2, %zmm11106; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm11107; AVX512BW-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0]1108; AVX512BW-NEXT:    # ymm2 = mem[0,1,0,1]1109; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1110; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm01111; AVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm01112; AVX512BW-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01113; AVX512BW-NEXT:    retq1114;1115; AVX512VLBW-LABEL: constant_rotate_v32i8:1116; AVX512VLBW:       # %bb.0:1117; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1118; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11119; AVX512VLBW-NEXT:    vpsrlw $8, %ymm1, %ymm11120; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1121; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01122; AVX512VLBW-NEXT:    vpsrlw $8, %ymm0, %ymm01123; AVX512VLBW-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01124; AVX512VLBW-NEXT:    retq1125;1126; AVX512VBMI2-LABEL: constant_rotate_v32i8:1127; AVX512VBMI2:       # %bb.0:1128; AVX512VBMI2-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0]1129; AVX512VBMI2-NEXT:    # ymm1 = mem[0,1,0,1]1130; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1131; AVX512VBMI2-NEXT:    vpsllvw %zmm1, %zmm2, %zmm11132; AVX512VBMI2-NEXT:    vpsrlw $8, %ymm1, %ymm11133; AVX512VBMI2-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0]1134; AVX512VBMI2-NEXT:    # ymm2 = mem[0,1,0,1]1135; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1136; AVX512VBMI2-NEXT:    vpsllvw %zmm2, %zmm0, %zmm01137; AVX512VBMI2-NEXT:    vpsrlw $8, %ymm0, %ymm01138; AVX512VBMI2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01139; AVX512VBMI2-NEXT:    retq1140;1141; AVX512VLVBMI2-LABEL: constant_rotate_v32i8:1142; AVX512VLVBMI2:       # %bb.0:1143; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1144; AVX512VLVBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11145; AVX512VLVBMI2-NEXT:    vpsrlw $8, %ymm1, %ymm11146; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1147; AVX512VLVBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01148; AVX512VLVBMI2-NEXT:    vpsrlw $8, %ymm0, %ymm01149; AVX512VLVBMI2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01150; AVX512VLVBMI2-NEXT:    retq1151;1152; XOPAVX1-LABEL: constant_rotate_v32i8:1153; XOPAVX1:       # %bb.0:1154; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11155; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]1156; XOPAVX1-NEXT:    vprotb %xmm2, %xmm1, %xmm11157; XOPAVX1-NEXT:    vprotb %xmm2, %xmm0, %xmm01158; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01159; XOPAVX1-NEXT:    retq1160;1161; XOPAVX2-LABEL: constant_rotate_v32i8:1162; XOPAVX2:       # %bb.0:1163; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11164; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]1165; XOPAVX2-NEXT:    vprotb %xmm2, %xmm1, %xmm11166; XOPAVX2-NEXT:    vprotb %xmm2, %xmm0, %xmm01167; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01168; XOPAVX2-NEXT:    retq1169  %shl = shl <32 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>1170  %lshr = lshr <32 x i8> %a, <i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>1171  %or = or <32 x i8> %shl, %lshr1172  ret <32 x i8> %or1173}1174 1175;1176; Uniform Constant Rotates1177;1178 1179define <4 x i64> @splatconstant_rotate_v4i64(<4 x i64> %a) nounwind {1180; AVX1-LABEL: splatconstant_rotate_v4i64:1181; AVX1:       # %bb.0:1182; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm11183; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21184; AVX1-NEXT:    vpsrlq $50, %xmm2, %xmm31185; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm11186; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm01187; AVX1-NEXT:    vpsllq $14, %xmm2, %xmm21188; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01189; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01190; AVX1-NEXT:    retq1191;1192; AVX2-LABEL: splatconstant_rotate_v4i64:1193; AVX2:       # %bb.0:1194; AVX2-NEXT:    vpsrlq $50, %ymm0, %ymm11195; AVX2-NEXT:    vpsllq $14, %ymm0, %ymm01196; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01197; AVX2-NEXT:    retq1198;1199; AVX512NOVLX-LABEL: splatconstant_rotate_v4i64:1200; AVX512NOVLX:       # %bb.0:1201; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01202; AVX512NOVLX-NEXT:    vprolq $14, %zmm0, %zmm01203; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01204; AVX512NOVLX-NEXT:    retq1205;1206; AVX512VLX-LABEL: splatconstant_rotate_v4i64:1207; AVX512VLX:       # %bb.0:1208; AVX512VLX-NEXT:    vprolq $14, %ymm0, %ymm01209; AVX512VLX-NEXT:    retq1210;1211; XOPAVX1-LABEL: splatconstant_rotate_v4i64:1212; XOPAVX1:       # %bb.0:1213; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm11214; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01215; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm01216; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01217; XOPAVX1-NEXT:    retq1218;1219; XOPAVX2-LABEL: splatconstant_rotate_v4i64:1220; XOPAVX2:       # %bb.0:1221; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm11222; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01223; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm01224; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01225; XOPAVX2-NEXT:    retq1226  %shl = shl <4 x i64> %a, <i64 14, i64 14, i64 14, i64 14>1227  %lshr = lshr <4 x i64> %a, <i64 50, i64 50, i64 50, i64 50>1228  %or = or <4 x i64> %shl, %lshr1229  ret <4 x i64> %or1230}1231 1232define <8 x i32> @splatconstant_rotate_v8i32(<8 x i32> %a) nounwind {1233; AVX1-LABEL: splatconstant_rotate_v8i32:1234; AVX1:       # %bb.0:1235; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11236; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm21237; AVX1-NEXT:    vpslld $4, %xmm1, %xmm11238; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm11239; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm21240; AVX1-NEXT:    vpslld $4, %xmm0, %xmm01241; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm01242; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01243; AVX1-NEXT:    retq1244;1245; AVX2-LABEL: splatconstant_rotate_v8i32:1246; AVX2:       # %bb.0:1247; AVX2-NEXT:    vpsrld $28, %ymm0, %ymm11248; AVX2-NEXT:    vpslld $4, %ymm0, %ymm01249; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01250; AVX2-NEXT:    retq1251;1252; AVX512NOVLX-LABEL: splatconstant_rotate_v8i32:1253; AVX512NOVLX:       # %bb.0:1254; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01255; AVX512NOVLX-NEXT:    vprold $4, %zmm0, %zmm01256; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01257; AVX512NOVLX-NEXT:    retq1258;1259; AVX512VLX-LABEL: splatconstant_rotate_v8i32:1260; AVX512VLX:       # %bb.0:1261; AVX512VLX-NEXT:    vprold $4, %ymm0, %ymm01262; AVX512VLX-NEXT:    retq1263;1264; XOPAVX1-LABEL: splatconstant_rotate_v8i32:1265; XOPAVX1:       # %bb.0:1266; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm11267; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01268; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm01269; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01270; XOPAVX1-NEXT:    retq1271;1272; XOPAVX2-LABEL: splatconstant_rotate_v8i32:1273; XOPAVX2:       # %bb.0:1274; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm11275; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01276; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm01277; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01278; XOPAVX2-NEXT:    retq1279  %shl = shl <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>1280  %lshr = lshr <8 x i32> %a, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>1281  %or = or <8 x i32> %shl, %lshr1282  ret <8 x i32> %or1283}1284 1285define <16 x i16> @splatconstant_rotate_v16i16(<16 x i16> %a) nounwind {1286; AVX1-LABEL: splatconstant_rotate_v16i16:1287; AVX1:       # %bb.0:1288; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11289; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm21290; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm11291; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm11292; AVX1-NEXT:    vpsrlw $9, %xmm0, %xmm21293; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm01294; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm01295; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01296; AVX1-NEXT:    retq1297;1298; AVX2-LABEL: splatconstant_rotate_v16i16:1299; AVX2:       # %bb.0:1300; AVX2-NEXT:    vpsrlw $9, %ymm0, %ymm11301; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm01302; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01303; AVX2-NEXT:    retq1304;1305; AVX512F-LABEL: splatconstant_rotate_v16i16:1306; AVX512F:       # %bb.0:1307; AVX512F-NEXT:    vpsrlw $9, %ymm0, %ymm11308; AVX512F-NEXT:    vpsllw $7, %ymm0, %ymm01309; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm01310; AVX512F-NEXT:    retq1311;1312; AVX512VL-LABEL: splatconstant_rotate_v16i16:1313; AVX512VL:       # %bb.0:1314; AVX512VL-NEXT:    vpsrlw $9, %ymm0, %ymm11315; AVX512VL-NEXT:    vpsllw $7, %ymm0, %ymm01316; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm01317; AVX512VL-NEXT:    retq1318;1319; AVX512BW-LABEL: splatconstant_rotate_v16i16:1320; AVX512BW:       # %bb.0:1321; AVX512BW-NEXT:    vpsrlw $9, %ymm0, %ymm11322; AVX512BW-NEXT:    vpsllw $7, %ymm0, %ymm01323; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm01324; AVX512BW-NEXT:    retq1325;1326; AVX512VLBW-LABEL: splatconstant_rotate_v16i16:1327; AVX512VLBW:       # %bb.0:1328; AVX512VLBW-NEXT:    vpsrlw $9, %ymm0, %ymm11329; AVX512VLBW-NEXT:    vpsllw $7, %ymm0, %ymm01330; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm01331; AVX512VLBW-NEXT:    retq1332;1333; AVX512VBMI2-LABEL: splatconstant_rotate_v16i16:1334; AVX512VBMI2:       # %bb.0:1335; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01336; AVX512VBMI2-NEXT:    vpshldw $7, %zmm0, %zmm0, %zmm01337; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01338; AVX512VBMI2-NEXT:    retq1339;1340; AVX512VLVBMI2-LABEL: splatconstant_rotate_v16i16:1341; AVX512VLVBMI2:       # %bb.0:1342; AVX512VLVBMI2-NEXT:    vpshldw $7, %ymm0, %ymm0, %ymm01343; AVX512VLVBMI2-NEXT:    retq1344;1345; XOPAVX1-LABEL: splatconstant_rotate_v16i16:1346; XOPAVX1:       # %bb.0:1347; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm11348; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01349; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm01350; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01351; XOPAVX1-NEXT:    retq1352;1353; XOPAVX2-LABEL: splatconstant_rotate_v16i16:1354; XOPAVX2:       # %bb.0:1355; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm11356; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01357; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm01358; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01359; XOPAVX2-NEXT:    retq1360  %shl = shl <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>1361  %lshr = lshr <16 x i16> %a, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>1362  %or = or <16 x i16> %shl, %lshr1363  ret <16 x i16> %or1364}1365 1366define <32 x i8> @splatconstant_rotate_v32i8(<32 x i8> %a) nounwind {1367; AVX1-LABEL: splatconstant_rotate_v32i8:1368; AVX1:       # %bb.0:1369; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm11370; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21371; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm31372; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm11373; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]1374; AVX1-NEXT:    vandnps %ymm1, %ymm3, %ymm11375; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm01376; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm21377; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01378; AVX1-NEXT:    vandps %ymm3, %ymm0, %ymm01379; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01380; AVX1-NEXT:    retq1381;1382; AVX2-LABEL: splatconstant_rotate_v32i8:1383; AVX2:       # %bb.0:1384; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm11385; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11386; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm01387; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01388; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01389; AVX2-NEXT:    retq1390;1391; AVX512NOVLX-LABEL: splatconstant_rotate_v32i8:1392; AVX512NOVLX:       # %bb.0:1393; AVX512NOVLX-NEXT:    vpsllw $4, %ymm0, %ymm11394; AVX512NOVLX-NEXT:    vpsrlw $4, %ymm0, %ymm01395; AVX512NOVLX-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1396; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01397; AVX512NOVLX-NEXT:    retq1398;1399; AVX512VLX-LABEL: splatconstant_rotate_v32i8:1400; AVX512VLX:       # %bb.0:1401; AVX512VLX-NEXT:    vpsllw $4, %ymm0, %ymm11402; AVX512VLX-NEXT:    vpsrlw $4, %ymm0, %ymm01403; AVX512VLX-NEXT:    vpternlogd {{.*#+}} ymm0 = ymm0 ^ (m32bcst & (ymm0 ^ ymm1))1404; AVX512VLX-NEXT:    retq1405;1406; XOPAVX1-LABEL: splatconstant_rotate_v32i8:1407; XOPAVX1:       # %bb.0:1408; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm11409; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01410; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm01411; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01412; XOPAVX1-NEXT:    retq1413;1414; XOPAVX2-LABEL: splatconstant_rotate_v32i8:1415; XOPAVX2:       # %bb.0:1416; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm11417; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01418; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm01419; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01420; XOPAVX2-NEXT:    retq1421  %shl = shl <32 x i8> %a, <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>1422  %lshr = lshr <32 x i8> %a, <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>1423  %or = or <32 x i8> %shl, %lshr1424  ret <32 x i8> %or1425}1426 1427;1428; Masked Uniform Constant Rotates1429;1430 1431define <4 x i64> @splatconstant_rotate_mask_v4i64(<4 x i64> %a) nounwind {1432; AVX1-LABEL: splatconstant_rotate_mask_v4i64:1433; AVX1:       # %bb.0:1434; AVX1-NEXT:    vpsrlq $49, %xmm0, %xmm11435; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01436; AVX1-NEXT:    vpsrlq $49, %xmm0, %xmm01437; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01438; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01439; AVX1-NEXT:    retq1440;1441; AVX2-LABEL: splatconstant_rotate_mask_v4i64:1442; AVX2:       # %bb.0:1443; AVX2-NEXT:    vpsrlq $49, %ymm0, %ymm01444; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01445; AVX2-NEXT:    retq1446;1447; AVX512-LABEL: splatconstant_rotate_mask_v4i64:1448; AVX512:       # %bb.0:1449; AVX512-NEXT:    vpsrlq $49, %ymm0, %ymm01450; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01451; AVX512-NEXT:    retq1452;1453; XOPAVX1-LABEL: splatconstant_rotate_mask_v4i64:1454; XOPAVX1:       # %bb.0:1455; XOPAVX1-NEXT:    vpsrlq $49, %xmm0, %xmm11456; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01457; XOPAVX1-NEXT:    vpsrlq $49, %xmm0, %xmm01458; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01459; XOPAVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01460; XOPAVX1-NEXT:    retq1461;1462; XOPAVX2-LABEL: splatconstant_rotate_mask_v4i64:1463; XOPAVX2:       # %bb.0:1464; XOPAVX2-NEXT:    vpsrlq $49, %ymm0, %ymm01465; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01466; XOPAVX2-NEXT:    retq1467  %shl = shl <4 x i64> %a, <i64 15, i64 15, i64 15, i64 15>1468  %lshr = lshr <4 x i64> %a, <i64 49, i64 49, i64 49, i64 49>1469  %rmask = and <4 x i64> %lshr, <i64 255, i64 127, i64 127, i64 255>1470  %lmask = and <4 x i64> %shl, <i64 33, i64 65, i64 129, i64 257>1471  %or = or <4 x i64> %lmask, %rmask1472  ret <4 x i64> %or1473}1474 1475define <8 x i32> @splatconstant_rotate_mask_v8i32(<8 x i32> %a) nounwind {1476; AVX1-LABEL: splatconstant_rotate_mask_v8i32:1477; AVX1:       # %bb.0:1478; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11479; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm21480; AVX1-NEXT:    vpslld $4, %xmm1, %xmm11481; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm11482; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm21483; AVX1-NEXT:    vpslld $4, %xmm0, %xmm01484; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm01485; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01486; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01487; AVX1-NEXT:    retq1488;1489; AVX2-LABEL: splatconstant_rotate_mask_v8i32:1490; AVX2:       # %bb.0:1491; AVX2-NEXT:    vpsrld $28, %ymm0, %ymm11492; AVX2-NEXT:    vpslld $4, %ymm0, %ymm01493; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01494; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01495; AVX2-NEXT:    retq1496;1497; AVX512NOVLX-LABEL: splatconstant_rotate_mask_v8i32:1498; AVX512NOVLX:       # %bb.0:1499; AVX512NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01500; AVX512NOVLX-NEXT:    vprold $4, %zmm0, %zmm01501; AVX512NOVLX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01502; AVX512NOVLX-NEXT:    retq1503;1504; AVX512VLX-LABEL: splatconstant_rotate_mask_v8i32:1505; AVX512VLX:       # %bb.0:1506; AVX512VLX-NEXT:    vprold $4, %ymm0, %ymm01507; AVX512VLX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01508; AVX512VLX-NEXT:    retq1509;1510; XOPAVX1-LABEL: splatconstant_rotate_mask_v8i32:1511; XOPAVX1:       # %bb.0:1512; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm11513; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01514; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm01515; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01516; XOPAVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01517; XOPAVX1-NEXT:    retq1518;1519; XOPAVX2-LABEL: splatconstant_rotate_mask_v8i32:1520; XOPAVX2:       # %bb.0:1521; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm11522; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01523; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm01524; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01525; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01526; XOPAVX2-NEXT:    retq1527  %shl = shl <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>1528  %lshr = lshr <8 x i32> %a, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>1529  %rmask = and <8 x i32> %lshr, <i32 3, i32 7, i32 15, i32 31, i32 63, i32 127, i32 255, i32 511>1530  %lmask = and <8 x i32> %shl, <i32 511, i32 255, i32 127, i32 63, i32 31, i32 15, i32 7, i32 3>1531  %or = or <8 x i32> %lmask, %rmask1532  ret <8 x i32> %or1533}1534 1535define <16 x i16> @splatconstant_rotate_mask_v16i16(<16 x i16> %a) nounwind {1536; AVX1-LABEL: splatconstant_rotate_mask_v16i16:1537; AVX1:       # %bb.0:1538; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11539; AVX1-NEXT:    vpsrlw $11, %xmm1, %xmm21540; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm11541; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm11542; AVX1-NEXT:    vpsrlw $11, %xmm0, %xmm21543; AVX1-NEXT:    vpsllw $5, %xmm0, %xmm01544; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm01545; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01546; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01547; AVX1-NEXT:    retq1548;1549; AVX2-LABEL: splatconstant_rotate_mask_v16i16:1550; AVX2:       # %bb.0:1551; AVX2-NEXT:    vpsrlw $11, %ymm0, %ymm11552; AVX2-NEXT:    vpsllw $5, %ymm0, %ymm01553; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01554; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01555; AVX2-NEXT:    retq1556;1557; AVX512F-LABEL: splatconstant_rotate_mask_v16i16:1558; AVX512F:       # %bb.0:1559; AVX512F-NEXT:    vpsrlw $11, %ymm0, %ymm11560; AVX512F-NEXT:    vpsllw $5, %ymm0, %ymm01561; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm01562; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01563; AVX512F-NEXT:    retq1564;1565; AVX512VL-LABEL: splatconstant_rotate_mask_v16i16:1566; AVX512VL:       # %bb.0:1567; AVX512VL-NEXT:    vpsllw $5, %ymm0, %ymm11568; AVX512VL-NEXT:    vpsrlw $11, %ymm0, %ymm01569; AVX512VL-NEXT:    vpternlogd {{.*#+}} ymm0 = m32bcst & (ymm0 | ymm1)1570; AVX512VL-NEXT:    retq1571;1572; AVX512BW-LABEL: splatconstant_rotate_mask_v16i16:1573; AVX512BW:       # %bb.0:1574; AVX512BW-NEXT:    vpsrlw $11, %ymm0, %ymm11575; AVX512BW-NEXT:    vpsllw $5, %ymm0, %ymm01576; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm01577; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01578; AVX512BW-NEXT:    retq1579;1580; AVX512VLBW-LABEL: splatconstant_rotate_mask_v16i16:1581; AVX512VLBW:       # %bb.0:1582; AVX512VLBW-NEXT:    vpsllw $5, %ymm0, %ymm11583; AVX512VLBW-NEXT:    vpsrlw $11, %ymm0, %ymm01584; AVX512VLBW-NEXT:    vpternlogd {{.*#+}} ymm0 = m32bcst & (ymm0 | ymm1)1585; AVX512VLBW-NEXT:    retq1586;1587; AVX512VBMI2-LABEL: splatconstant_rotate_mask_v16i16:1588; AVX512VBMI2:       # %bb.0:1589; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01590; AVX512VBMI2-NEXT:    vpshldw $5, %zmm0, %zmm0, %zmm01591; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01592; AVX512VBMI2-NEXT:    retq1593;1594; AVX512VLVBMI2-LABEL: splatconstant_rotate_mask_v16i16:1595; AVX512VLVBMI2:       # %bb.0:1596; AVX512VLVBMI2-NEXT:    vpshldw $5, %ymm0, %ymm0, %ymm01597; AVX512VLVBMI2-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm01598; AVX512VLVBMI2-NEXT:    retq1599;1600; XOPAVX1-LABEL: splatconstant_rotate_mask_v16i16:1601; XOPAVX1:       # %bb.0:1602; XOPAVX1-NEXT:    vprotw $5, %xmm0, %xmm11603; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01604; XOPAVX1-NEXT:    vprotw $5, %xmm0, %xmm01605; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01606; XOPAVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01607; XOPAVX1-NEXT:    retq1608;1609; XOPAVX2-LABEL: splatconstant_rotate_mask_v16i16:1610; XOPAVX2:       # %bb.0:1611; XOPAVX2-NEXT:    vprotw $5, %xmm0, %xmm11612; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01613; XOPAVX2-NEXT:    vprotw $5, %xmm0, %xmm01614; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01615; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01616; XOPAVX2-NEXT:    retq1617  %shl = shl <16 x i16> %a, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>1618  %lshr = lshr <16 x i16> %a, <i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11>1619  %rmask = and <16 x i16> %lshr, <i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55>1620  %lmask = and <16 x i16> %shl, <i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33>1621  %or = or <16 x i16> %lmask, %rmask1622  ret <16 x i16> %or1623}1624 1625define <32 x i8> @splatconstant_rotate_mask_v32i8(<32 x i8> %a) nounwind {1626; AVX1-LABEL: splatconstant_rotate_mask_v32i8:1627; AVX1:       # %bb.0:1628; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm11629; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21630; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm31631; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm11632; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]1633; AVX1-NEXT:    vandnps %ymm1, %ymm3, %ymm11634; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm01635; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm21636; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01637; AVX1-NEXT:    vandps %ymm3, %ymm0, %ymm01638; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01639; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01640; AVX1-NEXT:    retq1641;1642; AVX2-LABEL: splatconstant_rotate_mask_v32i8:1643; AVX2:       # %bb.0:1644; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm11645; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11646; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm01647; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01648; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01649; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01650; AVX2-NEXT:    retq1651;1652; AVX512NOVLX-LABEL: splatconstant_rotate_mask_v32i8:1653; AVX512NOVLX:       # %bb.0:1654; AVX512NOVLX-NEXT:    vpsllw $4, %ymm0, %ymm11655; AVX512NOVLX-NEXT:    vpsrlw $4, %ymm0, %ymm01656; AVX512NOVLX-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1657; AVX512NOVLX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01658; AVX512NOVLX-NEXT:    retq1659;1660; AVX512VLX-LABEL: splatconstant_rotate_mask_v32i8:1661; AVX512VLX:       # %bb.0:1662; AVX512VLX-NEXT:    vpsllw $4, %ymm0, %ymm11663; AVX512VLX-NEXT:    vpsrlw $4, %ymm0, %ymm01664; AVX512VLX-NEXT:    vpternlogd {{.*#+}} ymm0 = ymm0 ^ (m32bcst & (ymm0 ^ ymm1))1665; AVX512VLX-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm01666; AVX512VLX-NEXT:    retq1667;1668; XOPAVX1-LABEL: splatconstant_rotate_mask_v32i8:1669; XOPAVX1:       # %bb.0:1670; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm11671; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01672; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm01673; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01674; XOPAVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01675; XOPAVX1-NEXT:    retq1676;1677; XOPAVX2-LABEL: splatconstant_rotate_mask_v32i8:1678; XOPAVX2:       # %bb.0:1679; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm11680; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01681; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm01682; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01683; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01684; XOPAVX2-NEXT:    retq1685  %shl = shl <32 x i8> %a, <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>1686  %lshr = lshr <32 x i8> %a, <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>1687  %rmask = and <32 x i8> %lshr, <i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55>1688  %lmask = and <32 x i8> %shl, <i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33>1689  %or = or <32 x i8> %lmask, %rmask1690  ret <32 x i8> %or1691}1692