sh
lyszt.net tratta sh e altre istruzioni RISC-V in modo più dettagliato.
Formato di codifica
Descrizione
sh scrive una halfword, 16 bit o 2 byte, in memoria. Corrisponde ai caricamenti lh e lhu e memorizza la dimensione più stretta dove sw memorizza la parola completa. La forma è mostrata di seguito. Prende il valore nel registro sorgente rs2 e scrive i suoi 16 bit più bassi all'indirizzo nel registro di base rs1 più l'offset. Il layout corrisponde a sw, con il registro sorgente nominato per primo.
sh rs2, offset(rs1)
Un registro contiene 32 bit e solo 16 vengono memorizzati, quindi sh mantiene i 16 bit più bassi e scarta i 16 bit superiori. Le memorizzazioni non hanno scelta con o senza segno. Questa scelta appartiene ai caricamenti, dove un valore stretto deve essere esteso per riempire un registro e i bit mancanti necessitano di una regola. Una memorizzazione restringe il valore, e mantenere i bit bassi è l'unico comportamento che abbia senso. Se il registro contiene un valore troppo grande per 16 bit, i bit extra vengono persi senza avviso, quindi controlla l'intervallo prima di memorizzare.
Il manuale RISC-V dice che sh memorizza i 16 bit bassi del registro rs2 in memoria all'indirizzo di rs1 più l'offset di 12 bit esteso con segno. Le memorizzazioni di halfword a indirizzi pari sono naturalmente allineate e non sollevano mai un errore di allineamento. Una memorizzazione a un indirizzo che non è naturalmente allineato si comporta come definisce l'ambiente di esecuzione, e il manuale dice che può essere estremamente lenta.
sh scrive ogni formato a 16 bit che lh e lhu rileggono, come campioni audio, dati pixel a 16 bit e array di halfword. Un modello comune è leggere, modificare e scrivere. Carica una halfword con lhu, regolala nel registro e memorizzala di nuovo con sh. Solo i 2 byte interessati cambiano e i byte circostanti rimangono come erano. Le halfword distano 2 byte, quindi i cicli spostano l'indirizzo di 2.
Esempio
la t0, slot li t1, -5 sh t1, 0(t0) # memory at slot now holds the low 16 bits of -5
