@@ -192,42 +192,29 @@ namespace hat::detail {
192192 return mask;
193193 }
194194
195- template <scan_alignment alignment>
196- LIBHAT_FORCEINLINE const std::byte* next_boundary_align (const std::byte* ptr) {
197- constexpr auto stride = alignment_stride<alignment>;
198- if constexpr (stride == 1 ) {
199- return ptr;
200- }
201- uintptr_t mod = reinterpret_cast <uintptr_t >(ptr) % stride;
202- ptr += mod ? stride - mod : 0 ;
203- return std::assume_aligned<stride>(ptr);
204- }
205-
206- template <scan_alignment alignment>
207- LIBHAT_FORCEINLINE const std::byte* prev_boundary_align (const std::byte* ptr) {
208- constexpr auto stride = alignment_stride<alignment>;
209- if constexpr (stride == 1 ) {
210- return ptr;
211- }
212- const uintptr_t mod = reinterpret_cast <uintptr_t >(ptr) % stride;
213- return std::assume_aligned<stride>(ptr - mod);
214- }
215-
216- template <typename Type>
217- LIBHAT_FORCEINLINE const std::byte* align_pointer_as (const std::byte* ptr) {
218- constexpr size_t alignment = alignof (Type);
195+ template <size_t alignment>
196+ LIBHAT_FORCEINLINE const std::byte* align_up (const std::byte* ptr) {
219197 const uintptr_t mod = reinterpret_cast <uintptr_t >(ptr) % alignment;
220198 ptr += mod ? alignment - mod : 0 ;
221199 return std::assume_aligned<alignment>(ptr);
222200 }
223201
224- template <typename Vector, bool veccmp>
202+ template <scan_alignment alignment>
203+ LIBHAT_FORCEINLINE const std::byte* align_up (const std::byte* ptr) {
204+ return align_up<alignment_stride<alignment>>(ptr);
205+ }
206+
207+ template <typename Vector, size_t alignment, bool veccmp>
225208 LIBHAT_FORCEINLINE auto segment_scan (
226209 const std::byte* begin,
227210 const std::byte* end,
228211 const size_t signatureSize,
229212 const size_t cmpOffset
230213 ) -> std::tuple<std::span<const std::byte>, std::span<const Vector>, std::span<const std::byte>> {
214+ // Alignment may not match due to function-targeted architecture flags
215+ // The size should though...
216+ static_assert (sizeof (Vector) == alignment);
217+
231218 auto validateRange = [signatureSize](const std::byte* b, const std::byte* e) -> std::span<const std::byte> {
232219 if (b <= e && static_cast <size_t >(e - b) >= signatureSize) {
233220 return {b, e};
@@ -236,7 +223,7 @@ namespace hat::detail {
236223 };
237224
238225 const auto preBegin = begin;
239- const auto vecBegin = reinterpret_cast <const Vector*>(align_pointer_as<Vector >(preBegin + cmpOffset));
226+ const auto vecBegin = reinterpret_cast <const Vector*>(align_up<alignment >(preBegin + cmpOffset));
240227 if (reinterpret_cast <const std::byte*>(vecBegin) > end) LIBHAT_UNLIKELY {
241228 return {validateRange (begin, end), {}, {}};
242229 }
@@ -308,8 +295,8 @@ namespace hat::detail {
308295 const auto signature = context.signature ;
309296 const auto cmpByte = *signature[context.cmpIndex ];
310297
311- const auto scanBegin = next_boundary_align <scan_alignment::X16 >(begin) + context.cmpIndex ;
312- const auto scanEnd = next_boundary_align <scan_alignment::X16 >(end - signature.size () + 1 ) + context.cmpIndex ;
298+ const auto scanBegin = align_up <scan_alignment::X16 >(begin) + context.cmpIndex ;
299+ const auto scanEnd = align_up <scan_alignment::X16 >(end - signature.size () + 1 ) + context.cmpIndex ;
313300
314301 if (scanBegin >= scanEnd) {
315302 return nullptr ;
0 commit comments