145 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X644 5; test vector shifts converted to proper SSE2 vector shifts when the shift6; amounts are the same.7 8define void @shift1a(<2 x i64> %val, ptr %dst) nounwind {9; X86-LABEL: shift1a:10; X86: # %bb.0: # %entry11; X86-NEXT: movl {{[0-9]+}}(%esp), %eax12; X86-NEXT: psrlq $32, %xmm013; X86-NEXT: movdqa %xmm0, (%eax)14; X86-NEXT: retl15;16; X64-LABEL: shift1a:17; X64: # %bb.0: # %entry18; X64-NEXT: psrlq $32, %xmm019; X64-NEXT: movdqa %xmm0, (%rdi)20; X64-NEXT: retq21entry:22 %lshr = lshr <2 x i64> %val, < i64 32, i64 32 >23 store <2 x i64> %lshr, ptr %dst24 ret void25}26 27define void @shift1b(<2 x i64> %val, ptr %dst, i64 %amt) nounwind {28; X86-LABEL: shift1b:29; X86: # %bb.0: # %entry30; X86-NEXT: movl {{[0-9]+}}(%esp), %eax31; X86-NEXT: movq {{.*#+}} xmm1 = mem[0],zero32; X86-NEXT: psrlq %xmm1, %xmm033; X86-NEXT: movdqa %xmm0, (%eax)34; X86-NEXT: retl35;36; X64-LABEL: shift1b:37; X64: # %bb.0: # %entry38; X64-NEXT: movq %rsi, %xmm139; X64-NEXT: psrlq %xmm1, %xmm040; X64-NEXT: movdqa %xmm0, (%rdi)41; X64-NEXT: retq42entry:43 %0 = insertelement <2 x i64> undef, i64 %amt, i32 044 %1 = insertelement <2 x i64> %0, i64 %amt, i32 145 %lshr = lshr <2 x i64> %val, %146 store <2 x i64> %lshr, ptr %dst47 ret void48}49 50define void @shift2a(<4 x i32> %val, ptr %dst) nounwind {51; X86-LABEL: shift2a:52; X86: # %bb.0: # %entry53; X86-NEXT: movl {{[0-9]+}}(%esp), %eax54; X86-NEXT: psrld $17, %xmm055; X86-NEXT: movdqa %xmm0, (%eax)56; X86-NEXT: retl57;58; X64-LABEL: shift2a:59; X64: # %bb.0: # %entry60; X64-NEXT: psrld $17, %xmm061; X64-NEXT: movdqa %xmm0, (%rdi)62; X64-NEXT: retq63entry:64 %lshr = lshr <4 x i32> %val, < i32 17, i32 17, i32 17, i32 17 >65 store <4 x i32> %lshr, ptr %dst66 ret void67}68 69define void @shift2b(<4 x i32> %val, ptr %dst, i32 %amt) nounwind {70; X86-LABEL: shift2b:71; X86: # %bb.0: # %entry72; X86-NEXT: movl {{[0-9]+}}(%esp), %eax73; X86-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero74; X86-NEXT: psrld %xmm1, %xmm075; X86-NEXT: movdqa %xmm0, (%eax)76; X86-NEXT: retl77;78; X64-LABEL: shift2b:79; X64: # %bb.0: # %entry80; X64-NEXT: movd %esi, %xmm181; X64-NEXT: psrld %xmm1, %xmm082; X64-NEXT: movdqa %xmm0, (%rdi)83; X64-NEXT: retq84entry:85 %0 = insertelement <4 x i32> undef, i32 %amt, i32 086 %1 = insertelement <4 x i32> %0, i32 %amt, i32 187 %2 = insertelement <4 x i32> %1, i32 %amt, i32 288 %3 = insertelement <4 x i32> %2, i32 %amt, i32 389 %lshr = lshr <4 x i32> %val, %390 store <4 x i32> %lshr, ptr %dst91 ret void92}93 94 95define void @shift3a(<8 x i16> %val, ptr %dst) nounwind {96; X86-LABEL: shift3a:97; X86: # %bb.0: # %entry98; X86-NEXT: movl {{[0-9]+}}(%esp), %eax99; X86-NEXT: psrlw $5, %xmm0100; X86-NEXT: movdqa %xmm0, (%eax)101; X86-NEXT: retl102;103; X64-LABEL: shift3a:104; X64: # %bb.0: # %entry105; X64-NEXT: psrlw $5, %xmm0106; X64-NEXT: movdqa %xmm0, (%rdi)107; X64-NEXT: retq108entry:109 %lshr = lshr <8 x i16> %val, < i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5 >110 store <8 x i16> %lshr, ptr %dst111 ret void112}113 114; properly zero extend the shift amount115define void @shift3b(<8 x i16> %val, ptr %dst, i16 %amt) nounwind {116; X86-LABEL: shift3b:117; X86: # %bb.0: # %entry118; X86-NEXT: movl {{[0-9]+}}(%esp), %eax119; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx120; X86-NEXT: movd %ecx, %xmm1121; X86-NEXT: psrlw %xmm1, %xmm0122; X86-NEXT: movdqa %xmm0, (%eax)123; X86-NEXT: retl124;125; X64-LABEL: shift3b:126; X64: # %bb.0: # %entry127; X64-NEXT: movzwl %si, %eax128; X64-NEXT: movd %eax, %xmm1129; X64-NEXT: psrlw %xmm1, %xmm0130; X64-NEXT: movdqa %xmm0, (%rdi)131; X64-NEXT: retq132entry:133 %0 = insertelement <8 x i16> undef, i16 %amt, i32 0134 %1 = insertelement <8 x i16> %0, i16 %amt, i32 1135 %2 = insertelement <8 x i16> %1, i16 %amt, i32 2136 %3 = insertelement <8 x i16> %2, i16 %amt, i32 3137 %4 = insertelement <8 x i16> %3, i16 %amt, i32 4138 %5 = insertelement <8 x i16> %4, i16 %amt, i32 5139 %6 = insertelement <8 x i16> %5, i16 %amt, i32 6140 %7 = insertelement <8 x i16> %6, i16 %amt, i32 7141 %lshr = lshr <8 x i16> %val, %7142 store <8 x i16> %lshr, ptr %dst143 ret void144}145