[Go] Unroll WriteUint64 and WriteInt64.

This enables both WriteUint64 and WriteInt64 to both be inlined as
well as implemented with a single assembly instruction. The current Go
compiler refuses to inline functions with for loops. The compiler is
also not smart enough to produce a single assembly instruction for the
for-loop.
This commit is contained in:
Brian Atkinson 2018-07-15 16:38:55 -07:00
parent b188fde27e
commit e2eb6af3e3
1 changed files with 16 additions and 6 deletions

View File

@ -159,9 +159,14 @@ func WriteUint32(buf []byte, n uint32) {
// WriteUint64 encodes a little-endian uint64 into a byte slice. // WriteUint64 encodes a little-endian uint64 into a byte slice.
func WriteUint64(buf []byte, n uint64) { func WriteUint64(buf []byte, n uint64) {
for i := uint(0); i < uint(SizeUint64); i++ { buf[0] = byte(n)
buf[i] = byte(n >> (i * 8)) buf[1] = byte(n >> 8)
} buf[2] = byte(n >> 16)
buf[3] = byte(n >> 24)
buf[4] = byte(n >> 32)
buf[5] = byte(n >> 40)
buf[6] = byte(n >> 48)
buf[7] = byte(n >> 56)
} }
// WriteInt8 encodes a little-endian int8 into a byte slice. // WriteInt8 encodes a little-endian int8 into a byte slice.
@ -185,9 +190,14 @@ func WriteInt32(buf []byte, n int32) {
// WriteInt64 encodes a little-endian int64 into a byte slice. // WriteInt64 encodes a little-endian int64 into a byte slice.
func WriteInt64(buf []byte, n int64) { func WriteInt64(buf []byte, n int64) {
for i := uint(0); i < uint(SizeInt64); i++ { buf[0] = byte(n)
buf[i] = byte(n >> (i * 8)) buf[1] = byte(n >> 8)
} buf[2] = byte(n >> 16)
buf[3] = byte(n >> 24)
buf[4] = byte(n >> 32)
buf[5] = byte(n >> 40)
buf[6] = byte(n >> 48)
buf[7] = byte(n >> 56)
} }
// WriteFloat32 encodes a little-endian float32 into a byte slice. // WriteFloat32 encodes a little-endian float32 into a byte slice.