basenc 1.0.0-alpha.1

High-performance SIMD-accelerated Base64, Base32, and hex encoding and decoding with no_std support.
Documentation
use core::arch::aarch64::*;

use super::*;

#[target_feature(enable = "neon")]
pub unsafe fn encode(mut bytes: &[u8], mut dest: *mut u8, base: u8) -> *mut u8 {
	let mask = vdupq_n_u8(0x0f);
	let charset = if base == b'A' {
		vld1q_u8(b"0123456789ABCDEF".as_ptr())
	}
	else {
		vld1q_u8(b"0123456789abcdef".as_ptr())
	};

	while bytes.len() >= 16 {
		let data = vld1q_u8(bytes.as_ptr());
		let low = vandq_u8(data, mask);
		let high = vandq_u8(vshrq_n_u8::<4>(data), mask);
		let first = vzip1q_u8(high, low);
		let second = vzip2q_u8(high, low);
		vst1q_u8(dest, vqtbl1q_u8(charset, first));
		vst1q_u8(dest.add(16), vqtbl1q_u8(charset, second));

		bytes = bytes.get_unchecked(16..);
		dest = dest.add(32);
	}

	scalar::encode(bytes, dest, base)
}