1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 < %s -triple armv5e-none-linux-gnueabi -emit-llvm -O1 | FileCheck %s
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum memory_order {
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  memory_order_relaxed, memory_order_consume, memory_order_acquire,
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  memory_order_release, memory_order_acq_rel, memory_order_seq_cst
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint *test_c11_atomic_fetch_add_int_ptr(_Atomic(int *) *p) {
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_c11_atomic_fetch_add_int_ptr
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_add_4(i8* {{%[0-9]+}}, i32 12, i32 5)
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return __c11_atomic_fetch_add(p, 3, memory_order_seq_cst);
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint *test_c11_atomic_fetch_sub_int_ptr(_Atomic(int *) *p) {
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_c11_atomic_fetch_sub_int_ptr
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_sub_4(i8* {{%[0-9]+}}, i32 20, i32 5)
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return __c11_atomic_fetch_sub(p, 5, memory_order_seq_cst);
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint test_c11_atomic_fetch_add_int(_Atomic(int) *p) {
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_c11_atomic_fetch_add_int
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: {{%[^ ]*}} = tail call i32 bitcast (i32* (i8*, i32, i32)* @__atomic_fetch_add_4 to i32 (i8*, i32, i32)*)(i8* {{%[0-9]+}}, i32 3, i32 5)
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return __c11_atomic_fetch_add(p, 3, memory_order_seq_cst);
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint test_c11_atomic_fetch_sub_int(_Atomic(int) *p) {
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_c11_atomic_fetch_sub_int
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: {{%[^ ]*}} = tail call i32 bitcast (i32* (i8*, i32, i32)* @__atomic_fetch_sub_4 to i32 (i8*, i32, i32)*)(i8* {{%[0-9]+}}, i32 5, i32 5)
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return __c11_atomic_fetch_sub(p, 5, memory_order_seq_cst);
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint *fp2a(int **p) {
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: @fp2a
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_sub_4(i8* {{%[0-9]+}}, i32 4, i32 0)
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Note, the GNU builtins do not multiply by sizeof(T)!
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return __atomic_fetch_sub(p, 4, memory_order_relaxed);
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
38