Run script/sync.sh: 0.4.0-alpha.4+3742.20240406
diff --git a/release/c/wuffs-v0.4.c b/release/c/wuffs-v0.4.c
index cb70fba..54408ab 100644
--- a/release/c/wuffs-v0.4.c
+++ b/release/c/wuffs-v0.4.c
@@ -81,15 +81,15 @@
 // each major.minor branch, the commit count should increase monotonically.
 //
 // WUFFS_VERSION was overridden by "wuffs gen -version" based on revision
-// 159634388902b8e4948b5c513072264acb70d42c committed on 2024-03-31.
+// a27a7598f09f289e5cf3c9f7d8c0bd8134c6a39d committed on 2024-04-06.
 #define WUFFS_VERSION 0x000040000
 #define WUFFS_VERSION_MAJOR 0
 #define WUFFS_VERSION_MINOR 4
 #define WUFFS_VERSION_PATCH 0
-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.3"
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3731
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240331
-#define WUFFS_VERSION_STRING "0.4.0-alpha.3+3731.20240331"
+#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.4"
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3742
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240406
+#define WUFFS_VERSION_STRING "0.4.0-alpha.4+3742.20240406"
 
 // ---------------- Configuration
 
@@ -271,7 +271,7 @@
 #if defined(__BMI2__)
   return true;
 #else
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
   // GCC defines these macros but MSVC does not.
   //  - bit_BMI2 = (1 <<  8)
   const unsigned int bmi2_ebx7 = 0x00000100;
@@ -295,7 +295,7 @@
 #else
 #error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler"
 #endif  // defined(__GNUC__); defined(_MSC_VER)
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
   return false;
 #endif  // defined(__BMI2__)
 }
@@ -305,7 +305,7 @@
 #if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
   return true;
 #else
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
   // GCC defines these macros but MSVC does not.
   //  - bit_PCLMUL = (1 <<  1)
   //  - bit_POPCNT = (1 << 23)
@@ -331,7 +331,7 @@
 #else
 #error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler"
 #endif  // defined(__GNUC__); defined(_MSC_VER)
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
   return false;
 #endif  // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
 }
@@ -452,28 +452,6 @@
 
 // --------
 
-// wuffs_private_impl__placeholder_etc_with_non_null_address provides non-NULL
-// pointers to various integer types. These values aren't intended to ever be
-// modified and their addresses aren't intended to ever be dereferenced.
-//
-// It's just that adding 0 to a NULL pointer can be undefined behavior (and
-// UBSAN will complain), so functions like wuffs_base__empty_slice_u8 need some
-// arbitrary non-NULL placeholder pointer, even though the slice has 0 length.
-
-extern const uint8_t  //
-    wuffs_private_impl__placeholder_u8_with_non_null_address;
-
-extern const uint16_t  //
-    wuffs_private_impl__placeholder_u16_with_non_null_address;
-
-extern const uint32_t  //
-    wuffs_private_impl__placeholder_u32_with_non_null_address;
-
-extern const uint64_t  //
-    wuffs_private_impl__placeholder_u64_with_non_null_address;
-
-// --------
-
 // wuffs_base__empty_struct is used when a Wuffs function returns an empty
 // struct. In C, if a function f returns void, you can't say "x = f()", but in
 // Wuffs, if a function g returns empty, you can say "y = g()".
@@ -1684,7 +1662,7 @@
 static inline wuffs_base__slice_u8  //
 wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) {
   wuffs_base__slice_u8 ret;
-  ret.ptr = ptr + i;
+  ret.ptr = ptr ? (ptr + i) : NULL;
   ret.len = (j >= i) ? (j - i) : 0;
   return ret;
 }
@@ -1692,7 +1670,7 @@
 static inline wuffs_base__slice_u16  //
 wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) {
   wuffs_base__slice_u16 ret;
-  ret.ptr = ptr + i;
+  ret.ptr = ptr ? (ptr + i) : NULL;
   ret.len = (j >= i) ? (j - i) : 0;
   return ret;
 }
@@ -1700,7 +1678,7 @@
 static inline wuffs_base__slice_u32  //
 wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) {
   wuffs_base__slice_u32 ret;
-  ret.ptr = ptr + i;
+  ret.ptr = ptr ? (ptr + i) : NULL;
   ret.len = (j >= i) ? (j - i) : 0;
   return ret;
 }
@@ -1708,7 +1686,7 @@
 static inline wuffs_base__slice_u64  //
 wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) {
   wuffs_base__slice_u64 ret;
-  ret.ptr = ptr + i;
+  ret.ptr = ptr ? (ptr + i) : NULL;
   ret.len = (j >= i) ? (j - i) : 0;
   return ret;
 }
@@ -1716,8 +1694,7 @@
 static inline wuffs_base__slice_u8  //
 wuffs_base__empty_slice_u8(void) {
   wuffs_base__slice_u8 ret;
-  ret.ptr = wuffs_base__strip_const_from_u8_ptr(
-      &wuffs_private_impl__placeholder_u8_with_non_null_address);
+  ret.ptr = NULL;
   ret.len = 0;
   return ret;
 }
@@ -1725,8 +1702,7 @@
 static inline wuffs_base__slice_u16  //
 wuffs_base__empty_slice_u16(void) {
   wuffs_base__slice_u16 ret;
-  ret.ptr = wuffs_base__strip_const_from_u16_ptr(
-      &wuffs_private_impl__placeholder_u16_with_non_null_address);
+  ret.ptr = NULL;
   ret.len = 0;
   return ret;
 }
@@ -1734,8 +1710,7 @@
 static inline wuffs_base__slice_u32  //
 wuffs_base__empty_slice_u32(void) {
   wuffs_base__slice_u32 ret;
-  ret.ptr = wuffs_base__strip_const_from_u32_ptr(
-      &wuffs_private_impl__placeholder_u32_with_non_null_address);
+  ret.ptr = NULL;
   ret.len = 0;
   return ret;
 }
@@ -1743,8 +1718,7 @@
 static inline wuffs_base__slice_u64  //
 wuffs_base__empty_slice_u64(void) {
   wuffs_base__slice_u64 ret;
-  ret.ptr = wuffs_base__strip_const_from_u64_ptr(
-      &wuffs_private_impl__placeholder_u64_with_non_null_address);
+  ret.ptr = NULL;
   ret.len = 0;
   return ret;
 }
