| // 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() |
| } |