1448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org/*
2448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org * Copyright 2014 Google Inc.
3448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org *
4448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org * found in the LICENSE file.
6448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org */
7448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org
8448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org#ifndef SkBarriers_x86_DEFINED
9448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org#define SkBarriers_x86_DEFINED
10448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org
11448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org#ifdef SK_BUILD_FOR_WIN
12448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org#  include <intrin.h>
13448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.orgstatic inline void sk_compiler_barrier() { _ReadWriteBarrier(); }
14448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org#else
15448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.orgstatic inline void sk_compiler_barrier() { asm volatile("" : : : "memory"); }
16448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org#endif
17448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org
18448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.orgtemplate <typename T>
19448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.orgT sk_acquire_load(T* ptr) {
20832cb667498407401a7b508a331a65524736c072mtklein    T val = *ptr;
21448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org    // On x86, all loads are acquire loads, so we only need a compiler barrier.
22448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org    sk_compiler_barrier();
23448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org    return val;
24448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org}
25448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org
26448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.orgtemplate <typename T>
27654a9c20acb2e34b7836139615c29dc09fa0fb9cmtkleinT sk_consume_load(T* ptr) {
28654a9c20acb2e34b7836139615c29dc09fa0fb9cmtklein    // On x86, consume is the same as acquire, i.e. a normal load.
29654a9c20acb2e34b7836139615c29dc09fa0fb9cmtklein    return sk_acquire_load(ptr);
30654a9c20acb2e34b7836139615c29dc09fa0fb9cmtklein}
31654a9c20acb2e34b7836139615c29dc09fa0fb9cmtklein
32654a9c20acb2e34b7836139615c29dc09fa0fb9cmtkleintemplate <typename T>
33448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.orgvoid sk_release_store(T* ptr, T val) {
34448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org    // On x86, all stores are release stores, so we only need a compiler barrier.
35448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org    sk_compiler_barrier();
36448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org    *ptr = val;
37448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org}
38448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org
39448e2a3b3935d91e7bf84dc5b0367b92d2e2a518commit-bot@chromium.org#endif//SkBarriers_x86_DEFINED
40