From c1c0c8d41855368134abcb21ca282353e350ca4b Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sat, 4 Jul 2015 10:48:47 -0700 Subject: [PATCH] Optimize Write16/32/Double a bit. Change-Id: I3d09a9d1b0b33da401312b3389234f7680da6f97 --- src/WireEncoder.cpp | 19 ++++++++++--------- src/WireEncoder.h | 14 ++++++++------ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/WireEncoder.cpp b/src/WireEncoder.cpp index 3a2536d74b..f1198b8c79 100644 --- a/src/WireEncoder.cpp +++ b/src/WireEncoder.cpp @@ -31,15 +31,16 @@ WireEncoder::~WireEncoder() { std::free(m_start); } void WireEncoder::WriteDouble(double val) { Reserve(8); // The highest performance way to do this, albeit non-portable. - std::uint64_t v = *reinterpret_cast(&val); - *m_cur++ = (char)((v >> 56) & 0xff); - *m_cur++ = (char)((v >> 48) & 0xff); - *m_cur++ = (char)((v >> 40) & 0xff); - *m_cur++ = (char)((v >> 32) & 0xff); - *m_cur++ = (char)((v >> 24) & 0xff); - *m_cur++ = (char)((v >> 16) & 0xff); - *m_cur++ = (char)((v >> 8) & 0xff); - *m_cur++ = (char)(v & 0xff); + std::uint64_t v = reinterpret_cast(val); + m_cur[7] = (char)(v & 0xff); v >>= 8; + m_cur[6] = (char)(v & 0xff); v >>= 8; + m_cur[5] = (char)(v & 0xff); v >>= 8; + m_cur[4] = (char)(v & 0xff); v >>= 8; + m_cur[3] = (char)(v & 0xff); v >>= 8; + m_cur[2] = (char)(v & 0xff); v >>= 8; + m_cur[1] = (char)(v & 0xff); v >>= 8; + m_cur[0] = (char)(v & 0xff); + m_cur += 8; } void WireEncoder::ReserveSlow(std::size_t len) { diff --git a/src/WireEncoder.h b/src/WireEncoder.h index 9106e84288..94de04ff27 100644 --- a/src/WireEncoder.h +++ b/src/WireEncoder.h @@ -66,17 +66,19 @@ class WireEncoder { /* Writes a 16-bit word. */ void Write16(unsigned int val) { Reserve(2); - *m_cur++ = (char)((val >> 8) & 0xff); - *m_cur++ = (char)(val & 0xff); + m_cur[1] = (char)(val & 0xff); val >>= 8; + m_cur[0] = (char)(val & 0xff); + m_cur += 2; } /* Writes a 32-bit word. */ void Write32(unsigned long val) { Reserve(4); - *m_cur++ = (char)((val >> 24) & 0xff); - *m_cur++ = (char)((val >> 16) & 0xff); - *m_cur++ = (char)((val >> 8) & 0xff); - *m_cur++ = (char)(val & 0xff); + m_cur[3] = (char)(val & 0xff); val >>= 8; + m_cur[2] = (char)(val & 0xff); val >>= 8; + m_cur[1] = (char)(val & 0xff); val >>= 8; + m_cur[0] = (char)(val & 0xff); + m_cur += 4; } /* Writes a double. */