std/gif: have decode_header call read_u48le_as_u64
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 61f3548..641c200 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -9111,8 +9111,7 @@
       uint64_t scratch;
     } s_skip_frame;
     struct {
-      uint8_t v_c[6];
-      uint32_t v_i;
+      uint64_t scratch;
     } s_decode_header;
     struct {
       uint8_t v_flags;
@@ -39579,8 +39578,7 @@
     wuffs_base__io_buffer* a_src) {
   wuffs_base__status status = wuffs_base__make_status(NULL);
 
-  uint8_t v_c[6] = {0};
-  uint32_t v_i = 0;
+  uint64_t v_c48 = 0;
 
   const uint8_t* iop_a_src = NULL;
   const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
@@ -39594,31 +39592,39 @@
   }
 
   uint32_t coro_susp_point = self->private_impl.p_decode_header;
-  if (coro_susp_point) {
-    memcpy(v_c, self->private_data.s_decode_header.v_c, sizeof(v_c));
-    v_i = self->private_data.s_decode_header.v_i;
-  }
   switch (coro_susp_point) {
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
 
-    while (v_i < 6u) {
-      {
-        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
-        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
-          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-          goto suspend;
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+      uint64_t t_0;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
+        t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
+        iop_a_src += 6;
+      } else {
+        self->private_data.s_decode_header.scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch = &self->private_data.s_decode_header.scratch;
+          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
+          if (num_bits_0 == 40) {
+            t_0 = ((uint64_t)(*scratch));
+            break;
+          }
+          num_bits_0 += 8u;
+          *scratch |= ((uint64_t)(num_bits_0)) << 56;
         }
-        uint8_t t_0 = *iop_a_src++;
-        v_c[v_i] = t_0;
       }
-      v_i += 1u;
+      v_c48 = t_0;
     }
-    if ((v_c[0u] != 71u) ||
-        (v_c[1u] != 73u) ||
-        (v_c[2u] != 70u) ||
-        (v_c[3u] != 56u) ||
-        ((v_c[4u] != 55u) && (v_c[4u] != 57u)) ||
-        (v_c[5u] != 97u)) {
+    if ((v_c48 != 106889795225927u) && (v_c48 != 106898385160519u)) {
       status = wuffs_base__make_status(wuffs_gif__error__bad_header);
       goto exit;
     }
@@ -39632,8 +39638,6 @@
   goto suspend;
   suspend:
   self->private_impl.p_decode_header = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-  memcpy(self->private_data.s_decode_header.v_c, v_c, sizeof(v_c));
-  self->private_data.s_decode_header.v_i = v_i;
 
   goto exit;
   exit:
diff --git a/std/gif/decode_gif.wuffs b/std/gif/decode_gif.wuffs
index 56a4c9e..c8ddc46 100644
--- a/std/gif/decode_gif.wuffs
+++ b/std/gif/decode_gif.wuffs
@@ -555,15 +555,10 @@
 //
 // See the spec section 17 "Header" on page 7.
 pri func decoder.decode_header?(src: base.io_reader) {
-    var c : array[6] base.u8
-    var i : base.u32
+    var c48 : base.u64
 
-    while i < 6 {
-        c[i] = args.src.read_u8?()
-        i += 1
-    } endwhile
-    if (c[0] <> 'G') or (c[1] <> 'I') or (c[2] <> 'F') or (c[3] <> '8') or
-            ((c[4] <> '7') and (c[4] <> '9')) or (c[5] <> 'a') {
+    c48 = args.src.read_u48le_as_u64?()
+    if (c48 <> 'GIF87a'le) and (c48 <> 'GIF89a'le) {
         return "#bad header"
     }
 }