[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / pmovext.ll
blob795bf27af9218b68f0a6e7a41e1fb4f185832447
1 ; RUN: llc < %s -mtriple=x86_64-- -mcpu=corei7 | FileCheck %s
3 ; rdar://11897677
5 ;CHECK-LABEL: intrin_pmov:
6 ;CHECK: pmovzxbw  (%{{.*}}), %xmm0
7 ;CHECK-NEXT: movdqu
8 ;CHECK-NEXT: ret
9 define void @intrin_pmov(i16* noalias %dest, i8* noalias %src) nounwind uwtable ssp {
10   %1 = bitcast i8* %src to <2 x i64>*
11   %2 = load <2 x i64>, <2 x i64>* %1, align 16
12   %3 = bitcast <2 x i64> %2 to <16 x i8>
13   %4 = tail call <8 x i16> @llvm.x86.sse41.pmovzxbw(<16 x i8> %3) nounwind
14   %5 = bitcast i16* %dest to i8*
15   %6 = bitcast <8 x i16> %4 to <16 x i8>
16   tail call void @llvm.x86.sse2.storeu.dq(i8* %5, <16 x i8> %6) nounwind
17   ret void
20 declare <8 x i16> @llvm.x86.sse41.pmovzxbw(<16 x i8>) nounwind readnone
21 declare void @llvm.x86.sse2.storeu.dq(i8*, <16 x i8>) nounwind
23 ; rdar://15245794
25 define <4 x i32> @foo0(double %v.coerce) nounwind ssp {
26 ; CHECK-LABEL: foo0
27 ; CHECK: pmovzxwd %xmm0, %xmm0
28 ; CHECK-NEXT: ret
29   %tmp = bitcast double %v.coerce to <4 x i16>
30   %tmp1 = shufflevector <4 x i16> %tmp, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
31   %tmp2 = tail call <4 x i32> @llvm.x86.sse41.pmovzxwd(<8 x i16> %tmp1) nounwind
32   ret <4 x i32> %tmp2
35 define <8 x i16> @foo1(double %v.coerce) nounwind ssp {
36 ; CHECK-LABEL: foo1
37 ; CHECK: pmovzxbw %xmm0, %xmm0
38 ; CHECK-NEXT: ret
39   %tmp = bitcast double %v.coerce to <8 x i8>
40   %tmp1 = shufflevector <8 x i8> %tmp, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
41   %tmp2 = tail call <8 x i16> @llvm.x86.sse41.pmovzxbw(<16 x i8> %tmp1)
42   ret <8 x i16> %tmp2
45 declare <4 x i32> @llvm.x86.sse41.pmovzxwd(<8 x i16>) nounwind readnone