@@ -1804,8 +1778,7 @@
 static inline wuffs_base__table_u8  //
 wuffs_base__empty_table_u8(void) {
   wuffs_base__table_u8 ret;
-  ret.ptr = wuffs_base__strip_const_from_u8_ptr(
-      &wuffs_private_impl__placeholder_u8_with_non_null_address);
+  ret.ptr = NULL;
   ret.width = 0;
   ret.height = 0;
   ret.stride = 0;
@@ -1815,8 +1788,7 @@
 static inline wuffs_base__table_u16  //
 wuffs_base__empty_table_u16(void) {
   wuffs_base__table_u16 ret;
-  ret.ptr = wuffs_base__strip_const_from_u16_ptr(
-      &wuffs_private_impl__placeholder_u16_with_non_null_address);
+  ret.ptr = NULL;
   ret.width = 0;
   ret.height = 0;
   ret.stride = 0;
@@ -1826,8 +1798,7 @@
 static inline wuffs_base__table_u32  //
 wuffs_base__empty_table_u32(void) {
   wuffs_base__table_u32 ret;
-  ret.ptr = wuffs_base__strip_const_from_u32_ptr(
-      &wuffs_private_impl__placeholder_u32_with_non_null_address);
+  ret.ptr = NULL;
   ret.width = 0;
   ret.height = 0;
   ret.stride = 0;
@@ -1837,8 +1808,7 @@
 static inline wuffs_base__table_u64  //
 wuffs_base__empty_table_u64(void) {
   wuffs_base__table_u64 ret;
-  ret.ptr = wuffs_base__strip_const_from_u64_ptr(
-      &wuffs_private_impl__placeholder_u64_with_non_null_address);
+  ret.ptr = NULL;
   ret.width = 0;
   ret.height = 0;
   ret.stride = 0;
@@ -3124,8 +3094,7 @@
 static inline wuffs_base__io_buffer  //
 wuffs_base__empty_io_buffer(void) {
   wuffs_base__io_buffer ret;
-  ret.data.ptr = wuffs_base__strip_const_from_u8_ptr(
-      &wuffs_private_impl__placeholder_u8_with_non_null_address);
+  ret.data.ptr = NULL;
   ret.data.len = 0;
   ret.meta.wi = 0;
   ret.meta.ri = 0;
@@ -3221,7 +3190,7 @@
 
 static inline uint8_t*  //
 wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) {
-  return buf ? (buf->data.ptr + buf->meta.ri) : NULL;
+  return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.ri) : NULL;
 }
 
 static inline uint64_t  //
@@ -3231,7 +3200,8 @@
 
 static inline wuffs_base__slice_u8  //
 wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) {
-  return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri,
+  return (buf && buf->data.ptr)
+             ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri,
                                          buf->meta.wi - buf->meta.ri)
              : wuffs_base__empty_slice_u8();
 }
@@ -3243,7 +3213,7 @@
 
 static inline uint8_t*  //
 wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) {
-  return buf ? (buf->data.ptr + buf->meta.wi) : NULL;
+  return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.wi) : NULL;
 }
 
 static inline uint64_t  //
@@ -3253,7 +3223,8 @@
 
 static inline wuffs_base__slice_u8  //
 wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) {
-  return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi,
+  return (buf && buf->data.ptr)
+             ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi,
                                          buf->data.len - buf->meta.wi)
              : wuffs_base__empty_slice_u8();
 }
@@ -3586,9 +3557,6 @@
 
 // --------
 
-extern const wuffs_base__token  //
-    wuffs_private_impl__placeholder_token_with_non_null_address;
-
 #if defined(__GNUC__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wcast-qual"
@@ -3618,8 +3586,7 @@
 static inline wuffs_base__slice_token  //
 wuffs_base__empty_slice_token(void) {
   wuffs_base__slice_token ret;
-  ret.ptr = wuffs_base__strip_const_from_token_ptr(
-      &wuffs_private_impl__placeholder_token_with_non_null_address);
+  ret.ptr = NULL;
   ret.len = 0;
   return ret;
 }
@@ -3708,8 +3675,7 @@
 static inline wuffs_base__token_buffer  //
 wuffs_base__empty_token_buffer(void) {
   wuffs_base__token_buffer ret;
-  ret.data.ptr = wuffs_base__strip_const_from_token_ptr(
-      &wuffs_private_impl__placeholder_token_with_non_null_address);
+  ret.data.ptr = NULL;
   ret.data.len = 0;
   ret.meta.wi = 0;
   ret.meta.ri = 0;
@@ -3917,12 +3883,12 @@
 //
 // You can pass the C stdlib's malloc as the malloc_func.
 //
-// It returns an empty slice (containing a NULL ptr field) if (num_uxx *
-// sizeof(uintxx_t)) would overflow SIZE_MAX.
+// It returns an empty slice (containing a NULL ptr field) if num_uxx is zero
+// or if (num_uxx * sizeof(uintxx_t)) would overflow SIZE_MAX.
 
 static inline wuffs_base__slice_u8  //
 wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) {
-  if (malloc_func && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) {
+  if (malloc_func && num_u8 && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) {
     void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t)));
     if (p) {
       return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8);
@@ -3933,7 +3899,7 @@
 
 static inline wuffs_base__slice_u16  //
 wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) {
-  if (malloc_func && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) {
+  if (malloc_func && num_u16 && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) {
     void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t)));
     if (p) {
       return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16);
@@ -3944,7 +3910,7 @@
 
 static inline wuffs_base__slice_u32  //
 wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) {
-  if (malloc_func && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) {
+  if (malloc_func && num_u32 && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) {
     void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t)));
     if (p) {
       return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32);
@@ -3955,7 +3921,7 @@
 
 static inline wuffs_base__slice_u64  //
 wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) {
-  if (malloc_func && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) {
+  if (malloc_func && num_u64 && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) {
     void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t)));
     if (p) {
       return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64);
@@ -8469,6 +8435,10 @@
     wuffs_base__vtable null_vtable;
 
     uint64_t f_state;
+
+    wuffs_base__empty_struct (*choosy_up)(
+        wuffs_crc64__ecma_hasher* self,
+        wuffs_base__slice_u8 a_x);
   } private_impl;
 
 #ifdef __cplusplus
