123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /*
- * Accelerated CRC32(C) using AArch64 CRC instructions
- *
- * Copyright (C) 2016 - 2018 Linaro Ltd <ard.biesheuvel@linaro.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
- #include <linux/linkage.h>
- #include <asm/alternative.h>
- #include <asm/assembler.h>
- .cpu generic+crc
- .macro __crc32, c
- 0: subs x2, x2, #16
- b.mi 8f
- ldp x3, x4, [x1], #16
- CPU_BE( rev x3, x3 )
- CPU_BE( rev x4, x4 )
- crc32\c\()x w0, w0, x3
- crc32\c\()x w0, w0, x4
- b.ne 0b
- ret
- 8: tbz x2, #3, 4f
- ldr x3, [x1], #8
- CPU_BE( rev x3, x3 )
- crc32\c\()x w0, w0, x3
- 4: tbz x2, #2, 2f
- ldr w3, [x1], #4
- CPU_BE( rev w3, w3 )
- crc32\c\()w w0, w0, w3
- 2: tbz x2, #1, 1f
- ldrh w3, [x1], #2
- CPU_BE( rev16 w3, w3 )
- crc32\c\()h w0, w0, w3
- 1: tbz x2, #0, 0f
- ldrb w3, [x1]
- crc32\c\()b w0, w0, w3
- 0: ret
- .endm
- .align 5
- ENTRY(crc32_le)
- alternative_if_not ARM64_HAS_CRC32
- b crc32_le_base
- alternative_else_nop_endif
- __crc32
- ENDPROC(crc32_le)
- .align 5
- ENTRY(__crc32c_le)
- alternative_if_not ARM64_HAS_CRC32
- b __crc32c_le_base
- alternative_else_nop_endif
- __crc32 c
- ENDPROC(__crc32c_le)
|