MSVC 17.9 и POPCNT
От: nodir.temir https://github.com/tnodir
Дата: 20.02.24 16:09
Оценка:
Сперва использовал такой код:
int bitCount(quint32 u)
{
    return __popcnt(u);
}


Но т.к. POPCNT не поддерживается процессором Core 2 Duo, то заменил на:
int bitCount(quint32 u)
{
    u = u - ((u >> 1) & 0x55555555);
    u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
    return ((u + (u >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
}


Недавно обновил MSVC на 17.9 и обнаружил, что код из bitCount() начал автоматически заменяться на POPCNT.

Заменил теперь на:
int bitCount(quint32 u)
{
    const quint32 uCount = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111);
    return ((uCount + (uCount >> 3)) & 030707070707) % 63;
}


Как можно обезопаситься на будущее, чтобы и этот код не был заменён на POPCNT?
msvc popcnt
Re: MSVC 17.9 и POPCNT
От: Alekzander Россия  
Дата: 21.02.24 09:17
Оценка:
Здравствуйте, nodir.temir, Вы писали:

NT>Как можно обезопаситься на будущее, чтобы и этот код не был заменён на POPCNT?


Четыре обращения к таблице? Или два.
Re: MSVC 17.9 и POPCNT
От: nodir.temir https://github.com/tnodir
Дата: 21.02.24 09:20
Оценка:
NT>Как можно обезопаситься на будущее, чтобы и этот код не был заменён на POPCNT?

Вроде починят в MSVC 17.9.1: https://developercommunity.visualstudio.com/t/Illegal-Instruction-POPCNT-emitted-in-MS/10576397?space=8&q=cpu&sort=newest
Re: MSVC 17.9 и POPCNT
От: CreatorCray  
Дата: 21.02.24 09:49
Оценка:
Здравствуйте, nodir.temir, Вы писали:

NT>Как можно обезопаситься на будущее, чтобы и этот код не был заменён на POPCNT?

Скомпиляй себе один раз функцию как тебе надо в отдельный lib и прилинковывай его.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: MSVC 17.9 и POPCNT
От: nodir.temir https://github.com/tnodir
Дата: 21.02.24 09:51
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, nodir.temir, Вы писали:


NT>>Как можно обезопаситься на будущее, чтобы и этот код не был заменён на POPCNT?

CC>Скомпиляй себе один раз функцию как тебе надо в отдельный lib и прилинковывай его.

Я собираю Qt из исходников. Там тоже используется POPCNT.
Re[3]: MSVC 17.9 и POPCNT
От: CreatorCray  
Дата: 21.02.24 21:13
Оценка:
Здравствуйте, nodir.temir, Вы писали:

NT>Я собираю Qt из исходников. Там тоже используется POPCNT.

Пропатчи (тупо search-n-replace или через define) сурсы перед сборкой чтоб использовалось своё название и будет слинковано то, что надо
Ну или жди пока пофиксят компилер.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: MSVC 17.9 и POPCNT
От: nodir.temir https://github.com/tnodir
Дата: 22.02.24 06:42
Оценка:
https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-notes#1791--visual-studio-2022-version-1791
"Fixed a bug where the libconcrt.lib used when static linking could contain an SSE 4.2 instruction that was illegal on older X64 systems."
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.