aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/base32/base32.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding/base32/base32.go')
-rw-r--r--src/encoding/base32/base32.go60
1 files changed, 29 insertions, 31 deletions
diff --git a/src/encoding/base32/base32.go b/src/encoding/base32/base32.go
index 8bda6c6799..7a3221aea2 100644
--- a/src/encoding/base32/base32.go
+++ b/src/encoding/base32/base32.go
@@ -127,61 +127,59 @@ func (enc *Encoding) Encode(dst, src []byte) {
// outside of the loop to speed up the encoder.
_ = enc.encode
- di, si := 0, 0
- n := (len(src) / 5) * 5
- for si < n {
+ for len(src) >= 5 {
// Combining two 32 bit loads allows the same code to be used
// for 32 and 64 bit platforms.
- hi := uint32(src[si+0])<<24 | uint32(src[si+1])<<16 | uint32(src[si+2])<<8 | uint32(src[si+3])
- lo := hi<<8 | uint32(src[si+4])
+ hi := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])
+ lo := hi<<8 | uint32(src[4])
- dst[di+0] = enc.encode[(hi>>27)&0x1F]
- dst[di+1] = enc.encode[(hi>>22)&0x1F]
- dst[di+2] = enc.encode[(hi>>17)&0x1F]
- dst[di+3] = enc.encode[(hi>>12)&0x1F]
- dst[di+4] = enc.encode[(hi>>7)&0x1F]
- dst[di+5] = enc.encode[(hi>>2)&0x1F]
- dst[di+6] = enc.encode[(lo>>5)&0x1F]
- dst[di+7] = enc.encode[(lo)&0x1F]
+ _ = dst[7] // Eliminate bounds checks below.
+ dst[0] = enc.encode[(hi>>27)&0x1F]
+ dst[1] = enc.encode[(hi>>22)&0x1F]
+ dst[2] = enc.encode[(hi>>17)&0x1F]
+ dst[3] = enc.encode[(hi>>12)&0x1F]
+ dst[4] = enc.encode[(hi>>7)&0x1F]
+ dst[5] = enc.encode[(hi>>2)&0x1F]
+ dst[6] = enc.encode[(lo>>5)&0x1F]
+ dst[7] = enc.encode[(lo)&0x1F]
- si += 5
- di += 8
+ src = src[5:]
+ dst = dst[8:]
}
// Add the remaining small block
- remain := len(src) - si
- if remain == 0 {
+ if len(src) == 0 {
return
}
// Encode the remaining bytes in reverse order.
val := uint32(0)
- switch remain {
+ switch len(src) {
case 4:
- val |= uint32(src[si+3])
- dst[di+6] = enc.encode[val<<3&0x1F]
- dst[di+5] = enc.encode[val>>2&0x1F]
+ val |= uint32(src[3])
+ dst[6] = enc.encode[val<<3&0x1F]
+ dst[5] = enc.encode[val>>2&0x1F]
fallthrough
case 3:
- val |= uint32(src[si+2]) << 8
- dst[di+4] = enc.encode[val>>7&0x1F]
+ val |= uint32(src[2]) << 8
+ dst[4] = enc.encode[val>>7&0x1F]
fallthrough
case 2:
- val |= uint32(src[si+1]) << 16
- dst[di+3] = enc.encode[val>>12&0x1F]
- dst[di+2] = enc.encode[val>>17&0x1F]
+ val |= uint32(src[1]) << 16
+ dst[3] = enc.encode[val>>12&0x1F]
+ dst[2] = enc.encode[val>>17&0x1F]
fallthrough
case 1:
- val |= uint32(src[si+0]) << 24
- dst[di+1] = enc.encode[val>>22&0x1F]
- dst[di+0] = enc.encode[val>>27&0x1F]
+ val |= uint32(src[0]) << 24
+ dst[1] = enc.encode[val>>22&0x1F]
+ dst[0] = enc.encode[val>>27&0x1F]
}
// Pad the final quantum
if enc.padChar != NoPadding {
- nPad := (remain * 8 / 5) + 1
+ nPad := (len(src) * 8 / 5) + 1
for i := nPad; i < 8; i++ {
- dst[di+i] = byte(enc.padChar)
+ dst[i] = byte(enc.padChar)
}
}
}