1; RUN: llc < %s -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s -check-prefix=ARM
2; RUN: llc < %s -mtriple=armv7-apple-ios -O0 | FileCheck %s -check-prefix=ARM
3; RUN: llc < %s -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s -check-prefix=THUMBTWO
4; RUN: llc < %s -mtriple=thumbv6-apple-ios | FileCheck %s -check-prefix=THUMBONE
5; RUN: llc < %s -mtriple=armv4-apple-ios | FileCheck %s -check-prefix=ARMV4
6; RUN: llc < %s -mtriple=armv6-apple-ios | FileCheck %s -check-prefix=ARMV6
7; RUN: llc < %s -mtriple=thumbv7m-apple-ios | FileCheck %s -check-prefix=THUMBM
8
9define void @test1(i32* %ptr, i32 %val1) {
10; ARM-LABEL: test1
11; ARM: dmb {{ish$}}
12; ARM-NEXT: str
13; ARM-NEXT: dmb {{ish$}}
14; THUMBONE-LABEL: test1
15; THUMBONE: __sync_lock_test_and_set_4
16; THUMBTWO-LABEL: test1
17; THUMBTWO: dmb {{ish$}}
18; THUMBTWO-NEXT: str
19; THUMBTWO-NEXT: dmb {{ish$}}
20; ARMV6-LABEL: test1
21; ARMV6: mcr p15, #0, {{r[0-9]*}}, c7, c10, #5
22; ARMV6: str
23; ARMV6: mcr p15, #0, {{r[0-9]*}}, c7, c10, #5
24; THUMBM-LABEL: test1
25; THUMBM: dmb sy
26; THUMBM: str
27; THUMBM: dmb sy
28  store atomic i32 %val1, i32* %ptr seq_cst, align 4
29  ret void
30}
31
32define i32 @test2(i32* %ptr) {
33; ARM-LABEL: test2
34; ARM: ldr
35; ARM-NEXT: dmb {{ish$}}
36; THUMBONE-LABEL: test2
37; THUMBONE: __sync_val_compare_and_swap_4
38; THUMBTWO-LABEL: test2
39; THUMBTWO: ldr
40; THUMBTWO-NEXT: dmb {{ish$}}
41; ARMV6-LABEL: test2
42; ARMV6: ldr
43; ARMV6: mcr p15, #0, {{r[0-9]*}}, c7, c10, #5
44; THUMBM-LABEL: test2
45; THUMBM: ldr
46; THUMBM: dmb sy
47  %val = load atomic i32, i32* %ptr seq_cst, align 4
48  ret i32 %val
49}
50
51define void @test3(i8* %ptr1, i8* %ptr2) {
52; ARM-LABEL: test3
53; ARM-NOT: dmb
54; ARM: ldrb
55; ARM-NOT: dmb
56; ARM: strb
57; ARM-NOT: dmb
58; ARM: bx lr
59
60; THUMBTWO-LABEL: test3
61; THUMBTWO-NOT: dmb
62; THUMBTWO: ldrb
63; THUMBTWO-NOT: dmb
64; THUMBTWO: strb
65; THUMBTWO-NOT: dmb
66; THUMBTWO: bx lr
67
68; THUMBONE-LABEL: test3
69; THUMBONE-NOT: dmb
70; THUMBONE: ldrb
71; THUMBONE-NOT: dmb
72; THUMBONE: strb
73; THUMBONE-NOT: dmb
74
75; ARMV6-LABEL: test3
76; ARMV6-NOT: mcr
77; THUMBM-LABEL: test3
78; THUMBM-NOT: dmb sy
79  %val = load atomic i8, i8* %ptr1 unordered, align 1
80  store atomic i8 %val, i8* %ptr2 unordered, align 1
81  ret void
82}
83
84define void @test4(i8* %ptr1, i8* %ptr2) {
85; THUMBONE-LABEL: test4
86; THUMBONE: ___sync_val_compare_and_swap_1
87; THUMBONE: ___sync_lock_test_and_set_1
88; ARMV6-LABEL: test4
89; THUMBM-LABEL: test4
90  %val = load atomic i8, i8* %ptr1 seq_cst, align 1
91  store atomic i8 %val, i8* %ptr2 seq_cst, align 1
92  ret void
93}
94
95define i64 @test_old_load_64bit(i64* %p) {
96; ARMV4-LABEL: test_old_load_64bit
97; ARMV4: ___sync_val_compare_and_swap_8
98  %1 = load atomic i64, i64* %p seq_cst, align 8
99  ret i64 %1
100}
101
102define void @test_old_store_64bit(i64* %p, i64 %v) {
103; ARMV4-LABEL: test_old_store_64bit
104; ARMV4: ___sync_lock_test_and_set_8
105  store atomic i64 %v, i64* %p seq_cst, align 8
106  ret void
107}
108