Event JSON
{
"id": "553d151c3b8f659a9795213f86b3fd64e29a32d02f72939e98197ddaa6d4565b",
"pubkey": "91bea5cd9361504c409aaf459516988f68a2fcd482762fd969a7cdc71df4451c",
"created_at": 1745840038,
"kind": 1050,
"tags": [
[
"filename",
"asm_arm64.s"
],
[
"client",
"nosbin"
]
],
"content": "// +build arm64\n\n#include \"textflag.h\"\n\n// func EncodeInt(lat, lng float64) uint64\nTEXT ·EncodeInt(SB), NOSPLIT, $0-24\n // Verifica se devemos usar o assembly\n LDRB R0, ·useAsm(SB)\n CMP R0, #1\n BNE fallback\n\n // Definições\n#define V_LATLNG V0 // vetor com lat, lng\n#define V_SCALE V1 // vetor com fatores de escala\n#define V_ADD V2 // vetor com fatores de adição\n#define V_TMP V3\n#define V_INT V4\n\n // Carrega lat e lng para V0 (D0 e D1)\n LDR D0, lat+0(FP)\n LDR D1, lng+8(FP)\n\n // Prepara os vetores escala e soma\n MOVI V1.2D, #0\n FMOV D2, #0.005555555555555556\n INS V1.D[0], D2\n FMOV D2, #0.002777777777777778\n INS V1.D[1], D2\n\n MOVI V2.2D, #0\n FMOV D3, #1.5\n INS V2.D[0], D3\n INS V2.D[1], D3\n\n // Multiplica lat/lng por fator de escala\n FMUL V0.2D, V0.2D, V1.2D\n\n // Soma fator de adição\n FADD V0.2D, V0.2D, V2.2D\n\n // Converte para inteiros\n FCVTZS V4.2D, V0.2D\n\n // Agora R1 = LATI, R2 = LNGI\n MOV R1, V4.D[0]\n MOV R2, V4.D[1]\n\n // Shift right 20 bits\n LSR R1, R1, #20\n LSR R2, R2, #20\n\n // Agora vamos entrelaçar os bits de forma manual\n // (Interleaving bits entre LATI e LNGI)\n\n MOV R3, R1\n MOV R4, R2\n\n // Entrelaçamento manual\n MOV R5, $0\n MOV R6, $0\n MOV R7, $0\n MOV R8, $0\n\n // Loop de intercalamento dos bits (não muito bonito mas eficiente)\n MOV R9, $0\ninterleave_loop:\n CMP R9, #32\n BGE interleave_done\n\n // Pega 1 bit de LATI\n ANDS R10, R3, $1\n LSL R10, R10, R9\n ORR R5, R5, R10\n\n // Pega 1 bit de LNGI\n ANDS R10, R4, $1\n LSL R10, R10, R9\n LSL R10, R10, #1\n ORR R6, R6, R10\n\n // Avança bits\n LSR R3, R3, #1\n LSR R4, R4, #1\n ADD R9, R9, #2\n B interleave_loop\n\ninterleave_done:\n // Resultado\n EOR R0, R5, R6\n\n // Salva\n STR R0, ret+16(FP)\n RET\n\nfallback:\n B ·encodeInt(SB)",
"sig": "513aafbad0752c653d823e289e3101daaff5986ed1af07a847e60915470433e638174206942e337e5c2f98798fceb1e2fb0816c278bb547af2cbadcbb96e33f9"
}