 #define BATCH_SIZE (1 << LOG2_BATCH_SIZE)
 #define LOG2_BATCH_COUNT 2
 #define BATCH_COUNT (1 << LOG2_BATCH_COUNT)
-#define LOG2_PREFETCH_SIZE 9
+#define LOG2_PREFETCH_SIZE 10
 #define PREFETCH_SIZE (1 << LOG2_PREFETCH_SIZE)  // 512B, in 32B chunks
+#define PREFETCH_SECTORS 8
+#define LITERAL_SECTORS 8
 
 #define LOG_CYCLECOUNT 0
 

      }
    }
    blen = SHFL0(blen);
    if (t < blen) { s->q.buf[(pos + t) & (PREFETCH_SIZE - 1)] = base[pos + t]; }
    pos += blen;
  } while (blen > 0);
}

        if (32 + t < blen) { out[32 + t] = b1; }
      } else {
        // Literal
        uint8_t b[LITERAL_SECTORS];
        dist = -dist;
        while (blen >= LITERAL_SECTORS * 32u) {
          for(int i = 0; i < LITERAL_SECTORS; ++i)
            b[i] = literal_base[dist + i * 32u + t];
          for(int i = 0; i < LITERAL_SECTORS; ++i)
            out[i * 32u + t] = b[i];
          dist += LITERAL_SECTORS * 32u;
          out += LITERAL_SECTORS * 32u;
          blen -= LITERAL_SECTORS * 32u;
        }
        for(int i = 0; i < LITERAL_SECTORS; ++i)
          if (i * 32u + t < blen)
            b[i] = literal_base[dist + i * 32u + t];
        for(int i = 0; i < LITERAL_SECTORS; ++i)
          if (i * 32u + t < blen)
            out[i * 32u + t] = b[i];
      }
      out += blen;
    }