@@ -14471,8 +14441,6 @@
   DynIOBuffer(const DynIOBuffer&) = delete;
   DynIOBuffer& operator=(const DynIOBuffer&) = delete;
 
-  bool allocated();
-
   static uint64_t round_up(uint64_t min_incl, uint64_t max_incl);
 };
 
@@ -15263,6 +15231,17 @@
 
 // ---------------- Slices and Tables
 
+// This function basically returns (ptr + len), except that that expression is
+// Undefined Behavior in C (but not C++) when ptr is NULL, even if len is zero.
+//
+// Precondition: (ptr != NULL) || (len == 0).
+static inline const uint8_t*  //
+wuffs_private_impl__ptr_u8_plus_len(const uint8_t* ptr, size_t len) {
+  return ptr ? (ptr + len) : NULL;
+}
+
+// --------
+
 // wuffs_private_impl__slice_u8__prefix returns up to the first up_to bytes of
 // s.
 static inline wuffs_base__slice_u8  //
@@ -15331,7 +15310,7 @@
 
 static inline wuffs_base__slice_u8  //
 wuffs_private_impl__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) {
-  if (y < t.height) {
+  if (t.ptr && (y < t.height)) {
     return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width);
   }
   return wuffs_base__empty_slice_u8();
@@ -16035,21 +16014,6 @@
     0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40,
 };
 
-const uint8_t  //
-    wuffs_private_impl__placeholder_u8_with_non_null_address = 0;
-
-const uint16_t  //
-    wuffs_private_impl__placeholder_u16_with_non_null_address = 0;
-
-const uint32_t  //
-    wuffs_private_impl__placeholder_u32_with_non_null_address = 0;
-
-const uint64_t  //
-    wuffs_private_impl__placeholder_u64_with_non_null_address = 0;
-
-const wuffs_base__token  //
-    wuffs_private_impl__placeholder_token_with_non_null_address = {0};
-
 const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect";
 const char wuffs_base__note__end_of_data[] = "@base: end of data";
 const char wuffs_base__note__metadata_reported[] = "@base: metadata reported";
@@ -21079,7 +21043,7 @@
 
 // ---------------- Pixel Swizzler
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 static uint64_t  //
 wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
@@ -21114,7 +21078,7 @@
                                                size_t dst_palette_len,
                                                const uint8_t* src_ptr,
                                                size_t src_len);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
 // --------
 
@@ -21950,7 +21914,7 @@
 }
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 static uint64_t  //
 wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr,
@@ -21994,7 +21958,7 @@
   }
   return len;
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 static uint64_t  //
@@ -24662,7 +24626,7 @@
 }
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 static uint64_t  //
 wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
@@ -24768,7 +24732,7 @@
 
   return len;
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 static uint64_t  //
@@ -25526,7 +25490,7 @@
 }
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 static uint64_t  //
 wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr,
@@ -25573,7 +25537,7 @@
 
   return len;
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 static uint64_t  //
@@ -25894,7 +25858,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__RGBX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_xxxx__y__x86_sse42;
       }
@@ -26365,7 +26329,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__BGRX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
       }
@@ -26383,7 +26347,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__RGBX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
       }
@@ -26463,7 +26427,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
           if (wuffs_base__cpu_arch__have_x86_sse42()) {
             return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
           }
@@ -26658,7 +26622,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
           if (wuffs_base__cpu_arch__have_x86_sse42()) {
             return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
           }
@@ -26727,7 +26691,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__BGRX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
       }
@@ -26744,7 +26708,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__RGBX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
       }
@@ -26783,7 +26747,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
           if (wuffs_base__cpu_arch__have_x86_sse42()) {
             return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
           }
@@ -26899,7 +26863,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
           if (wuffs_base__cpu_arch__have_x86_sse42()) {
             return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
           }
@@ -29454,13 +29418,13 @@
     wuffs_base__slice_u8 a_x);
 #endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_adler32__hasher__up_x86_sse42(
     wuffs_adler32__hasher* self,
     wuffs_base__slice_u8 a_x);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
 // ---------------- VTables
 
@@ -29611,7 +29575,7 @@
 #if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 :
 #endif
         self->private_impl.choosy_up);
@@ -29670,7 +29634,7 @@
       wuffs_base__slice_u8 i_slice_p = a_x;
       v_p.ptr = i_slice_p.ptr;
       v_p.len = 1;
-      uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8);
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8));
       while (v_p.ptr < i_end0_p) {
         v_s1 += ((uint32_t)(v_p.ptr[0u]));
         v_s2 += v_s1;
@@ -29698,7 +29662,7 @@
         v_p.ptr += 1;
       }
       v_p.len = 1;
-      uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len;
+      const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
       while (v_p.ptr < i_end1_p) {
         v_s1 += ((uint32_t)(v_p.ptr[0u]));
         v_s2 += v_s1;
@@ -29785,7 +29749,7 @@
       wuffs_base__slice_u8 i_slice_p = a_x;
       v_p.ptr = i_slice_p.ptr;
       v_p.len = 32;
-      uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32);
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32));
       while (v_p.ptr < i_end0_p) {
         v_p__left = vld1q_u8(v_p.ptr);
         v_p_right = vld1q_u8(v_p.ptr + 16u);
@@ -29819,7 +29783,7 @@
         wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
         v_p.ptr = i_slice_p.ptr;
         v_p.len = 1;
-        uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+        const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
         while (v_p.ptr < i_end0_p) {
           v_s1 += ((uint32_t)(v_p.ptr[0u]));
           v_s2 += v_s1;
@@ -29841,7 +29805,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func adler32.hasher.up_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -29886,7 +29850,7 @@
       wuffs_base__slice_u8 i_slice_p = a_x;
       v_p.ptr = i_slice_p.ptr;
       v_p.len = 32;
-      uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32);
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32));
       while (v_p.ptr < i_end0_p) {
         v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr));
         v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u));
@@ -29912,7 +29876,7 @@
         wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
         v_p.ptr = i_slice_p.ptr;
         v_p.len = 1;
