diff crc32i.h @ 0:422835bc1aca

*: checkin
author Paper <paper@tflc.us>
date Mon, 09 Feb 2026 01:15:00 -0500
parents
children 90cb48b87dcc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crc32i.h	Mon Feb 09 01:15:00 2026 -0500
@@ -0,0 +1,45 @@
+/* internal crc32 definitions */
+
+#include "crc32.h"
+
+#define CRC32_API __attribute__((__visibility__("default")))
+
+/* all LUTs etc. are generated at compile time.
+ * eventually, I'd like to have all internal info
+ * stored in one opaque pointer. this pointer will
+ * contain the LUTs (or maybe a pointer to one).
+ * We could also create these structures at compile
+ * time and have a flag that says whether it needs
+ * to be destroyed or if it can be cached. */
+#define CRC32_POLYNOMIAL 0xedb88320
+
+/* crc32b.c */
+#ifdef __GNUC__
+# define CRC32_PURE __attribute__((__pure__))
+#else
+# define CRC32_PURE
+#endif
+
+#define ALIGNOF(type) offsetof(struct { type a; char b; }, b)
+#define ALIGNED(ptr, alignment) (((uintptr_t)(ptr) % (alignment)) == 0)
+#define ALIGNED_TYPE(ptr, type) ALIGNED(ptr, ALIGNOF(type))
+
+typedef uint32_t (*crc32_r_spec)(uint32_t, const unsigned char *, size_t);
+
+/* shared by crc32c and crc32qw */
+extern const uint32_t crc32_tab[256];
+
+/* Calculates crc32 by bytes. Has no alignment requirement */
+uint32_t crc32c_r(uint32_t crc, const unsigned char *message, size_t sz);
+/* Calculates crc32 in dwords. Requires 4-byte alignment */
+uint32_t crc32qw_r(uint32_t crc, const unsigned char *message, size_t sz);
+/* Calculates crc32 using intel SIMD. Requires 16-byte alignment */
+uint32_t crc32x86_vpclmulqdq_r(uint32_t crc, const unsigned char *msg, size_t sz);
+
+/* Maximum alignment value for each impl to work */
+#define MAX(x, y) ((x)>(y)?(x):(y))
+#define MIN(x, y) ((x)<(y)?(x):(y))
+#define CRC32_MAX_ALIGNMENT MAX(16, ALIGNOF(uint32_t))
+
+#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
+