mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-04-25 15:12:12 +00:00
81 lines
1.7 KiB
TypeScript
81 lines
1.7 KiB
TypeScript
function memset(dest: usize, c: u8, n: usize): usize {
|
|
var ret = dest;
|
|
|
|
// fill head and tail wwith minimal branching
|
|
if (!n)
|
|
return ret;
|
|
store<u8>(dest, c);
|
|
store<u8>(dest + n - 1, c);
|
|
if (n <= 2)
|
|
return ret;
|
|
|
|
store<u8>(dest + 1, c);
|
|
store<u8>(dest + 2, c);
|
|
store<u8>(dest + n - 2, c);
|
|
store<u8>(dest + n - 3, c);
|
|
if (n <= 6)
|
|
return ret;
|
|
store<u8>(dest + 3, c);
|
|
store<u8>(dest + n - 4, c);
|
|
if (n <= 8)
|
|
return ret;
|
|
|
|
// advance pointer to align it at 4-byte boundary
|
|
var k: usize = -dest & 3;
|
|
dest += k;
|
|
n -= k;
|
|
n &= -4;
|
|
|
|
var c32: u32 = -1 / 255 * c;
|
|
|
|
// fill head/tail up to 28 bytes each in preparation
|
|
store<u32>(dest, c32);
|
|
store<u32>(dest + n - 4, c32);
|
|
if (n <= 8)
|
|
return ret;
|
|
store<u32>(dest + 4, c32);
|
|
store<u32>(dest + 8, c32);
|
|
store<u32>(dest + n - 12, c32);
|
|
store<u32>(dest + n - 8, c32);
|
|
if (n <= 24)
|
|
return ret;
|
|
store<u32>(dest + 12, c32);
|
|
store<u32>(dest + 16, c32);
|
|
store<u32>(dest + 20, c32);
|
|
store<u32>(dest + 24, c32);
|
|
store<u32>(dest + n - 28, c32);
|
|
store<u32>(dest + n - 24, c32);
|
|
store<u32>(dest + n - 20, c32);
|
|
store<u32>(dest + n - 16, c32);
|
|
|
|
// align to a multiple of 8
|
|
k = 24 + (dest & 4);
|
|
dest += k;
|
|
n -= k;
|
|
|
|
// copy 32 bytes each
|
|
var c64: u64 = <u64>c32 | (<u64>c32 << 32);
|
|
while (n >= 32) {
|
|
store<u64>(dest, c64);
|
|
store<u64>(dest + 8, c64);
|
|
store<u64>(dest + 16, c64);
|
|
store<u64>(dest + 24, c64);
|
|
n -= 32;
|
|
dest += 32;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
var dest = HEAP_BASE;
|
|
memset(dest, 1, 16);
|
|
|
|
assert(load<u8>(dest) == 1);
|
|
assert(load<u8>(dest + 15) == 1);
|
|
|
|
memset(dest + 1, 2, 14);
|
|
|
|
assert(load<u8>(dest) == 1);
|
|
assert(load<u8>(dest + 1) == 2);
|
|
assert(load<u8>(dest + 14) == 2);
|
|
assert(load<u8>(dest + 15) == 1);
|