-        uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+        const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
         while (v_p.ptr < i_end0_p) {
           v_s1 += ((uint32_t)(v_p.ptr[0u]));
           v_s2 += v_s1;
@@ -29928,7 +29892,7 @@
   self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
@@ -35727,13 +35691,13 @@
     wuffs_base__slice_u8 a_x);
 #endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_crc32__ieee_hasher__up_x86_sse42(
     wuffs_crc32__ieee_hasher* self,
     wuffs_base__slice_u8 a_x);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
 // ---------------- VTables
 
@@ -35885,7 +35849,7 @@
 #if defined(WUFFS_BASE__CPU_ARCH__X86_64)
         wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_crc32__ieee_hasher__up_x86_avx2 :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 :
 #endif
         self->private_impl.choosy_up);
@@ -35935,7 +35899,7 @@
     wuffs_base__slice_u8 i_slice_p = a_x;
     v_p.ptr = i_slice_p.ptr;
     v_p.len = 16;
-    uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32);
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32));
     while (v_p.ptr < i_end0_p) {
       v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
           (((uint32_t)(v_p.ptr[1u])) << 8u) |
@@ -35981,7 +35945,7 @@
       v_p.ptr += 16;
     }
     v_p.len = 16;
-    uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16);
+    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16));
     while (v_p.ptr < i_end1_p) {
       v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
           (((uint32_t)(v_p.ptr[1u])) << 8u) |
@@ -36006,7 +35970,7 @@
       v_p.ptr += 16;
     }
     v_p.len = 1;
-    uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len;
+    const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
     while (v_p.ptr < i_end2_p) {
       v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
       v_p.ptr += 1;
@@ -36055,7 +36019,7 @@
     wuffs_base__slice_u8 i_slice_p = a_x;
     v_p.ptr = i_slice_p.ptr;
     v_p.len = 8;
-    uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128);
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128));
     while (v_p.ptr < i_end0_p) {
       v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
       v_p.ptr += 8;
@@ -36091,13 +36055,13 @@
       v_p.ptr += 8;
     }
     v_p.len = 8;
-    uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8);
+    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8));
     while (v_p.ptr < i_end1_p) {
       v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
       v_p.ptr += 8;
     }
     v_p.len = 1;
-    uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len;
+    const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
     while (v_p.ptr < i_end2_p) {
       v_s = __crc32b(v_s, v_p.ptr[0u]);
       v_p.ptr += 1;
@@ -36143,7 +36107,7 @@
       wuffs_base__slice_u8 i_slice_p = a_x;
       v_p.ptr = i_slice_p.ptr;
       v_p.len = 1;
-      uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
       while (v_p.ptr < i_end0_p) {
         v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
         v_p.ptr += 1;
@@ -36163,7 +36127,7 @@
     wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u);
     v_p.ptr = i_slice_p.ptr;
     v_p.len = 64;
-    uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64);
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64));
     while (v_p.ptr < i_end0_p) {
       v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
       v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u));
@@ -36216,7 +36180,7 @@
       wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
       v_p.ptr = i_slice_p.ptr;
       v_p.len = 1;
-      uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
       while (v_p.ptr < i_end0_p) {
         v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
         v_p.ptr += 1;
@@ -36233,7 +36197,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func crc32.ieee_hasher.up_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -36263,7 +36227,7 @@
       wuffs_base__slice_u8 i_slice_p = a_x;
       v_p.ptr = i_slice_p.ptr;
       v_p.len = 1;
-      uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
       while (v_p.ptr < i_end0_p) {
         v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
         v_p.ptr += 1;
@@ -36283,7 +36247,7 @@
     wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u);
     v_p.ptr = i_slice_p.ptr;
     v_p.len = 64;
-    uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64);
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64));
     while (v_p.ptr < i_end0_p) {
       v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
       v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u));
@@ -36336,7 +36300,7 @@
       wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
       v_p.ptr = i_slice_p.ptr;
       v_p.len = 1;
-      uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
       while (v_p.ptr < i_end0_p) {
         v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
         v_p.ptr += 1;
@@ -36347,7 +36311,7 @@
   self->private_impl.f_state = (4294967295u ^ v_s);
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
@@ -36627,10 +36591,54 @@
   },
 };
 
+static const uint8_t
+WUFFS_CRC64__SHUFFLE_707F[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
+  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
+};
+
+static const uint8_t
+WUFFS_CRC64__SHUFFLE_8F80[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  143u, 142u, 141u, 140u, 139u, 138u, 137u, 136u,
+  135u, 134u, 133u, 132u, 131u, 130u, 129u, 128u,
+};
+
+static const uint8_t
+WUFFS_CRC64__ECMA_X86_SSE42_K1K2[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  228u, 58u, 57u, 202u, 151u, 212u, 93u, 224u,
+  64u, 95u, 135u, 199u, 175u, 149u, 190u, 218u,
+};
+
+static const uint8_t
+WUFFS_CRC64__ECMA_X86_SSE42_PXMU[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u,
+  213u, 99u, 41u, 23u, 108u, 70u, 62u, 156u,
+};
+
 // ---------------- Private Initializer Prototypes
 
 // ---------------- Private Function Prototypes
 
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_crc64__ecma_hasher__up(
+    wuffs_crc64__ecma_hasher* self,
+    wuffs_base__slice_u8 a_x);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_crc64__ecma_hasher__up__choosy_default(
+    wuffs_crc64__ecma_hasher* self,
+    wuffs_base__slice_u8 a_x);
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_crc64__ecma_hasher__up_x86_sse42(
+    wuffs_crc64__ecma_hasher* self,
+    wuffs_base__slice_u8 a_x);
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+
 // ---------------- VTables
 
 const wuffs_base__hasher_u64__func_ptrs
@@ -36688,6 +36696,8 @@
     }
   }
 
+  self->private_impl.choosy_up = &wuffs_crc64__ecma_hasher__up__choosy_default;
+
   self->private_impl.magic = WUFFS_BASE__MAGIC;
   self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name =
       wuffs_base__hasher_u64__vtable_name;
@@ -36771,43 +36781,14 @@
     return wuffs_base__make_empty_struct();
   }
 
