commit-bot@chromium.org | 448e2a3 | 2014-05-29 18:24:54 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2014 Google Inc. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license that can be |
| 5 | * found in the LICENSE file. |
| 6 | */ |
| 7 | |
| 8 | #ifndef SkBarriers_x86_DEFINED |
| 9 | #define SkBarriers_x86_DEFINED |
| 10 | |
| 11 | #ifdef SK_BUILD_FOR_WIN |
| 12 | # include <intrin.h> |
| 13 | static inline void sk_compiler_barrier() { _ReadWriteBarrier(); } |
| 14 | #else |
| 15 | static inline void sk_compiler_barrier() { asm volatile("" : : : "memory"); } |
| 16 | #endif |
| 17 | |
| 18 | template <typename T> |
| 19 | T sk_acquire_load(T* ptr) { |
mtklein | 832cb66 | 2014-06-02 13:46:17 -0700 | [diff] [blame] | 20 | T val = *ptr; |
commit-bot@chromium.org | 448e2a3 | 2014-05-29 18:24:54 +0000 | [diff] [blame] | 21 | // On x86, all loads are acquire loads, so we only need a compiler barrier. |
| 22 | sk_compiler_barrier(); |
| 23 | return val; |
| 24 | } |
| 25 | |
| 26 | template <typename T> |
mtklein | 654a9c2 | 2014-07-10 11:24:18 -0700 | [diff] [blame] | 27 | T sk_consume_load(T* ptr) { |
| 28 | // On x86, consume is the same as acquire, i.e. a normal load. |
| 29 | return sk_acquire_load(ptr); |
| 30 | } |
| 31 | |
| 32 | template <typename T> |
commit-bot@chromium.org | 448e2a3 | 2014-05-29 18:24:54 +0000 | [diff] [blame] | 33 | void sk_release_store(T* ptr, T val) { |
| 34 | // On x86, all stores are release stores, so we only need a compiler barrier. |
| 35 | sk_compiler_barrier(); |
| 36 | *ptr = val; |
| 37 | } |
| 38 | |
| 39 | #endif//SkBarriers_x86_DEFINED |