Commit e2eb6af3 authored by Brian Atkinson's avatar Brian Atkinson

[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.
parent b188fde2
...@@ -159,9 +159,14 @@ func WriteUint32(buf []byte, n uint32) { ...@@ -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) { ...@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment