Test case for 132396. rdar://problem/5660695
[oota-llvm.git] / test / CodeGen / X86 / 2011-05-31-movmsk.ll
1 ; RUN: llc -mcpu=core2 < %s | FileCheck %s
2 ; ModuleID = '<stdin>'
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
4 target triple = "x86_64-apple-macosx10.6.6"
5
6 %0 = type { double }
7 %union.anon = type { float }
8
9 define i32 @double_signbit(double %d1) nounwind uwtable readnone ssp {
10 entry:
11   %__x.addr.i = alloca double, align 8
12   %__u.i = alloca %0, align 8
13   %0 = bitcast double* %__x.addr.i to i8*
14   call void @llvm.lifetime.start(i64 -1, i8* %0)
15   %1 = bitcast %0* %__u.i to i8*
16   call void @llvm.lifetime.start(i64 -1, i8* %1)
17   store double %d1, double* %__x.addr.i, align 8
18   %__f.i = getelementptr inbounds %0* %__u.i, i64 0, i32 0
19   store double %d1, double* %__f.i, align 8
20   %tmp = bitcast double %d1 to i64
21 ; CHECK-NOT: shr
22 ; CHECK: movmskpd
23 ; CHECK-NEXT: and
24   %tmp1 = lshr i64 %tmp, 63
25   %shr.i = trunc i64 %tmp1 to i32
26   call void @llvm.lifetime.end(i64 -1, i8* %0)
27   call void @llvm.lifetime.end(i64 -1, i8* %1)
28   ret i32 %shr.i
29 }
30
31 define i32 @double_add_signbit(double %d1, double %d2) nounwind uwtable readnone ssp {
32 entry:
33   %__x.addr.i = alloca double, align 8
34   %__u.i = alloca %0, align 8
35   %add = fadd double %d1, %d2
36   %0 = bitcast double* %__x.addr.i to i8*
37   call void @llvm.lifetime.start(i64 -1, i8* %0)
38   %1 = bitcast %0* %__u.i to i8*
39   call void @llvm.lifetime.start(i64 -1, i8* %1)
40   store double %add, double* %__x.addr.i, align 8
41   %__f.i = getelementptr inbounds %0* %__u.i, i64 0, i32 0
42   store double %add, double* %__f.i, align 8
43   %tmp = bitcast double %add to i64
44 ; CHECK-NOT: shr
45 ; CHECK: movmskpd
46 ; CHECK-NEXT: and
47   %tmp1 = lshr i64 %tmp, 63
48   %shr.i = trunc i64 %tmp1 to i32
49   call void @llvm.lifetime.end(i64 -1, i8* %0)
50   call void @llvm.lifetime.end(i64 -1, i8* %1)
51   ret i32 %shr.i
52 }
53
54 define i32 @float_signbit(float %f1) nounwind uwtable readnone ssp {
55 entry:
56   %__x.addr.i = alloca float, align 4
57   %__u.i = alloca %union.anon, align 4
58   %0 = bitcast float* %__x.addr.i to i8*
59   call void @llvm.lifetime.start(i64 -1, i8* %0)
60   %1 = bitcast %union.anon* %__u.i to i8*
61   call void @llvm.lifetime.start(i64 -1, i8* %1)
62   store float %f1, float* %__x.addr.i, align 4
63   %__f.i = getelementptr inbounds %union.anon* %__u.i, i64 0, i32 0
64   store float %f1, float* %__f.i, align 4
65   %2 = bitcast float %f1 to i32
66 ; CHECK-NOT: shr
67 ; CHECK: movmskps
68 ; CHECK-NEXT: and
69   %shr.i = lshr i32 %2, 31
70   call void @llvm.lifetime.end(i64 -1, i8* %0)
71   call void @llvm.lifetime.end(i64 -1, i8* %1)
72   ret i32 %shr.i
73 }
74
75 define i32 @float_add_signbit(float %f1, float %f2) nounwind uwtable readnone ssp {
76 entry:
77   %__x.addr.i = alloca float, align 4
78   %__u.i = alloca %union.anon, align 4
79   %add = fadd float %f1, %f2
80   %0 = bitcast float* %__x.addr.i to i8*
81   call void @llvm.lifetime.start(i64 -1, i8* %0)
82   %1 = bitcast %union.anon* %__u.i to i8*
83   call void @llvm.lifetime.start(i64 -1, i8* %1)
84   store float %add, float* %__x.addr.i, align 4
85   %__f.i = getelementptr inbounds %union.anon* %__u.i, i64 0, i32 0
86   store float %add, float* %__f.i, align 4
87   %2 = bitcast float %add to i32
88 ; CHECK-NOT: shr
89 ; CHECK: movmskps
90 ; CHECK-NEXT: and
91   %shr.i = lshr i32 %2, 31
92   call void @llvm.lifetime.end(i64 -1, i8* %0)
93   call void @llvm.lifetime.end(i64 -1, i8* %1)
94   ret i32 %shr.i
95 }
96
97 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
98
99 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind