maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #06684
Re: uint6korr optimization
Alexey Botchkov <holyfoot@xxxxxxxxxxxx> writes:
> Only question i have with this is if there's a possibility to make the
> hf_mi_uint6korr(dest,src) macro a function.
> So we can write as usual
> dest= hf_mi_uint6korr(src)
>
> Didn't find how that can nicely be done with the assembler code.
Do it like this:
static inline ulonglong
uint6korr(const void *p)
{
uint32 a= *(uint32 *)p;
uint16 b= *(uint16 *)(4+(char *)p);
return (ulonglong)a | ((ulonglong)b << 32);
}
static inline ulonglong
mi_uint6korr(const void *p)
{
uint32 a= *(uint32 *)p;
uint16 b= *(uint16 *)(4+(char *)p);
ulonglong v= ((ulonglong)a | ((ulonglong)b << 32)) << 16;
asm ("bswapq %0" : "=r" (v) : "0" (v));
return v;
}
I get:
elapsed 25 seconds on korr6-1
elapsed 31 seconds on korr6-2
elapsed 35 seconds on hf_korr6-1
elapsed 44 seconds on hf_korr6-2
elapsed 22 seconds on mi6-1
elapsed 38 seconds on mi6-2
elapsed 27 seconds on hf_mi6B-1
elapsed 42 seconds on hf_mi6-2
So they are even a bit faster than the macros.
- Kristian.
Follow ups
References