У меня есть этот код, который я пытаюсь работать с GCC-TDM 1.7.4-2 с использованием -msse4.2
(я попробовал msse4
) с ошибкой:Неопределенная ссылка на `__lzcnt16?
sse_lzcnt.c|7|warning: implicit declaration of function '__lzcnt16'|
sse_lzcnt.c|9|warning: too many arguments for format|
obj\Debug\sse_lzcnt.o||In function `main':|
sse_lzcnt.c|7|undefined reference to `__lzcnt16'|
неопределенная эталонным обычно ошибка связывания из-за отсутствующий файл lib (.a заканчивается), но заголовки intrinsics не нужны?
Я убедился, что заголовки intrinsics находятся в правильном каталоге include. Heres код,
#include <x86intrin.h>
#include <stdio.h>
int main()
{
unsigned short __X = 256;
unsigned short RESULT = __lzcnt16(__X);
printf("result: ", RESULT);
return 0;
}
Вы знаете, что эта инструкция AMD только, не так ли? –
@Paul R Я использую процессор AMD-8150 FX, поэтому он должен работать. Почему Intel не имеет этого? – pandoragami
Intel наконец-то добавила lzcnt (начиная с Haswell). Но для Intel и AMD lzcnt обнаруживается с использованием выделенного бита cpuid. Вот это боль. Для многих приложений команда bsr является подходящей заменой для lzcnt. Как Intel, так и AMD включили инструкцию bsr на века. Поэтому во многих случаях безопасно использовать его без какой-либо проверки cpuid. См. Это приложение для примера использования bsr вместо lzcnt: http://notabs.org/primitivepolynomials/version2/2.5/primitivepolynomials.htm. – ScottD