export function REVERSE(ptr: usize, len: usize): void { if (len > 1) { let i: usize = 0, tail: usize, hlen: usize = len >> 1; if (ASC_SHRINK_LEVEL < 1) { if (sizeof() == 1) { // TODO: Decide later: Does we need this fast path cases? // // if (len == 4) { // store(ptr, bswap(load(ptr))); // return; // } // if (len == 8) { // store(ptr, bswap(load(ptr))); // return; // } tail = len - 8; while (i + 7 < hlen) { let front = ptr + i; let back = ptr + tail - i; let temp = bswap(load(front)); store(front, bswap(load(back))); store(back, temp); i += 8; } } if (sizeof() == 2) { tail = len - 2; while (i + 1 < hlen) { let front = ptr + (i << 1); let back = ptr + (tail - i << 1); let temp = rotr(load(back), 16); store(back, rotr(load(front), 16)); store(front, temp); i += 2; } } } tail = len - 1; while (i < hlen) { let front = ptr + (i << alignof()); let back = ptr + (tail - i << alignof()); let temp = load(front); store(front, load(back)); store(back, temp); i++; } } } export function FILL( ptr: usize, len: usize, value: T, start: isize, end: isize ): void { start = start < 0 ? max(len + start, 0) : min(start, len); end = end < 0 ? max(len + end, 0) : min(end, len); if (sizeof() == 1) { if (start < end) { memory.fill( ptr + start, u8(value), (end - start) ); } } else { if (ASC_SHRINK_LEVEL <= 1) { if (isInteger()) { // @ts-ignore if (value == 0 | value == -1) { if (start < end) { memory.fill( ptr + (start << alignof()), u8(value), (end - start) << alignof() ); } return; } } else if (isFloat()) { // for floating non-negative zeros we can use fast memory.fill if ((sizeof() == 4 && reinterpret(f32(value)) == 0) || (sizeof() == 8 && reinterpret(f64(value)) == 0)) { if (start < end) { memory.fill( ptr + (start << alignof()), 0, (end - start) << alignof() ); } return; } } } for (; start < end; ++start) { store(ptr + (start << alignof()), value); } } }