2015-08-05 11 views
5

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.

risposta

4

Da this Bugzilla:

Questo è fatto apposta per garantire la compatibilità in quanto vmovq non è nelle specifiche x86-64 originale e assemblatori anziani non lo supportano. Da i386-opc.tbl in binutils:

Queste realtà non dovrebbe consentono Reg64 (movq è il mnemonico giusto per copia tra Reg64/Mem64 e RegXMM/RegMMX, come viene mandato specifiche di Intel). Le specifiche di AMD, essendo esistite per molto più tempo, non sono riuscite a riconoscerlo e hanno specificato movd per operazioni a 32 e 64 bit .

vmovd in realtà non dovrebbe consentire a 64 bit operando (vmovq è il diritto mnemonico per la copia tra Reg64/Mem64 e RegXMM, come è mandato Intel AVX spec). Per evitare template extra nel backend gcc x86 e nell'assembler di supporto per AMD64, accettiamo operando a 64 bit su vmovd in modo che possiamo utilizzare un modello per entrambe le istruzioni SSE e AVX.

+0

Quindi, nonostante abbia un "movd" tra due registri 64b, farà ancora un mov 64b? – mareiou

+0

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

+0

Quindi sì, movd farà un mov 64b dove appropriato. – Alexguitar

0

Nonostante la segnalazione di bug collegata, non riesco a riprodurre.

ho testato gcc 4.4 se 4.9, con vari livelli di ottimizzazione:

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

In tutti i casi, il file risultante x.s conteneva solo movq, non movd.

+0

Questo in realtà non risponde alla domanda. Ad ogni modo, non è chiaro dalla domanda, ma sta parlando di ciò che vede dopo aver disassemblato l'oggetto o l'eseguibile generato dal compilatore. –