Fix handling of misaligned bytes in fill
This commit is contained in:
parent
e9f70853c6
commit
2cda82eeea
@ -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
|
||||
|
||||
|
@ -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).
|
||||
|
Loading…
Reference in New Issue
Block a user