2015-08-05 6 views
5

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.

Odpowiedz

4

Od this Bugzilla:

Odbywa się to na celu zapewnienie kompatybilności wstecznej od vmovq nie jest w oryginalnym x86-64 specyfikacji i starsze monterzy nie obsługuje. Od i386-opc.tbl w binutils:

To naprawdę nie powinno pozwolić na Reg64 (MOVQ jest prawo pamięciowy dla kopiowania pomiędzy Reg64/Mem64 i RegXMM/RegMMX, co jest nakazane przez specyfikacji Intela). Specyfikacja AMD, która istniała znacznie dłużej, nie rozpoznała tego i określiła movd dla operacji 32- i 64-bitowych .

vmovd naprawdę nie powinny pozwalać na 64-bitowego operandu (vmovq jest prawo pamięciowy do kopiowania pomiędzy Reg64/Mem64 i RegXMM, co jest nakazane przez Intel AVX specyfikacji). Aby uniknąć dodatkowego szablonu w backend gcc x86 i asemblera obsługującego AMD64, akceptujemy 64-bitowy operand na vmovd, dzięki czemu możemy użyć jednego szablonu dla instrukcji SSE i AVX.

+0

Więc pomimo posiadania "movd" między dwoma rejestrami 64b, czy nadal będzie on robić mov 64b? – mareiou

+0

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

+0

Tak, tak, movd zrobi 64b mov w razie potrzeby. – Alexguitar

0

Pomimo powiązanego raportu o błędzie, nie mogę odtworzyć.

Testowałem gcc 4.4 chociaż 4,9, z różnymi poziomami optymalizacyjnych:

x86_64-linux-gnu-gcc-$VERSION $OPTIMIZATION -S -o x.s x.c 

We wszystkich przypadkach otrzymany x.s plik zawierał tylko movq, nie movd.

+0

To tak naprawdę nie odpowiada na pytanie. Tak czy inaczej, nie wynika to z pytania, ale mówi o tym, co widzi po demontażu obiektu lub pliku wykonywalnego generowanego przez kompilator. –

Powiązane problemy