|
34 | 34 | #include <cpuid.h>
|
35 | 35 | #endif
|
36 | 36 |
|
37 |
| -#if ((defined(__X86__) || defined(__i386__) || defined(i386) || defined(_M_IX86) || defined(__386__) || defined(__x86_64__) || defined(_M_X64))) |
| 37 | +#if defined(__loongarch64) |
| 38 | +#include <larchintrin.h> |
| 39 | +#endif |
| 40 | + |
| 41 | +#if ((defined(__X86__) || defined(__i386__) || defined(i386) || defined(_M_IX86) || defined(__386__) || defined(__x86_64__) || defined(_M_X64) || defined(__loongarch64))) |
38 | 42 | #if !defined(__SSE4_2__)
|
39 | 43 |
|
40 | 44 | namespace Hdfs {
|
41 | 45 | namespace Internal {
|
42 | 46 |
|
43 | 47 | #if defined(__LP64__)
|
44 | 48 | static inline uint64_t _mm_crc32_u64(uint64_t crc, uint64_t value) {
|
| 49 | +#if defined(__loongarch64) |
| 50 | + crc = __crcc_w_d_w(value,crc); |
| 51 | +#else |
45 | 52 | asm("crc32q %[value], %[crc]\n" : [crc] "+r"(crc) : [value] "rm"(value));
|
| 53 | +#endif |
46 | 54 | return crc;
|
47 | 55 | }
|
48 | 56 | #endif
|
49 | 57 |
|
50 | 58 | static inline uint32_t _mm_crc32_u16(uint32_t crc, uint16_t value) {
|
| 59 | +#if defined(__loongarch64) |
| 60 | + crc = __crcc_w_h_w(value,crc); |
| 61 | +#else |
51 | 62 | asm("crc32w %[value], %[crc]\n" : [crc] "+r"(crc) : [value] "rm"(value));
|
| 63 | +#endif |
52 | 64 | return crc;
|
53 | 65 | }
|
54 | 66 |
|
55 | 67 | static inline uint32_t _mm_crc32_u32(uint32_t crc, uint64_t value) {
|
| 68 | +#if defined(__loongarch64) |
| 69 | + crc = __crcc_w_w_w(value,crc); |
| 70 | +#else |
56 | 71 | asm("crc32l %[value], %[crc]\n" : [crc] "+r"(crc) : [value] "rm"(value));
|
| 72 | +#endif |
57 | 73 | return crc;
|
58 | 74 | }
|
59 | 75 |
|
60 | 76 | static inline uint32_t _mm_crc32_u8(uint32_t crc, uint8_t value) {
|
| 77 | +#if defined(__loongarch64) |
| 78 | + crc = __crcc_w_b_w(value,crc); |
| 79 | +#else |
61 | 80 | asm("crc32b %[value], %[crc]\n" : [crc] "+r"(crc) : [value] "rm"(value));
|
| 81 | +#endif |
62 | 82 | return crc;
|
63 | 83 | }
|
64 | 84 |
|
@@ -86,7 +106,7 @@ bool HWCrc32c::available() {
|
86 | 106 | */
|
87 | 107 | __get_cpuid(1, &eax, &ebx, &ecx, &edx);
|
88 | 108 | return (ecx & (1 << 20)) != 0;
|
89 |
| -#elif ((defined(__arm__) || defined(__aarch64__))) |
| 109 | +#elif ((defined(__arm__) || defined(__aarch64__) || defined(__loongarch64))) |
90 | 110 | return true;
|
91 | 111 | #else
|
92 | 112 | return false;
|
|
0 commit comments