2010-10-12 7 views
7

Questa è probabilmente una cosa semplice e ovvia che non vedo, ma come caricare un indirizzo in un processore MIPS64? In un processore MIPS32 seguente assemblatore pseudo-istruzione:Caricamento di un indirizzo in MIPS64

la $at, LabelAddr 

espande in:

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

Guardando il set di istruzioni MIPS64, vedo che lui carichi ancora a 16 bit immediato nella metà superiore di una parola a 32 bit. Non sembra esserci alcun tipo di istruzione espansa che carichi un'immediata ovunque nell'area superiore di una parola a 64 bit. Questo sembra, dunque, che per fare l'equivalente di un la pseudo-istruzioni che avevo bisogno di espandersi in codice di qualcosa di simile:

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] 

Questo mi sembra un po '... contorto per qualcosa di così fondamentale come il caricamento un indirizzo quindi mi lascia convinto di aver trascurato qualcosa.

Che cosa ho trascurato (semmai)?

+0

Questo è un problema comune con architetture RISC - PowerPC prende anche un numero simile di istruzioni per caricare un 64 bit immediato indirizzo/valore. Probabilmente vorrai una macro per questo. –

+0

Quindi, in breve, non ho davvero trascurato nulla. Questo è in realtà un po 'di sollievo. –

+0

Probabilmente no - potrebbe esserci un modo leggermente più succinto di farlo su MIPS64 quindi se lo nascondi in una macro per ora puoi sempre migliorarlo in seguito. –

risposta

3

Penso che se è necessario caricare molte costanti, è necessario inserirlo in un pool costante (A.K.A "literal pool") e quindi caricarlo con istruzioni Ld.

Per esempio: $s0 contiene l'indirizzo di base della piscina, e la costante che si desidera caricare aggiuntivo di offset 48, è possibile caricare al $t1 dall'istruzione ld $t1, 48($s0)

Questa tecnica è molto comune in ARM, dove la le istruzioni possono caricare solo un 12 bit immediato. Ed è anche usato in Java.

Conosco semplicemente MIPS32 di base, quindi la sintassi delle istruzioni potrebbe non essere corretta, ma questa è l'idea.


edit: c'è un esempio here

0

indirizzo in modo che lascia mi ha convinto che ho trascurato qualcosa. Che cosa ho trascurato (semmai)?

Cosa vi manca è che anche in MIPS64 la dimensione di istruzioni rimane a 32 bit (4bytes). In questo sistema di codifica a codice a 32 bit, la combinazione 'la' tradotta in 'lui' + 'ori' può gestire un valore massimo di 32 bit (indirizzo). Non ci sono abbastanza bit nell'istruzione 4byte per codificare facilmente un indirizzo a 64 bit. Per gestire l'indirizzo a 64 bit, vengono utilizzate più iterazioni dello stesso (lui + ori) insieme a turni (dsll).

Paxym

+0

in questo modo hai bisogno di 6 istruzioni solo per caricare un singolo valore che è molto inefficiente se usato ovunque –