mirror of
https://github.com/fumiama/unibase2n.git
synced 2026-06-27 15:30:31 +08:00
add amd64 asm ver enc16blk1
This commit is contained in:
17
encode.go
17
encode.go
@@ -36,23 +36,6 @@ func (bs Base) Encode(data []byte) (out []byte) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// enc16blk1 for bit 1 (actual enc128blk1)
|
|
||||||
// len(in)!=0, len(out)==len(in)*16
|
|
||||||
//go:nosplit
|
|
||||||
func enc16blk1(mask uint16, in, out []byte) {
|
|
||||||
for i, n := range in {
|
|
||||||
c := i * 16
|
|
||||||
binary.BigEndian.PutUint16(out[c:c+2], uint16(n>>7)+mask)
|
|
||||||
binary.BigEndian.PutUint16(out[c+2:c+4], uint16(n>>6&1)+mask)
|
|
||||||
binary.BigEndian.PutUint16(out[c+4:c+6], uint16(n>>5&1)+mask)
|
|
||||||
binary.BigEndian.PutUint16(out[c+6:c+8], uint16(n>>4&1)+mask)
|
|
||||||
binary.BigEndian.PutUint16(out[c+8:c+10], uint16(n>>3&1)+mask)
|
|
||||||
binary.BigEndian.PutUint16(out[c+10:c+12], uint16(n>>2&1)+mask)
|
|
||||||
binary.BigEndian.PutUint16(out[c+12:c+14], uint16(n>>1&1)+mask)
|
|
||||||
binary.BigEndian.PutUint16(out[c+14:c+16], uint16(n&1)+mask)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// enc64blk2 for bit 2
|
// enc64blk2 for bit 2
|
||||||
// len(in)!=0, len(out)==len(in)*8
|
// len(in)!=0, len(out)==len(in)*8
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
|
|||||||
8
encode_amd64.go
Normal file
8
encode_amd64.go
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
//go:build amd64
|
||||||
|
// +build amd64
|
||||||
|
|
||||||
|
package unibase2n
|
||||||
|
|
||||||
|
// enc16blk1 for bit 1 (actual enc128blk1)
|
||||||
|
// len(in)!=0, len(out)==len(in)*16
|
||||||
|
func enc16blk1(mask uint16, in, out []byte)
|
||||||
66
encode_amd64.s
Normal file
66
encode_amd64.s
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
//go:build amd64
|
||||||
|
// +build amd64
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
// enc16blk1(mask uint16, in, out []byte)
|
||||||
|
// for bit 1 (actual enc128blk1)
|
||||||
|
TEXT ·enc16blk1(SB), NOSPLIT, $0-56
|
||||||
|
// create mask
|
||||||
|
MOVQ ·mask+0(FP), BX
|
||||||
|
ANDQ $0xffff, BX
|
||||||
|
BSWAPQ BX
|
||||||
|
MOVQ BX, AX
|
||||||
|
SHRQ $16, AX
|
||||||
|
ORQ AX, BX
|
||||||
|
SHRQ $16, AX
|
||||||
|
ORQ AX, BX
|
||||||
|
SHRQ $16, AX
|
||||||
|
ORQ AX, BX
|
||||||
|
// load source addr
|
||||||
|
MOVQ ·in+8(FP), SI
|
||||||
|
// load source len
|
||||||
|
MOVQ ·inlen+16(FP), CX
|
||||||
|
// load dest addr
|
||||||
|
MOVQ ·out+32(FP), DI
|
||||||
|
// go forward
|
||||||
|
CLD
|
||||||
|
lop:
|
||||||
|
LODSB
|
||||||
|
// 8 -> 64
|
||||||
|
XORQ DX, DX
|
||||||
|
SHLB $1, AX
|
||||||
|
SETCS DX
|
||||||
|
SHLQ $16, DX
|
||||||
|
SHLB $1, AX
|
||||||
|
SETCS DX
|
||||||
|
SHLQ $16, DX
|
||||||
|
SHLB $1, AX
|
||||||
|
SETCS DX
|
||||||
|
SHLQ $16, DX
|
||||||
|
SHLB $1, AX
|
||||||
|
SETCS DX
|
||||||
|
// add mask
|
||||||
|
MOVQ AX, R8
|
||||||
|
LEAQ 0(DX)(BX*1), AX
|
||||||
|
BSWAPQ AX
|
||||||
|
STOSQ
|
||||||
|
// 8 -> 64
|
||||||
|
XORQ AX, AX
|
||||||
|
SHLB $1, R8
|
||||||
|
SETCS AX
|
||||||
|
SHLQ $16, AX
|
||||||
|
SHLB $1, R8
|
||||||
|
SETCS AX
|
||||||
|
SHLQ $16, AX
|
||||||
|
SHLB $1, R8
|
||||||
|
SETCS AX
|
||||||
|
SHLQ $16, AX
|
||||||
|
SHLB $1, R8
|
||||||
|
SETCS AX
|
||||||
|
// add mask
|
||||||
|
ADDQ BX, AX
|
||||||
|
BSWAPQ AX
|
||||||
|
STOSQ
|
||||||
|
LOOP lop
|
||||||
|
RET
|
||||||
23
encode_noasm.go
Normal file
23
encode_noasm.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
//go:build !amd64
|
||||||
|
// +build !amd64
|
||||||
|
|
||||||
|
package unibase2n
|
||||||
|
|
||||||
|
import "encoding/binary"
|
||||||
|
|
||||||
|
// enc16blk1 for bit 1 (actual enc128blk1)
|
||||||
|
// len(in)!=0, len(out)==len(in)*16
|
||||||
|
//go:nosplit
|
||||||
|
func enc16blk1(mask uint16, in, out []byte) {
|
||||||
|
for i, n := range in {
|
||||||
|
c := i * 16
|
||||||
|
binary.BigEndian.PutUint16(out[c:c+2], uint16(n>>7)+mask)
|
||||||
|
binary.BigEndian.PutUint16(out[c+2:c+4], uint16(n>>6&1)+mask)
|
||||||
|
binary.BigEndian.PutUint16(out[c+4:c+6], uint16(n>>5&1)+mask)
|
||||||
|
binary.BigEndian.PutUint16(out[c+6:c+8], uint16(n>>4&1)+mask)
|
||||||
|
binary.BigEndian.PutUint16(out[c+8:c+10], uint16(n>>3&1)+mask)
|
||||||
|
binary.BigEndian.PutUint16(out[c+10:c+12], uint16(n>>2&1)+mask)
|
||||||
|
binary.BigEndian.PutUint16(out[c+12:c+14], uint16(n>>1&1)+mask)
|
||||||
|
binary.BigEndian.PutUint16(out[c+14:c+16], uint16(n&1)+mask)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user