crc32_acle.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /* crc32_acle.c -- compute the CRC-32 of a data stream
  2. * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler
  3. * Copyright (C) 2016 Yang Zhang
  4. * For conditions of distribution and use, see copyright notice in zlib.h
  5. *
  6. */
  7. #ifdef ARM_ACLE
  8. #include "acle_intrins.h"
  9. #include "zbuild.h"
  10. Z_INTERNAL Z_TARGET_CRC uint32_t crc32_acle(uint32_t crc, const uint8_t *buf, size_t len) {
  11. Z_REGISTER uint32_t c;
  12. Z_REGISTER const uint16_t *buf2;
  13. Z_REGISTER const uint32_t *buf4;
  14. Z_REGISTER const uint64_t *buf8;
  15. c = ~crc;
  16. if (UNLIKELY(len == 1)) {
  17. c = __crc32b(c, *buf);
  18. c = ~c;
  19. return c;
  20. }
  21. if ((ptrdiff_t)buf & (sizeof(uint64_t) - 1)) {
  22. if (len && ((ptrdiff_t)buf & 1)) {
  23. c = __crc32b(c, *buf++);
  24. len--;
  25. }
  26. if ((len >= sizeof(uint16_t)) && ((ptrdiff_t)buf & sizeof(uint16_t))) {
  27. buf2 = (const uint16_t *) buf;
  28. c = __crc32h(c, *buf2++);
  29. len -= sizeof(uint16_t);
  30. buf4 = (const uint32_t *) buf2;
  31. } else {
  32. buf4 = (const uint32_t *) buf;
  33. }
  34. if ((len >= sizeof(uint32_t)) && ((ptrdiff_t)buf & sizeof(uint32_t))) {
  35. c = __crc32w(c, *buf4++);
  36. len -= sizeof(uint32_t);
  37. }
  38. buf8 = (const uint64_t *) buf4;
  39. } else {
  40. buf8 = (const uint64_t *) buf;
  41. }
  42. while (len >= sizeof(uint64_t)) {
  43. c = __crc32d(c, *buf8++);
  44. len -= sizeof(uint64_t);
  45. }
  46. if (len >= sizeof(uint32_t)) {
  47. buf4 = (const uint32_t *) buf8;
  48. c = __crc32w(c, *buf4++);
  49. len -= sizeof(uint32_t);
  50. buf2 = (const uint16_t *) buf4;
  51. } else {
  52. buf2 = (const uint16_t *) buf8;
  53. }
  54. if (len >= sizeof(uint16_t)) {
  55. c = __crc32h(c, *buf2++);
  56. len -= sizeof(uint16_t);
  57. }
  58. buf = (const unsigned char *) buf2;
  59. if (len) {
  60. c = __crc32b(c, *buf);
  61. }
  62. c = ~c;
  63. return c;
  64. }
  65. #endif