| // Copyright 2019 The Fuchsia Authors | |
| // | |
| // Use of this source code is governed by a MIT-style | |
| // license that can be found in the LICENSE file or at | |
| // https://opensource.org/licenses/MIT | |
| #include <lib/unittest/unittest.h> | |
| #include <ktl/atomic.h> | |
| namespace { | |
| constexpr unsigned __int128 kValue = | |
| (static_cast<unsigned __int128>(0x0123456789abcdef) << 64) + 0xfedcba9876543210; | |
| bool Load16Test() { | |
| BEGIN_TEST; | |
| { | |
| ktl::atomic<unsigned __int128> v = 0u; | |
| EXPECT_EQ(v.load(), 0u); | |
| } | |
| { | |
| ktl::atomic<unsigned __int128> v = kValue; | |
| EXPECT_EQ(v.load(), kValue); | |
| } | |
| END_TEST; | |
| } | |
| bool Store16Test() { | |
| BEGIN_TEST; | |
| ktl::atomic<unsigned __int128> v = 0u; | |
| EXPECT_EQ(v.load(), 0u); | |
| v.store(kValue); | |
| EXPECT_EQ(v.load(), kValue); | |
| END_TEST; | |
| } | |
| bool CompareExchange16Test() { | |
| BEGIN_TEST; | |
| { | |
| // Comparison fails. | |
| ktl::atomic<unsigned __int128> v = kValue; | |
| unsigned __int128 expected = kValue - 1; | |
| EXPECT_FALSE(v.compare_exchange_strong(expected, 0u)); | |
| EXPECT_EQ(expected, kValue); | |
| EXPECT_EQ(v.load(), kValue); | |
| } | |
| { | |
| // Comparison succeeds. | |
| ktl::atomic<unsigned __int128> v = kValue; | |
| unsigned __int128 expected = kValue; | |
| constexpr unsigned __int128 kDesired = 0xaaaabbbbccccdddd; | |
| EXPECT_TRUE(v.compare_exchange_strong(expected, kDesired)); | |
| EXPECT_EQ(expected, kValue); | |
| EXPECT_EQ(v.load(), kDesired); | |
| } | |
| END_TEST; | |
| } | |
| } // namespace | |
| UNITTEST_START_TESTCASE(libc_atomic_tests) | |
| UNITTEST("load_16", Load16Test) | |
| UNITTEST("store_16", Store16Test) | |
| UNITTEST("compare_exchange_16", CompareExchange16Test) | |
| UNITTEST_END_TESTCASE(libc_atomic_tests, "libc_atomic", "libc/atomic tests") |