diff --git a/libc/src/string/memory_utils/memcpy_utils.h b/libc/src/string/memory_utils/memcpy_utils.h --- a/libc/src/string/memory_utils/memcpy_utils.h +++ b/libc/src/string/memory_utils/memcpy_utils.h @@ -90,7 +90,7 @@ CopyBlock(dst, src); // Copy first block // Copy aligned blocks - const size_t ofla = offset_from_last_aligned(dst); + const size_t ofla = offset_from_last_aligned(src); const size_t limit = count + ofla - kBlockSize; for (size_t offset = kBlockSize; offset < limit; offset += kBlockSize) CopyBlock(dst - ofla + offset, src - ofla + offset); diff --git a/libc/test/src/string/memory_utils/memcpy_utils_test.cpp b/libc/test/src/string/memory_utils/memcpy_utils_test.cpp --- a/libc/test/src/string/memory_utils/memcpy_utils_test.cpp +++ b/libc/test/src/string/memory_utils/memcpy_utils_test.cpp @@ -162,14 +162,14 @@ TEST(MemcpyUtilsTest, CopyAlignedBlocks) { auto &trace = GetTrace(); - // Destination is aligned and multiple of alignment. + // Source is aligned and multiple of alignment. // "1111" trace.Clear(); CopyAlignedBlocks<4>(I(0), I(0), 4); EXPECT_STREQ(trace.Write(), "2222"); EXPECT_STREQ(trace.Read(), "2222"); - // Destination is aligned and multiple of alignment. + // Source is aligned and multiple of alignment. // "11110000" // + "00001111" // = "11111111" @@ -178,7 +178,7 @@ EXPECT_STREQ(trace.Write(), "11111111"); EXPECT_STREQ(trace.Read(), "11111111"); - // Destination is aligned already overlap at end. + // Source is aligned already overlap at end. // "1111000000000" // + "0000111100000" // + "0000000011110" @@ -189,26 +189,26 @@ EXPECT_STREQ(trace.Write(), "1111111112221"); EXPECT_STREQ(trace.Read(), "1111111112221"); - // Misaligned destination. + // Misaligned source. // "01111000000000" // + "00001111000000" // + "00000000111100" // + "00000000001111" // = "01112111112211" trace.Clear(); - CopyAlignedBlocks<4>(I(1), I(0), 13); - EXPECT_STREQ(trace.Write(), "01112111112211"); - EXPECT_STREQ(trace.Read(), "1112111112211"); + CopyAlignedBlocks<4>(I(0), I(1), 13); + EXPECT_STREQ(trace.Write(), "1112111112211"); + EXPECT_STREQ(trace.Read(), "01112111112211"); - // Misaligned destination aligned at end. + // Misaligned source aligned at end. // "011110000000" // + "000011110000" // + "000000001111" // = "011121111111" trace.Clear(); - CopyAlignedBlocks<4>(I(1), I(0), 11); - EXPECT_STREQ(trace.Write(), "011121111111"); - EXPECT_STREQ(trace.Read(), "11121111111"); + CopyAlignedBlocks<4>(I(0), I(1), 11); + EXPECT_STREQ(trace.Write(), "11121111111"); + EXPECT_STREQ(trace.Read(), "011121111111"); } TEST(MemcpyUtilsTest, MaxReloads) {