← Back to team overview

maria-developers team mailing list archive

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