-  uint64_t v_s = 0;
-  wuffs_base__slice_u8 v_p = {0};
-
-  v_s = (18446744073709551615u ^ self->private_impl.f_state);
-  {
-    wuffs_base__slice_u8 i_slice_p = a_x;
-    v_p.ptr = i_slice_p.ptr;
-    v_p.len = 8;
-    uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8);
-    while (v_p.ptr < i_end0_p) {
-      v_s ^= ((((uint64_t)(v_p.ptr[0u])) << 0u) |
-          (((uint64_t)(v_p.ptr[1u])) << 8u) |
-          (((uint64_t)(v_p.ptr[2u])) << 16u) |
-          (((uint64_t)(v_p.ptr[3u])) << 24u) |
-          (((uint64_t)(v_p.ptr[4u])) << 32u) |
-          (((uint64_t)(v_p.ptr[5u])) << 40u) |
-          (((uint64_t)(v_p.ptr[6u])) << 48u) |
-          (((uint64_t)(v_p.ptr[7u])) << 56u));
-      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][(255u & (v_s >> 56u))] ^
-          WUFFS_CRC64__ECMA_TABLE[1u][(255u & (v_s >> 48u))] ^
-          WUFFS_CRC64__ECMA_TABLE[2u][(255u & (v_s >> 40u))] ^
-          WUFFS_CRC64__ECMA_TABLE[3u][(255u & (v_s >> 32u))] ^
-          WUFFS_CRC64__ECMA_TABLE[4u][(255u & (v_s >> 24u))] ^
-          WUFFS_CRC64__ECMA_TABLE[5u][(255u & (v_s >> 16u))] ^
-          WUFFS_CRC64__ECMA_TABLE[6u][(255u & (v_s >> 8u))] ^
-          WUFFS_CRC64__ECMA_TABLE[7u][(255u & (v_s >> 0u))]);
-      v_p.ptr += 8;
-    }
-    v_p.len = 1;
-    uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len;
-    while (v_p.ptr < i_end1_p) {
-      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
-      v_p.ptr += 1;
-    }
-    v_p.len = 0;
+  if (self->private_impl.f_state == 0u) {
+    self->private_impl.choosy_up = (
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc64__ecma_hasher__up_x86_sse42 :
+#endif
+        self->private_impl.choosy_up);
   }
-  self->private_impl.f_state = (18446744073709551615u ^ v_s);
+  wuffs_crc64__ecma_hasher__up(self, a_x);
   return wuffs_base__make_empty_struct();
 }
 
@@ -36829,6 +36810,61 @@
   return wuffs_crc64__ecma_hasher__checksum_u64(self);
 }
 
+// -------- func crc64.ecma_hasher.up
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_crc64__ecma_hasher__up(
+    wuffs_crc64__ecma_hasher* self,
+    wuffs_base__slice_u8 a_x) {
+  return (*self->private_impl.choosy_up)(self, a_x);
+}
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_crc64__ecma_hasher__up__choosy_default(
+    wuffs_crc64__ecma_hasher* self,
+    wuffs_base__slice_u8 a_x) {
+  uint64_t v_s = 0;
+  wuffs_base__slice_u8 v_p = {0};
+
+  v_s = (18446744073709551615u ^ self->private_impl.f_state);
+  {
+    wuffs_base__slice_u8 i_slice_p = a_x;
+    v_p.ptr = i_slice_p.ptr;
+    v_p.len = 8;
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8));
+    while (v_p.ptr < i_end0_p) {
+      v_s ^= ((((uint64_t)(v_p.ptr[0u])) << 0u) |
+          (((uint64_t)(v_p.ptr[1u])) << 8u) |
+          (((uint64_t)(v_p.ptr[2u])) << 16u) |
+          (((uint64_t)(v_p.ptr[3u])) << 24u) |
+          (((uint64_t)(v_p.ptr[4u])) << 32u) |
+          (((uint64_t)(v_p.ptr[5u])) << 40u) |
+          (((uint64_t)(v_p.ptr[6u])) << 48u) |
+          (((uint64_t)(v_p.ptr[7u])) << 56u));
+      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][(255u & (v_s >> 56u))] ^
+          WUFFS_CRC64__ECMA_TABLE[1u][(255u & (v_s >> 48u))] ^
+          WUFFS_CRC64__ECMA_TABLE[2u][(255u & (v_s >> 40u))] ^
+          WUFFS_CRC64__ECMA_TABLE[3u][(255u & (v_s >> 32u))] ^
+          WUFFS_CRC64__ECMA_TABLE[4u][(255u & (v_s >> 24u))] ^
+          WUFFS_CRC64__ECMA_TABLE[5u][(255u & (v_s >> 16u))] ^
+          WUFFS_CRC64__ECMA_TABLE[6u][(255u & (v_s >> 8u))] ^
+          WUFFS_CRC64__ECMA_TABLE[7u][(255u & (v_s >> 0u))]);
+      v_p.ptr += 8;
+    }
+    v_p.len = 1;
+    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
+    while (v_p.ptr < i_end1_p) {
+      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
+      v_p.ptr += 1;
+    }
+    v_p.len = 0;
+  }
+  self->private_impl.f_state = (18446744073709551615u ^ v_s);
+  return wuffs_base__make_empty_struct();
+}
+
 // -------- func crc64.ecma_hasher.checksum_u64
 
 WUFFS_BASE__GENERATED_C_CODE
@@ -36846,6 +36882,107 @@
   return self->private_impl.f_state;
 }
 
