function memset(dest: usize, c: u8, n: usize): usize { var ret = dest; // fill head and tail wwith minimal branching if (!n) return ret; store(dest, c); store(dest + n - 1, c); if (n <= 2) return ret; store(dest + 1, c); store(dest + 2, c); store(dest + n - 2, c); store(dest + n - 3, c); if (n <= 6) return ret; store(dest + 3, c); store(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(dest, c32); store(dest + n - 4, c32); if (n <= 8) return ret; store(dest + 4, c32); store(dest + 8, c32); store(dest + n - 12, c32); store(dest + n - 8, c32); if (n <= 24) return ret; store(dest + 12, c32); store(dest + 16, c32); store(dest + 20, c32); store(dest + 24, c32); store(dest + n - 28, c32); store(dest + n - 24, c32); store(dest + n - 20, c32); store(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 = c32 | (c32 << 32); while (n >= 32) { store(dest, c64); store(dest + 8, c64); store(dest + 16, c64); store(dest + 24, c64); n -= 32; dest += 32; } return ret; } var dest = HEAP_BASE; memset(dest, 1, 16); assert(load(dest) == 1); assert(load(dest + 15) == 1); memset(dest + 1, 2, 14); assert(load(dest) == 1); assert(load(dest + 1) == 2); assert(load(dest + 14) == 2); assert(load(dest + 15) == 1);