diff --git a/src/xenia/base/testing/memory_test.cc b/src/xenia/base/testing/memory_test.cc index 1374d6c14..0594b53d9 100644 --- a/src/xenia/base/testing/memory_test.cc +++ b/src/xenia/base/testing/memory_test.cc @@ -454,13 +454,56 @@ TEST_CASE("copy_and_swap_64_unaligned", "[copy_and_swap]") { } TEST_CASE("copy_and_swap_16_in_32_aligned", "[copy_and_swap]") { - // TODO(bwrsandman): test once properly understood. - REQUIRE(true == true); + constexpr size_t count = 17; + std::array src{}; + std::array dst{}; + + // Check alignment (if this fails, adjust allocation) + REQUIRE((reinterpret_cast(src.data()) & 0xF) == 0); + REQUIRE((reinterpret_cast(dst.data()) & 0xF) == 0); + + for (size_t i = 0; i < src.size(); ++i) { + src[i] = static_cast(i) + 1; // no zero in array + } + + copy_and_swap_16_in_32_aligned(dst.data(), src.data(), count); + + for (size_t i = 0; i < src.size(); i += 4) { + // Check src is untouched + REQUIRE(static_cast(src[i + 0]) == i + 1); + REQUIRE(static_cast(src[i + 1]) == i + 2); + REQUIRE(static_cast(src[i + 2]) == i + 3); + REQUIRE(static_cast(src[i + 3]) == i + 4); + // Check swapped bytes + REQUIRE(static_cast(dst[i + 0]) == static_cast(src[i + 2])); + REQUIRE(static_cast(dst[i + 1]) == static_cast(src[i + 3])); + REQUIRE(static_cast(dst[i + 2]) == static_cast(src[i + 0])); + REQUIRE(static_cast(dst[i + 3]) == static_cast(src[i + 1])); + } } TEST_CASE("copy_and_swap_16_in_32_unaligned", "[copy_and_swap]") { - // TODO(bwrsandman): test once properly understood. - REQUIRE(true == true); + constexpr size_t count = 17; + std::array src{}; + std::array dst{}; + for (size_t i = 0; i < src.size(); ++i) { + src[i] = static_cast(i) + 1; // no zero in array + } + + copy_and_swap_16_in_32_unaligned(dst.data(), src.data(), count); + + for (size_t i = 0; i < src.size(); i += 4) { + // Check src is untouched + REQUIRE(static_cast(src[i + 0]) == i + 1); + REQUIRE(static_cast(src[i + 1]) == i + 2); + REQUIRE(static_cast(src[i + 2]) == i + 3); + REQUIRE(static_cast(src[i + 3]) == i + 4); + // Check swapped bytes + REQUIRE(static_cast(dst[i + 0]) == static_cast(src[i + 2])); + REQUIRE(static_cast(dst[i + 1]) == static_cast(src[i + 3])); + REQUIRE(static_cast(dst[i + 2]) == static_cast(src[i + 0])); + REQUIRE(static_cast(dst[i + 3]) == static_cast(src[i + 1])); + } } TEST_CASE("create_and_close_file_mapping", "Virtual Memory Mapping") {