LINUX.ORG.RU

Asm и инструкции процессора


0

0

пишу программу которая определяет наличие AVX инструкции

bool is_set_N_bit_in_ECX(int bit)
{
bool result;
register long long a asm («eax») = 1;
register long long b asm («ebx») = 0;
register long long c asm («ecx») = 0;
register long long d asm («edx») = 0;
asm («cpuid»);
if ((c & (1 << bit)) >> bit == 1)
result = true;
else
result = false;
return result;
}

при компиляции выдается такое:
In static member function ‘static bool is_set_N_bit_in_ECX(int)’:
ошибка: не найден регистр класса ‘CREG’ для выталкивания в память
ошибка: это RTL-инструкция:
(insn 13 12 14 2 file.cpp:54 (parallel [
(set (reg:SI 0 ax [orig:58 D.23638 ] [58])
(ashift:SI (reg:SI 1 dx [66])
(subreg:QI (reg:SI 0 ax [65]) 0)))
(clobber (reg:CC 17 flags))
]) 493 {*ashlsi3_1} (expr_list:REG_DEAD (reg:SI 1 dx [66])
(expr_list:REG_DEAD (reg:SI 0 ax [65])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil)))))

что не так написал ?


>long long

С чего вдруг, когда там 4 байта?

anon_666
()

Вот так работает:

int is_set_N_bit_in_ECX(int bit) 
{ 
int _ecx; 

register long long a asm ("eax") = 1; 
register long long b asm ("ebx") = 0; 
register long long c asm ("ecx") = 0; 
register long long d asm ("edx") = 0; 

asm ("cpuid"); 
_ecx = c;

return ((_ecx & (1 << bit)) >> bit); 
}
>ошибка: не найден регистр класса ‘CREG’ для выталкивания в память
Он не может ассемблировать ваш код, лучше сделайте так:
int is_set_N_bit_in_ECX(int bit) 
{ 
int func = 1, _eax, _edx, _ecx; 
 
asm ("cpuid" : "=eax" (_eax), "=edx" (_edx), "=ecx" (_ecx) : "eax" (func)); 
 
return ((_ecx & (1 << bit)) >> bit); 
}

anon_666
()
Ответ на: комментарий от anon_666

большое спасибо !все заработало:
правильный ответ такой:

bool result;
register int a asm («eax») = 1;
register int b asm («ebx») = 0;
register int c asm («ecx») = 0;
register int d asm («edx») = 0;
asm («cpuid»);

if ((c >> bit & 1) == 1)
result = true;
else
result = false;

return result;

AoD314
() автор топика
Ответ на: комментарий от AoD314

запись !предикат в логике означает отрицание предиката. Все в порядке, просто опечатка как бы меняет смысл фразы на противоположный.

amomymous ★★★
()
Ответ на: комментарий от anon_666

Опять соврал, правильный код:

asm ("cpuid" : "=a" (_eax), "=b" (_ebx), "=c" (_ecx), "=d" (_edx) : "a" (func));
Подзабыл синтаксис..

anon_666
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.