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