blob: a4f853450b34fe1a7cdfe983c3b0f13717d2a1c8 [file] [log] [blame]
Tim Northoverb4ddc082014-05-30 10:09:59 +00001; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s | FileCheck %s
2
3define i32 @test_return(i32* %p, i32 %oldval, i32 %newval) {
4; CHECK-LABEL: test_return:
5
6; CHECK: dmb ishst
7
8; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
9; CHECK: ldrex [[LOADED:r[0-9]+]], [r0]
10; CHECK: cmp [[LOADED]], r1
11; CHECK: bne [[FAILED:LBB[0-9]+_[0-9]+]]
12
13; CHECK: strex [[STATUS:r[0-9]+]], {{r[0-9]+}}, [r0]
14; CHECK: cmp [[STATUS]], #0
15; CHECK: bne [[LOOP]]
16
17; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
18; CHECK: movs r0, #1
19; CHECK: dmb ish
20; CHECK: bx lr
21
22; CHECK: [[FAILED]]:
23; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
24; CHECK: movs r0, #0
25; CHECK: dmb ish
26; CHECK: bx lr
27
28 %loaded = cmpxchg i32* %p, i32 %oldval, i32 %newval seq_cst seq_cst
29 %success = icmp eq i32 %loaded, %oldval
30 %conv = zext i1 %success to i32
31 ret i32 %conv
32}
33
34define i1 @test_return_bool(i8* %value, i8 %oldValue, i8 %newValue) {
35; CHECK-LABEL: test_return_bool:
36
37; CHECK: uxtb [[OLDBYTE:r[0-9]+]], r1
38; CHECK: dmb ishst
39
40; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
41; CHECK: ldrexb [[LOADED:r[0-9]+]], [r0]
42; CHECK: cmp [[LOADED]], [[OLDBYTE]]
43
44; CHECK: itt ne
45; CHECK: movne r0, #1
46; CHECK: bxne lr
47
48; CHECK: strexb [[STATUS:r[0-9]+]], {{r[0-9]+}}, [r0]
49; CHECK: cmp [[STATUS]], #0
50; CHECK: bne [[LOOP]]
51
52; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
53; CHECK: movs r0, #0
54; CHECK: bx lr
55
56 %loaded = cmpxchg i8* %value, i8 %oldValue, i8 %newValue acq_rel monotonic
57 %failure = icmp ne i8 %loaded, %oldValue
58 ret i1 %failure
59}
60
61define void @test_conditional(i32* %p, i32 %oldval, i32 %newval) {
62; CHECK-LABEL: test_conditional:
63
64; CHECK: dmb ishst
65
66; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
67; CHECK: ldrex [[LOADED:r[0-9]+]], [r0]
68; CHECK: cmp [[LOADED]], r1
69; CHECK: bne [[FAILED:LBB[0-9]+_[0-9]+]]
70
71; CHECK: strex [[STATUS:r[0-9]+]], r2, [r0]
72; CHECK: cmp [[STATUS]], #0
73; CHECK: bne [[LOOP]]
74
75; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
76; CHECK: dmb ish
77; CHECK: b.w _bar
78
79; CHECK: [[FAILED]]:
80; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
81; CHECK: dmb ish
82; CHECK: b.w _baz
83
84 %loaded = cmpxchg i32* %p, i32 %oldval, i32 %newval seq_cst seq_cst
85 %success = icmp eq i32 %loaded, %oldval
86 br i1 %success, label %true, label %false
87
88true:
89 tail call void @bar() #2
90 br label %end
91
92false:
93 tail call void @baz() #2
94 br label %end
95
96end:
97 ret void
98}
99
100declare void @bar()
101declare void @baz()