summaryrefslogtreecommitdiff
path: root/TestPrograms
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2021-05-25 20:24:58 -0400
committerJeffrey Walton <noloader@gmail.com>2021-05-25 20:24:58 -0400
commit1221e0dc9eaaa1bf65c739ac12e52527bd356986 (patch)
tree9c6ae20d194d029713aaa86cd6f03666813a846e /TestPrograms
parentc3d1eedff06ac236331cf1af0d06731c0b050381 (diff)
downloadcryptopp-git-1221e0dc9eaaa1bf65c739ac12e52527bd356986.tar.gz
Use inline ASM for CRC on Apple ARMv8
Diffstat (limited to 'TestPrograms')
-rw-r--r--TestPrograms/test_arm_crc.cpp62
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;
}