@pavlor
He give these suggestions to the Natami team:
Personalmente, dopo anni passati a lavorare con questi splendidi processori, apporterei le seguenti aggiunte:
LEA ,Dn ; calcola l’indirizzo effettivo e lo copia in Dn MOVEZW.B ,Dn ; preleva il byte da , lo estende con zero a word, e lo copia in Dn MOVEZL.B ,Dn ; preleva il byte da , lo estende con zero a longword, e lo copia in Dn MOVEZL.W ,Dn ; preleva la word da , la estende con zero a longword, e la copia in Dn MOVESW.B ,Dn ; preleva il byte da , lo estende con segno a word, e lo copia in Dn MOVESL.B ,Dn ; preleva il byte da , lo estende con segno a longword, e lo copia in Dn MOVESL.W ,Dn ; preleva la word da , la estende con segno a longword, e la copia in Dn MOVEcc Dx,Dy ; copia Dx in Dy solo se la condizione cc è soddisfatta MOVEcc Ax,Ay ; copia Ax in Ay solo se la condizione cc è soddisfatta BSWAP Dn ; inverte l’ordine dei byte (il più alto si scambia di posto col più basso, il secondo si scambia col terzo) SHLD #n,Dx,Dy ; esegue uno shift a sinistra di n, considerando Dx e Dy come un unico registro a 64 bit SHLD Dn,Dx,Dy ; esegue uno shift a sinistra di Dn, considerando Dx e Dy come un unico registro a 64 bit SHRD #n,Dx,Dy ; esegue uno shift a destra di n, considerando Dx e Dy come un unico registro a 64 bit SHRD Dn,Dx,Dy ; esegue uno shift a destra di Dn, considerando Dx e Dy come un unico registro a 64 bit JMPT.W ; esegue un salto all’indirizzo calcolato prendendo la word all’indirizzo , estendendola con segno, moltiplicandola per due, e sommandola al PC JSRT.W ; esegue un salto alla subroutine il cui indirizzo è calcolato prendendo la word all’indirizzo , estendendola con segno, moltiplicandola per due, e sommandola al PC A parte la prima e le ultime due, le altre sono mutuate da equivalenti istruzioni degli x86, perché sono oggettivamente utili (specialmente la MOVEcc, che permette di evitare che la pipeline si stalli).
La LEA con copia su registro dati serve a simulare l’esecuzione di un’operazione di somma che può prevedere diversi operandi sorgente e una destinazione, che può coprire agevolmente (e in maniera decisamente compatta) l’assenza di un’istruzione a 3 operandi tipica di molti RISC.
Le JMPT e JSRT servono, invece, a eseguire salti fruttando una tabella di word contenente l’offset rispetto al PC, in modo da realizzare delle jump-table più compatte da impiegare per emulatori o per le istruzioni switch / case di linguaggi di programmazione come C o Pascal.
Modificherei anche il registro dei flag, CCR, aggiungendone due (ai 5 già presenti) per poter decidere in maniera programmatica se utilizzare il little endian per leggere e scrivere i dati (i 68000 sono rigorosamente big endian), e per imporre un controllo sul registro indirizzi nelle modalità d’indirizzamento verso la memoria che lo prevedono (sollevando un’apposita eccezione se risulta zero, in modo da intercettare il dereferenziamento di puntatori nulli).
Sono assolutamente contrario all’introduzione di istruzioni che prevedano operazioni come somme e sottrazione con saturazione et similia, oppure somme e sottrazioni con interi a 8 o 16 bit packed (quindi vettorizzate), perché preferisco che siano introdotte in un’eventuale unità SIMD. _________________ retired |