53cf3e300fdb1dba5641b2bc15ec24c4c0745d99
[oota-llvm.git] / test / CodeGen / X86 / cmpxchg-i1.ll
1 ; RUN: llc -mtriple=x86_64 -o - %s | FileCheck %s
2
3 define i1 @try_cmpxchg(i32* %addr, i32 %desired, i32 %new) {
4 ; CHECK-LABEL: try_cmpxchg:
5 ; CHECK: cmpxchgl
6 ; CHECK-NOT: cmp
7 ; CHECK: sete %al
8 ; CHECK: retq
9   %old = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
10   %success = icmp eq i32 %old, %desired
11   ret i1 %success
12 }
13
14 define void @cmpxchg_flow(i64* %addr, i64 %desired, i64 %new) {
15 ; CHECK-LABEL: cmpxchg_flow:
16 ; CHECK: cmpxchgq
17 ; CHECK-NOT: cmp
18 ; CHECK-NOT: set
19 ; CHECK: {{jne|jeq}}
20   %old = cmpxchg i64* %addr, i64 %desired, i64 %new seq_cst seq_cst
21   %success = icmp eq i64 %old, %desired
22   br i1 %success, label %true, label %false
23
24 true:
25   call void @foo()
26   ret void
27
28 false:
29   call void @bar()
30   ret void
31 }
32
33 define i1 @cmpxchg_arithcmp(i16* %addr, i16 %desired, i16 %new) {
34 ; CHECK-LABEL: cmpxchg_arithcmp:
35 ; CHECK: cmpxchgw
36 ; CHECK-NOT: cmp
37 ; CHECK: setbe %al
38 ; CHECK: retq
39   %old = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst
40   %success = icmp uge i16 %old, %desired
41   ret i1 %success
42 }
43
44 define i1 @cmpxchg_arithcmp_swapped(i8* %addr, i8 %desired, i8 %new) {
45 ; CHECK-LABEL: cmpxchg_arithcmp_swapped:
46 ; CHECK: cmpxchgb
47 ; CHECK-NOT: cmp
48 ; CHECK: setge %al
49 ; CHECK: retq
50   %old = cmpxchg i8* %addr, i8 %desired, i8 %new seq_cst seq_cst
51   %success = icmp sge i8 %desired, %old
52   ret i1 %success
53 }
54
55 define i64 @cmpxchg_sext(i32* %addr, i32 %desired, i32 %new) {
56 ; CHECK-LABEL: cmpxchg_sext:
57 ; CHECK-DAG: cmpxchgl
58 ; CHECK-DAG: movq $-1, %rax
59 ; CHECK-DAG: xorl %e[[ZERO:[a-z0-9]+]], %e[[ZERO]]
60 ; CHECK-NOT: cmpl
61 ; CHECK: cmovneq %r[[ZERO]], %rax
62 ; CHECK: retq
63   %old = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
64   %success = icmp eq i32 %old, %desired
65   %mask = sext i1 %success to i64
66   ret i64 %mask
67 }
68
69 define i32 @cmpxchg_zext(i32* %addr, i32 %desired, i32 %new) {
70 ; CHECK-LABEL: cmpxchg_zext:
71 ; CHECK: cmpxchgl
72 ; CHECK-NOT: cmp
73 ; CHECK: sete [[BYTE:%[a-z0-9]+]]
74 ; CHECK: movzbl [[BYTE]], %eax
75   %old = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
76   %success = icmp eq i32 %old, %desired
77   %mask = zext i1 %success to i32
78   ret i32 %mask
79 }
80
81 declare void @foo()
82 declare void @bar()