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
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen 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
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen 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
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK: {{%[^ ]*}} = tail call i32 @__atomic_fetch_add_4(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
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK: {{%[^ ]*}} = tail call i32 @__atomic_fetch_sub_4(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
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen 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}
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_fetch_add(int *p) {
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_fetch_add
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = tail call i32 @__atomic_fetch_add_4(i8* {{%[0-9]+}}, i32 55, i32 5)
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_fetch_add(p, 55, memory_order_seq_cst);
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_fetch_sub(int *p) {
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_fetch_sub
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = tail call i32 @__atomic_fetch_sub_4(i8* {{%[0-9]+}}, i32 55, i32 5)
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_fetch_sub(p, 55, memory_order_seq_cst);
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_fetch_and(int *p) {
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_fetch_and
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = tail call i32 @__atomic_fetch_and_4(i8* {{%[0-9]+}}, i32 55, i32 5)
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_fetch_and(p, 55, memory_order_seq_cst);
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_fetch_or(int *p) {
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_fetch_or
5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = tail call i32 @__atomic_fetch_or_4(i8* {{%[0-9]+}}, i32 55, i32 5)
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_fetch_or(p, 55, memory_order_seq_cst);
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_fetch_xor(int *p) {
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_fetch_xor
6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = tail call i32 @__atomic_fetch_xor_4(i8* {{%[0-9]+}}, i32 55, i32 5)
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_fetch_xor(p, 55, memory_order_seq_cst);
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_fetch_nand(int *p) {
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_fetch_nand
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = tail call i32 @__atomic_fetch_nand_4(i8* {{%[0-9]+}}, i32 55, i32 5)
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_fetch_nand(p, 55, memory_order_seq_cst);
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_add_fetch(int *p) {
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_add_fetch
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: [[CALL:%[^ ]*]] = tail call i32 @__atomic_fetch_add_4(i8* {{%[0-9]+}}, i32 55, i32 5)
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = add i32 [[CALL]], 55
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_add_fetch(p, 55, memory_order_seq_cst);
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_sub_fetch(int *p) {
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_sub_fetch
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: [[CALL:%[^ ]*]] = tail call i32 @__atomic_fetch_sub_4(i8* {{%[0-9]+}}, i32 55, i32 5)
8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = add i32 [[CALL]], -55
8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_sub_fetch(p, 55, memory_order_seq_cst);
8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_and_fetch(int *p) {
9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_and_fetch
9187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: [[CALL:%[^ ]*]] = tail call i32 @__atomic_fetch_and_4(i8* {{%[0-9]+}}, i32 55, i32 5)
9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = and i32 [[CALL]], 55
9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_and_fetch(p, 55, memory_order_seq_cst);
9487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
9587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_or_fetch(int *p) {
9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_or_fetch
9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: [[CALL:%[^ ]*]] = tail call i32 @__atomic_fetch_or_4(i8* {{%[0-9]+}}, i32 55, i32 5)
9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = or i32 [[CALL]], 55
10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_or_fetch(p, 55, memory_order_seq_cst);
10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_xor_fetch(int *p) {
10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_xor_fetch
10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: [[CALL:%[^ ]*]] = tail call i32 @__atomic_fetch_xor_4(i8* {{%[0-9]+}}, i32 55, i32 5)
10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = xor i32 [[CALL]], 55
10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_xor_fetch(p, 55, memory_order_seq_cst);
10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint test_atomic_nand_fetch(int *p) {
11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: test_atomic_nand_fetch
11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: [[CALL:%[^ ]*]] = tail call i32 @__atomic_fetch_nand_4(i8* {{%[0-9]+}}, i32 55, i32 5)
11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: [[OR:%[^ ]*]] = or i32 [[CALL]], -56
11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: {{%[^ ]*}} = xor i32 [[OR]], 55
11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return __atomic_nand_fetch(p, 55, memory_order_seq_cst);
11687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
117