We are able to take advantage of several vectorizations that Core and typical hash libraries cannot, because we use buffered scheduling of the message, as opposed to variable rotation. This uses more memory, but allows significant net time savings through vectorization. The sha256 buffer is 4x the 64 byte block size, rotating. So that's not really significant. So we vectorize across the message buffer: sigma computations, endianness conversion, and k-addition but also vectorize across multiple message buffers (the other axis), and finally vectorize across independent hashes for Merkle (which Core does as well).