2010-10-12 7 views
7

Esto es probablemente algo simple y obvio que simplemente no veo, pero ¿cómo cargo una dirección en un procesador MIPS64? En un procesador de MIPS32 la siguiente ensamblador pseudo-instrucción:Cargando una dirección en MIPS64

la $at, LabelAddr 

se expande en:

lui $at, LabelAddr[31:16] 
ori $at,$at, LabelAddr[15:0] 

Mirando el conjunto de instrucciones MIPS64, veo que lui aún carga un 16 bits inmediata en la mitad superior de una palabra de 32 bits. No parece haber ningún tipo de instrucción expandida que cargue un inmediato en cualquier lugar en el área superior de una palabra de 64 bits. Esto parece, entonces, que para hacer el equivalente de un pseudo-instrucción la que había necesidad de ampliar en un código algo como:

lui $at, LabelAddr[63:48] 
ori $at, $at, LabelAddr[47:32] 
sll $at, 16 
ori $at, $at, LabelAddr[31:16] 
sll $at, 16 
ori $at, $at, LabelAddr[15:0] 

Esto me parece un poco complicado ... por algo tan básico como la carga una dirección por lo que me deja convencido de que he pasado por alto algo.

¿Qué es lo que he pasado por alto (si acaso)?

+0

Este es un problema común con las arquitecturas RISC - PowerPC también tiene un número similar de instrucciones para cargar un 64 bits inmediata dirección/valor. Probablemente quieras una macro para esto. –

+0

Entonces, en resumen, no he pasado por alto nada. Eso es realmente un alivio. –

+0

Probablemente no; puede haber una manera un poco más sucinta de hacerlo en MIPS64, por lo que si lo oculta en una macro por ahora, siempre puede mejorarlo más adelante. –

Respuesta

3

Creo que si necesita cargar muchas constantes, debe ponerlo en un conjunto constante (A.K.A "literal pool") y luego cargarlo mediante instrucciones ld.

Por ejemplo: $s0 contiene la dirección base de la piscina, y la constante que desea cargar es añadir desplazamiento 48, puede cargarla a $t1 por la instrucción ld $t1, 48($s0)

Esta técnica es muy común en ARM, donde el las instrucciones solo pueden cargar un bit de 12 inmediatamente. Y también se usa en Java.

Simplemente conozco MIPS32 básico así que puede ser que la sintaxis de la instrucción no sea muy correcta, pero esa es la idea.


edición: hay un ejemplo here

0

dirección de lo que me deja convencido de que he pasado por alto algo. ¿Qué es lo que he pasado por alto (en todo caso)?

Lo que se echa en falta es que incluso en mips64 el tamaño de instrucciones de 32 bits (permanece 4bytes). En este sistema de codificación de código de máquina de 32 bits, la combinación 'la' traducida a 'lui' + 'ori' puede manejar un máximo de 32 bit de valor (dirección). No hay suficientes bits en la instrucción de la máquina de 4 bytes para codificar fácilmente una dirección de 64 bits. Para manejar la dirección de 64 bits, se utilizan más iteraciones de la misma (lui + ori) junto con los cambios (dsll).

Paxym

+0

de esa manera necesitas 6 instrucciones solo para cargar un solo valor que es muy ineficiente si se usa en todas partes –

Cuestiones relacionadas