Alexey Botchkov <holyfoot@askmonty.org> 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.