Stephen Hines | c568f1e | 2014-07-21 00:47:37 -0700 | [diff] [blame] | 1 | // RUN: %clang_cc1 -triple x86_64-linux-gnu -target-cpu core2 %s -S -emit-llvm -o - | FileCheck %s |
| 2 | |
| 3 | // All atomics up to 16 bytes should be emitted inline on x86_64. The |
| 4 | // backend can reform __sync_whatever calls if necessary (e.g. the CPU |
| 5 | // doesn't have cmpxchg16b). |
| 6 | |
| 7 | __int128 test_sync_call(__int128 *addr, __int128 val) { |
| 8 | // CHECK-LABEL: @test_sync_call |
| 9 | // CHECK: atomicrmw add i128 |
| 10 | return __sync_fetch_and_add(addr, val); |
| 11 | } |
| 12 | |
| 13 | __int128 test_c11_call(_Atomic __int128 *addr, __int128 val) { |
| 14 | // CHECK-LABEL: @test_c11_call |
| 15 | // CHECK: atomicrmw sub |
| 16 | return __c11_atomic_fetch_sub(addr, val, 0); |
| 17 | } |
| 18 | |
| 19 | __int128 test_atomic_call(__int128 *addr, __int128 val) { |
| 20 | // CHECK-LABEL: @test_atomic_call |
| 21 | // CHECK: atomicrmw or |
| 22 | return __atomic_fetch_or(addr, val, 0); |
| 23 | } |
| 24 | |
| 25 | __int128 test_expression(_Atomic __int128 *addr) { |
| 26 | // CHECK-LABEL: @test_expression |
| 27 | // CHECK: atomicrmw and |
| 28 | *addr &= 1; |
| 29 | } |