blob: 186581ca8fbbced83d56c6f7d0ea90e04206c752 [file] [log] [blame]
Eli Friedman2bdffe42011-08-31 00:31:29 +00001; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s
2
3define i64 @test1(i64* %ptr, i64 %val) {
4; CHECK: test1
5; CHECK: dmb ish
6; CHECK: ldrexd r2, r3
7; CHECK: adds r0, r2
8; CHECK: adc r1, r3
9; CHECK: strexd {{r[0-9]+}}, r0, r1
10; CHECK: cmp
11; CHECK: bne
12; CHECK: dmb ish
13 %r = atomicrmw add i64* %ptr, i64 %val seq_cst
14 ret i64 %r
15}
16
17define i64 @test2(i64* %ptr, i64 %val) {
18; CHECK: test2
19; CHECK: dmb ish
20; CHECK: ldrexd r2, r3
21; CHECK: subs r0, r2
22; CHECK: sbc r1, r3
23; CHECK: strexd {{r[0-9]+}}, r0, r1
24; CHECK: cmp
25; CHECK: bne
26; CHECK: dmb ish
27 %r = atomicrmw sub i64* %ptr, i64 %val seq_cst
28 ret i64 %r
29}
30
31define i64 @test3(i64* %ptr, i64 %val) {
32; CHECK: test3
33; CHECK: dmb ish
34; CHECK: ldrexd r2, r3
35; CHECK: and r0, r2
36; CHECK: and r1, r3
37; CHECK: strexd {{r[0-9]+}}, r0, r1
38; CHECK: cmp
39; CHECK: bne
40; CHECK: dmb ish
41 %r = atomicrmw and i64* %ptr, i64 %val seq_cst
42 ret i64 %r
43}
44
45define i64 @test4(i64* %ptr, i64 %val) {
46; CHECK: test4
47; CHECK: dmb ish
48; CHECK: ldrexd r2, r3
49; CHECK: orr r0, r2
50; CHECK: orr r1, r3
51; CHECK: strexd {{r[0-9]+}}, r0, r1
52; CHECK: cmp
53; CHECK: bne
54; CHECK: dmb ish
55 %r = atomicrmw or i64* %ptr, i64 %val seq_cst
56 ret i64 %r
57}
58
59define i64 @test5(i64* %ptr, i64 %val) {
60; CHECK: test5
61; CHECK: dmb ish
62; CHECK: ldrexd r2, r3
63; CHECK: eor r0, r2
64; CHECK: eor r1, r3
65; CHECK: strexd {{r[0-9]+}}, r0, r1
66; CHECK: cmp
67; CHECK: bne
68; CHECK: dmb ish
69 %r = atomicrmw xor i64* %ptr, i64 %val seq_cst
70 ret i64 %r
71}
72
73define i64 @test6(i64* %ptr, i64 %val) {
74; CHECK: test6
75; CHECK: dmb ish
76; CHECK: ldrexd r2, r3
77; CHECK: strexd {{r[0-9]+}}, r0, r1
78; CHECK: cmp
79; CHECK: bne
80; CHECK: dmb ish
81 %r = atomicrmw xchg i64* %ptr, i64 %val seq_cst
82 ret i64 %r
83}