+// ‼ WUFFS MULTI-FILE SECTION +x86_sse42
+// -------- func crc64.ecma_hasher.up_x86_sse42
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_crc64__ecma_hasher__up_x86_sse42(
+    wuffs_crc64__ecma_hasher* self,
+    wuffs_base__slice_u8 a_x) {
+  uint64_t v_s = 0;
+  wuffs_base__slice_u8 v_p = {0};
+  __m128i v_s0 = {0};
+  __m128i v_s0_707F = {0};
+  __m128i v_s0_8F80 = {0};
+  __m128i v_x0 = {0};
+  __m128i v_aa = {0};
+  __m128i v_k1k2 = {0};
+  __m128i v_t0 = {0};
+  __m128i v_t1 = {0};
+  __m128i v_t2 = {0};
+  __m128i v_u0 = {0};
+  __m128i v_u1 = {0};
+  __m128i v_u2 = {0};
+  __m128i v_v0 = {0};
+  __m128i v_v1 = {0};
+  __m128i v_pxmu = {0};
+  __m128i v_w1 = {0};
+  __m128i v_w2 = {0};
+  uint64_t v_tail_index = 0;
+
+  v_s = (18446744073709551615u ^ self->private_impl.f_state);
+  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
+    v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
+    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
+  }
+  if (((uint64_t)(a_x.len)) < 32u) {
+    {
+      wuffs_base__slice_u8 i_slice_p = a_x;
+      v_p.ptr = i_slice_p.ptr;
+      v_p.len = 1;
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
+      while (v_p.ptr < i_end0_p) {
+        v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
+        v_p.ptr += 1;
+      }
+      v_p.len = 0;
+    }
+    self->private_impl.f_state = (18446744073709551615u ^ v_s);
+    return wuffs_base__make_empty_struct();
+  }
+  v_s0 = _mm_cvtsi64_si128((int64_t)(v_s));
+  v_s0_707F = _mm_shuffle_epi8(v_s0, _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__SHUFFLE_707F)));
+  v_s0_8F80 = _mm_shuffle_epi8(v_s0, _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__SHUFFLE_8F80)));
+  v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
+  a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
+  v_k1k2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_K1K2));
+  v_t0 = _mm_xor_si128(v_s0_707F, v_x0);
+  v_t1 = _mm_clmulepi64_si128(v_t0, v_k1k2, (int32_t)(0u));
+  v_t2 = _mm_clmulepi64_si128(v_t0, v_k1k2, (int32_t)(17u));
+  v_aa = _mm_xor_si128(_mm_xor_si128(v_t1, v_t2), v_s0_8F80);
+  while (((uint64_t)(a_x.len)) >= 32u) {
+    v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
+    a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
+    v_u0 = _mm_xor_si128(v_aa, v_x0);
+    v_u1 = _mm_clmulepi64_si128(v_u0, v_k1k2, (int32_t)(0u));
+    v_u2 = _mm_clmulepi64_si128(v_u0, v_k1k2, (int32_t)(17u));
+    v_aa = _mm_xor_si128(v_u1, v_u2);
+  }
+  if (((uint64_t)(a_x.len)) < 16u) {
+    return wuffs_base__make_empty_struct();
+  }
+  v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
+  a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
+  v_v0 = _mm_xor_si128(v_aa, v_x0);
+  v_v1 = _mm_clmulepi64_si128(v_v0, v_k1k2, (int32_t)(16u));
+  v_aa = _mm_xor_si128(v_v1, _mm_srli_si128(v_v0, (int32_t)(8u)));
+  v_pxmu = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_PXMU));
+  v_w1 = _mm_clmulepi64_si128(v_aa, v_pxmu, (int32_t)(16u));
+  v_w2 = _mm_clmulepi64_si128(v_w1, v_pxmu, (int32_t)(0u));
+  v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(v_aa, _mm_xor_si128(v_w2, _mm_slli_si128(v_w1, (int32_t)(8u)))), (int32_t)(1u))));
+  v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551600u);
+  if (v_tail_index < ((uint64_t)(a_x.len))) {
+    {
+      wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
+      v_p.ptr = i_slice_p.ptr;
+      v_p.len = 1;
+      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
+      while (v_p.ptr < i_end0_p) {
+        v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
+        v_p.ptr += 1;
+      }
+      v_p.len = 0;
+    }
+  }
+  self->private_impl.f_state = (18446744073709551615u ^ v_s);
+  return wuffs_base__make_empty_struct();
+}
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+// ‼ WUFFS MULTI-FILE SECTION -x86_sse42
+
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64)
 
 #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
@@ -36982,14 +37119,14 @@
     uint32_t a_n_codes1,
     uint32_t a_base_symbol);
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
 wuffs_deflate__decoder__decode_huffman_bmi2(
     wuffs_deflate__decoder* self,
     wuffs_base__io_buffer* a_dst,
     wuffs_base__io_buffer* a_src);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
@@ -37323,7 +37460,7 @@
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
 
     self->private_impl.choosy_decode_huffman_fast64 = (
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
         wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 :
 #endif
         self->private_impl.choosy_decode_huffman_fast64);
@@ -38212,7 +38349,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +x86_bmi2
 // -------- func deflate.decoder.decode_huffman_bmi2
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
@@ -38420,7 +38557,7 @@
 
   return status;
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_bmi2
 
 // -------- func deflate.decoder.decode_huffman_fast32
@@ -59298,40 +59435,40 @@
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_1_distance_4_x86_sse42(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_3_distance_4_x86_sse42(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_4_distance_3_x86_sse42(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_4_distance_4_x86_sse42(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
@@ -59627,7 +59764,7 @@
     wuffs_base__slice_u8 i_slice_curr = a_curr;
     v_curr.ptr = i_slice_curr.ptr;
     v_curr.len = 4;
-    uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
     while (v_curr.ptr < i_end0_curr) {
       v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
       v_fx = vadd_u8(v_fx, v_fa);
@@ -59641,7 +59778,7 @@
       v_curr.ptr += 4;
     }
     v_curr.len = 4;
-    uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
     while (v_curr.ptr < i_end1_curr) {
       v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
       v_fx = vadd_u8(v_fx, v_fa);
@@ -59677,7 +59814,7 @@
       wuffs_base__slice_u8 i_slice_curr = a_curr;
       v_curr.ptr = i_slice_curr.ptr;
       v_curr.len = 4;
-      uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8);
+      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
       while (v_curr.ptr < i_end0_curr) {
         v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
         v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
@@ -59691,7 +59828,7 @@
         v_curr.ptr += 4;
       }
       v_curr.len = 4;
-      uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
       while (v_curr.ptr < i_end1_curr) {
         v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
         v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
@@ -59710,7 +59847,7 @@
       i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
       v_curr.len = 4;
       v_prev.len = 4;
-      uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8);
+      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
       while (v_curr.ptr < i_end0_curr) {
         v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
         v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
@@ -59729,7 +59866,7 @@
       }
       v_curr.len = 4;
       v_prev.len = 4;
-      uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
       while (v_curr.ptr < i_end1_curr) {
         v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
         v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
@@ -59782,7 +59919,7 @@
     i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end0_curr = v_curr.ptr + wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6));
     while (v_curr.ptr < i_end0_curr) {
       v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
       v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
@@ -59821,7 +59958,7 @@
     }
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end1_curr = v_curr.ptr + wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3);
+    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3));
     while (v_curr.ptr < i_end1_curr) {
       v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
       v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
@@ -59843,7 +59980,7 @@
     }
     v_curr.len = 3;
     v_prev.len = 3;
