github.com/mtsmfm/go/src@v0.0.0-20221020090648-44bdcb9f8fde/hash/crc32/crc32_arm64.s (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "textflag.h" 6 7 // castagnoliUpdate updates the non-inverted crc with the given data. 8 9 // func castagnoliUpdate(crc uint32, p []byte) uint32 10 TEXT ·castagnoliUpdate(SB),NOSPLIT,$0-36 11 MOVWU crc+0(FP), R9 // CRC value 12 MOVD p+8(FP), R13 // data pointer 13 MOVD p_len+16(FP), R11 // len(p) 14 15 update: 16 CMP $16, R11 17 BLT less_than_16 18 LDP.P 16(R13), (R8, R10) 19 CRC32CX R8, R9 20 CRC32CX R10, R9 21 SUB $16, R11 22 23 JMP update 24 25 less_than_16: 26 TBZ $3, R11, less_than_8 27 28 MOVD.P 8(R13), R10 29 CRC32CX R10, R9 30 31 less_than_8: 32 TBZ $2, R11, less_than_4 33 34 MOVWU.P 4(R13), R10 35 CRC32CW R10, R9 36 37 less_than_4: 38 TBZ $1, R11, less_than_2 39 40 MOVHU.P 2(R13), R10 41 CRC32CH R10, R9 42 43 less_than_2: 44 TBZ $0, R11, done 45 46 MOVBU (R13), R10 47 CRC32CB R10, R9 48 49 done: 50 MOVWU R9, ret+32(FP) 51 RET 52 53 // ieeeUpdate updates the non-inverted crc with the given data. 54 55 // func ieeeUpdate(crc uint32, p []byte) uint32 56 TEXT ·ieeeUpdate(SB),NOSPLIT,$0-36 57 MOVWU crc+0(FP), R9 // CRC value 58 MOVD p+8(FP), R13 // data pointer 59 MOVD p_len+16(FP), R11 // len(p) 60 61 update: 62 CMP $16, R11 63 BLT less_than_16 64 LDP.P 16(R13), (R8, R10) 65 CRC32X R8, R9 66 CRC32X R10, R9 67 SUB $16, R11 68 69 JMP update 70 71 less_than_16: 72 TBZ $3, R11, less_than_8 73 74 MOVD.P 8(R13), R10 75 CRC32X R10, R9 76 77 less_than_8: 78 TBZ $2, R11, less_than_4 79 80 MOVWU.P 4(R13), R10 81 CRC32W R10, R9 82 83 less_than_4: 84 TBZ $1, R11, less_than_2 85 86 MOVHU.P 2(R13), R10 87 CRC32H R10, R9 88 89 less_than_2: 90 TBZ $0, R11, done 91 92 MOVBU (R13), R10 93 CRC32B R10, R9 94 95 done: 96 MOVWU R9, ret+32(FP) 97 RET