Istruzioni MIPS per floating point Coprocessore per floating point
by user
Comments
Transcript
Istruzioni MIPS per floating point Coprocessore per floating point
Istruzioni MIPS per floating point
Architetture dei Calcolatori
(lettere A-I)
Coprocessore per floating point
• L’architettura MIPS ha un coprocessore (indicato con
il numero 1) che opera sui numeri in virgola a mobile
a singola e doppia precisione
• 32 registri $f0…$f31 (ciascuno da 32 bit) che sono
dedicati per la rappresentazione in virgola mobile
• Problema: i registri $f0…$f31 hanno dimensione pari
a 32 bit: come fare per rappresentare i numeri a
precisione doppia che richiedono 64 bit?
– Convenzione: si usano i registri a coppie pari/dispari
– Esempio: la coppia di registri $f0 $f1 è usata per contenere il
valore di un numero a precisione doppia
– Per le operazioni a singola precisione si possono usare
soltanto i registri pari $f0, $f2, …, $f30
Architetture dei Calcolatori 2004/05
Valeria Cardellini
1
1
Istruzioni aritmetiche in virgola mobile
• Doppia versione delle istruzioni in virgola mobile
– a precisione singola: rappresentazione a 32 bit
• Nome_istruzione.s
– a precisione doppia: rappresentazione a 64 bit
• Nome_istruzione.d
• Addizione floating point
– add.s e add.d
– Esempio: add.s $f2, $f4, $f6
• Sottrazione floating point
– sub.s e sub.d
– Esempio: sub.d $f2, $f4, $f6
• Moltiplicazione floating point
– mul.s e mul.d
– Esempio: mul.s $f2, $f4, $f6
• Divisione floating point
– div.s e div.d
Architetture dei Calcolatori 2004/05
Valeria Cardellini
2
Istruzioni di confronto e branch
in virgola mobile
• Istruzioni di confronto
– Precisione singola: c.x.s
– Precisione doppia: c.x.d
– x può essere pari a
• eq (equal), neq (not equal)
• lt (less than), le (less than or equal)
• gt (greater than), ge (greater than or equal)
– L’istruzione di confronto pone un flag di condizione (bit) pari a
vero o falso; una successiva istruzione di branch permette di
saltare in base al valore del flag
• Istruzioni di branch
– branch true: bc1t
– branch false: bc1f
– Esempio:
c.lt.s $f2, $f4
bc1t L1
# salta a L1 se $f2 < $f4
Architetture dei Calcolatori 2004/05
Valeria Cardellini
3
2
Istruzioni di load/store
• Per caricare un valore dalla memoria in un registro
floating point e memorizzare il valore di un registro
floating point in memoria
– Per load: istruzione lwc1
– Per store: istruzione swc1
• Esempio
– Frammento di codice assembler per caricare dalla memoria
due numeri a precisione singola (quindi 32 bit), sommarli e
memorizzare il risultato
lwc1
$f4, 0($t0)
lwc1
$f6, 4($t0)
add.s
$f2, $f4, $f6
swc1
$f2, 8($t0)
Architetture dei Calcolatori 2004/05
Valeria Cardellini
4
Esempio 1
• Procedura per la conversione da gradi Fahrenheit a
gradi Celsius
• Codice C:
float f2c (float fahr)
{
return ((5.0/9.0) * (fahr - 32.0));
}
• Per passare parametri floating point si usano i registri
$f12-$f15
• Per passare il risultato della procedura si usano i registri
$f0-$f1
• I registri $f0-$f31 devono essere salvati dalla procedura
chiamata (stessa convenzione usata per $s0-$s7)
Architetture dei Calcolatori 2004/05
Valeria Cardellini
5
3
Esempio 1 (2)
• fahr in $f12, celsius in $f0
• Costante 5.0 in const5, 9.0 in const9, 32.0 in const32
• Codice assembler MIPS:
f2c:
l.s
$f16, const5
l.s
$f18, const9
div.s
$f16, $f16, $f18
l.s
$f18, const32
sub.s
$f18, $f12, $f18
mul.s
$f0, $f16, $f18
jr
$ra
# $f16=5.0/9.0
# $f18=fahr-32.0
Architetture dei Calcolatori 2004/05
Valeria Cardellini
6
Esempio 2
• Procedura per calcolare il prodotto scalare tra due
vettori float a e b di dimensione n
• Codice C: float DotProd(int n, float *a, float *b)
{
int i;
float result=0.;
for (i=0; i<n; i++)
result += a[i]*b[i];
return result;
}
• Assunzioni: n in $a0, indirizzo base dei vettori a e b
in $a1 e $a2 rispettivamente (attenzione: l’indirizzo di
memoria è un intero!)
Architetture dei Calcolatori 2004/05
Valeria Cardellini
7
4
Esempio 2 (2)
• Codice assembler MIPS:
DotProd:
loop:
endloop:
mtc1
$zero, $f0
# Trasferisce $zero in $f0
slt
$t0, $a0, $zero # if (n <= 0) endloop
beq
$t0, $zero, endloop
sll
$a0, $a0, 2
add
$a0, $a1, $a0
lwc1
$f2, 0($a1)
# Carica a[i]
lwc1
$f4, 0($a2)
# Carica b[i]
mul.s
$f6, $f2, $f4
# Moltiplica a[i] per b[i]
add.s
$f0, $f0, $f6
# Aggiungi a[i]*b[i] a result ($f0)
addi
$a1, $a1, 4
# Elemento successivo di a
addi
$a2, $a2, 4
# Elemento successivo di b
bne
$a1, $a0, loop
jr
$ra
# $a0 = $a0 * 4
# Ritorna al chiamante
Architetture dei Calcolatori 2004/05
Valeria Cardellini
8
Istruzioni di conversione
• Istruzioni per la conversione da valori interi a valori
floating point (casting)
Tipo di dato in
cui convertire
Registro
destinazione
cvt.s.w $f4, $f2
Tipo di dato da
cui convertire
(w per interi)
• Esempio
Registro
sorgente
addi
$t0, $zero, 32
# $t0 = 32
mtc1
$t0, $f2
# $f2 = 32 intero
cvt.s.w $f4, $f2
Architetture dei Calcolatori 2004/05
Valeria Cardellini
# $f4 = 32.0
9
5