2010-10-12 10 views
7

C'est probablement une chose simple et évidente que je ne vois pas, mais comment charger une adresse dans un processeur MIPS64? Dans un processeur MIPS32 la pseudo-instruction assembleur suivante:Chargement d'une adresse dans MIPS64

la $at, LabelAddr 

se développe dans:

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

regardant le jeu d'instructions MIPS64, je vois que lui charges encore immédiate de 16 bits dans la moitié supérieure d'un mot de 32 bits. Il ne semble y avoir aucune sorte d'instruction étendue qui charge immédiatement n'importe où dans la zone supérieure d'un mot de 64 bits. Cela semble donc que pour faire l'équivalent d'un pseudo-instruction la je besoin de se développer dans le code quelque chose comme:

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] 

Cela me semble un peu ... alambiquée pour quelque chose aussi simple que le chargement une adresse donc ça me laisse convaincu que j'ai oublié quelque chose.

Qu'est-ce que j'ai oublié (si quelque chose)?

+0

Ceci est un problème commun avec les architectures RISC - PowerPC prend également un nombre similaire d'instructions pour charger une adresse immédiatement 64 bits/valeur. Vous aurez probablement besoin d'une macro pour cela. –

+0

Donc, en bref, je n'ai rien oublié. C'est en fait un peu un soulagement. –

+0

Probablement pas - il pourrait y avoir une façon un peu plus succincte de le faire sur MIPS64, donc si vous le cachez dans une macro pour l'instant, vous pouvez toujours l'améliorer plus tard. –

Répondre

3

Je pense que si vous avez besoin de charger beaucoup de constantes, vous devriez le mettre dans un pool constant (A.K.A "literal pool"), puis le charger par une instruction ld.

Par exemple: $s0 contient l'adresse de base de la piscine, et la constante que vous voulez charger est ajouter un DÉCALAGE 48, vous pouvez le charger à $t1 par l'instruction ld $t1, 48($s0)

Cette technique est très courante dans ARM, où le Les instructions peuvent seulement charger un 12 bits immédiatement. Et il est également utilisé dans Java.

Je viens de connaître MIPS32 de base donc peut-être la syntaxe d'instruction n'est pas très correcte, mais c'est l'idée.


edit: il y a un exemple here

0
adresse

il me laisse convaincu que je l'ai oublié quelque chose. Qu'est-ce que j'ai oublié (si quelque chose)?

Ce que vous manque est que même dans MIPS64 la taille de l'instruction reste 32bit (4 octets). Dans ce système d'encodage de code machine 32 bits, la combinaison 'la' traduite en 'lui' + 'ori' peut gérer une valeur maximale de 32 bits (adresse). Il n'y a pas assez de bits dans l'instruction machine 4 octets pour encoder facilement une adresse 64 bits. Pour traiter l'adresse 64 bits, plus d'itérations du même (lui + ori) sont utilisées avec les décalages (dsll).

Paxym

+0

de cette façon, vous avez besoin de 6 instructions juste pour charger une seule valeur qui est très inefficace si elle est utilisée partout –