2011-10-15 9 views
5

¿cómo implementa la mayoría de los compiladores las operaciones en los operandos de 64 bits (por ejemplo, int largo) en entornos de 32 bits? en otras palabras, ¿hay alguna manera de implementar estas operaciones en un solo paso o necesitamos acceder a múltiples ubicaciones de memoria para implementar estas operaciones?Operaciones en operandos de 64 bits en arquitecturas de 32 bits?

+0

o registros múltiples más bien –

Respuesta

5

Utilizan dos registros para contener un valor de 64 bits. Uno para los 32 bits inferiores y uno para los 32 bits superiores.

Para x86, 64-bit de suma/resta se realiza mediante complemento con acarreo y restar-con-prestado instrucciones:

add %eax, (lower 32-bits of operand) 
adc %edx, (upper 32-bits of operand) 

multiplicación de 64 bits es mucho más complicado, pero también hace usando una combinación de multiplicaciones de 32 bits y instrucciones add-with-carry de 32 bits. (de forma similar a una multiplicación larga con 2 dígitos)

Para cargas y almacenes, sí, dos valores de 32 bits deben cargarse/almacenarse en/desde dos registros.

De forma similar, los enteros de 128 bits se pueden implementar en hardware de 64 bits. GCC lo admite como una extensión.

+0

¿Qué sucede con los enteros de 128 bits en hardware de 32 bits (x86)? –

+1

Se pone feo. En este punto, no es muy diferente de la aritmética de precisión múltiple. Además, estaría encadenando 3 instrucciones 'adc'. (no olvides que tienes una dependencia en la bandera de acarreo que podría matar tu tubería ...) Para la multiplicación, tendrías que hacer multiplicaciones de 16 x 32 bits y un montón de 'agregar' y' adc'. .. No conozco ningún compilador que admita esto. – Mysticial

Cuestiones relacionadas