Files
avo/examples/geohash
Michael McLoughlin 475a241446 operand: include '+0' in named symbol references
Intended to address an asmdecl error.

  [amd64] Butterfly: use of unnamed argument 0(FP); offset 0 is x0+0(FP)

Updates #24
2019-01-13 12:00:57 -08:00
..
2019-01-06 20:04:51 -08:00
2018-12-27 23:09:44 -08:00

geohash

Integer geohash encoding.

Refer to "Geohash in Golang Assembly" for implementation details.

func main() {
	TEXT("EncodeInt", NOSPLIT, "func(lat, lng float64) uint64")
	Doc("EncodeInt computes the 64-bit integer geohash of (lat, lng).")
	lat := Load(Param("lat"), XMM())
	lng := Load(Param("lng"), XMM())

	MULSD(ConstData("reciprocal180", F64(1/180.0)), lat)
	onepointfive := ConstData("onepointfive", F64(1.5))
	ADDSD(onepointfive, lat)

	MULSD(ConstData("reciprocal360", F64(1/360.0)), lng)
	ADDSD(onepointfive, lng)

	lngi, lati := GP64(), GP64()
	MOVQ(lat, lati)
	SHRQ(U8(20), lati)
	MOVQ(lng, lngi)
	SHRQ(U8(20), lngi)

	mask := ConstData("mask", U64(0x5555555555555555))
	ghsh := GP64()
	PDEPQ(mask, lati, ghsh)
	temp := GP64()
	PDEPQ(mask, lngi, temp)
	SHLQ(U8(1), temp)
	XORQ(temp, ghsh)

	Store(ghsh, ReturnIndex(0))
	RET()

	Generate()
}