Home | History | Annotate | Download | only in ports
      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) {
     20     T val = *ptr;
     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>
     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>
     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
     40