|
xiaocheng
发表于 2021-12-15 16:43:29
|
显示全部楼层
目前我这边正在尝试编译clickhouse,暂时遇到如下问题需要解决,望得到多方支援,以便加快进度,不甚感谢!
以下是否支持或是否有替代方案?
1,gcc 的选项 -msse4 -mpopcnt -Wno-unused-private-field -Wno-unused-local-typedef -Wno-for-loop-analysis ?
2,汇编指令:
2.1: crc相关
inline uint64 _mm_crc32_u64(uint64 crc, uint64 value)
{
asm("crc32q %[value], %[crc]\n" : [crc] "+r" (crc) : [value] "rm" (value));
return crc;
}
2.2: movdqu移动对齐相关
__asm__("movdqu %0, %%xmm0" :: "m"(sse_src_pos[-4]));
2.3:计时器相关
UInt64 rdtsc()
{
UInt64 val;
__asm__ __volatile__("rdtsc" : "=A" (val) : );
return val;
}
3,内核syscall函数: sys_futex
4,是否支持SSE ?如下函数能支持最好:
_mm_set1_epi8
_mm_loadu_si128
_mm_and_si128
_mm_xor_si128
_mm_storeu_si128
_mm_cmplt_epi8
_mm_setzero_si128
_mm_movemask_epi8
_mm_movemask_ps
_mm_cmpneq_ps
_mm_loadu_ps
_mm_store_si128
mm_is_in
__builtin_ctz
_mm_cmpestrc
_mm_setr_epi8
_mm_cmpestri
5,hash的CrapWow实现:
struct CrapWow
{
size_t operator() (CompactStringRef x) const
{
const char * key = x.data();
size_t len = x.size;
size_t seed = 0;
const UInt64 m = 0x95b47aa3355ba1a1, n = 0x8a970be7488fda55;
UInt64 hash;
// 3 = m, 4 = n
// r12 = h, r13 = k, ecx = seed, r12 = key
asm(
"leaq (%%rcx,%4), %%r13\n"
"movq %%rdx, %%r14\n"
"movq %%rcx, %%r15\n"
"movq %%rcx, %%r12\n"
"addq %%rax, %%r13\n"
"andq $0xfffffffffffffff0, %%rcx\n"
"jz QW%=\n"
"addq %%rcx, %%r14\n\n"
"negq %%rcx\n"
"XW%=:\n"
"movq %4, %%rax\n"
"mulq (%%r14,%%rcx)\n"
"xorq %%rax, %%r12\n"
"xorq %%rdx, %%r13\n"
"movq %3, %%rax\n"
"mulq 8(%%r14,%%rcx)\n"
"xorq %%rdx, %%r12\n"
"xorq %%rax, %%r13\n"
"addq $16, %%rcx\n"
"jnz XW%=\n"
"QW%=:\n"
"movq %%r15, %%rcx\n"
"andq $8, %%r15\n"
"jz B%=\n"
"movq %4, %%rax\n"
"mulq (%%r14)\n"
"addq $8, %%r14\n"
"xorq %%rax, %%r12\n"
"xorq %%rdx, %%r13\n"
"B%=:\n"
"andq $7, %%rcx\n"
"jz F%=\n"
"movq $1, %%rdx\n"
"shlq $3, %%rcx\n"
"movq %3, %%rax\n"
"shlq %%cl, %%rdx\n"
"addq $-1, %%rdx\n"
"andq (%%r14), %%rdx\n"
"mulq %%rdx\n"
"xorq %%rdx, %%r12\n"
"xorq %%rax, %%r13\n"
"F%=:\n"
"leaq (%%r13,%4), %%rax\n"
"xorq %%r12, %%rax\n"
"mulq %4\n"
"xorq %%rdx, %%rax\n"
"xorq %%r12, %%rax\n"
"xorq %%r13, %%rax\n"
: "=a"(hash), "=c"(key), "=d"(key)
: "r"(m), "r"(n), "a"(seed), "c"(len), "d"(key)
: "%r12", "%r13", "%r14", "%r15", "cc"
);
return hash;
}
};
|
|