jestem programowania następuje:Dlaczego kompilator zmienia movq na movd podczas wykonywania operacji 64-bitowych?
__asm__ volatile ("movq %%rax, %%mm1\n"
"movq %%rcx, %%mm2\n"
: : "a" (0xDEADBEEFDEADBEEF), "c" (0xBADFACE5BADFACE5));
W tym przypadku, mam przesunięcie wartości od Rax do MM1 których oba są 64b rejestry (Moving wartość qword z jednego rejestru do drugiego). Ale kiedy mogę skompilować mój kod widzę:
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 ??
jestem kompilowanie mojego kodu w trybie 64-bitowym, nie jestem pewien, dlaczego to się zmienia operację 64bit 32bit do.
Więc pomimo posiadania "movd" między dwoma rejestrami 64b, czy nadal będzie on robić mov 64b? – mareiou
Gdy operand docelowy ma 64 bity movd skopiuje wszystkie 64 bity z rejestru, jeśli ma 64 bity. W przeciwnym razie, jeśli rejestr ma 32 bity, rozszerzy go o zera. Jest użyteczne odniesienie tutaj: http://x86.renejeschke.de/html/file_module_x86_id_181.html – Alexguitar
Tak, tak, movd zrobi 64b mov w razie potrzeby. – Alexguitar