Fix handling of misaligned bytes in fill
This commit is contained in:
parent
e9f70853c6
commit
2cda82eeea
@ -37,6 +37,11 @@ _D5tanya6memory2op10fillMemoryFNaNbNiAvmZv:
|
|||||||
|
|
||||||
mov %rsi, %r8
|
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:
|
naligned:
|
||||||
mov %dl, (%r8) // Write a byte
|
mov %dl, (%r8) // Write a byte
|
||||||
|
|
||||||
|
@ -32,6 +32,16 @@ else
|
|||||||
import core.stdc.string;
|
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;
|
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
|
* Copies starting from the end of $(D_PARAM source) into the end of
|
||||||
* $(D_PARAM target).
|
* $(D_PARAM target).
|
||||||
|
Loading…
Reference in New Issue
Block a user