| ... | ... | @@ -967,14 +967,15 @@ pub fn indexOfSentinel(comptime T: type, comptime sentinel: T, p: [*:sentinel]co |
| 967 | 967 | // as we don't read into a new page. This should be the case for most architectures |
| 968 | 968 | // which use paged memory, however should be confirmed before adding a new arch below. |
| 969 | 969 | .aarch64, .x86, .x86_64 => if (std.simd.suggestVectorSize(T)) |block_len| { |
| 970 | | comptime std.debug.assert(std.mem.page_size % block_len == 0); |
| 971 | 970 | const Block = @Vector(block_len, T); |
| 972 | 971 | const mask: Block = @splat(sentinel); |
| 973 | 972 | |
| 973 | comptime std.debug.assert(std.mem.page_size % @sizeOf(Block) == 0); |
| 974 | |
| 974 | 975 | // First block may be unaligned |
| 975 | 976 | const start_addr = @intFromPtr(&p[i]); |
| 976 | 977 | const offset_in_page = start_addr & (std.mem.page_size - 1); |
| 977 | | if (offset_in_page < std.mem.page_size - block_len) { |
| 978 | if (offset_in_page < std.mem.page_size - @sizeOf(Block)) { |
| 978 | 979 | // Will not read past the end of a page, full block. |
| 979 | 980 | const block: Block = p[i..][0..block_len].*; |
| 980 | 981 | const matches = block == mask; |