#![allow(
clippy::cast_possible_wrap,
clippy::cast_sign_loss,
clippy::ptr_as_ptr,
clippy::borrow_as_ptr,
clippy::ref_as_ptr,
clippy::items_after_statements,
clippy::unreadable_literal
)]
#[cfg(target_arch = "x86_64")]
use core::arch::x86_64::{
__m128i, _mm_and_si128, _mm_cmpgt_epi8, _mm_cmplt_epi8, _mm_load_si128, _mm_loadu_si128,
_mm_madd_epi16, _mm_maddubs_epi16, _mm_movemask_epi8, _mm_or_si128, _mm_set1_epi8,
_mm_setr_epi16, _mm_setr_epi8, _mm_shuffle_epi8, _mm_store_si128, _mm_sub_epi8,
};
#[cfg(target_arch = "x86")]
use core::arch::x86::{
__m128i, _mm_and_si128, _mm_cmpgt_epi8, _mm_cmplt_epi8, _mm_load_si128, _mm_loadu_si128,
_mm_madd_epi16, _mm_maddubs_epi16, _mm_movemask_epi8, _mm_or_si128, _mm_set1_epi8,
_mm_setr_epi16, _mm_setr_epi8, _mm_shuffle_epi8, _mm_store_si128, _mm_sub_epi8,
};
use crate::TimestampError;
#[repr(align(16))]
struct AlignedBuffer([u8; size_of::<__m128i>()]);
impl AlignedBuffer {
fn new() -> Self {
unsafe { core::mem::zeroed() }
}
fn as_ptr<T>(&self) -> *const T {
&self.0 as *const _ as *const T
}
fn as_mut_ptr<T>(&mut self) -> *mut T {
&mut self.0 as *mut _ as *mut T
}
fn as_bytes(&self) -> &[u8] {
&self.0
}
fn as_ints(&self) -> &[i32] {
unsafe { core::slice::from_raw_parts(self.as_ptr(), size_of::<__m128i>() / 4) }
}
}
#[target_feature(enable = "ssse3")]
pub(super) unsafe fn decode_seconds(ascii: &mut &[u8]) -> Result<i64, TimestampError> {
unsafe {
if ascii.len() < 20 {
return Err(TimestampError::InvalidFormat);
}
let vec0 = _mm_loadu_si128(ascii.as_ptr().cast());
let vec1 = _mm_loadu_si128(ascii.as_ptr().add(3).cast());
const Z: i8 = -128; let shuf0 = _mm_setr_epi8(
0, 1, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, Z, Z, 10, Z, );
let shuf1 = _mm_setr_epi8(
Z, Z, Z, Z, Z, Z, Z, Z, Z, Z, Z, Z, 14, 15, Z, 13, );
let mut tmp = _mm_or_si128(_mm_shuffle_epi8(vec0, shuf0), _mm_shuffle_epi8(vec1, shuf1));
let lower_bound = _mm_setr_epi8(
b'0' as i8, b'0' as i8, b'0' as i8, b'0' as i8, b'0' as i8, b'0' as i8, b'0' as i8,
b'0' as i8, b'0' as i8, b'0' as i8, b'0' as i8, b'0' as i8, b'0' as i8, b'0' as i8,
b'T' as i8, b':' as i8,
);
let upper_bound = _mm_setr_epi8(
b'9' as i8, b'9' as i8, b'9' as i8, b'9' as i8, b'1' as i8, b'9' as i8, b'3' as i8, b'9' as i8, b'2' as i8, b'9' as i8, b'5' as i8, b'9' as i8, b'5' as i8, b'9' as i8, b'T' as i8, b':' as i8,
);
let lower = _mm_cmplt_epi8(tmp, lower_bound);
let higher = _mm_cmpgt_epi8(tmp, upper_bound);
if _mm_movemask_epi8(_mm_or_si128(lower, higher)) != 0 {
return Err(TimestampError::InvalidFormat);
}
tmp = _mm_sub_epi8(tmp, lower_bound);
let mult_10 = _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 0, 0);
tmp = _mm_maddubs_epi16(tmp, mult_10);
let mut buf = AlignedBuffer::new();
_mm_store_si128(buf.as_mut_ptr(), tmp);
let res = buf.as_bytes();
let year = res[0] as i32 * 100 + res[2] as i32;
*ascii = &ascii[19..];
Ok(crate::jsondec_unixtime(
year,
res[4] as i32,
res[6] as i32,
res[8] as i32,
res[10] as i32,
res[12] as i32,
))
}
}
#[target_feature(enable = "ssse3")]
pub(super) unsafe fn decode_nanos(ascii: &mut &[u8]) -> Result<i32, TimestampError> {
if ascii[0] != b'.' {
return Ok(0);
}
const THREE_DIGITS: i32 = 0xE;
const SIX_DIGITS: i32 = 0xEE;
const NINE_DIGITS: i32 = 0xEEE;
unsafe {
let mut stage = AlignedBuffer::new();
let dst = stage.as_mut_ptr::<u8>();
let src = ascii.as_ptr();
match ascii.len() {
5 => {
core::ptr::copy_nonoverlapping(src, dst, 4);
}
8 => {
core::ptr::copy_nonoverlapping(src, dst, 7);
}
11..=16 => {
core::ptr::copy_nonoverlapping(src, dst, 8);
core::ptr::copy_nonoverlapping(src.add(8), dst.add(8), 2);
}
_ => return Err(TimestampError::InvalidFormat),
}
const Z: i8 = -128;
let spread = _mm_setr_epi8(
Z, 1, 2, 3, Z, 4, 5, 6, Z, 7, 8, 9, Z, Z, Z, Z, );
let mut tmp = _mm_shuffle_epi8(_mm_load_si128(stage.as_ptr()), spread);
let t0 = _mm_set1_epi8((b'0' + 128) as i8);
let t1 = _mm_set1_epi8((128 + 10) as i8);
let valid_digits = _mm_cmplt_epi8(_mm_sub_epi8(tmp, t0), t1);
let mask = _mm_movemask_epi8(valid_digits);
let offset = if mask | NINE_DIGITS == mask {
10
} else if mask | SIX_DIGITS == mask {
7
} else if mask | THREE_DIGITS == mask {
4
} else {
return Err(TimestampError::InvalidFormat);
};
let ascii_digit_mask = _mm_set1_epi8(0x0f);
tmp = _mm_and_si128(tmp, valid_digits);
tmp = _mm_and_si128(tmp, ascii_digit_mask);
let mut mult = _mm_setr_epi8(0, 100, 10, 1, 0, 100, 10, 1, 0, 100, 10, 1, 0, 100, 10, 1);
tmp = _mm_maddubs_epi16(tmp, mult);
mult = _mm_setr_epi16(1000, 1000, 1000, 1000, 1, 1, 0, 0);
tmp = _mm_madd_epi16(tmp, mult);
let mut buf = AlignedBuffer::new();
_mm_store_si128(buf.as_mut_ptr(), tmp);
*ascii = &ascii[offset..];
let out = buf.as_ints();
Ok(out[0] * 1000 + out[1] + out[2])
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_decode_seconds() {
let s = "2026-02-25T14:30:00Z";
let input = &mut s.as_bytes();
assert_eq!(unsafe { decode_seconds(input).unwrap() }, 1772029800);
assert_eq!(input, b"Z");
}
#[test]
fn test_decode_seconds_invalid_chars() {
let s = "20/6-02-25T14:30:00Z";
let input = &mut s.as_bytes();
assert!(unsafe { decode_seconds(input).is_err() });
let s = "20:6-02-25T14:30:00Z";
let input = &mut s.as_bytes();
assert!(unsafe { decode_seconds(input).is_err() });
}
#[test]
fn test_decode_nanos() {
let s = ".987654321Z";
let input = &mut s.as_bytes();
assert_eq!(unsafe { decode_nanos(input).unwrap() }, 987654321);
assert_eq!(input, b"Z");
let s = ".987654+00:00";
let input = &mut s.as_bytes();
assert_eq!(unsafe { decode_nanos(input).unwrap() }, 987654000);
assert_eq!(input, b"+00:00");
}
#[test]
fn test_decode_nanos_invalid_chars() {
let s = ".98/654321Z";
let input = &mut s.as_bytes();
assert!(unsafe { decode_nanos(input).is_err() });
let s = ".98:654321Z";
let input = &mut s.as_bytes();
assert!(unsafe { decode_nanos(input).is_err() });
}
}