2015-11-30 3 views
2

Я читал Linux/arch/tile/lib/strlen_32.c, чтобы узнать о достижении strlen_32. Однако я встретил два macro с именем __insn_seqb и __insn_ctz, которые я не знал смысла. Функция strlen_32 ниже:Что означают __insn_seqb() и __insn_ctz?

size_t strlen(const char*s) 
{ 
    const uintptr_t s_int = (uintptr_t)s; 
    const uint32_t *p = (const uint32_t*)(s_int&-4); 
    uint32_t v = *p | ((1<<(s_int<<3))-1); 
    uint32_t bits; 
    while((bits=__insn_seqb(v,0))==0) 
     v = *++p; 
    return ((const char*)p)+(__insn_ctz(bits)>>3)-s; 
} 

Я искал их на Google, но только нашел другое определение макроса: #define CFZ(x) __insn_ctz(x) в string_endian.hglib-ports string-endian.h Может кто-нибудь сказать мне, где ясно определение или реальное значение и использование этих двух макросы?

+0

Он связан с обработкой четырех байтов строки одновременно. –

+0

Все эти танцы из-за несвязанного доступа к данным. Не все архитектуры могут это сделать. В современном ядре для этого есть помощник 'get_unaligned()'. С другой стороны, влияние производительности может быть заметно при работе с строками при максимальной ширине шины данных. См. Например, 'strscpy()' реализация. – 0andriy

ответ

3

Они, по-видимому, являются инструктивными для Tilera processors.

Я бы предположил, что __insn_ctz является инструкцией "count trailing zeroes".

__insn_seqb, похоже, тестирует 0 байт в 4-байтовом слове.

Инструкция Tilera, по-видимому, somewhat similar to MIPS.

Смежные вопросы