sto programmando il seguente:Perché il compilatore cambia movq in movd quando esegue operazioni a 64 bit?
__asm__ volatile ("movq %%rax, %%mm1\n"
"movq %%rcx, %%mm2\n"
: : "a" (0xDEADBEEFDEADBEEF), "c" (0xBADFACE5BADFACE5));
In questo caso, sto spostando il valore da rax a MM1 cui entrambi sono 64b registri (spostano un valore QWORD da un registro all'altro). Ma quando compilo il mio codice vedo:
mov rax, 0xDEADBEEFDEADBEEF
mov rcx, 0xBADFACE5BADFACE5
movd mm1, rax <-------------- Why it is doing a dword operation ??
movd mm2, rcx <-------------- Why it is doing a dword operation ??
sto la compilazione il mio codice in modalità a 64 bit, non sono sicuro perché sta cambiando un'operazione a 64 bit ad una a 32 bit.
Quindi, nonostante abbia un "movd" tra due registri 64b, farà ancora un mov 64b? – mareiou
Quando l'operando di destinazione è 64 bit, movd copia tutti i 64 bit dal registro se è a 64 bit. Altrimenti se il registro è a 32 bit lo estenderà con zero. C'è un riferimento utile qui: http://x86.renejeschke.de/html/file_module_x86_id_181.html – Alexguitar
Quindi sì, movd farà un mov 64b dove appropriato. – Alexguitar