-    uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3);
+    const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
     while (v_curr.ptr < i_end2_curr) {
       v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr)));
       v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr)));
@@ -59903,7 +60040,7 @@
     i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
     while (v_curr.ptr < i_end0_curr) {
       v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
       v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
@@ -59942,7 +60079,7 @@
     }
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
     while (v_curr.ptr < i_end1_curr) {
       v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
       v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
@@ -60021,7 +60158,7 @@
     wuffs_base__slice_u8 i_slice_curr = a_curr;
     v_curr.ptr = i_slice_curr.ptr;
     v_curr.len = 3;
-    uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6));
     while (v_curr.ptr < i_end0_curr) {
       v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
       v_curr.ptr[0u] = v_fa0;
@@ -60039,7 +60176,7 @@
       v_curr.ptr += 3;
     }
     v_curr.len = 3;
-    uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3);
+    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
     while (v_curr.ptr < i_end1_curr) {
       v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
       v_curr.ptr[0u] = v_fa0;
@@ -60071,7 +60208,7 @@
     wuffs_base__slice_u8 i_slice_curr = a_curr;
     v_curr.ptr = i_slice_curr.ptr;
     v_curr.len = 4;
-    uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
     while (v_curr.ptr < i_end0_curr) {
       v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
       v_curr.ptr[0u] = v_fa0;
@@ -60171,7 +60308,7 @@
       wuffs_base__slice_u8 i_slice_curr = a_curr;
       v_curr.ptr = i_slice_curr.ptr;
       v_curr.len = 3;
-      uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6);
+      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6));
       while (v_curr.ptr < i_end0_curr) {
         v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
         v_curr.ptr[0u] = v_fa0;
@@ -60189,7 +60326,7 @@
         v_curr.ptr += 3;
       }
       v_curr.len = 3;
-      uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3);
+      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
       while (v_curr.ptr < i_end1_curr) {
         v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
         v_curr.ptr[0u] = v_fa0;
@@ -60210,7 +60347,7 @@
       i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
       v_curr.len = 3;
       v_prev.len = 3;
-      uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6);
+      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6));
       while (v_curr.ptr < i_end0_curr) {
         v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
         v_curr.ptr[0u] = v_fa0;
@@ -60231,7 +60368,7 @@
       }
       v_curr.len = 3;
       v_prev.len = 3;
-      uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3);
+      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
       while (v_curr.ptr < i_end1_curr) {
         v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
         v_curr.ptr[0u] = v_fa0;
@@ -60269,7 +60406,7 @@
       wuffs_base__slice_u8 i_slice_curr = a_curr;
       v_curr.ptr = i_slice_curr.ptr;
       v_curr.len = 4;
-      uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
       while (v_curr.ptr < i_end0_curr) {
         v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
         v_curr.ptr[0u] = v_fa0;
@@ -60292,7 +60429,7 @@
       i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
       v_curr.len = 4;
       v_prev.len = 4;
-      uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
       while (v_curr.ptr < i_end0_curr) {
         v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
         v_curr.ptr[0u] = v_fa0;
@@ -60417,7 +60554,7 @@
     i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
     v_curr.len = 3;
     v_prev.len = 3;
-    uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
     while (v_curr.ptr < i_end0_curr) {
       v_fb0 = ((uint32_t)(v_prev.ptr[0u]));
       v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0));
@@ -60544,7 +60681,7 @@
     i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
     while (v_curr.ptr < i_end0_curr) {
       v_fb0 = ((uint32_t)(v_prev.ptr[0u]));
       v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0));
@@ -60650,7 +60787,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func png.decoder.filter_1_distance_4_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -60665,7 +60802,7 @@
     wuffs_base__slice_u8 i_slice_curr = a_curr;
     v_curr.ptr = i_slice_curr.ptr;
     v_curr.len = 4;
-    uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
     while (v_curr.ptr < i_end0_curr) {
       v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
       v_x128 = _mm_add_epi8(v_x128, v_a128);
@@ -60679,7 +60816,7 @@
       v_curr.ptr += 4;
     }
     v_curr.len = 4;
-    uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
     while (v_curr.ptr < i_end1_curr) {
       v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
       v_x128 = _mm_add_epi8(v_x128, v_a128);
@@ -60691,13 +60828,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func png.decoder.filter_3_distance_4_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -60719,7 +60856,7 @@
       wuffs_base__slice_u8 i_slice_curr = a_curr;
       v_curr.ptr = i_slice_curr.ptr;
       v_curr.len = 4;
-      uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8);
+      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
       while (v_curr.ptr < i_end0_curr) {
         v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
         v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
@@ -60735,7 +60872,7 @@
         v_curr.ptr += 4;
       }
       v_curr.len = 4;
-      uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
       while (v_curr.ptr < i_end1_curr) {
         v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
         v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
@@ -60756,7 +60893,7 @@
       i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
       v_curr.len = 4;
       v_prev.len = 4;
-      uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8);
+      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
       while (v_curr.ptr < i_end0_curr) {
         v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
         v_p128 = _mm_avg_epu8(v_a128, v_b128);
@@ -60779,7 +60916,7 @@
       }
       v_curr.len = 4;
       v_prev.len = 4;
-      uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
       while (v_curr.ptr < i_end1_curr) {
         v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
         v_p128 = _mm_avg_epu8(v_a128, v_b128);
@@ -60797,13 +60934,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func png.decoder.filter_4_distance_3_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -60832,7 +60969,7 @@
     i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end0_curr = v_curr.ptr + wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6));
     while (v_curr.ptr < i_end0_curr) {
       v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
       v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
@@ -60875,7 +61012,7 @@
     }
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end1_curr = v_curr.ptr + wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3);
+    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3));
     while (v_curr.ptr < i_end1_curr) {
       v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
       v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
@@ -60899,7 +61036,7 @@
     }
     v_curr.len = 3;
     v_prev.len = 3;
-    uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3);
+    const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
     while (v_curr.ptr < i_end2_curr) {
       v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr)));
       v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
@@ -60924,13 +61061,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func png.decoder.filter_4_distance_4_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -60959,7 +61096,7 @@
     i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8);
