blob: 9d72ae5c037b2ff479c86e6a5154834370344192 [file] [log] [blame]
// Copyright 2021 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
pri func ieee_hasher.up_arm_crc32!(x: roslice base.u8),
choose cpu_arch >= arm_crc32,
{
var p : roslice base.u8
var util : base.arm_crc32_utility
var s : base.arm_crc32_u32
s = util.make_u32(a: 0xFFFF_FFFF ^ this.state)
// Align to a 16-byte boundary.
while (args.x.length() > 0) and ((15 & args.x.uintptr_low_12_bits()) <> 0) {
s = s.crc32b(b: args.x[0])
args.x = args.x[1 ..]
} endwhile
iterate (p = args.x)(length: 8, advance: 8, unroll: 16) {
s = s.crc32d(b: p.peek_u64le())
} else (length: 1, advance: 1, unroll: 1) {
s = s.crc32b(b: p[0])
}
this.state = 0xFFFF_FFFF ^ s.value()
}