377 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE2,X64,X64-SSE23; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX2,X64,X64-AVX24; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE2,X86,X86-SSE25; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX2,X86,X86-AVX26 7;------------------------------ 32-bit shuffles -------------------------------;8 9define <4 x i32> @shuffle_i32_of_shl_i16(<8 x i16> %x) nounwind {10; SSE2-LABEL: shuffle_i32_of_shl_i16:11; SSE2: # %bb.0:12; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]13; SSE2-NEXT: psllw $15, %xmm014; SSE2-NEXT: ret{{[l|q]}}15;16; AVX2-LABEL: shuffle_i32_of_shl_i16:17; AVX2: # %bb.0:18; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]19; AVX2-NEXT: vpsllw $15, %xmm0, %xmm020; AVX2-NEXT: ret{{[l|q]}}21 %i1 = tail call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %x, i32 15)22 %i2 = bitcast <8 x i16> %i1 to <4 x i32>23 %i3 = shufflevector <4 x i32> %i2, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>24 ret <4 x i32> %i325}26define <4 x i32> @shuffle_i32_of_lshr_i16(<8 x i16> %x) nounwind {27; SSE2-LABEL: shuffle_i32_of_lshr_i16:28; SSE2: # %bb.0:29; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]30; SSE2-NEXT: psrlw $15, %xmm031; SSE2-NEXT: ret{{[l|q]}}32;33; AVX2-LABEL: shuffle_i32_of_lshr_i16:34; AVX2: # %bb.0:35; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]36; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm037; AVX2-NEXT: ret{{[l|q]}}38 %i1 = tail call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %x, i32 15)39 %i2 = bitcast <8 x i16> %i1 to <4 x i32>40 %i3 = shufflevector <4 x i32> %i2, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>41 ret <4 x i32> %i342}43define <4 x i32> @shuffle_i32_of_ashr_i16(<8 x i16> %x) nounwind {44; SSE2-LABEL: shuffle_i32_of_ashr_i16:45; SSE2: # %bb.0:46; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]47; SSE2-NEXT: psraw $15, %xmm048; SSE2-NEXT: ret{{[l|q]}}49;50; AVX2-LABEL: shuffle_i32_of_ashr_i16:51; AVX2: # %bb.0:52; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]53; AVX2-NEXT: vpsraw $15, %xmm0, %xmm054; AVX2-NEXT: ret{{[l|q]}}55 %i1 = tail call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %x, i32 15)56 %i2 = bitcast <8 x i16> %i1 to <4 x i32>57 %i3 = shufflevector <4 x i32> %i2, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>58 ret <4 x i32> %i359}60 61define <4 x i32> @shuffle_i32_of_shl_i32(<4 x i32> %x) nounwind {62; SSE2-LABEL: shuffle_i32_of_shl_i32:63; SSE2: # %bb.0:64; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]65; SSE2-NEXT: pslld $31, %xmm066; SSE2-NEXT: ret{{[l|q]}}67;68; AVX2-LABEL: shuffle_i32_of_shl_i32:69; AVX2: # %bb.0:70; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]71; AVX2-NEXT: vpslld $31, %xmm0, %xmm072; AVX2-NEXT: ret{{[l|q]}}73 %i1 = tail call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %x, i32 31)74 %i2 = shufflevector <4 x i32> %i1, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>75 ret <4 x i32> %i276}77define <4 x i32> @shuffle_i32_of_lshr_i32(<4 x i32> %x) nounwind {78; SSE2-LABEL: shuffle_i32_of_lshr_i32:79; SSE2: # %bb.0:80; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]81; SSE2-NEXT: psrld $31, %xmm082; SSE2-NEXT: ret{{[l|q]}}83;84; AVX2-LABEL: shuffle_i32_of_lshr_i32:85; AVX2: # %bb.0:86; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]87; AVX2-NEXT: vpsrld $31, %xmm0, %xmm088; AVX2-NEXT: ret{{[l|q]}}89 %i1 = tail call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %x, i32 31)90 %i2 = shufflevector <4 x i32> %i1, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>91 ret <4 x i32> %i292}93define <4 x i32> @shuffle_i32_of_ashr_i32(<4 x i32> %x) nounwind {94; SSE2-LABEL: shuffle_i32_of_ashr_i32:95; SSE2: # %bb.0:96; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]97; SSE2-NEXT: psrad $31, %xmm098; SSE2-NEXT: ret{{[l|q]}}99;100; AVX2-LABEL: shuffle_i32_of_ashr_i32:101; AVX2: # %bb.0:102; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]103; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0104; AVX2-NEXT: ret{{[l|q]}}105 %i1 = tail call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %x, i32 31)106 %i2 = shufflevector <4 x i32> %i1, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>107 ret <4 x i32> %i2108}109 110define <4 x i32> @shuffle_i32_of_shl_i64(<2 x i64> %x) nounwind {111; SSE2-LABEL: shuffle_i32_of_shl_i64:112; SSE2: # %bb.0:113; SSE2-NEXT: psllq $63, %xmm0114; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]115; SSE2-NEXT: ret{{[l|q]}}116;117; AVX2-LABEL: shuffle_i32_of_shl_i64:118; AVX2: # %bb.0:119; AVX2-NEXT: vpsllq $63, %xmm0, %xmm0120; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]121; AVX2-NEXT: ret{{[l|q]}}122 %i1 = tail call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %x, i32 63)123 %i2 = bitcast <2 x i64> %i1 to <4 x i32>124 %i3 = shufflevector <4 x i32> %i2, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>125 ret <4 x i32> %i3126}127define <4 x i32> @shuffle_i32_of_lshr_i64(<2 x i64> %x) nounwind {128; SSE2-LABEL: shuffle_i32_of_lshr_i64:129; SSE2: # %bb.0:130; SSE2-NEXT: psrlq $63, %xmm0131; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]132; SSE2-NEXT: ret{{[l|q]}}133;134; AVX2-LABEL: shuffle_i32_of_lshr_i64:135; AVX2: # %bb.0:136; AVX2-NEXT: vpsrlq $63, %xmm0, %xmm0137; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]138; AVX2-NEXT: ret{{[l|q]}}139 %i1 = tail call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %x, i32 63)140 %i2 = bitcast <2 x i64> %i1 to <4 x i32>141 %i3 = shufflevector <4 x i32> %i2, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>142 ret <4 x i32> %i3143}144define <4 x i32> @shuffle_i32_of_ashr_i64(<2 x i64> %x) nounwind {145; X64-SSE2-LABEL: shuffle_i32_of_ashr_i64:146; X64-SSE2: # %bb.0:147; X64-SSE2-NEXT: pushq %rax148; X64-SSE2-NEXT: movl $63, %edi149; X64-SSE2-NEXT: callq llvm.x86.sse2.psrai.q@PLT150; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]151; X64-SSE2-NEXT: popq %rax152; X64-SSE2-NEXT: retq153;154; X64-AVX2-LABEL: shuffle_i32_of_ashr_i64:155; X64-AVX2: # %bb.0:156; X64-AVX2-NEXT: pushq %rax157; X64-AVX2-NEXT: movl $63, %edi158; X64-AVX2-NEXT: callq llvm.x86.sse2.psrai.q@PLT159; X64-AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,2,1,0]160; X64-AVX2-NEXT: popq %rax161; X64-AVX2-NEXT: retq162;163; X86-SSE2-LABEL: shuffle_i32_of_ashr_i64:164; X86-SSE2: # %bb.0:165; X86-SSE2-NEXT: pushl $63166; X86-SSE2-NEXT: calll llvm.x86.sse2.psrai.q@PLT167; X86-SSE2-NEXT: addl $4, %esp168; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]169; X86-SSE2-NEXT: retl170;171; X86-AVX2-LABEL: shuffle_i32_of_ashr_i64:172; X86-AVX2: # %bb.0:173; X86-AVX2-NEXT: pushl $63174; X86-AVX2-NEXT: calll llvm.x86.sse2.psrai.q@PLT175; X86-AVX2-NEXT: addl $4, %esp176; X86-AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,2,1,0]177; X86-AVX2-NEXT: retl178 %i1 = tail call <2 x i64> @llvm.x86.sse2.psrai.q(<2 x i64> %x, i32 63)179 %i2 = bitcast <2 x i64> %i1 to <4 x i32>180 %i3 = shufflevector <4 x i32> %i2, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>181 ret <4 x i32> %i3182}183 184;------------------------------ 64-bit shuffles -------------------------------;185 186define <2 x i64> @shuffle_i64_of_shl_i16(<8 x i16> %x) nounwind {187; SSE2-LABEL: shuffle_i64_of_shl_i16:188; SSE2: # %bb.0:189; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]190; SSE2-NEXT: psllw $15, %xmm0191; SSE2-NEXT: ret{{[l|q]}}192;193; AVX2-LABEL: shuffle_i64_of_shl_i16:194; AVX2: # %bb.0:195; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]196; AVX2-NEXT: vpsllw $15, %xmm0, %xmm0197; AVX2-NEXT: ret{{[l|q]}}198 %i1 = tail call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %x, i32 15)199 %i2 = bitcast <8 x i16> %i1 to <2 x i64>200 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>201 ret <2 x i64> %i3202}203define <2 x i64> @shuffle_i64_of_lshr_i16(<8 x i16> %x) nounwind {204; SSE2-LABEL: shuffle_i64_of_lshr_i16:205; SSE2: # %bb.0:206; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]207; SSE2-NEXT: psrlw $15, %xmm0208; SSE2-NEXT: ret{{[l|q]}}209;210; AVX2-LABEL: shuffle_i64_of_lshr_i16:211; AVX2: # %bb.0:212; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]213; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm0214; AVX2-NEXT: ret{{[l|q]}}215 %i1 = tail call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %x, i32 15)216 %i2 = bitcast <8 x i16> %i1 to <2 x i64>217 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>218 ret <2 x i64> %i3219}220define <2 x i64> @shuffle_i64_of_ashr_i16(<8 x i16> %x) nounwind {221; SSE2-LABEL: shuffle_i64_of_ashr_i16:222; SSE2: # %bb.0:223; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]224; SSE2-NEXT: psraw $15, %xmm0225; SSE2-NEXT: ret{{[l|q]}}226;227; AVX2-LABEL: shuffle_i64_of_ashr_i16:228; AVX2: # %bb.0:229; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]230; AVX2-NEXT: vpsraw $15, %xmm0, %xmm0231; AVX2-NEXT: ret{{[l|q]}}232 %i1 = tail call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %x, i32 15)233 %i2 = bitcast <8 x i16> %i1 to <2 x i64>234 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>235 ret <2 x i64> %i3236}237 238define <2 x i64> @shuffle_i64_of_shl_i32(<4 x i32> %x) nounwind {239; SSE2-LABEL: shuffle_i64_of_shl_i32:240; SSE2: # %bb.0:241; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]242; SSE2-NEXT: pslld $31, %xmm0243; SSE2-NEXT: ret{{[l|q]}}244;245; AVX2-LABEL: shuffle_i64_of_shl_i32:246; AVX2: # %bb.0:247; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]248; AVX2-NEXT: vpslld $31, %xmm0, %xmm0249; AVX2-NEXT: ret{{[l|q]}}250 %i1 = tail call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %x, i32 31)251 %i2 = bitcast <4 x i32> %i1 to <2 x i64>252 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>253 ret <2 x i64> %i3254}255define <2 x i64> @shuffle_i64_of_lshr_i32(<4 x i32> %x) nounwind {256; SSE2-LABEL: shuffle_i64_of_lshr_i32:257; SSE2: # %bb.0:258; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]259; SSE2-NEXT: psrld $31, %xmm0260; SSE2-NEXT: ret{{[l|q]}}261;262; AVX2-LABEL: shuffle_i64_of_lshr_i32:263; AVX2: # %bb.0:264; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]265; AVX2-NEXT: vpsrld $31, %xmm0, %xmm0266; AVX2-NEXT: ret{{[l|q]}}267 %i1 = tail call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %x, i32 31)268 %i2 = bitcast <4 x i32> %i1 to <2 x i64>269 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>270 ret <2 x i64> %i3271}272define <2 x i64> @shuffle_i64_of_ashr_i32(<4 x i32> %x) nounwind {273; SSE2-LABEL: shuffle_i64_of_ashr_i32:274; SSE2: # %bb.0:275; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]276; SSE2-NEXT: psrad $31, %xmm0277; SSE2-NEXT: ret{{[l|q]}}278;279; AVX2-LABEL: shuffle_i64_of_ashr_i32:280; AVX2: # %bb.0:281; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]282; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0283; AVX2-NEXT: ret{{[l|q]}}284 %i1 = tail call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %x, i32 31)285 %i2 = bitcast <4 x i32> %i1 to <2 x i64>286 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>287 ret <2 x i64> %i3288}289 290define <2 x i64> @shuffle_i64_of_shl_i64(<2 x i64> %x) nounwind {291; SSE2-LABEL: shuffle_i64_of_shl_i64:292; SSE2: # %bb.0:293; SSE2-NEXT: psllq $63, %xmm0294; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]295; SSE2-NEXT: ret{{[l|q]}}296;297; AVX2-LABEL: shuffle_i64_of_shl_i64:298; AVX2: # %bb.0:299; AVX2-NEXT: vpsllq $63, %xmm0, %xmm0300; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]301; AVX2-NEXT: ret{{[l|q]}}302 %i1 = tail call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %x, i32 63)303 %i2 = bitcast <2 x i64> %i1 to <2 x i64>304 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>305 ret <2 x i64> %i3306}307define <2 x i64> @shuffle_i64_of_lshr_i64(<2 x i64> %x) nounwind {308; SSE2-LABEL: shuffle_i64_of_lshr_i64:309; SSE2: # %bb.0:310; SSE2-NEXT: psrlq $63, %xmm0311; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]312; SSE2-NEXT: ret{{[l|q]}}313;314; AVX2-LABEL: shuffle_i64_of_lshr_i64:315; AVX2: # %bb.0:316; AVX2-NEXT: vpsrlq $63, %xmm0, %xmm0317; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]318; AVX2-NEXT: ret{{[l|q]}}319 %i1 = tail call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %x, i32 63)320 %i2 = bitcast <2 x i64> %i1 to <2 x i64>321 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>322 ret <2 x i64> %i3323}324define <2 x i64> @shuffle_i64_of_ashr_i64(<2 x i64> %x) nounwind {325; X64-SSE2-LABEL: shuffle_i64_of_ashr_i64:326; X64-SSE2: # %bb.0:327; X64-SSE2-NEXT: pushq %rax328; X64-SSE2-NEXT: movl $63, %edi329; X64-SSE2-NEXT: callq llvm.x86.sse2.psrai.q@PLT330; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]331; X64-SSE2-NEXT: popq %rax332; X64-SSE2-NEXT: retq333;334; X64-AVX2-LABEL: shuffle_i64_of_ashr_i64:335; X64-AVX2: # %bb.0:336; X64-AVX2-NEXT: pushq %rax337; X64-AVX2-NEXT: movl $63, %edi338; X64-AVX2-NEXT: callq llvm.x86.sse2.psrai.q@PLT339; X64-AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[2,3,0,1]340; X64-AVX2-NEXT: popq %rax341; X64-AVX2-NEXT: retq342;343; X86-SSE2-LABEL: shuffle_i64_of_ashr_i64:344; X86-SSE2: # %bb.0:345; X86-SSE2-NEXT: pushl $63346; X86-SSE2-NEXT: calll llvm.x86.sse2.psrai.q@PLT347; X86-SSE2-NEXT: addl $4, %esp348; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]349; X86-SSE2-NEXT: retl350;351; X86-AVX2-LABEL: shuffle_i64_of_ashr_i64:352; X86-AVX2: # %bb.0:353; X86-AVX2-NEXT: pushl $63354; X86-AVX2-NEXT: calll llvm.x86.sse2.psrai.q@PLT355; X86-AVX2-NEXT: addl $4, %esp356; X86-AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[2,3,0,1]357; X86-AVX2-NEXT: retl358 %i1 = tail call <2 x i64> @llvm.x86.sse2.psrai.q(<2 x i64> %x, i32 63)359 %i2 = bitcast <2 x i64> %i1 to <2 x i64>360 %i3 = shufflevector <2 x i64> %i2, <2 x i64> poison, <2 x i32> <i32 1, i32 0>361 ret <2 x i64> %i3362}363 364declare <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16>, i32)365declare <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16>, i32)366declare <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16>, i32)367declare <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32>, i32)368declare <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32>, i32)369declare <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32>, i32)370declare <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64>, i32)371declare <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64>, i32)372declare <2 x i64> @llvm.x86.sse2.psrai.q(<2 x i64>, i32) ; does not exist373;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:374; CHECK: {{.*}}375; X64: {{.*}}376; X86: {{.*}}377