+    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
     while (v_curr.ptr < i_end0_curr) {
       v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
       v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
@@ -61002,7 +61139,7 @@
     }
     v_curr.len = 4;
     v_prev.len = 4;
-    uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4);
+    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
     while (v_curr.ptr < i_end1_curr) {
       v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
       v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
@@ -61029,7 +61166,7 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 // -------- func png.decoder.get_quirk
@@ -61776,7 +61913,7 @@
 #if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 :
 #endif
         &wuffs_png__decoder__filter_4_distance_3_fallback);
@@ -61785,7 +61922,7 @@
 #if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 :
 #endif
         &wuffs_png__decoder__filter_1_distance_4_fallback);
@@ -61793,7 +61930,7 @@
 #if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 :
 #endif
         &wuffs_png__decoder__filter_3_distance_4_fallback);
@@ -61801,7 +61938,7 @@
 #if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 :
 #endif
         &wuffs_png__decoder__filter_4_distance_4_fallback);
@@ -65859,7 +65996,7 @@
     wuffs_base__slice_u8 i_slice_p = a_x;
     v_p.ptr = i_slice_p.ptr;
     v_p.len = 64;
-    uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64);
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64));
     while (v_p.ptr < i_end0_p) {
       v_w[0u] = ((((uint32_t)(v_p.ptr[0u])) << 24u) |
           (((uint32_t)(v_p.ptr[1u])) << 16u) |
@@ -65972,7 +66109,7 @@
       v_p.ptr += 64;
     }
     v_p.len = 1;
-    uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len;
+    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
     while (v_p.ptr < i_end1_p) {
       self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
       v_buf_len = ((v_buf_len + 1u) & 63u);
@@ -68851,7 +68988,7 @@
     wuffs_base__slice_u8 i_slice_p = a_x;
     v_p.ptr = i_slice_p.ptr;
     v_p.len = 16;
-    uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16);
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16));
     while (v_p.ptr < i_end0_p) {
       v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) |
           (((uint32_t)(v_p.ptr[1u])) << 8u) |
@@ -68884,7 +69021,7 @@
       v_p.ptr += 16;
     }
     v_p.len = 1;
-    uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len;
+    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
     while (v_p.ptr < i_end1_p) {
       self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
       v_buf_len = ((v_buf_len + 1u) & 15u);
@@ -69263,7 +69400,7 @@
     wuffs_base__slice_u8 i_slice_p = a_x;
     v_p.ptr = i_slice_p.ptr;
     v_p.len = 32;
-    uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32);
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32));
     while (v_p.ptr < i_end0_p) {
       v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) |
           (((uint64_t)(v_p.ptr[1u])) << 8u) |
@@ -69312,7 +69449,7 @@
       v_p.ptr += 32;
     }
     v_p.len = 1;
-    uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len;
+    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
     while (v_p.ptr < i_end1_p) {
       self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
       v_buf_len = ((v_buf_len + 1u) & 31u);
@@ -71939,16 +72076,12 @@
     : m_buf(wuffs_base__empty_io_buffer()), m_max_incl(max_incl) {}
 
 DynIOBuffer::~DynIOBuffer() {
-  if (allocated()) {
-    free(m_buf.data.ptr);
-  }
+  free(m_buf.data.ptr);
 }
 
 void  //
 DynIOBuffer::drop() {
-  if (allocated()) {
-    free(m_buf.data.ptr);
-  }
+  free(m_buf.data.ptr);
   m_buf = wuffs_base__empty_io_buffer();
 }
 
@@ -71962,9 +72095,8 @@
   } else if (n > SIZE_MAX) {
     return DynIOBuffer::GrowResult::FailedOutOfMemory;
   } else if (n > m_buf.data.len) {
-    uint8_t* ptr = static_cast<uint8_t*>(
-        allocated() ? realloc(m_buf.data.ptr, static_cast<size_t>(n))
-                    : malloc(static_cast<size_t>(n)));
+    uint8_t* ptr =
+        static_cast<uint8_t*>(realloc(m_buf.data.ptr, static_cast<size_t>(n)));
     if (!ptr) {
       return DynIOBuffer::GrowResult::FailedOutOfMemory;
     }
@@ -71974,12 +72106,6 @@
   return DynIOBuffer::GrowResult::OK;
 }
 
-bool  //
-DynIOBuffer::allocated() {
-  IOBuffer buf = wuffs_base__empty_io_buffer();
-  return buf.data.ptr != m_buf.data.ptr;
-}
-
 // round_up rounds min_incl up, returning the smallest value x satisfying
 // (min_incl <= x) and (x <= max_incl) and some other constraints. It returns 0
 // if there is no such x.
diff --git a/sync.txt b/sync.txt
index 08c7897..3372141 100644
--- a/sync.txt
+++ b/sync.txt
@@ -1,10 +1,10 @@
-script/sync.sh ran on 2024-03-31
-Sibling directory (../wuffs) git revision is 5c693c9de89a63db4dc112f70fea5bfb1296c2a3
+script/sync.sh ran on 2024-04-11
+Sibling directory (../wuffs) git revision is f1698226806569eb45ea009deee89a108f8d5395
 Manifest (sha256sum values, filenames, versions):
 994126492f24a3edae9b95efa92820647cedc42ee933ce3ff2a364fa9c62aba3  release/c/README.md
 3b6a0c78f663bb495d1972fbb2a87c717d70fbac5ea8cc1a50cb9afaa4b03f92  release/c/wuffs-v0.2.c
     #define WUFFS_VERSION_STRING "0.2.0+2078.20191219"
 ca10c422ebd4bf9f2cc469bafec4d5606eed3db0db7cbe21cb5232249ac0fe68  release/c/wuffs-v0.3.c
     #define WUFFS_VERSION_STRING "0.3.3+3399.20230408"
-7c5d36313f1341ba3bbce6a859a7affdd8117aad78919a5ff6c103729b7ee451  release/c/wuffs-v0.4.c
-    #define WUFFS_VERSION_STRING "0.4.0-alpha.3+3731.20240331"
+035155b1a3c3ca855f9f5b87d2f356dab662e4403566425b7feafd3011d2c86a  release/c/wuffs-v0.4.c
+    #define WUFFS_VERSION_STRING "0.4.0-alpha.4+3742.20240406"