diff --git a/ChangeLog b/ChangeLog
index 465b998ccc..f9f9e8c930 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2024-10-15  Sam Russell  <sam.h.russell@gmail.com>
+
+	crc: New tests for future optimised implementation.
+	* tests/test-crc.c: New test.
+
 2024-10-13  Bruno Haible  <bruno@clisp.org>
 
 	string-desc: New function string_desc_c_casecmp.
diff --git a/tests/test-crc.c b/tests/test-crc.c
index 16d2ff08eb..ccf540c804 100644
--- a/tests/test-crc.c
+++ b/tests/test-crc.c
@@ -21,11 +21,18 @@
 #include "crc.h"
 
 #include <stdio.h>
+#include <string.h>
 
 int
 main (int argc, char *argv[])
 {
   uint32_t p;
+  size_t i;
+  char plaintext[] = "This file is free software: you can redistribu"
+                     "te it and/or modify it under the terms of the "
+                     "GNU Lesser General Public License as published"
+                     " by th";
+  char data[128 + 16 + 16];
 
   p = crc32_update_no_xor (42, "foo", 3);
   if (p != 0x46e87f05)
@@ -55,5 +62,29 @@ main (int argc, char *argv[])
       return 1;
     }
 
+  /*
+   * Test for new CRC32 implementation
+   * The original implementation works on a byte-by-byte basis
+   * but the new one will work on 8 or 16 byte alignments, so
+   * these tests will confirm correct operation with non-aligned
+   * data and data that isn't even multiples of 16 in length.
+   *
+   * The PCLMUL implementation takes 128 bytes at a time on
+   * 16-byte alignment, so we will do 128 + 16 bytes of plaintext
+   * and alter the alignment up to 16 bytes
+   */
+
+  for (i = 0; i < 16; i++)
+    {
+      memcpy(data + i, plaintext, 128 + 16);
+      p = crc32_update_no_xor (0, data + i, 128 + 16);
+      if (p != 0x18c9bfb0)
+        {
+          printf ("aligned c at %lu got %lx\n", i, (unsigned long) p);
+          return 1;
+        }
+    }
+
+
   return 0;
 }
