{ **** UBPFD *********** by delphibase.endimus.com ****
>> Определение поддержки SSE2
Зависимости: Types
Автор: Gua, gua@ukr.net, ICQ:141585495, Simferopol
Copyright: Unknown
Дата: 17 июля 2002 г.
***************************************************** }function CheckSSE2: Boolean;
var
TempCheck: dword;
begin
TempCheck := 1;
asm
push ebx
mov eax,1
db $0F,$A2
test edx,$4000000
jz @NOSSE2
mov edx,0
mov TempCheck,edx
@NOSSE2:
pop ebx
end;
CheckSSE2 := (TempCheck = 0);
end;
Here's the translation of the text into Russian:
Код на языке Delphi!
Функция CheckSSE2 определяет, поддерживает ли процессор инструкции SSE2. Вот что она делает:
1. Функция объявляет локальную переменную TempCheck типа dword, которая является неотрицательным 32-разрядным целым числом.
2. В блоке asm код pushes значение ebx на стек и устанавливает eax в 1.
3. Затем код выполняет инструкцию db $0F,$A2, которая является байтовой кодировкой SSE2-инструкции (опкод для SSE2-инструкции movdqa).
4. Код затем проверяет, установлен ли высокий бит ($4000000) регистра edx с помощью инструкции test. Если он не установлен, процессор не поддерживает SSE2.
5. Если процессор поддерживает SSE2, код устанавливает edx в 0 и хранит это значение в локальной переменной TempCheck. В противном случае, код прыгает к метке @NOSSE2.
6. Код затем pop-ifies значение ebx из стека с помощью инструкции pop ebx.
7. Наконец, функция возвращает булевое значение, указывающее, поддерживает ли SSE2 или нет, основываясь на значении, хранящемся в TempCheck.
Логика здесь заключается в том, что если процессор поддерживает SSE2, он будет выполнять инструкцию movdqa правильно и устанавливать высокий бит edx. Если не поддерживает SSE2, инструкция будет фальтироваться, и тест будет проваливаться. Функция возвращает True, если SSE2 поддерживается, или False, если нет.
Код это умелый способ определения возможностей процессора с помощью inline-ассембли кода. Интересно отметить, что этот код был написан в 2002 году!
Альтернативное решение может быть использование функции GetCPUInfo из единицы SysUtils в Delphi, которая предоставляет более детальную информацию о процессоре, включая его поддержку инструкций SSE2. Например:
function CheckSSE2: Boolean;
begin
Result := GetCPUInfo(CPUID_SSE2) = CPUID_SSE2_SUPPORTED;
end;
Эта APPROACH более прямолинейна и легче в обслуживании, чем использование inline-ассембли кода, но требует Delphi 2007 или поздних версий.
В статье описывается функция CheckSSE2 на языке Delphi, которая определяет поддержку SSE2 в системе и возвращает результат в виде булевого значения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS