Skip to content

Commit 8a2a9e0

Browse files
committed
Merge branch 'PHP-7.4'
2 parents d5e9ef8 + d81eb77 commit 8a2a9e0

File tree

1 file changed

+28
-21
lines changed

1 file changed

+28
-21
lines changed

ext/standard/crc32.c

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include "crc32.h"
2020

2121
#if defined(__aarch64__)
22-
# pragma GCC target ("+nothing+crc")
2322
# include <arm_acle.h>
2423
# if defined(__linux__)
2524
# include <sys/auxv.h>
@@ -42,6 +41,31 @@ static inline int has_crc32_insn() {
4241
return res;
4342
# endif
4443
}
44+
45+
# pragma GCC push_options
46+
# pragma GCC target ("+nothing+crc")
47+
static uint32_t crc32_aarch64(uint32_t crc, char *p, size_t nr) {
48+
while (nr >= sizeof(uint64_t)) {
49+
crc = __crc32d(crc, *(uint64_t *)p);
50+
p += sizeof(uint64_t);
51+
nr -= sizeof(uint64_t);
52+
}
53+
if (nr >= sizeof(int32_t)) {
54+
crc = __crc32w(crc, *(uint32_t *)p);
55+
p += sizeof(uint32_t);
56+
nr -= sizeof(uint32_t);
57+
}
58+
if (nr >= sizeof(int16_t)) {
59+
crc = __crc32h(crc, *(uint16_t *)p);
60+
p += sizeof(uint16_t);
61+
nr -= sizeof(uint16_t);
62+
}
63+
if (nr) {
64+
crc = __crc32b(crc, *p);
65+
}
66+
return crc;
67+
}
68+
# pragma GCC pop_options
4569
#endif
4670

4771
/* {{{ proto string crc32(string str)
@@ -61,28 +85,11 @@ PHP_NAMED_FUNCTION(php_if_crc32)
6185

6286
#if defined(__aarch64__)
6387
if (has_crc32_insn()) {
64-
while(nr >= sizeof(uint64_t)) {
65-
crc = __crc32d(crc, *(uint64_t *)p);
66-
p += sizeof(uint64_t);
67-
nr -= sizeof(uint64_t);
68-
}
69-
if (nr >= sizeof(int32_t)) {
70-
crc = __crc32w(crc, *(uint32_t *)p);
71-
p += sizeof(uint32_t);
72-
nr -= sizeof(uint32_t);
73-
}
74-
if (nr >= sizeof(int16_t)) {
75-
crc = __crc32h(crc, *(uint16_t *)p);
76-
p += sizeof(uint16_t);
77-
nr -= sizeof(uint16_t);
78-
}
79-
if (nr) {
80-
crc = __crc32b(crc, *p);
81-
p += sizeof(uint8_t);
82-
nr -= sizeof(uint8_t);
83-
}
88+
crc = crc32_aarch64(crc, p, nr);
89+
RETVAL_LONG(crc^0xFFFFFFFF);
8490
}
8591
#endif
92+
8693
for (; nr--; ++p) {
8794
crc = ((crc >> 8) & 0x00FFFFFF) ^ crc32tab[(crc ^ (*p)) & 0xFF ];
8895
}

0 commit comments

Comments
 (0)