brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.5 KiB · 8f78438 Raw
674 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-prefixes=ALL,AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX24 5;6; Unary shuffle indices from registers7;8 9define <4 x double> @var_shuffle_v4f64_v4f64_xxxx_i64(<4 x double> %x, i64 %i0, i64 %i1, i64 %i2, i64 %i3) nounwind {10; ALL-LABEL: var_shuffle_v4f64_v4f64_xxxx_i64:11; ALL:       # %bb.0:12; ALL-NEXT:    pushq %rbp13; ALL-NEXT:    movq %rsp, %rbp14; ALL-NEXT:    andq $-32, %rsp15; ALL-NEXT:    subq $64, %rsp16; ALL-NEXT:    andl $3, %esi17; ALL-NEXT:    andl $3, %edi18; ALL-NEXT:    andl $3, %ecx19; ALL-NEXT:    andl $3, %edx20; ALL-NEXT:    vmovaps %ymm0, (%rsp)21; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero22; ALL-NEXT:    vmovhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]23; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero24; ALL-NEXT:    vmovhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1]25; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm026; ALL-NEXT:    movq %rbp, %rsp27; ALL-NEXT:    popq %rbp28; ALL-NEXT:    retq29  %x0 = extractelement <4 x double> %x, i64 %i030  %x1 = extractelement <4 x double> %x, i64 %i131  %x2 = extractelement <4 x double> %x, i64 %i232  %x3 = extractelement <4 x double> %x, i64 %i333  %r0 = insertelement <4 x double> undef, double %x0, i32 034  %r1 = insertelement <4 x double>   %r0, double %x1, i32 135  %r2 = insertelement <4 x double>   %r1, double %x2, i32 236  %r3 = insertelement <4 x double>   %r2, double %x3, i32 337  ret <4 x double> %r338}39 40define <4 x double> @var_shuffle_v4f64_v4f64_uxx0_i64(<4 x double> %x, i64 %i0, i64 %i1, i64 %i2, i64 %i3) nounwind {41; ALL-LABEL: var_shuffle_v4f64_v4f64_uxx0_i64:42; ALL:       # %bb.0:43; ALL-NEXT:    pushq %rbp44; ALL-NEXT:    movq %rsp, %rbp45; ALL-NEXT:    andq $-32, %rsp46; ALL-NEXT:    subq $64, %rsp47; ALL-NEXT:    andl $3, %edx48; ALL-NEXT:    andl $3, %esi49; ALL-NEXT:    vmovaps %ymm0, (%rsp)50; ALL-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]51; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero52; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm053; ALL-NEXT:    movq %rbp, %rsp54; ALL-NEXT:    popq %rbp55; ALL-NEXT:    retq56  %x0 = extractelement <4 x double> %x, i64 %i057  %x1 = extractelement <4 x double> %x, i64 %i158  %x2 = extractelement <4 x double> %x, i64 %i259  %x3 = extractelement <4 x double> %x, i64 %i360  %r0 = insertelement <4 x double> undef, double undef, i32 061  %r1 = insertelement <4 x double>   %r0, double   %x1, i32 162  %r2 = insertelement <4 x double>   %r1, double   %x2, i32 263  %r3 = insertelement <4 x double>   %r2, double   0.0, i32 364  ret <4 x double> %r365}66 67define <4 x double> @var_shuffle_v4f64_v2f64_xxxx_i64(<2 x double> %x, i64 %i0, i64 %i1, i64 %i2, i64 %i3) nounwind {68; ALL-LABEL: var_shuffle_v4f64_v2f64_xxxx_i64:69; ALL:       # %bb.0:70; ALL-NEXT:    andl $1, %esi71; ALL-NEXT:    andl $1, %edi72; ALL-NEXT:    andl $1, %ecx73; ALL-NEXT:    andl $1, %edx74; ALL-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)75; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero76; ALL-NEXT:    vmovhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]77; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero78; ALL-NEXT:    vmovhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1]79; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm080; ALL-NEXT:    retq81  %x0 = extractelement <2 x double> %x, i64 %i082  %x1 = extractelement <2 x double> %x, i64 %i183  %x2 = extractelement <2 x double> %x, i64 %i284  %x3 = extractelement <2 x double> %x, i64 %i385  %r0 = insertelement <4 x double> undef, double %x0, i32 086  %r1 = insertelement <4 x double>   %r0, double %x1, i32 187  %r2 = insertelement <4 x double>   %r1, double %x2, i32 288  %r3 = insertelement <4 x double>   %r2, double %x3, i32 389  ret <4 x double> %r390}91 92define <4 x i64> @var_shuffle_v4i64_v4i64_xxxx_i64(<4 x i64> %x, i64 %i0, i64 %i1, i64 %i2, i64 %i3) nounwind {93; ALL-LABEL: var_shuffle_v4i64_v4i64_xxxx_i64:94; ALL:       # %bb.0:95; ALL-NEXT:    pushq %rbp96; ALL-NEXT:    movq %rsp, %rbp97; ALL-NEXT:    andq $-32, %rsp98; ALL-NEXT:    subq $64, %rsp99; ALL-NEXT:    andl $3, %edi100; ALL-NEXT:    andl $3, %esi101; ALL-NEXT:    andl $3, %edx102; ALL-NEXT:    andl $3, %ecx103; ALL-NEXT:    vmovaps %ymm0, (%rsp)104; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero105; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero106; ALL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]107; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero108; ALL-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero109; ALL-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm2[0],xmm1[0]110; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0111; ALL-NEXT:    movq %rbp, %rsp112; ALL-NEXT:    popq %rbp113; ALL-NEXT:    retq114  %x0 = extractelement <4 x i64> %x, i64 %i0115  %x1 = extractelement <4 x i64> %x, i64 %i1116  %x2 = extractelement <4 x i64> %x, i64 %i2117  %x3 = extractelement <4 x i64> %x, i64 %i3118  %r0 = insertelement <4 x i64> undef, i64 %x0, i32 0119  %r1 = insertelement <4 x i64>   %r0, i64 %x1, i32 1120  %r2 = insertelement <4 x i64>   %r1, i64 %x2, i32 2121  %r3 = insertelement <4 x i64>   %r2, i64 %x3, i32 3122  ret <4 x i64> %r3123}124 125define <4 x i64> @var_shuffle_v4i64_v4i64_xx00_i64(<4 x i64> %x, i64 %i0, i64 %i1, i64 %i2, i64 %i3) nounwind {126; ALL-LABEL: var_shuffle_v4i64_v4i64_xx00_i64:127; ALL:       # %bb.0:128; ALL-NEXT:    pushq %rbp129; ALL-NEXT:    movq %rsp, %rbp130; ALL-NEXT:    andq $-32, %rsp131; ALL-NEXT:    subq $64, %rsp132; ALL-NEXT:    andl $3, %edi133; ALL-NEXT:    andl $3, %esi134; ALL-NEXT:    vmovaps %ymm0, (%rsp)135; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero136; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero137; ALL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]138; ALL-NEXT:    movq %rbp, %rsp139; ALL-NEXT:    popq %rbp140; ALL-NEXT:    retq141  %x0 = extractelement <4 x i64> %x, i64 %i0142  %x1 = extractelement <4 x i64> %x, i64 %i1143  %x2 = extractelement <4 x i64> %x, i64 %i2144  %x3 = extractelement <4 x i64> %x, i64 %i3145  %r0 = insertelement <4 x i64> undef, i64 %x0, i32 0146  %r1 = insertelement <4 x i64>   %r0, i64 %x1, i32 1147  %r2 = insertelement <4 x i64>   %r1, i64   0, i32 2148  %r3 = insertelement <4 x i64>   %r2, i64   0, i32 3149  ret <4 x i64> %r3150}151 152define <4 x i64> @var_shuffle_v4i64_v2i64_xxxx_i64(<2 x i64> %x, i64 %i0, i64 %i1, i64 %i2, i64 %i3) nounwind {153; ALL-LABEL: var_shuffle_v4i64_v2i64_xxxx_i64:154; ALL:       # %bb.0:155; ALL-NEXT:    andl $1, %edi156; ALL-NEXT:    andl $1, %esi157; ALL-NEXT:    andl $1, %edx158; ALL-NEXT:    andl $1, %ecx159; ALL-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)160; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero161; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero162; ALL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]163; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero164; ALL-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero165; ALL-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm2[0],xmm1[0]166; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0167; ALL-NEXT:    retq168  %x0 = extractelement <2 x i64> %x, i64 %i0169  %x1 = extractelement <2 x i64> %x, i64 %i1170  %x2 = extractelement <2 x i64> %x, i64 %i2171  %x3 = extractelement <2 x i64> %x, i64 %i3172  %r0 = insertelement <4 x i64> undef, i64 %x0, i32 0173  %r1 = insertelement <4 x i64>   %r0, i64 %x1, i32 1174  %r2 = insertelement <4 x i64>   %r1, i64 %x2, i32 2175  %r3 = insertelement <4 x i64>   %r2, i64 %x3, i32 3176  ret <4 x i64> %r3177}178 179define <8 x float> @var_shuffle_v8f32_v8f32_xxxxxxxx_i32(<8 x float> %x, i32 %i0, i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7) nounwind {180; ALL-LABEL: var_shuffle_v8f32_v8f32_xxxxxxxx_i32:181; ALL:       # %bb.0:182; ALL-NEXT:    pushq %rbp183; ALL-NEXT:    movq %rsp, %rbp184; ALL-NEXT:    andq $-32, %rsp185; ALL-NEXT:    subq $64, %rsp186; ALL-NEXT:    # kill: def $r9d killed $r9d def $r9187; ALL-NEXT:    # kill: def $r8d killed $r8d def $r8188; ALL-NEXT:    # kill: def $ecx killed $ecx def $rcx189; ALL-NEXT:    # kill: def $edx killed $edx def $rdx190; ALL-NEXT:    # kill: def $esi killed $esi def $rsi191; ALL-NEXT:    # kill: def $edi killed $edi def $rdi192; ALL-NEXT:    movl 24(%rbp), %eax193; ALL-NEXT:    andl $7, %eax194; ALL-NEXT:    movl 16(%rbp), %r10d195; ALL-NEXT:    andl $7, %r10d196; ALL-NEXT:    andl $7, %edi197; ALL-NEXT:    andl $7, %esi198; ALL-NEXT:    andl $7, %edx199; ALL-NEXT:    andl $7, %ecx200; ALL-NEXT:    andl $7, %r8d201; ALL-NEXT:    vmovaps %ymm0, (%rsp)202; ALL-NEXT:    andl $7, %r9d203; ALL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero204; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]205; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]206; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]207; ALL-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero208; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]209; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3]210; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],mem[0]211; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0212; ALL-NEXT:    movq %rbp, %rsp213; ALL-NEXT:    popq %rbp214; ALL-NEXT:    retq215  %x0 = extractelement <8 x float> %x, i32 %i0216  %x1 = extractelement <8 x float> %x, i32 %i1217  %x2 = extractelement <8 x float> %x, i32 %i2218  %x3 = extractelement <8 x float> %x, i32 %i3219  %x4 = extractelement <8 x float> %x, i32 %i4220  %x5 = extractelement <8 x float> %x, i32 %i5221  %x6 = extractelement <8 x float> %x, i32 %i6222  %x7 = extractelement <8 x float> %x, i32 %i7223  %r0 = insertelement <8 x float> undef, float %x0, i32 0224  %r1 = insertelement <8 x float>   %r0, float %x1, i32 1225  %r2 = insertelement <8 x float>   %r1, float %x2, i32 2226  %r3 = insertelement <8 x float>   %r2, float %x3, i32 3227  %r4 = insertelement <8 x float>   %r3, float %x4, i32 4228  %r5 = insertelement <8 x float>   %r4, float %x5, i32 5229  %r6 = insertelement <8 x float>   %r5, float %x6, i32 6230  %r7 = insertelement <8 x float>   %r6, float %x7, i32 7231  ret <8 x float> %r7232}233 234define <8 x float> @var_shuffle_v8f32_v4f32_xxxxxxxx_i32(<4 x float> %x, i32 %i0, i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7) nounwind {235; ALL-LABEL: var_shuffle_v8f32_v4f32_xxxxxxxx_i32:236; ALL:       # %bb.0:237; ALL-NEXT:    # kill: def $r9d killed $r9d def $r9238; ALL-NEXT:    # kill: def $r8d killed $r8d def $r8239; ALL-NEXT:    # kill: def $ecx killed $ecx def $rcx240; ALL-NEXT:    # kill: def $edx killed $edx def $rdx241; ALL-NEXT:    # kill: def $esi killed $esi def $rsi242; ALL-NEXT:    # kill: def $edi killed $edi def $rdi243; ALL-NEXT:    movl {{[0-9]+}}(%rsp), %eax244; ALL-NEXT:    andl $3, %eax245; ALL-NEXT:    movl {{[0-9]+}}(%rsp), %r10d246; ALL-NEXT:    andl $3, %r10d247; ALL-NEXT:    andl $3, %edi248; ALL-NEXT:    andl $3, %esi249; ALL-NEXT:    andl $3, %edx250; ALL-NEXT:    andl $3, %ecx251; ALL-NEXT:    andl $3, %r8d252; ALL-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)253; ALL-NEXT:    andl $3, %r9d254; ALL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero255; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]256; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]257; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]258; ALL-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero259; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]260; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3]261; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],mem[0]262; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0263; ALL-NEXT:    retq264  %x0 = extractelement <4 x float> %x, i32 %i0265  %x1 = extractelement <4 x float> %x, i32 %i1266  %x2 = extractelement <4 x float> %x, i32 %i2267  %x3 = extractelement <4 x float> %x, i32 %i3268  %x4 = extractelement <4 x float> %x, i32 %i4269  %x5 = extractelement <4 x float> %x, i32 %i5270  %x6 = extractelement <4 x float> %x, i32 %i6271  %x7 = extractelement <4 x float> %x, i32 %i7272  %r0 = insertelement <8 x float> undef, float %x0, i32 0273  %r1 = insertelement <8 x float>   %r0, float %x1, i32 1274  %r2 = insertelement <8 x float>   %r1, float %x2, i32 2275  %r3 = insertelement <8 x float>   %r2, float %x3, i32 3276  %r4 = insertelement <8 x float>   %r3, float %x4, i32 4277  %r5 = insertelement <8 x float>   %r4, float %x5, i32 5278  %r6 = insertelement <8 x float>   %r5, float %x6, i32 6279  %r7 = insertelement <8 x float>   %r6, float %x7, i32 7280  ret <8 x float> %r7281}282 283define <16 x i16> @var_shuffle_v16i16_v16i16_xxxxxxxxxxxxxxxx_i16(<16 x i16> %x, i32 %i0, i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, i32 %i11, i32 %i12, i32 %i13, i32 %i14, i32 %i15) nounwind {284; AVX1-LABEL: var_shuffle_v16i16_v16i16_xxxxxxxxxxxxxxxx_i16:285; AVX1:       # %bb.0:286; AVX1-NEXT:    pushq %rbp287; AVX1-NEXT:    movq %rsp, %rbp288; AVX1-NEXT:    andq $-32, %rsp289; AVX1-NEXT:    subq $64, %rsp290; AVX1-NEXT:    # kill: def $r9d killed $r9d def $r9291; AVX1-NEXT:    # kill: def $r8d killed $r8d def $r8292; AVX1-NEXT:    # kill: def $ecx killed $ecx def $rcx293; AVX1-NEXT:    # kill: def $edx killed $edx def $rdx294; AVX1-NEXT:    # kill: def $esi killed $esi def $rsi295; AVX1-NEXT:    # kill: def $edi killed $edi def $rdi296; AVX1-NEXT:    movl 32(%rbp), %eax297; AVX1-NEXT:    andl $15, %eax298; AVX1-NEXT:    vmovaps %ymm0, (%rsp)299; AVX1-NEXT:    movzwl (%rsp,%rax,2), %eax300; AVX1-NEXT:    vmovd %eax, %xmm0301; AVX1-NEXT:    movl 40(%rbp), %eax302; AVX1-NEXT:    andl $15, %eax303; AVX1-NEXT:    vpinsrw $1, (%rsp,%rax,2), %xmm0, %xmm0304; AVX1-NEXT:    movl 48(%rbp), %eax305; AVX1-NEXT:    andl $15, %eax306; AVX1-NEXT:    vpinsrw $2, (%rsp,%rax,2), %xmm0, %xmm0307; AVX1-NEXT:    movl 56(%rbp), %eax308; AVX1-NEXT:    andl $15, %eax309; AVX1-NEXT:    vpinsrw $3, (%rsp,%rax,2), %xmm0, %xmm0310; AVX1-NEXT:    movl 64(%rbp), %eax311; AVX1-NEXT:    andl $15, %eax312; AVX1-NEXT:    vpinsrw $4, (%rsp,%rax,2), %xmm0, %xmm0313; AVX1-NEXT:    movl 72(%rbp), %eax314; AVX1-NEXT:    andl $15, %eax315; AVX1-NEXT:    vpinsrw $5, (%rsp,%rax,2), %xmm0, %xmm0316; AVX1-NEXT:    movl 80(%rbp), %eax317; AVX1-NEXT:    andl $15, %eax318; AVX1-NEXT:    vpinsrw $6, (%rsp,%rax,2), %xmm0, %xmm0319; AVX1-NEXT:    movl 88(%rbp), %eax320; AVX1-NEXT:    andl $15, %eax321; AVX1-NEXT:    vpinsrw $7, (%rsp,%rax,2), %xmm0, %xmm0322; AVX1-NEXT:    andl $15, %edi323; AVX1-NEXT:    movzwl (%rsp,%rdi,2), %eax324; AVX1-NEXT:    vmovd %eax, %xmm1325; AVX1-NEXT:    andl $15, %esi326; AVX1-NEXT:    vpinsrw $1, (%rsp,%rsi,2), %xmm1, %xmm1327; AVX1-NEXT:    andl $15, %edx328; AVX1-NEXT:    vpinsrw $2, (%rsp,%rdx,2), %xmm1, %xmm1329; AVX1-NEXT:    andl $15, %ecx330; AVX1-NEXT:    vpinsrw $3, (%rsp,%rcx,2), %xmm1, %xmm1331; AVX1-NEXT:    andl $15, %r8d332; AVX1-NEXT:    vpinsrw $4, (%rsp,%r8,2), %xmm1, %xmm1333; AVX1-NEXT:    andl $15, %r9d334; AVX1-NEXT:    vpinsrw $5, (%rsp,%r9,2), %xmm1, %xmm1335; AVX1-NEXT:    movl 16(%rbp), %eax336; AVX1-NEXT:    andl $15, %eax337; AVX1-NEXT:    vpinsrw $6, (%rsp,%rax,2), %xmm1, %xmm1338; AVX1-NEXT:    movl 24(%rbp), %eax339; AVX1-NEXT:    andl $15, %eax340; AVX1-NEXT:    vpinsrw $7, (%rsp,%rax,2), %xmm1, %xmm1341; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0342; AVX1-NEXT:    movq %rbp, %rsp343; AVX1-NEXT:    popq %rbp344; AVX1-NEXT:    retq345;346; AVX2-LABEL: var_shuffle_v16i16_v16i16_xxxxxxxxxxxxxxxx_i16:347; AVX2:       # %bb.0:348; AVX2-NEXT:    pushq %rbp349; AVX2-NEXT:    movq %rsp, %rbp350; AVX2-NEXT:    andq $-32, %rsp351; AVX2-NEXT:    subq $64, %rsp352; AVX2-NEXT:    # kill: def $r9d killed $r9d def $r9353; AVX2-NEXT:    # kill: def $r8d killed $r8d def $r8354; AVX2-NEXT:    # kill: def $ecx killed $ecx def $rcx355; AVX2-NEXT:    # kill: def $edx killed $edx def $rdx356; AVX2-NEXT:    # kill: def $esi killed $esi def $rsi357; AVX2-NEXT:    # kill: def $edi killed $edi def $rdi358; AVX2-NEXT:    movl 32(%rbp), %eax359; AVX2-NEXT:    andl $15, %eax360; AVX2-NEXT:    vmovaps %ymm0, (%rsp)361; AVX2-NEXT:    movzwl (%rsp,%rax,2), %eax362; AVX2-NEXT:    vmovd %eax, %xmm0363; AVX2-NEXT:    movl 40(%rbp), %eax364; AVX2-NEXT:    andl $15, %eax365; AVX2-NEXT:    vpinsrw $1, (%rsp,%rax,2), %xmm0, %xmm0366; AVX2-NEXT:    movl 48(%rbp), %eax367; AVX2-NEXT:    andl $15, %eax368; AVX2-NEXT:    vpinsrw $2, (%rsp,%rax,2), %xmm0, %xmm0369; AVX2-NEXT:    movl 56(%rbp), %eax370; AVX2-NEXT:    andl $15, %eax371; AVX2-NEXT:    vpinsrw $3, (%rsp,%rax,2), %xmm0, %xmm0372; AVX2-NEXT:    movl 64(%rbp), %eax373; AVX2-NEXT:    andl $15, %eax374; AVX2-NEXT:    vpinsrw $4, (%rsp,%rax,2), %xmm0, %xmm0375; AVX2-NEXT:    movl 72(%rbp), %eax376; AVX2-NEXT:    andl $15, %eax377; AVX2-NEXT:    vpinsrw $5, (%rsp,%rax,2), %xmm0, %xmm0378; AVX2-NEXT:    movl 80(%rbp), %eax379; AVX2-NEXT:    andl $15, %eax380; AVX2-NEXT:    vpinsrw $6, (%rsp,%rax,2), %xmm0, %xmm0381; AVX2-NEXT:    movl 88(%rbp), %eax382; AVX2-NEXT:    andl $15, %eax383; AVX2-NEXT:    vpinsrw $7, (%rsp,%rax,2), %xmm0, %xmm0384; AVX2-NEXT:    andl $15, %edi385; AVX2-NEXT:    movzwl (%rsp,%rdi,2), %eax386; AVX2-NEXT:    vmovd %eax, %xmm1387; AVX2-NEXT:    andl $15, %esi388; AVX2-NEXT:    vpinsrw $1, (%rsp,%rsi,2), %xmm1, %xmm1389; AVX2-NEXT:    andl $15, %edx390; AVX2-NEXT:    vpinsrw $2, (%rsp,%rdx,2), %xmm1, %xmm1391; AVX2-NEXT:    andl $15, %ecx392; AVX2-NEXT:    vpinsrw $3, (%rsp,%rcx,2), %xmm1, %xmm1393; AVX2-NEXT:    andl $15, %r8d394; AVX2-NEXT:    vpinsrw $4, (%rsp,%r8,2), %xmm1, %xmm1395; AVX2-NEXT:    andl $15, %r9d396; AVX2-NEXT:    vpinsrw $5, (%rsp,%r9,2), %xmm1, %xmm1397; AVX2-NEXT:    movl 16(%rbp), %eax398; AVX2-NEXT:    andl $15, %eax399; AVX2-NEXT:    vpinsrw $6, (%rsp,%rax,2), %xmm1, %xmm1400; AVX2-NEXT:    movl 24(%rbp), %eax401; AVX2-NEXT:    andl $15, %eax402; AVX2-NEXT:    vpinsrw $7, (%rsp,%rax,2), %xmm1, %xmm1403; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0404; AVX2-NEXT:    movq %rbp, %rsp405; AVX2-NEXT:    popq %rbp406; AVX2-NEXT:    retq407  %x0  = extractelement <16 x i16> %x, i32 %i0408  %x1  = extractelement <16 x i16> %x, i32 %i1409  %x2  = extractelement <16 x i16> %x, i32 %i2410  %x3  = extractelement <16 x i16> %x, i32 %i3411  %x4  = extractelement <16 x i16> %x, i32 %i4412  %x5  = extractelement <16 x i16> %x, i32 %i5413  %x6  = extractelement <16 x i16> %x, i32 %i6414  %x7  = extractelement <16 x i16> %x, i32 %i7415  %x8  = extractelement <16 x i16> %x, i32 %i8416  %x9  = extractelement <16 x i16> %x, i32 %i9417  %x10 = extractelement <16 x i16> %x, i32 %i10418  %x11 = extractelement <16 x i16> %x, i32 %i11419  %x12 = extractelement <16 x i16> %x, i32 %i12420  %x13 = extractelement <16 x i16> %x, i32 %i13421  %x14 = extractelement <16 x i16> %x, i32 %i14422  %x15 = extractelement <16 x i16> %x, i32 %i15423  %r0  = insertelement <16 x i16> undef, i16 %x0 , i32 0424  %r1  = insertelement <16 x i16>  %r0 , i16 %x1 , i32 1425  %r2  = insertelement <16 x i16>  %r1 , i16 %x2 , i32 2426  %r3  = insertelement <16 x i16>  %r2 , i16 %x3 , i32 3427  %r4  = insertelement <16 x i16>  %r3 , i16 %x4 , i32 4428  %r5  = insertelement <16 x i16>  %r4 , i16 %x5 , i32 5429  %r6  = insertelement <16 x i16>  %r5 , i16 %x6 , i32 6430  %r7  = insertelement <16 x i16>  %r6 , i16 %x7 , i32 7431  %r8  = insertelement <16 x i16>  %r7 , i16 %x8 , i32 8432  %r9  = insertelement <16 x i16>  %r8 , i16 %x9 , i32 9433  %r10 = insertelement <16 x i16>  %r9 , i16 %x10, i32 10434  %r11 = insertelement <16 x i16>  %r10, i16 %x11, i32 11435  %r12 = insertelement <16 x i16>  %r11, i16 %x12, i32 12436  %r13 = insertelement <16 x i16>  %r12, i16 %x13, i32 13437  %r14 = insertelement <16 x i16>  %r13, i16 %x14, i32 14438  %r15 = insertelement <16 x i16>  %r14, i16 %x15, i32 15439  ret <16 x i16> %r15440}441 442define <16 x i16> @var_shuffle_v16i16_v8i16_xxxxxxxxxxxxxxxx_i16(<8 x i16> %x, i32 %i0, i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i32 %i10, i32 %i11, i32 %i12, i32 %i13, i32 %i14, i32 %i15) nounwind {443; AVX1-LABEL: var_shuffle_v16i16_v8i16_xxxxxxxxxxxxxxxx_i16:444; AVX1:       # %bb.0:445; AVX1-NEXT:    # kill: def $r9d killed $r9d def $r9446; AVX1-NEXT:    # kill: def $r8d killed $r8d def $r8447; AVX1-NEXT:    # kill: def $ecx killed $ecx def $rcx448; AVX1-NEXT:    # kill: def $edx killed $edx def $rdx449; AVX1-NEXT:    # kill: def $esi killed $esi def $rsi450; AVX1-NEXT:    # kill: def $edi killed $edi def $rdi451; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax452; AVX1-NEXT:    andl $7, %eax453; AVX1-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)454; AVX1-NEXT:    movzwl -24(%rsp,%rax,2), %eax455; AVX1-NEXT:    vmovd %eax, %xmm0456; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax457; AVX1-NEXT:    andl $7, %eax458; AVX1-NEXT:    vpinsrw $1, -24(%rsp,%rax,2), %xmm0, %xmm0459; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax460; AVX1-NEXT:    andl $7, %eax461; AVX1-NEXT:    vpinsrw $2, -24(%rsp,%rax,2), %xmm0, %xmm0462; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax463; AVX1-NEXT:    andl $7, %eax464; AVX1-NEXT:    vpinsrw $3, -24(%rsp,%rax,2), %xmm0, %xmm0465; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax466; AVX1-NEXT:    andl $7, %eax467; AVX1-NEXT:    vpinsrw $4, -24(%rsp,%rax,2), %xmm0, %xmm0468; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax469; AVX1-NEXT:    andl $7, %eax470; AVX1-NEXT:    vpinsrw $5, -24(%rsp,%rax,2), %xmm0, %xmm0471; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax472; AVX1-NEXT:    andl $7, %eax473; AVX1-NEXT:    vpinsrw $6, -24(%rsp,%rax,2), %xmm0, %xmm0474; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax475; AVX1-NEXT:    andl $7, %eax476; AVX1-NEXT:    vpinsrw $7, -24(%rsp,%rax,2), %xmm0, %xmm0477; AVX1-NEXT:    andl $7, %edi478; AVX1-NEXT:    movzwl -24(%rsp,%rdi,2), %eax479; AVX1-NEXT:    vmovd %eax, %xmm1480; AVX1-NEXT:    andl $7, %esi481; AVX1-NEXT:    vpinsrw $1, -24(%rsp,%rsi,2), %xmm1, %xmm1482; AVX1-NEXT:    andl $7, %edx483; AVX1-NEXT:    vpinsrw $2, -24(%rsp,%rdx,2), %xmm1, %xmm1484; AVX1-NEXT:    andl $7, %ecx485; AVX1-NEXT:    vpinsrw $3, -24(%rsp,%rcx,2), %xmm1, %xmm1486; AVX1-NEXT:    andl $7, %r8d487; AVX1-NEXT:    vpinsrw $4, -24(%rsp,%r8,2), %xmm1, %xmm1488; AVX1-NEXT:    andl $7, %r9d489; AVX1-NEXT:    vpinsrw $5, -24(%rsp,%r9,2), %xmm1, %xmm1490; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax491; AVX1-NEXT:    andl $7, %eax492; AVX1-NEXT:    vpinsrw $6, -24(%rsp,%rax,2), %xmm1, %xmm1493; AVX1-NEXT:    movl {{[0-9]+}}(%rsp), %eax494; AVX1-NEXT:    andl $7, %eax495; AVX1-NEXT:    vpinsrw $7, -24(%rsp,%rax,2), %xmm1, %xmm1496; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0497; AVX1-NEXT:    retq498;499; AVX2-LABEL: var_shuffle_v16i16_v8i16_xxxxxxxxxxxxxxxx_i16:500; AVX2:       # %bb.0:501; AVX2-NEXT:    # kill: def $r9d killed $r9d def $r9502; AVX2-NEXT:    # kill: def $r8d killed $r8d def $r8503; AVX2-NEXT:    # kill: def $ecx killed $ecx def $rcx504; AVX2-NEXT:    # kill: def $edx killed $edx def $rdx505; AVX2-NEXT:    # kill: def $esi killed $esi def $rsi506; AVX2-NEXT:    # kill: def $edi killed $edi def $rdi507; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax508; AVX2-NEXT:    andl $7, %eax509; AVX2-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)510; AVX2-NEXT:    movzwl -24(%rsp,%rax,2), %eax511; AVX2-NEXT:    vmovd %eax, %xmm0512; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax513; AVX2-NEXT:    andl $7, %eax514; AVX2-NEXT:    vpinsrw $1, -24(%rsp,%rax,2), %xmm0, %xmm0515; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax516; AVX2-NEXT:    andl $7, %eax517; AVX2-NEXT:    vpinsrw $2, -24(%rsp,%rax,2), %xmm0, %xmm0518; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax519; AVX2-NEXT:    andl $7, %eax520; AVX2-NEXT:    vpinsrw $3, -24(%rsp,%rax,2), %xmm0, %xmm0521; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax522; AVX2-NEXT:    andl $7, %eax523; AVX2-NEXT:    vpinsrw $4, -24(%rsp,%rax,2), %xmm0, %xmm0524; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax525; AVX2-NEXT:    andl $7, %eax526; AVX2-NEXT:    vpinsrw $5, -24(%rsp,%rax,2), %xmm0, %xmm0527; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax528; AVX2-NEXT:    andl $7, %eax529; AVX2-NEXT:    vpinsrw $6, -24(%rsp,%rax,2), %xmm0, %xmm0530; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax531; AVX2-NEXT:    andl $7, %eax532; AVX2-NEXT:    vpinsrw $7, -24(%rsp,%rax,2), %xmm0, %xmm0533; AVX2-NEXT:    andl $7, %edi534; AVX2-NEXT:    movzwl -24(%rsp,%rdi,2), %eax535; AVX2-NEXT:    vmovd %eax, %xmm1536; AVX2-NEXT:    andl $7, %esi537; AVX2-NEXT:    vpinsrw $1, -24(%rsp,%rsi,2), %xmm1, %xmm1538; AVX2-NEXT:    andl $7, %edx539; AVX2-NEXT:    vpinsrw $2, -24(%rsp,%rdx,2), %xmm1, %xmm1540; AVX2-NEXT:    andl $7, %ecx541; AVX2-NEXT:    vpinsrw $3, -24(%rsp,%rcx,2), %xmm1, %xmm1542; AVX2-NEXT:    andl $7, %r8d543; AVX2-NEXT:    vpinsrw $4, -24(%rsp,%r8,2), %xmm1, %xmm1544; AVX2-NEXT:    andl $7, %r9d545; AVX2-NEXT:    vpinsrw $5, -24(%rsp,%r9,2), %xmm1, %xmm1546; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax547; AVX2-NEXT:    andl $7, %eax548; AVX2-NEXT:    vpinsrw $6, -24(%rsp,%rax,2), %xmm1, %xmm1549; AVX2-NEXT:    movl {{[0-9]+}}(%rsp), %eax550; AVX2-NEXT:    andl $7, %eax551; AVX2-NEXT:    vpinsrw $7, -24(%rsp,%rax,2), %xmm1, %xmm1552; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0553; AVX2-NEXT:    retq554  %x0  = extractelement <8 x i16> %x, i32 %i0555  %x1  = extractelement <8 x i16> %x, i32 %i1556  %x2  = extractelement <8 x i16> %x, i32 %i2557  %x3  = extractelement <8 x i16> %x, i32 %i3558  %x4  = extractelement <8 x i16> %x, i32 %i4559  %x5  = extractelement <8 x i16> %x, i32 %i5560  %x6  = extractelement <8 x i16> %x, i32 %i6561  %x7  = extractelement <8 x i16> %x, i32 %i7562  %x8  = extractelement <8 x i16> %x, i32 %i8563  %x9  = extractelement <8 x i16> %x, i32 %i9564  %x10 = extractelement <8 x i16> %x, i32 %i10565  %x11 = extractelement <8 x i16> %x, i32 %i11566  %x12 = extractelement <8 x i16> %x, i32 %i12567  %x13 = extractelement <8 x i16> %x, i32 %i13568  %x14 = extractelement <8 x i16> %x, i32 %i14569  %x15 = extractelement <8 x i16> %x, i32 %i15570  %r0  = insertelement <16 x i16> undef, i16 %x0 , i32 0571  %r1  = insertelement <16 x i16>  %r0 , i16 %x1 , i32 1572  %r2  = insertelement <16 x i16>  %r1 , i16 %x2 , i32 2573  %r3  = insertelement <16 x i16>  %r2 , i16 %x3 , i32 3574  %r4  = insertelement <16 x i16>  %r3 , i16 %x4 , i32 4575  %r5  = insertelement <16 x i16>  %r4 , i16 %x5 , i32 5576  %r6  = insertelement <16 x i16>  %r5 , i16 %x6 , i32 6577  %r7  = insertelement <16 x i16>  %r6 , i16 %x7 , i32 7578  %r8  = insertelement <16 x i16>  %r7 , i16 %x8 , i32 8579  %r9  = insertelement <16 x i16>  %r8 , i16 %x9 , i32 9580  %r10 = insertelement <16 x i16>  %r9 , i16 %x10, i32 10581  %r11 = insertelement <16 x i16>  %r10, i16 %x11, i32 11582  %r12 = insertelement <16 x i16>  %r11, i16 %x12, i32 12583  %r13 = insertelement <16 x i16>  %r12, i16 %x13, i32 13584  %r14 = insertelement <16 x i16>  %r13, i16 %x14, i32 14585  %r15 = insertelement <16 x i16>  %r14, i16 %x15, i32 15586  ret <16 x i16> %r15587}588 589;590; Unary shuffle indices from memory591;592 593define <4 x i64> @mem_shuffle_v4i64_v4i64_xxxx_i64(<4 x i64> %x, ptr %i) nounwind {594; ALL-LABEL: mem_shuffle_v4i64_v4i64_xxxx_i64:595; ALL:       # %bb.0:596; ALL-NEXT:    pushq %rbp597; ALL-NEXT:    movq %rsp, %rbp598; ALL-NEXT:    andq $-32, %rsp599; ALL-NEXT:    subq $64, %rsp600; ALL-NEXT:    movl (%rdi), %eax601; ALL-NEXT:    movl 8(%rdi), %ecx602; ALL-NEXT:    andl $3, %eax603; ALL-NEXT:    andl $3, %ecx604; ALL-NEXT:    movl 16(%rdi), %edx605; ALL-NEXT:    andl $3, %edx606; ALL-NEXT:    movl 24(%rdi), %esi607; ALL-NEXT:    andl $3, %esi608; ALL-NEXT:    vmovaps %ymm0, (%rsp)609; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero610; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero611; ALL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]612; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero613; ALL-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero614; ALL-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm2[0],xmm1[0]615; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0616; ALL-NEXT:    movq %rbp, %rsp617; ALL-NEXT:    popq %rbp618; ALL-NEXT:    retq619  %p1  = getelementptr inbounds i64, ptr %i, i32 1620  %p2  = getelementptr inbounds i64, ptr %i, i32 2621  %p3  = getelementptr inbounds i64, ptr %i, i32 3622  %i0  = load i64, ptr %i, align 4623  %i1  = load i64, ptr %p1, align 4624  %i2  = load i64, ptr %p2, align 4625  %i3  = load i64, ptr %p3, align 4626  %x0 = extractelement <4 x i64> %x, i64 %i0627  %x1 = extractelement <4 x i64> %x, i64 %i1628  %x2 = extractelement <4 x i64> %x, i64 %i2629  %x3 = extractelement <4 x i64> %x, i64 %i3630  %r0 = insertelement <4 x i64> undef, i64 %x0, i32 0631  %r1 = insertelement <4 x i64>   %r0, i64 %x1, i32 1632  %r2 = insertelement <4 x i64>   %r1, i64 %x2, i32 2633  %r3 = insertelement <4 x i64>   %r2, i64 %x3, i32 3634  ret <4 x i64> %r3635}636 637define <4 x i64> @mem_shuffle_v4i64_v2i64_xxxx_i64(<2 x i64> %x, ptr %i) nounwind {638; ALL-LABEL: mem_shuffle_v4i64_v2i64_xxxx_i64:639; ALL:       # %bb.0:640; ALL-NEXT:    movl (%rdi), %eax641; ALL-NEXT:    movl 8(%rdi), %ecx642; ALL-NEXT:    andl $1, %eax643; ALL-NEXT:    andl $1, %ecx644; ALL-NEXT:    movl 16(%rdi), %edx645; ALL-NEXT:    andl $1, %edx646; ALL-NEXT:    movl 24(%rdi), %esi647; ALL-NEXT:    andl $1, %esi648; ALL-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)649; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero650; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero651; ALL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]652; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero653; ALL-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero654; ALL-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm2[0],xmm1[0]655; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0656; ALL-NEXT:    retq657  %p1  = getelementptr inbounds i64, ptr %i, i32 1658  %p2  = getelementptr inbounds i64, ptr %i, i32 2659  %p3  = getelementptr inbounds i64, ptr %i, i32 3660  %i0  = load i64, ptr %i, align 4661  %i1  = load i64, ptr %p1, align 4662  %i2  = load i64, ptr %p2, align 4663  %i3  = load i64, ptr %p3, align 4664  %x0 = extractelement <2 x i64> %x, i64 %i0665  %x1 = extractelement <2 x i64> %x, i64 %i1666  %x2 = extractelement <2 x i64> %x, i64 %i2667  %x3 = extractelement <2 x i64> %x, i64 %i3668  %r0 = insertelement <4 x i64> undef, i64 %x0, i32 0669  %r1 = insertelement <4 x i64>   %r0, i64 %x1, i32 1670  %r2 = insertelement <4 x i64>   %r1, i64 %x2, i32 2671  %r3 = insertelement <4 x i64>   %r2, i64 %x3, i32 3672  ret <4 x i64> %r3673}674