1
0
mirror of https://github.com/fumiama/go-base16384.git synced 2026-06-05 00:32:52 +08:00
Files
go-base16384/base14_generic.go
源文雨 87b51ceb35 add amd64 asm
name            old time/op    new time/op    delta
EncodeTo/16-8     45.5ns ± 1%    35.9ns ± 1%   -21.01%  (p=0.008 n=5+5)
EncodeTo/256-8     241ns ± 1%     170ns ± 1%   -29.64%  (p=0.008 n=5+5)
EncodeTo/4K-8     2.90µs ± 0%    1.70µs ± 0%   -41.60%  (p=0.008 n=5+5)
EncodeTo/32K-8    23.5µs ± 2%    13.6µs ± 2%   -42.20%  (p=0.008 n=5+5)
DecodeTo/16-8     20.2ns ± 0%    10.3ns ± 2%   -48.92%  (p=0.008 n=5+5)
DecodeTo/256-8     141ns ± 1%      71ns ± 0%   -49.55%  (p=0.008 n=5+5)
DecodeTo/4K-8     2.03µs ± 1%    0.94µs ± 0%   -53.82%  (p=0.008 n=5+5)
DecodeTo/32K-8    16.1µs ± 0%     7.5µs ± 0%   -53.22%  (p=0.008 n=5+5)

name            old speed      new speed      delta
EncodeTo/16-8    352MB/s ± 1%   445MB/s ± 1%   +26.59%  (p=0.008 n=5+5)
EncodeTo/256-8  1.06GB/s ± 1%  1.51GB/s ± 1%   +42.13%  (p=0.008 n=5+5)
EncodeTo/4K-8   1.41GB/s ± 0%  2.42GB/s ± 0%   +71.24%  (p=0.008 n=5+5)
EncodeTo/32K-8  1.40GB/s ± 2%  2.42GB/s ± 2%   +73.01%  (p=0.008 n=5+5)
DecodeTo/16-8   1.09GB/s ± 0%  2.14GB/s ± 2%   +95.84%  (p=0.008 n=5+5)
DecodeTo/256-8  2.10GB/s ± 1%  4.16GB/s ± 0%   +98.21%  (p=0.008 n=5+5)
DecodeTo/4K-8   2.30GB/s ± 1%  4.99GB/s ± 0%  +116.55%  (p=0.008 n=5+5)
DecodeTo/32K-8  2.33GB/s ± 0%  4.98GB/s ± 0%  +113.78%  (p=0.008 n=5+5)
2022-04-22 17:24:49 +08:00

106 lines
2.8 KiB
Go

//go:build !amd64
// +build !amd64
package base14
import "encoding/binary"
//go:nosplit
func encode(offset, outlen int, b, encd []byte) {
var n int
i := 0
for ; i <= len(b)-7; i += 7 {
shift := binary.BigEndian.Uint64(b[i:]) >> 2
sum := shift
sum &= 0x3fff000000000000
shift >>= 2
sum |= shift & 0x00003fff00000000
shift >>= 2
sum |= shift & 0x000000003fff0000
shift >>= 2
sum |= shift & 0x0000000000003fff
sum += 0x4e004e004e004e00
binary.BigEndian.PutUint64(encd[n:], sum)
n += 8
}
if offset > 0 {
sum := 0x000000000000003f & ((uint64)(b[i]) >> 2)
sum |= ((uint64)(b[i]) << 14) & 0x000000000000c000
if offset > 1 {
sum |= ((uint64)(b[i+1]) << 6) & 0x0000000000003f00
sum |= ((uint64)(b[i+1]) << 20) & 0x0000000000300000
if offset > 2 {
sum |= ((uint64)(b[i+2]) << 12) & 0x00000000000f0000
sum |= ((uint64)(b[i+2]) << 28) & 0x00000000f0000000
if offset > 3 {
sum |= ((uint64)(b[i+3]) << 20) & 0x000000000f000000
sum |= ((uint64)(b[i+3]) << 34) & 0x0000003c00000000
if offset > 4 {
sum |= ((uint64)(b[i+4]) << 26) & 0x0000000300000000
sum |= ((uint64)(b[i+4]) << 42) & 0x0000fc0000000000
if offset > 5 {
sum |= ((uint64)(b[i+5]) << 34) & 0x0000030000000000
sum |= ((uint64)(b[i+5]) << 48) & 0x003f000000000000
}
}
}
}
}
sum += 0x004e004e004e004e
var tmp [8]byte
binary.LittleEndian.PutUint64(tmp[:], sum)
copy(encd[n:], tmp[:])
encd[outlen-2] = '='
encd[outlen-1] = byte(offset)
}
}
//go:nosplit
func decode(offset, outlen int, b, decd []byte) {
var n uintptr
i := 0
for ; i <= outlen-7; n += 8 {
shift := binary.BigEndian.Uint64(b[n:]) - 0x4e004e004e004e00
shift <<= 2
sum := shift & 0xfffc000000000000
shift <<= 2
sum |= shift & 0x0003fff000000000
shift <<= 2
sum |= shift & 0x0000000fffc00000
shift <<= 2
sum |= shift & 0x00000000003fff00
binary.BigEndian.PutUint64(decd[i:], sum)
i += 7
}
if offset > 0 {
var tmp [8]byte
copy(tmp[:], b[n:])
sum := binary.LittleEndian.Uint64(tmp[:]) - 0x000000000000004e
decd[i] = byte(((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14))
i++
if offset > 1 {
sum -= 0x00000000004e0000
decd[i] = byte(((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20))
i++
if offset > 2 {
decd[i] = byte(((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28))
i++
if offset > 3 {
sum -= 0x0000004e00000000
decd[i] = byte(((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34))
i++
if offset > 4 {
decd[i] = byte(((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42))
i++
if offset > 5 {
sum -= 0x004e000000000000
decd[i] = byte(((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48))
i++
}
}
}
}
}
}
}