From 2cda82eeea484e2d46908462f755edcb4ef56cce Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 4 Feb 2018 05:38:49 +0100 Subject: [PATCH] Fix handling of misaligned bytes in fill --- arch/x64/linux/memory/fill.S | 5 +++++ source/tanya/memory/op.d | 35 ++++++++++------------------------- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/arch/x64/linux/memory/fill.S b/arch/x64/linux/memory/fill.S index d4fc0ac..2717aa1 100644 --- a/arch/x64/linux/memory/fill.S +++ b/arch/x64/linux/memory/fill.S @@ -37,6 +37,11 @@ _D5tanya6memory2op10fillMemoryFNaNbNiAvmZv: mov %rsi, %r8 + // If the length is less than the number of misaligned bytes, + // write one byte at a time and exit + cmp %rax, %rcx + jg aligned_1 + naligned: mov %dl, (%r8) // Write a byte diff --git a/source/tanya/memory/op.d b/source/tanya/memory/op.d index 9d2bf7b..e113ba0 100644 --- a/source/tanya/memory/op.d +++ b/source/tanya/memory/op.d @@ -32,6 +32,16 @@ else import core.stdc.string; } +version (TanyaNative) +{ + @nogc nothrow pure @system unittest + { + ubyte[2] buffer = 1; + fillMemory(buffer[1 .. $], 0); + assert(buffer[0] == 1 && buffer[1] == 0); + } +} + private enum alignMask = size_t.sizeof - 1; /** @@ -149,31 +159,6 @@ do } } -// Stress test. Checks that `fill` can handle unaligned pointers and different -// lengths. -@nogc nothrow pure @safe unittest -{ - ubyte[192] memory; - - foreach (j; 0 .. 192) - { - foreach (ubyte i, ref ubyte v; memory[j .. $]) - { - v = i; - } - fill(memory[j .. $]); - foreach (ubyte v; memory[j .. $]) - { - assert(v == 0); - } - fill!1(memory[j .. $]); - foreach (ubyte v; memory[j .. $]) - { - assert(v == 1); - } - } -} - /** * Copies starting from the end of $(D_PARAM source) into the end of * $(D_PARAM target).