add fnv1a example
This commit is contained in:
41
examples/fnv1a/asm.go
Normal file
41
examples/fnv1a/asm.go
Normal file
@@ -0,0 +1,41 @@
|
||||
// +build ignore
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
. "github.com/mmcloughlin/avo/build"
|
||||
"github.com/mmcloughlin/avo/operand"
|
||||
"github.com/mmcloughlin/avo/reg"
|
||||
)
|
||||
|
||||
const (
|
||||
OffsetBasis = 0xcbf29ce484222325
|
||||
Prime = 0x100000001b3
|
||||
)
|
||||
|
||||
func main() {
|
||||
TEXT("Hash64", "func(data []byte) uint64")
|
||||
ptr := Load(Param("data").Base(), GP64v())
|
||||
n := Load(Param("data").Len(), GP64v())
|
||||
|
||||
h := reg.RAX
|
||||
MOVQ(operand.Imm(OffsetBasis), h)
|
||||
p := GP64v()
|
||||
MOVQ(operand.Imm(Prime), p)
|
||||
|
||||
LABEL("loop")
|
||||
CMPQ(n, operand.Imm(0))
|
||||
JE(operand.LabelRef("done"))
|
||||
b := GP64v()
|
||||
MOVBQZX(operand.Mem{Base: ptr}, b)
|
||||
XORQ(b, h)
|
||||
MULQ(p)
|
||||
INCQ(ptr)
|
||||
DECQ(n)
|
||||
|
||||
JMP(operand.LabelRef("loop"))
|
||||
LABEL("done")
|
||||
Store(h, ReturnIndex(0))
|
||||
RET()
|
||||
Generate()
|
||||
}
|
||||
Reference in New Issue
Block a user