diff options
author | Jeffrey Walton <noloader@gmail.com> | 2021-05-25 20:24:58 -0400 |
---|---|---|
committer | Jeffrey Walton <noloader@gmail.com> | 2021-05-25 20:24:58 -0400 |
commit | 1221e0dc9eaaa1bf65c739ac12e52527bd356986 (patch) | |
tree | 9c6ae20d194d029713aaa86cd6f03666813a846e /TestPrograms | |
parent | c3d1eedff06ac236331cf1af0d06731c0b050381 (diff) | |
download | cryptopp-git-1221e0dc9eaaa1bf65c739ac12e52527bd356986.tar.gz |
Use inline ASM for CRC on Apple ARMv8
Diffstat (limited to 'TestPrograms')
-rw-r--r-- | TestPrograms/test_arm_crc.cpp | 62 |
1 files changed, 55 insertions, 7 deletions
diff --git a/TestPrograms/test_arm_crc.cpp b/TestPrograms/test_arm_crc.cpp index aecd50a7..2fae855b 100644 --- a/TestPrograms/test_arm_crc.cpp +++ b/TestPrograms/test_arm_crc.cpp @@ -2,20 +2,68 @@ #ifdef CRYPTOPP_ARM_NEON_HEADER
# include <arm_neon.h>
#endif
-#ifdef CRYPTOPP_ARM_ACLE_HEADER
+#if (CRYPTOPP_ARM_ACLE_HEADER)
+# include <stdint.h>
# include <arm_acle.h>
#endif
+// Keep sync'd with arm_simd.h
+inline uint32_t CRC32B (uint32_t crc, uint8_t val)
+{
+#if defined(_MSC_VER)
+ return __crc32b(crc, val);
+#else
+ uint32_t r;
+ __asm__ ("crc32b %w0, %w1, %w2 \n\t"
+ :"=r" (r) : "r" (crc), "r" (val) );
+ return r;
+#endif
+}
+
+inline uint32_t CRC32W (uint32_t crc, uint32_t val)
+{
+#if defined(_MSC_VER)
+ return __crc32w(crc, val);
+#else
+ uint32_t r;
+ __asm__ ("crc32w %w0, %w1, %w2 \n\t"
+ :"=r" (r) : "r" (crc), "r" (val) );
+ return r;
+#endif
+}
+
+inline uint32_t CRC32CB (uint32_t crc, uint8_t val)
+{
+#if defined(_MSC_VER)
+ return __crc32cb(crc, val);
+#else
+ uint32_t r;
+ __asm__ ("crc32cb %w0, %w1, %w2 \n\t"
+ :"=r" (r) : "r" (crc), "r" (val) );
+ return r;
+#endif
+}
+
+inline uint32_t CRC32CW (uint32_t crc, uint32_t val)
+{
+#if defined(_MSC_VER)
+ return __crc32cw(crc, val);
+#else
+ uint32_t r;
+ __asm__ ("crc32cw %w0, %w1, %w2 \n\t"
+ :"=r" (r) : "r" (crc), "r" (val) );
+ return r;
+#endif
+}
+
int main(int argc, char* argv[])
{
uint32_t w=0xffffffff;
- w = __crc32w(w,w);
- w = __crc32h(w,w);
- w = __crc32b(w,w);
- w = __crc32cw(w,w);
- w = __crc32ch(w,w);
- w = __crc32cb(w,w);
+ w = CRC32B(w,w);
+ w = CRC32W(w,w);
+ w = CRC32CB(w,w);
+ w = CRC32CW(w,w);
return 0;
}
|