Цитата(VladislavS @ Aug 31 2017, 06:58)

Могли бы показать пример кода, где вы CLZ применяете?
Правда, интересно глянуть.
А какой смысл? Вы считаете, что сможете вот так прям показать как обойтись без CLZ?
Видимо разработчики ARM-архитектуры всё-таки считают, что CLZ нужна раз ввели её.
Что-ж... Например в текущем проекте:
1. Во всех местах, где нужно преобразование IP-адреса и маски подсети из формата типа 192.168.1.x/255.255.255.0 в упакованный формат 192.168.1.x/24.
Код
if (!(j = ReverseByteOrder(JReadIP(member)))) break;
j1 = CntLeadingZeros(ReverseBitOrder(j));
if (j1 < 2 || ~j >> j1) break;
cfgMain.enet.mask = j1;
2. В местах, где нужно преобразовать битовую карту в список значений:
Код
do {
addr = 31 - CntLeadingZeros(addrMap);
WriteNum(&addr, JSON_T_NUM8U);
} while (addrMap -= 1 << addr);
3. В распаковщике сжатого битового потока:
Код
u16fast TinfData::ReadBits(u8fast n)
{
u32 i, i0, i1 = tag;
if (!(i0 = i1 >> n)) {
i = 31 - CntLeadingZeros(i1);
u32p8 const *p, *p1 = (u32p8 const *)srcCur;
if ((u32)(p = p1 + 1) > (u32)srcEnd) TinfFault(ERR_OVERFLOW_SRC);
srcCur = (u8 const *)p;
i1 += (i0 = *p1) - 1 << i;
i0 = (i0 >> 1) + B31;
i0 >>= n - i - 1;
}
tag = i0;
return i1 - (i0 << n);
}
4. В API разных служб, которые принимают и фиксируют клиентские запросы (в битовой карте) и впоследствии их обрабатывают по мере освобождения службы и в порядке приоритета.
Итого - в десятке мест.
в хидерах:
#define CntLeadingZeros() __CLZ()
#define ReverseBitOrder() __RBIT()
В другом проекте есть например использование CLZ при распарсивании UTF-8 кодировки принимаемой с терминала:
Код
while ((int)(c = TermGetChar(tout)) >= 0) {
do {
if (PARSE_UTF8_DEF && (c & B7)) {
//преобразование UTF-8 в Win1251
u32 cc = (u32)c << 25;
if (j = CntLeadingZeros(~cc)) {
if (j > 5 || state != S_NONE) return HEsc_ERROR;
cnt = j;
j += 26;
arg = c << j >> j;
state = S_UTF8;
} else {
if (state != S_UTF8) return HEsc_ERROR;
arg = arg << 6 | cc >> 25;
if (--cnt) continue;
c = (cc = arg - 0x410) + 0xC0;
if (cc > (uint)'я' - (uint)'А') {
c = 'Ё';
if (cc += 0x410u - 0x401u) {
c = 'ё';
if (cc += 0x401u - 0x451u) return HEsc_SKIP;
}
}
state = S_INIT;
return (HEsc)c;
}
} else if ((c & 0x7F) == 0x1B) {
...