crc: collapse the slice virtual split into one Optint engine
The slicing-by-8 engine is now written once over Optint.t, whose
representation optint picks at run time from the actual word size
(Immediate64 dispatch on Sys.word_size): immediate int on 64-bit,
boxed Int32 elsewhere. Every intermediate stays within 32 bits of its
own accord, so the same code is exact on native, bytecode, js_of_ocaml
and wasm. The slice_native and slice_portable backends, the
default_implementation selection, and the narrow-int refusal guard all
disappear; there is nothing left to mis-select.
Benchmarked (bench/bench.ml, arm64, CRC-32C): release profile
1530-1632 MB/s for the Optint engine vs 1344-1606 MB/s for the raw-int
slice_native across 64B-64KB - parity at small sizes, +14% at 256B and
up (the 32-bit register invariant makes the top-byte mask redundant,
which the old loop paid for); dev profile +11% at 4KB. flambda folds
the dispatch; there is no profile where the Optint engine loses.
Consumers no longer select a backend: drop nox-crc.slice_portable from
ocaml-slirp/examples/web, from the mirage wasi rule (mirage/lib/
rules.ml), and from the 57 regenerated cross-build arms in
unikernels/bin/gen. The identical per-backend test suites merge into
test/slice. The wasi arms still print optint's own dead-code
integer-overflow warnings (its immediate arm never runs on a 32-bit
word); those predate this change.
Makes the committed test/js spec test pass: a plain nox-crc link
computes the catalogue check values exactly under node.