2
0
mirror of https://github.com/boostorg/log.git synced 2026-02-15 01:02:14 +00:00

Fixed incorrect target buffer alignment and filling.

[SVN r84176]
This commit is contained in:
Andrey Semashev
2013-05-06 20:48:52 +00:00
parent 3d484de717
commit d35f454569
3 changed files with 82 additions and 16 deletions

View File

@@ -20,6 +20,7 @@
#include <immintrin.h>
#include <boost/cstdint.hpp>
#include <boost/log/detail/config.hpp>
#include <boost/log/detail/intptr_t.hpp>
#include <boost/log/detail/header.hpp>
namespace boost {
@@ -132,7 +133,7 @@ BOOST_LOG_FORCEINLINE void dump_data_avx2(const void* data, std::size_t size, st
char_type buf_storage[stride * 3u + 16u];
// Align the temporary buffer at 16 bytes
char_type* const buf = buf_storage + (16u - ((std::size_t)(char_type*)buf_storage & 15u));
char_type* const buf = reinterpret_cast< char_type* >((uint8_t*)buf_storage + (16u - (((uintptr_t)(char_type*)buf_storage) & 15u)));
char_type* buf_begin = buf + 1u; // skip the first space of the first chunk
char_type* buf_end = buf + stride * 3u;
@@ -144,7 +145,7 @@ BOOST_LOG_FORCEINLINE void dump_data_avx2(const void* data, std::size_t size, st
// First, check the input alignment
const uint8_t* p = static_cast< const uint8_t* >(data);
if (const std::size_t prealign_size = ((16u - ((std::size_t)p & 15u)) & 15u))
if (const std::size_t prealign_size = ((16u - ((uintptr_t)p & 15u)) & 15u))
{
__m128i mm_input = _mm_lddqu_si128(reinterpret_cast< const __m128i* >(p));
__m128i mm_output1, mm_output2, mm_output3;
@@ -169,9 +170,9 @@ BOOST_LOG_FORCEINLINE void dump_data_avx2(const void* data, std::size_t size, st
__m128i mm_input = _mm_load_si128(reinterpret_cast< const __m128i* >(p));
__m128i mm_output1, mm_output2, mm_output3;
dump_pack(mm_char_10_to_a, mm_input, mm_output1, mm_output2, mm_output3);
store_characters(mm_output1, buf);
store_characters(mm_output2, buf + 16u);
store_characters(mm_output3, buf + 32u);
store_characters(mm_output1, b);
store_characters(mm_output2, b + 16u);
store_characters(mm_output3, b + 32u);
}
strm.write(buf_begin, buf_end - buf_begin);
@@ -186,9 +187,9 @@ BOOST_LOG_FORCEINLINE void dump_data_avx2(const void* data, std::size_t size, st
__m128i mm_input = _mm_load_si128(reinterpret_cast< const __m128i* >(p));
__m128i mm_output1, mm_output2, mm_output3;
dump_pack(mm_char_10_to_a, mm_input, mm_output1, mm_output2, mm_output3);
store_characters(mm_output1, buf);
store_characters(mm_output2, buf + 16u);
store_characters(mm_output3, buf + 32u);
store_characters(mm_output1, b);
store_characters(mm_output2, b + 16u);
store_characters(mm_output3, b + 32u);
b += 3u * 16u;
p += 16u;
tail_size -= 16u;