From b7fb9dc7799bee9855e6993829db3e99b43b9d37 Mon Sep 17 00:00:00 2001 From: Richard Davison Date: Fri, 5 Jan 2024 14:19:43 +0100 Subject: [PATCH] Fix ptr write alignment --- src/impls/native/stage1.rs | 9 ++++++++- src/impls/neon/stage1.rs | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/impls/native/stage1.rs b/src/impls/native/stage1.rs index eb58805f..62e6c532 100644 --- a/src/impls/native/stage1.rs +++ b/src/impls/native/stage1.rs @@ -445,6 +445,13 @@ impl Stage1Parse for SimdInput { base.reserve(64); let final_len = l + cnt; + let is_unaligned = l % 4 != 0; + let write_fn = if is_unaligned { + std::ptr::write_unaligned + } else { + std::ptr::write + }; + while bits != 0 { let v0 = bits.trailing_zeros() as i32; bits &= bits.wrapping_sub(1); @@ -461,7 +468,7 @@ impl Stage1Parse for SimdInput { idx_64_v[2] + v2, idx_64_v[3] + v3, ]; - std::ptr::write(base.as_mut_ptr().add(l).cast::<[i32; 4]>(), v); + write_fn(base.as_mut_ptr().add(l).cast::<[i32; 4]>(), v); l += 4; } // We have written all the data diff --git a/src/impls/neon/stage1.rs b/src/impls/neon/stage1.rs index 3c0b4efa..69721c50 100644 --- a/src/impls/neon/stage1.rs +++ b/src/impls/neon/stage1.rs @@ -190,6 +190,13 @@ impl Stage1Parse for SimdInput { base.reserve(64); let final_len = l + cnt; + let is_unaligned = l % 4 != 0; + let write_fn = if is_unaligned { + std::ptr::write_unaligned + } else { + std::ptr::write + }; + while bits != 0 { let v0 = bits.trailing_zeros() as i32; bits &= bits.wrapping_sub(1); @@ -202,7 +209,7 @@ impl Stage1Parse for SimdInput { let v: int32x4_t = mem::transmute([v0, v1, v2, v3]); let v: int32x4_t = vaddq_s32(idx_64_v, v); - std::ptr::write(base.as_mut_ptr().add(l).cast::(), v); + write_fn(base.as_mut_ptr().add(l).cast::(), v); l += 4; } // We have written all the data