crc.c 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. /**
  2. * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. * SPDX-License-Identifier: Apache-2.0.
  4. */
  5. #include <aws/checksums/crc.h>
  6. #include <aws/checksums/private/crc_priv.h>
  7. #include <aws/common/cpuid.h>
  8. static uint32_t (*s_crc32c_fn_ptr)(const uint8_t *input, int length, uint32_t previousCrc32) = 0;
  9. static uint32_t (*s_crc32_fn_ptr)(const uint8_t *input, int length, uint32_t previousCrc32) = 0;
  10. uint32_t aws_checksums_crc32(const uint8_t *input, int length, uint32_t previousCrc32) {
  11. if (AWS_UNLIKELY(!s_crc32_fn_ptr)) {
  12. if (aws_cpu_has_feature(AWS_CPU_FEATURE_ARM_CRC)) {
  13. s_crc32_fn_ptr = aws_checksums_crc32_hw;
  14. } else {
  15. s_crc32_fn_ptr = aws_checksums_crc32_sw;
  16. }
  17. }
  18. return s_crc32_fn_ptr(input, length, previousCrc32);
  19. }
  20. uint32_t aws_checksums_crc32c(const uint8_t *input, int length, uint32_t previousCrc32) {
  21. if (AWS_UNLIKELY(!s_crc32c_fn_ptr)) {
  22. if (aws_cpu_has_feature(AWS_CPU_FEATURE_SSE_4_2) || aws_cpu_has_feature(AWS_CPU_FEATURE_ARM_CRC)) {
  23. s_crc32c_fn_ptr = aws_checksums_crc32c_hw;
  24. } else {
  25. s_crc32c_fn_ptr = aws_checksums_crc32c_sw;
  26. }
  27. }
  28. return s_crc32c_fn_ptr(input, length, previousCrc32);
  29. }