mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-06 00:25:55 +00:00
patched in assembly routines for reference
This commit is contained in:
parent
dea21d674d
commit
89b582f498
3 changed files with 81 additions and 0 deletions
7
roaring/assembly.go
Normal file
7
roaring/assembly.go
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
package roaring
|
||||
|
||||
func hasAsm() bool
|
||||
|
||||
func BSFQ(memory uint64) int
|
||||
|
||||
func POPCNTQ(memory uint64) int
|
||||
21
roaring/assembly_amd64.s
Normal file
21
roaring/assembly_amd64.s
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
#include "textflag.h"
|
||||
|
||||
TEXT ·hasAsm(SB),4,$0
|
||||
MOVQ $1, AX
|
||||
CPUID
|
||||
SHRQ $23, CX
|
||||
ANDQ $1, CX
|
||||
MOVB CX, ret+0(FP)
|
||||
RET
|
||||
|
||||
TEXT ·POPCNTQ(SB),NOSPLIT,$0-8
|
||||
MOVQ x+0(FP), BP
|
||||
POPCNTQ BP, BX
|
||||
MOVQ BX, ret+8(FP)
|
||||
RET
|
||||
|
||||
TEXT ·BSFQ(SB),NOSPLIT,$0-8
|
||||
MOVQ x+0(FP), BP
|
||||
BSFQ BP, BX
|
||||
MOVQ BX, ret+8(FP)
|
||||
RET
|
||||
53
roaring/assembly_test.go
Normal file
53
roaring/assembly_test.go
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
package roaring
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestBSFQ(t *testing.T) {
|
||||
result := BSFQ(2)
|
||||
if result != 1 {
|
||||
t.Fatalf("BSF INCORRECT: %d", result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBSFQ_CompareGo(t *testing.T) {
|
||||
v := uint64(1)
|
||||
for i := 0; i < 64; i++ {
|
||||
if BSFQ(v) != trailingZeroN(v) {
|
||||
t.Fatalf("BSF INCORRECT: %d %d", BSFQ(v), trailingZeroN(v))
|
||||
}
|
||||
if v == 0 {
|
||||
v = 1
|
||||
} else {
|
||||
v *= 2
|
||||
}
|
||||
}
|
||||
/*
|
||||
if bsfq(0) != trailingZeroN(0) {
|
||||
fmt.Println(bsfq(0))
|
||||
t.Fatalf("BSF INCORRECT")
|
||||
}
|
||||
*/
|
||||
}
|
||||
func BenchmarkBSF(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
BSFQ(uint64(i))
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkTrailingZeroN(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
trailingZeroN(uint64(i))
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkPOPCNTQ(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
POPCNTQ(uint64(i))
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkPopcount(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
popcount(uint64(i))
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue