blob: 20b1ef4fc5d0a15317c58bb723e1f86dbdcdd696 [file] [log] [blame]
// Copyright 2021 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
pri func ieee_hasher.up_arm_crc32!(x: slice base.u8),
choose cpu_arch >= arm_crc32,
{
var p : slice 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()
}