1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met:
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions of source code must retain the above copyright
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       notice, this list of conditions and the following disclaimer.
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions in binary form must reproduce the above
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       copyright notice, this list of conditions and the following
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       disclaimer in the documentation and/or other materials provided
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       with the distribution.
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Neither the name of Google Inc. nor the names of its
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       contributors may be used to endorse or promote products derived
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       from this software without specific prior written permission.
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h"
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/atomicops.h"
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h"
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::base;
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal;
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CHECK_EQU(v1, v2) \
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(static_cast<int64_t>(v1), static_cast<int64_t>(v2))
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NUM_BITS(T) (sizeof(T) * 8)
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class AtomicType>
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestAtomicIncrement() {
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // For now, we just test the single-threaded execution.
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use a guard value to make sure that NoBarrier_AtomicIncrement doesn't
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // go outside the expected address bounds.  This is to test that the
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // 32-bit NoBarrier_AtomicIncrement doesn't do the wrong thing on 64-bit
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // machines.
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  struct {
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AtomicType prev_word;
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AtomicType count;
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AtomicType next_word;
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } s;
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType prev_word_value, next_word_value;
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  memset(&prev_word_value, 0xFF, sizeof(AtomicType));
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  memset(&next_word_value, 0xEE, sizeof(AtomicType));
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.prev_word = prev_word_value;
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.count = 0;
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.next_word = next_word_value;
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, 1), 1);
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, 1);
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, 2), 3);
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, 3);
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, 3), 6);
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, 6);
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, -3), 3);
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, 3);
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, -2), 1);
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, 1);
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, -1), 0);
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, 0);
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, -1), -1);
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, -1);
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, -4), -5);
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, -5);
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(NoBarrier_AtomicIncrement(&s.count, 5), 0);
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.count, 0);
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.prev_word, prev_word_value);
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(s.next_word, next_word_value);
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class AtomicType>
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestCompareAndSwap() {
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType value = 0;
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType prev = NoBarrier_CompareAndSwap(&value, 0, 1);
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(1, value);
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(0, prev);
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use a test value that has non-zero bits in both halves, for testing
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the 64-bit implementation on 32-bit platforms.
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const AtomicType k_test_val =
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (static_cast<AtomicType>(1) << (NUM_BITS(AtomicType) - 2)) + 11;
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = k_test_val;
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  prev = NoBarrier_CompareAndSwap(&value, 0, 5);
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(k_test_val, value);
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(k_test_val, prev);
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = k_test_val;
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  prev = NoBarrier_CompareAndSwap(&value, k_test_val, 5);
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(5, value);
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(k_test_val, prev);
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class AtomicType>
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestAtomicExchange() {
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType value = 0;
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType new_value = NoBarrier_AtomicExchange(&value, 1);
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(1, value);
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(0, new_value);
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use a test value that has non-zero bits in both halves, for testing
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the 64-bit implementation on 32-bit platforms.
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const AtomicType k_test_val =
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (static_cast<AtomicType>(1) << (NUM_BITS(AtomicType) - 2)) + 11;
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = k_test_val;
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new_value = NoBarrier_AtomicExchange(&value, k_test_val);
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(k_test_val, value);
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(k_test_val, new_value);
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = k_test_val;
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new_value = NoBarrier_AtomicExchange(&value, 5);
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(5, value);
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(k_test_val, new_value);
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class AtomicType>
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestAtomicIncrementBounds() {
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test at rollover boundary between int_max and int_min.
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType test_val =
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      static_cast<AtomicType>(1) << (NUM_BITS(AtomicType) - 1);
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType value = -1 ^ test_val;
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType new_value = NoBarrier_AtomicIncrement(&value, 1);
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(test_val, value);
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(value, new_value);
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoBarrier_AtomicIncrement(&value, -1);
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(-1 ^ test_val, value);
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test at 32-bit boundary for 64-bit atomic type.
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  test_val = static_cast<AtomicType>(1) << (NUM_BITS(AtomicType) / 2);
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = test_val - 1;
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new_value = NoBarrier_AtomicIncrement(&value, 1);
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(test_val, value);
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(value, new_value);
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoBarrier_AtomicIncrement(&value, -1);
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(test_val - 1, value);
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Return an AtomicType with the value 0xa5a5a5..
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class AtomicType>
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic AtomicType TestFillValue() {
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType val = 0;
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  memset(&val, 0xa5, sizeof(AtomicType));
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return val;
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This is a simple sanity check to ensure that values are correct.
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Not testing atomicity.
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class AtomicType>
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestStore() {
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const AtomicType kVal1 = TestFillValue<AtomicType>();
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const AtomicType kVal2 = static_cast<AtomicType>(-1);
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType value;
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoBarrier_Store(&value, kVal1);
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal1, value);
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoBarrier_Store(&value, kVal2);
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal2, value);
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Acquire_Store(&value, kVal1);
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal1, value);
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Acquire_Store(&value, kVal2);
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal2, value);
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Release_Store(&value, kVal1);
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal1, value);
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Release_Store(&value, kVal2);
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal2, value);
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Merge this test with TestStore as soon as we have Atomic8 acquire
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// and release stores.
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestStoreAtomic8() {
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Atomic8 kVal1 = TestFillValue<Atomic8>();
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Atomic8 kVal2 = static_cast<Atomic8>(-1);
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Atomic8 value;
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoBarrier_Store(&value, kVal1);
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal1, value);
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NoBarrier_Store(&value, kVal2);
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal2, value);
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This is a simple sanity check to ensure that values are correct.
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Not testing atomicity.
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class AtomicType>
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestLoad() {
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const AtomicType kVal1 = TestFillValue<AtomicType>();
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const AtomicType kVal2 = static_cast<AtomicType>(-1);
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AtomicType value;
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = kVal1;
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal1, NoBarrier_Load(&value));
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = kVal2;
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal2, NoBarrier_Load(&value));
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = kVal1;
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal1, Acquire_Load(&value));
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = kVal2;
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal2, Acquire_Load(&value));
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = kVal1;
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal1, Release_Load(&value));
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = kVal2;
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal2, Release_Load(&value));
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Merge this test with TestLoad as soon as we have Atomic8 acquire
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// and release loads.
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void TestLoadAtomic8() {
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Atomic8 kVal1 = TestFillValue<Atomic8>();
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Atomic8 kVal2 = static_cast<Atomic8>(-1);
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Atomic8 value;
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = kVal1;
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal1, NoBarrier_Load(&value));
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = kVal2;
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQU(kVal2, NoBarrier_Load(&value));
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(AtomicIncrement) {
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestAtomicIncrement<Atomic32>();
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestAtomicIncrement<AtomicWord>();
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(CompareAndSwap) {
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestCompareAndSwap<Atomic32>();
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestCompareAndSwap<AtomicWord>();
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(AtomicExchange) {
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestAtomicExchange<Atomic32>();
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestAtomicExchange<AtomicWord>();
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(AtomicIncrementBounds) {
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestAtomicIncrementBounds<Atomic32>();
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestAtomicIncrementBounds<AtomicWord>();
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(Store) {
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestStoreAtomic8();
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestStore<Atomic32>();
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestStore<AtomicWord>();
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(Load) {
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestLoadAtomic8();
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestLoad<Atomic32>();
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestLoad<AtomicWord>();
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
310