blob: a4d8620aa220f34bd4c78c8a076f6672642a0917 [file] [log] [blame]
// Copyright 2021 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 <memory>
#include <gtest/gtest.h>
extern "C" void* memcpy_movsb(void* dest, const void* src, size_t count);
extern "C" void* memcpy_movsq(void* dest, const void* src, size_t count);
extern "C" void* memset_stosb(void* s, int c, size_t count);
extern "C" void* memset_stosq(void* s, int c, size_t count);
namespace {
using MemcpyFunc = void* (*)(void*, const void*, size_t);
using MemsetFunc = void* (*)(void*, int, size_t);
void TestMemcpy(MemcpyFunc memcpy_func) {
for (size_t i = 0; i < 40; ++i) {
auto dst = std::make_unique<uint8_t[]>(i); // Zero-filled.
std::unique_ptr<uint8_t[]> src(new uint8_t[i]); // Uninitialized array, immediately filled.
for (size_t j = 0; j < i; ++j) {
src[j] = i;
}
auto result = memcpy_func(dst.get(), src.get(), i);
EXPECT_EQ(dst.get(), static_cast<uint8_t*>(result));
for (size_t j = 0; j < i; ++j) {
EXPECT_EQ(src[j], dst[j]) << "case (" << i << ", " << j << ")";
}
}
}
void TestMemset(MemsetFunc memset_func) {
for (size_t i = 0; i < 40; ++i) {
auto buff = std::make_unique<uint8_t[]>(i); // Zero-filled.
auto result = memset_func(buff.get(), i, i);
EXPECT_EQ(buff.get(), static_cast<uint8_t*>(result));
for (size_t j = 0; j < i; ++j) {
EXPECT_EQ(i, buff[j]) << "case (" << i << ", " << j << ")";
}
}
}
TEST(X86CstringTests, memcpy_movsb) { ASSERT_NO_FATAL_FAILURE(TestMemcpy(memcpy_movsb)); }
TEST(X86CstringTests, memcpy_movsq) { ASSERT_NO_FATAL_FAILURE(TestMemcpy(memcpy_movsq)); }
TEST(X86CstringTests, memset_stosb) { ASSERT_NO_FATAL_FAILURE(TestMemset(memset_stosb)); }
TEST(X86CstringTests, memset_stosq) { ASSERT_NO_FATAL_FAILURE(TestMemset(memset_stosq)); }
} // namespace