summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2018-02-04 05:38:49 +0100
committerEugen Wissner <belka@caraus.de>2018-02-04 07:23:56 +0100
commit2cda82eeea484e2d46908462f755edcb4ef56cce (patch)
treea1d2aac5461c1c008b281930cddc84e301bdfedf
parente9f70853c621d58122fe005f6df40d3154a5f156 (diff)
downloadtanya-2cda82eeea484e2d46908462f755edcb4ef56cce.tar.gz
Fix handling of misaligned bytes in fill
-rw-r--r--arch/x64/linux/memory/fill.S5
-rw-r--r--source/tanya/memory/op.d35
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).